Sans surprise, les chiffres montrent que les Français sont particulièrement prudents en matière d’argent. En grand majorité, ils privilégient des solutions sans risque pour leur épargne, et préfèrent souvent d’ailleurs se priver d’opportunité de rendement plutôt que de prendre le risque de perdre. Les épargnants français nous le disent : ils ont plus que jamais besoin d’être accompagnés et guidés dans la gestion de leurs finances pour mieux préparer l’avenir, et la grande majorité d’entre eux préfèrent encore avoir à faire à un conseiller financier plutôt qu’à un robot.

Dans le même temps, l’investissement évolue dans un environnement désormais caractérisé par une réglementation toujours plus stricte, un besoin de transparence et d’information accrue, et une forte pression sur les coûts. Le devoir de conseil devient pour l’agent un prérequis à tout échange avec son client, et nécessite une compréhension parfaite de son profil d’investisseur : ses projets, son appétit au risque, l’horizon de temps de ses investissements, son niveau de richesse mais aussi celui de ses connaissances financières.

AXA IM, votre partenaire dans la construction d’outils digitaux d’allocation d’actifs

Depuis plus de 15 ans, AXA Investment Managers a développé une expertise reconnue en termes de construction d’allocation d’actifs de  long terme et de modèles quantitatifs pour une grande variété d’investisseurs (compagnies du groupe AXA, fonds de pension, assureurs, particuliers…). AXA IM accompagne notamment le Groupe AXA et l’ensemble de ses entités locales dans la définition des profil de risque ainsi que dans la construction et l’amélioration de leurs allocations d’actifs. Cette expertise couvre un large spectre de classes d’actifs avec un niveau de granularité important (actions, taux, « catastrophe bonds », private equity, immobilier…sur différentes zones géographiques et secteurs d’activité). C’est sur ces compétences que nous nous appuyons désormais pour développer des solutions digitales de profilage client et d’allocation d’actifs pour accompagner nos clients en fonction de leurs besoins, de leurs contraintes et de leurs spécificités.

Notre ambition : devenir aussi agile et réactif qu’une « fintech » en termes de développement de solutions digitales. Nous avons donc transformé l’organisation et les méthodes de travail afin d’activer tous les leviers pour une transformation digitale. Pour cela, AXA IM a mis en place un « quant lab » (laboratoire d'ingénierie quantitative en français)  qui regroupe un ensemble de compétences d’ingénierie de portefeuilles, financières et quantitatives. De forts partenariats ont été mis en place avec des équipes de technologie (digitale, architecture et développement) pour instaurer ce mode de travail et développer un « mode agile ». C’est-à-dire être capable de lancer des projets avec des « livrables » rapides et exploitables, tout en s’inscrivant dans une logique et une vision plus large.

visuel « livrables » rapides et exploitables

 

Un savoir-faire reconnu et éprouvé

Notre atout indéniable face aux « fintechs » vient de notre proximité avec les équipes de gestion et les équipes commerciales. Cela permet d’avoir une très bonne compréhension du comportement, de la modélisation et de la calibration des classes d’actifs, un atout fondamental. Cette proximité est source d’une vraie valeur ajoutée pour nous puisque c’est aussi grâce à elle que nous sommes capables d’appréhender l’ensemble des classes d’actifs, notamment les moins liquides.

De la même manière, la relation de longue date que nous entretenons avec nos réseaux de distribution à travers le monde nous a permis d’acquérir une compréhension fine de ce qui détermine le profil d’investisseur d’un épargnant. C’est ainsi que nos experts ont pu développer en interne une méthodologie de notation qui permet d’accompagner le conseiller financier dans la détermination des besoins, des projets, des contraintes et de l’appétit au risque de son client.

Notre ambition : mieux équiper le conseiller pour qu’il puisse proposer une allocation d’actifs optimale à son client. Dans le choix d’une allocation d’actifs ou d’un produit d’investissement, l’âge et l’objectif du projet sont les grands déterminant de la durée de l’investissement. Mais il est également essentiel de comprendre le comportement de l’épargnant, lié à son mode de vie et à son appétit pour le risque. C’est pourquoi notre méthodologie de profilage intègre déjà des éléments de finance comportementale.

visuel méthodologie de profilage

Aujourd’hui, la technologie nous permet d’adresser les besoins et les objectifs des particuliers comme on sait le faire pour les investisseurs institutionnels. En effet, ces outils digitaux soutiennent le conseiller dans sa démarche d’accompagnement patrimonial en étudiant l’actif et le passif de son client, comme on le ferait pour un investisseur institutionnel. Au passif, il détermine les objectifs de l’épargnant, ses contraintes et ses besoins de liquidités.

Une erreur s'est produite lors du traitement du gabarit.
The following has evaluated to null or missing:
==> serviceLocator  [in template "20155#20195#5890918" at line 29, column 47]

----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign journalArticleLocalService = ...  [in template "20155#20195#5890918" at line 29, column 9]
----
1<#-- 
2  ~ Copyright (c) 2018 AXA Shared Services Spain S.A. 
3
4  ~ Licensed under the AXA Shared Services Spain S.A. License (the "License"); you 
5  ~ may not use this file except in compliance with the License. 
6  ~ A copy of the License can be found in the LICENSE.TXT file distributed 
7  ~ together with this file. 
8
9  ~ Unless required by applicable law or agreed to in writing, software 
10  ~ distributed under the License is distributed on an "AS IS" BASIS, 
11  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
12  ~ See the License for the specific language governing permissions and 
13  ~ limitations under the License. 
14  --> 
15 
16<#if entries?has_content> 
17    <#assign size = entries?size> 
18    <#assign navClass = ""> 
19 
20    <#if size  == 2> 
21        <#assign navClass = "two-promotions"> 
22    <#elseif size  == 3> 
23        <#assign navClass = "three-promotions"> 
24    <#elseif size == 4> 
25        <#assign navClass = "four-promotions"> 
26    </#if> 
27 
28    <div class="promotions-nav ${navClass}"> 
29        <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
30        <#assign SAXReader = serviceLocator.findService("com.liferay.portal.kernel.xml.SAXReader") /> 
31        <#assign layoutLocalService = serviceLocator.findService('com.liferay.portal.kernel.service.LayoutLocalService') /> 
32        <#assign fileEntry = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryService') /> 
33        <#assign imageMimeTypes = ["image/bmp", "image/gif", "image/jpeg", "image/png", "image/tiff", "image/x-ms-bmp", "image/x-tiff"] /> 
34        <#list entries as curEntry> 
35        <#-- The navigation-banner must have at most 4 items --> 
36            <#if (curEntry_index >= 4)> 
37                <#break> 
38            </#if> 
39        <#-- Configures the localization of the entry --> 
40            <#assign assetRenderer = curEntry.getAssetRenderer() /> 
41            <#assign className = assetRenderer.getClassName() /> 
42            <#assign has_link = false /> 
43 
44            <#if className == "com.liferay.journal.model.JournalArticle"> 
45                <#assign curArticle = journalArticleLocalService.getLatestArticle(curEntry.getClassPK()) /> 
46                <#assign docArticle = SAXReader.read(curArticle.getContentByLocale(themeDisplay.getLanguageId())) > 
47                <#assign rootDoc = docArticle.getRootElement()> 
48 
49                <#assign availableLocales = rootDoc.attribute("available-locales").getText() /> 
50                <#assign defaultLocale = rootDoc.attribute("default-locale").getText() /> 
51                <#if (availableLocales?contains(locale)) > 
52                    <#assign curLocale = locale /> 
53                <#else> 
54                    <#assign curLocale = defaultLocale /> 
55                </#if> 
56 
57                <#assign promotionPath = "dynamic-element[@name='Promotion']/dynamic-content[@language-id='${curLocale}']" /> 
58                <#assign textPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='Text']/dynamic-content[@language-id='${curLocale}']" /> 
59                <#assign linkTypePath = "dynamic-element[@name='Promotion']/dynamic-element[@name='type_link']/dynamic-content[@language-id='${curLocale}']" /> 
60                <#assign buttonTextPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='ButtonText']/dynamic-content[@language-id='${curLocale}']" /> 
61                <#assign linkToPagePath = "dynamic-element[@name='Promotion']/dynamic-element[@name='link_to_page']/dynamic-content[@language-id='${curLocale}']" /> 
62                <#assign externalLinkPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='link']/dynamic-content[@language-id='${curLocale}']" /> 
63                <#assign internalDocumentLinkPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='link_to_document']/dynamic-content[@language-id='${curLocale}']" /> 
64                <#assign imagePath = "dynamic-element[@name='Promotion']/dynamic-element[@name='Image']/dynamic-content[@language-id='${curLocale}']" /> 
65 
66                <#assign promotionContent = rootDoc.selectSingleNode(promotionPath).getText() /> 
67                <#assign textContent = rootDoc.selectSingleNode(textPath).getText() /> 
68                <#assign buttonTextContent = rootDoc.selectSingleNode(buttonTextPath).getText() /> 
69                <#assign imageContent = rootDoc.selectSingleNode(imagePath).getText() /> 
70 
71            <#-- Button link can be a Link To Page, an External Link or an Internal Document Link --> 
72                <#assign linkUrl = "" /> 
73 
74                <#if rootDoc.selectSingleNode(linkTypePath)?? > 
75                    <#assign linkTypeContent = rootDoc.selectSingleNode(linkTypePath).getText() /> 
76                <#else> 
77                    <#assign linkTypeContent = "" /> 
78                </#if> 
79                <#if rootDoc.selectSingleNode(linkToPagePath)?? > 
80                    <#assign linkToPageContent = rootDoc.selectSingleNode(linkToPagePath).getText() /> 
81                <#else> 
82                    <#assign linkToPageContent = "" /> 
83                </#if> 
84                <#if rootDoc.selectSingleNode(externalLinkPath)?? > 
85                    <#assign externalLinkContent = rootDoc.selectSingleNode(externalLinkPath).getText() /> 
86                <#else> 
87                    <#assign externalLinkContent = "" /> 
88                </#if> 
89                <#if rootDoc.selectSingleNode(internalDocumentLinkPath)?? > 
90                    <#assign internalDocumentLinkContent = rootDoc.selectSingleNode(internalDocumentLinkPath).getText() /> 
91                <#else> 
92                    <#assign internalDocumentLinkContent = "" /> 
93                </#if> 
94 
95            <#-- Background image --> 
96                <#assign backgroundStyle="" /> 
97                <#assign promoClass = "" /> 
98                <#assign isImage = imageContent?has_content && imageContent != ""/> 
99                <#if isImage> 
100                <#-- Checks the if the image field actually contains an image --> 
101                    <#assign parts = imageContent?split("/") /> 
102                    <#assign groupId = parts[2]?number /> 
103                    <#assign uuId = parts[5] /> 
104 
105                    <#if uuId?contains("?") > 
106                        <#assign uuId = uuId?substring(0, parts[5]?index_of("?")) /> 
107                    </#if> 
108 
109                    <#assign file=fileEntry.getFileEntryByUuidAndGroupId(uuId, groupId) /> 
110                    <#assign mimeType = file.getMimeType() /> 
111                    <#assign isImage = imageMimeTypes?seq_contains(mimeType) /> 
112 
113                    <#if isImage > 
114                        <#assign backgroundStyle="background-image: url(${imageContent});" /> 
115                        <#assign promoClass = "promotion-image gh-promo-image-${curEntry_index}" /> 
116                    </#if> 
117                </#if> 
118 
119                <#assign has_page = linkTypeContent == "link_to_page" && linkToPageContent != "" /> 
120                <#assign has_ext = linkTypeContent == "link_extern" && externalLinkContent != "" /> 
121                <#assign has_doc = linkTypeContent == "document_library" && internalDocumentLinkContent != "" /> 
122                <#assign has_link = buttonTextContent?has_content && buttonTextContent!="" && (has_page || has_ext || has_doc) /> 
123            <#--hotfix in order to open any link in the same page, before it was like the commented <#assign target = "BLA BLA" /> below--> 
124                <#assign target = "_self" /> 
125 
126                <#if buttonTextContent != "" && (has_page || has_ext || has_doc)> 
127 
128                    <#if has_page> 
129                    <#-- Retrieves the Link To Page content in the form [layoutId]@[pageType]@[groupId] i.e. "348@public@9246542" --> 
130                        <#assign linkToPageString = rootDoc.selectSingleNode(linkToPagePath).getText() /> 
131                        <#assign linkToPageArray = linkToPageString?split("@") /> 
132 
133                    <#-- Splits the Link To Page content in the three parameters for the getLayout method --> 
134                        <#assign linkToPageGroupId = linkToPageArray[2]?number /> 
135                        <#assign linkToPageIsPrivate = (linkToPageArray[1] == "private") /> 
136                        <#assign linkToPageLayoutId = linkToPageArray[0]?number /> 
137 
138                    <#-- obtains the LinkToPage url depending on the source of the asset (same or different site) --> 
139                        <#attempt > 
140                            <#if curEntry.getGroupId() != themeDisplay.getSiteGroupId() > 
141 
142                            <#-- Gets the Page Friendly URL to be appended to the base URL--> 
143                                <#assign linkToPageLayout = layoutLocalService.getLayout(linkToPageGroupId, linkToPageIsPrivate, linkToPageLayoutId) /> 
144                                <#assign linkToPageFriendlyUrl = linkToPageLayout.getFriendlyURL(locale) /> 
145 
146                            <#-- Base URL in case current URL with Backoffice --> 
147                                <#if currentURL?contains("/web/") > 
148                                    <#assign linkToPageGroup = groupLocalServiceUtil.getGroup(linkToPageGroupId) /> 
149                                    <#assign groupFriendlyUrl = portalUtil.getGroupFriendlyURL(linkToPageGroup, linkToPageIsPrivate, themeDisplay) /> 
150                                    <#assign layoutFriendlyUrl = groupFriendlyUrl + linkToPageFriendlyUrl /> 
151 
152                                <#-- Base URL in case current URL with Virtual Host --> 
153                                <#else> 
154                                    <#assign linkToPageLayoutSet = layoutSetLocalService.getLayoutSet(linkToPageGroupId, linkToPageIsPrivate) /> 
155                                    <#assign linkToPageVirtualHostname = linkToPageLayoutSet.getVirtualHostname() /> 
156 
157                                    <#if request.getProtocol()?contains("HTTPS") > 
158                                        <#assign protocol = "https://" /> 
159                                    <#else> 
160                                        <#assign protocol = "http://" /> 
161                                    </#if> 
162 
163                                    <#assign urlPort = "" /> 
164                                    <#assign serverPort = request.getServerPort() /> 
165 
166                                    <#if serverPort != 80 > 
167                                        <#assign urlPort = ":" + serverPort?string /> 
168                                    </#if> 
169 
170                                    <#assign layoutFriendlyUrl = protocol + linkToPageVirtualHostname + urlPort + linkToPageFriendlyUrl /> 
171                                </#if> 
172                            <#else> 
173                                <#assign linkToPageLayout = layoutLocalService.getLayout(linkToPageGroupId, linkToPageIsPrivate, linkToPageLayoutId) /> 
174                                <#assign layoutFriendlyUrl = portalUtil.getLayoutFriendlyURL(linkToPageLayout, themeDisplay) /> 
175                            </#if> 
176 
177                            <#assign linkUrl = "${layoutFriendlyUrl}" /> 
178 
179                            <#recover> 
180                                <#assign linkUrl = "" /> 
181                                <#assign has_link = false /> 
182                        </#attempt> 
183                    <#elseif has_ext> 
184                        <#assign linkUrl = "${externalLinkContent}" /> 
185                    <#elseif has_doc> 
186                        <#assign linkUrl = "${internalDocumentLinkContent}" /> 
187                    </#if> 
188                </#if> 
189            </#if> 
190 
191            <#-- If the promotions does not have the link configured, the box will be shown --> 
192            <#if has_link > 
193                <a href="${linkUrl}" class="promotion ${promoClass} gh-promotion-item" style="${backgroundStyle}"> 
194            <#else> 
195                <div class="promotion ${promoClass} gh-promotion-item" style="${backgroundStyle}"> 
196            </#if> 
197                    <div class="promotion-100"></div> 
198                    <div class="container"> 
199                        <div class="promotion__content promotion-100"> 
200                            <h2 class="promotion__title gh-promotion-title-${curEntry_index}">${promotionContent}</h2> 
201                            <p class="promotion__abstract gh-promotion-text-${curEntry_index}">${textContent}</p> 
202                        <#if has_link > 
203                            <button class="button danger gh-promotion-button-${curEntry_index}">${buttonTextContent}</button> 
204                        </#if> 
205                        </div> 
206                    </div> 
207            <#if has_link > 
208                </a> 
209            <#else> 
210                </div/ 
211            </#if> 
212        </#list> 
213    </div> 
214</#if> 
Une erreur s'est produite lors du traitement du gabarit.
The following has evaluated to null or missing:
==> serviceLocator  [in template "20155#20195#5890918" at line 29, column 47]

----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign journalArticleLocalService = ...  [in template "20155#20195#5890918" at line 29, column 9]
----
1<#-- 
2  ~ Copyright (c) 2018 AXA Shared Services Spain S.A. 
3
4  ~ Licensed under the AXA Shared Services Spain S.A. License (the "License"); you 
5  ~ may not use this file except in compliance with the License. 
6  ~ A copy of the License can be found in the LICENSE.TXT file distributed 
7  ~ together with this file. 
8
9  ~ Unless required by applicable law or agreed to in writing, software 
10  ~ distributed under the License is distributed on an "AS IS" BASIS, 
11  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
12  ~ See the License for the specific language governing permissions and 
13  ~ limitations under the License. 
14  --> 
15 
16<#if entries?has_content> 
17    <#assign size = entries?size> 
18    <#assign navClass = ""> 
19 
20    <#if size  == 2> 
21        <#assign navClass = "two-promotions"> 
22    <#elseif size  == 3> 
23        <#assign navClass = "three-promotions"> 
24    <#elseif size == 4> 
25        <#assign navClass = "four-promotions"> 
26    </#if> 
27 
28    <div class="promotions-nav ${navClass}"> 
29        <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
30        <#assign SAXReader = serviceLocator.findService("com.liferay.portal.kernel.xml.SAXReader") /> 
31        <#assign layoutLocalService = serviceLocator.findService('com.liferay.portal.kernel.service.LayoutLocalService') /> 
32        <#assign fileEntry = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryService') /> 
33        <#assign imageMimeTypes = ["image/bmp", "image/gif", "image/jpeg", "image/png", "image/tiff", "image/x-ms-bmp", "image/x-tiff"] /> 
34        <#list entries as curEntry> 
35        <#-- The navigation-banner must have at most 4 items --> 
36            <#if (curEntry_index >= 4)> 
37                <#break> 
38            </#if> 
39        <#-- Configures the localization of the entry --> 
40            <#assign assetRenderer = curEntry.getAssetRenderer() /> 
41            <#assign className = assetRenderer.getClassName() /> 
42            <#assign has_link = false /> 
43 
44            <#if className == "com.liferay.journal.model.JournalArticle"> 
45                <#assign curArticle = journalArticleLocalService.getLatestArticle(curEntry.getClassPK()) /> 
46                <#assign docArticle = SAXReader.read(curArticle.getContentByLocale(themeDisplay.getLanguageId())) > 
47                <#assign rootDoc = docArticle.getRootElement()> 
48 
49                <#assign availableLocales = rootDoc.attribute("available-locales").getText() /> 
50                <#assign defaultLocale = rootDoc.attribute("default-locale").getText() /> 
51                <#if (availableLocales?contains(locale)) > 
52                    <#assign curLocale = locale /> 
53                <#else> 
54                    <#assign curLocale = defaultLocale /> 
55                </#if> 
56 
57                <#assign promotionPath = "dynamic-element[@name='Promotion']/dynamic-content[@language-id='${curLocale}']" /> 
58                <#assign textPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='Text']/dynamic-content[@language-id='${curLocale}']" /> 
59                <#assign linkTypePath = "dynamic-element[@name='Promotion']/dynamic-element[@name='type_link']/dynamic-content[@language-id='${curLocale}']" /> 
60                <#assign buttonTextPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='ButtonText']/dynamic-content[@language-id='${curLocale}']" /> 
61                <#assign linkToPagePath = "dynamic-element[@name='Promotion']/dynamic-element[@name='link_to_page']/dynamic-content[@language-id='${curLocale}']" /> 
62                <#assign externalLinkPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='link']/dynamic-content[@language-id='${curLocale}']" /> 
63                <#assign internalDocumentLinkPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='link_to_document']/dynamic-content[@language-id='${curLocale}']" /> 
64                <#assign imagePath = "dynamic-element[@name='Promotion']/dynamic-element[@name='Image']/dynamic-content[@language-id='${curLocale}']" /> 
65 
66                <#assign promotionContent = rootDoc.selectSingleNode(promotionPath).getText() /> 
67                <#assign textContent = rootDoc.selectSingleNode(textPath).getText() /> 
68                <#assign buttonTextContent = rootDoc.selectSingleNode(buttonTextPath).getText() /> 
69                <#assign imageContent = rootDoc.selectSingleNode(imagePath).getText() /> 
70 
71            <#-- Button link can be a Link To Page, an External Link or an Internal Document Link --> 
72                <#assign linkUrl = "" /> 
73 
74                <#if rootDoc.selectSingleNode(linkTypePath)?? > 
75                    <#assign linkTypeContent = rootDoc.selectSingleNode(linkTypePath).getText() /> 
76                <#else> 
77                    <#assign linkTypeContent = "" /> 
78                </#if> 
79                <#if rootDoc.selectSingleNode(linkToPagePath)?? > 
80                    <#assign linkToPageContent = rootDoc.selectSingleNode(linkToPagePath).getText() /> 
81                <#else> 
82                    <#assign linkToPageContent = "" /> 
83                </#if> 
84                <#if rootDoc.selectSingleNode(externalLinkPath)?? > 
85                    <#assign externalLinkContent = rootDoc.selectSingleNode(externalLinkPath).getText() /> 
86                <#else> 
87                    <#assign externalLinkContent = "" /> 
88                </#if> 
89                <#if rootDoc.selectSingleNode(internalDocumentLinkPath)?? > 
90                    <#assign internalDocumentLinkContent = rootDoc.selectSingleNode(internalDocumentLinkPath).getText() /> 
91                <#else> 
92                    <#assign internalDocumentLinkContent = "" /> 
93                </#if> 
94 
95            <#-- Background image --> 
96                <#assign backgroundStyle="" /> 
97                <#assign promoClass = "" /> 
98                <#assign isImage = imageContent?has_content && imageContent != ""/> 
99                <#if isImage> 
100                <#-- Checks the if the image field actually contains an image --> 
101                    <#assign parts = imageContent?split("/") /> 
102                    <#assign groupId = parts[2]?number /> 
103                    <#assign uuId = parts[5] /> 
104 
105                    <#if uuId?contains("?") > 
106                        <#assign uuId = uuId?substring(0, parts[5]?index_of("?")) /> 
107                    </#if> 
108 
109                    <#assign file=fileEntry.getFileEntryByUuidAndGroupId(uuId, groupId) /> 
110                    <#assign mimeType = file.getMimeType() /> 
111                    <#assign isImage = imageMimeTypes?seq_contains(mimeType) /> 
112 
113                    <#if isImage > 
114                        <#assign backgroundStyle="background-image: url(${imageContent});" /> 
115                        <#assign promoClass = "promotion-image gh-promo-image-${curEntry_index}" /> 
116                    </#if> 
117                </#if> 
118 
119                <#assign has_page = linkTypeContent == "link_to_page" && linkToPageContent != "" /> 
120                <#assign has_ext = linkTypeContent == "link_extern" && externalLinkContent != "" /> 
121                <#assign has_doc = linkTypeContent == "document_library" && internalDocumentLinkContent != "" /> 
122                <#assign has_link = buttonTextContent?has_content && buttonTextContent!="" && (has_page || has_ext || has_doc) /> 
123            <#--hotfix in order to open any link in the same page, before it was like the commented <#assign target = "BLA BLA" /> below--> 
124                <#assign target = "_self" /> 
125 
126                <#if buttonTextContent != "" && (has_page || has_ext || has_doc)> 
127 
128                    <#if has_page> 
129                    <#-- Retrieves the Link To Page content in the form [layoutId]@[pageType]@[groupId] i.e. "348@public@9246542" --> 
130                        <#assign linkToPageString = rootDoc.selectSingleNode(linkToPagePath).getText() /> 
131                        <#assign linkToPageArray = linkToPageString?split("@") /> 
132 
133                    <#-- Splits the Link To Page content in the three parameters for the getLayout method --> 
134                        <#assign linkToPageGroupId = linkToPageArray[2]?number /> 
135                        <#assign linkToPageIsPrivate = (linkToPageArray[1] == "private") /> 
136                        <#assign linkToPageLayoutId = linkToPageArray[0]?number /> 
137 
138                    <#-- obtains the LinkToPage url depending on the source of the asset (same or different site) --> 
139                        <#attempt > 
140                            <#if curEntry.getGroupId() != themeDisplay.getSiteGroupId() > 
141 
142                            <#-- Gets the Page Friendly URL to be appended to the base URL--> 
143                                <#assign linkToPageLayout = layoutLocalService.getLayout(linkToPageGroupId, linkToPageIsPrivate, linkToPageLayoutId) /> 
144                                <#assign linkToPageFriendlyUrl = linkToPageLayout.getFriendlyURL(locale) /> 
145 
146                            <#-- Base URL in case current URL with Backoffice --> 
147                                <#if currentURL?contains("/web/") > 
148                                    <#assign linkToPageGroup = groupLocalServiceUtil.getGroup(linkToPageGroupId) /> 
149                                    <#assign groupFriendlyUrl = portalUtil.getGroupFriendlyURL(linkToPageGroup, linkToPageIsPrivate, themeDisplay) /> 
150                                    <#assign layoutFriendlyUrl = groupFriendlyUrl + linkToPageFriendlyUrl /> 
151 
152                                <#-- Base URL in case current URL with Virtual Host --> 
153                                <#else> 
154                                    <#assign linkToPageLayoutSet = layoutSetLocalService.getLayoutSet(linkToPageGroupId, linkToPageIsPrivate) /> 
155                                    <#assign linkToPageVirtualHostname = linkToPageLayoutSet.getVirtualHostname() /> 
156 
157                                    <#if request.getProtocol()?contains("HTTPS") > 
158                                        <#assign protocol = "https://" /> 
159                                    <#else> 
160                                        <#assign protocol = "http://" /> 
161                                    </#if> 
162 
163                                    <#assign urlPort = "" /> 
164                                    <#assign serverPort = request.getServerPort() /> 
165 
166                                    <#if serverPort != 80 > 
167                                        <#assign urlPort = ":" + serverPort?string /> 
168                                    </#if> 
169 
170                                    <#assign layoutFriendlyUrl = protocol + linkToPageVirtualHostname + urlPort + linkToPageFriendlyUrl /> 
171                                </#if> 
172                            <#else> 
173                                <#assign linkToPageLayout = layoutLocalService.getLayout(linkToPageGroupId, linkToPageIsPrivate, linkToPageLayoutId) /> 
174                                <#assign layoutFriendlyUrl = portalUtil.getLayoutFriendlyURL(linkToPageLayout, themeDisplay) /> 
175                            </#if> 
176 
177                            <#assign linkUrl = "${layoutFriendlyUrl}" /> 
178 
179                            <#recover> 
180                                <#assign linkUrl = "" /> 
181                                <#assign has_link = false /> 
182                        </#attempt> 
183                    <#elseif has_ext> 
184                        <#assign linkUrl = "${externalLinkContent}" /> 
185                    <#elseif has_doc> 
186                        <#assign linkUrl = "${internalDocumentLinkContent}" /> 
187                    </#if> 
188                </#if> 
189            </#if> 
190 
191            <#-- If the promotions does not have the link configured, the box will be shown --> 
192            <#if has_link > 
193                <a href="${linkUrl}" class="promotion ${promoClass} gh-promotion-item" style="${backgroundStyle}"> 
194            <#else> 
195                <div class="promotion ${promoClass} gh-promotion-item" style="${backgroundStyle}"> 
196            </#if> 
197                    <div class="promotion-100"></div> 
198                    <div class="container"> 
199                        <div class="promotion__content promotion-100"> 
200                            <h2 class="promotion__title gh-promotion-title-${curEntry_index}">${promotionContent}</h2> 
201                            <p class="promotion__abstract gh-promotion-text-${curEntry_index}">${textContent}</p> 
202                        <#if has_link > 
203                            <button class="button danger gh-promotion-button-${curEntry_index}">${buttonTextContent}</button> 
204                        </#if> 
205                        </div> 
206                    </div> 
207            <#if has_link > 
208                </a> 
209            <#else> 
210                </div/ 
211            </#if> 
212        </#list> 
213    </div> 
214</#if> 
Une erreur s'est produite lors du traitement du gabarit.
The following has evaluated to null or missing:
==> serviceLocator  [in template "20155#20195#5890918" at line 29, column 47]

----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign journalArticleLocalService = ...  [in template "20155#20195#5890918" at line 29, column 9]
----
1<#-- 
2  ~ Copyright (c) 2018 AXA Shared Services Spain S.A. 
3
4  ~ Licensed under the AXA Shared Services Spain S.A. License (the "License"); you 
5  ~ may not use this file except in compliance with the License. 
6  ~ A copy of the License can be found in the LICENSE.TXT file distributed 
7  ~ together with this file. 
8
9  ~ Unless required by applicable law or agreed to in writing, software 
10  ~ distributed under the License is distributed on an "AS IS" BASIS, 
11  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
12  ~ See the License for the specific language governing permissions and 
13  ~ limitations under the License. 
14  --> 
15 
16<#if entries?has_content> 
17    <#assign size = entries?size> 
18    <#assign navClass = ""> 
19 
20    <#if size  == 2> 
21        <#assign navClass = "two-promotions"> 
22    <#elseif size  == 3> 
23        <#assign navClass = "three-promotions"> 
24    <#elseif size == 4> 
25        <#assign navClass = "four-promotions"> 
26    </#if> 
27 
28    <div class="promotions-nav ${navClass}"> 
29        <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
30        <#assign SAXReader = serviceLocator.findService("com.liferay.portal.kernel.xml.SAXReader") /> 
31        <#assign layoutLocalService = serviceLocator.findService('com.liferay.portal.kernel.service.LayoutLocalService') /> 
32        <#assign fileEntry = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryService') /> 
33        <#assign imageMimeTypes = ["image/bmp", "image/gif", "image/jpeg", "image/png", "image/tiff", "image/x-ms-bmp", "image/x-tiff"] /> 
34        <#list entries as curEntry> 
35        <#-- The navigation-banner must have at most 4 items --> 
36            <#if (curEntry_index >= 4)> 
37                <#break> 
38            </#if> 
39        <#-- Configures the localization of the entry --> 
40            <#assign assetRenderer = curEntry.getAssetRenderer() /> 
41            <#assign className = assetRenderer.getClassName() /> 
42            <#assign has_link = false /> 
43 
44            <#if className == "com.liferay.journal.model.JournalArticle"> 
45                <#assign curArticle = journalArticleLocalService.getLatestArticle(curEntry.getClassPK()) /> 
46                <#assign docArticle = SAXReader.read(curArticle.getContentByLocale(themeDisplay.getLanguageId())) > 
47                <#assign rootDoc = docArticle.getRootElement()> 
48 
49                <#assign availableLocales = rootDoc.attribute("available-locales").getText() /> 
50                <#assign defaultLocale = rootDoc.attribute("default-locale").getText() /> 
51                <#if (availableLocales?contains(locale)) > 
52                    <#assign curLocale = locale /> 
53                <#else> 
54                    <#assign curLocale = defaultLocale /> 
55                </#if> 
56 
57                <#assign promotionPath = "dynamic-element[@name='Promotion']/dynamic-content[@language-id='${curLocale}']" /> 
58                <#assign textPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='Text']/dynamic-content[@language-id='${curLocale}']" /> 
59                <#assign linkTypePath = "dynamic-element[@name='Promotion']/dynamic-element[@name='type_link']/dynamic-content[@language-id='${curLocale}']" /> 
60                <#assign buttonTextPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='ButtonText']/dynamic-content[@language-id='${curLocale}']" /> 
61                <#assign linkToPagePath = "dynamic-element[@name='Promotion']/dynamic-element[@name='link_to_page']/dynamic-content[@language-id='${curLocale}']" /> 
62                <#assign externalLinkPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='link']/dynamic-content[@language-id='${curLocale}']" /> 
63                <#assign internalDocumentLinkPath = "dynamic-element[@name='Promotion']/dynamic-element[@name='link_to_document']/dynamic-content[@language-id='${curLocale}']" /> 
64                <#assign imagePath = "dynamic-element[@name='Promotion']/dynamic-element[@name='Image']/dynamic-content[@language-id='${curLocale}']" /> 
65 
66                <#assign promotionContent = rootDoc.selectSingleNode(promotionPath).getText() /> 
67                <#assign textContent = rootDoc.selectSingleNode(textPath).getText() /> 
68                <#assign buttonTextContent = rootDoc.selectSingleNode(buttonTextPath).getText() /> 
69                <#assign imageContent = rootDoc.selectSingleNode(imagePath).getText() /> 
70 
71            <#-- Button link can be a Link To Page, an External Link or an Internal Document Link --> 
72                <#assign linkUrl = "" /> 
73 
74                <#if rootDoc.selectSingleNode(linkTypePath)?? > 
75                    <#assign linkTypeContent = rootDoc.selectSingleNode(linkTypePath).getText() /> 
76                <#else> 
77                    <#assign linkTypeContent = "" /> 
78                </#if> 
79                <#if rootDoc.selectSingleNode(linkToPagePath)?? > 
80                    <#assign linkToPageContent = rootDoc.selectSingleNode(linkToPagePath).getText() /> 
81                <#else> 
82                    <#assign linkToPageContent = "" /> 
83                </#if> 
84                <#if rootDoc.selectSingleNode(externalLinkPath)?? > 
85                    <#assign externalLinkContent = rootDoc.selectSingleNode(externalLinkPath).getText() /> 
86                <#else> 
87                    <#assign externalLinkContent = "" /> 
88                </#if> 
89                <#if rootDoc.selectSingleNode(internalDocumentLinkPath)?? > 
90                    <#assign internalDocumentLinkContent = rootDoc.selectSingleNode(internalDocumentLinkPath).getText() /> 
91                <#else> 
92                    <#assign internalDocumentLinkContent = "" /> 
93                </#if> 
94 
95            <#-- Background image --> 
96                <#assign backgroundStyle="" /> 
97                <#assign promoClass = "" /> 
98                <#assign isImage = imageContent?has_content && imageContent != ""/> 
99                <#if isImage> 
100                <#-- Checks the if the image field actually contains an image --> 
101                    <#assign parts = imageContent?split("/") /> 
102                    <#assign groupId = parts[2]?number /> 
103                    <#assign uuId = parts[5] /> 
104 
105                    <#if uuId?contains("?") > 
106                        <#assign uuId = uuId?substring(0, parts[5]?index_of("?")) /> 
107                    </#if> 
108 
109                    <#assign file=fileEntry.getFileEntryByUuidAndGroupId(uuId, groupId) /> 
110                    <#assign mimeType = file.getMimeType() /> 
111                    <#assign isImage = imageMimeTypes?seq_contains(mimeType) /> 
112 
113                    <#if isImage > 
114                        <#assign backgroundStyle="background-image: url(${imageContent});" /> 
115                        <#assign promoClass = "promotion-image gh-promo-image-${curEntry_index}" /> 
116                    </#if> 
117                </#if> 
118 
119                <#assign has_page = linkTypeContent == "link_to_page" && linkToPageContent != "" /> 
120                <#assign has_ext = linkTypeContent == "link_extern" && externalLinkContent != "" /> 
121                <#assign has_doc = linkTypeContent == "document_library" && internalDocumentLinkContent != "" /> 
122                <#assign has_link = buttonTextContent?has_content && buttonTextContent!="" && (has_page || has_ext || has_doc) /> 
123            <#--hotfix in order to open any link in the same page, before it was like the commented <#assign target = "BLA BLA" /> below--> 
124                <#assign target = "_self" /> 
125 
126                <#if buttonTextContent != "" && (has_page || has_ext || has_doc)> 
127 
128                    <#if has_page> 
129                    <#-- Retrieves the Link To Page content in the form [layoutId]@[pageType]@[groupId] i.e. "348@public@9246542" --> 
130                        <#assign linkToPageString = rootDoc.selectSingleNode(linkToPagePath).getText() /> 
131                        <#assign linkToPageArray = linkToPageString?split("@") /> 
132 
133                    <#-- Splits the Link To Page content in the three parameters for the getLayout method --> 
134                        <#assign linkToPageGroupId = linkToPageArray[2]?number /> 
135                        <#assign linkToPageIsPrivate = (linkToPageArray[1] == "private") /> 
136                        <#assign linkToPageLayoutId = linkToPageArray[0]?number /> 
137 
138                    <#-- obtains the LinkToPage url depending on the source of the asset (same or different site) --> 
139                        <#attempt > 
140                            <#if curEntry.getGroupId() != themeDisplay.getSiteGroupId() > 
141 
142                            <#-- Gets the Page Friendly URL to be appended to the base URL--> 
143                                <#assign linkToPageLayout = layoutLocalService.getLayout(linkToPageGroupId, linkToPageIsPrivate, linkToPageLayoutId) /> 
144                                <#assign linkToPageFriendlyUrl = linkToPageLayout.getFriendlyURL(locale) /> 
145 
146                            <#-- Base URL in case current URL with Backoffice --> 
147                                <#if currentURL?contains("/web/") > 
148                                    <#assign linkToPageGroup = groupLocalServiceUtil.getGroup(linkToPageGroupId) /> 
149                                    <#assign groupFriendlyUrl = portalUtil.getGroupFriendlyURL(linkToPageGroup, linkToPageIsPrivate, themeDisplay) /> 
150                                    <#assign layoutFriendlyUrl = groupFriendlyUrl + linkToPageFriendlyUrl /> 
151 
152                                <#-- Base URL in case current URL with Virtual Host --> 
153                                <#else> 
154                                    <#assign linkToPageLayoutSet = layoutSetLocalService.getLayoutSet(linkToPageGroupId, linkToPageIsPrivate) /> 
155                                    <#assign linkToPageVirtualHostname = linkToPageLayoutSet.getVirtualHostname() /> 
156 
157                                    <#if request.getProtocol()?contains("HTTPS") > 
158                                        <#assign protocol = "https://" /> 
159                                    <#else> 
160                                        <#assign protocol = "http://" /> 
161                                    </#if> 
162 
163                                    <#assign urlPort = "" /> 
164                                    <#assign serverPort = request.getServerPort() /> 
165 
166                                    <#if serverPort != 80 > 
167                                        <#assign urlPort = ":" + serverPort?string /> 
168                                    </#if> 
169 
170                                    <#assign layoutFriendlyUrl = protocol + linkToPageVirtualHostname + urlPort + linkToPageFriendlyUrl /> 
171                                </#if> 
172                            <#else> 
173                                <#assign linkToPageLayout = layoutLocalService.getLayout(linkToPageGroupId, linkToPageIsPrivate, linkToPageLayoutId) /> 
174                                <#assign layoutFriendlyUrl = portalUtil.getLayoutFriendlyURL(linkToPageLayout, themeDisplay) /> 
175                            </#if> 
176 
177                            <#assign linkUrl = "${layoutFriendlyUrl}" /> 
178 
179                            <#recover> 
180                                <#assign linkUrl = "" /> 
181                                <#assign has_link = false /> 
182                        </#attempt> 
183                    <#elseif has_ext> 
184                        <#assign linkUrl = "${externalLinkContent}" /> 
185                    <#elseif has_doc> 
186                        <#assign linkUrl = "${internalDocumentLinkContent}" /> 
187                    </#if> 
188                </#if> 
189            </#if> 
190 
191            <#-- If the promotions does not have the link configured, the box will be shown --> 
192            <#if has_link > 
193                <a href="${linkUrl}" class="promotion ${promoClass} gh-promotion-item" style="${backgroundStyle}"> 
194            <#else> 
195                <div class="promotion ${promoClass} gh-promotion-item" style="${backgroundStyle}"> 
196            </#if> 
197                    <div class="promotion-100"></div> 
198                    <div class="container"> 
199                        <div class="promotion__content promotion-100"> 
200                            <h2 class="promotion__title gh-promotion-title-${curEntry_index}">${promotionContent}</h2> 
201                            <p class="promotion__abstract gh-promotion-text-${curEntry_index}">${textContent}</p> 
202                        <#if has_link > 
203                            <button class="button danger gh-promotion-button-${curEntry_index}">${buttonTextContent}</button> 
204                        </#if> 
205                        </div> 
206                    </div> 
207            <#if has_link > 
208                </a> 
209            <#else> 
210                </div/ 
211            </#if> 
212        </#list> 
213    </div> 
214</#if>