';
}
// 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);
world taleoi | Page 577 | taleoi.com
La reina Isabel II ha muerto en su residencia de Balmoral a los 96 años, después de un reinado de 70 años.
"La reina murió en paz en Balmoral esta tarde", anunció el Palacio de Buckingham este jueves.
"El rey (Carlos) y la reina consorte (Camila) permanecerán en Balmoral esta noche y volverán a Londres mañana (viernes)".
Tras llegar al trono en 1952, la reina Isabel protagonizó el reinado más extenso de la historia británica, marcado por su fuerte sentido del deber y su determinación por dedicar su vida al trono y a su pueblo.
DÍA DE LAS COMETAS EN EL CORREGIMIENTO DE TARAPACÁ - AMAZONAS
La Policía Nacional, elevo sueños y sonrisas en un rato de esparcimiento con la comunidad amazonense
Hasta en las zonas más apartadas del país, la institución seguirá garantizando la seguridad y convivencia ciudadana.
En el área no municipalizada de Tarapacá – Amazonas, a más de 2 horas vía aérea desde el municipio de Leticia, los hombre...read more
Hasta en las zonas más apartadas del país, la institución seguirá garantizando la seguridad y convivencia ciudadana.
En el área no municipalizada de Tarapacá – Amazonas, a más de 2 horas vía aérea desde el municipio de Leticia, los hombres y mujeres que conforman la Subestación de Policía Tarapacá, conmemoraron el día de las cometas con la ayuda del sector comercio, docentes de la institución educativa villa Carmen y la inspección de Policía de esa jurisdicción.
En la actividad participaron más de 300 personas, donde las familias disfrutaron de un rato de esparcimiento con la Policía Nacional, quienes premiaron las mejores cometas diseñadas por los niños, niñas y adolescentes en compañía de sus padres.
“Estas actividades no se desarrollan a menudo”, manifestó uno de los participantes, felicitando la labor de los integrantes de la institución, quienes día tras día velan por la seguridad y convivencia del corregimiento de Tarapacá.
Imponente desfile militar en el Amazonas, fortalece los lazos de amistad entre Colombia y Brasil
En una ceremonia encabezada por los Altos Mandos de las Fuerzas Militares y la Policía Nacional de los países hermanos presentes en la Triple Frontera inició la conmemoración de los 200 años de libertad del país vecino, el Grupo Aéreo del Amazonas...read more
En una ceremonia encabezada por los Altos Mandos de las Fuerzas Militares y la Policía Nacional de los países hermanos presentes en la Triple Frontera inició la conmemoración de los 200 años de libertad del país vecino, el Grupo Aéreo del Amazonas en representación de la Fuerza Aérea Colombiana desfiló en el tradicional desfile del 7 de septiembre en conmemoración a la Independencia de Brasil.
Durante el recorrido por las principales vías de Tabatinga los hombres de la Base Aérea, marcharon con orgullo y elegancia ante la comunidad, quienes con aplausos y sonrisas mostraron su agradecimiento por ser partícipes de tan importante efeméride la cual, hace más de dos años no se realizaba por la emergencia sanitaria presentada por el COVID-19.
Asimismo, en el desfile militar se realizó una demostración de capacidades de la institución aérea en donde desfilaron pilotos, personal de Seguridad y Defensa de Bases, Oficiales, Suboficiales y soldados del Grupo Aéreo del Amazonas.
De esta manera, los hombres de su Fuerza Aérea Colombiana, fortalecen las buenas relaciones y ratifican los lazos de hermandad, uniéndose al mensaje de paz entre países de frontera demostrando fraternidad, unión y armonía entre las instituciones militares para beneficio y desarrollo de la región.
Tabatinga conquista ouro no arremesso de peso nesta quarta fera
Foto: Sejel Tabatinga
Na manhã desta quarta-feira (07/09) o município de Tabatinga, conquistou mais uma medalha de ouro com o atleta de arremesso de peso Joao Felipe Pereira, que é aluno do Instituto Federal do Amazonas (IFAM).
Cinco homens foram presos na última quarta-feira, 7, durante uma operação policial que culminou na apreensão de 274 kg de drogas avaliadas em cerca de R$ 2,5 milhões. O caso aconteceu em Feira de Santana, cidade distante cerca de 110 km de Salvado...read more
Cinco homens foram presos na última quarta-feira, 7, durante uma operação policial que culminou na apreensão de 274 kg de drogas avaliadas em cerca de R$ 2,5 milhões. O caso aconteceu em Feira de Santana, cidade distante cerca de 110 km de Salvador.
De acordo com informações policiais, as drogas foram encontradas escondidas na cabine de um caminhão que estava em um estacionamento na Rua Barão de Cotegipe, no centro da cidade. No veículo foi encontrado maconha, crack e cocaína.
A operação teve início após a polícia receber denúncias sobre um caminhão que estaria descarregando droga na cidade. Os criminosos aproveitavam a pouco movimentação da noite para realizar as entregas.
Entre os cinco homens presos estão o motorista do caminhão, que fazia a entrega, e os demais, que seriam responsáveis pela distribuição das drogas nos bairros de Feira de Santana.
A operação foi realizada por uma equipe da Delegacia de Tóxicos e Entorpecentes (DTE/Draco). A polícia ainda investiga de onde veio a droga.
Avión ambulancia transportó a dos pacientes que requerían ser evacuados con urgencia en el Amazonas
Su Fuerza Aérea Colombiana, en coordinación con el Centro Nacional de Recuperación de personal (CNRP), reaccionó de forma inmediata para realizar la evacuación aeromédica de un hombre de 45 años de edad y una mujer de 65 años de edad, quienes requ...read more
Su Fuerza Aérea Colombiana, en coordinación con el Centro Nacional de Recuperación de personal (CNRP), reaccionó de forma inmediata para realizar la evacuación aeromédica de un hombre de 45 años de edad y una mujer de 65 años de edad, quienes requerían ser transportados desde Leticia hasta Bogotá.
Los pacientes fueron trasladados debido a que debían ser atendidos en un centro de mayor nivel por médicos especialistas, según el diagnóstico; el hombre obtuvo un hallazgo incidental de masa a nivel cerebral desconocido y la mujer presentaba un accidente cerebrovascular, secundario a una crisis hipertensiva.
Esta misión se llevó a cabo en una aeronave medicalizada tipo King 350 de su Fuerza Aérea Colombiana, la cual despegó desde el Comando Aéreo de Transporte Militar (CATAM) y aterrizó en la rampa del Grupo Aéreo del Amazonas, donde se realizó el abordaje de los pacientes, quienes estuvieron monitoreados durante el vuelo por el por el personal militar de la salud de la Institución Aérea.
De esta manera, las aeronaves medicalizadas y tripulaciones de los aviones ambulancia de su Fuerza Aérea Colombiana, se encuentran a disposición de los habitantes de cada región del país, en especial en el sur del país para salvaguardar la vida de los amazonenses y fortalecer la capacidad de respuesta en atención a emergencias.
Mauricio Toro se posesionó como presidente del ICETEX
Bogotá D.C., septiembre 5 de 2022. Ante el secretario General del Ministerio de Hacienda, Juan Manuel Russy Escobar, tomó posesión este lunes Mauricio Andrés Toro Orjuela como presidente del ICETEX, cargo que asume para liderar a esta entidad ante...read more
Bogotá D.C., septiembre 5 de 2022. Ante el secretario General del Ministerio de Hacienda, Juan Manuel Russy Escobar, tomó posesión este lunes Mauricio Andrés Toro Orjuela como presidente del ICETEX, cargo que asume para liderar a esta entidad ante los importantes retos que materializarán el fortalecimiento de su misión social con una financiación justa para el acceso a la educación superior.
La llegada de Toro al ICETEX se da en un momento importante para la educación superior del país, y en el que esta entidad cumple un rol determinante como adscrita al Ministerio de Educación Nacional. Bajo su liderazgo, el directivo designado asume importantes retos para la entidad, que apuntan a la humanización y modernización del Instituto que refleje el fortalecimiento de su misión social, lograr la reducción de las tasas de interés de su crédito educativo, la diversificación y competitividad de sus fuentes de fondeo, la reducción de su carga administrativa y garantizar mejores condiciones en la financiación para que estas sean justas con el usuario.
El nuevo presidente del ICETEX es Politólogo de la Universidad Javeriana, especialista en Innovación y Desarrollo de Negocios de la Universidad Externado, y Magister en Administración de Empresas del ISEAD Business School, asociado a la Universidad Complutense de Madrid.
Nacido en Armenia (Quindío), Mauricio Toro inició su experiencia profesional en la planeación, ejecución, evaluación y divulgación de proyectos de fortalecimiento de gobiernos locales en la Federación Colombiana de Municipios.
Ha sido profesor universitario, gerente General y director de Mentalidad y Cultura de Innovación de iNNpulsa Colombia, entidad dedicada al fomento del emprendimiento, la competitividad empresarial y la innovación. También, fue ganador en 2011 del Premio de Innovación en desarrollo de producto de la Cámara de Comercio de Bogotá en el marco de la Semana Global del Emprendimiento y seleccionado en 2016 como uno de los 10 jóvenes más sobresalientes de Colombia.
Toro fue Representante a la Cámara en el Período Constitucional 2018 – 2022 por el Partido Verde, e integrante de la Comisión Séptima Constitucional, donde se discuten los temas relacionados con la salud; el estatuto del servidor público y del trabajador particular; el régimen salarial y prestacional; fondos de prestaciones; seguridad social; asuntos de la mujer y de la familia; organizaciones comunitarias; vivienda; economía solidaria; sociedades de acuerdo mutuo y organizaciones sindicales. También fue parte de la Comisión Legal de Investigación y Acusación y presidente de la Comisión Accidental por el Emprendimiento.
Por su desempeño legislativo, fue elegido por 4 años consecutivos como uno de los 10 mejores Representantes a la Cámara, por el Panel de Opinión. Además, ha sido conferencista TED y es coautor del libro ‘¿Qué transmite su marca? Estrategias para innovar’.
INFLUENCER CON PROPÓSITO: MARILYN JISELA, LA INFLUENCIADORA COLOMBIANA REPARTE 2.500 CHOCORAMOS EN LAS CALLES DE CALI
COLOMBIA, SEPTIEMBRE DE 2022. MARILYN JISELA, la creadora de contenido digital colombiana decidió salir a las calles de la...read more
INFLUENCER CON PROPÓSITO: MARILYN JISELA, LA INFLUENCIADORA COLOMBIANA REPARTE 2.500 CHOCORAMOS EN LAS CALLES DE CALI
COLOMBIA, SEPTIEMBRE DE 2022. MARILYN JISELA, la creadora de contenido digital colombiana decidió salir a las calles de la ciudad de Cali para comprar 2.500 Chocoramos entre los diferentes vendedores ambulantes y tenderos de la capital vallecaucana. Y, repartirlos entre sus habitantes de calle, niñ@s y adultos que no pueden acceder el famoso ponqué.
La iniciativa surge de las últimas noticias y rumores, pues al parecer el icónico producto colombiano subirá su precio. Por esto, Marilyn quiere contribuir un poco, generando recursos por medio de su compra masiva y llenando de sonrisas a los que viven en las calles de su ciudad natal.
"Para mi siempre ha sido importante influenciar de buena manera a mis seguidores, por eso sé que con la labor que he venido desarrollando en los últimos años en las redes sociales tengo una responsabilidad, no solo la de generar un contenido de calidad e interesante, sino que también de impactar de manera positiva la vida de las personas", Asegura la influencer caleña.
Con 2 millones de seguidores en Facebook y más de un millón en Instagram, la influencer de 21 años quien empezó a crear contenido desde el 2016, quiere dejar una huella y retribuir de alguna manera todo el apoyo que ha recibido de sus seguidores, como ella misma lo dice: "Mi propósito es devolver un poco de felicidad a los que me han acompañado durante todos estos años".
Cabe resaltar que Marilyn Jisela se ha dado a conocer por llevar a cabo diferentes acciones como regalar varios electrodomésticos como propina a domiciliarios, repartir 1.000 hamburguesas a habitantes de calle de la ciudad de Cali junto al también influencer Jordan Hurtado. Además, llevar de viaje a Cartagena a 4 vendedoras informales con todos los gastos pagos para que conocieran el mar.
Benjamin Constant vence Atalaia do Norte no futsal masculino
Cerca de duas mil pessoas lotaram o ginásio João Correa de Oliveira, na noite desta terça-feira (06/09) para assistirem o jogo mais esperado da noite. As seleções de Benjamin Constant e Atalaia do Norte, se enfrentaram no futsal masculino.
Cerca de duas mil pessoas lotaram o ginásio João Correa de Oliveira, na noite desta terça-feira (06/09) para assistirem o jogo mais esperado da noite. As seleções de Benjamin Constant e Atalaia do Norte, se enfrentaram no futsal masculino.
Logo no início da partida, Atalaia do Norte cometeu erros, que culminou no primeiro gol da anfitriã BC. Erros a parte, a seleção come jambo realizava um jogo que agradava a torcida atalaiense. Mesmo assim, a seleção benjaminense ampliou o placar para 2 a 0.
Com toques refinados, atalaia do Norte, pode encurtar o placar para 2 a 1. As duas seleções apresentaram maturidade e competência para proporcionarem tamanho espetáculo a torcida presente, prevalecendo o bom futebol.
Já no segundo tempo, com jogo equilibrado, BC consegue ampliar o placar para 3 a 1, levando os benjaminenses ainda mais eufóricos. Faltando poucos minutos para o fim da partida, Atalaia do Norte, diminuiu mais uma vez para 3 a 2, mas já era tarde para uma virada.
Fim de jogo: Benjamin Constant 3, Atalaia do Norte 2.