The following has evaluated to null or missing: ==> FrontendService.media.getDMTJsonObject( coverBild.groupId?number, coverBild.uuid, locale ) [in template "252001#252047#252845" at line 128, column 37] ---- 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: dMTJsonObject = FrontendService.media... [in template "252001#252047#252845" at line 128, column 21] ----
1<#-- used @ Veranstaltung-Detailseite Intro
2 used @ Publikation-Detailseite Intro
3-->
4
5<#--
6Web content templates to display teaser on thema detail page
7
8Generic template for detail pages Intro / Teaser element
9-->
10<#--
11Display the current page title
12-->
13<#include "${fullTemplatesPath}/functions/relatedContentUtil.ftl" />
14<#include "${fullTemplatesPath}/macros/debugging.ftl" />
15
16<#include "${fullTemplatesPath}/macros/page-modules/PMIntro.ftl" />
17<#include "${fullTemplatesPath}/macros/atomic-modules/AMPublicationCarousel.ftl" />
18<#include "${fullTemplatesPath}/macros/atomic-modules/AMMetadata.ftl" />
19<#include "${fullTemplatesPath}/macros/atomic-modules/AMDatetime.ftl" />
20
21
22<#--
23 renders the Intro for nearly all Pages
24 TODO: remove Share? (was in the designs, but not anymore?)
25 TODO: check if languageSelect/filter are working (js)
26
27 - portletId
28 - data = {
29 "media": string (src from image),
30 "category": string,
31 "title": string,
32 "author": string,
33 "subheadline": string,
34 "copy": string,
35 "filter": {
36 "id": string,
37 "name": string,
38 "entries": Array<Object> ({key:value}),
39 },
40 "languageSelect": {
41 "id": string,
42 "name": string,
43 "entries": Array<Object> ({key:value}),
44 },
45 "meta": {
46 "pos"; string (top/bottom)
47 "date": string,
48 "hash": string,
49 "info": string, (url)
50 },
51 "share" : {
52 "login": string,
53 "print": string,
54 "mail": string,
55 "multishare": string?? (tbd)
56 }
57 - AMMetadata: macro
58 - position: String ("top") -> defines wether the meta-data should be rendered above or below the intro-content
59 }
60-->
61
62<#assign
63 JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
64
65 ServiceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext()
66 DLAPP = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppLocalService")
67
68 themeDisplay = ServiceContext.getThemeDisplay()
69 editmode = FrontendService.user.isPrivilegedUser(themeDisplay)
70
71 languageId = themeDisplay.getLocale()
72 groupId = themeDisplay.getScopeGroupId()
73 currentUrl = themeDisplay.getURLCurrent()
74
75 layout = themeDisplay.getLayout()
76 layouttpl = layout.getTypeSettingsProperties().getProperty("layout-template-id")
77/>
78
79<#setting locale="${languageId}">
80
81<#-- get article from url -->
82
83<#assign entry = FrontendService.article.getArticleToUrl(currentUrl, groupId?number)! >
84
85
86<#if entry?has_content>
87
88 <#if entry.resourcePrimKey??>
89 <#assign primaryKey = entry.resourcePrimKey?number >
90 <#elseif entry.classPK??>
91 <#assign primaryKey = entry.classPK?number >
92 </#if>
93
94 <#assign
95 jsonString = FrontendService.article.getWebcontent(primaryKey)
96 json = FrontendService.json.parseAsJson(jsonString)
97 availablelanguages = FrontendService.article.getAssetEntryToUrl(primaryKey).getAvailableLanguageIds()
98
99 title = entry.getTitle(languageId)
100 data = {
101 "title": title
102 }
103 />
104 <@debugJsonString jsonString "ADT_KASDE_DYNAMIC_INTRO" />
105
106 <#if hasContent('untertitel', languageId, json)>
107 <#assign data = data + { "subheadline": getValueForLanguage('untertitel', languageId, json, "first") } >
108 </#if>
109
110 <#if hasContent('beschreibung', languageId, json)>
111 <#assign data = data + { "copy": getValueForLanguage('beschreibung', languageId, json, "first") } >
112 </#if>
113
114 <#-- fill meta data -->
115 <#assign meta = {} />
116
117 <#-- PUBLIKATIONEN DETAIL -->
118 <#if layouttpl?contains("LAYOUT_KASDE_PUBLIKATIONEN_DETAIL")>
119
120 <#if hasContent('coverDMTKASDEMEDIUM', languageId, json)>
121 <#assign
122 coverBildString = getValueForLanguage('coverDMTKASDEMEDIUM', languageId, json, "first")
123 />
124
125 <#if coverBildString?has_content>
126 <#assign
127 coverBild = FrontendService.json.parseAsJson(coverBildString)
128 dMTJsonObject = FrontendService.media.getDMTJsonObject( coverBild.groupId?number, coverBild.uuid, locale )
129 linkToDMT = FrontendService.media.getImageURLForAMConfiguration('hd-resolution',coverBild.groupId?number, coverBild.uuid )
130 data = data + { "media": linkToDMT, "meta" : dMTJsonObject }
131 />
132 <#if dMTJsonObject.altText?? >
133 <#assign data = data + {"alt" : dMTJsonObject.altText} />
134 </#if>
135 <#if dMTJsonObject.quelle??>
136 <#assign meta = meta + { "quelle": dMTJsonObject.quelle } />
137 </#if>
138 </#if>
139 <#-- uncomment to display pdf cover as Intro Image
140 <#elseif hasContent('document_pdfDMTBASICDOCUMENT', languageId, json)>
141 <#assign
142 pdfDocument = getValueForLanguage('document_pdfDMTBASICDOCUMENT', languageId, json, "first")
143 fileEntry = FrontendService.media.getFileEntry(pdfDocument.uuid, groupId?number)!/>
144 <#if fileEntry?has_content>
145 <#assign
146 linkToThumbnail = FrontendService.link.getThumbnailSrc(fileEntry , themeDisplay)
147 data = data + { "media": linkToThumbnail }
148 />
149 </#if>
150 -->
151 </#if>
152
153 <#assign
154 meta = meta + { "orderInfo": "true" }
155 verbundJournalArticle = FrontendService.publication.getVerbundToPublikation( entry )!""
156 />
157
158
159
160 <#if hasContent('erscheinungsdatum', languageId, json)>
161 <#assign
162 erscheinungsdatum = getValueForLanguage('erscheinungsdatum', languageId, json, "first")
163 />
164 <#if erscheinungsdatum?has_content >
165 <#assign
166 erscheinungsdatumFormatted = FrontendService.date.getDateFormatLong( erscheinungsdatum, languageId )
167 meta = meta + { "date": erscheinungsdatumFormatted }
168 />
169 </#if>
170 </#if>
171
172 <#if verbundJournalArticle?has_content>
173 <#assign
174 verbundJsonString = FrontendService.article.getWebcontent(verbundJournalArticle.resourcePrimKey)
175 verbundJson = FrontendService.json.parseAsJson(verbundJsonString)
176 laufendenummer = getValueForLanguage('laufendenummer', languageId, verbundJson, "first")
177 coverImg = getValueForLanguage('mediumDMTKASDEMEDIUM', languageId, verbundJson, "first")
178 />
179 <@debugJsonString verbundJsonString "ADT_KASDE_DYNAMIC_INTRO-verbundJournalArticle" />
180 <#assign meta = meta + { "laufendenummer": laufendenummer } >
181
182 <#if coverImg?has_content && coverImg.url?has_content >
183 <#assign meta = meta + { "coverImg": coverImg.url } >
184 </#if>
185 </#if>
186
187
188 <#if meta?has_content>
189 <#assign data = data + {"meta": meta } >
190 </#if>
191
192 </#if>
193 <#-- PUBLIKATIONEN DETAIL END -->
194
195
196 <#-- VERANSTALTUNGEN DETAIL -->
197 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL")>
198 <#assign
199 friendlyUrl = FrontendService.article.getFriendlyUrl(primaryKey, languageId, groupId)!""
200 links = []
201 />
202 <#if availablelanguages?has_content && friendlyUrl?has_content>
203 <#if (availablelanguages?size > 1) >
204 <#list availablelanguages as language>
205 <#assign
206 defaultLanguage = "de_DE"
207 defaultLocale = FrontendService.language.getLocaleByKey(defaultLanguage)
208 linkLocale = (FrontendService.language.getLocaleByKey(language))!defaultLocale
209 langFriendlyUrl = FrontendService.article.getFriendlyUrl(primaryKey, linkLocale, groupId)
210
211 link = {
212 "key": language!defaultLanguage,
213 "value": linkLocale.getDisplayLanguage(languageId),
214 "url": "/c/portal/update_language?p_l_id=" +
215 layout.plid + "&redirect=" + langFriendlyUrl +
216 "&languageId=" + language
217 }
218 />
219 <#if language == languageId>
220 <#assign link = link + { "selected": "true" } >
221 </#if>
222 <#assign links = links + [link]>
223 </#list>
224 <#assign
225 data = data + {
226 "languageSelect": {
227 "id": "languageSelectRedirect",
228 "name": "languageselectRedirect",
229 "entries": links,
230 "label": languageUtil.get(languageId, "diese.veranstaltung.ist.in.weiteren.sprachen.verfuegbar")
231 }
232 }
233 />
234 </#if>
235 </#if>
236 </#if>
237
238 <#if hasContent('erscheinungsdatum', languageId, json)>
239 <#assign
240 startdate = getValueForLanguage('erscheinungsdatum', languageId, json, "first")
241 meta = meta + { "start": startdate?date.iso, "end": "" }
242 />
243 </#if>
244
245 <#if hasContent('startdatum', languageId, json)>
246 <#assign
247 startdate = getValueForLanguage('startdatum', languageId, json, "first")
248 meta = meta + { "start": startdate?date.iso, "end": "" }
249 />
250 </#if>
251
252 <#if hasValue('einfuehrungText', locale, json)>
253 <#assign data = data + { "einfuehrungText" : getValueForLanguage('einfuehrungText', locale, json, "first") } >
254 <#elseif hasValue(FrontendService.article.getFieldNameByReferenceName(primaryKey, 'einfuehrungText'), locale, json, "first")>
255 <#assign data = data + { "einfuehrungText" : getValueForLanguage(FrontendService.article.getFieldNameByReferenceName(primaryKey, 'einfuehrungText'), locale, json, "first") } >
256 </#if>
257
258 <#if hasContent('endedatum', languageId, json)>
259 <#assign
260 enddate = getValueForLanguage('endedatum', languageId, json, "first")
261 meta = meta + { "end": enddate?date.iso }
262 />
263 </#if>
264
265 <#if hasContent('startzeit', languageId, json)>
266 <#assign
267 startzeit = getValueForLanguage('startzeit', languageId, json, "first")
268 />
269 <#if startzeit?has_content >
270 <#assign meta = meta + { "startzeit": startzeit } />
271 </#if>
272 </#if>
273
274 <#if hasContent('endezeit', languageId, json)>
275 <#assign
276 endezeit = getValueForLanguage('endezeit', languageId, json, "first")
277 meta = meta + { "endezeit": endezeit }
278 />
279 </#if>
280
281 <#if hasContent('ortWCSKASDEORT', languageId, json)>
282 <#assign
283 ortWCSKASDEORT = FrontendService.json.parseAsJson(getValueForLanguage('ortWCSKASDEORT', languageId, json, "first"))
284 ortWCSKASDEORTPrimaryKey = ortWCSKASDEORT.classPK?number
285 ortWCSKASDEORTWebContent = FrontendService.article.getWebcontentByPk(ortWCSKASDEORTPrimaryKey)!""
286 />
287 <#if ortWCSKASDEORTWebContent?has_content >
288 <#assign
289 ortWCSKASDEORTTitle = ortWCSKASDEORTWebContent.getTitle(languageId)!""
290 />
291 <#if ortWCSKASDEORTTitle?has_content >
292 <#assign
293 meta = meta + { "ortWCSKASDEORT": ortWCSKASDEORTTitle }
294 />
295 </#if>
296 </#if>
297 </#if>
298
299
300 <#if hasContent('veranstaltungsnummer', languageId, json)>
301 <#assign
302 verauuid = getValueForLanguage('veranstaltungsnummer', languageId, json, "first")
303 meta = meta + { "verauuid": verauuid }
304 />
305 </#if>
306
307
308 <#if (data.meta)?has_content >
309 <#assign meta = data.meta />
310 </#if>
311
312 <#if !(data.media)?has_content && hasContent('mediumDMTKASDEMEDIUM', languageId, json)>
313 <#assign
314 medium = getValueForLanguage('mediumDMTKASDEMEDIUM', languageId, json, "first")
315 mediaData = getRelatedMediaObject(medium, themeDisplay, languageId, FrontendService, "hd-resolution")
316 />
317 <#assign data = data + { "media": mediaData.url , "meta" : mediaData.meta} >
318
319
320 <#if mediaData.meta?? && mediaData.meta.quelle??>
321 <#assign meta = meta + data.meta + { "quelle": mediaData.meta.quelle } />
322 </#if>
323 </#if>
324
325
326 <#if meta?has_content>
327 <#assign data = data + {"meta": meta } >
328 </#if>
329
330 <#-- END fill meta data -->
331
332 <#if hasContentForSequence('autorenWCSKASDEPERSON', languageId, json)>
333 <#assign
334 journalArticles = getValueForLanguageAnsprechpartner('autorenWCSKASDEPERSON', languageId, json)
335 authors = []
336 />
337 <#list journalArticles as articleString>
338 <#assign article = FrontendService.json.parseAsJson(articleString) />
339 <#if article?has_content && article?is_hash && article.classPK??>
340 <#assign articleDereferenced = FrontendService.person.resolveContactInstanceToPerson(article, languageId)!"" />
341 <#if articleDereferenced?has_content >
342 <#assign
343 author = ""
344 articlePrimaryKey = articleDereferenced.classPK?number
345 articleJsonString = FrontendService.article.getWebcontent(articlePrimaryKey)
346 articleJson = FrontendService.json.parseAsJson(articleJsonString)
347 />
348 <@debugJsonString articleJsonString "ADT_KASDE_DYNAMIC_INTRO-autorenWCSKASDEPERSON" />
349 <#if hasValue('anredetitel', languageId, articleJson)>
350 <#assign author = author + getValueForLanguage('anredetitel', languageId, articleJson, " ") + " ">
351 </#if>
352 <#if hasValue('vorname', languageId, articleJson)>
353 <#assign author = author + getValueForLanguage('vorname', languageId, articleJson, " ") + " ">
354 </#if>
355 <#if hasValue('nachname', languageId, articleJson)>
356 <#assign author = author + getValueForLanguage('nachname', languageId, articleJson, " ") + " ">
357 </#if>
358
359 <#attempt>
360 <#assign href = FrontendService.article.getFriendlyUrl(articlePrimaryKey, languageId, groupId)!"#" >
361 <#recover>
362 <#assign href = "#" >
363 </#attempt>
364 <#if href?has_content && href != "#" && href != "/_404">
365 <#assign author = '<a href="' + href + '">' + author?trim + '</a>'>
366 </#if>
367
368 <#assign authors = authors + [author?trim]>
369 </#if>
370 </#if>
371 </#list>
372 <#if authors?has_content>
373 <#assign data = data + { "author": authors?join(", ") } >
374 </#if>
375 </#if>
376
377 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL") >
378 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "VERANSTALTUNGSTYP")! >
379 <#if categories?has_content && categories[0]?has_content >
380 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
381 </#if>
382
383 <#if hasContent('ausgebucht', languageId, json)>
384 <#assign data = data + { "ausgebucht" : getValueForLanguage('ausgebucht', languageId, json, "first") }>
385 </#if>
386
387 <#if hasContent('storniert', languageId, json)>
388 <#assign data = data + { "storniert" : getValueForLanguage('storniert', languageId, json, "first") }>
389 </#if>
390
391 <#elseif layouttpl?contains("LAYOUT_KASDE_PUBLIKATIONEN_DETAIL") >
392 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "PUBLIKATIONSREIHE")! >
393 <#if categories?has_content && categories[0]?has_content >
394 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
395 </#if>
396 <#else>
397 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "THEMA")! >
398 <#if categories?has_content && categories[0]?has_content >
399 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
400 </#if>
401 </#if>
402
403
404 <#assign
405 languages = []
406 />
407
408 <#attempt>
409 <#if json["document_pdfDMTBASICDOCUMENT"]?? >
410 <#if availablelanguages?has_content>
411 <#list availablelanguages as pdf_language>
412 <#assign
413 docRefJson = getValueForLanguage('document_pdfDMTBASICDOCUMENT', pdf_language, json, "first")
414 docRef = FrontendService.json.parseAsJson(docRefJson)
415 />
416 <#if docRef?is_hash && pdf_language != languageId >
417 <#assign
418 lang = FrontendService.language.getLocaleByKey(pdf_language)!""
419 docGroupId = docRef["groupId"]?number
420 docUuid = docRef["uuid"]
421 dMTJsonObject = FrontendService.media.getDMTJsonObject( docGroupId, docUuid, locale )
422 dMTLink = FrontendService.media.getLinkToDMT( dMTJsonObject )
423 />
424 <#if lang?has_content>
425 <#assign
426 languages = languages + [
427 {
428 "key": pdf_language,
429 "value": FrontendService.language.getLocaleByKey(pdf_language).getDisplayLanguage(),
430 "url": dMTLink
431 }]
432 />
433 </#if>
434 </#if>
435 </#list>
436 </#if>
437 </#if>
438 <#recover>
439 </#attempt>
440
441 <#if (languages?size > 0)>
442 <#attempt>
443 <#assign
444 data = data + { "languageSelect": {
445 "id": "languageSelect",
446 "name": "languageselect",
447 "entries": languages,
448 "documents": "",
449 "button": "true"
450 }}
451 />
452 <#recover>
453 </#attempt>
454 </#if>
455
456 <@PMIntro "ADT_KASDE_DYNAMIC_INTRO" data AMMetadata AMDatetime "bottom" />
457 ${FrontendService.article.getEditArticleHtml(primaryKey, themeDisplay)}
458
459 <#if data.meta?has_content>
460 <#if data.meta.laufendenummer?has_content !isACColorScheme() && !isVLCColorScheme() && !isDPMColorScheme()>
461 <div>
462 <div id="publicationVerbundPagination">
463 <@AMPublicationCarousel data.meta.laufendenummer data.meta.date data.meta.coverImg />
464 </div>
465 </div>
466 </#if>
467 </#if>
468
469<#elseif (editmode?? && editmode)>
470 <@errorMessage languageUtil.get(locale, "kein.journalArticle.gefunden") "ADT_KASDE_DYNAMIC_INTRO" layouttpl currentUrl />
471</#if>
Lange Unklarheit im Nachgang der Stichwahl
Die Stichwahl um das Präsidentschaftsamt in Peru am 6. Juni 2021 ist mit ca. 0,25 Prozent Unterschied der Wählerstimmen so knapp ausgefallen, dass das Nationale Wahlgericht 43 Tage brauchte, um das Ergebnis und die Rechtmäßigkeit der Wahl endgültig zu bestätigen.
Nachdem die konservative Kandidatin Keiko Fujimori in der Wahlnacht zunächst vorne lag, holte ihr sozialistischer Konkurrent Pedro Castillo nach Auszählung der Stimmen auf dem Land auf. Zwar erklärte sich Castillo schon in der Woche nach der Wahl zum Präsidenten und erhielt Glückwünsche von seinen sozialistischen Mitstreitern aus weiten Teilen Lateinamerikas. Doch Fujimori zweifelte die Rechtmäßigkeit der Auszählung unter dem Vorwurf systematischer Manipulation an und stellte damit über 200.000 Stimmen in Frage.
Grundlage waren Unregelmäßigkeiten wie gefälschte Unterschriften von Wahlhelfern sowie statistisch fragwürdig hohe Stimmabgaben für Castillo in bestimmen Distrikten. Der Überprüfungsprozess wurde schließlich durch die Partei Fujimoris selbst verzögert, die die zu überprüfenden Akten der Wahlergebnisse nicht fristgerecht beim Wahlgericht eingereicht hatte. Zudem gab es Anschuldigungen, dass das Wahlgericht selbst parteiisch auf der Seite des Sozialisten agiere, in Folge dessen ein konservativer Richter aus Frust seinen Rücktritt erklärte und nachbesetzt werden musste. In weiten Teilen der Bevölkerung haben die Wahlbehörden durch die lange Verzögerung der Bekanntgabe des neuen Präsidenten an Vertrauen verloren. Auf den Straßen der Innenstadt Limas kam es zu Protestmärschen von Anhängern beider Lager.
Nach dem sechswöchigen institutionellen Chaos hat das Wahlgericht alle Beschwerden geprüft und entschieden: die Wahl war rechtmäßig und Pedro Castillo wird das Präsidentenamt übernehmen. Zwar erkennt Fujimori die Entscheidung der Wahlbehörde an, jedoch sprechen sie und ihre Anhänger weiterhin von Wahlbetrug.
Der Überraschungssieger und seine radikale Agenda
Der Sieg des Dorflehrers Pedro Castillo kam trotz des guten Abschneidens in der ersten Runde der Präsidentschaftswahlen überraschend, denn in Peru wird traditionell konservativ gewählt. Der Erfolg des Sozialisten kann auf drei wesentliche Gründe zurückgeführt werden. Erstens, die Frustration der Wählerschaft gegenüber Vertretern des Establishments, die in den Augen vieler Peruaner eher ihre Eigeninteressen als die ihres Volkes vertreten. Die Enttäuschung verstärkte sich durch die politische Krise der letzten Jahre sowie das bislang desaströse Management der Corona-Krise. Zweitens kann das Wahlergebnis als Wunsch weiter Teile der Bevölkerung nach grundlegenden Reformen des Wirtschaftssystems interpretiert werden. Auch hier hatten die schweren Auswirkungen der Pandemie einen entscheidenden Einfluss: neben dem Einbruch der Wirtschaft um elf Prozent im Jahr 2020, stiegen die Preise für Miete, Wasser, Strom, Öl und Gas um durchschnittlich sieben Prozent in den letzten zwölf Monaten. Damit wurde insbesondere die arme Bevölkerung des Landes belastet. Drittens haben sich trotz Zweifel an Castillo viele Wähler nicht dafür mobilisieren lassen, für die umstrittene Kandidatin Fujimori zu stimmen. Gründe hierfür sind hauptsächlich ihre autoritäre Familiengeschichte und ihre Verwicklung in Korruptionsskandale.
Castillo hat im Wahlkampf mit einer radikalen Veränderung des Wirtschaftssystems geworben. Er kündigt an, die Verfassung zu ersetzen, um Bodenschätze und Privateigentum zu verstaatlichen sowie internationale Handelsabkommen außer Kraft zu setzen. Das Verfassungsgericht solle abgeschafft und die Pressfreiheit eingeschränkt werden.[1]
Diese Politikvorhaben sind maßgeblich durch seinen Parteichef Vladimir Cerrón geprägt. Der in Kuba ausgebildete Mediziner orientiert sich am Vorbild Venezuelas und hat seine sozialistischen Bestrebungen schon während des linksgerichteten internationalen Parteientreffens „São Paulo Forum“ in Havana im Jahr 2018 angekündigt: „Fidel [Castro] hat uns gelehrt, dass für eine Utopie zu kämpfen auch bedeutet, sie zu errichten“.[2] 2019 wurde der ehemalige Gouverneur der Region Junín wegen Korruption zu vier Jahren und acht Monaten Freiheitsstrafe auf Bewährung verurteilt, wurde aber frühzeitig entlassen.[3] Auch die aktuelle Kampagne seiner Partei soll durch kriminelle Gruppen finanziert worden sein, z.B. durch ein Netzwerk von staatlichen Mitarbeitern regionaler Behörden, das Verwaltungsposten sowie offizielle Dokumente (z.B. Führerscheine) verkauft haben soll.[4] Diese Vorwürfe, die gerade von der Staatsanwaltschaft untersucht werden, werden auch den neuen Präsidenten begleiten.
Drei Szenarien für die neue Regierung unter Castillo
Damit Castillo seine angekündigten Reformen tatsächlich umsetzen kann, bedarf es einer Verfassungsänderung. Dafür ist laut Artikel 206 der peruanischen Verfassung aber die Zustimmung des Kongresses notwendig.[5] Im konservativ dominierten Kongress ist seine marxistisch-leninistisch orientierte Partei „Perú Libre“ mit 37 der 130 Sitze jedoch weit von einer Mehrheit entfernt, auch wenn eine Koalition mit der Partei „Juntos por el Perú“ mit weiteren fünf Sitzen möglich erscheint.
Auf dieser Basis ergeben sich drei mögliche Szenarien:
- Castillo umgeht den Kongress und initiiert eigenmächtig entgegen der Verfassung eine Volksabstimmung.
- Castillo versucht im Rahmen der rechtlichen Bestimmungen die Verfassung zu ändern. Da er aber nicht über die notwendigen Stimmen im Kongress verfügt, wäre eine Konfrontation mit der Legislative vorprogrammiert.
- Castillo gibt seine radikale Agenda auf und arrangiert sich mit dem Kongress, um gemäßigtere Reformen durchzusetzen.
Szenario 1 („das Extrem“): Aushebelung der demokratischen Institutionen
Castillos Parteichef Cerrón hat schon vor der Wahl klargestellt, dass die Regierung keine Zustimmung vom Kongress benötigen würde, um eine Volksabstimmung für eine neue Verfassung einzuberufen.[6] Statt durch die Zustimmung des Kongresses, soll die Legitimität einer neuen verfassungsgebenden Versammlung direkt durch einen Volksentscheid hergestellt werden. Um diesen einzuberufen, hat die Partei des neuen Präsidenten bereits angekündigt, im großen Maße Unterschriften zu sammeln. Dieser Prozess widerspricht dem Wortlaut des Artikels 206, der die Voraussetzungen für die Einberufung einer neuen verfassungsgebenden Versammlung eindeutig an die Zustimmung des Kongresses knüpft, anstatt an einen Volksentscheid oder eine Volksinitiative.[7]
Aber selbst wenn der Kongress umgangen werden würde, gäbe es weitere „Checks and Balances“: Volksentscheide werden von den Wahlbehörden organisiert, deren Leitungen von der Judikative bestimmt wird und die sich Castillos Vorhaben entgegenstellen könnten; das sich bisher zurückhaltende Militär könnte eingreifen; das Volk könnte sich zu Protesten gegen die Vorhaben des Präsidenten formieren und schlussendlich müsste das Volk einem möglichen Volksentscheid natürlich auch zustimmen.
Wenn es Castillo gegen allen Zweifel gelingen sollte, eine neue verfassungsgebende Versammlung einzuberufen, dann hätte dies schwere Folgen für internationale Investoren, insbesondere im Bergbausektor: bestehende Verträge könnten aufgelöst und Eigentum enteignet werden; erhöhte Abgaben, Lohnkosten und Anschaffungskosten für Technologien könnten die Wirtschaftlichkeit des für Peru wichtigen Wirtschaftssektors in Frage stellen. Mittelfristig würde das Land dann an strategischem Wert für westliche Investoren verlieren. Hier liegt auch ein Einfallstor für eine verstärkte strategische Partnerschaft Perus mit China.
Szenario 2 („business as usual“): Konfrontation zwischen Exekutive und Legislative
In diesem Szenario würde Castillo die Verfassungsordnung zwar einhalten, dem Kongress bezüglich der verweigerten Zustimmung zur Verfassungsänderung aber die Vertrauensfrage stellen und so Neuwahlen provozieren. Laut Artikel 134 der Verfassung darf der Präsident den Kongress auflösen, wenn dieser sich zweimal weigert, dem Kabinett das Vertrauen auszusprechen. Verfassungsrechtlich kann Castillo die notwendige Zustimmung des Kongresses für eine mögliche Verfassungsänderung zwar nicht umgehen. Jedoch könnte er das Zeitfenster bis zur Neuwahl nutzen, um wie im ersten Szenario beschrieben, einen Volksentscheid durchzuführen oder direkt eine verfassungsgebende Versammlung einzuberufen.
Diesem Schritt könnte der Kongress zuvorkommen, indem er mit einer Zwei-Drittel-Mehrheit ein Amtsenthebungsverfahren gegen den Präsidenten einleitet, um die wohl gemäßigtere Vizepräsidentin Dina Boluarte als Staatsoberhaupt einzusetzen (obwohl diese sich auch für eine neue Verfassung ausgesprochen hat).
Dies würde für das Land eine weitere Phase der Konfrontation zwischen Exekutive und Legislative bedeuten, allerdings im Rahmen der gültigen (gleichwohl in dieser Hinsicht mehrmals als dysfunktional angeprangerten) Verfassungsordnung. Somit würde die Instabilität der politischen Institutionen, die das Land seit 2016 prägt, fortgeführt werden. Der Bergbau- und Geschäftssektor würden auf Autopilot weiterlaufen; Investoren wären jedoch weiterhin zurückhaltend.
Szenario 3 („die realpolitische Lösung“): Mäßigung des neuen Präsidenten
Es bestünde auch die Möglichkeit, dass sich Castillo von Vladimir Cerrón und seiner Partei distanziert und sich stattdessen der gemäßigteren Linkspartei „Juntos por el Perú“ und dem linken Flügel anderer Parteien im Kongress (wie „Accion Popular“, „Podemos Perú“ und „Somos Perú“) annähert. Auf diese Art könnten auf demokratischen Wegen und im Rahmen der aktuellen Verfassung Reformen im Bereich Gesundheit und Bildung, die sogar gemäßigte politische Akteure als unerlässlich erachten, durchgeführt werden. Castillo würde allerdings weiterhin auf erhöhte Steuersätze für die Ober- und Mittelschicht, sowie auf einer Überregulierung der Märkte und internationalen Investitionen beharren.
Dieses Szenario wäre mit der Regierung von Ex-Präsident Ollanta Humala (2011-2016) zu vergleichen, der in der vorletzten Präsidentenwahl den Sieg erreichte, indem er von seinem radikalen Diskurs abwich und sich zu einem demokratischen Kompromiss verpflichtete. Unter Humala wurde der staatliche Apparat und die damit verbundene Bürokratie aufgebläht; dennoch wuchs die peruanische Wirtschaft durchschnittlich um fünf Prozent jährlich.
Einschätzung
Castillo eilt sein radikaler Ruf voraus, jedoch ist er politisch ein relativ unbeschriebenes Blatt. Es ist daher nicht abzusehen, ob und wie er seine radikalen Reformvorhaben tatsächlich in die Tat umsetzen wird. Von den drei geschilderten Szenarien ist das zweite („Konfrontation zwischen Exekutive und Legislative“) am wahrscheinlichsten, weil das Volk eine wie im ersten Szenario beschriebene Aushebelung der demokratischen Ordnung kaum zulassen würde, Castillo aber auch kaum Indizien für eine wie im dritten Szenario beschriebene Mäßigung gezeigt hat.
Ein wesentlicher Faktor der Ausrichtung Castillos ist seine Beziehung zu Vladimir Cerrón. Zwar ist Cerróns Rolle in der neuen Regierung weiterhin unklar, er wird aber als enger Berater Castillos starken Einfluss auf den designierten Präsidenten haben. Außerdem ist Castillo auf die Stimmen der Kongressabgeordneten von „Perú Libre“ angewiesen, deren Loyalität sich Cerrón zum großen Teil sicher sein kann. Andererseits hat Castillo auch gemäßigtere Kräfte in seinen Beraterkreis aufgenommen. So hat sich sein wirtschaftspolitischer Chefberater, Pedro Francke, mehrmals für den Erhalt des Wirtschaftssystems Perus ausgesprochen. Es bleibt abzuwarten, ob sich Castillo dieser Forderung anschließt.
Selbst wenn Castillo demokratische Institutionen wie Wahlbehörden, Gerichte und den Presserat unterwandern würde, um den Einfluss der linken Kräfte dauerhaft im Staatssystem zu zementieren, ist es unwahrscheinlich, dass Peru das gleiche Schicksal wie Venezuela oder Kuba widerfährt. So kann Castillo durch die Verstaatlichung des Bergbausektors mittelfristig wesentlich weniger Macht an sich binden, als dies etwa mit der Verstaatlichung des ungleich größeren Ölsektors in Venezuela und des Zuckerrohrsektors in Kuba möglich war.[8] Denn für einen radikalen und dauerhaften Wandel des bestehenden Wirtschaftssystems bedarf es neben ideologischen Anhängern und politischem Kalkül auch langanhaltend hohen Geldflüssen, um wichtige Akteure wie die Sicherheitsbehörden durch Anreize – etwa lukrative Posten und finanzielle Vorteile – an sich zu binden.
Zudem ist nicht klar, wie die Sicherheitsbehörden auf eine mögliche Aushebelung der demokratischen Institutionen reagieren würden. Das Militär hält traditionell Abstand zu politischen Belangen. Nach Experteneinschätzungen positionieren sich die Polizei und der Geheimdienst intern jedoch dezidiert gegen die radikalen Vorhaben Castillos. Sie seien unter Umständen bereit, gegen Verfassungsverletzungen zu intervenieren. In diesem Szenario könnte ein Polizeistreik zu Chaos auf den Straßen der Städte führen, der das Militär nötigt, einzugreifen und den Präsidenten zwingt, die Verantwortung zu übernehmen und schließlich zurückzutreten. Ähnliche Ereignisse konnten in den Nachbarstaaten Ecuador im Jahr 2010 und Bolivien im Jahr 2019, als Reaktion gegen Rafael Correa und Evo Morales, beobachtet werden.
Auch wenn Peru wahrscheinlich nicht vor einem radikalen Umbruch des gesamten politischen und ökonomischen Systems steht, ist zu erwarten, dass die peruanische Wirtschaftsleistung, die Landeswährung sowie Unternehmenswerte weiter an Wert verlieren werden. Wie hoch der Verlust ausfällt wird je nach Szenario unterschiedlich sein. Nach Experteneinschätzungen wäre die Einberufung einer neuen verfassungsgebenden Versammlung, wie sie im ersten Szenario beschrieben wird, besonders schmerzhaft, da die Wirtschaft aufgrund der Unsicherheit im Vergleich zu den anderen Szenarien bis 2026 jährlich bis zu zehn Prozent des Bruttoinlandsproduktes einbüßen würde. Folglich würden auch mehr Peruaner unter die Armutsgrenze fallen.[9]
Fazit
Die Wahl Castillos war ein Ausdruck des Frusts großer Teile der Bevölkerung gegenüber der politischen Klasse und des wirtschaftlichen Systems. Ob die Wahl des Sozialisten zu einer Verbesserung des politischen Systems sowie der Lebensverhältnisse der Peruaner führen wird, ist fraglich. Wie der neue Präsident seine radikalen Reformen umzusetzen vermag, bleibt auch unklar. Je nach Szenario werden die Demokratie und Wirtschaft mehr oder weniger darunter leiden. Eine aufgeheizte politische Stimmung im Kongress und auf den Straßen ist zumindest vorprogrammiert.
--------------------------------------------------------------
[1] Eine genauere Beschreibung der Reformagenda findet sich im Länderbericht vom 7. Juni 2021, https://www.kas.de/de/laenderberichte/detail/-/content/spannendes-kopf-an-kopf-rennen-bei-den-stichwahlen-um-die-praesidentschaft-in-peru (abgerufen am 19. Juli 2021).
[2] https://diariocorreo.pe/politica/vladimir-cerron-foro-de-sao-paulo-fidel-castro-es-un-ejemplo-vivo-en-nuestra-sociedad-peru-libre-pedro-castillo-video-noticia/ (abgerufen am19. Juli 2021).
[3] Das Urteil gegen Cerrón wurde jedoch am 9. Juni aufgehoben. Gegen diese Entscheidung soll Berufung eingelegt werden. https://andina.pe/agencia/noticia-poder-judicial-presentara-recurso-apelacion-caso-cerron-848703.aspx (abgerufen am 19. Juli 2021).
[4] https://gestion.pe/peru/fiscalia-de-junin-revela-que-los-dinamicos-del-centro-habrian-financiado-campana-de-peru-libre-nndc-noticia/ (abgerufen am 19. Juli 2021).
[5] Jede Verfassungsreform muss vom Kongress mit der absoluten Mehrheit der gesetzlichen Anzahl seiner Mitglieder gebilligt und per Referendum ratifiziert werden. Das Referendum kann entfallen, wenn die Zustimmung des Kongresses in zwei aufeinanderfolgenden Jahren mit jeweils mehr als zwei Dritteln der Abgeordneten erreicht wird.
[6] https://twitter.com/VLADIMIR_CERRON/status/1389728839035654144 (abgerufen am 19. Juli 2021).
[7] Cerrón und Castillo stützen sich auf die Artikel 31 und 32 der peruanischen Verfassung. Artikel 31 garantiert das allgemeine Teilnahmerecht der Bürger an politischen und öffentlichen Prozessen durch das Stimmrecht und das Recht, Amtsenthebungsverfahren gegen Funktionäre einzuleiten (usw.). Artikel 32 enthält die besonderen Voraussetzungen und legitimen Gründe für eine Volksabstimmung. Danach dürfen zwar Gesetze durch Volksabstimmungen geändert werden, aber nicht internationale Verträge, die durch die Verfassung garantierten Grundrechte und die Verfassung selbst, es sei denn die Voraussetzungen von Artikel 206 sind erfüllt.
[8] Ein Vergleich zeigt, dass der Anteil des venezolanischen Erdölsektors zur Zeit der Amtsübernehme von Hugo Chavez im Jahr 1999 etwa ein Drittel des venezolanischen BIPs betrug (https://heinonline.org/HOL/LandingPage?handle=hein.journals/energy20&div=25&id=&page, abgerufen am 19. Juli 2021). Im Falle von Kuba betrug der Anteil des Zuckerrohrsektors zur Zeit der Amtsübernahme von Fidel Castro im Jahr 1958 auch etwa 30 Prozent der kubanischen Wirtschaft (https://foresightcuba.com/la-industria-azucarera-cubana/, abgerufen am 19. Juli 2021). In Peru hingegen erbringt der Bergbausektor weniger als zehn Prozent der Wirtschaftsleistung, wenn auch der prozentuale Anteil der Exporte wesentlich höher ist (https://www.bcrp.gob.pe/docs/Publicaciones/Notas-Estudios/2021/nota-de-estudios-21-2021.pdf, abgerufen am 19. Juli 2021).
[9] Martín Tanaka und José Carlos Saavedra, SAE Report. "Procesos políticos en América Latina y lecciones para el Perú", SAE Especial Briefing 27. Mai 2021.
Java method "de.usu.kas.frontend.service.impl.common.KASArticleServiceImpl.getMarginalPublication(long, com.liferay.portal.kernel.theme.ThemeDisplay)" threw an exception when invoked on de.usu.kas.frontend.service.impl.common.KASArticleServiceImpl object "de.usu.kas.frontend.service.impl.common.KASArticleServiceImpl@4eb2785d"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: #local pub = FrontendService.article... [in template "kas-de-theme_SERVLET_CONTEXT_/templates/macros/atomic-modules/AMMarginalLinks.ftl" in macro "AMMarginalArticlePublication" at line 85, column 5] - Reached through: @AMMarginalArticlePublication assetEntry [in template "kas-de-theme_SERVLET_CONTEXT_/templates/macros/atomic-modules/AMMarginalLinks.ftl" in macro "AMMarginalArticle" at line 76, column 9] - Reached through: @AMMarginalArticle entry [in template "kas-de-theme_SERVLET_CONTEXT_/templates/macros/atomic-modules/AMMarginalLinks.ftl" in macro "AMMarginalArticleFilteredList" at line 192, column 9] - Reached through: @AMMarginalArticleFilteredList "WCS_K... [in template "kas-de-theme_SERVLET_CONTEXT_/templates/macros/atomic-modules/AMMarginalLinks.ftl" in macro "AMMarginalLinks" at line 301, column 21] ~ Reached through: #nested [in template "kas-de-theme_SERVLET_CONTEXT_/templates/macros/atomic-modules/AMMarginalLinks.ftl" in macro "AMSegmentWithIcon" at line 184, column 9] ~ Reached through: @AMSegmentWithIcon "#icon-publication... [in template "kas-de-theme_SERVLET_CONTEXT_/templates/macros/atomic-modules/AMMarginalLinks.ftl" in macro "AMMarginalLinks" at line 300, column 17] - Reached through: @AMMarginalLinks data [in template "kas-de-theme_SERVLET_CONTEXT_/templates/macros/page-modules/PMMarginalspalte.ftl" in macro "PMMarginalspalte" at line 786, column 17] - Reached through: @PMMarginalspalte "ADT_KASDE_MARGINAL... [in template "252001#252047#252853" at line 139, column 5] ----
1<#include "${fullTemplatesPath}/functions/relatedContentUtil.ftl" />
2<#include "${fullTemplatesPath}/functions/freemarkerUtil.ftl" />
3<#include "${fullTemplatesPath}/macros/debugging.ftl" />
4<#include "${fullTemplatesPath}/functions/liferayServicesUtil.ftl" />
5
6<#include "${fullTemplatesPath}/macros/page-modules/PMNavigation.ftl" />
7<#include "${fullTemplatesPath}/macros/page-modules/PMMarginalspalte.ftl" />
8<#include "${fullTemplatesPath}/macros/atomic-modules/AMVenue.ftl" />
9<#include "${fullTemplatesPath}/macros/atomic-modules/AMMarginalContent.ftl" />
10<#include "${fullTemplatesPath}/macros/atomic-modules/AMPricing.ftl" />
11<#include "${fullTemplatesPath}/macros/atomic-modules/AMPerson.ftl" />
12<#include "${fullTemplatesPath}/macros/atomic-modules/AMMediaElement.ftl" />
13<#include "${fullTemplatesPath}/macros/atomic-modules/AMDatetime.ftl" />
14<#include "${fullTemplatesPath}/macros/atomic-modules/AMMap.ftl" />
15<#include "${fullTemplatesPath}/macros/atomic-modules/AMMarginalLinks.ftl" />
16<#include "${fullTemplatesPath}/macros/atomic-modules/AMCollapsibleListItem.ftl" />
17
18<#assign
19 JournalArticleLocalService = getJournalArticleLocalService()
20
21
22
23 themeDisplay = getThemeDisplay()
24 languageId = themeDisplay.getLocale()
25 editmode = FrontendService.user.isPrivilegedUser(themeDisplay)
26
27 groupId = themeDisplay.getScopeGroupId()
28 currentUrl = themeDisplay.getURLCurrent()
29
30 layout = themeDisplay.getLayout()
31 layouttpl = layout.getTypeSettingsProperties().getProperty("layout-template-id")
32
33 isMicrosite = FrontendService.site.isMicrosite(groupId)!false
34/>
35
36<#-- Veranstaltungen-Detail, Publikationen-Detail -->
37<#if currentUrl?contains("/-/content") >
38
39 <#assign journalArticle = FrontendService.article.getArticleToUrl(currentUrl, groupId?number)! >
40
41 <#if journalArticle?has_content>
42 <#if journalArticle.resourcePrimKey??>
43 <#assign primaryKey = journalArticle.resourcePrimKey?number >
44 <#elseif journalArticle.classPK??>
45 <#assign primaryKey = journalArticle.classPK?number >
46 </#if>
47
48 <#assign
49 jsonString = FrontendService.article.getWebcontent(primaryKey)
50 json = FrontendService.json.parseAsJson(jsonString)
51 />
52
53
54 <@debugJsonString jsonString "ADT_KASDE_MARGINALSPALTE" />
55
56 <#if hasContent('title', locale, json)>
57 <#assign
58 pageName = ""
59 title = " - " + getValueForLanguage("title", languageId, json, "first")
60 />
61 <#if isMicrosite >
62 <#assign
63 pageGroup = layout.getGroup()
64 pageName = " - " + htmlUtil.escape(pageGroup.getDescriptiveName())
65 />
66 </#if>
67
68 </#if>
69
70 <#assign content = getMarginalContent(json, locale, primaryKey, FrontendService, JournalArticleLocalService, themeDisplay) >
71
72
73 <#if hasContent('ausgebucht', locale, json)>
74 <#assign content = content + { "ausgebucht" : getValueForLanguage('ausgebucht', locale, json, "first") }>
75 </#if>
76
77 <#if hasContent('storniert', locale, json)>
78 <#assign content = content + { "storniert" : getValueForLanguage('storniert', locale, json, "first") }>
79 </#if>
80
81 <#if hasContent('document_pdfDMTBASICDOCUMENT', locale, json)>
82 <#assign
83 pdfDocumentString = getValueForLanguage('document_pdfDMTBASICDOCUMENT', locale, json, "first")
84 pdfDocument = FrontendService.json.parseAsJson(pdfDocumentString)
85 fileEntry = FrontendService.media.getFileEntry(pdfDocument.uuid, pdfDocument.groupId?number)!/>
86 <#if fileEntry?has_content>
87 <#assign
88 linkToThumbnail = FrontendService.link.getThumbnailSrc(fileEntry , themeDisplay)
89 covermedia = getDefaultMediaObject(linkToThumbnail, "pdf cover")
90 covermedia = covermedia + {"hrefSource" : content.pdfBasicDocumentUrl.url }
91 content = content + { "covermedia": covermedia }
92 />
93 </#if>
94 </#if>
95
96 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL")>
97 <#assign calendar = FrontendService.event.createCalendarFile(primaryKey, locale) />
98 <#assign content = content + {"calendar": calendar } />
99 </#if>
100 <#elseif (editmode?? && editmode)>
101 <@errorMessage languageUtil.get(locale, "kein.journalArticle.gefunden") "ADT_KASDE_MARGINALSPALTE" layouttpl />
102 </#if>
103
104<#-- Themen-Detail and others -->
105<#else>
106 <#-- content in marginalspalte -->
107 <#if entries?has_content>
108 <#assign
109 entry = entries?first
110 primaryKey = entry.classPK?number
111
112 jsonString = FrontendService.article.getWebcontent(primaryKey)
113 json = FrontendService.json.parseAsJson(jsonString)
114 />
115 <@debugJsonString jsonString "ADT_KASDE_MARGINALSPALTE" />
116 <@debugJson json "MARGINALSPALTE_CONTENT_JSON" />
117
118 <#assign content = getMarginalContent(json, locale, primaryKey, FrontendService, JournalArticleLocalService, themeDisplay) >
119 <#elseif (editmode?? && editmode)>
120 <@errorMessage languageUtil.get(locale, "es.existieren.keine.entries") "ADT_KASDE_MARGINALSPALTE" layouttpl />
121 </#if>
122</#if>
123
124
125<#if content??>
126 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL")>
127 <#assign type = "veranstaltung" />
128
129 <#elseif layouttpl?contains("LAYOUT_KASDE_PUBLIKATIONEN_DETAIL")>
130 <#assign type = "publikation" />
131 <#elseif layouttpl?contains("LAYOUT_KASDE_THEMEN_DETAIL")>
132 <#assign type = "thema" />
133 <#else>
134 <#assign type = "default" />
135 </#if>
136
137 <#assign content = content + {"type": type } />
138 <@debugJsonString content "ADT_KASDE_MARGINALSPALTE_CONTENT" />
139 <@PMMarginalspalte "ADT_KASDE_MARGINALSPALTE" content AMArticle AMPerson AMVenue AMPricing AMMediaElement AMDatetime AMMap AMMarginalContent AMMarginalLinks/>
140<#elseif (editmode?? && editmode)>
141 <@errorMessage languageUtil.get(locale, "entries.enthalten.keinen.content") "ADT_KASDE_MARGINALSPALTE" layouttpl />
142</#if>