Accueil Contrat en alternance Employé(e) Commercial(e) - Rouen
Une erreur s'est produite lors du traitement du modèle.
The following has evaluated to null or missing:
==> typeAlternance[0]  [in template "21355#21395#CONTRAT-PRO-DETAILS" at line 31, column 18]

----
Tip: It's the final [] step that caused this error, not those before it.
----
Tip: If the failing expression is known to 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: #if typeAlternance[0].getName() == "A...  [in template "21355#21395#CONTRAT-PRO-DETAILS" at line 31, column 13]
----
1<#assign date = dateUtil.parseDate('EEE, dd MMM yyyy HH:mm:ss Z', .vars["reserved-article-display-date"].data, localeUtil.getDefault()) /> 
2<#assign dateDebutPublication = dateUtil.getDate(date, "dd/MM/yyyy",themeDisplay.getLocale(), themeDisplay.getTimeZone()) /> 
3 
4<#assign longGroupId = getterUtil.getLong(groupId) /> 
5<#assign afpaAccountUtil = serviceLocator.findService('fr.afpa.ws.service.AfpaAccountLocalService') /> 
6<#assign journalArticleUtil = serviceLocator.findService('fr.afpa.ws.service.AfpaJournalArticleLocalService') /> 
7<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
8<#assign journalArticleResourceLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService") /> 
9<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") /> 
10<#assign primKey = journalArticleResourceLocalService.getArticleResourcePrimKey(longGroupId, .vars["reserved-article-id"].data) /> 
11<#assign entry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", primKey) /> 
12 
13<#assign images_folder = themeDisplay.getPathThemeImages() /> 
14 
15<#-- Recuperation de l'url courante pour les twitter cards --> 
16<#assign url = portalUtil.getCurrentCompleteURL(httpServletRequest) /> 
17<#assign titleSEO = httpServletRequest.getAttribute("titleSEO") /> 
18 
19<article class="contat-pro-detail container"> 
20 
21    <div class="column-left"> 
22        <#if logo.getData()?has_content > 
23    	    <img id="twitterCardImg"  src="${logo.getData()}" alt="${titre_offre.getData()}" /> 
24    	<#else> 
25    	    &nbsp; 
26    	</#if> 
27	</div> 
28 
29	<div class="column-middle"> 
30		<#assign typeAlternance=journalArticleUtil.getAssetEntryAssetCategoriesByVocabularyAndArticleId(entry.getClassPK(), vocabularyname_TYPE_ALTERNANCE) /> 
31	    <#if typeAlternance[0].getName() == "Apprentissage" > 
32			<span class="edito-title-one"><@liferay.language key="contrat.apprentissage.details.titre"/></span> 
33		<#else> 
34			<span class="edito-title-one"><@liferay.language key="contrat.de.professionnalisation.details.titre"/></span> 
35		</#if> 
36 
37		<#assign titreOffre=titre_offre.getData()/> 
38		<h1 id="twitterCardTitle" class="left-one"> 
39	    	${titreOffre?html} 
40		</h1> 
41 
42		<script> 
43			// On change le titre de la page en JS pour mettre ne pas mettre le titre du contenu BO 
44			jQuery("title").html("${titreOffre?trim?html} ${titleSEO}"); 
45		</script> 
46 
47		<p class="date-publication-contrat"> 
48		    <#-- Recuperation de la categorie "Région" --> 
49		    <#assign regions = journalArticleUtil.getAssetEntryAssetCategoriesByVocabularyAndArticleId(entry.getClassPK(), vocabularyname_REGIONS) /> 
50		    <#if regions?has_content > 
51		    	<strong>${regions[0].getName()}</strong> 
52		    </#if> 
53			<@liferay.language key="contrat.pro.publie.le"/> ${dateDebutPublication} 
54		</p> 
55 
56		<#-- tri du nombre de postes --> 
57		<span class="tag"> 
58		    <#if nombre_postes?has_content > 
59		   		<#assign postes = nombre_postes.getData() /> 
60			    <#if postes?eval == 1 > 
61			    	<strong>${postes}</strong> <@liferay.language key="contrat.pro.nombre.poste"/> 
62			    <#else> 
63			    	<strong>${postes}</strong> <@liferay.language key="contrat.pro.nombre.postes"/> 
64			    </#if> 
65		    </#if> 
66		</span> 
67 
68		<#-- Partager & réseaux sociaux --> 
69		<div class="social-bar"> 
70		    <#assign facebookAppID = propsUtil["facebook.app.id"]/> 
71		    <div id="fb-root"></div> 
72		    <script>( 
73		        function(d, s, id) { 
74		          var js, fjs = d.getElementsByTagName(s)[0]; 
75		          if (d.getElementById(id)) return; 
76		          js = d.createElement(s); js.id = id; 
77		          js.src = "//connect.facebook.net/fr_FR/sdk.js#xfbml=1&appId=${facebookAppID}&version=v2.3"; 
78		          fjs.parentNode.insertBefore(js, fjs); 
79		        }(document, 'script', 'facebook-jssdk')); 
80 
81		        jQuery( document ).ready(function() { 
82		            jQuery("#share-link").on("click",function(event) { 
83		                jQuery("#share-div").toggle(); 
84		                jQuery(this).toggleClass("active"); 
85		            }); 
86		            jQuery("#print-link").on("click",function(event) { 
87		                event.preventDefault(); 
88		                print(); 
89		            }); 
90		            //ajout du tooltip sur le bouton imprimer 
91		    		jQuery('#print-link').tooltipster({ 
92		    			theme: '.tooltip-custom-theme', 
93		    			position: 'top-left' 
94		    		}); 
95		            //ajout du tooltip sur le bouton share 
96		    		jQuery('#share-link').tooltipster({ 
97		    			theme: '.tooltip-custom-theme', 
98		    			position: 'top-left' 
99		    		}); 
100 
101		        }); 
102		    </script> 
103		    <div class="fb-like" data-layout="button_count" data-action="like" data-show-faces="false" data-share="false"></div> 
104 
105		    <a id="print-link" href="javascript:;" title="<@liferay.language key="partage.imprimer.fiche"/>">print</a> 
106		    <a id="share-link" href="javascript:;" title="<@liferay.language key="partage.partager.fiche"/>">share</a> 
107		    <div id="share-div" style="display:none;"> 
108		    	<span class='st_email_large' displayText='Email' st_image="${images_folder}/afpa/pinAfpa.png"></span> 
109		    	<span class='st_facebook_large' displayText='Facebook'></span> 
110		    	<span class='st_twitter_large' displayText='Tweet'></span> 
111		    	<span class='st_linkedin_large' displayText='LinkedIn'></span> 
112		    </div> 
113		</div> 
114		<#-- / Partager & réseaux sociaux --> 
115 
116        <div class="info-article"> 
117			<div class="infosMetiers"> 
118			    <h3 class="bold"><@liferay.language key="contrat.pro.infos.metier"/></h3> 
119				    <#assign secteurs = journalArticleUtil.getAssetEntryAssetCategoriesByVocabularyAndArticleId(entry.getClassPK(), vocabularyname_SECTEUR_ACTIVITE) /> 
120				    <#if secteurs?has_content > 
121				        <p> 
122				            <strong><@liferay.language key="contrat.pro.domaine"/> : </strong> ${secteurs[0].getName()} 
123				        </p> 
124				    </#if> 
125				    <#if date_debut_offre?has_content > 
126				        <p> 
127				            <strong><@liferay.language key="contrat.pro.date.demarrage.en.entreprise"/> : </strong>${date_debut_offre.getData()} 
128				        </p> 
129				    </#if> 
130			</div> 
131			<#if accroche?has_content > 
132			    <div id="twitterCardDescription" class="metier-resume"> 
133			        ${accroche.getData()} 
134			    </div> 
135			</#if> 
136 
137		</div> 
138 
139        <div class="article-content"> 
140			<#if themeDisplay.isSignedIn() > 
141			<#-- Utilisateur connecté --> 
142				<#assign canApply = journalArticleUtil.canUserApplyForContract(themeDisplay.getUserId(), .vars["reserved-article-id"].data) /> 
143				<#if canApply > 
144					<#assign typeProfil = afpaAccountUtil.getTypeProfil(themeDisplay) /> 
145					<#if typeProfil == "particulier" > 
146					<#-- L'utilisateur peut postuler --> 
147						<a href="${propsUtil["afpa.candidature.url"]}?idContratPro=${.vars["reserved-article-id"].data}" class="pink-button"> 
148							<@liferay.language key="contrat.pro.postuler.offre"/> 
149						</a> 
150					</#if> 
151				<#else> 
152				<#-- L'utilisateur ne peut pas postuler --> 
153					<div id="error-same-candidatures-twice" class="bandeau-info" style="display:none;"> 
154						<div class="container"> 
155							<@liferay.language key="fiche.detail.erreur.session.deux.contrat.pro"/> 
156							<a onclick="jQuery('#error-same-candidatures-twice').hide();" class="close"><img src="${images_folder}/afpa/white-cross.svg" alt="close"/></a> 
157						</div> 
158					</div> 
159					<a href="#" onclick="jQuery('#error-same-candidatures-twice').show();" class="pink-button"> 
160						<@liferay.language key="contrat.pro.postuler.offre"/> 
161					</a> 
162				</#if> 
163			<#else> 
164				<#assign urlConnexion = propsUtil.get("afpa.annuaire.connexion.url") + "?service=" + themeDisplay.getPortalURL() + "/contrat-en-alternance/" + .vars['reserved-article-url-title'].data /> 
165                <#-- Utilisateur non connecté --> 
166                <#assign isApprentissage = typeAlternance[0].getName() == "Apprentissage" /> 
167 
168                <script> 
169                    function redirectConnexion() { 
170                        createCookie('urlRedirectConnexion', window.location.href, 1) 
171                        var etat_connexion = Liferay.ThemeDisplay.isSignedIn() ? 'connecte' : 'anonyme'; 
172                        var contratType = "contratpro"; 
173                        <#if isApprentissage > 
174                            contratType = "apprentissage"; 
175                        </#if> 
176 
177						const formationValue = dataLayerManager.courseDataToDataLayer( { 
178							course:{ 
179								parcoursName: 'contratpro', 
180								stepNumber: 1, 
181								subStepNumber: 1, 
182							}, 
183							job : { 
184								name : '${titre_offre.getData()}', 
185								type : contratType, 
186								id : '${reference_legale.getData()}' 
187							}, 
188						}); 
189 
190                        if (typeof sessionStorage !== undefined) { 
191                            sessionStorage.setItem('formationValue', JSON.stringify(formationValue)); 
192                        } else { 
193                            createCookie('formationValue', JSON.stringify(formationValue), 1); 
194                        } 
195                    } 
196                </script> 
197				<a href="${urlConnexion}" class="pink-button" onclick="redirectConnexion()"> 
198					<@liferay.language key="contrat.pro.se.connecter.pour.postuler.offre"/> 
199				</a> 
200			</#if> 
201 
202			<#if les_missions?has_content > 
203				<div class="article-part"> 
204					<h2><@liferay.language key="contrat.pro.les.missions"/></h2> 
205					${les_missions.getData()} 
206				</div> 
207			</#if> 
208 
209			<#if profil_recherche?has_content > 
210				<div class="article-part"> 
211					<h2><@liferay.language key="contrat.pro.le.profil.recherche"/></h2> 
212					${profil_recherche.getData()} 
213				</div> 
214			</#if> 
215 
216			<#if descriptif_offre?has_content > 
217				<div class="article-part"> 
218					<h2><@liferay.language key="contrat.pro.descriptif.offre"/></h2> 
219					${descriptif_offre.getData()} 
220				</div> 
221			</#if> 
222 
223			<#if formation_associee?has_content > 
224				<div> 
225					<h2><@liferay.language key="contrat.pro.formation.associee.title"/></h2> 
226					<p> 
227						<strong><@liferay.language key="contrat.pro.formation.associee"/> : </strong><br/> 
228						${libelle_formation.getData()} 
229					</p> 
230 
231					<#if "code_session.getData()" !="" > 
232						<#if libelle_region?has_content > 
233							<p> 
234								<strong> <@liferay.language key="contrat.pro.formation.associee.region"/> : </strong><br/> ${libelle_region.getData()} 
235							</p> 
236						</#if> 
237 
238						<#if nom_etablissement?has_content > 
239							<p> 
240								<strong><@liferay.language key="contrat.pro.formation.associee.centre.formation"/> :</strong><br/> 
241								${nom_etablissement.getData()} 
242							</p> 
243						</#if> 
244					</#if> 
245				</div> 
246 
247			     <#assign formationArticleId = "FORMATION-" + formation_associee.getData() /> 
248			     <#assign formationArticle = journalArticleLocalService.getLatestArticle(longGroupId, formationArticleId) /> 
249 
250				 <#if formationArticle?has_content > 
251				     <#assign formationPrimKey = journalArticleResourceLocalService.getArticleResourcePrimKey(longGroupId, formationArticleId) /> 
252				     <#assign formationEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", formationPrimKey) /> 
253				     <#assign formationTypes = journalArticleUtil.getAssetEntryAssetCategoriesByVocabularyAndArticleId(formationEntry.getClassPK(), vocabularyname_TYPE_FORMATION) /> 
254 
255					 <#if formationTypes?has_content> 
256						 <#assign formationURL = journalArticleUtil.buildUrlToDisplayFormation(formationTypes[0].getName(), formationArticle.getUrlTitle(), themeDisplay) /> 
257					 <#else> 
258						 <#assign formationURL = '' /> 
259					 </#if> 
260 
261				     <a href="${formationURL}" class="pink-button"><@liferay.language key="contrat.pro.voir.formation.pour.ce.metier"/></a> 
262				 </#if> 
263			 </#if> 
264		</div> 
265	</div> 
266	<div class="column-right"> 
267 		<p class="legend"><@liferay.language key="contrat.pro.details.reference"/> : ${reference_legale.getData()}</p> 
268	</div> 
269</article> 
270 
271<#-- Ajout des twitter card --> 
272<#assign afpa_twitter_titre = ["twitter:title", titreOffre?trim] /> 
273<#assign afpa_twitter_description = ["twitter:description",accroche.getData()?trim] /> 
274 
275<#-- Sur l'url, on retire les elements après afpa_query pour ne pas prendre en compte le sticky --> 
276<#assign index = url?trim?index_of('&afpa_query') /> 
277<#if index != -1 > 
278	<#assign url = url?trim?substring(0, index) /> 
279</#if> 
280<#assign afpa_twitter_url = ["twitter:url",url] /> 
281 
282<#-- Pour le visuel, on a un pattern /image/journal/article?img_id 
283qui est pris en compte par le ContentTransformerListener qui prefix par 
284 (cf. ContentTransformerListener l.169) 
285Du coup, je retire le /image de la variable, pour l'ajouter ensuite --> 
286<#assign image = logo.getData()?trim /> 
287<#if image?has_content > 
288    <#assign index = image?index_of('/image')+6 /> 
289    <#assign image = image?substring(index) /> 
290</#if> 
291 
292<#assign cur_visuel = themeDisplay.getURLPortal() + "/image" + image /> 
293<#assign afpa_twitter_image = ["twitter:image",cur_visuel] /> 
294 
295<#assign afpa_twitter = [afpa_twitter_titre, afpa_twitter_description, afpa_twitter_url, afpa_twitter_image] /> 
296<#assign v = httpServletRequest.getSession().setAttribute("afpa_twitter", afpa_twitter) /> 
297<#assign w = httpServletRequest.getSession().setAttribute("current_visual", cur_visuel) /> 
298 
299<#assign isApprentissage = typeAlternance[0].getName() == "Apprentissage" /> 
300<script> 
301    var etat_connexion = Liferay.ThemeDisplay.isSignedIn() ? 'connecte' : 'anonyme'; 
302 
303    var contratType = "contratpro"; 
304    <#if isApprentissage > 
305        contratType = "apprentissage"; 
306    </#if> 
307 
308	const formationValue = dataLayerManager.courseDataToDataLayer( { 
309		course:{ 
310			parcoursName: 'contratpro', 
311			stepNumber: 0, 
312		}, 
313		job : { 
314			name : '${titre_offre.getData()}', 
315			type : contratType, 
316			id : '${reference_legale.getData()}' 
317		}, 
318	}); 
319 
320    dataLayerManager.addToDataLayer(formationValue); 
321</script>