Aviso mensaje mantencion

Se ha producido un error al procesar la plantilla.
The following has evaluated to null or missing:
==> request.getParameter("convenioId")  [in template "61606#61645#1703808" at line 2, column 11]

----
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: valor = request.getParameter("conveni...  [in template "61606#61645#1703808" at line 2, column 3]
----
1<#assign  
2  valor = request.getParameter("convenioId") 
3  instanceId = portletDisplay.getInstanceId() 
4/> 
5 
6<script> 
7// Creamos un objeto para almacenar los datos de alerta específicos de esta instancia 
8window['alertData_${instanceId}'] = { 
9  isLimitedAlert: false, 
10  fechaHoraInicioAlerta: '', 
11  fechaHoraFinAlerta: '' 
12}; 
13</script> 
14 
15<#if Convenio.getSiblings()?has_content> 
16  <#list Convenio.getSiblings() as cur_Convenio> 
17    <#if valor == cur_Convenio.getData()> 
18      <#if getterUtil.getBoolean(cur_Convenio.MostrarPorTiempoLimitado.getData())> 
19        <script> 
20          var alertData = window['alertData_${instanceId}']; 
21          alertData.isLimitedAlert = true; 
22          alertData.fechaHoraInicioAlerta = new Date('${cur_Convenio.FechaYHoraInicio.getData()}'); 
23          alertData.fechaHoraFinAlerta = new Date('${cur_Convenio.FechaYHoraFin.getData()}'); 
24          console.info('isLimitedAlert', alertData.isLimitedAlert); 
25        </script> 
26      </#if> 
27      <div class="d-none" data-convenio-alert="${instanceId}"> 
28        <div class="igt-max-w-max igt-bg-blue-100 igt-mb-4 igt-text-blue-900 igt-text-sm igt-p-4 igt-rounded-xl igt-flex igt-gap-2"> 
29        <span> 
30            <@clay["icon"] symbol="info-panel-open" /> 
31        </span> 
32        ${cur_Convenio.Parrafo.getData()} 
33        </div> 
34      </div> 
35    </#if> 
36  </#list> 
37</#if> 
38 
39<script> 
40 
41(() => { 
42  Liferay.on('allPortletsReady', function() { 
43    const container = document.querySelector('section.ppt-categorias'); 
44    const alerts = Array.from(document.querySelectorAll('[data-convenio-alert]')); 
45    const alert = document.querySelector('[data-convenio-alert=${instanceId}]'); 
46    const alertData = window['alertData_${instanceId}']; 
47 
48    if (container) { 
49      if (alert != null) { 
50        const indice = alerts.findIndex(a => a === alert); 
51        if (indice == 0) { 
52          container.insertBefore(alert, container.firstChild); 
53        } else { 
54          container.append(alert); 
55
56
57
58 
59    if (alert && alert != null) {  
60      const fechaHoraActualAlerta = new Date(); 
61      console.info('isLimitedAlert', alertData.isLimitedAlert); 
62      if (alertData.isLimitedAlert) { 
63        console.info('Alert ok'); 
64        console.info('Hora actual: ', fechaHoraActualAlerta); 
65        console.info('Hora inicio mensaje: ', alertData.fechaHoraInicioAlerta); 
66        console.info('Hora fin mensaje: ', alertData.fechaHoraFinAlerta); 
67        if (fechaHoraActualAlerta >= alertData.fechaHoraInicioAlerta && fechaHoraActualAlerta <= alertData.fechaHoraFinAlerta) { 
68          alert.classList.remove("d-none"); 
69        } else { 
70          alert.classList.add("d-none"); 
71
72      } else { 
73        alert.classList.remove("d-none"); 
74
75
76  }); 
77})(); 
78 
79</script> 
80 
81<style> 
82  .igt-bg-blue-100 { 
83    background-color: #e0e8fa; 
84
85 
86  .igt-text-blue-900 { 
87    color: #4c5a99; 
88
89 
90  .igt-text-sm { 
91    font-size: 0.875rem; 
92    line-height: 1.25rem; 
93
94 
95  .igt-p-4 { 
96    padding: 1rem; 
97
98 
99  .igt-rounded-xl { 
100    border-radius: 0.75rem; 
101
102 
103  .igt-flex { 
104    display: flex; 
105
106 
107  .igt-gap-2 { 
108    gap: 0.5rem; 
109
110   
111  .igt-mb-4 { 
112      margin-bottom: 1rem; 
113
114   
115  .igt-max-w-max { 
116      max-width: max-content; 
117
118</style> 

IGT Pagos de factura