POLITICA
Uno por uno, qué senadores votaron a favor y cuáles en contra de la Ley de Propiedad Privada

${status}
`;
}
function createCard(item, borderColor) {
const card = document.createElement(«div»);
card.className = «vs2__card»;
const fotoWrap = document.createElement(«div»);
fotoWrap.className = «vs2__foto»;
if (borderColor) {
fotoWrap.style.borderColor = borderColor;
} else {
fotoWrap.style.opacity = «0.3»;
fotoWrap.style.border = «none»;
}
const img = document.createElement(«img»);
img.loading = «lazy»;
img.decoding = «async»;
img.alt = «foto-senador»;
img.src = » + (item.url_foto || «»);
img.addEventListener(«error», () => {
img.style.opacity = «0.35»;
}, {
once: true
});
fotoWrap.appendChild(img);
const nombre = document.createElement(«p»);
nombre.className = «vs2__nombre»;
nombre.textContent = String(item.nombres || «»).toLowerCase();
const apellido = document.createElement(«p»);
apellido.className = «vs2__apellido»;
apellido.textContent = String(item.apellido || «»).toLowerCase();
const bloque = document.createElement(«span»);
bloque.className = «vs2__bloque»;
bloque.textContent = String(item.bloque || «»);
card.appendChild(fotoWrap);
card.appendChild(nombre);
card.appendChild(apellido);
card.appendChild(bloque);
return card;
}
function seatClass(kind) {
if (kind === «AFIRMATIVO») return «vs2__seat–afirmativo»;
if (kind === «NEGATIVO») return «vs2__seat–negativo»;
if (kind === «ABSTENCIÓN») return «vs2__seat–abstencion»;
if (kind === «AUSENTE») return «vs2__seat–ausente»;
return «vs2__seat–empty»;
}
function hemicicloParams(which) {
if (which === «big») {
return {
centerX: 300,
baseY: 450,
rows: 5,
seatsPerRow: [21, 18, 16, 11, 6],
verticalOffset: 2,
radiusStart: 300,
radiusStep: 55
};
}
return {
centerX: 300,
baseY: 450,
rows: 5,
seatsPerRow: [21, 18, 16, 12, 7],
verticalOffset: 0,
radiusStart: 170,
radiusStep: 30
};
}
function computeRowSeatCounts(seatsPerRow, totals) {
const totalSeats = seatsPerRow.reduce((a, b) => a + b, 0);
return seatsPerRow.map(seatsInRow => {
const exact = {
AFIRMATIVO: (totals.AFIRMATIVO / totalSeats) * seatsInRow,
NEGATIVO: (totals.NEGATIVO / totalSeats) * seatsInRow,
«ABSTENCIÓN»: (totals[«ABSTENCIÓN»] / totalSeats) * seatsInRow,
AUSENTE: (totals.AUSENTE / totalSeats) * seatsInRow
};
const floor = {
AFIRMATIVO: Math.floor(exact.AFIRMATIVO),
NEGATIVO: Math.floor(exact.NEGATIVO),
«ABSTENCIÓN»: Math.floor(exact[«ABSTENCIÓN»]),
AUSENTE: Math.floor(exact.AUSENTE)
};
let assigned = floor.AFIRMATIVO + floor.NEGATIVO + floor[«ABSTENCIÓN»] + floor.AUSENTE;
let diff = seatsInRow – assigned;
const rems = [{
k: «AFIRMATIVO»,
r: exact.AFIRMATIVO – floor.AFIRMATIVO
},
{
k: «NEGATIVO»,
r: exact.NEGATIVO – floor.NEGATIVO
},
{
k: «ABSTENCIÓN»,
r: exact[«ABSTENCIÓN»] – floor[«ABSTENCIÓN»]
},
{
k: «AUSENTE»,
r: exact.AUSENTE – floor.AUSENTE
},
].sort((a, b) => b.r – a.r);
while (diff > 0) {
for (const it of rems) {
if (diff <= 0) break;
floor[it.k] += 1;
diff–;
}
}
return floor;
});
}
function renderHemiciclo(which, totals) {
const el = byRole(which === «big» ? «hemiciclo-big» : «hemiciclo-small»);
if (!el) return;
el.innerHTML = «»;
const p = hemicicloParams(which);
let rowSeatCounts = computeRowSeatCounts(p.seatsPerRow, totals);
const maxSeatsInRow = p.seatsPerRow[0];
for (let col = 0; col < maxSeatsInRow; col++) {
for (let row = 0; row < p.rows; row++) {
if (col >= p.seatsPerRow[row]) continue;
const seatsInThisRow = p.seatsPerRow[row];
const radius = p.radiusStart – row * (p.radiusStep – p.verticalOffset);
const angleRange = Math.PI;
const angleStep = (seatsInThisRow > 1) ? angleRange / (seatsInThisRow – 1) : 0;
const angle = (Math.PI – angleRange) / 2 + col * angleStep;
const x = p.centerX + radius * Math.cos(angle);
const y = p.baseY – radius * Math.sin(angle);
let kind = «EMPTY»;
if (rowSeatCounts[row].AFIRMATIVO > 0) {
kind = «AFIRMATIVO»;
rowSeatCounts[row].AFIRMATIVO–;
} else if (rowSeatCounts[row].NEGATIVO > 0) {
kind = «NEGATIVO»;
rowSeatCounts[row].NEGATIVO–;
} else if (rowSeatCounts[row][«ABSTENCIÓN»] > 0) {
kind = «ABSTENCIÓN»;
rowSeatCounts[row][«ABSTENCIÓN»]–;
} else if (rowSeatCounts[row].AUSENTE > 0) {
kind = «AUSENTE»;
rowSeatCounts[row].AUSENTE–;
}
const seat = document.createElement(«div»);
seat.className = «vs2__seat » + seatClass(kind);
seat.style.left = x + «px»;
seat.style.top = y + «px»;
el.appendChild(seat);
}
}
}
function populateFilters(data) {
const selProv = byRole(«select-provincia»);
const selBloq = byRole(«select-bloque»);
if (!selProv || !selBloq) return;
const provSet = new Set();
const bloqSet = new Map(); // bloque -> full
data.forEach(r => {
if (r.provincia) provSet.add(r.provincia);
if (r.bloque) bloqSet.set(r.bloque, r.bloque_full || r.bloque);
});
Array.from(provSet).sort().forEach(p => {
const opt = document.createElement(«option»);
opt.value = p;
opt.textContent = p;
selProv.appendChild(opt);
});
Array.from(bloqSet.entries())
.sort((a, b) => String(a[0]).localeCompare(String(b[0])))
.forEach(([code, full]) => {
const opt = document.createElement(«option»);
opt.value = code;
opt.textContent = `${full} (${code})`;
selBloq.appendChild(opt);
});
}
function renderFiltered(data, field, value, targetEl) {
targetEl.innerHTML = «»;
const rows = data.filter(r => value === «all» || r[field] === value);
const order = [«AFIRMATIVO», «NEGATIVO», «ABSTENCIÓN», «AUSENTE»];
const colorBy = {
AFIRMATIVO: «#00A377»,
NEGATIVO: «#c90808»,
«ABSTENCIÓN»: «#444″,
AUSENTE: null
};
order.forEach(voto => {
rows.filter(r => normalizeVoto(r.voto) === voto).forEach(r => {
targetEl.appendChild(createCard(r, colorBy[voto]));
});
});
}
function wireUI(data) {
// toggles
$$(‘[data-role=»section»], [data-role=»filter-provincia»], [data-role=»filter-bloque»]’).forEach(sec => {
const btn = sec.querySelector(‘[data-role=»toggle»]’);
if (!btn) return;
btn.addEventListener(«click», () => {
const open = sec.getAttribute(«data-open») !== «true»;
openPanel(sec, open);
});
});
// abrir por defecto secciones principales, y dejar filtros cerrados
$$(‘[data-role=»section»]’).forEach(sec => openPanel(sec, true));
$$(‘[data-role=»filter-provincia»], [data-role=»filter-bloque»]’).forEach(sec => openPanel(sec, false));
// go top
const goTop = byRole(«go-top»);
if (goTop) {
goTop.addEventListener(«click», () => root.scrollIntoView({
behavior: «smooth»
}));
const obs = new IntersectionObserver((entries) => {
entries.forEach(e => {
goTop.style.display = e.isIntersecting ? «block» : «none»;
});
}, {
threshold: 0.1
});
obs.observe(root);
}
// filtros
const selProv = byRole(«select-provincia»);
const selBloq = byRole(«select-bloque»);
const provOut = byRole(«provincia-results»);
const bloqOut = byRole(«bloque-results»);
if (selProv && provOut) {
selProv.addEventListener(«change», (e) => {
renderFiltered(data, «provincia», e.target.value, provOut);
const sec = byRole(«filter-provincia»);
if (sec) openPanel(sec, true);
});
}
if (selBloq && bloqOut) {
selBloq.addEventListener(«change», (e) => {
renderFiltered(data, «bloque», e.target.value, bloqOut);
const sec = byRole(«filter-bloque»);
if (sec) openPanel(sec, true);
});
}
}
async function init() {
setLoaded(false);
const csvUrl = root.dataset.csvUrl;
if (!csvUrl) {
const summary = byRole(«summary»);
if (summary) summary.innerHTML = `
Error: falta data-csv-url
`;
return;
}
try {
const Papa = await ensurePapa();
Papa.parse(csvUrl, {
download: true,
header: true,
skipEmptyLines: true,
complete: function(res) {
const data = (res && res.data) ? res.data : [];
// panels por voto
const panelByVote = {};
$$(‘[data-role=»section»]’).forEach(sec => {
const voto = sec.getAttribute(«data-voto»);
const panel = sec.querySelector(‘[data-role=»panel»]’);
if (voto && panel) panelByVote[voto] = panel;
});
const counts = {
AFIRMATIVO: 0,
NEGATIVO: 0,
«ABSTENCIÓN»: 0,
AUSENTE: 0
};
const colorBy = {
AFIRMATIVO: «#00A377»,
NEGATIVO: «#c90808»,
«ABSTENCIÓN»: «#444″,
AUSENTE: null
};
data.forEach(row => {
const voto = normalizeVoto(row.voto);
if (!counts.hasOwnProperty(voto)) return;
counts[voto]++;
const panel = panelByVote[voto];
if (panel) {
panel.appendChild(createCard(row, colorBy[voto]));
}
});
// counts en UI
$$(‘[data-role=»count»]’).forEach(el => {
const k = el.getAttribute(«data-kind»);
if (k && counts.hasOwnProperty(k)) el.textContent = String(counts[k]);
});
// hemiciclo + summary
renderHemiciclo(«big», counts);
renderHemiciclo(«small», counts);
renderSummary(counts);
// filtros + ui
populateFilters(data);
wireUI(data);
setLoaded(true);
// recalcular heights en secciones abiertas
$$(‘[data-role=»section»]’).forEach(sec => openPanel(sec, true));
}
});
} catch (err) {
console.error(err);
const summary = byRole(«summary»);
if (summary) {
summary.innerHTML = `
Error: ${escapeHtml(err.message || err)}
`;
}
}
}
init();
})();
POLITICA
ATE hizo un paro para exigirle pases a planta permanente a Kicillof, pero concentró sus críticas en el modelo de Milei

La Asociación de Trabajadores del Estado (ATE) de la provincia de Buenos Aires realizó un paro este miércoles para reclamarle al gobierno de Axel Kicillof y a la Legislatura que el próximo presupuesto provincial incluya pases a planta permanente y mejoras salariales. Aunque el alcance de la medida y de las demandas fue provincial, el principal apuntado por el sindicato como responsable de la situación laboral de los trabajadores estatales fue el presidente Javier Milei.
La huelga de ATE se complementó con una movilización a la Legislatura bonaerense, en La Plata. El gremio provincial, aliado del gobernador Kicillof, marcó presencia con una columna en la que confluyeron algunos de sus principales referentes, como el secretario general, Claudio Arévalo; el secretario gremial de ATE nacional, Oscar De Isasi, o el secretario general de la Central de Trabajadores de la Argentina (rama Autónoma), Hugo Godoy. La columna estatal “partió de Plaza Italia y transitó la Avenida 7 hasta llegar a la altura del establecimiento legislativo”, informó el gremio en un comunicado.
La protesta se impulsó “bajo el reclamo del pase a planta permanente de todos los trabajadores y trabajadoras precarizados, así como la concreción de un salario que mejore el poder adquisitivo de los estatales”. Reclamaron “que en el presupuesto estén incluidos los pases a planta permanente”.
A la hora de señalar responsables por la situación que derivó en el paro bonaerense, Arévalo dirigió su discurso hacia Milei. “Tenemos un solo culpable, que es el gobierno nacional, que se está quedando con los fondos que le corresponden a la provincia de Buenos Aires. No tenemos que equivocarnos [sobre] quién es nuestro enemigo. No está entre nosotros, nuestro enemigo es Javier Milei, que recibe las órdenes del Fondo Monetario Internacional, que está ahogando a las provincias y los municipios. Necesitamos que en el presupuesto estén incluidos los pases a planta permanente de los becarios de la salud y trabajadores dela Educación”, afirmó Arévalo.
La columna del gremio en las calles de La Plata llevaba, en su frente, una pancarta que rezaba “La plata no alcanza. Milei es responsable”.
“Somos los que sostenemos el Estado. Sin trabajadores, no hay Estado. En este nuevo presupuesto, se tiene que ir a buscar la plata de los sectores que se enriquecen, que son el sector agrario, los countries y los sectores concentrados de la riqueza, para distribuirla en el pueblo bonaerense”, añadió el secretario general de ATE bonaerense.
La semana pasada, el gremio estatal provincial le había anticipado al ministro de Trabajo bonaerense, Walter Correa, que haría paro este miércoles. En una nota, le reclamó, además de los pases a planta permanente y las mejoras salariales, destinar “mayores recursos para la conformación del Consejo del Salario Municipal”, apuntalar “el fortalecimiento de la carrera administrativa”, y aplicar un “boleto gratuito” para los estatales que trabajen en las áreas de educación y salud.
el presidente,Provincia de Buenos Aires,Legislatura,Axel Kicillof,Conforme a
POLITICA
Patricia Bullrich cruzó a la fiscal del caso Chocobar y adelantó que no acompañará su pliego

La jefa del bloque de la Libertad Avanza en el Senado, Patricia Bullrich, cuestionó durante la Comisión de Acuerdos del Senado la actuación de la fiscal Susana Pernas en el caso que involucró al policía Luis Chocobar y adelantó que no acompañará su pliego para ocupar el cargo de fiscal general ante los Tribunales Orales de Menores de la Capital Federal, Fiscalía N°2.
Bullrich cuestionó el rol de la fiscal en el caso Chocobar
Durante el intercambio, Bullrich cuestionó que Pernas hubiera solicitado una pena de tres años de prisión para Chocobar y puso en discusión cuál debe ser el rol de la Justicia frente a un efectivo policial que interviene ante un delito.
“Yo pregunto: en la Argentina, frente a un delincuente que estaba cometiendo un delito, le dan una pena a Chocobar, le manchan su carrera cuando él había actuado. Mi pregunta es: usted, como fiscal de menores, que le tocó el delincuente, casi asesino, ¿a quién defiende? ¿Defiende a las víctimas? ¿Entiende el rol de la Policía cuando es acusado?”, cuestionó la legisladora.
En esa línea, Bullrich advirtió sobre el mensaje que este tipo de decisiones puede transmitir a los integrantes de las fuerzas de seguridad. “¿Qué hacen todos los policías del país cuando ven que alguien que dispara es acusado? ¿Quién va a defender a la sociedad cuando una fiscal insiste después de Casación y va a la Corte Suprema a pedir un aumento de la pena?”, planteó.
Luego llevó el cuestionamiento directamente a la postulante: “Frente a situaciones de este tipo, ¿va a actuar de la misma manera? ¿Los ciudadanos van a estar indefensos frente a esta situación?”.
POLITICA
Se realizó la segunda edición de los premios Quorum a la Justicia: uno por uno, quiénes fueron los ganadores

POLITICA2 días ago¡Precios de Manhattan con sueldos de Argentina! Cómo los créditos hipotecarios inflaron las propiedades y congelaron el sueño de la casa propia
POLITICA3 días agoLa Argentina se sumó a un acuerdo liderado por EE.UU. para impulsar el uso de la inteligencia artificial en la ciencia
INTERNACIONAL3 días agoLa Casa Blanca monitorea un posible brote de peste en Rusia tras la muerte de una trabajadora de un laboratorio














