{"id":2572,"date":"2026-04-17T08:41:18","date_gmt":"2026-04-17T08:41:18","guid":{"rendered":"https:\/\/mdn.gov.mz\/?page_id=2572"},"modified":"2026-04-27T12:19:11","modified_gmt":"2026-04-27T12:19:11","slug":"c-maputo","status":"publish","type":"page","link":"https:\/\/mdn.gov.mz\/index.php\/c-maputo\/","title":{"rendered":"C.Maputo"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"pt\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">\n    <title>CPRM Cidade de Maputo | Editais<\/title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;\n            background: #f0f4f8;\n            color: #1a2c3e;\n            line-height: 1.5;\n            padding: 2rem 1rem;\n        }\n\n        .container {\n            max-width: 1200px;\n            margin: 0 auto;\n        }\n\n        \/* Card institucional *\/\n        .institutional-card {\n            background: linear-gradient(135deg, #0b3b2f 0%, #16634f 100%);\n            color: white;\n            border-radius: 1.5rem;\n            padding: 2rem;\n            margin-bottom: 2rem;\n            text-align: center;\n            box-shadow: 0 8px 20px rgba(0,0,0,0.1);\n        }\n\n        .institutional-card h1 {\n            font-size: 1.6rem;\n            margin-bottom: 1rem;\n        }\n\n        .institutional-card .address {\n            background: rgba(255,255,245,0.15);\n            border-radius: 1rem;\n            padding: 1rem;\n            margin-top: 0.5rem;\n            font-size: 0.95rem;\n            display: inline-block;\n            width: 100%;\n            max-width: 500px;\n        }\n\n        .info-line {\n            margin: 0.3rem 0;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 8px;\n            flex-wrap: wrap;\n        }\n\n        \/* Formul\u00e1rio *\/\n        .form-card {\n            background: white;\n            border-radius: 1.5rem;\n            padding: 1.5rem;\n            margin-bottom: 2rem;\n            box-shadow: 0 4px 12px rgba(0,0,0,0.05);\n            border: 1px solid #e0ede8;\n        }\n\n        .form-card h2 {\n            font-size: 1.3rem;\n            color: #1c6b58;\n            margin-bottom: 1rem;\n            border-left: 4px solid #f5b042;\n            padding-left: 0.8rem;\n        }\n\n        .form-grid {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 1rem;\n            margin-bottom: 1rem;\n        }\n\n        .input-group {\n            flex: 1 1 200px;\n        }\n\n        .input-group label {\n            display: block;\n            font-weight: 600;\n            font-size: 0.75rem;\n            color: #2d6a5c;\n            margin-bottom: 0.3rem;\n        }\n\n        .input-group input {\n            width: 100%;\n            padding: 0.7rem 0.9rem;\n            border: 1px solid #cfdfd9;\n            border-radius: 1rem;\n            font-size: 0.9rem;\n            font-family: inherit;\n        }\n\n        .input-group input:focus {\n            outline: none;\n            border-color: #1c8b73;\n            box-shadow: 0 0 0 2px rgba(28,139,115,0.2);\n        }\n\n        .btn {\n            border: none;\n            padding: 0.7rem 1.5rem;\n            border-radius: 2rem;\n            font-weight: 600;\n            cursor: pointer;\n            font-family: inherit;\n            transition: 0.2s;\n        }\n\n        .btn-primary {\n            background: #1c6b58;\n            color: white;\n        }\n\n        .btn-primary:hover {\n            background: #0f5242;\n            transform: translateY(-1px);\n        }\n\n        .btn-secondary {\n            background: #eef2f0;\n            color: #2c5a4d;\n            border: 1px solid #cde0d9;\n        }\n\n        \/* Listagens *\/\n        .section {\n            background: white;\n            border-radius: 1.5rem;\n            padding: 1.5rem;\n            margin-bottom: 2rem;\n            box-shadow: 0 4px 12px rgba(0,0,0,0.05);\n        }\n\n        .section h2 {\n            font-size: 1.2rem;\n            margin-bottom: 1rem;\n            color: #1a4a3f;\n            display: inline-block;\n            border-bottom: 2px solid #ffcd7e;\n            padding-bottom: 0.2rem;\n        }\n\n        .grid-edicts {\n            display: grid;\n            grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n            gap: 1.2rem;\n            margin-top: 1rem;\n        }\n\n        .edict-card {\n            background: #fefefe;\n            border-radius: 1.2rem;\n            border: 1px solid #e2ede8;\n            padding: 1.2rem;\n            transition: 0.2s;\n        }\n\n        .edict-card:hover {\n            box-shadow: 0 6px 14px rgba(0,0,0,0.08);\n        }\n\n        .edict-title {\n            font-weight: 700;\n            font-size: 1rem;\n            color: #124f42;\n            margin-bottom: 0.6rem;\n        }\n\n        .meta {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 0.5rem;\n            font-size: 0.7rem;\n            margin-bottom: 0.8rem;\n        }\n\n        .badge-date {\n            background: #eff5f2;\n            padding: 0.2rem 0.6rem;\n            border-radius: 30px;\n        }\n\n        .status {\n            font-weight: 600;\n            padding: 0.2rem 0.7rem;\n            border-radius: 30px;\n            font-size: 0.65rem;\n        }\n\n        .status-active {\n            background: #dcfce7;\n            color: #15803d;\n        }\n\n        .status-expired {\n            background: #ffe4e2;\n            color: #b91c1c;\n        }\n\n        .pdf-link {\n            margin: 0.8rem 0;\n        }\n\n        .pdf-link a {\n            background: #f0f6f3;\n            display: inline-flex;\n            align-items: center;\n            gap: 8px;\n            padding: 0.5rem 1rem;\n            border-radius: 2rem;\n            text-decoration: none;\n            font-weight: 500;\n            font-size: 0.8rem;\n            color: #1c6b58;\n            border: 1px solid #cde0d9;\n            width: 100%;\n            justify-content: center;\n        }\n\n        .pdf-link a:hover {\n            background: #1c6b58;\n            color: white;\n        }\n\n        .action-buttons {\n            display: flex;\n            gap: 8px;\n            margin-top: 0.8rem;\n        }\n\n        .btn-small {\n            background: transparent;\n            border: 1px solid #cfdfd9;\n            padding: 0.3rem 0.8rem;\n            border-radius: 2rem;\n            font-size: 0.7rem;\n            cursor: pointer;\n            font-family: inherit;\n        }\n\n        .btn-small:hover {\n            background: #f0f4f2;\n        }\n\n        .empty-message {\n            text-align: center;\n            padding: 2rem;\n            color: #729585;\n            background: #fafefc;\n            border-radius: 1rem;\n            border: 1px dashed #c2dbd1;\n        }\n\n        footer {\n            text-align: center;\n            font-size: 0.7rem;\n            color: #729585;\n            margin-top: 1rem;\n            padding-top: 1rem;\n            border-top: 1px solid #d9e7e1;\n        }\n\n        @media (max-width: 600px) {\n            body {\n                padding: 1rem;\n            }\n            .institutional-card h1 {\n                font-size: 1.2rem;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n<div class=\"container\">\n    <!-- APENAS informa\u00e7\u00e3o solicitada -->\n    <div class=\"institutional-card\">\n        <h1>Centro Provincial de Recrutamento e Mobiliza\u00e7\u00e3o da Cidade de Maputo<\/h1>\n        <div class=\"address\">\n            <div class=\"info-line\">\ud83d\udccd Endere\u00e7o: Avenida Nkame Nkrumah, N\u00b0 1250, Cidade de Maputo<\/div>\n            <div class=\"info-line\">\ud83d\udcde Contacto: +258 21418994<\/div>\n            <div class=\"info-line\">\u2709\ufe0f Email: Cprm.maputocidade@mdn.gov.mz<\/div>\n            <div class=\"info-line\">\ud83d\uddfa\ufe0f Maputo \u2013 Mo\u00e7ambique<\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Campos para inserir documentos (editais) -->\n    <div class=\"form-card\">\n        <h2>\u2795 Inserir novo edital \/ documento<\/h2>\n        <div class=\"form-grid\">\n            <div class=\"input-group\" style=\"flex:2\">\n                <label>T\u00edtulo do documento *<\/label>\n                <input type=\"text\" id=\"docTitulo\" placeholder=\"Ex: Edital de Recrutamento 001\/2025\">\n            <\/div>\n            <div class=\"input-group\" style=\"flex:2\">\n                <label>Link do PDF *<\/label>\n                <input type=\"url\" id=\"docPdfUrl\" placeholder=\"https:\/\/mdn.gov.mz\/index.php\/document\/edital-de-convocacao-provas-classificacao-seleccao_kamavota\/\">\n            <\/div>\n            <div class=\"input-group\">\n                <label>Data de publica\u00e7\u00e3o *<\/label>\n                <input type=\"date\" id=\"dataPub\">\n            <\/div>\n            <div class=\"input-group\">\n                <label>Data de t\u00e9rmino *<\/label>\n                <input type=\"date\" id=\"dataFim\">\n            <\/div>\n        <\/div>\n        <div style=\"display: flex; justify-content: flex-end; gap: 10px;\">\n            <button class=\"btn btn-primary\" id=\"btnAdicionar\">\ud83d\udccc Publicar documento<\/button>\n            <button class=\"btn btn-secondary\" id=\"btnLimparTodos\">\ud83d\uddd1\ufe0f Remover todos<\/button>\n        <\/div>\n        <p style=\"font-size:0.7rem; margin-top:0.8rem; color:#618577;\">\u2714\ufe0f Documentos com data de t\u00e9rmino anterior ao dia atual v\u00e3o automaticamente para o arquivo.<\/p>\n    <\/div>\n\n    <!-- Editais em vigor -->\n    <div class=\"section\">\n        <h2>\ud83d\udcc4 Documentos em vigor<\/h2>\n        <div id=\"activeContainer\" class=\"grid-edicts\">\n            <div class=\"empty-message\">Nenhum documento ativo no momento.<\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Arquivo (documentos encerrados) -->\n    <div class=\"section\">\n        <h2>\ud83d\uddc4\ufe0f Arquivo (documentos encerrados)<\/h2>\n        <div id=\"archivedContainer\" class=\"grid-edicts\">\n            <div class=\"empty-message\">Arquivo vazio.<\/div>\n        <\/div>\n    <\/div>\n\n    <footer>\n        CPRM Cidade de Maputo | Documentos oficiais para download\n    <\/footer>\n<\/div>\n\n<script>\n    \/\/ ====================== STORAGE ======================\n    let documentos = [];\n\n    function carregarDados() {\n        const dados = localStorage.getItem('cprm_maputo_docs');\n        if (dados) {\n            documentos = JSON.parse(dados);\n        } else {\n            \/\/ Exemplo inicial (opcional, mas sem informa\u00e7\u00e3o extra)\n            const hoje = new Date().toISOString().slice(0,10);\n            const futuro = new Date();\n            futuro.setDate(futuro.getDate() + 20);\n            const futuroStr = futuro.toISOString().slice(0,10);\n            const passado = new Date();\n            passado.setDate(passado.getDate() - 5);\n            const passadoStr = passado.toISOString().slice(0,10);\n            documentos = [\n                {\n                    id: \"ex1\",\n                    titulo: \"Edital de Recrutamento Geral 2025 - For\u00e7as Armadas\",\n                    pdfUrl: \"https:\/\/www.w3.org\/WAI\/ER\/tests\/xhtml\/testfiles\/resources\/pdf\/dummy.pdf\",\n                    dataPublicacao: passadoStr,\n                    dataTermino: futuroStr,\n                    createdAt: Date.now()\n                },\n                {\n                    id: \"ex2\",\n                    titulo: \"Servi\u00e7o C\u00edvico - Chamada finda (Arquivo exemplo)\",\n                    pdfUrl: \"https:\/\/www.w3.org\/WAI\/ER\/tests\/xhtml\/testfiles\/resources\/pdf\/dummy.pdf\",\n                    dataPublicacao: \"2025-02-01\",\n                    dataTermino: \"2025-03-10\",\n                    createdAt: Date.now() - 50000\n                }\n            ];\n            salvar();\n        }\n    }\n\n    function salvar() {\n        localStorage.setItem('cprm_maputo_docs', JSON.stringify(documentos));\n    }\n\n    function gerarId() {\n        return Date.now() + '_' + Math.random().toString(36).substr(2, 6);\n    }\n\n    function isAtivo(doc) {\n        const hoje = new Date().toISOString().slice(0,10);\n        return (doc.dataTermino >= hoje && doc.dataPublicacao <= hoje);\n    }\n\n    function getAtivos() {\n        return documentos.filter(d => isAtivo(d));\n    }\n\n    function getArquivados() {\n        return documentos.filter(d => !isAtivo(d));\n    }\n\n    function adicionarDoc(titulo, pdfUrl, dataPub, dataFim) {\n        if (!titulo.trim() || !pdfUrl.trim() || !dataPub || !dataFim) {\n            alert(\"\u274c Preencha todos os campos: T\u00edtulo, Link do PDF, Data de Publica\u00e7\u00e3o e Data de T\u00e9rmino.\");\n            return false;\n        }\n        if (!pdfUrl.startsWith('http:\/\/') && !pdfUrl.startsWith('https:\/\/')) {\n            alert(\"\u26a0\ufe0f O link deve ser uma URL v\u00e1lida (http:\/\/ ou https:\/\/)\");\n            return false;\n        }\n        if (dataFim < dataPub) {\n            alert(\"\u26a0\ufe0f A data de t\u00e9rmino n\u00e3o pode ser anterior \u00e0 data de publica\u00e7\u00e3o.\");\n            return false;\n        }\n        const novo = {\n            id: gerarId(),\n            titulo: titulo.trim(),\n            pdfUrl: pdfUrl.trim(),\n            dataPublicacao: dataPub,\n            dataTermino: dataFim,\n            createdAt: Date.now()\n        };\n        documentos.push(novo);\n        salvar();\n        return true;\n    }\n\n    function removerDoc(id) {\n        if (confirm(\"Excluir permanentemente este documento?\")) {\n            documentos = documentos.filter(d => d.id !== id);\n            salvar();\n            renderizar();\n        }\n    }\n\n    function arquivarManual(id) {\n        const doc = documentos.find(d => d.id === id);\n        if (doc) {\n            const ontem = new Date();\n            ontem.setDate(ontem.getDate() - 1);\n            const ontemStr = ontem.toISOString().slice(0,10);\n            if (doc.dataTermino > ontemStr) {\n                if (confirm(`Encerrar \"${doc.titulo}\" e mover para o arquivo?`)) {\n                    doc.dataTermino = ontemStr;\n                    salvar();\n                    renderizar();\n                }\n            } else {\n                alert(\"Este documento j\u00e1 est\u00e1 arquivado.\");\n            }\n        }\n    }\n\n    function limparTudo() {\n        if (confirm(\"\u26a0\ufe0f ATEN\u00c7\u00c3O: Isto apagar\u00e1 TODOS os documentos (ativos + arquivo). Continuar?\")) {\n            documentos = [];\n            salvar();\n            renderizar();\n        }\n    }\n\n    function formatarDataBR(dataISO) {\n        if (!dataISO) return '';\n        const [ano, mes, dia] = dataISO.split('-');\n        return `${dia}\/${mes}\/${ano}`;\n    }\n\n    function escapeHtml(str) {\n        if (!str) return '';\n        return str.replace(\/[&<>]\/g, function(m) {\n            if (m === '&') return '&amp;';\n            if (m === '<') return '&lt;';\n            if (m === '>') return '&gt;';\n            return m;\n        });\n    }\n\n    function criarCard(doc, tipo) {\n        const dataPub = formatarDataBR(doc.dataPublicacao);\n        const dataFim = formatarDataBR(doc.dataTermino);\n        const statusClass = tipo === 'active' ? 'status-active' : 'status-expired';\n        const statusText = tipo === 'active' ? '\u2705 Em vigor' : '\ud83d\udcc1 Encerrado';\n        const botoes = `\n            <div class=\"action-buttons\">\n                ${tipo === 'active' ? `<button class=\"btn-small\" data-action=\"archive\" data-id=\"${doc.id}\">\ud83d\udcc2 Arquivar agora<\/button>` : ''}\n                <button class=\"btn-small\" data-action=\"delete\" data-id=\"${doc.id}\">\ud83d\uddd1\ufe0f Excluir<\/button>\n            <\/div>\n        `;\n        return `\n            <div class=\"edict-card\">\n                <div class=\"edict-title\">${escapeHtml(doc.titulo)}<\/div>\n                <div class=\"meta\">\n                    <span class=\"badge-date\">\ud83d\udcc6 Publica\u00e7\u00e3o: ${dataPub}<\/span>\n                    <span class=\"badge-date\">\u23f1\ufe0f T\u00e9rmino: ${dataFim}<\/span>\n                    <span class=\"status ${statusClass}\">${statusText}<\/span>\n                <\/div>\n                <div class=\"pdf-link\">\n                    <a href=\"${escapeHtml(doc.pdfUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">\n                        \ud83d\udcc4 Visualizar \/ Baixar PDF\n                    <\/a>\n                <\/div>\n                ${botoes}\n            <\/div>\n        `;\n    }\n\n    function renderizar() {\n        const ativos = getAtivos();\n        const arquivados = getArquivados();\n        const activeDiv = document.getElementById('activeContainer');\n        const archivedDiv = document.getElementById('archivedContainer');\n\n        if (ativos.length === 0) {\n            activeDiv.innerHTML = '<div class=\"empty-message\">\ud83d\udced Nenhum documento em vigor. Utilize o formul\u00e1rio para publicar.<\/div>';\n        } else {\n            activeDiv.innerHTML = ativos.map(doc => criarCard(doc, 'active')).join('');\n        }\n\n        if (arquivados.length === 0) {\n            archivedDiv.innerHTML = '<div class=\"empty-message\">\ud83d\uddc4\ufe0f Arquivo vazio. Documentos expirados aparecer\u00e3o aqui.<\/div>';\n        } else {\n            archivedDiv.innerHTML = arquivados.map(doc => criarCard(doc, 'archived')).join('');\n        }\n\n        \/\/ Bind eventos\n        document.querySelectorAll('[data-action=\"delete\"]').forEach(btn => {\n            btn.addEventListener('click', (e) => {\n                const id = btn.getAttribute('data-id');\n                if (id) removerDoc(id);\n            });\n        });\n        document.querySelectorAll('[data-action=\"archive\"]').forEach(btn => {\n            btn.addEventListener('click', (e) => {\n                const id = btn.getAttribute('data-id');\n                if (id) arquivarManual(id);\n            });\n        });\n    }\n\n    \/\/ ========== INICIALIZA\u00c7\u00c3O ==========\n    document.addEventListener('DOMContentLoaded', () => {\n        carregarDados();\n        renderizar();\n\n        document.getElementById('btnAdicionar').addEventListener('click', () => {\n            const titulo = document.getElementById('docTitulo').value;\n            const pdfUrl = document.getElementById('docPdfUrl').value;\n            const dataPub = document.getElementById('dataPub').value;\n            const dataFim = document.getElementById('dataFim').value;\n            if (adicionarDoc(titulo, pdfUrl, dataPub, dataFim)) {\n                document.getElementById('docTitulo').value = '';\n                document.getElementById('docPdfUrl').value = '';\n                document.getElementById('dataPub').value = '';\n                document.getElementById('dataFim').value = '';\n                renderizar();\n                alert(\"\u2705 Documento publicado com sucesso!\");\n            }\n        });\n\n        document.getElementById('btnLimparTodos').addEventListener('click', () => {\n            limparTudo();\n        });\n\n        \/\/ Atualiza\u00e7\u00e3o autom\u00e1tica a cada 30 segundos (para arquivamento autom\u00e1tico)\n        setInterval(() => {\n            renderizar();\n        }, 30000);\n    });\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>CPRM Cidade de Maputo | Editais Centro Provincial de Recrutamento e Mobiliza\u00e7\u00e3o da Cidade de Maputo \ud83d\udccd Endere\u00e7o: Avenida Nkame Nkrumah, N\u00b0 1250, Cidade de Maputo \ud83d\udcde Contacto: +258 21418994 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2572","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mdn.gov.mz\/index.php\/wp-json\/wp\/v2\/pages\/2572","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mdn.gov.mz\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mdn.gov.mz\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mdn.gov.mz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mdn.gov.mz\/index.php\/wp-json\/wp\/v2\/comments?post=2572"}],"version-history":[{"count":5,"href":"https:\/\/mdn.gov.mz\/index.php\/wp-json\/wp\/v2\/pages\/2572\/revisions"}],"predecessor-version":[{"id":2626,"href":"https:\/\/mdn.gov.mz\/index.php\/wp-json\/wp\/v2\/pages\/2572\/revisions\/2626"}],"wp:attachment":[{"href":"https:\/\/mdn.gov.mz\/index.php\/wp-json\/wp\/v2\/media?parent=2572"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}