{"id":2583,"date":"2026-04-17T09:32:20","date_gmt":"2026-04-17T09:32:20","guid":{"rendered":"https:\/\/mdn.gov.mz\/?page_id=2583"},"modified":"2026-04-17T09:32:26","modified_gmt":"2026-04-17T09:32:26","slug":"cprm-sofala","status":"publish","type":"page","link":"https:\/\/mdn.gov.mz\/index.php\/cprm-sofala\/","title":{"rendered":"CPRM-Sofala"},"content":{"rendered":"\n<!DOCTYPE html>\n<html>\n<head>\n<style>\n:root {\n    --primary-color: #0073aa;\n    --secondary-color: #005a87;\n    --success-color: #46b450;\n    --danger-color: #dc3232;\n    --warning-color: #f0ad4e;\n    --archived-color: #6c757d;\n}\n\n* {\n    margin: 0;\n    padding: 0;\n    box-sizing: border-box;\n}\n\nbody {\n    font-family: 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;\n    background: #f5f5f5;\n}\n\n.container-editais {\n    max-width: 1400px;\n    margin: 0 auto;\n    padding: 20px;\n    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n.header {\n    background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));\n    color: white;\n    padding: 35px 30px;\n    border-radius: 10px 10px 0 0;\n    margin-bottom: 0;\n    text-align: center;\n}\n\n.header h1 {\n    margin: 0;\n    font-size: 36px;\n    font-weight: 600;\n    letter-spacing: -0.5px;\n}\n\n.header p {\n    margin: 12px 0 0;\n    opacity: 0.9;\n    font-size: 16px;\n}\n\n\/* Layout de duas colunas *\/\n.main-wrapper {\n    display: flex;\n    gap: 30px;\n    margin-top: 0;\n    flex-wrap: wrap;\n}\n\n.content-left {\n    flex: 2;\n    min-width: 300px;\n}\n\n.sidebar-right {\n    flex: 1;\n    min-width: 280px;\n}\n\n\/* Se\u00e7\u00e3o institucional *\/\n.institutional-bar {\n    background: #fff;\n    border-bottom: 3px solid var(--primary-color);\n    padding: 20px 30px;\n    margin-bottom: 30px;\n    box-shadow: 0 2px 5px rgba(0,0,0,0.05);\n}\n\n.contact-grid {\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: space-between;\n    align-items: center;\n    gap: 20px;\n}\n\n.contact-item {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n    font-size: 14px;\n    color: #333;\n    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n.contact-label {\n    font-weight: 600;\n    color: var(--primary-color);\n    min-width: 70px;\n}\n\n.contact-value {\n    color: #444;\n}\n\n.contact-value a {\n    color: #333;\n    text-decoration: none;\n    transition: color 0.3s;\n}\n\n.contact-value a:hover {\n    color: var(--primary-color);\n    text-decoration: underline;\n}\n\n.separator {\n    width: 1px;\n    height: 30px;\n    background: #ddd;\n}\n\n\/* Card do Delegado *\/\n.delegado-card {\n    background: white;\n    border-radius: 10px;\n    overflow: hidden;\n    box-shadow: 0 2px 10px rgba(0,0,0,0.08);\n    margin-bottom: 30px;\n    border: 1px solid #e0e0e0;\n    position: sticky;\n    top: 20px;\n}\n\n.delegado-header {\n    background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));\n    color: white;\n    padding: 15px 20px;\n    text-align: center;\n}\n\n.delegado-header h3 {\n    margin: 0;\n    font-size: 18px;\n    font-weight: 600;\n}\n\n.delegado-foto {\n    text-align: center;\n    padding: 25px 20px 15px 20px;\n    background: #fafafa;\n}\n\n.foto-placeholder {\n    width: 200px;\n    height: 200px;\n    margin: 0 auto;\n    border-radius: 10px;\n    background: #e9ecef;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    overflow: hidden;\n    border: 3px solid var(--primary-color);\n    box-shadow: 0 4px 12px rgba(0,0,0,0.1);\n}\n\n.foto-placeholder img {\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n}\n\n.foto-placeholder .no-photo {\n    text-align: center;\n    color: #999;\n    font-size: 48px;\n}\n\n.delegado-info {\n    padding: 20px;\n}\n\n.delegado-nome {\n    font-size: 20px;\n    font-weight: 700;\n    color: var(--primary-color);\n    margin-bottom: 8px;\n    text-align: center;\n}\n\n.delegado-cargo {\n    font-size: 14px;\n    color: #666;\n    text-align: center;\n    margin-bottom: 15px;\n    padding-bottom: 15px;\n    border-bottom: 1px solid #eee;\n}\n\n.delegado-mensagem {\n    font-size: 14px;\n    color: #555;\n    line-height: 1.6;\n    font-style: italic;\n    text-align: center;\n    margin-top: 15px;\n    padding: 15px;\n    background: #f8f9fa;\n    border-radius: 8px;\n}\n\n\/* Se\u00e7\u00e3o de arquivados *\/\n.archived-section {\n    margin-top: 40px;\n    border-top: 2px solid #e0e0e0;\n    padding-top: 20px;\n}\n\n.archived-header {\n    background: #f8f9fa;\n    padding: 15px 20px;\n    border-radius: 8px;\n    cursor: pointer;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    transition: all 0.3s;\n    border: 1px solid #dee2e6;\n}\n\n.archived-header:hover {\n    background: #e9ecef;\n}\n\n.archived-header h3 {\n    color: var(--archived-color);\n    margin: 0;\n    font-size: 18px;\n    display: flex;\n    align-items: center;\n    gap: 10px;\n}\n\n.archived-icon {\n    font-size: 20px;\n    transition: transform 0.3s;\n}\n\n.archived-icon.open {\n    transform: rotate(180deg);\n}\n\n.archived-content {\n    display: none;\n    margin-top: 20px;\n    animation: slideDown 0.3s ease-out;\n}\n\n.archived-content.show {\n    display: block;\n}\n\n.archived-grid {\n    display: grid;\n    gap: 20px;\n}\n\n\/* Cards por distrito *\/\n.distrito-section {\n    margin-bottom: 30px;\n    background: white;\n    border-radius: 10px;\n    overflow: hidden;\n    box-shadow: 0 2px 8px rgba(0,0,0,0.08);\n}\n\n.distrito-header {\n    background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));\n    color: white;\n    padding: 15px 20px;\n    cursor: pointer;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    transition: all 0.3s;\n}\n\n.distrito-header:hover {\n    background: linear-gradient(135deg, var(--secondary-color), var(--primary-dark));\n}\n\n.distrito-header h3 {\n    margin: 0;\n    font-size: 20px;\n    display: flex;\n    align-items: center;\n    gap: 10px;\n}\n\n.distrito-icon {\n    font-size: 20px;\n    transition: transform 0.3s;\n}\n\n.distrito-icon.open {\n    transform: rotate(180deg);\n}\n\n.distrito-content {\n    display: block;\n    padding: 20px;\n    background: #fafafa;\n}\n\n.distrito-content.collapsed {\n    display: none;\n}\n\n.editais-distrito {\n    display: grid;\n    gap: 20px;\n}\n\n.edital-card {\n    background: white;\n    border: 1px solid #e0e0e0;\n    border-radius: 10px;\n    padding: 20px;\n    transition: all 0.3s;\n    position: relative;\n    overflow: hidden;\n    box-shadow: 0 2px 5px rgba(0,0,0,0.05);\n}\n\n.edital-card::before {\n    content: '';\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 5px;\n    height: 100%;\n    background: var(--primary-color);\n    transform: scaleY(0);\n    transition: transform 0.3s;\n}\n\n.edital-card:hover::before {\n    transform: scaleY(1);\n}\n\n.edital-card:hover {\n    transform: translateX(5px);\n    box-shadow: 0 5px 20px rgba(0,0,0,0.1);\n}\n\n.edital-card.archived {\n    opacity: 0.85;\n    background: #fafafa;\n}\n\n.edital-card.archived::before {\n    background: var(--archived-color);\n}\n\n.edital-title {\n    font-size: 18px;\n    font-weight: 600;\n    color: var(--primary-color);\n    margin-bottom: 10px;\n}\n\n.edital-card.archived .edital-title {\n    color: var(--archived-color);\n}\n\n.edital-date {\n    color: #666;\n    font-size: 12px;\n    margin-bottom: 12px;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    flex-wrap: wrap;\n}\n\n.edital-status {\n    display: inline-block;\n    padding: 3px 10px;\n    border-radius: 20px;\n    font-size: 10px;\n    font-weight: 600;\n    margin-left: 8px;\n}\n\n.status-active {\n    background: var(--success-color);\n    color: white;\n}\n\n.status-archived {\n    background: var(--archived-color);\n    color: white;\n}\n\n.download-count {\n    display: inline-flex;\n    align-items: center;\n    gap: 5px;\n    margin-left: 10px;\n    padding: 3px 8px;\n    background: #e9ecef;\n    border-radius: 20px;\n    font-size: 11px;\n    font-weight: normal;\n    color: #495057;\n}\n\n.edital-link {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    background: var(--primary-color);\n    color: white;\n    padding: 8px 16px;\n    text-decoration: none;\n    border-radius: 6px;\n    transition: all 0.3s;\n    font-weight: 500;\n    font-size: 13px;\n    border: none;\n    cursor: pointer;\n}\n\n.edital-link:hover {\n    background: var(--secondary-color);\n    transform: translateY(-2px);\n}\n\n\/* Formul\u00e1rio admin *\/\n.form-overlay {\n    display: none;\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background: rgba(0,0,0,0.5);\n    z-index: 1000;\n}\n\n.form-overlay.show {\n    display: block;\n}\n\n.form-area {\n    background: #f8f9fa;\n    border-radius: 10px;\n    padding: 25px;\n    display: none;\n    position: fixed;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n    width: 90%;\n    max-width: 800px;\n    max-height: 90vh;\n    overflow-y: auto;\n    z-index: 1001;\n    box-shadow: 0 10px 40px rgba(0,0,0,0.2);\n}\n\n.form-area.show {\n    display: block;\n    animation: slideDown 0.3s ease-out;\n}\n\n@keyframes slideDown {\n    from {\n        opacity: 0;\n        transform: translate(-50%, -40%);\n    }\n    to {\n        opacity: 1;\n        transform: translate(-50%, -50%);\n    }\n}\n\n.form-group {\n    margin-bottom: 20px;\n}\n\n.form-group label {\n    display: block;\n    margin-bottom: 8px;\n    font-weight: 600;\n    color: #333;\n    font-size: 14px;\n}\n\n.form-group input, .form-group select, .form-group textarea {\n    width: 100%;\n    padding: 10px;\n    border: 1px solid #ddd;\n    border-radius: 6px;\n    font-size: 14px;\n    font-family: inherit;\n    transition: border-color 0.3s;\n}\n\n.form-group input:focus, .form-group select:focus, .form-group textarea:focus {\n    outline: none;\n    border-color: var(--primary-color);\n    box-shadow: 0 0 0 2px rgba(0,115,170,0.1);\n}\n\n.btn {\n    padding: 10px 20px;\n    border: none;\n    border-radius: 6px;\n    cursor: pointer;\n    font-size: 14px;\n    font-weight: 600;\n    transition: all 0.3s;\n    font-family: inherit;\n}\n\n.btn-primary {\n    background: var(--primary-color);\n    color: white;\n}\n\n.btn-primary:hover {\n    background: var(--secondary-color);\n    transform: translateY(-2px);\n}\n\n.btn-danger {\n    background: var(--danger-color);\n    color: white;\n}\n\n.btn-warning {\n    background: var(--warning-color);\n    color: white;\n}\n\n.admin-badge {\n    position: fixed;\n    bottom: 20px;\n    right: 20px;\n    z-index: 1000;\n}\n\n.admin-toggle {\n    background: var(--primary-color);\n    color: white;\n    border: none;\n    border-radius: 50%;\n    width: 50px;\n    height: 50px;\n    cursor: pointer;\n    font-size: 20px;\n    box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n    transition: all 0.3s;\n}\n\n.admin-toggle:hover {\n    transform: scale(1.1);\n    background: var(--secondary-color);\n}\n\n.info-box {\n    background: #e7f3ff;\n    padding: 15px;\n    border-radius: 8px;\n    margin-bottom: 20px;\n    border-left: 4px solid var(--primary-color);\n}\n\n.stats-box {\n    background: #d4edda;\n    padding: 15px;\n    border-radius: 8px;\n    margin-bottom: 20px;\n    border-left: 4px solid var(--success-color);\n}\n\n.distrito-group {\n    background: #f8f9fa;\n    padding: 15px;\n    border-radius: 8px;\n    margin-bottom: 20px;\n    border: 1px solid #dee2e6;\n}\n\n.distrito-group h4 {\n    color: var(--primary-color);\n    margin-bottom: 15px;\n    padding-bottom: 8px;\n    border-bottom: 2px solid var(--primary-color);\n}\n\n@media (max-width: 992px) {\n    .main-wrapper {\n        flex-direction: column;\n    }\n    \n    .sidebar-right {\n        order: -1;\n    }\n}\n\n@media (max-width: 768px) {\n    .container-editais {\n        padding: 15px;\n    }\n    \n    .header {\n        padding: 25px 20px;\n    }\n    \n    .header h1 {\n        font-size: 24px;\n    }\n    \n    .distrito-header h3 {\n        font-size: 16px;\n    }\n    \n    .institutional-bar {\n        padding: 15px 20px;\n    }\n    \n    .contact-grid {\n        flex-direction: column;\n        align-items: flex-start;\n        gap: 12px;\n    }\n    \n    .separator {\n        display: none;\n    }\n}\n<\/style>\n<\/head>\n<body>\n\n<div class=\"container-editais\">\n    <div class=\"header\">\n        <h1>Centro Provincial de Recrutamento e Mobiliza\u00e7\u00e3o de Sofala <\/h1>\n        <p>Minist\u00e9rio da Defesa Nacional | CPRM \u2013Manica<\/p>\n       \n    <\/div>\n    \n    <div class=\"institutional-bar\">\n        <div class=\"contact-grid\">\n            <div class=\"contact-item\">\n                <span class=\"contact-label\">Endere\u00e7o:<\/span>\n                <span class=\"contact-value\"> Avenida Eduardo Mondlane, N\u00b0 1535, Cidade da Beira <\/span>\n            <\/div>\n            <div class=\"separator\"><\/div>\n            <div class=\"contact-item\">\n                <span class=\"contact-label\">Contacto:<\/span>\n                <span class=\"contact-value\">+258 864668800\/874668800<\/span>\n            <\/div>\n            <div class=\"separator\"><\/div>\n            <div class=\"contact-item\">\n                <span class=\"contact-label\">Email:<\/span>\n                <span class=\"contact-value\"><a href=\"mailto:Cprm.inhambane@mdn.gov.mz\">Cprmsofala.informatica@gmail.com<\/a><\/span>\n<\/div>\n            <div class=\"separator\"><\/div>\n            <div class=\"contact-item\">\n                <span class=\"contact-label\">Localiza\u00e7\u00e3o:<\/span>\n                <span class=\"contact-value\"> Sofala \u2013 Mo\u00e7ambique \n\n<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n    \n    <!-- Layout de duas colunas -->\n    <div class=\"main-wrapper\">\n        <!-- Coluna Esquerda - Editais por Distrito -->\n        <div class=\"content-left\">\n            <h2 style=\"color: var(--primary-color); margin-bottom: 20px; font-size: 24px;\">\ud83d\udce2 Editais em Vigor por Distrito<\/h2>\n            <div id=\"editaisPorDistrito\"><\/div>\n            \n            <!-- Se\u00e7\u00e3o de Editais Arquivados -->\n            <div class=\"archived-section\">\n                <div class=\"archived-header\" onclick=\"toggleArchived()\">\n                    <h3>\n                        <span>\ud83d\udce6<\/span> Editais Arquivados por Distrito\n                        <span id=\"archivedCount\" style=\"font-size: 14px; font-weight: normal;\"><\/span>\n                    <\/h3>\n                    <span class=\"archived-icon\" id=\"archivedIcon\">\u25bc<\/span>\n                <\/div>\n                <div class=\"archived-content\" id=\"archivedContent\">\n                    <div id=\"archivedList\"><\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        \n        <!-- Coluna Direita - Delegado -->\n        <div class=\"sidebar-right\">\n            <div class=\"delegado-card\">\n                <div class=\"delegado-header\">\n                    <h3>Delegado do CPRM<\/h3>\n                <\/div>\n                <div class=\"delegado-foto\">\n                    <div class=\"foto-placeholder\" id=\"fotoPlaceholder\">\n                        \n                        <img id=\"delegadoFoto\" style=\"display: none; width: 100%; height: 100%; object-fit: cover;\" alt=\"Foto do Delegado\">\n                    <\/div>\n                <\/div>\n                <div class=\"delegado-info\">\n                    <div class=\"delegado-nome\" id=\"delegadoNome\">NOME DO DELEGADO<\/div>\n                    \n                    <div class=\"delegado-mensagem\" id=\"delegadoMensagem\">\n                        &#8220;Comprometidos com a transpar\u00eancia, excel\u00eancia e patriotismo no recrutamento militar&#8221;\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- Bot\u00e3o Admin -->\n<div class=\"admin-badge\">\n    <button class=\"admin-toggle\" onclick=\"toggleAdminPanel()\" title=\"\u00c1rea Administrativa\">\u2699\ufe0f<\/button>\n<\/div>\n\n<!-- Overlay para o formul\u00e1rio -->\n<div id=\"formOverlay\" class=\"form-overlay\" onclick=\"fecharAdminPanel()\"><\/div>\n\n<script>\n\/\/ Lista de Distritos da Prov\u00edncia de Gaza\nconst distritos = [\n    \"Xai-Xai\", \"Bilene\", \"Chibuto\", \"Chicualacuala\", \"Chigubo\", \"Ch\u00f3kw\u00e8\", \n    \"Guij\u00e1\", \"Mabalane\", \"Manjacaze\", \"Massangena\", \"Massingir\", \"Xai-Xai Cidade\"\n];\n\n\/\/ Dados do Delegado\nlet delegadoData = {\n    nome: \"Delegado do CPRM\",\n    cargo: \"Delegado do Centro Provincial de Recrutamento e Mobiliza\u00e7\u00e3o\",\n    mensagem: \"Comprometidos com a transpar\u00eancia, excel\u00eancia e patriotismo no recrutamento militar\",\n    foto: null\n};\n\n\/\/ Estrutura de dados: editais por distrito\nlet editaisPorDistrito = {};\n\n\/\/ Inicializar estrutura de dados\nfunction initEditaisPorDistrito() {\n    distritos.forEach(distrito => {\n        if(!editaisPorDistrito[distrito]) {\n            editaisPorDistrito[distrito] = {\n                ativos: {\n                    classificacao: {\n                        titulo: \"Edital de Prova de Classifica\u00e7\u00e3o e Selec\u00e7\u00e3o\",\n                        dataPublicacao: \"\",\n                        dataTermino: \"\",\n                        link: \"\",\n                        downloads: 0,\n                        downloadsHistory: []\n                    },\n                    incorporacao: {\n                        titulo: \"Edital de Incorpora\u00e7\u00e3o\",\n                        dataPublicacao: \"\",\n                        dataTermino: \"\",\n                        link: \"\",\n                        downloads: 0,\n                        downloadsHistory: []\n                    }\n                },\n                arquivados: []\n            };\n        }\n    });\n}\n\n\/\/ Carregar dados do localStorage\nfunction loadData() {\n    const savedDelegado = localStorage.getItem('cprm_delegado');\n    if(savedDelegado) {\n        delegadoData = JSON.parse(savedDelegado);\n        renderDelegado();\n    }\n    \n    const savedEditais = localStorage.getItem('cprm_editais_distritos');\n    if(savedEditais) {\n        editaisPorDistrito = JSON.parse(savedEditais);\n    } else {\n        initEditaisPorDistrito();\n    }\n    \n    verificarArquivamentoAutomatico();\n    renderAll();\n}\n\n\/\/ Salvar dados\nfunction saveData() {\n    localStorage.setItem('cprm_delegado', JSON.stringify(delegadoData));\n    localStorage.setItem('cprm_editais_distritos', JSON.stringify(editaisPorDistrito));\n}\n\n\/\/ Registrar download\nfunction registrarDownload(distrito, tipo, link) {\n    if(link && link !== '#') {\n        const edital = editaisPorDistrito[distrito].ativos[tipo];\n        edital.downloads = (edital.downloads || 0) + 1;\n        \n        const registro = {\n            data: new Date().toISOString(),\n            distrito: distrito,\n            tipo: tipo,\n            userAgent: navigator.userAgent.substring(0, 100)\n        };\n        \n        if(!edital.downloadsHistory) edital.downloadsHistory = [];\n        edital.downloadsHistory.unshift(registro);\n        \n        if(edital.downloadsHistory.length > 100) {\n            edital.downloadsHistory = edital.downloadsHistory.slice(0, 100);\n        }\n        \n        saveData();\n        renderAll();\n        window.open(link, '_blank');\n    }\n}\n\n\/\/ Verificar e arquivar automaticamente\nfunction verificarArquivamentoAutomatico() {\n    const hoje = new Date();\n    hoje.setHours(0, 0, 0, 0);\n    let alterado = false;\n    \n    for(const distrito in editaisPorDistrito) {\n        const ativos = editaisPorDistrito[distrito].ativos;\n        \n        for(const tipo in ativos) {\n            const edital = ativos[tipo];\n            if(edital.dataTermino) {\n                const dataTermino = new Date(edital.dataTermino);\n                dataTermino.setHours(0, 0, 0, 0);\n                \n                if(dataTermino < hoje) {\n                    \/\/ Mover para arquivados\n                    editaisPorDistrito[distrito].arquivados.push({\n                        ...edital,\n                        tipo: tipo,\n                        dataArquivamento: new Date().toISOString().split('T')[0]\n                    });\n                    \/\/ Resetar o edital ativo\n                    editaisPorDistrito[distrito].ativos[tipo] = {\n                        titulo: tipo === 'classificacao' ? \"Edital de Prova de Classifica\u00e7\u00e3o e Selec\u00e7\u00e3o\" : \"Edital de Incorpora\u00e7\u00e3o\",\n                        dataPublicacao: \"\",\n                        dataTermino: \"\",\n                        link: \"\",\n                        downloads: 0,\n                        downloadsHistory: []\n                    };\n                    alterado = true;\n                }\n            }\n        }\n    }\n    \n    if(alterado) {\n        saveData();\n    }\n}\n\n\/\/ Renderizar Delegado\nfunction renderDelegado() {\n    document.getElementById('delegadoNome').textContent = delegadoData.nome || \"Delegado do CPRM\";\n    document.getElementById('delegadoCargo').textContent = delegadoData.cargo || \"Delegado do Centro Provincial de Recrutamento e Mobiliza\u00e7\u00e3o\";\n    document.getElementById('delegadoMensagem').textContent = delegadoData.mensagem || \"Comprometidos com a transpar\u00eancia, excel\u00eancia e patriotismo no recrutamento militar\";\n    \n    const fotoImg = document.getElementById('delegadoFoto');\n    const noPhotoIcon = document.getElementById('noPhotoIcon');\n    \n    if(delegadoData.foto) {\n        fotoImg.src = delegadoData.foto;\n        fotoImg.style.display = 'block';\n        noPhotoIcon.style.display = 'none';\n    } else {\n        fotoImg.style.display = 'none';\n        noPhotoIcon.style.display = 'flex';\n    }\n}\n\n\/\/ Renderizar todos os editais\nfunction renderAll() {\n    renderEditaisAtivos();\n    renderEditaisArquivados();\n    updateArchivedCount();\n}\n\n\/\/ Renderizar editais ativos por distrito\nfunction renderEditaisAtivos() {\n    const container = document.getElementById('editaisPorDistrito');\n    let html = '';\n    \n    for(const distrito of distritos) {\n        const ativos = editaisPorDistrito[distrito]?.ativos;\n        if(!ativos) continue;\n        \n        const temEditalAtivo = (ativos.classificacao.link &#038;&#038; ativos.classificacao.link !== '#') || \n                               (ativos.incorporacao.link &#038;&#038; ativos.incorporacao.link !== '#');\n        \n        if(!temEditalAtivo) continue;\n        \n        html += `\n            <div class=\"distrito-section\">\n                <div class=\"distrito-header\" onclick=\"toggleDistrito('${distrito}')\">\n                    <h3>\n                        <span>\ud83c\udfd8\ufe0f<\/span> ${distrito}\n                    <\/h3>\n                    <span class=\"distrito-icon\" id=\"icon-${distrito}\">\u25bc<\/span>\n                <\/div>\n                <div class=\"distrito-content\" id=\"content-${distrito}\">\n                    <div class=\"editais-distrito\">\n                        ${renderEditalCard(distrito, 'classificacao', ativos.classificacao)}\n                        ${renderEditalCard(distrito, 'incorporacao', ativos.incorporacao)}\n                    <\/div>\n                <\/div>\n            <\/div>\n        `;\n    }\n    \n    if(html === '') {\n        container.innerHTML = '<div style=\"text-align: center; padding: 40px; background: #f9f9f9; border-radius: 10px;\">\ud83d\udced Nenhum edital ativo no momento.<\/div>';\n    } else {\n        container.innerHTML = html;\n    }\n}\n\n\/\/ Renderizar card individual do edital\nfunction renderEditalCard(distrito, tipo, edital) {\n    if(!edital.link || edital.link === '#') {\n        return '';\n    }\n    \n    const titulo = tipo === 'classificacao' ? \"\ud83d\udcdd Edital de Prova de Classifica\u00e7\u00e3o e Selec\u00e7\u00e3o\" : \"\ud83c\udf96\ufe0f Edital de Incorpora\u00e7\u00e3o\";\n    const downloadCount = edital.downloads || 0;\n    const downloadText = downloadCount === 1 ? 'download' : 'downloads';\n    \n    let statusText = '';\n    if(edital.dataTermino) {\n        const hoje = new Date();\n        const dataTermino = new Date(edital.dataTermino);\n        const diasRestantes = Math.ceil((dataTermino - hoje) \/ (1000 * 60 * 60 * 24));\n        \n        if(diasRestantes > 0 && diasRestantes <= 7) {\n            statusText = `<span style=\"display: inline-block; margin-left: 8px; padding: 2px 8px; background: #f0ad4e; color: white; border-radius: 20px; font-size: 10px;\">\u26a0\ufe0f Encerra em ${diasRestantes} dia(s)<\/span>`;\n        } else if(diasRestantes > 0) {\n            statusText = `<span style=\"display: inline-block; margin-left: 8px; padding: 2px 8px; background: #5bc0de; color: white; border-radius: 20px; font-size: 10px;\">\ud83d\udcc5 At\u00e9 ${formatDate(edital.dataTermino)}<\/span>`;\n        }\n    }\n    \n    return `\n        <div class=\"edital-card\">\n            <div class=\"edital-title\">\n                ${titulo}\n                <span class=\"edital-status status-active\">ATIVO<\/span>\n                ${statusText}\n                <span class=\"download-count\">\ud83d\udce5 ${downloadCount} ${downloadText}<\/span>\n            <\/div>\n            ${edital.dataPublicacao ? `<div class=\"edital-date\">\ud83d\udcc5 Publicado: ${formatDate(edital.dataPublicacao)}<\/div>` : '<div class=\"edital-date\">\u23f3 Aguardando publica\u00e7\u00e3o<\/div>'}\n            ${edital.dataTermino ? `<div class=\"edital-date\">\u23f0 Data limite: ${formatDate(edital.dataTermino)}<\/div>` : ''}\n            <div>\n                <button onclick=\"registrarDownload('${distrito}', '${tipo}', '${edital.link}')\" class=\"edital-link\">\n                    \ud83d\udce5 Baixar Edital (PDF)\n                <\/button>\n            <\/div>\n        <\/div>\n    `;\n}\n\n\/\/ Renderizar editais arquivados\nfunction renderEditaisArquivados() {\n    const container = document.getElementById('archivedList');\n    let html = '';\n    let totalArquivados = 0;\n    \n    for(const distrito of distritos) {\n        const arquivados = editaisPorDistrito[distrito]?.arquivados || [];\n        if(arquivados.length === 0) continue;\n        \n        totalArquivados += arquivados.length;\n        \n        html += `\n            <div class=\"distrito-section\">\n                <div class=\"distrito-header\" onclick=\"toggleDistritoArquivado('${distrito}')\">\n                    <h3>\n                        <span>\ud83c\udfd8\ufe0f<\/span> ${distrito}\n                    <\/h3>\n                    <span class=\"distrito-icon\" id=\"icon-arch-${distrito}\">\u25bc<\/span>\n                <\/div>\n                <div class=\"distrito-content\" id=\"content-arch-${distrito}\">\n                    <div class=\"editais-distrito\">\n        `;\n        \n        for(const edital of arquivados) {\n            const titulo = edital.tipo === 'classificacao' ? \"\ud83d\udcdd Edital de Prova de Classifica\u00e7\u00e3o e Selec\u00e7\u00e3o\" : \"\ud83c\udf96\ufe0f Edital de Incorpora\u00e7\u00e3o\";\n            const downloadCount = edital.downloads || 0;\n            const downloadText = downloadCount === 1 ? 'download' : 'downloads';\n            \n            html += `\n                <div class=\"edital-card archived\">\n                    <div class=\"edital-title\">\n                        ${titulo}\n                        <span class=\"edital-status status-archived\">ARQUIVADO<\/span>\n                        <span class=\"download-count\">\ud83d\udce5 ${downloadCount} ${downloadText}<\/span>\n                    <\/div>\n                    ${edital.dataPublicacao ? `<div class=\"edital-date\">\ud83d\udcc5 Publicado: ${formatDate(edital.dataPublicacao)}<\/div>` : ''}\n                    ${edital.dataTermino ? `<div class=\"edital-date\">\u23f0 Data limite: ${formatDate(edital.dataTermino)}<\/div>` : ''}\n                    ${edital.dataArquivamento ? `<div class=\"edital-date\">\ud83d\udce6 Arquivado: ${formatDate(edital.dataArquivamento)}<\/div>` : ''}\n                    <div>\n                        ${edital.link && edital.link !== '#' ? \n                            `<button onclick=\"window.open('${edital.link}', '_blank')\" class=\"edital-link\">\ud83d\udce5 Baixar Edital (PDF)<\/button>` : \n                            `<div class=\"edital-link\" style=\"background: #ccc; cursor: not-allowed;\">\ud83d\udce5 Indispon\u00edvel<\/div>`\n                        }\n                    <\/div>\n                <\/div>\n            `;\n        }\n        \n        html += `\n                    <\/div>\n                <\/div>\n            <\/div>\n        `;\n    }\n    \n    if(html === '') {\n        container.innerHTML = '<div style=\"text-align: center; padding: 40px; background: #f9f9f9; border-radius: 10px;\">\ud83d\udced Nenhum edital arquivado.<\/div>';\n    } else {\n        container.innerHTML = html;\n    }\n}\n\n\/\/ Alternar distrito ativo\nfunction toggleDistrito(distrito) {\n    const content = document.getElementById(`content-${distrito}`);\n    const icon = document.getElementById(`icon-${distrito}`);\n    \n    if(content.classList.contains('collapsed')) {\n        content.classList.remove('collapsed');\n        icon.classList.remove('open');\n        icon.innerHTML = '\u25bc';\n    } else {\n        content.classList.add('collapsed');\n        icon.classList.add('open');\n        icon.innerHTML = '\u25b2';\n    }\n}\n\n\/\/ Alternar distrito arquivado\nfunction toggleDistritoArquivado(distrito) {\n    const content = document.getElementById(`content-arch-${distrito}`);\n    const icon = document.getElementById(`icon-arch-${distrito}`);\n    \n    if(content.classList.contains('collapsed')) {\n        content.classList.remove('collapsed');\n        icon.classList.remove('open');\n        icon.innerHTML = '\u25bc';\n    } else {\n        content.classList.add('collapsed');\n        icon.classList.add('open');\n        icon.innerHTML = '\u25b2';\n    }\n}\n\n\/\/ Alternar se\u00e7\u00e3o geral de arquivados\nfunction toggleArchived() {\n    const content = document.getElementById('archivedContent');\n    const icon = document.getElementById('archivedIcon');\n    \n    if(content.classList.contains('show')) {\n        content.classList.remove('show');\n        icon.classList.remove('open');\n    } else {\n        content.classList.add('show');\n        icon.classList.add('open');\n    }\n}\n\n\/\/ Atualizar contador\nfunction updateArchivedCount() {\n    let total = 0;\n    for(const distrito of distritos) {\n        total += (editaisPorDistrito[distrito]?.arquivados || []).length;\n    }\n    document.getElementById('archivedCount').textContent = `(${total})`;\n}\n\n\/\/ Formatar data\nfunction formatDate(dateString) {\n    if(!dateString) return '';\n    const date = new Date(dateString);\n    return date.toLocaleDateString('pt-BR');\n}\n\n\/\/ Escapar HTML\nfunction escapeHtml(text) {\n    if(!text) return '';\n    const div = document.createElement('div');\n    div.textContent = text;\n    return div.innerHTML;\n}\n\n\/\/ Converter imagem\nfunction convertToBase64(file) {\n    return new Promise((resolve, reject) => {\n        const reader = new FileReader();\n        reader.readAsDataURL(file);\n        reader.onload = () => resolve(reader.result);\n        reader.onerror = error => reject(error);\n    });\n}\n\n\/\/ \u00c1rea administrativa\nfunction toggleAdminPanel() {\n    let panel = document.getElementById('adminPanel');\n    const overlay = document.getElementById('formOverlay');\n    \n    if(panel) {\n        panel.remove();\n        overlay.classList.remove('show');\n    } else {\n        createAdminPanel();\n        overlay.classList.add('show');\n    }\n}\n\nfunction createAdminPanel() {\n    const panel = document.createElement('div');\n    panel.id = 'adminPanel';\n    panel.className = 'form-area show';\n    \n    let html = `\n        <h3 style=\"color: var(--primary-color); margin-bottom: 20px;\">\ud83d\udd10 \u00c1rea Administrativa<\/h3>\n        \n        <div class=\"stats-box\">\n            <p><strong>\ud83d\udcca Estat\u00edsticas Gerais<\/strong><\/p>\n            <p>\ud83d\udce5 Total de downloads: <strong>${calcularTotalDownloads()}<\/strong><\/p>\n            <button class=\"btn btn-warning\" onclick=\"resetarTodosDownloads()\" style=\"margin-top: 10px;\">\ud83d\udd04 Resetar Todos os Contadores<\/button>\n        <\/div>\n        \n        <div class=\"info-box\">\n            <p><strong>\ud83d\udccc Gest\u00e3o do Delegado<\/strong><\/p>\n        <\/div>\n        \n        <div class=\"form-group\">\n            <label>Nome do Delegado:<\/label>\n            <input type=\"text\" id=\"delegadoNomeInput\" value=\"${escapeHtml(delegadoData.nome)}\">\n        <\/div>\n        <div class=\"form-group\">\n            <label>Cargo:<\/label>\n            <input type=\"text\" id=\"delegadoCargoInput\" value=\"${escapeHtml(delegadoData.cargo)}\">\n        <\/div>\n        <div class=\"form-group\">\n            <label>Mensagem:<\/label>\n            <textarea id=\"delegadoMensagemInput\" rows=\"2\">${escapeHtml(delegadoData.mensagem)}<\/textarea>\n        <\/div>\n        <div class=\"form-group\">\n            <label>Foto:<\/label>\n            <input type=\"file\" id=\"delegadoFotoInput\" accept=\"image\/*\">\n            ${delegadoData.foto ? '<div><img decoding=\"async\" src=\"' + delegadoData.foto + '\" style=\"max-width: 80px; margin-top: 10px;\"><\/div>' : ''}\n        <\/div>\n        \n        <hr>\n        \n        <div class=\"info-box\">\n            <p><strong>\ud83d\udccc Gest\u00e3o de Editais por Distrito<\/strong><\/p>\n            <p>\u2022 Cada distrito tem dois editais: Classifica\u00e7\u00e3o\/Selec\u00e7\u00e3o e Incorpora\u00e7\u00e3o<\/p>\n            <p>\u2022 Defina as datas de publica\u00e7\u00e3o e t\u00e9rmino para controle autom\u00e1tico<\/p>\n        <\/div>\n    `;\n    \n    for(const distrito of distritos) {\n        const ativos = editaisPorDistrito[distrito]?.ativos || { classificacao: {}, incorporacao: {} };\n        \n        html += `\n            <div class=\"distrito-group\">\n                <h4>\ud83c\udfd8\ufe0f ${distrito}<\/h4>\n                \n                <div class=\"form-group\">\n                    <label>\ud83d\udcdd Edital PCS - Link PDF:<\/label>\n                    <input type=\"url\" id=\"link_classificacao_${distrito.replace(\/\\s\/g, '_')}\" value=\"${ativos.classificacao?.link || ''}\" placeholder=\"https:\/\/...\">\n                <\/div>\n                <div class=\"form-group\">\n                    <label>\ud83d\udcc5 Data Publica\u00e7\u00e3o PCS:<\/label>\n                    <input type=\"date\" id=\"dataPub_classificacao_${distrito.replace(\/\\s\/g, '_')}\" value=\"${ativos.classificacao?.dataPublicacao || ''}\">\n                <\/div>\n                <div class=\"form-group\">\n                    <label>\u23f0 Data T\u00e9rmino PCS:<\/label>\n                    <input type=\"date\" id=\"dataTerm_classificacao_${distrito.replace(\/\\s\/g, '_')}\" value=\"${ativos.classificacao?.dataTermino || ''}\">\n                <\/div>\n                \n                <div class=\"form-group\">\n                    <label>\ud83c\udf96\ufe0f Edital Incorpora\u00e7\u00e3o - Link PDF:<\/label>\n                    <input type=\"url\" id=\"link_incorporacao_${distrito.replace(\/\\s\/g, '_')}\" value=\"${ativos.incorporacao?.link || ''}\" placeholder=\"https:\/\/...\">\n                <\/div>\n                <div class=\"form-group\">\n                    <label>\ud83d\udcc5 Data Publica\u00e7\u00e3o Incorpora\u00e7\u00e3o:<\/label>\n                    <input type=\"date\" id=\"dataPub_incorporacao_${distrito.replace(\/\\s\/g, '_')}\" value=\"${ativos.incorporacao?.dataPublicacao || ''}\">\n                <\/div>\n                <div class=\"form-group\">\n                    <label>\u23f0 Data T\u00e9rmino Incorpora\u00e7\u00e3o:<\/label>\n                    <input type=\"date\" id=\"dataTerm_incorporacao_${distrito.replace(\/\\s\/g, '_')}\" value=\"${ativos.incorporacao?.dataTermino || ''}\">\n                <\/div>\n                <hr style=\"margin: 15px 0;\">\n            <\/div>\n        `;\n    }\n    \n    html += `\n        <div style=\"display: flex; gap: 10px; margin-top: 20px;\">\n            <button class=\"btn btn-primary\" onclick=\"salvarAlteracoes()\">\u2705 Salvar Todas<\/button>\n            <button class=\"btn btn-danger\" onclick=\"fecharAdminPanel()\">\u274c Fechar<\/button>\n        <\/div>\n    `;\n    \n    panel.innerHTML = html;\n    document.body.appendChild(panel);\n}\n\nfunction calcularTotalDownloads() {\n    let total = 0;\n    for(const distrito of distritos) {\n        const ativos = editaisPorDistrito[distrito]?.ativos;\n        if(ativos) {\n            total += (ativos.classificacao?.downloads || 0);\n            total += (ativos.incorporacao?.downloads || 0);\n        }\n        const arquivados = editaisPorDistrito[distrito]?.arquivados || [];\n        for(const edital of arquivados) {\n            total += (edital.downloads || 0);\n        }\n    }\n    return total;\n}\n\nfunction resetarTodosDownloads() {\n    if(confirm('Tem certeza? Isso ir\u00e1 resetar TODOS os contadores de downloads de TODOS os distritos!')) {\n        for(const distrito of distritos) {\n            if(editaisPorDistrito[distrito]?.ativos) {\n                editaisPorDistrito[distrito].ativos.classificacao.downloads = 0;\n                editaisPorDistrito[distrito].ativos.incorporacao.downloads = 0;\n            }\n            if(editaisPorDistrito[distrito]?.arquivados) {\n                for(const edital of editaisPorDistrito[distrito].arquivados) {\n                    edital.downloads = 0;\n                }\n            }\n        }\n        saveData();\n        renderAll();\n        alert('\u2705 Todos os contadores foram resetados!');\n    }\n}\n\nfunction fecharAdminPanel() {\n    const panel = document.getElementById('adminPanel');\n    const overlay = document.getElementById('formOverlay');\n    if(panel) panel.remove();\n    if(overlay) overlay.classList.remove('show');\n}\n\nasync function salvarAlteracoes() {\n    \/\/ Salvar Delegado\n    delegadoData.nome = document.getElementById('delegadoNomeInput').value;\n    delegadoData.cargo = document.getElementById('delegadoCargoInput').value;\n    delegadoData.mensagem = document.getElementById('delegadoMensagemInput').value;\n    \n    const fotoInput = document.getElementById('delegadoFotoInput');\n    if(fotoInput.files && fotoInput.files[0]) {\n        delegadoData.foto = await convertToBase64(fotoInput.files[0]);\n    }\n    \n    \/\/ Salvar editais por distrito\n    for(const distrito of distritos) {\n        const key = distrito.replace(\/\\s\/g, '_');\n        \n        const linkClass = document.getElementById(`link_classificacao_${key}`)?.value || '';\n        const dataPubClass = document.getElementById(`dataPub_classificacao_${key}`)?.value || '';\n        const dataTermClass = document.getElementById(`dataTerm_classificacao_${key}`)?.value || '';\n        \n        const linkInc = document.getElementById(`link_incorporacao_${key}`)?.value || '';\n        const dataPubInc = document.getElementById(`dataPub_incorporacao_${key}`)?.value || '';\n        const dataTermInc = document.getElementById(`dataTerm_incorporacao_${key}`)?.value || '';\n        \n        if(!editaisPorDistrito[distrito]) {\n            editaisPorDistrito[distrito] = { ativos: { classificacao: {}, incorporacao: {} }, arquivados: [] };\n        }\n        \n        \/\/ Preservar contadores existentes\n        const oldClass = editaisPorDistrito[distrito].ativos.classificacao;\n        const oldInc = editaisPorDistrito[distrito].ativos.incorporacao;\n        \n        editaisPorDistrito[distrito].ativos.classificacao = {\n            titulo: \"Edital de Prova de Classifica\u00e7\u00e3o e Selec\u00e7\u00e3o\",\n            dataPublicacao: dataPubClass,\n            dataTermino: dataTermClass,\n            link: linkClass,\n            downloads: oldClass?.downloads || 0,\n            downloadsHistory: oldClass?.downloadsHistory || []\n        };\n        \n        editaisPorDistrito[distrito].ativos.incorporacao = {\n            titulo: \"Edital de Incorpora\u00e7\u00e3o\",\n            dataPublicacao: dataPubInc,\n            dataTermino: dataTermInc,\n            link: linkInc,\n            downloads: oldInc?.downloads || 0,\n            downloadsHistory: oldInc?.downloadsHistory || []\n        };\n    }\n    \n    saveData();\n    verificarArquivamentoAutomatico();\n    renderDelegado();\n    renderAll();\n    fecharAdminPanel();\n    alert('\u2705 Todas as informa\u00e7\u00f5es foram salvas!');\n}\n\n\/\/ Inicializar\ninitEditaisPorDistrito();\nloadData();\n\n\/\/ Verificar a cada minuto\nsetInterval(() => {\n    verificarArquivamentoAutomatico();\n    renderAll();\n}, 60000);\n<\/script>\n\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Centro Provincial de Recrutamento e Mobiliza\u00e7\u00e3o de Sofala Minist\u00e9rio da Defesa Nacional | CPRM \u2013Manica Endere\u00e7o: Avenida Eduardo Mondlane, N\u00b0 1535, Cidade da Beira Contacto: +258 864668800\/874668800 Email: Cprmsofala.informatica@gmail.com Localiza\u00e7\u00e3o: [&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-2583","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mdn.gov.mz\/index.php\/wp-json\/wp\/v2\/pages\/2583","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=2583"}],"version-history":[{"count":2,"href":"https:\/\/mdn.gov.mz\/index.php\/wp-json\/wp\/v2\/pages\/2583\/revisions"}],"predecessor-version":[{"id":2607,"href":"https:\/\/mdn.gov.mz\/index.php\/wp-json\/wp\/v2\/pages\/2583\/revisions\/2607"}],"wp:attachment":[{"href":"https:\/\/mdn.gov.mz\/index.php\/wp-json\/wp\/v2\/media?parent=2583"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}