';
}
// 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 14 | taleoi.com
Más de 10 empresas participarán de este evento, con una nueva oferta que
cambiará los esquemas de producción en Colombia
Los fabricantes de calzado del país reciben con excelentes expectativas los insumos
que traen al país, las más importantes empresas de Brasil. Estos encuentros se
darán en el marco de la feria International Footwear and Leather Show (I...read more
Los fabricantes de calzado del país reciben con excelentes expectativas los insumos
que traen al país, las más importantes empresas de Brasil. Estos encuentros se
darán en el marco de la feria International Footwear and Leather Show (IFLS) y la
Exhibición Internacional del Cuero e Insumos, Maquinaria y Tecnología (EICI), con
una completa muestra que inspira diseños.
Brasil es primer productor de calzado de occidente y aplica para su fabricación, las
innovaciones tanto en procesos como en productos y ya desde hace varios años,
traslada todo su conocimiento e insumos para la industria colombiana.
La delegación de empresas brasileñas que llega al país a través del programa de
internacionalización Brazilian Materials, creado por la Asociación Brasileña de
Empresas de Componentes del Cuero, Calzado y Artefactos (Assintecal) en asocio
con la Agencia Brasileña de Promoción de Exportaciones e Inversiones (ApexBrasi),
trae la más completa muestra de insumos creados con tecnologías de avanzada y
cumpliendo con los parámetros globales de sostenibilidad.
Empresas como Corium, Zahonero, Usicon, DWC, HG, Maquetec, Rodamatrizes,
Sassá Fitas, Usicon, Usitec, J&S Metais y IBK, compartirán información técnica y
sus insumos.
Mercado colombiano
Colombia es uno de los países objetivo del programa Brazilian Materials, creado por
Assintecal, Asociación Brasileña de Empresas de Componentes para Cuero,
Calzado y Accesorios, con el apoyo de la Agencia de Promoción de Exportaciones e
Inversiones, Apex-Brasil.
Con esta iniciativa, la asociación establece en el país alianzas con empresarios y
asociaciones locales, para la puesta en funcionamiento de un programa de
intercambio tecnológico. “Colombia es y será un mercado muy importante para la
industria de insumos de Brasil. Nuestro objetivo es lograr alianzas de doble vía que
beneficien a los fabricantes colombianos y a los proveedores brasileños. Estamos
adelantando una gestión comercial, para hacer de Colombia un gran importador
mezclado con una estrategia de aporte en lo académico y en el desarrollo de
productos e innovaciones”, afirma Luiz Ribas, director de mercados internacionales
de Assintecal.
Luiz Ribas aseguró que Colombia ha sido históricamente el tercer o cuarto principal
socio comercial de Brasil en insumos para el sector y que, en 2025 los resultados
fueron muy positivos, con exportaciones hacia nuestro país de US$8.000 millones,
lo que refleja un crecimiento del 15% frente a 2024.
Además, indicó que la industria de insumos de Brasil cuenta con una sólida
estructura de investigación en tendencias y moda, que busca incorporar estos
desarrollos en sus productos y transferirlos al sector colombiano del calzado, listos
para incidir en el producto terminado.
Estas innovaciones en insumos y calzado terminado de Brasil podrán apreciarse en
la feria del cuero, el calzado y la marroquinería del 3 al 5 de agosto en Corferias.
El Director General presenta un balance institucional centrado en la seguridad, la dignidad y el servicio.
El Director General presenta un balance institucional centrado en la seguridad, la dignidad y el servicio.
Como parte del compromiso con la transparencia y el servicio a la ciudadanía, el Director General de la Policía Nacional, señor General William Rincón Zambrano, presentó un balance institucional que destaca los avances alcanzados en bienestar del ...read more
Como parte del compromiso con la transparencia y el servicio a la ciudadanía, el Director General de la Policía Nacional, señor General William Rincón Zambrano, presentó un balance institucional que destaca los avances alcanzados en bienestar del talento humano, fortalecimiento de las capacidades operativas y resultados contundentes en la lucha contra el multicrimen.
El informe resalta las inversiones realizadas para mejorar la salud y la calidad de vida de los uniformados, el fortalecimiento de los procesos de formación e incorporación, así como importantes resultados operacionales en materia de seguridad ciudadana, lucha contra el narcotráfico, protección ambiental y reducción del delito.
Asimismo, se reafirma el compromiso de la Institución con una seguridad basada en el respeto por los derechos humanos, el diálogo y la cercanía con la comunidad, consolidando un modelo de servicio que sitúa la dignidad y la protección de la vida en el centro de la labor policial.
Fuerzas Militares y Policía Nacional participaron en el desfile conmemorativo del 20 de Julio en Leticia
En el marco de la conmemoración del 216 aniversario del Grito de Independencia de Colombia, las Fuerzas Militares y la Policía Nacional participaron de manera destacada en el tradicional desfile militar y policial realizado en el municipio de Leti...read more
En el marco de la conmemoración del 216 aniversario del Grito de Independencia de Colombia, las Fuerzas Militares y la Policía Nacional participaron de manera destacada en el tradicional desfile militar y policial realizado en el municipio de Leticia, reafirmando su compromiso con la defensa de la soberanía, la seguridad y la convivencia ciudadana.
Durante el recorrido, las diferentes unidades militares y policiales hicieron presencia con sus hombres y mujeres, quienes desfilaron con disciplina, gallardía y sentido de pertenencia, recibiendo el reconocimiento y los aplausos de la comunidad. La actividad permitió exaltar la vocación de servicio de quienes, día a día, trabajan por la protección de los habitantes del departamento del Amazonas.
El desfile contó con la asistencia de autoridades civiles, militares, eclesiásticas y comunidad en general, consolidándose como un espacio de integración y orgullo patrio, en el que se rindió homenaje a los héroes de la independencia y a quienes hoy continúan velando por la paz, el orden y la tranquilidad de los colombianos.
La próxima edición de la International Footwear & Leather Show (IFLS+EICI), tendrá lugar del 3 al 5 de agosto
En la feria, cuatro empresas brasileñas exhibirán al mercado
colombiano la innovación
La mayor industria de calzado de Occidente desembarcará en la próxima edición de la
International Footwear & Leather Show (IFLS+EICI), que tendrá lugar del 3 al 5 de agosto
en Corferias, Bogotá. En la feria, cuatro empresas brasile...read more
La mayor industria de calzado de Occidente desembarcará en la próxima edición de la
International Footwear & Leather Show (IFLS+EICI), que tendrá lugar del 3 al 5 de agosto
en Corferias, Bogotá. En la feria, cuatro empresas brasileñas exhibirán al mercado
colombiano la innovación, el diseño y la sostenibilidad del calzado hecho en Brasil, con el
apoyo de Brazilian Materials, programa desarrollado por la Agencia Brasileña de Promoción
de Exportaciones e Inversiones (ApexBrasil) y la Asociación Brasileña de Empresas de
Componentes para Cuero, Calzado y Artefactos (Assintecal).
La presencia de estas compañías refleja el interés de la industria brasileña por consolidar su
actuación en el mercado colombiano, uno de los principales destinos de las exportaciones
de calzado en América Latina y un mercado estratégico por su dinamismo y cercanía
comercial. A través de su presencia en IFLS + EICI, las empresas buscarán fortalecer
relaciones con distribuidores, mayoristas, retailers y compradores especializados de
Colombia y otros países de la región.
Las cuatro empresas reflejan la diversidad, la innovación, el diseño y la capacidad
productiva de la industria brasileña.
● Calçados Beira Rio presentará colecciones que combinan moda, comodidad y
versatilidad, incorporando las últimas tendencias internacionales con una propuesta
accesible para diferentes perfiles de consumidor.
● Bottero, reconocida por la calidad de sus cueros y acabados, exhibirá líneas que
mezclan diseño contemporáneo, sofisticación y confort, dirigidas a consumidores
que buscan productos con mayor valor agregado.
● Piccadilly, referente mundial en calzado femenino confortable, llegará con
tecnologías enfocadas en el bienestar y la ergonomía, ofreciendo soluciones que
responden a las necesidades de las mujeres actuales sin renunciar al estilo.
● Kidy, especializada en calzado infantil, mostrará productos desarrollados para
acompañar el crecimiento de los niños, priorizando la comodidad, la seguridad y el
desarrollo saludable de los pies.
Actualmente, Brasil ocupa el segundo lugar entre los proveedores internacionales de
calzado de Colombia, un mercado que, además de la producción local, recurre en gran
medida a las importaciones para cubrir su demanda interna. De enero a junio, las
exportaciones de calzado desde Brasil hacia Colombia alcanzaron los 3.826.762 pares, por
un valor acumulado de US$18.167.302, cifras que confirman a nuestro país como el 6to.
socio comercial más importantes para este sector.
Policía Nacional fortalece la seguridad durante el Festival Internacional de la Confraternidad Amazónica 2026
Con el propósito de garantizar el normal desarrollo del Festival Internacional de la Confraternidad Amazónica 2026, la Policía Nacional ha dispuesto un amplio dispositivo de seguridad, prevención y control, orientado a proteger a residentes, turis...read more
Con el propósito de garantizar el normal desarrollo del Festival Internacional de la Confraternidad Amazónica 2026, la Policía Nacional ha dispuesto un amplio dispositivo de seguridad, prevención y control, orientado a proteger a residentes, turistas y participantes que disfrutan de esta importante celebración cultural.
El despliegue operativo contempla la presencia permanente de uniformados en escenarios de alta afluencia de público, actividades culturales, artísticas y recreativas, así como acciones de vigilancia, regulación de la movilidad, prevención de comportamientos contrarios a la convivencia y acompañamiento a los diferentes eventos programados.
De manera articulada con las autoridades locales y los organismos de apoyo, se desarrollan estrategias enfocadas en preservar el orden público, fortalecer la convivencia ciudadana y brindar una respuesta oportuna ante cualquier eventualidad, permitiendo que propios y visitantes disfruten de las festividades en un ambiente seguro y de tranquilidad.
Amazonas sorprende en el ring y conquista cuatro medallas en Campeonato Nacional de Boxeo
El departamento del Amazonas dejó en alto el nombre de la región durante su participación en el Campeonato Nacional de Boxeo, realizado en la ciudad de Bogotá, al obtener un destacado balance de tres medallas de bronce y una medalla de plata.
El departamento del Amazonas dejó en alto el nombre de la región durante su participación en el Campeonato Nacional de Boxeo, realizado en la ciudad de Bogotá, al obtener un destacado balance de tres medallas de bronce y una medalla de plata.
Los deportistas amazonenses demostraron talento, disciplina y determinación en cada combate, enfrentándose a representantes de diferentes departamentos del país y consolidando una sobresaliente actuación que evidencia el crecimiento del boxeo en la región.
Este importante logro es el resultado del esfuerzo conjunto de los atletas, entrenadores y el respaldo al desarrollo del deporte en el departamento, reafirmando el potencial de los jóvenes amazonenses para competir al más alto nivel y representar con orgullo al Amazonas en escenarios nacionales.
Movelsul Brasil 2026: el punto de encuentro del nuevo mapa exportador del mueble brasileño
Compradores colombianos participarán en la 25ª edición de Movelsul Brasil, que
reunirá a más de 200 marcas y visitantes de más de 40 países en un momento en
que América Latina concentra cerca del 65 % de las exportaciones brasileñas de...read more
Compradores colombianos participarán en la 25ª edición de Movelsul Brasil, que
reunirá a más de 200 marcas y visitantes de más de 40 países en un momento en
que América Latina concentra cerca del 65 % de las exportaciones brasileñas de
muebles.
Colombia será uno de los mercados latinoamericanos protagonistas de la 25ª
edición de Movelsul Brasil, la principal feria de negocios de la industria del mueble
en América Latina, que se realizará del 17 al 20 de agosto de 2026 en Bento
Gonçalves (Rio Grande do Sul). La participación de las empresas colombianas:
Mockuproom, 902Showroom, Duo Desing, entre otras, refleja el creciente interés del
mercado nacional por fortalecer sus relaciones comerciales con Brasil, justo cuando
América Latina se consolida como el principal destino de las exportaciones
brasileñas de muebles.
El cambio responde a una nueva dinámica del comercio internacional. En los últimos
dos años, los fabricantes brasileños han intensificado su presencia en América
Latina, una región que hoy concentra cerca del 65 % de las exportaciones del
sector, impulsada por mercados como Uruguay, Argentina, Chile, Perú, Paraguay y
Colombia. La cercanía geográfica, una logística más eficiente y el fortalecimiento de
los vínculos comerciales regionales han convertido a la región en el principal motor
de crecimiento para la industria brasileña del mueble.
En este contexto, Movelsul Brasil 2026 se consolida como una plataforma
estratégica para generar nuevos negocios. Durante cuatro días, más de 200
fabricantes brasileños presentarán sus lanzamientos en muebles para el hogar,
mobiliario planificado, colchones, tapizados, decoración y soluciones para el sector,
ante compradores provenientes de más de 40 países.
La delegación colombiana tendrá la oportunidad de conocer de primera mano las
tendencias que marcarán el mercado, identificar nuevos proveedores y establecer
alianzas comerciales con algunas de las empresas más representativas de la
industria brasileña. El objetivo es fortalecer el intercambio comercial entre ambos
países y ampliar la oferta de productos disponibles para el mercado colombiano.
Como parte de la estrategia de internacionalización del sector, la feria contará con
una agenda de rondas de negocios organizada por Brazilian Furniture, iniciativa de
Abimóvel en alianza con ApexBrasil, que conectará a fabricantes brasileños con
importadores internacionales previamente seleccionados.
Además de los espacios de negocios, Movelsul Brasil ofrecerá una completa
programación orientada a la innovación y al diseño. Más de 200 expositores
ocuparán cinco pabellones especializados, mientras que Movelsul Conecta reunirá
propuestas de mobiliario planificado, diseño, decoración y soluciones tecnológicas
para la industria.
La agenda académica incluirá la Arena del Conocimiento, con conferencias sobre
arquitectura, interiorismo, innovación, tendencias y transformación del comercio
minorista, así como la exhibición de los proyectos finalistas del Premio Salão
Design, el concurso de diseño de mobiliario más tradicional de Brasil.
El sector retail también tendrá un espacio destacado con Varejo 360º, un escenario
de conferencias gratuitas sobre comercio electrónico, ventas, marketing y gestión
empresarial, además de actividades de networking diseñadas para fortalecer la
relación entre fabricantes, distribuidores y compradores internacionales.
Organizada desde 1977 por el Sindicato de las Industrias del Mueble de Bento
Gonçalves (Sindmóveis), Movelsul Brasil llega a su edición número 25 consolidada
como una de las plataformas de negocios más importantes de América Latina. En
un contexto de creciente integración comercial regional, la feria reafirma el papel de
Brasil como uno de los principales proveedores de mobiliario para América Latina y
representa una oportunidad para que empresas colombianas fortalezcan sus redes
de abastecimiento y conozcan las últimas tendencias del sector.
Con éxito culminó la Audiencia Pública sobre la atención a habitantes de residencia no formal en el Amazonas
Con la participación de autoridades nacionales, departamentales y municipales, entidades públicas, organismos de control, organizaciones sociales y representantes de la comunidad, culminó la Audiencia Pública sobre la atención a habitantes de resi...read more
Con la participación de autoridades nacionales, departamentales y municipales, entidades públicas, organismos de control, organizaciones sociales y representantes de la comunidad, culminó la Audiencia Pública sobre la atención a habitantes de residencia no formal en el departamento del Amazonas, un espacio de diálogo orientado al análisis de las necesidades de esta población y al fortalecimiento de acciones institucionales para la garantía de sus derechos.
Durante la jornada se socializaron los principales retos y avances en materia de atención integral, así como las iniciativas encaminadas a mejorar el acceso a servicios, la inclusión social y la articulación entre las entidades responsables de brindar respuesta a esta población.
Como resultado de la audiencia, las instituciones participantes reafirmaron su compromiso de continuar trabajando de manera coordinada en la formulación e implementación de estrategias que contribuyan a mejorar las condiciones de vida de los habitantes de residencia no formal, promoviendo el respeto por la dignidad humana, la inclusión y el desarrollo social en el departamento del Amazonas.
La juventud fue protagonista en el desfile del 19 de julio en Leticia
En el marco de la programación conmemorativa de las Fiestas Patrias, el municipio de Leticia, Amazonas, fue escenario del tradicional Desfile por la Juventud, una jornada que reunió a estudiantes de los diferentes establecimientos educativos del d...read more
En el marco de la programación conmemorativa de las Fiestas Patrias, el municipio de Leticia, Amazonas, fue escenario del tradicional Desfile por la Juventud, una jornada que reunió a estudiantes de los diferentes establecimientos educativos del departamento para rendir homenaje a la patria y exaltar los valores cívicos.
Durante el recorrido, niños, niñas y jóvenes demostraron su creatividad, disciplina y sentido de pertenencia a través de presentaciones artísticas, bandas músico-marciales y expresiones culturales que resaltaron la identidad amazónica y el orgullo de ser colombianos.
La actividad contó con la participación de la comunidad educativa, docentes, padres de familia y ciudadanía en general, quienes acompañaron este importante evento que fortalece el civismo, la integración y el compromiso de las nuevas generaciones con la construcción de una sociedad basada en el respeto, la convivencia y el amor por la nación.
Capacidades institucionales benefician hogar de adultos mayores en el Amazonas
En el marco de la Operación BRACOLPER, desarrollada de manera multinacional entre las Marinas de Colombia, Brasil y Perú, la Fuerza Naval de la Amazonía, a través del Grupo de Guardacostas de la Amazonía, ejecutó de manera conjunta con el Ejército Nacional y la Fuerza Aeroespacial Colombiana, y de manera coordinada con la Policía Nacional, una jornada de adecuación y mejoramiento de la infraestructura del Hogar San José del municipio de Leticia, Amazonas.
En el marco de la Operación BRACOLPER, desarrollada de manera multinacional entre las Marinas de Colombia, Brasil y Perú, la Fuerza Naval de la Amazonía, a través del Grupo de Guardacostas de la Amazonía, ejecutó de manera conjunta con el Ejército...read more
En el marco de la Operación BRACOLPER, desarrollada de manera multinacional entre las Marinas de Colombia, Brasil y Perú, la Fuerza Naval de la Amazonía, a través del Grupo de Guardacostas de la Amazonía, ejecutó de manera conjunta con el Ejército Nacional y la Fuerza Aeroespacial Colombiana, y de manera coordinada con la Policía Nacional, una jornada de adecuación y mejoramiento de la infraestructura del Hogar San José del municipio de Leticia, Amazonas.
Durante esta importante actividad se realizaron labores de embellecimiento y pintura de las instalaciones, así como la construcción de una rampa de acceso y una placa de concreto, obras que permitirán mejorar las condiciones de movilidad, accesibilidad y seguridad de los adultos mayores que residen en este hogar, brindándoles espacios más dignos, seguros y adecuados para su bienestar.
Estas acciones hacen parte de las actividades de apoyo a la comunidad contempladas en la Operación BRACOLPER, fortaleciendo la cooperación multinacional entre las marinas de los tres países y la articulación interinstitucional con las Fuerzas Militares y la Policía Nacional, en beneficio de las poblaciones más vulnerables de la región amazónica.
Con este tipo de iniciativas, la Fuerza Aeroespacial Colombiana a través del Grupo Aéreo del Amazonas reafirma su compromiso con el desarrollo integral de las comunidades, poniendo al servicio de la Nación sus capacidades operacionales y logísticas para contribuir al bienestar de la población en le extremo sur del país.