';
}
// Same .tc-room skeleton as renderRoomRow (avatar/info/top/bottom) so a group row matches the
// 1:1 rows visually — data-type="group" + data-gid instead of data-cid/data-uid is what the
// click-delegation in renderRooms() switches on. No online/typing indicator (doesn't apply to
// a group), and the avatar is a rounded square instead of a circle as the only visual cue
// distinguishing a group from a person, mirroring common chat-app convention.
function renderGroupRow(group) {
var gid = group.gid;
var name = group.name || '';
var lastMsg = group.lastMessage;
var preview = '';
if (lastMsg) {
preview = parseDisplayText(lastMsg.msm);
if (!preview) {
if (lastMsg.urlima && lastMsg.urlima.indexOf('public://') >= 0) preview = '📷';
else if (lastMsg.urlaudi && lastMsg.urlaudi.indexOf('public://') >= 0) preview = '🎵';
}
if (String(lastMsg.whosend) === String(userId)) preview = 'You: ' + preview;
} else {
preview = 'No messages yet';
}
var timeStr = group.updated ? fmtTime(unixToDbTimestamp(group.updated)) : '';
var unread = group.unreadCount > 0;
var active = activeGid === gid;
return '
';
}
var body = '';
if (msg.urlima === '_loading_') {
body += '
📷 Sending…
';
} else if (msg.urlima && msg.urlima.indexOf('public://') >= 0) {
var src = msg.urlima.replace('public://', FILES_BASE);
body += '';
}
if (msg.urlaudi && msg.urlaudi.indexOf('public://') >= 0) {
var asrc = msg.urlaudi.replace('public://', FILES_BASE);
body += '';
}
if (meta && meta.type === 'loc') {
body += locationLinkHtml(meta.lat, meta.lng);
} else if (!isSalt && text) {
body += '
' + linkifyText(escHtml(text)) + '
';
}
var time = fmtTime(msg.timestamp || '');
return '
'
+ metaHtml + body
+ '' + escHtml(time) + ''
+ '
';
}
// ── Render group messages ────────────────────────────────────────────────────
function renderGroupMessages(gid) {
var msgs = allGroupMsgs[gid] || [];
var $el = $('#tc-msgs');
var order = msgs.slice().reverse();
$el.html(order.map(renderGroupMsg).join(''));
$el.scrollTop($el[0].scrollHeight);
}
// Same shape as renderMsg(), plus a sender-name label on incoming bubbles — unlike a 1:1
// conversation, "not me" doesn't tell you who actually sent it. Reuses the identical
// urlima/urlaudi rendering, so images/audio sent from the Android app (or sendGroupImage()
// here) display correctly. Audio still has no send control in this web widget.
function renderGroupMsg(msg) {
var isMe = String(msg.whosend) === String(userId);
var side = isMe ? 'tc-out' : 'tc-in';
var parsed = parseInlineMeta(msg.msm || '');
var text = parsed.text;
var meta = parsed.meta;
var isSalt = (text.length === 18 && text.indexOf(' ') < 0);
var senderHtml = '';
if (!isMe) {
senderHtml = '
' + escHtml(msg.senderName || msg.whosend) + '
';
}
var metaHtml = '';
if (meta && meta.type === 'fwd') {
metaHtml = '
';
}
// ── Send (opc 11) ────────────────────────────────────────────────────────────
function sendMessage() {
var text = $.trim($('#tc-input').val());
if (!text || !activeCid) return;
$('#tc-input').val('').focus();
isTyping = false;
post({ opc: '11', userid: userId, cid: activeCid, msm: text, fid: '0' })
.then(function (resp) {
if (!resp) return;
var ok = (resp.resp === 3 || resp.resp === '3' ||
resp.resp === 11 || resp.resp === '11');
if (!ok) return;
var msg = {
id: resp.lastmid || String(Date.now()),
whosend: String(userId),
msm: text,
urlima: '',
urlaudi: '',
timestamp: new Date().toISOString().replace('T', ' ').substr(0, 19)
};
if (!allMsgs[activeCid]) allMsgs[activeCid] = [];
allMsgs[activeCid].unshift(msg);
renderMessages(activeCid);
if (socket && socket.connected) {
socket.emit('send-message', {
id: resp.lastmid,
chatId: activeCid,
from: String(userId),
to: String(activeUid),
message: text,
type: 'text'
});
}
});
}
// ── Send group message ───────────────────────────────────────────────────────
// Purely socket-based — group-message-send both persists (tc_group_message, via the
// signaling server) and delivers, unlike 1:1's HTTP-then-socket-notify split. The server
// echoes the message back to the sender too (see group-message-send in signaling-server-2.js),
// so onGroupSocketMessage() is what actually appends it here — no optimistic local insert.
function sendGroupMessage() {
var text = $.trim($('#tc-input').val());
if (!text || !activeGid) return;
if (!socket || !socket.connected) return;
$('#tc-input').val('').focus();
isTyping = false;
socket.emit('group-message-send', {
gid: parseInt(activeGid, 10),
from: userId,
message: text,
type: 'text',
localId: 'web-' + Date.now() + '-' + Math.random().toString(36).substr(2, 8)
});
}
// ── Send group image (group-message-send, type:"image") ─────────────────────
// Unlike 1:1 (HTTP upload then socket notify), groups have no HTTP upload endpoint —
// the server expects the raw file as a base64 string on the same socket event used for
// text (see group-message-send in signaling-server-2.js), and does its own resize/compress
// (sharp, 1024x1024 max, jpeg75) server-side before writing it and echoing "group-message"
// back to every member including the sender. That echo is what onGroupSocketMessage() uses
// to both confirm this optimistic placeholder (matched by localId) and actually display it.
function sendGroupImage(file) {
if (!activeGid) return;
if (!socket || !socket.connected) return;
if (pendingGroupImage) return; // one at a time — button is disabled meanwhile anyway
var gid = activeGid;
var localId = 'web-img-' + Date.now() + '-' + Math.random().toString(36).substr(2, 8);
pendingGroupImage = { gid: gid, localId: localId };
if (!allGroupMsgs[gid]) allGroupMsgs[gid] = [];
allGroupMsgs[gid].unshift({
id: localId, localId: localId, whosend: String(userId), senderName: myName,
msm: '', urlima: '_loading_', urlaudi: '', created: Math.floor(Date.now() / 1000)
});
renderGroupMessages(gid);
$('#tc-img-btn').attr('disabled', 'disabled');
// Safety net — if the server/socket never answers at all (disconnect mid-flight etc.),
// don't leave "Sending…" stuck forever (see the 1:1 image-send bug this mirrors).
var timeoutId = setTimeout(function () { onGroupMessageError({}); }, 20000);
compressImageIfNeeded(file, function (uploadFile) {
var reader = new FileReader();
reader.onload = function () {
clearTimeout(timeoutId);
if (!pendingGroupImage || pendingGroupImage.localId !== localId) return; // already cleared
var base64 = (reader.result || '').split(',')[1] || '';
if (!base64 || !socket || !socket.connected) { onGroupMessageError({}); return; }
socket.emit('group-message-send', {
gid: parseInt(gid, 10),
from: userId,
message: '',
type: 'image',
filedata: base64,
localId: localId
});
};
reader.onerror = function () {
clearTimeout(timeoutId);
onGroupMessageError({});
};
reader.readAsDataURL(uploadFile);
});
}
// Clears whatever group image send is currently in flight — used both for explicit
// "group-message-error" replies (bad file, not a member, rate-limited) and the
// client-side timeout above. Doesn't distinguish by localId: only one send is ever
// in flight at a time (the button is disabled meanwhile), so there's nothing to match.
function onGroupMessageError(data) {
if (!pendingGroupImage) return;
var gid = pendingGroupImage.gid;
var localId = pendingGroupImage.localId;
pendingGroupImage = null;
$('#tc-img-btn').removeAttr('disabled');
if (allGroupMsgs[gid]) {
allGroupMsgs[gid] = allGroupMsgs[gid].filter(function (m) { return m.localId !== localId; });
}
if (activeGid === gid && isOpen) renderGroupMessages(gid);
if (data && data.error) { console.warn('group image send failed:', data.error); }
}
// Resizes/re-encodes as JPEG when a file exceeds COMPRESS_THRESHOLD. Skips GIFs —
// redrawing to canvas would flatten an animated GIF to a single static frame.
// Falls back to the original file untouched if decoding/encoding fails for any reason.
function compressImageIfNeeded(file, callback) {
if (file.size <= COMPRESS_THRESHOLD || file.type === 'image/gif') {
callback(file);
return;
}
var img = new Image();
var url = URL.createObjectURL(file);
img.onload = function () {
URL.revokeObjectURL(url);
var scale = Math.min(1, COMPRESS_MAX_DIM / Math.max(img.width, img.height));
var canvas = document.createElement('canvas');
canvas.width = Math.round(img.width * scale);
canvas.height = Math.round(img.height * scale);
canvas.getContext('2d').drawImage(img, 0, 0, canvas.width, canvas.height);
canvas.toBlob(function (blob) {
callback(blob || file, !!blob);
}, 'image/jpeg', COMPRESS_QUALITY);
};
img.onerror = function () {
URL.revokeObjectURL(url);
callback(file);
};
img.src = url;
}
// ── Send image (opc 11I) ─────────────────────────────────────────────────────
function sendImage(file) {
if (!activeCid) return;
var tempId = '_img_' + Date.now();
if (!allMsgs[activeCid]) allMsgs[activeCid] = [];
allMsgs[activeCid].unshift({
id: tempId, whosend: String(userId), msm: '', urlima: '_loading_',
urlaudi: '', timestamp: new Date().toISOString().replace('T', ' ').substr(0, 19)
});
renderMessages(activeCid);
// .attr()/.removeAttr(), not .prop() — this site's jQuery predates 1.6 (which is
// when .prop() was introduced), and every other call in this file sticks to
// pre-1.6-safe APIs already.
$('#tc-img-btn').attr('disabled', 'disabled');
compressImageIfNeeded(file, function (uploadFile, wasCompressed) {
var form = new FormData();
form.append('opc', '11I');
form.append('userid', String(userId));
form.append('cid', activeCid);
form.append('image', uploadFile, wasCompressed ? 'upload.jpg' : file.name);
fetch(API_URL, { method: 'POST', body: form })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (resp) {
allMsgs[activeCid] = allMsgs[activeCid].filter(function (m) { return m.id !== tempId; });
if (resp && (resp.resp === 3 || resp.resp === '3') && resp.urlima) {
var msg = {
id: resp.lastmid || String(Date.now()),
whosend: String(userId),
msm: '',
urlima: resp.urlima,
urlaudi: '',
timestamp: new Date().toISOString().replace('T', ' ').substr(0, 19)
};
allMsgs[activeCid].unshift(msg);
if (socket && socket.connected) {
socket.emit('send-message', {
id: resp.lastmid,
chatId: activeCid,
from: String(userId),
to: String(activeUid),
message: '',
urlima: resp.urlima,
type: 'image'
});
}
}
renderMessages(activeCid);
})
.catch(function () {
allMsgs[activeCid] = allMsgs[activeCid].filter(function (m) { return m.id !== tempId; });
renderMessages(activeCid);
})
.then(function () { $('#tc-img-btn').removeAttr('disabled'); });
});
}
// ── Inline meta parser ────────────────────────────────────────────────────────
function parseInlineMeta(raw) {
if (!raw) return { text: '', meta: null };
if (raw.substr(0, FWD_MARKER.length) === FWD_MARKER) {
var end = raw.indexOf(META_ETX);
if (end < 0) return { text: raw, meta: null };
var sender = raw.substring(FWD_MARKER.length, end);
return { text: raw.substring(end + 1), meta: { type: 'fwd', sender: sender } };
}
if (raw.substr(0, REPLY_MARKER.length) === REPLY_MARKER) {
var rend = raw.indexOf(META_ETX);
if (rend < 0) return { text: raw, meta: null };
var parts = raw.substring(REPLY_MARKER.length, rend);
var sep = parts.indexOf(META_SEP);
var rsender = sep >= 0 ? parts.substring(0, sep) : parts;
var orig = sep >= 0 ? parts.substring(sep + 1) : '';
return { text: raw.substring(rend + 1), meta: { type: 'reply', sender: rsender, orig: orig } };
}
// Shared location — same "lat" + META_SEP + "lng" encoding the Android app writes
// (see LOC_MARKER / sendLocationMessage() in ActivityChat.java). No trailing text.
if (raw.substr(0, LOC_MARKER.length) === LOC_MARKER) {
var lend = raw.indexOf(META_ETX);
if (lend < 0) return { text: raw, meta: null };
var coords = raw.substring(LOC_MARKER.length, lend);
var lsep = coords.indexOf(META_SEP);
var lat = lsep >= 0 ? coords.substring(0, lsep) : coords;
var lng = lsep >= 0 ? coords.substring(lsep + 1) : '';
return { text: raw.substring(lend + 1), meta: { type: 'loc', lat: lat, lng: lng } };
}
return { text: raw, meta: null };
}
function parseDisplayText(msm) {
var p = parseInlineMeta(msm || '');
var t = p.text;
if (p.meta && p.meta.type === 'loc') return '📍 ' + LOC_LABEL;
if (t.length === 18 && t.indexOf(' ') < 0) return '';
return (p.meta ? (p.meta.type === 'fwd' ? '↪ ' : '↩ ') : '') + t;
}
// ── Badge & notifications ─────────────────────────────────────────────────────
function updateBadge() {
var n = Object.keys(unreadCids).length;
Object.keys(allGroups).forEach(function (k) {
if (allGroups[k].unreadCount > 0) n++;
});
var $b = $('#tc-badge');
if (n > 0) { $b.text(n).removeClass('tc-hidden'); }
else { $b.addClass('tc-hidden'); }
}
function showNotif(title, body) {
if (!('Notification' in window)) return;
if (Notification.permission === 'granted') {
new Notification(title, {
body: body || '',
icon: 'https://www.taleoi.com/sites/default/files/taleoi.ico'
});
} else if (Notification.permission === 'default') {
Notification.requestPermission();
}
}
// ── HTTP ──────────────────────────────────────────────────────────────────────
function post(params) {
var form = new FormData();
Object.keys(params).forEach(function (k) { form.append(k, String(params[k])); });
return fetch(API_URL, { method: 'POST', body: form })
.then(function (r) { return r.ok ? r.json() : null; })
.catch(function () { return null; });
}
// ── Helpers ───────────────────────────────────────────────────────────────────
// Group timestamps (tc_group.updated, tc_group_message.created) are unix seconds, unlike
// 1:1's "YYYY-MM-DD HH:MM:SS" strings — converts to that same shape (local time) so both can
// share fmtTime() and the plain string comparison renderRooms() sorts by.
// Formatted with UTC getters, not local — fmtTime() (below) always treats this
// "YYYY-MM-DD HH:MM:SS" shape as UTC (appending 'Z' before parsing), matching the raw
// DB timestamp strings 1:1 chat passes it directly. Using local getters here would hand
// fmtTime() an already-local time it then re-shifts by the viewer's UTC offset again.
function unixToDbTimestamp(unixSec) {
if (!unixSec) return '0';
var d = new Date(unixSec * 1000);
function pad(n) { return (n < 10 ? '0' : '') + n; }
return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + ' '
+ pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds());
}
function fmtTime(ts) {
if (!ts) return '';
// DB timestamps are plain "YYYY-MM-DD HH:MM:SS" in UTC (MySQL TIMESTAMP column).
// Without a trailing 'Z', the JS Date parser treats a date-TIME string (unlike a
// date-only string) as local time, not UTC — silently shifting displayed times by
// the viewer's UTC offset. The 'Z' forces correct UTC interpretation.
var d = new Date(ts.replace(' ', 'T') + 'Z');
if (isNaN(d.getTime())) return '';
var now = new Date();
if (d.toDateString() === now.toDateString()) {
return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
}
return (d.getMonth() + 1) + '/' + d.getDate();
}
function escHtml(s) {
return String(s == null ? '' : s)
.replace(/&/g, '&').replace(//g, '>')
.replace(/"/g, '"').replace(/'/g, ''');
}
function escAttr(s) { return escHtml(s); }
// Wraps http(s) URLs in a message's already-escaped text with clickable links. Must run
// AFTER escHtml() — matching against the escaped string is safe since escaping never
// introduces whitespace inside a URL run, and the entities it does introduce (e.g. "&"
// for a literal "&" in a query string) are exactly what a browser expects inside an href
// attribute anyway. target="_blank" + rel="noopener noreferrer" so following a link never
// navigates away from (or exposes window.opener to) the page the chat widget is floating on.
function linkifyText(escapedText) {
return escapedText.replace(/https?:\/\/[^\s<]+/g, function (url) {
var trail = '';
var m = url.match(/[.,!?:;)\]}'"]+$/);
if (m) { trail = m[0]; url = url.slice(0, -trail.length); }
if (!url) return trail;
return '' + url + '' + trail;
});
}
// A shared location (LOC_MARKER — see parseInlineMeta()) renders as a tappable card
// linking to Google Maps, matching how the Android app opens a geo: intent for the
// same coordinates. Uses an https:// maps URL instead since geo: isn't reliably
// clickable in desktop browsers.
function locationLinkHtml(lat, lng) {
var mapUrl = 'https://www.google.com/maps?q=' + encodeURIComponent(lat) + ',' + encodeURIComponent(lng);
return ''
+ '📍 ' + escHtml(LOC_LABEL) + '';
}
})(jQuery);
co| Page 15 | taleoi.com
Con mucho entusiasmo queremos compartir parte de la experiencia vivida por nuestros compañeros en el Centro de Interés ExpresArte, en las líneas de dibujo técnico y pintura al óleo.
Durante esta...
NEM: Educación ambiental que se convierte en acción
El compromiso con el cuidado del medio ambiente también se construye desde las aulas. En la Institución Educativa INEM José Eustasio Rivera de...
En el corazón de Leticia, Amazonas, se encuentra una institución que durante décadas ha acompañado la formación de generaciones de jóvenes: la Institución Educativa INEM José Eustasio Rivera.
El INEM...
En el marco del 31 de agosto, Día Internacional de los Afrodescendientes, la Policía Nacional reafirma su compromiso con el respeto por la diversidad cultural, la inclusión y la garantía de los...
Leticia, Amazonas. En el marco de las estrategias de prevención y acercamiento con la comunidad, la Seccional de Carabineros y Protección Ambiental de la Policía Nacional participó en el espacio...
Leticia, Amazonas. En el marco de las acciones adelantadas contra el tráfico de estupefacientes, la Policía Nacional de Colombia, a través de las Seccionales de Investigación Criminal e Inteligencia...
Reedwood CA., agosto 28 de 2026- La IA está transformando la ciberseguridad a una velocidad extraordinaria. Check Point Research ya está detectando ataques impulsados por IA en la práctica, revelando...
La Policía Nacional de Colombia, a través de la Seccional de Investigación Criminal e Inteligencia, desarrolla planes preventivos y de control orientados a prevenir el hurto de vehículos y...
Leticia, Amazonas. La Policía Nacional de Colombia, a través de la Seccional de Carabineros y Protección Ambiental, participó en un espacio de la Radio Policía Leticia 98.9 FM, donde compartió con la...
La Policía Nacional de Colombia, mediante labores de patrullaje, vigilancia y el apoyo del sistema de cámaras de videovigilancia, logró la captura en flagrancia de un ciudadano por el delito de hurto...
Leticia, Amazonas. En el marco de las actividades de registro, control y solicitud de antecedentes, la Policía Nacional de Colombia logró la captura de un ciudadano requerido mediante Notificación...
Policía Nacional refuerza acciones de seguridad y prevención para las elecciones del 31 de mayo en Leticia
En el espacio radial Cuéntale al Comandante, el comandante de la Estación de Policía Leticia, mayor Gelly Adalberto Mulato Nieva, socializó las acciones de seguridad y prevención que viene adelantando la Policía Nacional con motivo de las eleccion...read more
En el espacio radial Cuéntale al Comandante, el comandante de la Estación de Policía Leticia, mayor Gelly Adalberto Mulato Nieva, socializó las acciones de seguridad y prevención que viene adelantando la Policía Nacional con motivo de las elecciones previstas para el próximo 31 de mayo de 2026.
Durante la jornada, el oficial destacó el despliegue operativo y las estrategias implementadas para garantizar el orden público, la tranquilidad ciudadana y el normal desarrollo de la jornada democrática en el municipio y el departamento del Amazonas.
Asimismo, se informó sobre el fortalecimiento de los controles preventivos, los planes de vigilancia en puntos estratégicos, el acompañamiento institucional y las campañas de sensibilización dirigidas a la comunidad, con el propósito de promover unas elecciones seguras, transparentes y en paz.
El mayor Gelly Adalberto Mulato Nieva reiteró el compromiso de la Policía Nacional con la protección de los derechos ciudadanos e hizo un llamado a la comunidad para denunciar cualquier situación que pueda afectar la convivencia y la seguridad durante el proceso electoral.
La Policía Nacional continuará trabajando de manera articulada con las autoridades civiles, militares y organismos de control para garantizar que los amazonenses puedan ejercer su derecho al voto con total tranquilidad y confianza.
CNE capacita a la OEA para la observación de las Elecciones 2026
El Consejo Nacional Electoral desarrolló una jornada de capacitación dirigida a la Misión de Observación Electoral de la OEA, en la que se abordaron aspectos relacionados con el funcionamiento del sistema electoral colombiano, las etapas del proce...read more
El Consejo Nacional Electoral desarrolló una jornada de capacitación dirigida a la Misión de Observación Electoral de la OEA, en la que se abordaron aspectos relacionados con el funcionamiento del sistema electoral colombiano, las etapas del proceso electoral y los procedimientos de escrutinio que se implementan en el país.
Durante este espacio de intercambio técnico e institucional, se socializaron herramientas, metodologías y mecanismos que permiten fortalecer la transparencia, la vigilancia y las garantías dentro de los procesos democráticos, promoviendo además el acompañamiento y la cooperación internacional en el marco de las próximas #Elecciones2026.
Con este tipo de encuentros, el CNE continúa avanzando en acciones orientadas al fortalecimiento de la confianza ciudadana, la integridad electoral y la articulación con organismos internacionales comprometidos con la observación y el seguimiento de los procesos democráticos.
Reconocimiento Especial a integrantes de la defensa civil en puerto Nariño
Desde la Defensa Civil Colombiana Seccional Nacional, realizó un reconocimiento especial a todos los voluntarios pertenecientes a la institución, destacando de manera especial a los voluntarios del municipio de Puerto Nariño, quienes durante más d...read more
Desde la Defensa Civil Colombiana Seccional Nacional, realizó un reconocimiento especial a todos los voluntarios pertenecientes a la institución, destacando de manera especial a los voluntarios del municipio de Puerto Nariño, quienes durante más de 35 años han venido prestando su servicio con compromiso, entrega y vocación a la comunidad.
Este importante trabajo ha sido posible gracias al gran apoyo y acompañamiento de la Administración Municipal encabezado por el Señor Alcalde Beto Suárez, fortaleciendo las labores humanitarias, de prevención y atención al servicio de la población.
Jornada de recuperación ambiental en la vía Leticia Taracapá fortalece espacios comunitarios
En el marco de la estrategia “Apoyamos la Justicia Restaurativa”, se llevó a cabo una jornada de poda, limpieza y recolección de residuos sólidos sobre la vía Leticia–Tarapacá, gracias al trabajo articulado entre las autoridades competentes, el In...read more
En el marco de la estrategia “Apoyamos la Justicia Restaurativa”, se llevó a cabo una jornada de poda, limpieza y recolección de residuos sólidos sobre la vía Leticia–Tarapacá, gracias al trabajo articulado entre las autoridades competentes, el Instituto Nacional Penitenciario y Carcelario INPEC y las Personas Privadas de la Libertad.
La actividad tuvo como propósito contribuir al mejoramiento y recuperación de espacios comunes y zonas verdes, promoviendo entornos más limpios, seguros y agradables para la comunidad. Durante la jornada se realizaron labores de mantenimiento, retiro de residuos y adecuación de áreas que requerían intervención.
Estas acciones hacen parte de los procesos de justicia restaurativa que buscan generar impactos positivos en el territorio, fortaleciendo el compromiso con el cuidado ambiental, la responsabilidad social y la construcción de una cultura de corresponsabilidad ciudadana.
Con este tipo de iniciativas se continúa trabajando por el embellecimiento de los espacios públicos y la preservación del entorno, en beneficio de todos los habitantes del municipio.
Policía Nacional socializó acciones del Plan Democracia para garantizar la seguridad electoral
En el espacio radial “Cuéntele al Comandante”, la Policía Nacional presentó a la comunidad las acciones operativas y preventivas contempladas en el Plan Democracia, estrategia diseñada para garantizar la seguridad, el orden público y el normal des...read more
En el espacio radial “Cuéntele al Comandante”, la Policía Nacional presentó a la comunidad las acciones operativas y preventivas contempladas en el Plan Democracia, estrategia diseñada para garantizar la seguridad, el orden público y el normal desarrollo de la jornada electoral prevista para el próximo 31 de mayo.
Durante la emisión, se dieron a conocer las medidas de vigilancia, control y acompañamiento que se implementarán antes, durante y después de las elecciones, con el fin de proteger el ejercicio democrático y brindar tranquilidad a la ciudadanía.
La institución destacó el trabajo articulado con las autoridades civiles, militares y organismos de control para asegurar que los comicios se desarrollen en un ambiente de transparencia, respeto y seguridad en todo el territorio.
Asimismo, hizo un llamado a la comunidad a participar de manera responsable en la jornada electoral, acatar las disposiciones vigentes y reportar oportunamente cualquier situación que pueda afectar el normal desarrollo del proceso democrático.
Con estas acciones, la Policía Nacional reafirma su compromiso de velar por la convivencia, la seguridad ciudadana y la protección de los derechos de todos los ciudadanos durante esta importante jornada para el país.
Se realizó el Primer Comité Interinstitucional 2026 contra el Contrabando en el Amazonas
Con el propósito de fortalecer las acciones de control y prevención del contrabando en el departamento, el Grupo Anticontrabando de la Oficina de Rentas Departamental, adscrito a la Secretaría de Hacienda de la Gobernación del Amazonas, llevó a ca...read more
Con el propósito de fortalecer las acciones de control y prevención del contrabando en el departamento, el Grupo Anticontrabando de la Oficina de Rentas Departamental, adscrito a la Secretaría de Hacienda de la Gobernación del Amazonas, llevó a cabo el Primer Comité Interinstitucional 2026, con la participación de las entidades y aliados estratégicos que integran esta importante estrategia.
Durante la jornada se socializaron los avances obtenidos en materia operativa y financiera durante el primer trimestre de 2026. En el componente operativo se presentaron los resultados de las campañas de sensibilización dirigidas a comerciantes y ciudadanía en general, las cifras de incautaciones realizadas y las acciones desarrolladas para impactar redes dedicadas al contrabando que afectan la economía y el bienestar de los amazonenses.
Asimismo, se expusieron los avances financieros alcanzados en el marco de la ejecución de las actividades contempladas para la vigencia 2026, destacando el compromiso institucional con la protección de las rentas departamentales.
La Gobernación del Amazonas resaltó la importancia del trabajo articulado entre las diferentes entidades participantes, reafirmando su compromiso de continuar fortaleciendo las estrategias de control y vigilancia para combatir el comercio ilegal.
Estas acciones contribuyen a la protección de recursos que se destinan a sectores fundamentales como la salud, la educación y el deporte, beneficiando de manera directa a toda la población del departamento del Amazonas.
CNE revisa software de Escrutinio Nacional para las Elecciones 2026
Luis Arnulfo Morales Guzmán, jefe de la Oficina de Tecnologías de la Información del CNE, acompañó la jornada de revisión técnica del software de Escrutinio Nacional junto a representantes de partidos políticos y organismos de control.
Luis Arnulfo Morales Guzmán, jefe de la Oficina de Tecnologías de la Información del CNE, acompañó la jornada de revisión técnica del software de Escrutinio Nacional junto a representantes de partidos políticos y organismos de control.
Este espacio permitió avanzar en la verificación y fortalecimiento de las herramientas tecnológicas que harán parte del proceso electoral, reafirmando el compromiso con la transparencia, la confianza institucional y las garantías democráticas rumbo a las #Elecciones2026.
Con estas acciones, el Consejo Nacional Electoral continúa trabajando de manera articulada para consolidar un proceso electoral legítimo, seguro y con plenas garantías para todos los actores políticos y la ciudadanía.
Segunda Comisión Intersectorial de Juventud fortalece acciones para las juventudes del Amazonas
La Dirección de Equidad de Género, Infancia, Adolescencia y Juventud lideró la segunda sesión de la Comisión Intersectorial de Juventud, un espacio de articulación institucional orientado al fortalecimiento de las políticas, programas y estrategia...read more
La Dirección de Equidad de Género, Infancia, Adolescencia y Juventud lideró la segunda sesión de la Comisión Intersectorial de Juventud, un espacio de articulación institucional orientado al fortalecimiento de las políticas, programas y estrategias dirigidas a los jóvenes del departamento del Amazonas.
Durante la jornada se realizó el seguimiento al plan de acción establecido para la vigencia 2026, evaluando los avances alcanzados y definiendo nuevas acciones que permitan continuar promoviendo oportunidades de participación, inclusión y desarrollo integral para las juventudes amazonenses.
Asimismo, se avanzó en la planificación de la Semana de la Juventud, una iniciativa que busca generar espacios de integración, formación, cultura y recreación para los jóvenes del departamento. De igual manera, se llevó a cabo la socialización de la Pasarela Secreta del Amazonas, un proyecto que resalta el talento local, la creatividad y la riqueza cultural del territorio a través de expresiones artísticas y de moda con identidad amazónica.
La Comisión Intersectorial reafirmó su compromiso de seguir trabajando de manera coordinada para impulsar acciones que contribuyan al bienestar, liderazgo y participación activa de los jóvenes en la construcción del desarrollo social del Amazonas.
Seguimos haciendo historia con vigilancia electoral: más de 370 mil testigos electorales acreditados por el CNE para las elecciones del 31 de mayo
Con el uso de tecnologías de la información, la máxima autoridad electoral del país logró una cobertura de testigos electorales superior al 98% de las mesas de votación que se instalarán en el territorio nacional.
Con el uso de tecnologías de la información, la máxima autoridad electoral del país logró una cobertura de testigos electorales superior al 98% de las mesas de votación que se instalarán en el territorio nacional.
Con una participación ciudadana sin precedentes para la vigilancia de una jornada democrática en Colombia, el Consejo Nacional Electoral cerró este jueves el proceso de postulación de actores electorales para las elecciones del próximo 31 de mayo. El reporte indica que 373.612 testigos electorales fueron registrados por las agrupaciones políticas que se encuentran en contienda.
El director de Vigilancia e Inspección Electoral del CNE, José Antonio Parra, destacó que “Esto garantiza un cubrimiento del 98.31% de las mesas en el territorio, eso quiere decir que casi que el total de las 122 mil mesas en el territorio están cubiertas”.Con este total, más del 98% de las mesas de votación habilitadas en el territorio nacional contarán con presencia de testigos electorales, fortaleciendo así las garantías de transparencia, control y seguimiento durante la jornada democrática. Este resultado representa un incremento de 191 mil testigos (105.3%), respecto del número de acreditados para las elecciones de presidente y vicepresidente de 2022. Esto refleja que el creciente compromiso de las agrupaciones políticas con la defensa de la democracia y la vigilancia del proceso
electoral.
“Es de recordar que esta postulación se da por las organizaciones políticas que inscribieron candidatos a la Presidencia y Vicepresidencia de la República, y, con posterioridad a esta postulación, el Consejo Nacional Electoral inicia el proceso de acreditación de actores electorales profiriendo las resoluciones
correspondientes para lo cual, las organizaciones políticas cuenten con las credenciales a fin que sus testigos electorales puedan ejercer control este 31 de mayo”, destacó Parra Fandiño.
En esta etapa final del proceso, el CNE avanza en la acreditación de los ciudadanos postulados, a través de la Plataforma dispuesta para ello, con el propósito de garantizar su presencia en las mesas y puestos de votación asignados. Cabe anotar que la Plataforma de Postulación y Acreditación de Actores Electorales operó de manera normal y eficiente durante todo el proceso de cargue y validación de información, consolidándose como una herramienta que fortalece la institucionalidad y brinda mayores garantías al sistema electoral colombiano.
Estudiantes de Leticia fortalecen sus conocimientos en turismo y hotelería a través de experiencia pedagógica
Con el propósito de brindar herramientas de aprendizaje que fortalezcan las competencias de los jóvenes en el sector turístico, la Dirección de Turismo continúa impulsando espacios formativos que acercan a los estudiantes a la realidad de esta imp...read more
Con el propósito de brindar herramientas de aprendizaje que fortalezcan las competencias de los jóvenes en el sector turístico, la Dirección de Turismo continúa impulsando espacios formativos que acercan a los estudiantes a la realidad de esta importante actividad económica para la región.
En esta oportunidad, estudiantes de grado décimo de la Institución Educativa San Juan Bosco participaron en una salida pedagógica al Hotel Waira Suites, donde tuvieron la oportunidad de conocer de primera mano los protocolos y procesos de atención al cliente que se desarrollan en las diferentes áreas de operación del establecimiento.
Durante la visita, los jóvenes recorrieron espacios como recepción, restaurante, cocina, habitaciones y mantenimiento, permitiéndoles comprender el funcionamiento integral de un hotel y reconocer la importancia de cada proceso en la prestación de un servicio de calidad.
La actividad se desarrolló en el marco de los talleres del Programa Nacional Colegios Amigos del Turismo, una estrategia que promueve el aprendizaje práctico, el fortalecimiento de habilidades y la orientación vocacional de los estudiantes hacia el sector turístico y hotelero.
La Dirección de Turismo destacó la importancia de este tipo de experiencias formativas, que contribuyen al desarrollo de capacidades y al fortalecimiento del talento humano local, preparando a las nuevas generaciones para participar activamente en el crecimiento del turismo en el Amazonas.
La unidad de Servicios Públicos y Bomberos fortalecen acciones para mantener limpia a Leticia
La Unidad de Servicios Públicos, en articulación con el Cuerpo de Bomberos, continúa adelantando jornadas y estrategias enfocadas en el cuidado, la limpieza y el embellecimiento del municipio de Leticia.
La Unidad de Servicios Públicos, en articulación con el Cuerpo de Bomberos, continúa adelantando jornadas y estrategias enfocadas en el cuidado, la limpieza y el embellecimiento del municipio de Leticia.
El gerente de la entidad, junto al equipo operativo y de emergencia, viene liderando acciones orientadas a fortalecer la cultura ciudadana y promover el compromiso de la comunidad con el adecuado manejo de los espacios públicos.
Estas labores buscan mantener una ciudad más limpia, organizada y agradable para residentes y visitantes, reafirmando el compromiso de la administración municipal con el bienestar colectivo y la protección del entorno.
Desde la Unidad de Servicios Públicos se hizo un llamado a toda la ciudadanía para sumarse a estas iniciativas, adoptando buenas prácticas como la correcta disposición de residuos, el cuidado de las zonas comunes y el respeto por el espacio público.
La administración municipal reiteró que el trabajo articulado entre las instituciones y la comunidad es fundamental para seguir construyendo una Leticia más limpia, bella y con mayor sentido de pertenencia.