Compare commits

...

42 Commits
3.7.0 ... 3.7.2

Author SHA1 Message Date
yuri
901bee6d3f fix campaign 2015-10-15 11:52:25 +03:00
yuri
72a0415207 fix orderBy by alias 2015-10-14 13:03:08 +03:00
yuri
de69652137 fix id in model.set 2015-10-14 11:35:21 +03:00
yuri
1cd2d6b35e target lists field not importable 2015-10-12 10:43:50 +03:00
yuri
9888ec8a6f fix global searct 2015-10-12 10:30:16 +03:00
yuri
ea5321577a fix target list import 2015-10-08 17:55:48 +03:00
yuri
23c772e029 fix config 2015-10-07 16:53:22 +03:00
yuri
e67387d9ea additionalSelectColumns 2015-10-07 15:00:03 +03:00
yuri
2156094407 cleanup 2015-10-07 12:21:59 +03:00
yuri
03d5bf1ef2 tree impr 2015-10-07 12:18:01 +03:00
yuri
42f57409c8 list tree imp 2015-10-07 12:08:11 +03:00
yuri
69d7ce408d fix preferences layout 2015-10-07 11:24:52 +03:00
yuri
15b3c0440c lead converted panel change 2015-10-07 10:56:56 +03:00
yuri
e1f0715c4d email import: relate to converted entity if lead is converted 2015-10-07 10:35:07 +03:00
yuri
15aec72e97 fix double quick view 2015-10-07 10:33:47 +03:00
yuri
66eade5db7 v 2015-10-07 10:20:37 +03:00
yuri
3d89e25349 label 2015-10-05 14:36:52 +03:00
yuri
7c890aa83a fix empty tablist 2015-10-02 17:23:02 +03:00
yuri
62a29c86ab fix record controller 2015-10-02 15:27:34 +03:00
yuri
bd57b6bb8e detailLayout param 2 2015-10-02 15:10:13 +03:00
yuri
9ab1d16ea0 detailLayout param 2015-10-02 15:09:39 +03:00
yuri
435aa28ca2 iconHtml for menu items 2015-10-01 13:11:05 +03:00
yuri
4bd375f154 fix notice 2015-09-30 17:22:15 +03:00
yuri
d6521f9176 de_DE 2015-09-30 15:07:20 +03:00
yuri
f8e0e4955a fix meeting onlymy 2015-09-30 15:06:34 +03:00
yuri
7957359c15 fix prev 2015-09-30 11:41:53 +03:00
yuri
bdc3731b9a fix select manager 2015-09-30 11:39:11 +03:00
yuri
6b8af1220b opp lost filter 2015-09-30 10:24:39 +03:00
yuri
58fffeaa84 fix typo 2015-09-29 17:56:35 +03:00
yuri
5806785286 fix email notification dups 2015-09-29 11:56:15 +03:00
yuri
2f2d9b5f6f fix roles 2015-09-29 10:27:02 +03:00
yuri
5af20c1ee0 merge targetLists 2015-09-28 16:41:28 +03:00
yuri
7620be3b40 ve 2015-09-28 14:26:20 +03:00
yuri
86f591b409 trim emails when search 2015-09-28 11:18:12 +03:00
yuri
533dfe24d0 default dashlet options 2015-09-28 11:08:13 +03:00
yuri
10c51dc46e target lists panels 2015-09-28 10:55:58 +03:00
yuri
a9d24a1e09 fix mass update 2015-09-28 10:45:30 +03:00
yuri
0cfe093701 fix german language 2015-09-28 10:29:50 +03:00
yuri
11ec99fe6a duplicate email template 2015-09-28 10:26:59 +03:00
yuri
b07e5a6da2 campaign list layout 2015-09-28 10:24:10 +03:00
yuri
151738f896 fix tracking img 2015-09-28 10:23:20 +03:00
yuri
075a370e7a fix log opened 2015-09-25 16:46:55 +03:00
102 changed files with 723 additions and 468 deletions

View File

@@ -29,7 +29,7 @@ class GlobalSearch extends \Espo\Core\Controllers\Base
{
public function actionSearch($params, $data, $request)
{
$query = $params['query'];
$query = $request->get('q');
$offset = intval($request->get('offset'));
$maxSize = intval($request->get('maxSize'));

View File

@@ -170,6 +170,7 @@ class Record extends Base
$asc = $request->get('asc') === 'true';
$sortBy = $request->get('sortBy');
$q = $request->get('q');
$textFilter = $request->get('textFilter');
if (empty($maxSize)) {
$maxSize = self::MAX_SIZE_LIMIT;

View File

@@ -194,6 +194,28 @@ class Importer
$n = sscanf($reference, '%s %s %d %d espo', $parentType, $parentId, $emailSent, $number);
if ($n == 4 && $emailSent < time()) {
if (!empty($parentType) && !empty($parentId)) {
if ($parentType == 'Lead') {
$parent = $this->getEntityManager()->getEntity('Lead', $parentId);
if ($parent && $parent->get('status') == 'Converted') {
if ($parent->get('createdAccountId')) {
$account = $this->getEntityManager()->getEntity('Account', $parent->get('createdAccountId'));
if ($account) {
$parentType = 'Account';
$parentId = $account->id;
}
} else {
if ($this->getConfig()->get('b2cMode')) {
if ($parent->get('createdContactId')) {
$contact = $this->getEntityManager()->getEntity('Contact', $parent->get('createdContactId'));
if ($contact) {
$parentType = 'Contact';
$parentId = $contact->id;
}
}
}
}
}
}
$email->set('parentType', $parentType);
$email->set('parentId', $parentId);
$parentFound = true;

View File

@@ -242,15 +242,15 @@ class Base
if ($defs['type'] == 'manyMany') {
if (!empty($defs['relationName']) && !empty($defs['midKeys'])) {
if (!empty($defs['midKeys'])) {
$result['distinct'] = true;
$result['joins'][] = $link;
$key = $defs['midKeys'][1];
$relationName = lcfirst($defs['relationName']);
$middleName = $link . 'Middle';
$result['customJoin'] .= "
JOIN " . $query->toDb($pathName) . " AS `{$pathName}` ON {$pathName}.descendor_id = ".$query->sanitize($relationName) . "." . $query->toDb($key) . "
JOIN " . $query->toDb($pathName) . " AS `{$pathName}` ON {$pathName}.descendor_id = ".$query->sanitize($middleName) . "." . $query->toDb($key) . "
";
$part[$pathName . '.ascendorId'] = $val;
}

View File

@@ -150,7 +150,17 @@ class Config
$removeData = empty($this->removeData) ? null : $this->removeData;
$result = $this->getFileManager()->mergePhpContents($this->configPath, $values, $removeData);
$data = include($this->configPath);
foreach ($values as $key => $value) {
$data[$key] = $value;
}
foreach ($removeData as $key) {
unset($data[$key]);
}
$result = $this->getFileManager()->putPhpContents($this->configPath, $data);
if ($result) {
$this->changedData = array();
@@ -220,7 +230,7 @@ class Config
$restrictItems = $this->getRestrictItems($isAdmin);
$values = array();
foreach($data as $key => $item) {
foreach ($data as $key => $item) {
if (!in_array($key, $restrictItems)) {
$values[$key]= $item;
}

View File

@@ -45,7 +45,7 @@ class Contact extends \Espo\Core\ORM\Repositories\RDB
$result = parent::afterSave($entity, $options);
$this->handleAfterSaveAccounts($entity, $options);
if ($entity->has('targetListId') && $entity->isNew()) {
if ($entity->has('targetListId')) {
$this->relate($entity, 'targetLists', $entity->get('targetListId'));
}

View File

@@ -16,7 +16,7 @@
"links": {
"contacts": "Kontakte",
"opportunities": "Verkaufschancen",
"cases": "F<EFBFBD>lle",
"cases": "Fälle",
"documents": "Dokumente",
"meetingsPrimary": "Meetings (erweitert)",
"callsPrimary": "Anrufe (erweitert)",
@@ -31,7 +31,7 @@
"Customer": "Kunde",
"Investor": "Investor",
"Partner": "Partner",
"Reseller": "Wiederverk<EFBFBD>ufer"
"Reseller": "Wiederverkäufer"
},
"industry": {
"Agriculture": "Landwirtschaft",
@@ -47,7 +47,7 @@
"Energy": "Energieerzeuger",
"Entertainment & Leisure": "Freizeit- und Unterhaltungsindustrie",
"Finance": "Finanzsektor",
"Food & Beverage": "Speisen und Getr<EFBFBD>nke",
"Food & Beverage": "Speisen und Getränke",
"Grocery": "Einzelhandel",
"Healthcare": "Gesundheitswesen",
"Insurance": "Versicherung",

View File

@@ -1,6 +1,6 @@
{
"layouts": {
"detailConvert": "Interessent umwandeln",
"listForAccount": "Liste (f<EFBFBD>r Firma)"
"listForAccount": "Liste (für Firma)"
}
}

View File

@@ -19,8 +19,8 @@
"options": {
"status": {
"Planned": "Geplant",
"Held": "Durchgef<EFBFBD>hrt",
"Not Held": "Nicht durchgef<EFBFBD>hrt"
"Held": "Durchgeführt",
"Not Held": "Nicht durchgeführt"
},
"direction": {
"Outbound": "Ausgehend",
@@ -45,7 +45,7 @@
},
"presetFilters": {
"planned": "Geplant",
"held": "Durchgef<EFBFBD>hrt",
"held": "Durchgeführt",
"todays": "Heutige"
}
}

View File

@@ -8,7 +8,7 @@
"endDate": "Enddatum",
"targetLists": "Kontaktlisten",
"sentCount": "Gesendet",
"openedCount": "Ge<EFBFBD>ffnet",
"openedCount": "Geöffnet",
"clickedCount": "Geklickt",
"optedOutCount": "Keine E-Mails",
"bouncedCount": "Nicht zustellbar",

View File

@@ -12,7 +12,7 @@
"options": {
"action": {
"Sent": "Gesendet",
"Opened": "Ge<EFBFBD>ffnet",
"Opened": "Geöffnet",
"Opted Out": "Keine E-Mails",
"Bounced": "Nicht zustellbar",
"Clicked": "Geklickt",
@@ -24,7 +24,7 @@
},
"presetFilters": {
"sent": "Gesendet",
"opened": "Ge<EFBFBD>ffnet",
"opened": "Geöffnet",
"optedOut": "Keine E-Mails",
"bounced": "Nicht zustellbar",
"clicked": "Geklickt",

View File

@@ -1,7 +1,7 @@
{
"fields": {
"url": "URL",
"urlToUse": "Code zu Einf<EFBFBD>gen anstelle einer URL",
"urlToUse": "Code zu Einfügen anstelle einer URL",
"campaign": "Kampagne"
},
"links": {

View File

@@ -6,7 +6,7 @@
"account": "Firma",
"contact": "Kontakt",
"contacts": "Kontakte",
"priority": "Priorit<EFBFBD>t",
"priority": "Priorität",
"type": "Typ",
"description": "Beschreibung",
"inboundEmail": "Eingehende E-Mails"
@@ -14,7 +14,7 @@
"links": {
"inboundEmail": "Eingehende E-Mails",
"account": "Firma",
"contact": "Kontakt (Prim<EFBFBD>r)",
"contact": "Kontakt (Primär)",
"Contacts": "Kontakte",
"meetings": "Meetings",
"calls": "Anrufe",
@@ -44,7 +44,7 @@
},
"labels": {
"Create Case": "Fall erstellen",
"Close": "Schlie<EFBFBD>en",
"Close": "Schließen",
"Reject": "Ablehnen",
"Closed": "Abgeschlossen",
"Rejected": "Abgelehnt"

View File

@@ -18,13 +18,13 @@
},
"links": {
"opportunities": "Verkaufschancen",
"cases": "F<EFBFBD>lle",
"cases": "Fälle",
"targetLists": "Kontaktlisten",
"campaignLogRecords": "Kampagnen Log",
"campaign": "Kampagne",
"account": "Firma (Prim<EFBFBD>r)",
"account": "Firma (Primär)",
"accounts": "Firmen",
"casesPrimary": "F<EFBFBD>lle (Prim<EFBFBD>r)"
"casesPrimary": "Fälle (Primär)"
},
"labels": {
"Create Contact": "Kontakt erstellen"

View File

@@ -9,7 +9,7 @@
"file": "Datei",
"type": "Typ",
"source": "Quelle",
"publishDate": "Ver<EFBFBD>ffentlichungsdatum",
"publishDate": "Veröffentlichungsdatum",
"expirationDate": "Ablaufdatum",
"description": "Beschreibung",
"accounts": "Firmen",

View File

@@ -28,32 +28,32 @@
"Calendar": "Kalender",
"Call": "Anrufe",
"Task": "Aufgaben",
"Case": "F<EFBFBD>lle",
"Case": "Fälle",
"Document": "Dokumente",
"DocumentFolder": "Dokumente Ordner",
"Campaign": "Kampagnen",
"TargetList": "Kontaktlisten",
"MassEmail": "Massen E-Mails",
"EmailQueueItem": "E-Mail Warteschlangeneintr<EFBFBD>ge",
"EmailQueueItem": "E-Mail Warteschlangeneinträge",
"CampaignTrackingUrl": "Tracking URLs"
},
"dashlets": {
"Leads": "Meine Interessenten",
"Opportunities": "Meine Verkaufschancen",
"Tasks": "Meine Aufgaben",
"Cases": "Meine F<EFBFBD>lle",
"Cases": "Meine Fälle",
"Calendar": "Kalender",
"Calls": "Meine Anrufe",
"Meetings": "Meine Meetings",
"OpportunitiesByStage": "Verkaufschancen nach Verkaufsphase",
"OpportunitiesByLeadSource": "Verkaufschancen nach Quelle",
"SalesByMonth": "Ums<EFBFBD>tze nach Monat",
"SalesByMonth": "Umsätze nach Monat",
"SalesPipeline": "Verkaufspipeline",
"Activities": "Meine Aktivit<EFBFBD>ten"
"Activities": "Meine Aktivitäten"
},
"labels": {
"Create InboundEmail": "Eingehende E-Mail erstellen",
"Activities": "Aktivit<EFBFBD>ten",
"Activities": "Aktivitäten",
"History": "Verlauf",
"Attendees": "Teilnehmer",
"Schedule Meeting": "Meeting planen",
@@ -70,14 +70,14 @@
"billingAddressCountry": "Land",
"billingAddressPostalCode": "PLZ",
"billingAddressState": "Bundesland/Kanton",
"billingAddressStreet": "Stra<EFBFBD>e",
"billingAddressStreet": "Straße",
"addressCity": "Ort",
"addressStreet": "Stra<EFBFBD>e",
"addressStreet": "Straße",
"addressCountry": "Land",
"addressState": "Bundesland/Kanton",
"addressPostalCode": "PLZ",
"shippingAddressCity": "Ort (Lieferadresse)",
"shippingAddressStreet": "Stra<EFBFBD>e (Lieferadresse)",
"shippingAddressStreet": "Straße (Lieferadresse)",
"shippingAddressCountry": "Land (Lieferadresse)",
"shippingAddressState": "Bundesland/Kanton (Lieferadresse)",
"shippingAddressPostalCode": "PLZ (Lieferadresse)"
@@ -91,7 +91,7 @@
"tasks": "Aufgaben",
"emails": "E-Mails",
"accounts": "Firmen",
"cases": "F<EFBFBD>lle",
"cases": "Fälle",
"documents": "Dokumente",
"account": "Firma",
"opportunity": "Verkaufschance",

View File

@@ -39,7 +39,7 @@
"Assigned": "Zugewiesen",
"In Process": "In Arbeit",
"Converted": "Umgewandelt",
"Recycled": "Wiederer<EFBFBD>ffnet",
"Recycled": "Wiedereröffnet",
"Dead": "'Gestorben'"
},
"source": {

View File

@@ -15,7 +15,7 @@
},
"links": {
"targetLists": "Kontaktlisten",
"queueItems": "Warteschlangeneintr<EFBFBD>ge",
"queueItems": "Warteschlangeneinträge",
"campaign": "Kampagne",
"emailTemplate": "E-Mail Vorlage",
"inboundEmail": "E-Mail Konto"
@@ -35,7 +35,7 @@
"Send Test": "Test senden"
},
"messages": {
"selectAtLeastOneTarget": "Zumindest ein Ziel ausw<EFBFBD>hlen",
"selectAtLeastOneTarget": "Zumindest ein Ziel auswählen",
"testSent": "Test E-Mail(s) die gesendet werden sollen"
}
}

View File

@@ -18,8 +18,8 @@
"options": {
"status": {
"Planned": "Geplant",
"Held": "Durchgef<EFBFBD>hrt",
"Not Held": "Nicht durchgef<EFBFBD>hrt"
"Held": "Durchgeführt",
"Not Held": "Nicht durchgeführt"
},
"acceptanceStatus": {
"None": "Kein(e)",
@@ -42,7 +42,7 @@
},
"presetFilters": {
"planned": "Geplant",
"held": "Durchgef<EFBFBD>hrt",
"held": "Durchgeführt",
"todays": "Heutige"
}
}

View File

@@ -28,7 +28,7 @@
"Id. Decision Makers": "Entscheider ident.",
"Perception Analysis": "Analyse Sichtweise",
"Proposal/Price Quote": "Preisangebot",
"Negotiation/Review": "Verhandlung/<EFBFBD>berarbeitung",
"Negotiation/Review": "Verhandlung/Überarbeitung",
"Closed Won": "Gewonnen",
"Closed Lost": "Verloren"
}
@@ -38,6 +38,7 @@
},
"presetFilters": {
"open": "Offen",
"won": "Gewonnen"
"won": "Gewonnen",
"lost": "Lost"
}
}

View File

@@ -2,7 +2,7 @@
"fields": {
"name": "Name",
"description": "Beschreibung",
"entryCount": "Eingabez<EFBFBD>hler",
"entryCount": "Eingabezähler",
"campaigns": "Kampagnen",
"endDate": "Enddatum",
"targetLists": "Kontaktlisten"
@@ -26,6 +26,6 @@
"labels": {
"Create TargetList": "Kontaktliste erstellen",
"Opted Out": "Keine E-Mails",
"Cancel Opt-Out": "Opt-Out zur<EFBFBD>cksetzen"
"Cancel Opt-Out": "Opt-Out zurücksetzen"
}
}

View File

@@ -4,18 +4,18 @@
"parent": "Bezieht sich auf",
"status": "Status",
"dateStart": "Startdatum",
"dateEnd": "F<EFBFBD>llig am",
"dateStartDate": "Startdatum (ganzt<EFBFBD>gig)",
"dateEndDate": "Enddatum (ganzt<EFBFBD>gig)",
"priority": "Priorit<EFBFBD>t",
"dateEnd": "Fällig am",
"dateStartDate": "Startdatum (ganztägig)",
"dateEndDate": "Enddatum (ganztägig)",
"priority": "Priorität",
"description": "Beschreibung",
"isOverdue": "Ist <EFBFBD>berf<EFBFBD>llig",
"isOverdue": "Ist überfällig",
"account": "Firma",
"dateCompleted": "Datum erledigt",
"attachments": "Anh<EFBFBD>nge"
"attachments": "Anhänge"
},
"links": {
"attachments": "Anh<EFBFBD>nge"
"attachments": "Anhänge"
},
"options": {
"status": {
@@ -23,7 +23,7 @@
"Started": "In Bearbeitung",
"Completed": "Abgeschlossen",
"Canceled": "Storniert",
"Deferred": "Zur<EFBFBD>ckgestellt"
"Deferred": "Zurückgestellt"
},
"priority" : {
"Low": "Niedrig",
@@ -37,9 +37,9 @@
"Complete": "Fertig"
},
"presetFilters": {
"actual": "Tats<EFBFBD>chlich",
"actual": "Tatsächlich",
"completed": "Abgeschlossen",
"todays": "Heutige",
"overdue": "<EFBFBD>berf<EFBFBD>llig"
"overdue": "Überfällig"
}
}

View File

@@ -38,6 +38,7 @@
},
"presetFilters": {
"open": "Open",
"won": "Won"
"won": "Won",
"lost": "Lost"
}
}

View File

@@ -2,5 +2,5 @@
{"name":"name","width":40,"link":true},
{"name":"type","width":20},
{"name":"status"},
{"name":"endDate"}
{"name":"createdAt"}
]

View File

@@ -1 +1 @@
["opportunities","cases"]
["opportunities", "cases", "targetLists"]

View File

@@ -24,7 +24,8 @@
{
"name":"statistics",
"label":"Statistics",
"view":"Crm:Campaign.Record.Panels.Statistics"
"view":"Crm:Campaign.Record.Panels.Statistics",
"hidden": true
}
]
},

View File

@@ -24,12 +24,16 @@
},
"relationshipPanels": {
"campaignLogRecords": {
"rowActionsView": "Record.RowActions.Empty",
"rowActionsView": "views/record/row-actions/empty",
"select": false,
"create": false
},
"opportunities":{
"layout":"listForAccount"
},
"targetLists": {
"create": false,
"rowActionsView": "views/record/row-actions/relationship-unlink-only"
}
},
"boolFilterList": ["onlyMy"],

View File

@@ -29,12 +29,9 @@
{
"name":"convertedTo",
"label":"Converted To",
"view": "Record.Panels.Side",
"view": "crm:views/lead/record/panels/converted-to",
"notRefreshable": true,
"hidden": true,
"options": {
"fieldList": ["createdAccount", "createdContact", "createdOpportunity"]
}
"hidden": true
},
{
"name":"activities",
@@ -51,6 +48,33 @@
"label":"Tasks",
"view":"Crm:Record.Panels.Tasks"
}
],
"edit": [
{
"name":"convertedTo",
"label":"Converted To",
"view": "crm:views/lead/record/panels/converted-to",
"notRefreshable": true,
"hidden": true
}
],
"detailSmall": [
{
"name":"convertedTo",
"label":"Converted To",
"view": "crm:views/lead/record/panels/converted-to",
"notRefreshable": true,
"hidden": true
}
],
"editSmall": [
{
"name":"convertedTo",
"label":"Converted To",
"view": "crm:views/lead/record/panels/converted-to",
"notRefreshable": true,
"hidden": true
}
]
},
"relationshipPanels": {
@@ -58,6 +82,10 @@
"rowActionsView": "Record.RowActions.Empty",
"select": false,
"create": false
},
"targetLists": {
"create": false,
"rowActionsView": "views/record/row-actions/relationship-unlink-only"
}
},
"filterList": [

View File

@@ -131,6 +131,7 @@
"layoutDetailDisabled": true,
"layoutListDisabled": true,
"layoutMassUpdateDisabled": true,
"importDisabled": true,
"noLoad": true
},
"targetList": {

View File

@@ -27,7 +27,7 @@ class Account extends \Espo\Core\SelectManagers\Base
protected function filterPartners(&$result)
{
$result['whereClause'][] = array(
'type' => 'Partnter'
'type' => 'Partner'
);
}

View File

@@ -31,7 +31,10 @@ class Call extends \Espo\Core\SelectManagers\Base
}
$result['whereClause'][] = array(
'users.id' => $this->getUser()->id,
'usersMiddle.status!=' => 'Declined'
'OR' => array(
'usersMiddle.status!=' => 'Declined',
'usersMiddle.status=' => null
)
);
}

View File

@@ -31,7 +31,10 @@ class Meeting extends \Espo\Core\SelectManagers\Base
}
$result['whereClause'][] = array(
'users.id' => $this->getUser()->id,
'usersMiddle.status!=' => 'Declined'
'OR' => array(
'usersMiddle.status!=' => 'Declined',
'usersMiddle.status=' => null
)
);
}

View File

@@ -27,7 +27,7 @@ class Opportunity extends \Espo\Core\SelectManagers\Base
protected function filterOpen(&$result)
{
$result['whereClause'][] = array(
'stage!=' => array('Closed Won', 'Closed Lost')
'stage!=' => ['Closed Won', 'Closed Lost']
);
}
@@ -38,5 +38,12 @@ class Opportunity extends \Espo\Core\SelectManagers\Base
);
}
protected function filterLost(&$result)
{
$result['whereClause'][] = array(
'stage=' => 'Closed Lost'
);
}
}

View File

@@ -34,7 +34,7 @@ class Account extends \Espo\Services\Record
)
);
protected $mergeLinkList = array(
protected $mergeLinkList = [
'opportunities',
'cases',
'documents',
@@ -45,8 +45,9 @@ class Account extends \Espo\Services\Record
'emails',
'meetingsPrimary',
'callsPrimary',
'emailsPrimary'
);
'emailsPrimary',
'targetLists'
];
protected function getDuplicateWhereClause(Entity $entity)
{

View File

@@ -179,7 +179,7 @@ class Campaign extends \Espo\Services\Record
$actionDate = date('Y-m-d H:i:s');
}
if (!$queueItemId && !$this->getEntityManager()->getRepository('CampaignLogRecord')->where(array(
if ($queueItemId && $this->getEntityManager()->getRepository('CampaignLogRecord')->where(array(
'queueItemId' => $queueItemId,
'action' => 'Opened',
))->findOne()) {

View File

@@ -18,7 +18,7 @@
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
************************************************************************/
namespace Espo\Modules\Crm\Services;
@@ -26,6 +26,10 @@ use \Espo\ORM\Entity;
class Contact extends \Espo\Services\Record
{
protected $mergeLinkList = [
'targetLists'
];
protected function getDuplicateWhereClause(Entity $entity)
{
$data = array(

View File

@@ -29,12 +29,13 @@ use \Espo\ORM\Entity;
class Lead extends \Espo\Services\Record
{
protected $mergeLinkList = array(
protected $mergeLinkList = [
'tasks',
'meetings',
'calls',
'emails'
);
'emails',
'targetLists'
];
protected function getDuplicateWhereClause(Entity $entity)
{

View File

@@ -273,8 +273,7 @@ class MassEmail extends \Espo\Services\Record
$body = $emailData['body'];
$trackOpenedUrl = $this->getConfig()->get('siteUrl') . '?entryPoint=campaignTrackOpened&id=' . $queueItem->id;
$trackOpenedHtml = '<img width="1" height="1" src="'.$trackOpenedUrl.'">';
$optOutUrl = $this->getConfig()->get('siteUrl') . '?entryPoint=unsubscribe&id=' . $queueItem->id;
$optOutLink = '<a href="'.$optOutUrl.'">'.$this->getLanguage()->translate('Unsubscribe', 'labels', 'Campaign').'</a>';
@@ -290,11 +289,19 @@ class MassEmail extends \Espo\Services\Record
if (stripos($body, '?entryPoint=unsubscribe&id') === false) {
if ($emailData['isHtml']) {
$body .= "<br><br>" . $optOutLink;
} else {
$body .= "\n\n" . $optOutUrl;
}
}
$trackOpenedUrl = $this->getConfig()->get('siteUrl') . '?entryPoint=campaignTrackOpened&id=' . $queueItem->id;
$trackOpenedHtml = '<img width="1" height="1" border="0" src="'.$trackOpenedUrl.'">';
if ($massEmail->get('campaignId')) {
if ($emailData['isHtml']) {
if ($massEmail->get('campaignId')) {
$body .= $trackOpenedHtml;
}
} else {
$body .= "\n\n" . $optOutUrl;
}
}
@@ -392,7 +399,6 @@ class MassEmail extends \Espo\Services\Record
} catch (\Exception $e) {
if ($queueItem->get('attemptCount') >= self::MAX_ATTEMPT_COUNT) {
$this->setQueueItemFailed($queueItem);
$queueItem->set('status', 'Failed');
}
$this->getEntityManager()->saveEntity($queueItem);

View File

@@ -47,7 +47,7 @@ class Email extends \Espo\Core\Notificators\Base
return;
}
if ($entity->get('status') === 'Sent') {
if ($entity->get('isJustSent')) {
$previousUserIdList = [];
} else {
$previousUserIdList = $entity->getFetched('usersIds');

View File

@@ -113,6 +113,12 @@ abstract class Base
}
}
if (!empty($params['additionalSelectColumns']) && is_array($params['additionalSelectColumns'])) {
foreach ($params['additionalSelectColumns'] as $column => $field) {
$selectPart .= ", " . $column . " AS `{$field}`";
}
}
} else {
$aggDist = false;
if ($params['distinct'] && $params['aggregation'] == 'COUNT') {
@@ -427,7 +433,7 @@ abstract class Base
{
if (strpos($orderBy, '.') !== false) {
list($alias, $field) = explode('.', $orderBy);
$fieldPath = $this->toDb($alias) . '.' . $this->toDb($this->sanitize($field));
$fieldPath = $this->sanitize($alias) . '.' . $this->toDb($this->sanitize($field));
} else {
$fieldPath = $this->getFieldPath($entity, $orderBy);
}

View File

@@ -90,6 +90,7 @@ class Preferences extends \Espo\Core\ORM\Repository
$fields = $this->getMetadata()->get('entityDefs.Preferences.fields');
$defaults = array();
$defaults['dashboardLayout'] = $this->getMetadata()->get('app.defaultDashboardLayouts.Standard');
$defaults['dashletOptions'] = $this->getMetadata()->get('app.defaultDashboardOptions.Standard');
foreach ($fields as $field => $d) {
if (array_key_exists('default', $d)) {
$defaults[$field] = $d['default'];

View File

@@ -7,11 +7,11 @@
"Email": "E-Mail",
"Data": "Daten",
"Customization": "Anpassung",
"Available Fields": "Verf<EFBFBD>gbare Felder",
"Available Fields": "Verfügbare Felder",
"Layout": "Aktuelles Layout",
"Entity Manager": "Entit<EFBFBD>ts-/Modulmanager",
"Add Panel": "Panel hinzuf<EFBFBD>gen",
"Add Field": "Feld hinzuf<EFBFBD>gen",
"Entity Manager": "Entitäts-/Modulmanager",
"Add Panel": "Panel hinzufügen",
"Add Field": "Feld hinzufügen",
"Settings": "Einstellungen",
"Scheduled Jobs": "Geplante Jobs",
"Upgrade": "Aktualisierung",
@@ -25,10 +25,10 @@
"Email Templates": "E-Mail Vorlagen",
"Import": "Import",
"Layout Manager": "Layouts anpassen",
"User Interface": "Benutzeroberfl<EFBFBD>che",
"User Interface": "Benutzeroberfläche",
"Auth Tokens": "Auth Tokens",
"Authentication": "Authentifizierung",
"Currency": "W<EFBFBD>hrung",
"Currency": "Währung",
"Integrations": "Integrationen",
"Extensions": "Erweiterungen",
"Upload": "Hochladen",
@@ -36,19 +36,19 @@
"Upgrading...": "Aktualisiere....",
"Upgraded successfully": "Erfolgreich aktualisiert",
"Installed successfully": "Erfolgreich installiert",
"Ready for upgrade": "Bereit f<EFBFBD>r Aktualisierung",
"Run Upgrade": "Aktualisierung duchf<EFBFBD>hren",
"Ready for upgrade": "Bereit für Aktualisierung",
"Run Upgrade": "Aktualisierung duchführen",
"Install": "Installieren",
"Ready for installation": "Bereit f<EFBFBD>r Installation",
"Ready for installation": "Bereit für Installation",
"Uninstalling...": "Deinstalliere...",
"Uninstalled": "Deinstalliert",
"Create Entity": "Entit<EFBFBD>t/Modul erstellen",
"Edit Entity": "Entit<EFBFBD>t/Modul bearbeiten",
"Create Entity": "Entität/Modul erstellen",
"Edit Entity": "Entität/Modul bearbeiten",
"Create Link": "Relation erstellen",
"Edit Link": "Relation bearbeiten",
"Notifications": "Benachrichtigungen",
"Jobs": "Jobs",
"Reset to Default": "Zur<EFBFBD>cksetzen auf Standard",
"Reset to Default": "Zurücksetzen auf Standard",
"Email Filters": "E-Mail Filter"
},
"layouts": {
@@ -57,7 +57,7 @@
"listSmall": "Liste (Klein)",
"detailSmall": "Detail (Klein)",
"filters": "Suchfilter",
"massUpdate": "Massen<EFBFBD>nderung",
"massUpdate": "Massenänderung",
"relationships": "Beziehungen"
},
"fieldTypes": {
@@ -67,21 +67,21 @@
"duration": "Dauer",
"password": "Passwort",
"parsonName": "Person Name",
"autoincrement": "Automatisch hochz<EFBFBD>hlen",
"autoincrement": "Automatisch hochzählen",
"bool": "Bool",
"currency": "W<EFBFBD>hrung",
"currency": "Währung",
"date": "Datum",
"datetime": "Datum/Zeit",
"datetimeOptional": "Datum/Datum-Zeit",
"email": "E-Mail",
"enum": "Einfachauswahl",
"enumInt": "Einfachauswahl Ganzzahlwerte",
"enumFloat": "Einfachauswahl Flie<EFBFBD>kommawerte",
"float": "Flie<EFBFBD>komma",
"enumFloat": "Einfachauswahl Fließkommawerte",
"float": "Fließkomma",
"int": "Ganzzahl",
"link": "Link",
"linkMultiple": "Mehrfachlinks",
"linkParent": "<EFBFBD>bergeordneter Link",
"linkParent": "Übergeordneter Link",
"multienim": "Mehrfachauswahl",
"phone": "Telefon",
"text": "Textbox",
@@ -90,10 +90,11 @@
"file": "Datei",
"image": "Bild",
"multiEnum": "Mehrfachauswahl",
"attachmentMultiple": "Mehrfach Anh<EFBFBD>nge",
"attachmentMultiple": "Mehrfach Anhänge",
"rangeInt": "Bereich Ganzzahl",
"rangeFloat": "Bereich Flie<EFBFBD>kommawerte",
"rangeCurrency": "bereich W<EFBFBD>hrung"
"rangeFloat": "Bereich Fließkommawerte",
"rangeCurrency": "bereich Währung",
"wysiwyg": "Wysiwyg"
},
"fields": {
"type": "Typ",
@@ -101,7 +102,7 @@
"label": "Bezeichnung",
"required": "Erforderlich",
"default": "Standard",
"maxLength": "Maximall<EFBFBD>nge",
"maxLength": "Maximallänge",
"options": "Optionen",
"after": "Nach (Feld)",
"before": "Vor (Feld)",
@@ -109,15 +110,16 @@
"field": "Feld",
"min": "Min",
"max": "Max",
"translation": "<EFBFBD>bersetzung",
"previewSize": "Vorschau Gr<EFBFBD><EFBFBD>e",
"translation": "Übersetzung",
"previewSize": "Vorschau Größe",
"noEmptyString": "Keine leere Zeichenkette",
"defaultType": "Standardtyp",
"seeMoreDisabled": "Abschneiden des Texts verhindern",
"entityList": "Entit<EFBFBD>tsliste",
"entityList": "Entitätsliste",
"isSorted": "Sortiert (alphabetisch)",
"audited": "Auditiert",
"trim": "Abschneiden"
"trim": "Abschneiden",
"height": "Height (px)"
},
"messages": {
"upgradeVersion": "Ihr EspoCRM wird nun auf Version <strong>{version}</strong> aktualisiert. Dies kann einige Zeit dauern.",
@@ -125,38 +127,38 @@
"upgradeBackup": "Wie empfehlen VOR einer Aktualisierung die Espo Dateien sowie die Datenbank zu sichern.",
"thousandSeparatorEqualsDecimalMark": "Das Tausendertrennzeichen kann nicht gleich dem Dezimaltrennzeichen sein",
"userHasNoEmailAddress": "Der Benutzer hat keine E-Mail Adresse.",
"selectEntityType": "Modul/Entit<EFBFBD>t links ausw<EFBFBD>hlen",
"selectUpgradePackage": "Aktualisierungspaket ausw<EFBFBD>hlen",
"selectEntityType": "Modul/Entität links auswählen",
"selectUpgradePackage": "Aktualisierungspaket auswählen",
"downloadUpgradePackage": "Aktualisierungspaket(e) <a href=\"{url}\">hier </a>herunterladen.",
"selectLayout": "Layout zum Editieren links ausw<EFBFBD>hlen",
"selectExtensionPackage": "Erweiterungspaket ausw<EFBFBD>hlen",
"selectLayout": "Layout zum Editieren links auswählen",
"selectExtensionPackage": "Erweiterungspaket auswählen",
"extensionInstalled": "Erweiterung {name} {version} wurde installiert.",
"installExtension": "Erweiterung {name} {version} ist bereit f<EFBFBD>r die Installation",
"installExtension": "Erweiterung {name} {version} ist bereit für die Installation",
"uninstallConfirmation": "Wollen Sie die Erweiterung wirklich deinstallieren?"
},
"descriptions": {
"settings": "Systemeinstellungen der Applikation.",
"scheduledJob": "Aufgaben die durch einen Cronjob ausgef<EFBFBD>hrt werden.",
"scheduledJob": "Aufgaben die durch einen Cronjob ausgeführt werden.",
"upgrade": "EspoCRM aktualisieren.",
"clearCache": "Alle Cache Dateien leeren.",
"rebuild": "Wiederherstellung des Backends und Leeren des Cache.",
"users": "Benutzerverwaltung.",
"teams": "Teamverwaltung.",
"roles": "Rollenverwaltung.",
"outboundEmails": "SMTP Einstellungen f<EFBFBD>r ausgehende E-Mails.",
"groupEmailAccounts": "IMAP Gruppenkonten. E-Mail Import und E-Mails f<EFBFBD>r F<EFBFBD>lle.",
"emailTemplates": "Vorlagen f<EFBFBD>r ausgehende E-Mails.",
"outboundEmails": "SMTP Einstellungen für ausgehende E-Mails.",
"groupEmailAccounts": "IMAP Gruppenkonten. E-Mail Import und E-Mails für Fälle.",
"emailTemplates": "Vorlagen für ausgehende E-Mails.",
"import": "Datenimport aus CSV Datei.",
"layoutManager": "Layouts anpassen (Liste, Detailansicht, Bearbeitungsansicht, Suche, Massenaktualisierung).",
"entityManager": "Module/Entit<EFBFBD>ten selbst erstellen, existente bearbeiten, Felder und Relationen verwalten.",
"userInterface": "Benutzeroberfl<EFBFBD>che anpassen.",
"entityManager": "Module/Entitäten selbst erstellen, existente bearbeiten, Felder und Relationen verwalten.",
"userInterface": "Benutzeroberfläche anpassen.",
"authTokens": "Aktive Auth Sessions. IP Adresse und letztes Zugriffsdatum,",
"authentication": "Authentifizierungs Einstellungen.",
"currency": "W<EFBFBD>hrungseinstellungen und Kurse",
"currency": "Währungseinstellungen und Kurse",
"extensions": "Erweiterungen installieren oder deinstallieren",
"integrations": "Integration mit Drittanbietern ",
"notifications": "In-App und E-Mail Benachrichtigungseinstellungen.",
"inboundEmails": "Einstellungen f<EFBFBD>r eingehende E-Mails",
"inboundEmails": "Einstellungen für eingehende E-Mails",
"emailFilters": "E-Mails auf die die angegebenen Filter zutreffen werden nicht importiert"
},
"options": {

View File

@@ -4,8 +4,8 @@
"dateFrom": "Von Datum",
"dateTo": "Bis Datum",
"autorefreshInterval": "Aktualisierungsintervall",
"displayRecords": "S<EFBFBD>tze anzeigen",
"isDoubleHeight": "Zweifache H<EFBFBD>he",
"displayRecords": "Sätze anzeigen",
"isDoubleHeight": "Zweifache Höhe",
"mode": "Modus"
},
"options": {

View File

@@ -13,8 +13,8 @@
"isHtml": "Ist HTML",
"body": "Inhalt",
"subject": "Betreff",
"attachments": "Anh<EFBFBD>nge",
"selectTemplate": "Vorlage w<EFBFBD>hlen",
"attachments": "Anhänge",
"selectTemplate": "Vorlage wählen",
"fromEmailAddress": "Von Adresse",
"toEmailAddresses": "An Adresse",
"emailAddress": "E-Mail Adresse",
@@ -46,7 +46,7 @@
"Forward": "Weiterleiten",
"Original message": "Originalnachricht",
"Forwarded message": "Weitergeleitete Nachricht:",
"Email Accounts": "Pers<EFBFBD>nliche E-Mail Konten",
"Email Accounts": "Persönliche E-Mail Konten",
"Inbound Emails": "Gruppen E-Mail Konten",
"Email Templates": "E-Mail Vorlagen",
"Send Test Email": "Test E-Mail senden",
@@ -70,7 +70,7 @@
"sent": "Gesendet",
"archived": "Archiviert",
"inbox": "Posteingang",
"drafts": "Entw<EFBFBD>rfe"
"drafts": "Entwürfe"
},
"massActions": {
"markAsRead": "Als gelesen markieren",

View File

@@ -6,7 +6,7 @@
"username": "Benutzername",
"password": "Passwort",
"port": "Port",
"monitoredFolders": "<EFBFBD>berwachte Ordner",
"monitoredFolders": "Überwachte Ordner",
"ssl": "SSL",
"fetchSince": "Holen seit",
"emailAddress": "E-Mail Adresse",
@@ -27,14 +27,14 @@
"Create EmailAccount": "E-Mail Konto erstellen",
"IMAP": "IMAP",
"Main": "Wichtig",
"Test Connection": "Verbindung <EFBFBD>berpr<EFBFBD>fen"
"Test Connection": "Verbindung überprüfen"
},
"messages": {
"couldNotConnectToImap": "Kann keine Verbindung zum IMAP Server herstellen",
"connectionIsOk": "Verbindung ist in Ordnung"
},
"tooltips": {
"monitoredFolders": "Sie k<EFBFBD>nnen einen 'Gesendet' Ordner hinzuf<EFBFBD>gen um E-Mails zu synchronisieren, die von einem externen Programm gesendet wurden.",
"monitoredFolders": "Sie können einen 'Gesendet' Ordner hinzufügen um E-Mails zu synchronisieren, die von einem externen Programm gesendet wurden.",
"storeSentEmails": "Gesendete E-Mail werden auf einem IMAP Server gespeichert. Die E-Mail Adresse muss jene sein von der die E-Mail gesendet wurde."
}
}

View File

@@ -1,7 +1,7 @@
{
"labels": {
"Primary": "Prim<EFBFBD>r",
"Primary": "Primär",
"Opted Out": "Keine E-Mails",
"Invalid": "Ung<EFBFBD>ltig"
"Invalid": "Ungültig"
}
}

View File

@@ -9,11 +9,11 @@
"Create EmailFilter": "E.Mail Filter erstellen"
},
"tooltips": {
"name": "Ein Name f<EFBFBD>r den Filter",
"subject": "Verwendung des Platzhalters *:\n\ntext* - beginnt mit text,\n*text* - enth<EFBFBD>lt text,\n*text - endet mit text.",
"bodyContains": "Der Text der E-Mail enth<EFBFBD>lt eines der angegebenen Worte oder Phrasen.",
"from": "Die E-Mails werden von der angegebenen Adresse gesendet. Bitte leer lassen wenn nicht ben<EFBFBD>tigt.",
"to": "Die E-Mails werden an die angegebene Adresse gesendet. Bitte leer lassen wenn nicht ben<EFBFBD>tigt.",
"parent": "Leer lassen um den Filter global anzuwenden (f<EFBFBD>r alle eingehenden E-Mails)."
"name": "Ein Name für den Filter",
"subject": "Verwendung des Platzhalters *:\n\ntext* - beginnt mit text,\n*text* - enthält text,\n*text - endet mit text.",
"bodyContains": "Der Text der E-Mail enthält eines der angegebenen Worte oder Phrasen.",
"from": "Die E-Mails werden von der angegebenen Adresse gesendet. Bitte leer lassen wenn nicht benötigt.",
"to": "Die E-Mails werden an die angegebene Adresse gesendet. Bitte leer lassen wenn nicht benötigt.",
"parent": "Leer lassen um den Filter global anzuwenden (für alle eingehenden E-Mails)."
}
}

View File

@@ -5,7 +5,7 @@
"isHtml": "Ist HTML",
"body": "Inhalt",
"subject": "Betreff",
"attachments": "Anh<EFBFBD>nge",
"attachments": "Anhänge",
"insertField": "Project-Id-Version: Espo de_DE\nPOT-Creation-Date: \nPO-Revision-Date: \nLast-Translator: Robert Laussegger <info@iscongroup.net>\nLanguage-Team: iscon group <info@iscongroup.net>\nMIME-Version: 1.0\nContent-Type: text/plain; charset=iso-8859-1\nContent-Transfer-Encoding: 8bit\nLanguage: de_DE\nX-Generator: Poedit 1.6.5\n"
},
"links": {
@@ -15,6 +15,6 @@
"Info": "Info"
},
"messages": {
"infoText": "Verf<EFBFBD>gbare Variablen:\n\n{optOutUrl} &#8211; URL f<EFBFBD>r den Abmeldelink};\n\n{optOutLink} &#8211; ein Abmeldelink."
"infoText": "Verfügbare Variablen:\n\n{optOutUrl} &#8211; URL für den Abmeldelink};\n\n{optOutLink} &#8211; ein Abmeldelink."
}
}

View File

@@ -8,10 +8,10 @@
"type": "Typ",
"labelSingular": "Bezeichnung Einzahl",
"labelPlural": "Bezeichnung Mehrzahl",
"stream": "Vorg<EFBFBD>nge",
"stream": "Vorgänge",
"label": "Bezeichnung",
"linkType": "Relationstyp",
"entityForeign": "Fremdentit<EFBFBD>t/-modul",
"entityForeign": "Fremdentität/-modul",
"linkForeign": "Remdrelation/-modul",
"link": "Link",
"labelForeign": "Fremdbezeichnung",
@@ -38,7 +38,7 @@
}
},
"messages": {
"entityCreated": "Entit<EFBFBD>t wurde erstellt",
"entityCreated": "Entität wurde erstellt",
"linkAlreadyExists": "Konflikt Name Relation"
}
}

View File

@@ -5,15 +5,15 @@
"Team": "Team",
"Role": "Rolle",
"EmailTemplate": "E-Mail Vorlage",
"EmailAccount": "Pers<EFBFBD>nliches E-Mail Konto",
"EmailAccountScope": "Pers<EFBFBD>nliches E-Mail Konto",
"EmailAccount": "Persönliches E-Mail Konto",
"EmailAccountScope": "Persönliches E-Mail Konto",
"OutboundEmail": "Ausgehende E-Mail",
"ScheduledJob": "Geplante Aufgabe",
"ExternalAccount": "Externes Konto",
"Extension": "Erweiterung",
"Dashboard": "<EFBFBD>bersicht",
"Dashboard": "Übersicht",
"InboundEmail": "Gruppen E-Mail Konto",
"Stream": "Vorg<EFBFBD>nge",
"Stream": "Vorgänge",
"Import": "Import",
"Template": "Vorlage",
"Job": "Job",
@@ -25,15 +25,15 @@
"Team": "Teams",
"Role": "Rollen",
"EmailTemplate": "E-Mail Vorlagen",
"EmailAccount": "Pers<EFBFBD>nliche E-Mail Konten",
"EmailAccountScope": "Pers<EFBFBD>nliche E-Mail Konten",
"EmailAccount": "Persönliche E-Mail Konten",
"EmailAccountScope": "Persönliche E-Mail Konten",
"OutboundEmail": "Ausgehende E-Mails",
"ScheduledJob": "Geplante Jobs",
"ExternalAccount": "Externe Konten",
"Extension": "Erweiterungen",
"Dashboard": "<EFBFBD>bersicht",
"Dashboard": "Übersicht",
"InboundEmail": "Gruppen E-Mail Konten",
"Stream": "Vorg<EFBFBD>nge",
"Stream": "Vorgänge",
"Import": "Importergebnis",
"Template": "Vorlagen",
"Job": "Jobs",
@@ -41,61 +41,61 @@
},
"labels": {
"Misc": "Verschiedenes",
"Merge": "Zusammenf<EFBFBD>hren",
"Merge": "Zusammenführen",
"None": "Kein(e)",
"by": "von",
"Saved": "Gespeichert.",
"Error": "Fehler",
"Select": "Ausw<EFBFBD>hlen",
"Not valid": "Ung<EFBFBD>ltig",
"Select": "Auswählen",
"Not valid": "Ungültig",
"Please wait...": "Bitte warten...",
"Please wait": "Bitte warten",
"Loading...": "Lade...",
"Uploading...": "Lade hoch...",
"Sending...": "Wird gesendet...",
"Merging...": "Zusammenf<EFBFBD>hren",
"Merged": "Zusammengef<EFBFBD>hrt",
"Removed": "Gel<EFBFBD>scht",
"Merging...": "Zusammenführen",
"Merged": "Zusammengeführt",
"Removed": "Gelöscht",
"Posted": "Geposted",
"Linked": "Verlinkt",
"Unlinked": "Verkn<EFBFBD>pfung gel<EFBFBD>scht",
"Unlinked": "Verknüpfung gelöscht",
"Done": "Fertig",
"Access denied": "Zugriff verweigert",
"Access": "Zugang",
"Are you sure?": "Sind Sie sicher?",
"Record has been removed": "Datensatz wurde gel<EFBFBD>scht",
"Record has been removed": "Datensatz wurde gelöscht",
"Wrong username/password": "Falscher Benutzername/Passwort",
"Post cannot be empty": "Notiz darf nicht leer sein",
"Removing...": "L<EFBFBD>sche...",
"Unlinking...": "L<EFBFBD>sche Verkn<EFBFBD>pfung...",
"Removing...": "Lösche...",
"Unlinking...": "Lösche Verknüpfung...",
"Posting...": "Poste...",
"Username can not be empty!": "Der Benutzername darf nicht leer sein!",
"Cache is not enabled": "Cache ist nicht aktiviert",
"Cache has been cleared": "Der Cache wurde geleert",
"Rebuild has been done": "Wiederherstellen wurde durchgef<EFBFBD>hrt",
"Rebuild has been done": "Wiederherstellen wurde durchgeführt",
"Saving...": "Speichere...",
"Modified": "Ver<EFBFBD>ndert",
"Modified": "Verändert",
"Created": "Erstellt",
"Create": "Erstellen",
"create": "erstellen",
"Overview": "<EFBFBD>berblick",
"Overview": "Überblick",
"Details": "Details",
"Add Field": "Feld hinzuf<EFBFBD>gen",
"Add Dashlet": "Dashlet hinzuf<EFBFBD>gen",
"Add Field": "Feld hinzufügen",
"Add Dashlet": "Dashlet hinzufügen",
"Filter": "Filter",
"Edit Dashboard": "<EFBFBD>bersicht bearbeiten",
"Add": "Hinzuf<EFBFBD>gen",
"Add Item": "Eintrag hinzuf<EFBFBD>gen",
"Reset": "Zur<EFBFBD>cksetzen",
"Menu": "Men<EFBFBD>",
"Edit Dashboard": "Übersicht bearbeiten",
"Add": "Hinzufügen",
"Add Item": "Eintrag hinzufügen",
"Reset": "Zurücksetzen",
"Menu": "Menü",
"More": "Mehr",
"Search": "Suchen",
"Only My": "Nur Meine",
"Open": "Offen",
"Admin": "Admin",
"About": "<EFBFBD>ber",
"About": "Über",
"Refresh": "Aktualisieren",
"Remove": "L<EFBFBD>schen",
"Remove": "Löschen",
"Options": "Optionen",
"Username": "Benutzername",
"Password": "Passwort",
@@ -103,7 +103,7 @@
"Log Out": "Abmelden",
"Preferences": "Benutzereinstellungen",
"State": "Bundesland/Kanton",
"Street": "Stra<EFBFBD>e",
"Street": "Straße",
"Country": "Land",
"City": "Ort",
"PostalCode": "PLZ",
@@ -112,7 +112,7 @@
"Followers": "Beobachter",
"Clear Local Cache": "Lokalen Cache leeren",
"Actions": "Aktionen",
"Delete": "L<EFBFBD>schen",
"Delete": "Löschen",
"Update": "Aktualisieren",
"Save": "Speichern",
"Edit": "Bearbeiten",
@@ -120,32 +120,32 @@
"Cancel": "Abbrechen",
"Apply": "Anwenden",
"Unlink": "Link entfernen",
"Mass Update": "Massen<EFBFBD>nderung",
"Mass Update": "Massenänderung",
"Export": "Exportieren",
"No Data": "Keine Daten",
"No Access": "Kein Zugriff",
"All": "Alle",
"Active": "Aktiv",
"Inactive": "Inaktiv",
"Write your comment here": "Notiz hier einf<EFBFBD>gen",
"Write your comment here": "Notiz hier einfügen",
"Post": "Senden",
"Stream": "Vorg<EFBFBD>nge",
"Stream": "Vorgänge",
"Show more": "Mehr anzeigen",
"Dashlet Options": "Dashlet Optionen",
"Full Form": "Komplettes Formular",
"Insert": "Einf<EFBFBD>gen",
"Insert": "Einfügen",
"Person": "Person",
"First Name": "Vorname",
"Last Name": "Nachname",
"Original": "Original",
"You": "Sie",
"you": "Sie",
"change": "<EFBFBD>ndern",
"Change": "<EFBFBD>ndern",
"Primary": "Prim<EFBFBD>r",
"change": "ändern",
"Change": "Ändern",
"Primary": "Primär",
"Save Filter": "Filter speichern",
"Administration": "Administration",
"Run Import": "Import durchf<EFBFBD>hren",
"Run Import": "Import durchführen",
"Duplicate": "Duplizieren",
"Notifications": "Benachrichtigungen",
"Mark all read": "Alle als gelesen markieren",
@@ -153,12 +153,12 @@
"Today": "Heute",
"Tomorrow": "Morgen",
"Yesterday": "Gestern",
"Submit": "Ausf<EFBFBD>hren",
"Close": "Schlie<EFBFBD>en",
"Submit": "Ausführen",
"Close": "Schließen",
"Yes": "Ja",
"No": "Nein",
"View": "Ansehen",
"Select All Result": "Alle ausw<EFBFBD>hlen",
"Select All Result": "Alle auswählen",
"Value": "Wert",
"Current version": "Aktuelle Version",
"List View": "Listenansicht",
@@ -174,37 +174,37 @@
"messages": {
"pleaseWait": "Bitte warten...",
"confirmLeaveOutMessage": "Sind Sie sicher dass Sie das Formular verlassen wollen?",
"notModified": "Sie haben den Datensatz nicht ge<EFBFBD>ndert",
"duplicate": "Der Datensatz den Sie erstellen wollen, k<EFBFBD>nnte eine Dublette sein",
"fieldIsRequired": "{field} wird ben<EFBFBD>tigt",
"fieldShouldBeEmail": "{field} muss eine g<EFBFBD>ltige E-Mail sein",
"fieldShouldBeFloat": "{field} muss eine g<EFBFBD>ltige Flie<EFBFBD>komma Zahl sein",
"fieldShouldBeInt": "{field} muss eine g<EFBFBD>ltige Ganzzahl sein",
"fieldShouldBeDate": "{field} muss ein g<EFBFBD>ltiges Datum sein",
"fieldShouldBeDatetime": "{field} muss ein g<EFBFBD>ltiges Datum/Zeit Feld sein",
"notModified": "Sie haben den Datensatz nicht geändert",
"duplicate": "Der Datensatz den Sie erstellen wollen, könnte eine Dublette sein",
"fieldIsRequired": "{field} wird benötigt",
"fieldShouldBeEmail": "{field} muss eine gültige E-Mail sein",
"fieldShouldBeFloat": "{field} muss eine gültige Fließkomma Zahl sein",
"fieldShouldBeInt": "{field} muss eine gültige Ganzzahl sein",
"fieldShouldBeDate": "{field} muss ein gültiges Datum sein",
"fieldShouldBeDatetime": "{field} muss ein gültiges Datum/Zeit Feld sein",
"fieldShouldAfter": "{field} muss nach {otherField} sein",
"fieldShouldBefore": "{field} muss vor {otherField} sein",
"fieldShouldBeBetween": "{field} muss zwischen {min} und {max} sein",
"fieldShouldBeLess": "{field} muss kleiner als {value} sein",
"fieldShouldBeGreater": "{field} muss gr<EFBFBD><EFBFBD>er als {value} sein",
"fieldBadPasswordConfirm": "{field} falsch best<EFBFBD>tigt",
"resetPreferencesDone": "Die Einstellungen wurden auf Standardwerte zur<EFBFBD>ckgesetzt",
"fieldShouldBeGreater": "{field} muss größer als {value} sein",
"fieldBadPasswordConfirm": "{field} falsch bestätigt",
"resetPreferencesDone": "Die Einstellungen wurden auf Standardwerte zurückgesetzt",
"assignmentEmailNotificationSubject": "EspoCRM {entityType}: {Entity.name}",
"assignmentEmailNotificationBody": "{assignerUserName} hat Ihnen {entityType} '{Entity.name}' zugewiesen.\n\n{recordUrl}",
"confirmation": "Sind Sie sicher?",
"unlinkAllConfirmation": "Sind Sie sicher, dass Sie die Beziehungen zu allen verbundenen Datens<EFBFBD>tzen entfernen m<EFBFBD>chten?",
"resetPreferencesConfirmation": "Sind Sie sicher, dass Sie die Einstellungen auf Standardwerte zur<EFBFBD>cksetzen wollen?",
"removeRecordConfirmation": "Sind Sie sicher, dass Sie den Eintrag l<EFBFBD>schen wollen?",
"unlinkRecordConfirmation": "Sind Sie sicher, dass Sie die Beziehung zu dem verbundenen Datensatz entfernen m<EFBFBD>chten?",
"removeSelectedRecordsConfirmation": "Sind Sie sicher, dass Sie die ausgew<EFBFBD>hlten S<EFBFBD>tze l<EFBFBD>schen m<EFBFBD>chten?",
"massUpdateResult": "{count} Eintr<EFBFBD>ge wurden aktualisiert",
"unlinkAllConfirmation": "Sind Sie sicher, dass Sie die Beziehungen zu allen verbundenen Datensätzen entfernen möchten?",
"resetPreferencesConfirmation": "Sind Sie sicher, dass Sie die Einstellungen auf Standardwerte zurücksetzen wollen?",
"removeRecordConfirmation": "Sind Sie sicher, dass Sie den Eintrag löschen wollen?",
"unlinkRecordConfirmation": "Sind Sie sicher, dass Sie die Beziehung zu dem verbundenen Datensatz entfernen möchten?",
"removeSelectedRecordsConfirmation": "Sind Sie sicher, dass Sie die ausgewählten Sätze löschen möchten?",
"massUpdateResult": "{count} Einträge wurden aktualisiert",
"massUpdateResultSingle": "{count} Eintrag wurde aktualisiert",
"noRecordsUpdated": "Es wurden keine Eintr<EFBFBD>ge aktualisiert",
"massRemoveResult": "{count} Eintr<EFBFBD>ge wurden gel<EFBFBD>scht",
"massRemoveResultSingle": "{count} Eintrag wurde gel<EFBFBD>scht",
"noRecordsRemoved": "Es wurden keine Eintr<EFBFBD>ge gel<EFBFBD>scht",
"noRecordsUpdated": "Es wurden keine Einträge aktualisiert",
"massRemoveResult": "{count} Einträge wurden gelöscht",
"massRemoveResultSingle": "{count} Eintrag wurde gelöscht",
"noRecordsRemoved": "Es wurden keine Einträge gelöscht",
"clickToRefresh": "Klicken um zu aktualisieren",
"streamPostInfo": "Schreiben Sie <strong>@username</strong> um Benutzer in der Notiz hervorzuheben.\n\nVerf<EFBFBD>gbare Syntax:\n`<code>Code</code>`\n**<strong>fetter Text</strong>**\n*<em>Hervorgehobener Text</em>*\n~<del>Durchgestrichen</del>~\n> blockquote\n(url)[link]"
"streamPostInfo": "Schreiben Sie <strong>@username</strong> um Benutzer in der Notiz hervorzuheben.\n\nVerfügbare Syntax:\n`<code>Code</code>`\n**<strong>fetter Text</strong>**\n*<em>Hervorgehobener Text</em>*\n~<del>Durchgestrichen</del>~\n> blockquote\n(url)[link]"
},
"boolFilters": {
"onlyMy": "Nur Meine",
@@ -215,9 +215,9 @@
"all": "Alle"
},
"massActions": {
"remove": "L<EFBFBD>schen",
"merge": "Zusammenf<EFBFBD>hren",
"massUpdate": "Massen<EFBFBD>nderung",
"remove": "Löschen",
"merge": "Zusammenführen",
"massUpdate": "Massenänderung",
"export": "Exportieren"
},
"fields": {
@@ -230,16 +230,16 @@
"assignedUserName": "Zugewiesener Benutzername",
"teams": "Teams",
"createdAt": "Erstellt am",
"modifiedAt": "Ge<EFBFBD>ndert am",
"modifiedAt": "Geändert am",
"createdBy": "Erstellt von",
"modifiedBy": "Ge<EFBFBD>ndert von",
"modifiedBy": "Geändert von",
"description": "Beschreibung",
"address": "Adresse",
"phoneNumber": "Telefon",
"phoneNumberMobile": "Telefon (Mobil)",
"phoneNumberHome": "Telefon (Privat)",
"phoneNumberFax": "Telefon (Fax)",
"phoneNumberOffice": "Telefon (B<EFBFBD>ro)",
"phoneNumberOffice": "Telefon (Büro)",
"phoneNumberOther": "Telefon (Andere)",
"order": "Position",
"parent": "Bezieht sich auf",
@@ -248,7 +248,7 @@
"links": {
"assignedUser": "Zugewiesener Benutzer",
"createdBy": "Erstellt von",
"modifiedBy": "Ge<EFBFBD>ndert von",
"modifiedBy": "Geändert von",
"team": "Team",
"roles": "Rollen",
"teams": "Teams",
@@ -257,7 +257,7 @@
"children": "Kinder"
},
"dashlets": {
"Stream": "Vorg<EFBFBD>nge"
"Stream": "Vorgänge"
},
"notificationMessages": {
"assign": "{entityType} {entity} wurde Ihnen zugewiesen",
@@ -269,7 +269,7 @@
"createAssigned": "{user} hat {entityType} {entity} erstellt und an {assignee} zugewiesen",
"assign": "{user} hat {entityType} {entity} an {assignee} zugewiesen",
"post": "{user} hat zu {entityType} {entity} notiert",
"attach": "{user} hat zu {entityType} {entity} hinzugef<EFBFBD>gt",
"attach": "{user} hat zu {entityType} {entity} hinzugefügt",
"status": "{user} hat {field} von {entityType} {entity} aktualisiert",
"update": "{user} hat {entityType} {entity} aktualisiert",
"createRelated": "{user} hat {relatedEntityType} {relatedEntity} verbunden mit {entityType} {entity} erstellt",
@@ -280,7 +280,7 @@
"createAssignedThis": "{user} hat {entityType} erstellt und an {assignee} zugewiesen",
"assignThis": "{user} hat {entityType} an {assignee} zugewiesen",
"postThis": "{user} hat notiert",
"attachThis": "{user} hat hinzugef<EFBFBD>gt",
"attachThis": "{user} hat hinzugefügt",
"statusThis": "{user} hat {field} aktualisiert",
"updateThis": "{user} hat diese(s/n) {entityType} aktualisiert",
"createRelatedThis": "{user} hat {relatedEntityType} {relatedEntity} verbunden mit dieser/m {entityType} erstellt",
@@ -302,8 +302,8 @@
"emailSentThis": "{by} hat eine E-Mail gesendet"
},
"lists": {
"monthNames": ["Januar", "Februar", "M<EFBFBD>rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],
"monthNamesShort": ["Jan", "Feb", "M<EFBFBD>r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
"monthNames": ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],
"monthNamesShort": ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
"dayNames": ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"],
"dayNamesShort": ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"],
"dayNamesMin": ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]
@@ -325,7 +325,7 @@
"ca_ES": "Katalanisch",
"cs_CZ": "Tschechisch",
"cy_GB": "Walisisch",
"da_DK": "D<EFBFBD>nisch",
"da_DK": "Dänisch",
"de_DE": "Deutsch",
"el_GR": "Griechisch",
"en_GB": "Englisch (UK)",
@@ -335,19 +335,19 @@
"eu_ES": "Baskisch",
"fa_IR": "Persisch",
"fi_FI": "Finnisch",
"fo_FO": "F<EFBFBD>r<EFBFBD>isch",
"fr_CA": "Franz<EFBFBD>sisch (CN)",
"fr_FR": "Franz<EFBFBD>sisch (FR)",
"fo_FO": "Färöisch",
"fr_CA": "Französisch (CN)",
"fr_FR": "Französisch (FR)",
"ga_IE": "Irisch",
"gl_ES": "Galizisch",
"gn_PY": "Guarani",
"he_IL": "Hebr<EFBFBD>isch",
"he_IL": "Hebräisch",
"hi_IN": "Hindi",
"hr_HR": "Kroatisch",
"hu_HU": "Ungarisch",
"hy_AM": "Armenisch",
"id_ID": "Indonesisch",
"is_IS": "Isl<EFBFBD>ndisch",
"is_IS": "Isländisch",
"it_IT": "Italienisch",
"ja_JP": "Japanisch",
"ka_GE": "Georgisch",
@@ -359,16 +359,16 @@
"mk_MK": "Mazedonisch",
"ml_IN": "Malayalam",
"ms_MY": "Malaiisch",
"nb_NO":"Norwegian Bokmål",
"nb_NO": "Norwegisch Bokmál",
"nn_NO": "Norwegisch Nynorsk",
"ne_NP": "Nepali",
"nl_NL": "Niederl<EFBFBD>ndisch",
"nl_NL": "Niederländisch",
"pa_IN": "Punjabi",
"pl_PL": "Polnisch",
"ps_AF": "Pashto",
"pt_BR": "Portugiesisch (BR)",
"pt_PT": "Portugiesisch (PT)",
"ro_RO": "Rum<EFBFBD>nisch",
"ro_RO": "Rumänisch",
"ru_RU": "Russisch",
"sk_SK": "Slowakisch",
"sl_SI": "Slowenisch",
@@ -378,9 +378,9 @@
"sw_KE": "Suaheli",
"ta_IN": "Tamil",
"te_IN": "Telugu",
"th_TH": "Thail<EFBFBD>ndisch",
"th_TH": "Thailändisch",
"tl_PH": "Tagalog",
"tr_TR": "T<EFBFBD>kisch",
"tr_TR": "Tükisch",
"uk_UA": "Ukrainisch",
"ur_PK": "Urdu",
"vi_VN": "Vietnamesisch",
@@ -405,7 +405,7 @@
"lastYear": "Letztes Jahr",
"lastSevenDays": "Letzten 7 Tage",
"lastXDays": "Letzten X Tage",
"nextXDays": "N<EFBFBD>chsten X Tage"
"nextXDays": "Nächsten X Tage"
},
"searchRanges": {
"is": "Ist",
@@ -415,14 +415,14 @@
"varcharSearchRanges": {
"equals": "Gleich",
"startsWith": "Beginnt mit",
"contains": "Enth<EFBFBD>lt"
"contains": "Enthält"
},
"intSearchRanges": {
"equals": "Gleich",
"notEquals": "Nicht gleich",
"greaterThan": "Gr<EFBFBD><EFBFBD>er als",
"greaterThan": "Größer als",
"lessThan": "Weniger als",
"greaterThanOrEquals": "Gr<EFBFBD><EFBFBD>er oder gleich als",
"greaterThanOrEquals": "Größer oder gleich als",
"lessThanOrEquals": "Weniger oder gleich als",
"between": "Zwischen"
},
@@ -436,7 +436,7 @@
},
"phoneNumber": {
"Mobile": "Telefon Mobil",
"Office": "Telefon B<EFBFBD>ro",
"Office": "Telefon Büro",
"Fax": "Fax",
"Home": "Telefon Privat",
"Other": "Andere"
@@ -444,44 +444,44 @@
},
"sets": {
"summernote": {
"NOTICE": "Sie finden die <EFBFBD>bersetzung hier: https://github.com/HackerWins/summernote/tree/master/lang",
"NOTICE": "Sie finden die Übersetzung hier: https://github.com/HackerWins/summernote/tree/master/lang",
"font":{
"bold": "Fett",
"italic": "Kursiv",
"underline": "Unterstrichen",
"strike": "Durchgestrichen",
"clear": "Font Stil entfernen",
"height": "Zeilenh<EFBFBD>he",
"height": "Zeilenhöhe",
"name": "Schriftfamilie",
"size": "Schriftgr<EFBFBD><EFBFBD>e"
"size": "Schriftgröße"
},
"image":{
"image": "Bild",
"insert": "Bild einf<EFBFBD>gen",
"resizeFull": "Originalgr<EFBFBD><EFBFBD>e",
"resizeHalf": "Gr<EFBFBD><EFBFBD>e 1/2",
"resizeQuarter": "Gr<EFBFBD><EFBFBD>e 1/4",
"floatLeft": "Linksb<EFBFBD>ndig",
"floatRight": "Rechtsb<EFBFBD>ndig",
"insert": "Bild einfügen",
"resizeFull": "Originalgröße",
"resizeHalf": "Größe 1/2",
"resizeQuarter": "Größe 1/4",
"floatLeft": "Linksbündig",
"floatRight": "Rechtsbündig",
"floatNone": "Kein Textfluss",
"dragImageHere": "Ziehen Sie ein Bild mit der Maus hierher",
"selectFromFiles": "W<EFBFBD>hlen Sie eine Datei aus",
"selectFromFiles": "Wählen Sie eine Datei aus",
"url": "Grafik URL",
"remove": "Grafik entfernen"
},
"link":{
"link": "Link",
"insert": "Link einf<EFBFBD>gen",
"insert": "Link einfügen",
"unlink": "Link entfernen",
"edit": "Bearbeiten",
"textToDisplay": "Anzeigetext",
"url": "Ziel des Links?",
"openInNewWindow": "In einem neuen Fenster <EFBFBD>ffnen"
"openInNewWindow": "In einem neuen Fenster öffnen"
},
"video":{
"video": "Video",
"videoLink": "Video Link",
"insert": "Video einf<EFBFBD>gen",
"insert": "Video einfügen",
"url": "Video URL?",
"providers": "(YouTube, Vimeo, Vine, Instagram oder DailyMotion)"
},
@@ -489,19 +489,19 @@
"table": "Tabelle"
},
"hr":{
"insert": "Eine horizontale Linie einf<EFBFBD>gen"
"insert": "Eine horizontale Linie einfügen"
},
"style":{
"style": "Stil",
"normal": "Normal",
"blockquote": "Zitat",
"pre": "Quellcode",
"h1": "<EFBFBD>berschrift 1",
"h2": "<EFBFBD>berschrift 2",
"h3": "<EFBFBD>berschrift 3",
"h4": "<EFBFBD>berschrift 4",
"h5": "<EFBFBD>berschrift 5",
"h6": "<EFBFBD>berschrift 6"
"h1": "Überschrift 1",
"h2": "Überschrift 2",
"h3": "Überschrift 3",
"h4": "Überschrift 4",
"h5": "Überschrift 5",
"h6": "Überschrift 6"
},
"lists":{
"unordered": "Unsortierte Liste",
@@ -514,8 +514,8 @@
},
"paragraph":{
"paragraph": "Absatz",
"outdent": "Ausr<EFBFBD>ckung",
"indent": "Einr<EFBFBD>ckung",
"outdent": "Ausrückung",
"indent": "Einrückung",
"left": "Links ausrichten",
"center": "Zentriert ausrichten",
"right": "Rechts ausrichten",
@@ -528,19 +528,19 @@
"foreground": "Schriftfarbe",
"transparent": "Transparenz",
"setTransparent": "Transparenz setzen",
"reset": "Zur<EFBFBD>cksetzen",
"resetToDefault": "Zur<EFBFBD>cksetzen auf Standard"
"reset": "Zurücksetzen",
"resetToDefault": "Zurücksetzen auf Standard"
},
"shortcut":{
"shortcuts": "Tastaturk<EFBFBD>rzel",
"close": "Schlie<EFBFBD>en",
"shortcuts": "Tastaturkürzel",
"close": "Schließen",
"textFormatting": "Textformatierung",
"action": "Aktion",
"paragraphFormatting": "Absatzformatierung",
"documentStyle": "Dokumentenstil"
},
"history":{
"undo": "R<EFBFBD>ckg<EFBFBD>ngig",
"undo": "Rückgängig",
"redo": "Wiederholen"
}
}

View File

@@ -1,16 +1,16 @@
{
"labels": {
"Revert Import": "Import r<EFBFBD>ckg<EFBFBD>ngig machen",
"Return to Import": "Zur<EFBFBD>ck zum Import",
"Run Import": "Import durchf<EFBFBD>hren",
"Back": "Zur<EFBFBD>ck",
"Revert Import": "Import rückgängig machen",
"Return to Import": "Zurück zum Import",
"Run Import": "Import durchführen",
"Back": "Zurück",
"Field Mapping": "Feldzuordnung",
"Default Values": "Standardwerte",
"Add Field": "Feld hinzuf<EFBFBD>gen",
"Add Field": "Feld hinzufügen",
"Created": "Erstellt",
"Updated": "Aktualisiert",
"Result": "Resultat",
"Show records": "Datens<EFBFBD>tze zeigen",
"Show records": "Datensätze zeigen",
"Remove Duplicates": "Duplikate entfernen",
"importedCount": "Importiert (Anzahl)",
"duplicateCount": "Duplicate (Anzahl)",
@@ -26,9 +26,9 @@
},
"fields": {
"file": "Datei",
"entityType": "Entit<EFBFBD>tstyp",
"imported": "Importierte Datens<EFBFBD>tze",
"duplicates": "Doppelte Datens<EFBFBD>tze",
"updated": "Aktualisierte Datens<EFBFBD>tze"
"entityType": "Entitätstyp",
"imported": "Importierte Datensätze",
"duplicates": "Doppelte Datensätze",
"updated": "Aktualisierte Datensätze"
}
}

View File

@@ -4,12 +4,12 @@
"emailAddress": "E-Mail Adresse",
"team": "Team",
"status": "Status",
"assignToUser": "Mit Benutzer verkn<EFBFBD>pfen",
"assignToUser": "Mit Benutzer verknüpfen",
"host": "Host",
"username": "Benutzername",
"password": "Passwort",
"port": "Port",
"monitoredFolders": "<EFBFBD>berwachte Ordner",
"monitoredFolders": "Überwachte Ordner",
"trashFolder": "Papierkorb Ordner",
"ssl": "SSL",
"createCase": "Fall erstellen",
@@ -22,13 +22,13 @@
"targetUserPosition": "Position Zielbenutzer"
},
"tooltips": {
"reply": "E-Mail Absender informieren, dass die E-Mail empfangen wurde.\n\nEs wird pro Zeitabschnitt nur eine E-Mail an einen bestimmten Empf<EFBFBD>nger gesendet um Schleifen zu vermeiden.",
"reply": "E-Mail Absender informieren, dass die E-Mail empfangen wurde.\n\nEs wird pro Zeitabschnitt nur eine E-Mail an einen bestimmten Empfänger gesendet um Schleifen zu vermeiden.",
"createCase": "Fall aus eingehender E-Mail automatisch erstellen.",
"replyToAddress": "Geben Sie die E-Mail Adresse dieser Mailbox an um Antworten hier zu empfangen.",
"caseDistribution": "Wie F<EFBFBD>lle zugewiesen werden. Entweder direkt dem Benutzer oder im Team.",
"assignToUser": "Benutzer E-Mails/F<EFBFBD>lle werden zugewiesen an",
"team": "Team E-Mails/F<EFBFBD>lle werden verkn<EFBFBD>pft mit",
"targetUserPosition": "Bestimmen Sie die Position der Benutzer die F<EFBFBD>lle zugewiesen bekommen."
"caseDistribution": "Wie Fälle zugewiesen werden. Entweder direkt dem Benutzer oder im Team.",
"assignToUser": "Benutzer E-Mails/Fälle werden zugewiesen an",
"team": "Team E-Mails/Fälle werden verknüpft mit",
"targetUserPosition": "Bestimmen Sie die Position der Benutzer die Fälle zugewiesen bekommen."
},
"links": {
"filters": "Filter"

View File

@@ -6,10 +6,10 @@
"redirectUri": "Redirect URI"
},
"messages": {
"selectIntegration": "W<EFBFBD>hlen Sie eine Integration aus dem Men<EFBFBD>.",
"noIntegrations": "Keine Integration verf<EFBFBD>gbar."
"selectIntegration": "Wählen Sie eine Integration aus dem Menü.",
"noIntegrations": "Keine Integration verfügbar."
},
"help": {
"Google": "<p><b>Holen Sie die OAuth 2.0 Credentials <EFBFBD>ber die Google Developers Console.</b></p><p>Visit <a href=\"https://console.developers.google.com/project\">Google Developers Console</a> um OAuth 2.0 Credentials wie eine Client ID und Client Geheimnis zu erhalten die sowohl Google als auch EspoCRM bekannt sind.</p>"
"Google": "<p><b>Holen Sie die OAuth 2.0 Credentials über die Google Developers Console.</b></p><p>Visit <a href=\"https://console.developers.google.com/project\">Google Developers Console</a> um OAuth 2.0 Credentials wie eine Client ID und Client Geheimnis zu erhalten die sowohl Google als auch EspoCRM bekannt sind.</p>"
}
}

View File

@@ -1,7 +1,7 @@
{
"fields": {
"status": "Status",
"executeTime": "Ausf<EFBFBD>hren um",
"executeTime": "Ausführen um",
"attempts": "Verbleibende Versuche",
"failedAttempts": "Fehlgeschlagene Versuche",
"serviceName": "Service",
@@ -13,7 +13,7 @@
"status": {
"Pending": "Schwebend",
"Success": "Erfolg",
"Running": "L<EFBFBD>uft",
"Running": "Läuft",
"Failed": "Fehlgeschlagen"
}
}

View File

@@ -1,7 +1,7 @@
{
"fields": {
"post": "Senden",
"attachments": "Anh<EFBFBD>nge"
"attachments": "Anhänge"
},
"filters": {
"all": "Alle",

View File

@@ -6,8 +6,8 @@
"weekStart": "Erster Tag der Woche",
"thousandSeparator": "Tausender Trennzeichen",
"decimalMark": "Dezimaltrennzeichen",
"defaultCurrency": "Standardw<EFBFBD>hrung",
"currencyList": "W<EFBFBD>hrungsliste",
"defaultCurrency": "Standardwährung",
"currencyList": "Währungsliste",
"language": "Sprache",
"smtpServer": "Server",
"smtpPort": "Port",
@@ -37,12 +37,12 @@
},
"labels": {
"Notifications": "Benachrichtigungen",
"User Interface": "Benutzeroberfl<EFBFBD>che",
"User Interface": "Benutzeroberfläche",
"SMTP": "SMTP",
"Misc": "Verschiedenes",
"Locale": "Lokale Einstellungen"
},
"tooltips": {
"autoFollowEntityTypeList": "Der Benutzer beobachtet alle neuen Eintr<EFBFBD>ge der gew<EFBFBD>hlten Entit<EFBFBD>t, sieht Neuigkeiten in den Vorg<EFBFBD>ngen und erh<EFBFBD>lt Benachrichtigungen."
"autoFollowEntityTypeList": "Der Benutzer beobachtet alle neuen Einträge der gewählten Entität, sieht Neuigkeiten in den Vorgängen und erhält Benachrichtigungen."
}
}

View File

@@ -10,8 +10,8 @@
"teams": "Teams"
},
"tooltips": {
"assignmentPermission": "Erm<EFBFBD>glicht das Recht der Zuweisung von Datens<EFBFBD>tzen an andere Benutzer zu beschr<EFBFBD>nken\n\nAlle - Keine Einschr<EFBFBD>nkung\n\nTeam - Kann an Benutzer des eigenen Teams zuweisen\n\nNein - Kann nur sich selbst zuweisen",
"userPermission": "Erlaubt Benutzern die Aktivit<EFBFBD>ten anderer Benutzer zu sehen.\n\nAlle - Kann alle sehen\n\nTeam - Kann nur Aktivit<EFBFBD>ten der Benutzer im eigenen Team sehen\n\nNein - Kann keine anderen Aktivit<EFBFBD>ten sehen"
"assignmentPermission": "Ermöglicht das Recht der Zuweisung von Datensätzen an andere Benutzer zu beschränken\n\nAlle - Keine Einschränkung\n\nTeam - Kann an Benutzer des eigenen Teams zuweisen\n\nNein - Kann nur sich selbst zuweisen",
"userPermission": "Erlaubt Benutzern die Aktivitäten anderer Benutzer zu sehen.\n\nAlle - Kann alle sehen\n\nTeam - Kann nur Aktivitäten der Benutzer im eigenen Team sehen\n\nNein - Kann keine anderen Aktivitäten sehen"
},
"labels": {
"Access": "Zugang",
@@ -34,9 +34,9 @@
"actions": {
"read": "Lesen",
"edit": "Bearbeiten",
"delete": "L<EFBFBD>schen"
"delete": "Löschen"
},
"messages": {
"changesAfterClearCache": "Alle <EFBFBD>nderungen werden erst nach Leeren des Caches wirksam."
"changesAfterClearCache": "Alle Änderungen werden erst nach Leeren des Caches wirksam."
}
}

View File

@@ -13,16 +13,16 @@
},
"options": {
"job": {
"Cleanup": "Aufr<EFBFBD>umen",
"CheckInboundEmails": "Gruppen E-Mail Konten <EFBFBD>berpr<EFBFBD>fen",
"CheckEmailAccounts": "Pers<EFBFBD>nliche E-Mail Konten pr<EFBFBD>fen",
"Cleanup": "Aufräumen",
"CheckInboundEmails": "Gruppen E-Mail Konten überprüfen",
"CheckEmailAccounts": "Persönliche E-Mail Konten prüfen",
"SendEmailReminders": "E-Mail Erinnerungen senden"
},
"cronSetup": {
"linux": "Hinweis: F<EFBFBD>gen Sie diese Zeile zu Ihrer Crontab Datei hinzu, um geplante Aufgaben durchf<EFBFBD>hren zu k<EFBFBD>nnen:",
"mac": "Hinweis: F<EFBFBD>gen Sie diese Zeile zu Ihrer Crontab Datei hinzu, um geplante Aufgaben durchf<EFBFBD>hren zu k<EFBFBD>nnen:",
"windows": "Hinweis: Erstellen Sie eine Stapeldatei mit den folgenden Kommandos um geplante Aufgaben mit dem Windows Aufgabenplaner durchzuf<EFBFBD>hren:",
"default": "Hinweis: f<EFBFBD>gen Sie dieses Kommando zum CronJob hinzu (Geplante Aufgaben):"
"linux": "Hinweis: Fügen Sie diese Zeile zu Ihrer Crontab Datei hinzu, um geplante Aufgaben durchführen zu können:",
"mac": "Hinweis: Fügen Sie diese Zeile zu Ihrer Crontab Datei hinzu, um geplante Aufgaben durchführen zu können:",
"windows": "Hinweis: Erstellen Sie eine Stapeldatei mit den folgenden Kommandos um geplante Aufgaben mit dem Windows Aufgabenplaner durchzuführen:",
"default": "Hinweis: fügen Sie dieses Kommando zum CronJob hinzu (Geplante Aufgaben):"
},
"status": {
"Active": "Aktiv",
@@ -30,6 +30,6 @@
}
},
"tooltips": {
"scheduling": "Definiert wann und wie oft ein Job l<EFBFBD>uft\n\n*/5 * * * * - alle 5 Minuten\n\n0 */2 * * * - alle 2 Stunden\n\n30 1 * * * - um 01:30 einmal am Tag\n\n0 0 1 * * - am ersten Tag des Monats"
"scheduling": "Definiert wann und wie oft ein Job läuft\n\n*/5 * * * * - alle 5 Minuten\n\n0 */2 * * * - alle 2 Stunden\n\n30 1 * * * - um 01:30 einmal am Tag\n\n0 0 1 * * - am ersten Tag des Monats"
}
}

View File

@@ -1,6 +1,6 @@
{
"fields": {
"status": "Status",
"executionTime": "Ausf<EFBFBD>hrungszeit"
"executionTime": "Ausführungszeit"
}
}

View File

@@ -7,10 +7,10 @@
"weekStart": "Erster Tag der Woche",
"thousandSeparator": "Tausender Trennzeichen",
"decimalMark": "Dezimaltrennzeichen",
"defaultCurrency": "Standardw<EFBFBD>hrung",
"baseCurrency": "Basisw<EFBFBD>hrung",
"defaultCurrency": "Standardwährung",
"baseCurrency": "Basiswährung",
"currencyRates": "Wechselkurse",
"currencyList": "W<EFBFBD>hrungsliste",
"currencyList": "Währungsliste",
"language": "Sprache",
"companyLogo": "Firmenlogo",
"smtpServer": "Server",
@@ -23,12 +23,12 @@
"outboundEmailFromName": "Von Name",
"outboundEmailFromAddress": "Von Adresse",
"outboundEmailIsShared": "Kann von allen Benutzern verwendet werden",
"recordsPerPage": "Datens<EFBFBD>tze pro Seite",
"recordsPerPageSmall": "Datens<EFBFBD>tze pro Seite (Klein)",
"recordsPerPage": "Datensätze pro Seite",
"recordsPerPageSmall": "Datensätze pro Seite (Klein)",
"tabList": "Reiter Liste",
"quickCreateList": "Liste Schnellerstellung",
"exportDelimiter": "Export Trennzeichen",
"globalSearchEntityList": "Modul-/Entit<EFBFBD>tsliste globale Suche",
"globalSearchEntityList": "Modul-/Entitätsliste globale Suche",
"authenticationMethod": "Authentifizierungs Methode",
"ldapHost": "Host",
"ldapPort": "Port",
@@ -46,17 +46,20 @@
"ldapAccountDomainNameShort": "Domain Name Konto kurz",
"ldapOptReferrals": "Opt Referrals",
"exportDisabled": "Export deaktivieren (nur Admin ist berechtigt)",
"assignmentNotificationsEntityList": "Entit<EFBFBD>ten <EFBFBD>ber die bei Zuweisung benachrichtigt werden soll",
"assignmentNotificationsEntityList": "Entitäten über die bei Zuweisung benachrichtigt werden soll",
"assignmentEmailNotifications": "E-Mail Nachrichten bei Zuweisungen senden",
"assignmentEmailNotificationsEntityList": "Entit<EFBFBD>ten <EFBFBD>ber die mit E-Mail bei Zuweisung benachrichtigt werden soll",
"assignmentEmailNotificationsEntityList": "Entitäten über die mit E-Mail bei Zuweisung benachrichtigt werden soll",
"b2cMode": "B2C Modus",
"avatarsDisabled": "Avatare deaktivieren",
"followCreatedEntities": "Erstellten Eintr<EFBFBD>gen beobachten",
"followCreatedEntities": "Erstellten Einträgen beobachten",
"displayListViewRecordCount": "Gesamtanzahl anzeigen (in Listenansicht)",
"theme": "Design",
"userThemesDisabled": "Benutzerdesigns deaktivieren",
"emailMessageMaxSize": "Max. E-Mail Gr<EFBFBD><EFBFBD>e (Mb)",
"massEmailMaxPerHourCount": "Max. Anzahl E-Mails pro Stunde"
"emailMessageMaxSize": "Max. E-Mail Größe (Mb)",
"massEmailMaxPerHourCount": "Max. Anzahl E-Mails pro Stunde",
"personalEmailMaxPortionSize": "Max email portion size for a personal account fetching",
"inboundEmailMaxPortionSize": "Max email portion size for a group account fetching",
"maxEmailAccountCount": "Max count of personal email accounts per user"
},
"options": {
"weekStart": {
@@ -65,10 +68,10 @@
}
},
"tooltips": {
"recordsPerPageSmall": "Anzahl S<EFBFBD>tze in Beziehungssubpanels",
"outboundEmailIsShared": "Benutzern gestatten, E-Mails <EFBFBD>ber dieses SMTP Konto zu senden",
"followCreatedEntities": "Benutzer folgen automatisch jenen S<EFBFBD>tzen die sie erstellt haben",
"emailMessageMaxSize": "Alle eingehenden E-Mails die eine angegebene Gr<EFBFBD><EFBFBD>e <EFBFBD>bersteigen, werden <EFBFBD>bersprungen "
"recordsPerPageSmall": "Anzahl Sätze in Beziehungssubpanels",
"outboundEmailIsShared": "Benutzern gestatten, E-Mails über dieses SMTP Konto zu senden",
"followCreatedEntities": "Benutzer folgen automatisch jenen Sätzen die sie erstellt haben",
"emailMessageMaxSize": "Alle eingehenden E-Mails die eine angegebene Größe übersteigen, werden übersprungen "
},
"labels": {
"System": "System",
@@ -77,8 +80,8 @@
"Configuration": "Konfiguration",
"In-app Notifications": "In-App Benachrichtigungen",
"Email Notifications": "E-Mail Benachrichtigungen",
"Currency Settings": "W<EFBFBD>hrunsgseinstellungen",
"Currency Rates": "W<EFBFBD>hrungskurse",
"Currency Settings": "Währunsgseinstellungen",
"Currency Rates": "Währungskurse",
"Mass Email": "Massen E-Mails"
}
}

View File

@@ -8,8 +8,8 @@
"users": "Benutzer"
},
"tooltips": {
"roles": "Zugriffsrollen Benutzer dieses Teams erhalten Zugriffsberechtigung von ausgew<EFBFBD>hlten Rollen",
"positionList": "Verf<EFBFBD>gbare Positionen in diesem Team Z.B. Verk<EFBFBD>ufer, Manager etc."
"roles": "Zugriffsrollen Benutzer dieses Teams erhalten Zugriffsberechtigung von ausgewählten Rollen",
"positionList": "Verfügbare Positionen in diesem Team Z.B. Verkäufer, Manager etc."
},
"labels": {
"Create Team": "Team erstellen"

View File

@@ -2,15 +2,15 @@
"fields": {
"name": "Name",
"body": "Inhalt",
"entityType": "Entit<EFBFBD>tstyp",
"entityType": "Entitätstyp",
"header": "Kopf",
"footer": "Fu<EFBFBD>",
"footer": "Fuß",
"leftMargin": "Linker Rand",
"topMargin": "Oberer Rand",
"rightMargin": "Rechter Rand",
"bottomMargin": "Unterer Rand",
"printFooter": "Fu<EFBFBD> drucken",
"footerPosition": "Position Fu<EFBFBD>"
"printFooter": "Fuß drucken",
"footerPosition": "Position Fuß"
},
"links": {
},

View File

@@ -11,9 +11,9 @@
"teamRole": "Position",
"password": "Passwort",
"currentPassword": "Aktuelles Passwort",
"passwordConfirm": "Passwort best<EFBFBD>tigen",
"passwordConfirm": "Passwort bestätigen",
"newPassword": "Neues Passwort",
"newPasswordConfirm": "Neues Passwort best<EFBFBD>tigen",
"newPasswordConfirm": "Neues Passwort bestätigen",
"avatar": "Avatar",
"isActive": "Ist aktiv"
},
@@ -26,36 +26,36 @@
"Generate": "Erzeugen",
"Access": "Zugang",
"Preferences": "Benutzereinstellungen",
"Change Password": "Passwort <EFBFBD>ndern",
"Change Password": "Passwort ändern",
"Teams and Access Control": "Teams und Zugriffsberechtigung",
"Forgot Password?": "Passwort vergessen?",
"Password Change Request": "Anforderung zur Passwort<EFBFBD>nderung",
"Password Change Request": "Anforderung zur Passwortänderung",
"Email Address": "E-Mail Adresse",
"External Accounts": "Externe Konten",
"Email Accounts": "E-Mail Konten"
},
"tooltips": {
"defaultTeam": "Alle Datens<EFBFBD>tze dieses Benutzers werden standardm<EFBFBD><EFBFBD>ig seinem Team zugeordnet.",
"defaultTeam": "Alle Datensätze dieses Benutzers werden standardmäßig seinem Team zugeordnet.",
"userName": "Buchstaben a-z, Zahlen 0-9 und Unterstriche sind erlaubt.",
"isAdmin": "Der Admin Benutzer hat vollen Zugriff auf alle Funktionen.",
"isActive": "Wenn nicht markiert kann der Benutzer nicht einloggen",
"teams": "Das Team zu dem dieser Benutzer geh<EFBFBD>rt. Die Zugriffsberechtigung wird von der Team Rolle vererbt.",
"roles": "Zus<EFBFBD>tzliche Zugriffsrollen. Wenn ein Benutzer zu keinem Team geh<EFBFBD>rt oder wenn Sie die Zugriffsberechtigung nur f<EFBFBD>r diesen Benutzer erweitern wollen."
"teams": "Das Team zu dem dieser Benutzer gehört. Die Zugriffsberechtigung wird von der Team Rolle vererbt.",
"roles": "Zusätzliche Zugriffsrollen. Wenn ein Benutzer zu keinem Team gehört oder wenn Sie die Zugriffsberechtigung nur für diesen Benutzer erweitern wollen."
},
"messages": {
"passwordWillBeSent": "Das Passwort wird an die E-Mail Adresse des Benutzers gesendet",
"accountInfoEmailSubject": "EspoCRM Benutzerzugriffsinfo",
"accountInfoEmailBody": "Ihre EspoCRM Zugriffsinformation:\n\nBenutzername: {userName}\nPasswort: {password}\n\n{siteUrl}",
"passwordChangeLinkEmailSubject": "Anforderung zur Passwort<EFBFBD>nderung",
"passwordChangeLinkEmailBody": "Sie k<EFBFBD>nnen Ihr Passwort <EFBFBD>ber diesen Link {link} <EFBFBD>ndern Diese eindeutige URL ist nur f<EFBFBD>r kurze Zeit g<EFBFBD>ltig.",
"passwordChanged": "Das Passwort wurde ge<EFBFBD>ndert",
"passwordChangeLinkEmailSubject": "Anforderung zur Passwortänderung",
"passwordChangeLinkEmailBody": "Sie können Ihr Passwort über diesen Link {link} ändern Diese eindeutige URL ist nur für kurze Zeit gültig.",
"passwordChanged": "Das Passwort wurde geändert",
"userCantBeEmpty": "Der Benutzername darf nicht leer sein!",
"wrongUsernamePasword": "Falscher Benutzername/Passwort",
"emailAddressCantBeEmpty": "E-Mail Adresse darf nicht leer sein",
"userNameEmailAddressNotFound": "Benutzername oder E-Mail Adresse nicht gefunden",
"forbidden": "Verboten, bitte sp<EFBFBD>ter nochmals versuchen",
"forbidden": "Verboten, bitte später nochmals versuchen",
"uniqueLinkHasBeenSent": "Ein einmaliger Link wurde an die angegebene E-Mail Adresse gesendet.",
"passwordChangedByRequest": "Das Passwort wurde ge<EFBFBD>ndert"
"passwordChangedByRequest": "Das Passwort wurde geändert"
},
"boolFilters": {
"onlyMyTeam": "Nur mein Team"

View File

@@ -39,6 +39,7 @@
},
"messages": {
"entityCreated": "Entity has been created",
"linkAlreadyExists": "Link name conflict."
"linkAlreadyExists": "Link name conflict.",
"linkConflict": "Link with the same name already exists."
}
}

View File

@@ -43,10 +43,6 @@
{
"name": "defaultReminders"
}
],
[
{"name":"theme"},
false
]
]
},

View File

@@ -6,21 +6,17 @@
[
{
"name": "Stream",
"id": "d0004"
},
{
"name": "Calls",
"id": "d0001"
"id": "defaultStream"
}
],
[
{
"name": "Tasks",
"id": "d0003"
"id": "defaultTasks"
},
{
"name": "Meetings",
"id": "d0002"
"name": "Activities",
"id": "defailtActivities"
}
]
]

View File

@@ -0,0 +1,8 @@
{
"Standard": {
"defaultStream": {
"isDoubleHeight": true,
"displayRecords": 10
}
}
}

View File

@@ -177,6 +177,12 @@
"default": false,
"readOnly": true
},
"isJustSent": {
"type": "bool",
"default": false,
"disabled": true,
"notStorable": true
},
"teams": {
"type": "linkMultiple"
},

View File

@@ -87,12 +87,11 @@
},
{
"route":"/GlobalSearch/:query",
"route":"/GlobalSearch",
"method":"get",
"params":{
"controller":"GlobalSearch",
"action":"search",
"query": ":query"
"action":"search"
}
},

View File

@@ -131,6 +131,8 @@ class Email extends Record
$this->getStreamService()->noteEmailSent($parent, $entity);
}
$entity->set('isJustSent', true);
$this->getEntityManager()->saveEntity($entity);
}

View File

@@ -154,7 +154,6 @@ class EmailTemplate extends Record
protected function parseText($type, Entity $entity, $text)
{
$fieldList = array_keys($entity->getFields());
$fieldList[] = $id;
foreach ($fieldList as $field) {
$value = $entity->get($field);
if (is_object($value)) {

View File

@@ -787,7 +787,7 @@ class Record extends \Espo\Core\Services\Base
$count = 0;
if (array_key_exists('ids', $params)) {
if (array_key_exists('ids', $params) && is_array($params['ids'])) {
$ids = $params['ids'];
foreach ($ids as $id) {
$entity = $this->getEntity($id);

View File

@@ -30,7 +30,6 @@
this.menu.buttons.push({
'label': 'Send Invitations',
'action': 'sendInvitations',
icon: 'glyphicon glyphicon-send',
'acl': 'edit',
});
}

View File

@@ -25,31 +25,6 @@ Espo.define('Crm:Views.Lead.Record.DetailSide', 'Views.Record.DetailSide', funct
setupPanels: function () {
/*var panel = {
name: 'convertedTo',
label: 'Converted To',
view: 'Record.Panels.Side',
notRefreshable: true,
options: {
fieldList: [],
mode: 'detail',
}
};
panel.options.fieldList.push('createdAccount');
panel.options.fieldList.push('createdContact');
panel.options.fieldList.push('createdOpportunity');
this.panels = Espo.Utils.clone(this.panels);
this.panels.splice(1, 0, panel);*/
}
});

View File

@@ -0,0 +1,45 @@
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 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/.
************************************************************************/
Espo.define('crm:views/lead/record/panels/converted-to', 'views/record/panels/side', function (Dep) {
return Dep.extend({
setup: function () {
this.fieldList = [];
if (this.getAcl().check('Account')) {
this.fieldList.push('createdAccount');
}
if (this.getAcl().check('Contact')) {
this.fieldList.push('createdContact');
}
if (this.getAcl().check('Opportunity')) {
this.fieldList.push('createdOpportunity');
}
Dep.prototype.setup.call(this);
}
});
});

View File

@@ -30,7 +30,6 @@ Espo.define('Crm:Views.Meeting.Detail', 'Views.Detail', function (Dep) {
this.menu.buttons.push({
'label': 'Send Invitations',
'action': 'sendInvitations',
icon: 'glyphicon glyphicon-send',
'acl': 'edit',
});
}

View File

@@ -30,7 +30,7 @@ Espo.define('Crm:Views.Task.Detail', 'Views.Detail', function (Dep) {
this.menu.buttons.push({
'label': 'Complete',
'action': 'setCompleted',
icon: 'glyphicon glyphicon-ok',
'iconHtml': '<span class="glyphicon glyphicon-ok"></span>',
'acl': 'edit',
});
}

View File

@@ -6,6 +6,7 @@
<div class="header-buttons btn-group pull-right">
{{#each items.buttons}}
<a {{#if link}}href="{{link}}"{{else}}href="javascript:"{{/if}} class="btn btn-{{#if style}}{{style}}{{else}}default{{/if}} action{{#if hidden}} hidden{{/if}}" data-action="{{name}}"{{#each data}} data-{{@key}}="{{./this}}"{{/each}}>
{{#if iconHtml}}{{{iconHtml}}}{{/if}}
{{#if html}}{{{html}}}{{else}}{{translate label scope=../../scope}}{{/if}}
</a>
{{/each}}
@@ -30,7 +31,7 @@
</button>
<ul class="dropdown-menu pull-right">
{{#each items.dropdown}}
<li class="{{#if hidden}}hidden{{/if}}"><a {{#if link}}href="{{link}}"{{else}}href="javascript:"{{/if}} class="action" data-action="{{name}}"{{#each data}} data-{{@key}}="{{./this}}"{{/each}}>{{#if html}}{{{html}}}{{else}}{{translate label scope=../../../scope}}{{/if}}</a></li>
<li class="{{#if hidden}}hidden{{/if}}"><a {{#if link}}href="{{link}}"{{else}}href="javascript:"{{/if}} class="action" data-action="{{name}}"{{#each data}} data-{{@key}}="{{./this}}"{{/each}}>{{#if iconHtml}}{{{iconHtml}}} {{/if}}{{#if html}}{{{html}}}{{else}}{{translate label scope=../../../scope}}{{/if}}</a></li>
{{/each}}
</ul>
</div>

View File

@@ -42,6 +42,18 @@ Espo.define('model', [], function () {
Dep.prototype.initialize.call(this);
},
set: function (key, val, options) {
if (typeof key === 'object') {
var o = key;
if (this.idAttribute in o) {
this.id = o[this.idAttribute];
}
} else if (key === 'id') {
this.id = val;
}
return Dep.prototype.set.call(this, key, val, options);
},
get: function (key) {
if (key === 'id' && this.id) {
return this.id;

View File

@@ -23,6 +23,8 @@ Espo.define('views/email-template/record/detail', 'views/record/detail', functio
return Dep.extend({
duplicateAction: true,
afterRender: function () {
Dep.prototype.afterRender.call(this);
this.listenToInsertField();

View File

@@ -62,6 +62,22 @@ Espo.define('views/email/fields/email-address', ['views/fields/base'], function
}.bind(this)
});
}
},
fetchSearch: function () {
var value = this.$element.val();
if (typeof value.trim === 'function') {
value = value.trim();
}
if (value) {
var data = {
type: 'equals',
value: value
}
return data;
}
return false;
}
});

View File

@@ -357,6 +357,9 @@ Espo.define('Views.Fields.Email', 'Views.Fields.Base', function (Dep) {
fetchSearch: function () {
var value = this.$element.val() || null;
if (value) {
if (typeof value.trim === 'function') {
value = value.trim();
}
var data = {
type: 'like',
value: value + '%',
@@ -365,7 +368,7 @@ Espo.define('Views.Fields.Email', 'Views.Fields.Base', function (Dep) {
return data;
}
return false;
},
}
});
});

View File

@@ -57,7 +57,7 @@ Espo.define('Views.Fields.Varchar', 'Views.Fields.Base', function (Dep) {
return data;
}
return false;
},
}
});
});

View File

@@ -19,11 +19,11 @@
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
Espo.define('Views.GlobalSearch.GlobalSearch', 'View', function (Dep) {
Espo.define('views/global-search/global-search', 'view', function (Dep) {
return Dep.extend({
template: 'global-search.global-search',
template: 'global-search/global-search',
events: {
'keypress #global-search-input': function (e) {
@@ -63,7 +63,7 @@ Espo.define('Views.GlobalSearch.GlobalSearch', 'View', function (Dep) {
},
search: function (text) {
this.collection.url = this.collection.urlRoot = 'GlobalSearch/' + text;
this.collection.url = this.collection.urlRoot = 'GlobalSearch?q=' + encodeURIComponent(text);
this.showPanel();
},

View File

@@ -19,7 +19,7 @@
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
Espo.define('Views.Import.Detail', 'Views.Detail', function (Dep) {
Espo.define('views/import/detail', 'views/detail', function (Dep) {
return Dep.extend({

View File

@@ -18,11 +18,11 @@
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
Espo.define('Views.Import.Index', 'View', function (Dep) {
Espo.define('views/import/index', 'view', function (Dep) {
return Dep.extend({
template: 'import.index',
template: 'import/index',
data: function () {
return {

View File

@@ -19,7 +19,7 @@
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
Espo.define('Views.Import.List', 'Views.List', function (Dep) {
Espo.define('views/import/list', 'views/list', function (Dep) {
return Dep.extend({

View File

@@ -18,11 +18,12 @@
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
Espo.define('Views.Import.Step1', 'View', function (Dep) {
Espo.define('views/import/step1', 'view', function (Dep) {
return Dep.extend({
template: 'import.step-1',
template: 'import/step-1',
events: {
'change #import-file': function (e) {

View File

@@ -18,11 +18,12 @@
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
Espo.define('Views.Import.Step2', 'View', function (Dep) {
Espo.define('views/import/step2', 'view', function (Dep) {
return Dep.extend({
template: 'import.step-2',
template: 'import/step-2',
events: {
'click button[data-action="back"]': function () {

View File

@@ -17,9 +17,9 @@
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
************************************************************************/
Espo.define('Views.Modals.MassUpdate', 'Views.Modal', function (Dep) {
Espo.define('views/modals/mass-update', 'views/modal', function (Dep) {
return Dep.extend({
@@ -27,7 +27,7 @@ Espo.define('Views.Modals.MassUpdate', 'Views.Modal', function (Dep) {
header: false,
template: 'modals.mass-update',
template: 'modals/mass-update',
data: function () {
return {
@@ -151,7 +151,7 @@ Espo.define('Views.Modals.MassUpdate', 'Views.Modal', function (Dep) {
data: JSON.stringify({
attributes: attributes,
ids: self.ids || null,
where: (self.ids.length == 0) ? self.options.where : null,
where: (!self.ids || self.ids.length == 0) ? self.options.where : null,
byWhere: this.byWhere
}),
success: function (result) {

View File

@@ -34,6 +34,8 @@ Espo.define('views/record/detail', 'views/record/base', function (Dep) {
gridLayout: null,
detailLayout: null,
/**
* @property {string} or {bool} ['both', 'top', 'bottom', false, true] Where to display buttons.
*/
@@ -338,6 +340,8 @@ Espo.define('views/record/detail', 'views/record/base', function (Dep) {
this.layoutName = this.options.layoutName || this.layoutName;
this.detailLayout = this.options.detailLayout || this.detailLayout;
this.type = this.options.type || this.type;
this.buttons = this.options.buttons || this.buttons;
@@ -627,10 +631,19 @@ Espo.define('views/record/detail', 'views/record/base', function (Dep) {
return;
}
if (this.detailLayout) {
this.gridLayout = {
type: 'record',
layout: this.convertDetailLayout(this.detailLayout)
};
callback(this.gridLayout);
return;
}
this._helper.layoutManager.get(this.model.name, this.layoutName, function (simpleLayout) {
this.gridLayout = {
type: 'record',
layout: this.convertDetailLayout(simpleLayout),
layout: this.convertDetailLayout(simpleLayout)
};
callback(this.gridLayout);
}.bind(this));

View File

@@ -19,16 +19,18 @@
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
Espo.define('Views.Record.ListTreeItem', 'View', function (Dep) {
Espo.define('views/record/list-tree-item', 'view', function (Dep) {
return Dep.extend({
template: 'record.list-tree-item',
template: 'record/list-tree-item',
isEnd: false,
level: 0,
listViewName: 'views/record/list-tree',
data: function () {
return {
name: this.model.get('name'),
@@ -120,7 +122,7 @@ Espo.define('Views.Record.ListTreeItem', 'View', function (Dep) {
view.render();
};
}
this.createView('children', 'Record.ListTree', {
this.createView('children', this.listViewName, {
collection: childCollection,
el: this.options.el + ' > .children',
createDisabled: this.options.createDisabled,

View File

@@ -19,11 +19,11 @@
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
Espo.define('Views.Record.ListTree', 'Views.Record.List', function (Dep) {
Espo.define('views/record/list-tree', 'views/record/list', function (Dep) {
return Dep.extend({
template: 'record.list-tree',
template: 'record/list-tree',
showMore: false,
@@ -53,6 +53,8 @@ Espo.define('Views.Record.ListTree', 'Views.Record.List', function (Dep) {
level: 0,
itemViewName: 'views/record/list-tree-item',
data: function () {
var data = Dep.prototype.data.call(this);
data.createDisabled = this.createDisabled;
@@ -151,7 +153,7 @@ Espo.define('Views.Record.ListTree', 'Views.Record.List', function (Dep) {
var built = 0;
modelList.forEach(function (model, i) {
this.rows.push('row-' + i);
this.createView('row-' + i, 'Record.ListTreeItem', {
this.createView('row-' + i, this.itemViewName, {
model: model,
collection: this.collection,
el: this.options.el + ' ' + this.getRowSelector(model.id),
@@ -186,14 +188,22 @@ Espo.define('Views.Record.ListTree', 'Views.Record.List', function (Dep) {
return this.options.el + ' li[data-id="' + model.id + '"] span.cell-' + item.name;
},
getCreateAttributes: function () {
return {};
},
actionCreate: function (data, e) {
e.stopPropagation();
var parentId = null;
var parentName = null;
var attributes = this.getCreateAttributes();
attributes.order = this.collection.length + 1;
attributes.parentId = null;
attributes.parentName = null;
if (this.model) {
parentId = this.model.id;
parentName = this.model.get('name');
attributes.parentId = this.model.id;
attributes.parentName = this.model.get('name');
}
var scope = this.collection.name;
@@ -201,11 +211,7 @@ Espo.define('Views.Record.ListTree', 'Views.Record.List', function (Dep) {
var viewName = this.getMetadata().get('clientDefs.' + scope + '.modalViews.edit') || 'Modals.Edit';
this.createView('quickCreate', viewName, {
scope: scope,
attributes: {
parentId: parentId,
parentName: parentName,
order: this.collection.length + 1
}
attributes: attributes
}, function (view) {
view.render();
this.listenToOnce(view, 'after:save', function (model) {

View File

@@ -410,9 +410,13 @@ Espo.define('views/record/list', 'view', function (Dep) {
}
this.notify('Loading...');
var ids = this.checkedList;
var ids = false;
var allResultIsChecked = this.allResultIsChecked;
this.createView('massUpdate', 'Modals.MassUpdate', {
if (!allResultIsChecked) {
ids = this.checkedList;
}
this.createView('massUpdate', 'views/modals/mass-update', {
scope: this.scope,
ids: ids,
where: this.collection.getWhere(),

View File

@@ -0,0 +1,49 @@
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2015 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/.
************************************************************************/
Espo.define('views/record/row-actions/relationship-view-and-unlink', 'views/record/row-actions/relationship', function (Dep) {
return Dep.extend({
getActionList: function () {
var list = [{
action: 'viewRelated',
label: 'View',
data: {
id: this.model.id
}
}];
if (this.options.acl.edit) {
list.push({
action: 'unlinkRelated',
label: 'Unlink',
data: {
id: this.model.id
}
});
}
return list;
},
});
});

View File

@@ -50,7 +50,8 @@ Espo.define('Views.Role.Record.Table', 'View', function (Dep) {
'recordAllTeamOwnNo': ['all', 'team', 'own', 'no'],
'recordAllTeamNo': ['all', 'team', 'no'],
'recordAllOwnNo': ['all', 'own', 'no'],
'recordAllNo': ['all', 'no']
'recordAllNo': ['all', 'no'],
'record': ['all', 'team', 'own', 'no'],
},
data: function () {

View File

@@ -17,49 +17,58 @@
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
************************************************************************/
Espo.define('Views.Settings.Fields.CurrencyRates', 'Views.Fields.Base', function (Dep) {
************************************************************************/
Espo.define('views/settings/fields/currency-rates', 'views/fields/base', function (Dep) {
return Dep.extend({
editTemplate: 'settings.fields.currency-rates.edit',
editTemplate: 'settings/fields/currency-rates/edit',
data: function () {
var baseCurrency = this.model.get('baseCurrency');
var currencyRates = this.model.get('currencyRates') || {};
var rateValues = {};
this.model.get('currencyList').forEach(function (currency) {
if (currency != baseCurrency) {
rateValues[currency] = currencyRates[currency] || 1.00;
}
}, this);
return {
rateValues: rateValues
};
},
setup: function () {
},
fetch: function () {
var data = {};
var currencyRates = {};
var baseCurrency = this.model.get('baseCurrency');
this.model.get('currencyList').forEach(function (currency) {
var currencyList = this.model.get('currencyList') || [];
currencyList.forEach(function (currency) {
if (currency != baseCurrency) {
currencyRates[currency] = parseFloat(this.$el.find('input[data-currency="'+currency+'"]').val() || 1);
}
}, this);
delete currencyRates[baseCurrency];
for (var c in currencyRates) {
if (!~currencyList.indexOf(c)) {
delete currencyRates[c];
}
}
data[this.name] = currencyRates;
return data;
},
}
});
});

View File

@@ -93,6 +93,8 @@ Espo.define('Views.Site.Navbar', 'View', function (Dep) {
var tabList = this.getPreferences().get('useCustomTabList') ? this.getPreferences().get('tabList') : this.getConfig().get('tabList');
tabList = tabList || [];
this.tabList = tabList.filter(function (scope) {
if (this.getMetadata().get('scopes.' + scope + '.acl')) {
return this.getAcl().check(scope);

View File

@@ -111,7 +111,9 @@ Espo.define('views/stream/list', 'views/record/list-expanded', function (Dep) {
});
},
actionViewRecord: function (data) {
actionViewRecord: function (data, e) {
e.stopPropagation();
var id = data.id;
var scope = data.scope;

Some files were not shown because too many files have changed in this diff Show More