La Oficina de la Cooperación Española en Ecuador, funcionalmente dependiente de la Agencia Española de Cooperación Internacional para el Desarrollo (AECID), fue abierta en la ciudad de Quito en 1987 y desde entonces ha mantenido un profundo compromiso con la mejora de las capacidades de desarrollo del país sirviendo como punto de referencia para la articulación de las actuaciones españolas en materia de cooperación para el desarrollo sostenible, la acción humanitaria y la educación para el desarrollo sostenible y la ciudadanía global.

Contratación profesional de Director Técnico de Zonas Dispersas (Portoviejo)

Apartado del anuncio: OCE Ecuador


Fecha de publicación de la noticia 08/05/2026

Título del anuncio: Contratación profesional de Director Técnico de Zonas Dispersas (Portoviejo)

Órgano convocante o anunciante - GAD Municipal del Cantón Portoviejo

Fecha límite de presentación - 26/05/2026

El GAD Municipal del Cantón Portoviejo, a través de su Unidad de Gerenciamiento del Programa (UGP) de Agua Potable y Alcantarillado, requiere contratar un profesional como Director Técnico de Zonas Dispersas en el marco del “Programa de Agua Potable y Saneamiento Sostenibles para la Población Rural del Cantón Portoviejo, Provincia de Manabí, Ecuador”, financiado con recursos de Latin America Investment Facility (LAIF) de la Unión Europea y gestionado por Agencia Española de Cooperación Internacional para el Desarrollo (AECID).

Contrato: 10 meses, presencial en Portoviejo.

Honorarios: USD 3.400 mensuales + IVA.

Requisitos mínimos:

  • Título en Ingeniería Civil, Hidráulica o afines (deseable maestría).
  • 7 años de experiencia profesional general.
  • 5 años en dirección/coordinación de proyectos de agua potable y/o saneamiento (preferible con cooperación internacional).

Forma de postulación:

Entregar CV (formato del anexo adjunto en el enlace) y documentos de respaldo (títulos, certificados, contratos, IESS) de forma física en el Edificio Portoaguas, piso 1, ubicado en las calles Córdova y Chile de la ciudad de Portoviejo o de manera digital a ugp.rural@portoviejo.gob.ec

Fecha límite: 26 de mayo de 2026, 17h00

 


Se ha producido un error al procesar la plantilla.
Failed to "?eval" string with this error:

---begin-message---
Syntax error in ?eval-ed string in line 1, column 57:
Lexical error: encountered "u" (117), after "\"Beneficiaria del proyecto \\".
---end-message---

The failing expression:
==> imgGSJSON?eval  [in template "20096#20122#6710710" at line 47, column 43]

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign imgObj = imgGSJSON?eval  [in template "20096#20122#6710710" at line 47, column 25]
----
1<#assign urlCodec = staticUtil["com.liferay.portal.kernel.util.URLCodec"] /> 
2 
3<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") /> 
4<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
5<#assign journalArticleResourceLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService") /> 
6<#assign publicPath = themeDisplay.getPathFriendlyURLPublic() /> 
7<#assign siteFriendlyURL = themeDisplay.getSiteGroup().getFriendlyURL() /> 
8<#assign currentUrlEncoded = urlCodec.encodeURL(themeDisplay.getURLCurrent()) /> 
9 
10 
11<#if entries?has_content> 
12<div class="contCardsNoticias py-50 py-lg-100"> 
13    <div class="container aecid-content px-3 px-lg-0"> 
14        <h2 class="tit-h4 pb-5 pb-lg-6 txt-medi txt-uppercase">${languageUtil.get(locale, "ultimas.noticias")}</h2> 
15        <div class="col-12 p-0"> 
16            <div class="row justify-content-between carouselNoticiasCards" id="carouselNoticiasCards"> 
17                <#list entries as curEntry> 
18                    <#assign 
19                        curEntry = curEntry 
20                        renderer = curEntry.getAssetRenderer() 
21                        entryTitle = htmlUtil.escape(renderer.getTitle(locale)) 
22                        viewURL = assetPublisherHelper.getAssetViewURL(renderRequest, renderResponse, renderer, curEntry, !stringUtil.equals(assetLinkBehavior, "showFullContent"))/> 
23 
24<#--                    <#assign renderer=curEntry.getAssetRenderer() article=renderer.getArticle() 
25                             articleId=article.getId() journalArticle=renderer.getAssetObject() />--> 
26 
27           			<#assign journalArticle = renderer.getArticle()/> 
28        			<#assign document = saxReaderUtil.read(journalArticle.getContentByLocale(locale.toString())) /> 
29		        	<#assign entryTitle = htmlUtil.escape(renderer.getTitle(locale))/> 
30			        <#assign entryResumen = htmlUtil.escape(renderer.getSummary())/>   
31                    <#assign articleId = journalArticle.getArticleId() /> 
32                    <#assign sitio = curEntry.getGroupId() /> 
33                            
34 
35                    <#assign imgGS = document.valueOf("//dynamic-element[@field-reference='image']/dynamic-content/text()") /> 
36                    <#assign imgUuidGS = "" /> 
37 
38                    <#if imgGS?? && imgGS?trim != "" && imgGS?trim != "{}"> 
39                        <#-- Limpiar el JSON escapado --> 
40                        <#assign imgGSJSON = imgGS?replace("\\u2019", "") /> 
41                        <#assign imgGSJSON = imgGS?replace("\\u00e7", "") /> 
42                        <#assign imgGSJSON = imgGS?replace("\\u00b7", "") /> 
43                        <#assign imgGSJSON = imgGS?replace("\\u2013", "-") /> 
44 
45 
46                        <#-- Evaluar el JSON limpio --> 
47                        <#assign imgObj = imgGSJSON?eval /> 
48 
49                        <#assign imgUuidGS = imgObj.uuid!"" /> 
50 
51                        <#if imgUuidGS?has_content> 
52                            <#assign imgNameGS = imgObj.title!"" /> 
53                            <#assign imgGroupIdGS = imgObj.groupId!"" /> 
54                            <#assign imgAltGS = imgObj.alt!"" /> 
55                        </#if> 
56                    </#if>   
57 
58                    <!-- para obtener la url de la página de detalle con el articulo correspondiente --> 
59                    <#assign site = siteFriendlyURL?replace("/", "")> 
60 
61                    <#if themeDisplay??> 
62                        <#assign siteURL = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() /> 
63                        <#if siteURL?ends_with("/")> 
64                            <#assign siteURL = siteURL[0..siteURL?length - 2]> 
65                        </#if> 
66                    </#if> 
67 
68                    <#assign linkDetalle = "${siteURL}/actualidad/noticias/detalle-noticias?articulo=${articleId}&sitio=${sitio}&redirect=" + currentUrlEncoded /> 
69 
70                    <div class="card cardNoticia parentAssetViewUrl"> 
71 
72                        <div class="h-100 d-flex flex-column justify-content-between"> 
73                            <div class="p-0"> 
74                                <#if imgUuidGS?has_content> 
75                                    <div class="card-noticia-img-container"> 
76                                        <img class="w-100" alt="${imgAltGS}" src="/documents/${imgGroupIdGS}/0/${imgNameGS}/${imgUuidGS}" />   <#--alt="${imgAltGS}"--> 
77                                    </div> 
78                                <#else> 
79                                    <div class="card-noticia-img-container"> 
80                                        <img class="w-100" alt="Logo de Cooperación Española" src="/documents/d/global/noticias-convocatoria" /> 
81                                    </div> 
82                                </#if> 
83                            </div> 
84                             
85                            <div class="d-flex flex-column justify-content-between contText"> 
86                                <div class="p-0"> 
87                                    <#--<#if (title.getData())??>--> 
88                                        <div class="card-text-container"> 
89                                            <p class="px-2 title elipsis-2" tabindex="0"><span class="sr-only">${entryTitle}: </span>${entryTitle}</p> 
90                                        </div> 
91                                    <#--</#if>-->    
92                                </div> 
93 
94                                <div class="row p-0 cajaFechaYenlace px-2 w-100"> 
95                                    <div class="col-6 p-0"> 
96                                        <p class="mb-0" tabindex="0"><span class="sr-only">${languageUtil.get(locale, "fecha.de.la.noticia")}: </span>${dateUtil.getDate(journalArticle.getDisplayDate(), "dd/MM/yyyy", locale)}</p> 
97                                    </div> 
98                                    <div class="col-6 p-0 text-right"> 
99                                        <a class="enlaceNoticia" href="${linkDetalle}" title="Ir a la noticia ${entryTitle}">${languageUtil.get(locale, "leer.mas")}</a> 
100                                    </div> 
101                                </div> 
102                            </div> 
103                        </div> 
104                    </div> 
105                </#list> 
106            </div> 
107        </div> 
108        <div class="text-center mt-6"> 
109            <#--<a class="btn btn-primary" href="${languageUtil.get(locale, "url.sala.de.prensa")}${languageUtil.get(locale, 'url.noticias')}" title="${languageUtil.get(locale, 'ir.a.la.pagina.donde.se.listan.todos.las.noticias')}">Más noticias</a>--> 
110            <a class="btn btn-primary" href="/web${siteFriendlyURL}/actualidad/noticias" title="${languageUtil.get(locale, 'ir.a.la.pagina.donde.se.listan.todos.las.noticias')}">${languageUtil.get(locale, "mas.noticias")}</a> 
111 
112        </div>	 
113    </div> 
114</div> 
115</#if> 
116 
117<script type="text/javascript" data-senna-track="temporary"> 
118	$(document).ready(function () { 
119		$('#carouselNoticiasCards').not('.slick-initialized').slick({ 
120			arrows: false, 
121			dots: false, 
122            slidesToShow: 3, 
123            slidesToScroll: 2, 
124            responsive: [ 
125
126                    breakpoint: 991, 
127                    settings: { 
128                        slidesToShow: 2, 
129                        slidesToScroll: 1, 
130                        infinite: true, 
131                        dots: true 
132
133                }, 
134
135                    breakpoint: 768, 
136                    settings: { 
137                        slidesToShow: 1, 
138                        slidesToScroll: 1, 
139											  dots: true 
140
141
142            ]     
143		}); 
144	}); 
145</script>