Spaces:
Running
Running
Deploy the site from pipeline commit fef8f38bbf78
Browse files- assets/amc.css +22 -6
- assets/amc.js +61 -9
- assets/charts.js +3 -1
- assets/nav.css +8 -0
- boletin/index.html +2 -0
- boletin/ultimo/index.html +2 -0
- consulta/index.html +5 -0
- explorar/index.html +291 -0
- historias/abril-2020/index.html +4 -2
- historias/carrera/index.html +2 -0
- historias/concentracion/index.html +3 -0
- historias/conexiones/index.html +2 -0
- historias/depuraciones/index.html +2 -0
- historias/duracion/index.html +4 -2
- historias/gacelas/index.html +2 -0
- historias/gobiernos/index.html +2 -0
- historias/index.html +2 -0
- historias/latido/index.html +2 -0
- historias/margenes/index.html +2 -0
- historias/marzo/index.html +2 -0
- historias/migracion/index.html +2 -0
- historias/negocios/index.html +4 -2
- historias/nombres/index.html +2 -0
- historias/pandemia/index.html +2 -0
- historias/peso/index.html +3 -0
- historias/piramide/index.html +2 -0
- historias/regiones-tiempo/index.html +2 -0
- historias/regiones/index.html +3 -1
- historias/sas/index.html +2 -0
- historias/software/index.html +2 -0
- historias/tu-empresa/index.html +7 -5
- index.html +7 -4
- metodologia/comparacion/index.html +2 -0
- metodologia/index.html +13 -4
- robots.txt +4 -0
- sitemap.xml +34 -0
assets/amc.css
CHANGED
|
@@ -89,6 +89,8 @@ h1, h2, h3 { font-family: var(--display); letter-spacing: -.02em; }
|
|
| 89 |
.btn svg { width: 16px; height: 16px; }
|
| 90 |
.chip { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 500; color: var(--ink-2);
|
| 91 |
background: var(--surface-2); border-radius: 999px; padding: 4px 10px; white-space: nowrap; }
|
|
|
|
|
|
|
| 92 |
.chip.accent { background: var(--accent-soft); color: var(--accent); }
|
| 93 |
.kicker { font: 600 12.5px/1.2 var(--sans); letter-spacing: .08em; text-transform: uppercase; color: var(--accent); margin: 0; }
|
| 94 |
.seg-ctl { display: inline-flex; background: var(--surface-2); border-radius: 11px; padding: 3px; gap: 2px; flex-wrap: wrap; }
|
|
@@ -130,7 +132,7 @@ section.block { padding: 56px 0 8px; }
|
|
| 130 |
.stories { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--gap); }
|
| 131 |
.stories.three { grid-template-columns: repeat(3, minmax(0, 1fr)); }
|
| 132 |
@media (max-width: 960px) { .stories.three { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
|
| 133 |
-
@media (max-width:
|
| 134 |
.story-card { display: flex; flex-direction: column; text-decoration: none; background: var(--surface); border: 1px solid var(--border);
|
| 135 |
border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow); transition: transform .2s, box-shadow .2s, border-color .2s; }
|
| 136 |
.story-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-lift); border-color: var(--border-strong); }
|
|
@@ -149,9 +151,16 @@ section.block { padding: 56px 0 8px; }
|
|
| 149 |
.story-card.feature .thumb { min-height: 200px; border-right: 0; border-bottom: 1px solid var(--border); }
|
| 150 |
}
|
| 151 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 152 |
/* ---------------------------------------------------------------- facts */
|
| 153 |
.facts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gap); }
|
| 154 |
-
@media (max-width:
|
| 155 |
.fact { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: var(--pad); box-shadow: var(--shadow);
|
| 156 |
display: flex; flex-direction: column; gap: var(--stack); }
|
| 157 |
.fact .big { font: 800 clamp(34px, 4.6vw, 46px)/1 var(--display); letter-spacing: -.035em; margin: 0; }
|
|
@@ -181,7 +190,7 @@ section.block { padding: 56px 0 8px; }
|
|
| 181 |
.share svg { width: 13px; height: 13px; }
|
| 182 |
|
| 183 |
.findings { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gap); margin: 36px 0 12px; counter-reset: f; }
|
| 184 |
-
@media (max-width:
|
| 185 |
.finding { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: var(--pad); box-shadow: var(--shadow); }
|
| 186 |
.finding .n { font: 800 clamp(30px, 3.8vw, 40px)/1 var(--display); letter-spacing: -.03em; margin: 0 0 var(--stack); }
|
| 187 |
.finding p { margin: 0; color: var(--ink-2); font-size: 15px; line-height: 1.5; }
|
|
@@ -267,7 +276,7 @@ aside.read-this b { color: var(--ink); }
|
|
| 267 |
.seg:last-child { border-radius: 0 4px 4px 0; }
|
| 268 |
.seg:hover, .seg:focus-visible { filter: brightness(1.12); }
|
| 269 |
.val { font-size: 12.5px; color: var(--ink-2); margin-left: 8px; white-space: nowrap; font-variant-numeric: tabular-nums; }
|
| 270 |
-
@media (max-width:
|
| 271 |
.hbars { grid-template-columns: minmax(0, 1fr) !important; row-gap: 3px; }
|
| 272 |
.hbars .lab { text-align: left; margin-top: 8px; }
|
| 273 |
/* A long value label drops under its bar rather than pushing past the screen. */
|
|
@@ -297,6 +306,7 @@ details.tv table { border-collapse: collapse; width: 100%; }
|
|
| 297 |
details.tv th, details.tv td { padding: 6px 10px; border-bottom: 1px solid var(--border); text-align: left; white-space: nowrap; }
|
| 298 |
details.tv th { background: var(--surface-2); color: var(--ink-2); font-weight: 600; position: sticky; top: 0; }
|
| 299 |
details.tv td.n, details.tv th.n { text-align: right; font-variant-numeric: tabular-nums; }
|
|
|
|
| 300 |
|
| 301 |
/* ---------------------------------------------------------------- what changed, cta, trust */
|
| 302 |
.changes { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gap-tight); }
|
|
@@ -306,7 +316,7 @@ details.tv td.n, details.tv th.n { text-align: right; font-variant-numeric: tabu
|
|
| 306 |
.change .label { margin: 2px 0 0; font-weight: 600; }
|
| 307 |
.change .sub { margin: 4px 0 0; color: var(--ink-2); font-size: 14px; }
|
| 308 |
.cta { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gap-tight); }
|
| 309 |
-
@media (max-width:
|
| 310 |
.cta a { display: block; text-decoration: none; background: var(--surface); border: 1px solid var(--border);
|
| 311 |
border-radius: var(--radius); padding: var(--pad); box-shadow: var(--shadow); transition: transform .2s, box-shadow .2s, border-color .2s; }
|
| 312 |
.cta a:hover { transform: translateY(-2px); box-shadow: var(--shadow-lift); border-color: var(--border-strong); }
|
|
@@ -336,6 +346,12 @@ footer.site .clyx-credit { margin-top: 18px; }
|
|
| 336 |
border: 2.5px solid var(--border); border-top-color: var(--ink-2); animation: spin .8s linear infinite; }
|
| 337 |
@keyframes spin { to { transform: rotate(360deg); } }
|
| 338 |
.error { color: var(--down); padding: 40px 0; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 339 |
|
| 340 |
/* The monthly bulletin: its stamp, the way to the months either side, and the list. */
|
| 341 |
.stamp { max-width: var(--read); margin: 24px auto 0; font-size: 13.5px; line-height: 1.6; color: var(--muted); overflow-wrap: anywhere; }
|
|
@@ -393,7 +409,7 @@ p, li, .fig-head p, .cta .d { text-wrap: pretty; }
|
|
| 393 |
.card, .fact, .finding, .tile, .change, .story-card .body, .cta a, .trust p, .fig-head p, aside.read-this, .scrolly .step, #tip {
|
| 394 |
-webkit-hyphens: auto; hyphens: auto; hyphenate-limit-chars: 7 3 3; overflow-wrap: break-word; }
|
| 395 |
.fact .big, .finding .n, .tile .value, .change .value, .story-card .stat { font-variant-numeric: tabular-nums; -webkit-hyphens: manual; hyphens: manual; }
|
| 396 |
-
@media (max-width:
|
| 397 |
.prose { -webkit-hyphens: auto; hyphens: auto; hyphenate-limit-chars: 7 3 3; }
|
| 398 |
}
|
| 399 |
@media (min-width: 900px) {
|
|
|
|
| 89 |
.btn svg { width: 16px; height: 16px; }
|
| 90 |
.chip { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 500; color: var(--ink-2);
|
| 91 |
background: var(--surface-2); border-radius: 999px; padding: 4px 10px; white-space: nowrap; }
|
| 92 |
+
/* A long chip wraps rather than pushing past a phone's edge (Gobiernos, 320-380 px). */
|
| 93 |
+
.chip { max-width: 100%; white-space: normal; }
|
| 94 |
.chip.accent { background: var(--accent-soft); color: var(--accent); }
|
| 95 |
.kicker { font: 600 12.5px/1.2 var(--sans); letter-spacing: .08em; text-transform: uppercase; color: var(--accent); margin: 0; }
|
| 96 |
.seg-ctl { display: inline-flex; background: var(--surface-2); border-radius: 11px; padding: 3px; gap: 2px; flex-wrap: wrap; }
|
|
|
|
| 132 |
.stories { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--gap); }
|
| 133 |
.stories.three { grid-template-columns: repeat(3, minmax(0, 1fr)); }
|
| 134 |
@media (max-width: 960px) { .stories.three { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
|
| 135 |
+
@media (max-width: 760px) { .stories, .stories.three { grid-template-columns: minmax(0, 1fr); } }
|
| 136 |
.story-card { display: flex; flex-direction: column; text-decoration: none; background: var(--surface); border: 1px solid var(--border);
|
| 137 |
border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow); transition: transform .2s, box-shadow .2s, border-color .2s; }
|
| 138 |
.story-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-lift); border-color: var(--border-strong); }
|
|
|
|
| 151 |
.story-card.feature .thumb { min-height: 200px; border-right: 0; border-bottom: 1px solid var(--border); }
|
| 152 |
}
|
| 153 |
|
| 154 |
+
/* BREAKPOINTS (audit A-07, 2026-10-19). Four, and every layout rule uses one:
|
| 155 |
+
560 phone · 760 small tablet · 900 tablet · 960 desktop. A rule that sat
|
| 156 |
+
between two moved to the one above it, so grids now stack a little sooner
|
| 157 |
+
and never later. Two exceptions, sized to their content: the header's own
|
| 158 |
+
set in nav.css, and the console's 1000 px, where its editor and schema panel
|
| 159 |
+
stop fitting side by side. */
|
| 160 |
+
|
| 161 |
/* ---------------------------------------------------------------- facts */
|
| 162 |
.facts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gap); }
|
| 163 |
+
@media (max-width: 900px) { .facts { grid-template-columns: minmax(0, 1fr); } }
|
| 164 |
.fact { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: var(--pad); box-shadow: var(--shadow);
|
| 165 |
display: flex; flex-direction: column; gap: var(--stack); }
|
| 166 |
.fact .big { font: 800 clamp(34px, 4.6vw, 46px)/1 var(--display); letter-spacing: -.035em; margin: 0; }
|
|
|
|
| 190 |
.share svg { width: 13px; height: 13px; }
|
| 191 |
|
| 192 |
.findings { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gap); margin: 36px 0 12px; counter-reset: f; }
|
| 193 |
+
@media (max-width: 900px) { .findings { grid-template-columns: minmax(0, 1fr); } }
|
| 194 |
.finding { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: var(--pad); box-shadow: var(--shadow); }
|
| 195 |
.finding .n { font: 800 clamp(30px, 3.8vw, 40px)/1 var(--display); letter-spacing: -.03em; margin: 0 0 var(--stack); }
|
| 196 |
.finding p { margin: 0; color: var(--ink-2); font-size: 15px; line-height: 1.5; }
|
|
|
|
| 276 |
.seg:last-child { border-radius: 0 4px 4px 0; }
|
| 277 |
.seg:hover, .seg:focus-visible { filter: brightness(1.12); }
|
| 278 |
.val { font-size: 12.5px; color: var(--ink-2); margin-left: 8px; white-space: nowrap; font-variant-numeric: tabular-nums; }
|
| 279 |
+
@media (max-width: 760px) {
|
| 280 |
.hbars { grid-template-columns: minmax(0, 1fr) !important; row-gap: 3px; }
|
| 281 |
.hbars .lab { text-align: left; margin-top: 8px; }
|
| 282 |
/* A long value label drops under its bar rather than pushing past the screen. */
|
|
|
|
| 306 |
details.tv th, details.tv td { padding: 6px 10px; border-bottom: 1px solid var(--border); text-align: left; white-space: nowrap; }
|
| 307 |
details.tv th { background: var(--surface-2); color: var(--ink-2); font-weight: 600; position: sticky; top: 0; }
|
| 308 |
details.tv td.n, details.tv th.n { text-align: right; font-variant-numeric: tabular-nums; }
|
| 309 |
+
details.tv .tv-acts { margin-top: 6px; }
|
| 310 |
|
| 311 |
/* ---------------------------------------------------------------- what changed, cta, trust */
|
| 312 |
.changes { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gap-tight); }
|
|
|
|
| 316 |
.change .label { margin: 2px 0 0; font-weight: 600; }
|
| 317 |
.change .sub { margin: 4px 0 0; color: var(--ink-2); font-size: 14px; }
|
| 318 |
.cta { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--gap-tight); }
|
| 319 |
+
@media (max-width: 900px) { .cta { grid-template-columns: minmax(0, 1fr); } }
|
| 320 |
.cta a { display: block; text-decoration: none; background: var(--surface); border: 1px solid var(--border);
|
| 321 |
border-radius: var(--radius); padding: var(--pad); box-shadow: var(--shadow); transition: transform .2s, box-shadow .2s, border-color .2s; }
|
| 322 |
.cta a:hover { transform: translateY(-2px); box-shadow: var(--shadow-lift); border-color: var(--border-strong); }
|
|
|
|
| 346 |
border: 2.5px solid var(--border); border-top-color: var(--ink-2); animation: spin .8s linear infinite; }
|
| 347 |
@keyframes spin { to { transform: rotate(360deg); } }
|
| 348 |
.error { color: var(--down); padding: 40px 0; }
|
| 349 |
+
.error-state { max-width: 640px; padding: 56px 0 40px; }
|
| 350 |
+
.error-state h1 { font: 800 clamp(30px, 5vw, 46px)/1.08 var(--display); letter-spacing: -.03em; margin: 8px 0 0; }
|
| 351 |
+
.error-state .dek { margin: 14px 0 0; }
|
| 352 |
+
.error-state .row { display: flex; flex-wrap: wrap; gap: 10px; margin: 24px 0 0; }
|
| 353 |
+
.error-state details { margin: 28px 0 0; color: var(--muted); font-size: 13px; }
|
| 354 |
+
.error-state details code { display: block; margin-top: 6px; font: 12.5px var(--mono); overflow-wrap: anywhere; }
|
| 355 |
|
| 356 |
/* The monthly bulletin: its stamp, the way to the months either side, and the list. */
|
| 357 |
.stamp { max-width: var(--read); margin: 24px auto 0; font-size: 13.5px; line-height: 1.6; color: var(--muted); overflow-wrap: anywhere; }
|
|
|
|
| 409 |
.card, .fact, .finding, .tile, .change, .story-card .body, .cta a, .trust p, .fig-head p, aside.read-this, .scrolly .step, #tip {
|
| 410 |
-webkit-hyphens: auto; hyphens: auto; hyphenate-limit-chars: 7 3 3; overflow-wrap: break-word; }
|
| 411 |
.fact .big, .finding .n, .tile .value, .change .value, .story-card .stat { font-variant-numeric: tabular-nums; -webkit-hyphens: manual; hyphens: manual; }
|
| 412 |
+
@media (max-width: 560px) {
|
| 413 |
.prose { -webkit-hyphens: auto; hyphens: auto; hyphenate-limit-chars: 7 3 3; }
|
| 414 |
}
|
| 415 |
@media (min-width: 900px) {
|
assets/amc.js
CHANGED
|
@@ -134,6 +134,9 @@ export const shortActivity = (s, max = 58) => {
|
|
| 134 |
const t = s.replace(/\s*\(.*?\)\s*/g, " ").replace(/\s+/g, " ").trim();
|
| 135 |
return t.length <= max ? t : `${t.slice(0, max - 1).replace(/[\s,;]+\S*$/, "")}…`;
|
| 136 |
};
|
|
|
|
|
|
|
|
|
|
| 137 |
|
| 138 |
// ------------------------------------------------------------------ DOM
|
| 139 |
export const el = (tag, attrs = {}, ...kids) => {
|
|
@@ -169,6 +172,7 @@ export const icon = (name) => {
|
|
| 169 |
sun: "M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6l1.4 1.4M17 17l1.4 1.4M5.6 18.4L7 17M17 7l1.4-1.4M12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8z",
|
| 170 |
arrow: "M5 12h14M13 6l6 6-6 6",
|
| 171 |
down: "M12 5v14M6 13l6 6 6-6",
|
|
|
|
| 172 |
};
|
| 173 |
const s = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
| 174 |
s.setAttribute("viewBox", "0 0 24 24"); s.setAttribute("fill", "none"); s.setAttribute("stroke", "currentColor");
|
|
@@ -180,9 +184,11 @@ export const icon = (name) => {
|
|
| 180 |
|
| 181 |
// ------------------------------------------------------------------ chrome
|
| 182 |
const NAV = [
|
| 183 |
-
|
|
|
|
| 184 |
["historias", "historias/index.html", "Historias"],
|
| 185 |
["boletin", "boletin/index.html", "Boletín"],
|
|
|
|
| 186 |
["consulta", "consulta/index.html", "Consulta SQL"],
|
| 187 |
["metodologia", "metodologia/index.html", "Metodología", "opt"],
|
| 188 |
];
|
|
@@ -200,7 +206,9 @@ export function chrome(current) {
|
|
| 200 |
el("span", { class: "name" }, "Analíticas Mercantiles", el("small", { text: "Empresas de Colombia, en datos abiertos" }))),
|
| 201 |
clyxBy(),
|
| 202 |
el("div", { class: "links" }, ...NAV.map(([k, href, label, cls]) =>
|
| 203 |
-
el("a", { href: ROOT + href || "./", class: cls, "aria-current": k === current ? "page" : (current?.startsWith(k + "/") ? "section" : null)
|
|
|
|
|
|
|
| 204 |
document.body.prepend(nav);
|
| 205 |
document.body.append(el("div", { id: "tip", role: "status", "aria-live": "polite" }));
|
| 206 |
initTheme(theme);
|
|
@@ -238,6 +246,7 @@ export function footer(s, o = {}) {
|
|
| 238 |
el("li", {}, el("a", { href: `${ROOT}historias/index.html`, text: "Historias" })),
|
| 239 |
el("li", {}, el("a", { href: `${ROOT}boletin/index.html`, text: "Boletín mensual" })),
|
| 240 |
el("li", {}, el("a", { href: "https://amc.clyxconsulting.com/feed.xml", text: "Boletín por RSS" })),
|
|
|
|
| 241 |
el("li", {}, el("a", { href: `${ROOT}consulta/index.html`, text: "Consulta SQL" })))),
|
| 242 |
el("div", {}, el("h4", { text: "Los datos" }), el("ul", {},
|
| 243 |
el("li", {}, el("a", { href: `${ROOT}metodologia/index.html`, text: "Metodología" })),
|
|
@@ -319,9 +328,19 @@ export function tipOn(node, data, onEnter, onLeave, { focusable = true } = {}) {
|
|
| 319 |
TIPS.set(node, data);
|
| 320 |
// Dense marks (a year of days, sixty age bands) are not each a tab stop:
|
| 321 |
// the table view beside them carries every value to the keyboard.
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 325 |
const get = () => (typeof data === "function" ? data() : data);
|
| 326 |
node.addEventListener("pointermove", (e) => showTip(get(), e.clientX, e.clientY));
|
| 327 |
node.addEventListener("pointerenter", () => onEnter?.());
|
|
@@ -336,7 +355,26 @@ export function tableView(caption, head, rows, numeric = null) {
|
|
| 336 |
const t = el("table", {}, el("caption", { class: "sr-only", text: caption }),
|
| 337 |
el("thead", {}, el("tr", {}, ...head.map((h, i) => el("th", { class: isNum(i) ? "n" : null, text: h })))),
|
| 338 |
el("tbody", {}, ...rows.map((r) => el("tr", {}, ...r.map((c, i) => el("td", { class: isNum(i) ? "n" : null, text: c }))))));
|
| 339 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 340 |
}
|
| 341 |
|
| 342 |
export const consoleLink = (sql) => `${ROOT}consulta/index.html#q=${encodeURIComponent(sql)}`;
|
|
@@ -352,7 +390,7 @@ export function figure({ title: t, sub, wide = true, sql, table, source = "RUES
|
|
| 352 |
btn.addEventListener("click", () => {
|
| 353 |
const on = sqlBox.classList.toggle("on");
|
| 354 |
btn.setAttribute("aria-expanded", String(on));
|
| 355 |
-
if (on && !sqlBox.firstChild) sqlBox.append(el("pre", { text: sql }),
|
| 356 |
el("div", { class: "row" }, el("a", { class: "btn", href: consoleLink(sql) }, icon("open"), "Ejecutarlo en la consulta SQL")));
|
| 357 |
});
|
| 358 |
acts.append(btn);
|
|
@@ -410,8 +448,22 @@ export function scrolly(steps, draw, label = "", after = null) {
|
|
| 410 |
return box;
|
| 411 |
}
|
| 412 |
|
|
|
|
|
|
|
|
|
|
| 413 |
export function fail(app, e, what = "la historia") {
|
| 414 |
-
|
| 415 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 416 |
console.error(e);
|
| 417 |
}
|
|
|
|
| 134 |
const t = s.replace(/\s*\(.*?\)\s*/g, " ").replace(/\s+/g, " ").trim();
|
| 135 |
return t.length <= max ? t : `${t.slice(0, max - 1).replace(/[\s,;]+\S*$/, "")}…`;
|
| 136 |
};
|
| 137 |
+
// In a sentence, the whole name: a cut "…con surtido compuesto…" reads as a
|
| 138 |
+
// typo in prose (audit A-34). Only the asides in parentheses go.
|
| 139 |
+
export const activityName = (s) => shortActivity(s, Infinity);
|
| 140 |
|
| 141 |
// ------------------------------------------------------------------ DOM
|
| 142 |
export const el = (tag, attrs = {}, ...kids) => {
|
|
|
|
| 172 |
sun: "M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6l1.4 1.4M17 17l1.4 1.4M5.6 18.4L7 17M17 7l1.4-1.4M12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8z",
|
| 173 |
arrow: "M5 12h14M13 6l6 6-6 6",
|
| 174 |
down: "M12 5v14M6 13l6 6 6-6",
|
| 175 |
+
download: "M12 4v11M7 10l5 5 5-5M5 20h14",
|
| 176 |
};
|
| 177 |
const s = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
| 178 |
s.setAttribute("viewBox", "0 0 24 24"); s.setAttribute("fill", "none"); s.setAttribute("stroke", "currentColor");
|
|
|
|
| 184 |
|
| 185 |
// ------------------------------------------------------------------ chrome
|
| 186 |
const NAV = [
|
| 187 |
+
// No "Inicio": the AMC badge is the way home, as on most sites, and the
|
| 188 |
+
// explorer took its room in the bar (2026-10-19).
|
| 189 |
["historias", "historias/index.html", "Historias"],
|
| 190 |
["boletin", "boletin/index.html", "Boletín"],
|
| 191 |
+
["explorar", "explorar/index.html", "Explorar"],
|
| 192 |
["consulta", "consulta/index.html", "Consulta SQL"],
|
| 193 |
["metodologia", "metodologia/index.html", "Metodología", "opt"],
|
| 194 |
];
|
|
|
|
| 206 |
el("span", { class: "name" }, "Analíticas Mercantiles", el("small", { text: "Empresas de Colombia, en datos abiertos" }))),
|
| 207 |
clyxBy(),
|
| 208 |
el("div", { class: "links" }, ...NAV.map(([k, href, label, cls]) =>
|
| 209 |
+
el("a", { href: ROOT + href || "./", class: cls, "aria-current": k === current ? "page" : (current?.startsWith(k + "/") ? "section" : null) },
|
| 210 |
+
// "Consulta SQL" is "SQL" below 720 px, so every link fits down to 360 px.
|
| 211 |
+
...(label === "Consulta SQL" ? [el("span", { class: "long", text: "Consulta " }), "SQL"] : [label]))), theme)));
|
| 212 |
document.body.prepend(nav);
|
| 213 |
document.body.append(el("div", { id: "tip", role: "status", "aria-live": "polite" }));
|
| 214 |
initTheme(theme);
|
|
|
|
| 246 |
el("li", {}, el("a", { href: `${ROOT}historias/index.html`, text: "Historias" })),
|
| 247 |
el("li", {}, el("a", { href: `${ROOT}boletin/index.html`, text: "Boletín mensual" })),
|
| 248 |
el("li", {}, el("a", { href: "https://amc.clyxconsulting.com/feed.xml", text: "Boletín por RSS" })),
|
| 249 |
+
el("li", {}, el("a", { href: `${ROOT}explorar/index.html`, text: "Explorar una actividad" })),
|
| 250 |
el("li", {}, el("a", { href: `${ROOT}consulta/index.html`, text: "Consulta SQL" })))),
|
| 251 |
el("div", {}, el("h4", { text: "Los datos" }), el("ul", {},
|
| 252 |
el("li", {}, el("a", { href: `${ROOT}metodologia/index.html`, text: "Metodología" })),
|
|
|
|
| 328 |
TIPS.set(node, data);
|
| 329 |
// Dense marks (a year of days, sixty age bands) are not each a tab stop:
|
| 330 |
// the table view beside them carries every value to the keyboard.
|
| 331 |
+
// A mark that takes focus says what it is: an image with its value as its
|
| 332 |
+
// name. One that does not is left unnamed; a label on an element with no
|
| 333 |
+
// role is one screen readers ignore (audit A-35), and the table view
|
| 334 |
+
// already carries its value.
|
| 335 |
+
const name = (x) => x ? `${x.title}: ${(x.rows || []).map((r) => `${r.label} ${r.value}`).join(", ")}` : "";
|
| 336 |
+
const now = () => { try { return typeof data === "function" ? data() : data; } catch { return null; } };
|
| 337 |
+
if (focusable) {
|
| 338 |
+
node.setAttribute("tabindex", "0");
|
| 339 |
+
node.setAttribute("role", "img");
|
| 340 |
+
node.setAttribute("aria-label", name(now()) || "Dato de la gráfica");
|
| 341 |
+
// A tooltip computed on demand may change: named again when focused.
|
| 342 |
+
if (typeof data === "function") node.addEventListener("focus", () => { const x = name(now()); if (x) node.setAttribute("aria-label", x); });
|
| 343 |
+
}
|
| 344 |
const get = () => (typeof data === "function" ? data() : data);
|
| 345 |
node.addEventListener("pointermove", (e) => showTip(get(), e.clientX, e.clientY));
|
| 346 |
node.addEventListener("pointerenter", () => onEnter?.());
|
|
|
|
| 355 |
const t = el("table", {}, el("caption", { class: "sr-only", text: caption }),
|
| 356 |
el("thead", {}, el("tr", {}, ...head.map((h, i) => el("th", { class: isNum(i) ? "n" : null, text: h })))),
|
| 357 |
el("tbody", {}, ...rows.map((r) => el("tr", {}, ...r.map((c, i) => el("td", { class: isNum(i) ? "n" : null, text: c }))))));
|
| 358 |
+
const dl = el("button", { class: "linkbtn", type: "button" }, icon("download"), "Descargar CSV");
|
| 359 |
+
dl.addEventListener("click", () => download(csvName(caption), toCSV(head, rows), "text/csv;charset=utf-8"));
|
| 360 |
+
return el("details", { class: "tv" }, el("summary", {}, "Ver como tabla"), el("div", { class: "tv-wrap" }, t),
|
| 361 |
+
el("div", { class: "tv-acts" }, dl));
|
| 362 |
+
}
|
| 363 |
+
|
| 364 |
+
// The table as a reader sees it, for a spreadsheet: semicolons and a BOM,
|
| 365 |
+
// which is how Excel in Colombia (decimal comma) opens a file with accents
|
| 366 |
+
// and "1.234,5" intact. The figures stay formatted, so the file says what the
|
| 367 |
+
// page says; the exact numbers are a query away in the console.
|
| 368 |
+
function toCSV(head, rows) {
|
| 369 |
+
const q = (c) => { const s = String(c ?? ""); return /[";\r\n]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s; };
|
| 370 |
+
return "\ufeff" + [head, ...rows].map((r) => r.map(q).join(";")).join("\r\n") + "\r\n";
|
| 371 |
+
}
|
| 372 |
+
const slug = (s) => s.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
| 373 |
+
const csvName = (caption) => `amc-${slug(location.pathname.split("/").filter((x) => x && x !== "index.html").pop() || "inicio")}-${slug(caption).slice(0, 60)}.csv`;
|
| 374 |
+
export function download(name, text, type) {
|
| 375 |
+
const a = el("a", { href: URL.createObjectURL(new Blob([text], { type })), download: name });
|
| 376 |
+
document.body.append(a); a.click(); a.remove();
|
| 377 |
+
setTimeout(() => URL.revokeObjectURL(a.href), 1000);
|
| 378 |
}
|
| 379 |
|
| 380 |
export const consoleLink = (sql) => `${ROOT}consulta/index.html#q=${encodeURIComponent(sql)}`;
|
|
|
|
| 390 |
btn.addEventListener("click", () => {
|
| 391 |
const on = sqlBox.classList.toggle("on");
|
| 392 |
btn.setAttribute("aria-expanded", String(on));
|
| 393 |
+
if (on && !sqlBox.firstChild) sqlBox.append(el("pre", { text: sql, tabindex: "0" }),
|
| 394 |
el("div", { class: "row" }, el("a", { class: "btn", href: consoleLink(sql) }, icon("open"), "Ejecutarlo en la consulta SQL")));
|
| 395 |
});
|
| 396 |
acts.append(btn);
|
|
|
|
| 448 |
return box;
|
| 449 |
}
|
| 450 |
|
| 451 |
+
// When a page cannot load (audit A-37): what happened in the reader's words,
|
| 452 |
+
// a way to try again and a way out. The browser's own message, in English,
|
| 453 |
+
// goes in a closed line at the bottom for whoever reports it.
|
| 454 |
export function fail(app, e, what = "la historia") {
|
| 455 |
+
const msg = String(e?.message || e);
|
| 456 |
+
const net = /fetch|network|load failed|NetworkError|timed? ?out|HTTP [45]\d\d/i.test(msg);
|
| 457 |
+
const retry = el("button", { class: "btn primary", type: "button", text: "Intentar de nuevo" });
|
| 458 |
+
retry.addEventListener("click", () => location.reload());
|
| 459 |
+
app.replaceChildren(el("section", { class: "error-state", role: "alert" },
|
| 460 |
+
el("p", { class: "kicker", text: "Algo falló" }),
|
| 461 |
+
el("h1", { text: `No pudimos cargar ${what}` }),
|
| 462 |
+
el("p", { class: "dek", text: net
|
| 463 |
+
? "Parece un problema de conexión con los archivos de datos, o los datos se están actualizando en este momento. Suele resolverse en unos minutos."
|
| 464 |
+
: "Algo en esta página no funcionó como esperábamos. Intentar de nuevo suele bastar; si no, el resto del sitio sigue disponible." }),
|
| 465 |
+
el("div", { class: "row" }, retry, el("a", { class: "btn", href: ROOT || "./", text: "Ir al inicio" })),
|
| 466 |
+
el("details", {}, el("summary", { text: "Detalle técnico" }), el("code", { text: msg }))));
|
| 467 |
+
window.__amcError = msg;
|
| 468 |
console.error(e);
|
| 469 |
}
|
assets/charts.js
CHANGED
|
@@ -1090,7 +1090,9 @@ export function jurisdictionMap(container, o) {
|
|
| 1090 |
const H = Math.ceil(y1 - y0) + 8;
|
| 1091 |
proj.fitExtent([[4, 4], [W - 4, H - 4]], main);
|
| 1092 |
const path = d3.geoPath(proj);
|
| 1093 |
-
|
|
|
|
|
|
|
| 1094 |
// Islands a few pixels across get an outline in their own colour, so
|
| 1095 |
// they show at any size, over a faint dark ring, so the palest class
|
| 1096 |
// still stands out from the page; a hit area around them takes the tap.
|
|
|
|
| 1090 |
const H = Math.ceil(y1 - y0) + 8;
|
| 1091 |
proj.fitExtent([[4, 4], [W - 4, H - 4]], main);
|
| 1092 |
const path = d3.geoPath(proj);
|
| 1093 |
+
// A group, not an image: its chambers are buttons, and an image's
|
| 1094 |
+
// children are hidden from assistive technology (axe nested-interactive, A-36).
|
| 1095 |
+
const root = svg(W, H, o.label).attr("role", "group");
|
| 1096 |
// Islands a few pixels across get an outline in their own colour, so
|
| 1097 |
// they show at any size, over a faint dark ring, so the palest class
|
| 1098 |
// still stands out from the page; a hit area around them takes the tap.
|
assets/nav.css
CHANGED
|
@@ -43,6 +43,14 @@ nav.top .theme svg { width: 17px; height: 17px; }
|
|
| 43 |
nav.top .brand .name { display: none; }
|
| 44 |
nav.top .links a { padding: 7px 8px; font-size: 14px; }
|
| 45 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
@media print { nav.top { display: none; } }
|
| 47 |
|
| 48 |
/* ---------------------------------------------------------------- Clyx Consulting
|
|
|
|
| 43 |
nav.top .brand .name { display: none; }
|
| 44 |
nav.top .links a { padding: 7px 8px; font-size: 14px; }
|
| 45 |
}
|
| 46 |
+
@media (max-width: 720px) { nav.top .links a .long { display: none; } }
|
| 47 |
+
@media (max-width: 640px) { nav.top .brand .name { display: none; } }
|
| 48 |
+
@media (max-width: 400px) { nav.top .links a { padding: 7px 6px; font-size: 13px; } }
|
| 49 |
+
@media (max-width: 360px) { nav.top .links a { padding: 7px 4px; font-size: 12.5px; } }
|
| 50 |
+
@media (max-width: 960px) { nav.top .brand .name small { display: none; } }
|
| 51 |
+
/* Metodología returns only where it fits beside "por Clyx" and the explorer. */
|
| 52 |
+
@media (max-width: 880px) { nav.top .links a.opt { display: none; } }
|
| 53 |
+
@media (max-width: 340px) { nav.top .wrap { gap: 8px; } nav.top .links { gap: 0; } }
|
| 54 |
@media print { nav.top { display: none; } }
|
| 55 |
|
| 56 |
/* ---------------------------------------------------------------- Clyx Consulting
|
boletin/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando los boletines…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/boletin/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/boletin/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando los boletines…</p></main>
|
boletin/ultimo/index.html
CHANGED
|
@@ -26,6 +26,8 @@
|
|
| 26 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 27 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 28 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 29 |
</head>
|
| 30 |
<body>
|
| 31 |
<main class="wrap" id="app"><p class="loading">Cargando el boletín…</p></main>
|
|
|
|
| 26 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 27 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 28 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 29 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/boletin/ultimo/">
|
| 30 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/boletin/ultimo/">
|
| 31 |
</head>
|
| 32 |
<body>
|
| 33 |
<main class="wrap" id="app"><p class="loading">Cargando el boletín…</p></main>
|
consulta/index.html
CHANGED
|
@@ -5,6 +5,9 @@
|
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
<title>Consulta SQL · AMC</title>
|
| 7 |
<meta name="description" content="Consulta con SQL el registro empresarial de Colombia — una fila por empresa, verificado — directamente en tu navegador.">
|
|
|
|
|
|
|
|
|
|
| 8 |
<link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">
|
| 9 |
<meta property="og:image" content="https://amc.clyxconsulting.com/assets/og/inicio.png">
|
| 10 |
<meta property="og:image:width" content="1200">
|
|
@@ -171,6 +174,8 @@ footer { color: var(--faint); font-size: 12.5px; padding: 0 0 32px; }
|
|
| 171 |
|
| 172 |
@media (max-width: 560px) { .sm-hide { display: none; } }
|
| 173 |
</style>
|
|
|
|
|
|
|
| 174 |
</head>
|
| 175 |
<body>
|
| 176 |
<nav class="top" aria-label="Principal">
|
|
|
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
<title>Consulta SQL · AMC</title>
|
| 7 |
<meta name="description" content="Consulta con SQL el registro empresarial de Colombia — una fila por empresa, verificado — directamente en tu navegador.">
|
| 8 |
+
<meta property="og:title" content="Consulta SQL del registro empresarial de Colombia">
|
| 9 |
+
<meta property="og:description" content="Una fila por empresa, verificada: consulta con SQL el registro mercantil de Colombia en tu navegador, con 30 ejemplos para empezar.">
|
| 10 |
+
<meta property="og:type" content="website">
|
| 11 |
<link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">
|
| 12 |
<meta property="og:image" content="https://amc.clyxconsulting.com/assets/og/inicio.png">
|
| 13 |
<meta property="og:image:width" content="1200">
|
|
|
|
| 174 |
|
| 175 |
@media (max-width: 560px) { .sm-hide { display: none; } }
|
| 176 |
</style>
|
| 177 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/consulta/">
|
| 178 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/consulta/">
|
| 179 |
</head>
|
| 180 |
<body>
|
| 181 |
<nav class="top" aria-label="Principal">
|
explorar/index.html
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="es" data-root="../">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
+
<title>Explora una actividad · AMC</title>
|
| 7 |
+
<meta name="description" content="Escoge una actividad económica y una región de Colombia: cuántas empresas están activas, cuántas se crean cada año, cuántas siguen y cuáles son las más grandes. Sin escribir SQL.">
|
| 8 |
+
<meta property="og:title" content="Explora una actividad económica en Colombia">
|
| 9 |
+
<meta property="og:description" content="Cuántas empresas activas hay en cada actividad y región, cuántas se crean cada año y cuáles venden más, con los datos abiertos del registro.">
|
| 10 |
+
<meta property="og:type" content="website">
|
| 11 |
+
<link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">
|
| 12 |
+
<meta property="og:image" content="https://amc.clyxconsulting.com/assets/og/inicio.png">
|
| 13 |
+
<meta property="og:image:width" content="1200">
|
| 14 |
+
<meta property="og:image:height" content="630">
|
| 15 |
+
<meta property="og:site_name" content="Analíticas Mercantiles Colombianas">
|
| 16 |
+
<meta name="twitter:card" content="summary_large_image">
|
| 17 |
+
<meta name="twitter:image" content="https://amc.clyxconsulting.com/assets/og/inicio.png">
|
| 18 |
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 19 |
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
| 20 |
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
+
<link rel="stylesheet" href="../assets/amc.css">
|
| 22 |
+
<link rel="stylesheet" href="../assets/nav.css">
|
| 23 |
+
<style>
|
| 24 |
+
.pick { display: grid; gap: 12px; margin: 26px 0 0; max-width: 820px; }
|
| 25 |
+
.pick .act { position: relative; }
|
| 26 |
+
.pick input { width: 100%; box-sizing: border-box; font: 500 18px var(--sans); color: var(--ink); background: var(--surface);
|
| 27 |
+
border: 1px solid var(--border-strong); border-radius: 12px; padding: 14px 16px; box-shadow: var(--shadow); }
|
| 28 |
+
.pick input:focus { outline: 2px solid var(--c1); outline-offset: 1px; }
|
| 29 |
+
.pick .row { display: flex; flex-wrap: wrap; gap: 10px 14px; align-items: center; }
|
| 30 |
+
.sugg { display: grid; gap: 6px; margin: 8px 0 0; }
|
| 31 |
+
.sugg button { display: flex; gap: 12px; align-items: baseline; justify-content: space-between; text-align: left; width: 100%;
|
| 32 |
+
background: var(--surface); border: 1px solid var(--border); border-radius: 11px; padding: 10px 14px;
|
| 33 |
+
font: inherit; color: inherit; cursor: pointer; }
|
| 34 |
+
.sugg button:hover, .sugg button:focus-visible { border-color: var(--border-strong); box-shadow: var(--shadow); }
|
| 35 |
+
.sugg .code { font: 500 12.5px var(--mono); color: var(--muted); margin-right: 8px; }
|
| 36 |
+
.sugg .n { color: var(--ink-2); font-size: 13px; white-space: nowrap; }
|
| 37 |
+
.quick { display: flex; flex-wrap: wrap; gap: 8px; margin: 4px 0 0; }
|
| 38 |
+
.quick button { cursor: pointer; border: 1px solid var(--border); }
|
| 39 |
+
.quick button:hover { border-color: var(--border-strong); }
|
| 40 |
+
.status { color: var(--muted); font-size: 13.5px; margin: 4px 0 0; min-height: 20px; }
|
| 41 |
+
.chosen { margin: 34px 0 0; scroll-margin-top: 80px; }
|
| 42 |
+
.chosen h2 { font: 800 clamp(26px, 4vw, 40px)/1.1 var(--display); letter-spacing: -.03em; margin: 6px 0 0; }
|
| 43 |
+
.facts.x4 { grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 22px 0 0; }
|
| 44 |
+
@media (max-width: 960px) { .facts.x4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
|
| 45 |
+
@media (max-width: 560px) { .facts.x4 { grid-template-columns: minmax(0, 1fr); } }
|
| 46 |
+
.facts.x4 .fact .big { font-size: clamp(30px, 3.6vw, 40px); }
|
| 47 |
+
.firms { display: grid; gap: 6px; }
|
| 48 |
+
.firm { display: grid; grid-template-columns: 28px minmax(0, 1fr) auto; gap: 4px 12px; align-items: baseline;
|
| 49 |
+
padding: 10px 2px; border-bottom: 1px solid var(--border); }
|
| 50 |
+
.firm .k { color: var(--muted); font-variant-numeric: tabular-nums; }
|
| 51 |
+
.firm a { font-weight: 600; text-decoration: none; overflow-wrap: anywhere; }
|
| 52 |
+
.firm a:hover { text-decoration: underline; }
|
| 53 |
+
.firm .v { font-variant-numeric: tabular-nums; white-space: nowrap; text-align: right; }
|
| 54 |
+
.firm .s { grid-column: 2 / 4; color: var(--ink-2); font-size: 13px; }
|
| 55 |
+
</style>
|
| 56 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/explorar/">
|
| 57 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/explorar/">
|
| 58 |
+
</head>
|
| 59 |
+
<body>
|
| 60 |
+
<main class="wrap" id="app"><p class="loading">Cargando…</p></main>
|
| 61 |
+
<noscript><p class="wrap">Esta página necesita JavaScript.</p></noscript>
|
| 62 |
+
<script type="module">
|
| 63 |
+
import * as A from "../assets/amc.js";
|
| 64 |
+
import { columns, barList } from "../assets/charts.js";
|
| 65 |
+
const { el, n, pct, pct1, rich, figure, readThis, tableView, money } = A;
|
| 66 |
+
// A share small enough to round to 0 % says so instead.
|
| 67 |
+
const share = (x) => x >= 0.1 ? pct(x) : x >= 0.001 ? pct1(x) : x > 0 ? "< 0,1 %" : pct(0);
|
| 68 |
+
|
| 69 |
+
A.chrome("explorar");
|
| 70 |
+
const app = document.getElementById("app");
|
| 71 |
+
const norm = (t) => t.normalize("NFD").replace(/[̀-ͯ]/g, "").toLowerCase().replace(/[^a-z0-9ñ ]/g, " ").replace(/\s+/g, " ").trim();
|
| 72 |
+
// Everyday words the official names do not use: "software" is not in 6201's
|
| 73 |
+
// name, nor "restaurante" in 5611's. Added to what a search matches, never shown.
|
| 74 |
+
const ALIAS = {
|
| 75 |
+
"6201": "software programacion desarrollo apps aplicaciones", "6202": "software consultoria informatica sistemas",
|
| 76 |
+
"5820": "software", "5611": "restaurante restaurantes comida", "5613": "cafe cafeteria", "5619": "comidas rapidas",
|
| 77 |
+
"4711": "tienda tiendas minimercado supermercado", "4773": "drogueria farmacia", "6910": "abogados abogado juridica",
|
| 78 |
+
"6920": "contador contadores contabilidad", "8621": "medico consultorio", "8622": "odontologo odontologia",
|
| 79 |
+
"9602": "salon de belleza barberia", "4923": "transporte de carga camiones", "4921": "taxi transporte de pasajeros",
|
| 80 |
+
"7310": "agencia de publicidad marketing", "4111": "construccion de vivienda", "6810": "inmobiliaria finca raiz",
|
| 81 |
+
"1081": "panaderia pan", "4631": "mayorista alimentos", "5511": "hotel hoteles", "7911": "agencia de viajes turismo",
|
| 82 |
+
};
|
| 83 |
+
const MES = ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"];
|
| 84 |
+
const TIPOS = [["todas", "Todas"], ["juridicas", "Sociedades y entidades"], ["naturales", "Personas naturales"]];
|
| 85 |
+
|
| 86 |
+
try {
|
| 87 |
+
const s = await A.summary();
|
| 88 |
+
const Y = s.year;
|
| 89 |
+
const d = await import("../assets/duck.js");
|
| 90 |
+
// The activities with their live companies, and the chambers: what the
|
| 91 |
+
// pickers offer. The newest fiscal year sets which revenue is current.
|
| 92 |
+
const [acts, cams, [{ fy }]] = await Promise.all([
|
| 93 |
+
d.query(`SELECT e.sector_code AS clase, arg_max(a.descripcion, a.edicion) AS nombre, sum(e.activas) AS activas
|
| 94 |
+
FROM explorer e JOIN activities a ON a.clase = e.sector_code GROUP BY 1 ORDER BY 3 DESC`),
|
| 95 |
+
d.query(`SELECT codigo_camara, any_value(chamber) AS chamber, sum(activas) AS activas
|
| 96 |
+
FROM explorer WHERE codigo_camara IS NOT NULL GROUP BY 1 ORDER BY 2`),
|
| 97 |
+
d.query(`SELECT max(anio_fiscal) AS fy FROM explorer_firms`)]);
|
| 98 |
+
const byCode = new Map(acts.map((a) => [a.clase, a]));
|
| 99 |
+
const camName = new Map(cams.map((c) => [c.codigo_camara, A.title(c.chamber)]));
|
| 100 |
+
const allLive = cams.reduce((t, c) => t + c.activas, 0);
|
| 101 |
+
const regionOf = new Map((await d.query(`SELECT codigo, region FROM regions WHERE tipo = 'camara'`)).map((r) => [r.codigo, r.region]));
|
| 102 |
+
for (const a of acts) a.key = norm(`${a.clase} ${a.nombre} ${ALIAS[a.clase] || ""}`);
|
| 103 |
+
|
| 104 |
+
const h = new URLSearchParams(location.hash.slice(1));
|
| 105 |
+
const st = { clase: byCode.has(h.get("clase")) ? h.get("clase") : null,
|
| 106 |
+
camara: camName.has(h.get("camara")) ? h.get("camara") : "",
|
| 107 |
+
tipo: TIPOS.some(([k]) => k === h.get("tipo")) ? h.get("tipo") : "todas" };
|
| 108 |
+
|
| 109 |
+
const input = el("input", { type: "search", placeholder: "Actividad o código CIIU: software, panadería, 4711…", "aria-label": "Actividad económica", autocomplete: "off" });
|
| 110 |
+
const sugg = el("div", { class: "sugg" });
|
| 111 |
+
const sel = el("select", { class: "sel", "aria-label": "Región" }, el("option", { value: "", text: "Todo el país" }),
|
| 112 |
+
...cams.map((c) => el("option", { value: c.codigo_camara, text: camName.get(c.codigo_camara) })));
|
| 113 |
+
sel.value = st.camara;
|
| 114 |
+
const seg = el("div", { class: "seg-ctl", role: "group", "aria-label": "Tipo de empresa" },
|
| 115 |
+
...TIPOS.map(([k, label]) => el("button", { type: "button", "data-k": k, "aria-pressed": String(k === st.tipo), text: label })));
|
| 116 |
+
const quick = el("div", { class: "quick" }, el("span", { class: "status", text: "Las que más empresas activas tienen:" }),
|
| 117 |
+
...acts.slice(0, 6).map((a) => el("button", { type: "button", class: "chip", "data-clase": a.clase, text: A.shortActivity(a.nombre, 34) })));
|
| 118 |
+
const out = el("section", { class: "chosen", "aria-live": "polite" });
|
| 119 |
+
|
| 120 |
+
app.replaceChildren(
|
| 121 |
+
el("header", { class: "story-head", style: "padding-bottom:0" },
|
| 122 |
+
el("p", { class: "kicker", text: "Herramienta · Actividades" }),
|
| 123 |
+
el("h1", { text: "Explora una actividad" }),
|
| 124 |
+
el("p", { class: "dek", text: "Escoge a qué se dedican las empresas y dónde: cuántas están activas, cuántas se crean cada año, cuántas de cada año siguen y cuáles venden más. Sin escribir SQL." }),
|
| 125 |
+
el("div", { class: "pick" }, el("div", { class: "act" }, input, sugg), el("div", { class: "row" }, sel, seg), quick)),
|
| 126 |
+
out,
|
| 127 |
+
readThis(["La actividad es la ", { b: "principal" }, " que la empresa declaró en el registro, con la clasificación CIIU del DANE. Una empresa que hace varias cosas cuenta en una sola."],
|
| 128 |
+
["La región es la ", { b: "cámara de comercio" }, " donde está la matrícula: la jurisdicción del registro, no necesariamente donde opera. El registro abierto no trae el municipio."],
|
| 129 |
+
[{ b: "Activa" }, ` quiere decir que renovó su matrícula en ${Y}. Las creadas en ${Y} van hasta el ${A.date(s.data_through)}.`],
|
| 130 |
+
["Los ingresos son los que la empresa reportó a la Superintendencia de Sociedades. Los bancos, las aseguradoras y las sociedades que cotizan en bolsa reportan a la Superintendencia Financiera y no aparecen."]));
|
| 131 |
+
A.footer(s, { resolution: "todas" });
|
| 132 |
+
A.reveal(app);
|
| 133 |
+
|
| 134 |
+
function showSugg() {
|
| 135 |
+
const q = norm(input.value);
|
| 136 |
+
sugg.replaceChildren();
|
| 137 |
+
if (q.length < 2) return;
|
| 138 |
+
const words = q.split(" ");
|
| 139 |
+
const hits = acts.filter((a) => /^\d+$/.test(q) ? a.clase.startsWith(q) : words.every((w) => a.key.includes(w))).slice(0, 8);
|
| 140 |
+
if (!hits.length) { sugg.append(el("p", { class: "status", text: "Ninguna actividad tiene esas palabras. Prueba con otra, o con el código CIIU." })); return; }
|
| 141 |
+
for (const a of hits)
|
| 142 |
+
sugg.append(el("button", { type: "button", "data-clase": a.clase },
|
| 143 |
+
el("span", {}, el("span", { class: "code", text: a.clase }), a.nombre), el("span", { class: "n", text: `${n(a.activas)} activas` })));
|
| 144 |
+
}
|
| 145 |
+
const choose = (clase) => { st.clase = clase; input.value = byCode.get(clase).nombre; sugg.replaceChildren(); render(true); };
|
| 146 |
+
input.addEventListener("input", showSugg);
|
| 147 |
+
input.addEventListener("keydown", (e) => { if (e.key === "Enter") { e.preventDefault(); sugg.querySelector("button")?.click(); } });
|
| 148 |
+
for (const box of [sugg, quick]) box.addEventListener("click", (e) => { const b = e.target.closest("button[data-clase]"); if (b) choose(b.dataset.clase); });
|
| 149 |
+
sel.addEventListener("change", () => { st.camara = sel.value; render(); });
|
| 150 |
+
seg.addEventListener("click", (e) => {
|
| 151 |
+
const b = e.target.closest("button[data-k]"); if (!b) return;
|
| 152 |
+
st.tipo = b.dataset.k;
|
| 153 |
+
for (const x of seg.children) x.setAttribute("aria-pressed", String(x === b));
|
| 154 |
+
render();
|
| 155 |
+
});
|
| 156 |
+
|
| 157 |
+
let run = 0;
|
| 158 |
+
async function render(scroll = false) {
|
| 159 |
+
if (!st.clase) return;
|
| 160 |
+
const mine = ++run;
|
| 161 |
+
history.replaceState(null, "", `#${new URLSearchParams({ clase: st.clase, ...(st.camara && { camara: st.camara }), tipo: st.tipo })}`);
|
| 162 |
+
input.value = byCode.get(st.clase).nombre;
|
| 163 |
+
const a = byCode.get(st.clase);
|
| 164 |
+
const conds = [`sector_code = ${d.lit(st.clase)}`, st.tipo !== "todas" && `is_juridical = ${st.tipo === "juridicas"}`].filter(Boolean);
|
| 165 |
+
const here = [...conds, st.camara && `codigo_camara = ${d.lit(st.camara)}`].filter(Boolean).join(" AND ");
|
| 166 |
+
const country = conds.join(" AND ");
|
| 167 |
+
const place = st.camara ? camName.get(st.camara) : "todo el país";
|
| 168 |
+
const who = { todas: "empresas", juridicas: "sociedades y entidades", naturales: "comerciantes personas naturales" }[st.tipo];
|
| 169 |
+
const sqlYears = `SELECT formation_year AS anio, sum(empresas) AS creadas, sum(activas) AS siguen_activas\nFROM explorer\nWHERE ${here} AND formation_year IS NOT NULL\nGROUP BY 1 ORDER BY 1`;
|
| 170 |
+
const sqlCams = `SELECT codigo_camara, any_value(chamber) AS camara, sum(activas) AS activas\nFROM explorer\nWHERE ${country}\nGROUP BY codigo_camara HAVING sum(activas) > 0\nORDER BY 3 DESC`;
|
| 171 |
+
const sqlFirms = `SELECT display_name, anio_fiscal, ingresos, is_live\nFROM explorer_firms\nWHERE sector_code = ${d.lit(st.clase)}${st.camara ? ` AND codigo_camara = ${d.lit(st.camara)}` : ""} AND anio_fiscal >= ${fy - 1}\nORDER BY ingresos DESC LIMIT 10`;
|
| 172 |
+
const sqlMonths = `SELECT mes, sum(empresas) AS creadas\nFROM explorer_months\nWHERE ${here}\nGROUP BY 1 ORDER BY 1`;
|
| 173 |
+
// Per inhabitant, by region: a chamber's region, and the region's people
|
| 174 |
+
// (DANE's projection for this year), summed over its departments.
|
| 175 |
+
const sqlRegion = `WITH cam AS (SELECT codigo, region FROM regions WHERE tipo = 'camara'),
|
| 176 |
+
pob AS (SELECT r.region, sum(p.poblacion) AS poblacion FROM regions r
|
| 177 |
+
JOIN population p ON p.dp = r.codigo AND p.anio = ${Y}
|
| 178 |
+
WHERE r.tipo = 'departamento' GROUP BY 1)
|
| 179 |
+
SELECT cam.region, sum(e.activas) AS activas, any_value(pob.poblacion) AS poblacion,
|
| 180 |
+
100000.0 * sum(e.activas) / any_value(pob.poblacion) AS por_100000
|
| 181 |
+
FROM explorer e JOIN cam ON cam.codigo = e.codigo_camara JOIN pob USING (region)
|
| 182 |
+
WHERE ${country}
|
| 183 |
+
GROUP BY 1 ORDER BY 4 DESC`;
|
| 184 |
+
out.replaceChildren(el("p", { class: "status", text: "Contando…" }));
|
| 185 |
+
const [years, byCam, firms, months, regions] = await Promise.all([d.query(sqlYears), d.query(sqlCams),
|
| 186 |
+
st.tipo === "naturales" ? [] : d.query(sqlFirms), d.query(sqlMonths), d.query(sqlRegion)]);
|
| 187 |
+
if (mine !== run) return; // a newer choice is already drawing
|
| 188 |
+
|
| 189 |
+
const y = new Map(years.map((r) => [r.anio, r]));
|
| 190 |
+
const live = years.reduce((t, r) => t + r.siguen_activas, 0);
|
| 191 |
+
const liveCountry = byCam.reduce((t, r) => t + r.activas, 0);
|
| 192 |
+
const made = (k) => y.get(k)?.creadas ?? 0;
|
| 193 |
+
const head = el("header", {},
|
| 194 |
+
el("p", { class: "kicker", text: `${a.clase} · ${place}` }),
|
| 195 |
+
el("h2", { text: A.cap(a.nombre) }),
|
| 196 |
+
el("div", { class: "meta", style: "margin-top:12px" }, el("span", { class: "chip", text: A.cap(who) }), A.shareButton()));
|
| 197 |
+
if (!years.length) {
|
| 198 |
+
out.replaceChildren(head, el("p", { class: "lede", style: "margin-top:18px", text: `No hay ${who} con esta actividad en ${place}.` }));
|
| 199 |
+
return;
|
| 200 |
+
}
|
| 201 |
+
const fact = (big, parts) => el("div", { class: "fact" }, el("p", { class: "big", text: big }), rich("p", {}, parts));
|
| 202 |
+
const prev = made(Y - 1), prev2 = made(Y - 2);
|
| 203 |
+
const facts = el("div", { class: "facts x4" },
|
| 204 |
+
fact(n(live), [`${who} activas: renovaron su matrícula en ${Y}.`]),
|
| 205 |
+
fact(n(prev), [`se crearon en ${Y - 1}`, prev2 ? `, ${A.signedPct(prev / prev2 - 1)} frente a ${Y - 2} (${n(prev2)}).` : "."]),
|
| 206 |
+
fact(n(made(Y)), [`se han creado en ${Y}, hasta el ${A.dayMonth(s.data_through)}.`]),
|
| 207 |
+
st.camara
|
| 208 |
+
? fact(share(liveCountry ? live / liveCountry : 0), ["de las ", { b: n(liveCountry) }, ` activas del país en esta actividad están en ${place}.`])
|
| 209 |
+
: fact(share(live / allLive), ["de todas las empresas activas del país, ", { b: n(allLive) }, ", se dedican a esto."]));
|
| 210 |
+
|
| 211 |
+
// Created each year, and how many of each year still renew: the last 30.
|
| 212 |
+
const span = years.filter((r) => r.anio >= Y - 29 && r.anio <= Y);
|
| 213 |
+
const f1 = figure({ title: "Cuántas se crean cada año, y cuántas siguen",
|
| 214 |
+
sub: `La columna entera es lo que se creó ese año; la parte de abajo, las que siguen activas en ${Y}. ${Y} va hasta el ${A.date(s.data_through)}.`,
|
| 215 |
+
sql: sqlYears, source: "RUES · Confecámaras. Cálculos de AMC." });
|
| 216 |
+
f1.body.append(A.legend([{ label: `Siguen activas en ${Y}`, color: "var(--accent)" }, { label: "Ya no renuevan", color: "var(--c1)" }]));
|
| 217 |
+
columns(f1.body, span.map((r) => ({ label: r.anio % 5 === 0 ? String(r.anio) : "", value: r.creadas, part: r.siguen_activas,
|
| 218 |
+
tip: { title: String(r.anio), rows: [{ label: "Creadas", value: n(r.creadas) }, { label: "Siguen activas", value: n(r.siguen_activas) },
|
| 219 |
+
{ label: "De cada 100", value: n(100 * r.siguen_activas / r.creadas) }] } })),
|
| 220 |
+
{ label: `Empresas creadas por año en ${a.nombre}, ${place}`, labelEvery: () => 1 });
|
| 221 |
+
f1.fig.append(tableView(`Empresas creadas y activas por año: ${a.nombre}, ${place}`, ["Año", "Creadas", "Siguen activas", "De cada 100"],
|
| 222 |
+
years.slice().reverse().map((r) => [String(r.anio), n(r.creadas), n(r.siguen_activas), n(100 * r.siguen_activas / r.creadas)])));
|
| 223 |
+
|
| 224 |
+
// Month by month, the last 24: what opened last month, without SQL.
|
| 225 |
+
const byMonth = new Map(months.map((r) => [r.mes.slice(0, 7), r.creadas]));
|
| 226 |
+
const last = s.data_through.slice(0, 7), [ly, lm] = last.split("-").map(Number);
|
| 227 |
+
const m24 = Array.from({ length: 24 }, (_, i) => { const dt = new Date(Date.UTC(ly, lm - 24 + i, 1)); return dt.toISOString().slice(0, 7); });
|
| 228 |
+
const mLabel = (k) => `${MES[+k.slice(5) - 1]} ${k.slice(0, 4)}`;
|
| 229 |
+
const prevM = m24[22];
|
| 230 |
+
const f1m = figure({ title: `Mes a mes: ${n(byMonth.get(prevM) ?? 0)} en ${mLabel(prevM)}`,
|
| 231 |
+
sub: `Empresas creadas cada mes, los últimos 24. ${A.cap(mLabel(last))} va hasta el ${A.dayMonth(s.data_through)}.`,
|
| 232 |
+
sql: sqlMonths, source: "RUES · Confecámaras. Cálculos de AMC." });
|
| 233 |
+
columns(f1m.body, m24.map((k) => ({ label: k.endsWith("-01") || k === m24[0] ? mLabel(k) : "", value: byMonth.get(k) ?? 0,
|
| 234 |
+
color: k === last ? "var(--other)" : null, tip: { title: mLabel(k), rows: [{ label: "Creadas", value: n(byMonth.get(k) ?? 0) }] } })),
|
| 235 |
+
{ label: `Empresas creadas por mes en ${a.nombre}, ${place}`, labelEvery: () => 1 });
|
| 236 |
+
f1m.fig.append(tableView(`Empresas creadas por mes: ${a.nombre}, ${place}`, ["Mes", "Creadas"],
|
| 237 |
+
m24.slice().reverse().map((k) => [mLabel(k), n(byMonth.get(k) ?? 0)])));
|
| 238 |
+
|
| 239 |
+
// Where the live ones are: every chamber, the chosen one marked.
|
| 240 |
+
const top = byCam.slice(0, 12);
|
| 241 |
+
const chosen = st.camara ? byCam.find((r) => r.codigo_camara === st.camara) : null;
|
| 242 |
+
if (chosen && !top.includes(chosen)) top.push(chosen);
|
| 243 |
+
const f2 = figure({ title: "Dónde están las activas", sub: `Por cámara de comercio, de ${n(liveCountry)} ${who} activas del país en esta actividad.`,
|
| 244 |
+
sql: sqlCams, source: "RUES · Confecámaras. Cálculos de AMC." });
|
| 245 |
+
barList(f2.body, top.map((r) => ({ label: A.title(r.camara), value: r.activas, strong: r === chosen, dim: chosen && r !== chosen })),
|
| 246 |
+
{ unit: "Activas", labelWidth: 220 });
|
| 247 |
+
f2.fig.append(tableView(`Empresas activas por cámara: ${a.nombre}`, ["Cámara", "Activas", "Del país"],
|
| 248 |
+
byCam.map((r) => [A.title(r.camara), n(r.activas), pct(r.activas / liveCountry)])));
|
| 249 |
+
|
| 250 |
+
// Per 100,000 inhabitants, by region: where the activity is dense, not just big.
|
| 251 |
+
// Ranked only where 20 or more are live: below that one company moves the rate.
|
| 252 |
+
const MIN = 20, ranked = regions.filter((r) => r.activas >= MIN);
|
| 253 |
+
const myRegion = st.camara ? regions.find((r) => r.region === regionOf.get(st.camara)) : null;
|
| 254 |
+
const f2p = figure({ title: ranked.length ? `Por cada 100.000 habitantes: ${A.title(ranked[0].region)} primero` : "Por cada 100.000 habitantes",
|
| 255 |
+
sub: `${A.cap(who)} activas por cada 100.000 habitantes de cada región, con la población que el DANE proyecta para ${Y}. La región es la de la cámara. En la gráfica, solo regiones con ${MIN} o más activas: con menos, una sola empresa mueve la cifra; la tabla las trae todas.`,
|
| 256 |
+
sql: sqlRegion, source: "RUES · Confecámaras y DANE (proyecciones de población). Cálculos de AMC." });
|
| 257 |
+
const topR = ranked.slice(0, 12);
|
| 258 |
+
if (myRegion && myRegion.activas >= MIN && !topR.includes(myRegion)) topR.push(myRegion);
|
| 259 |
+
barList(f2p.body, topR.map((r) => ({ label: A.title(r.region), value: r.por_100000, strong: r === myRegion, dim: myRegion && r !== myRegion })),
|
| 260 |
+
{ unit: "Por 100.000 habitantes", labelWidth: 220, format: (v) => A.n1(v) });
|
| 261 |
+
f2p.fig.append(tableView(`Activas por cada 100.000 habitantes, por región: ${a.nombre}`, ["Región", "Activas", "Habitantes", "Por 100.000"],
|
| 262 |
+
regions.map((r) => [A.title(r.region), n(r.activas), n(r.poblacion), A.n1(r.por_100000)])));
|
| 263 |
+
|
| 264 |
+
const blocks = [head, facts, f1.fig, f1m.fig, f2.fig, f2p.fig];
|
| 265 |
+
if (st.tipo !== "naturales") {
|
| 266 |
+
const f3 = figure({ title: "Las que más venden", wide: false,
|
| 267 |
+
sub: `Ingresos de su último año reportado (${fy - 1} o ${fy}), entre las que reportan a la Superintendencia de Sociedades.`,
|
| 268 |
+
sql: sqlFirms, source: "Superintendencia de Sociedades (estados financieros NIIF) y RUES · Confecámaras. Cálculos de AMC." });
|
| 269 |
+
if (!firms.length) f3.body.append(el("p", { class: "lede", text: `Ninguna empresa de esta actividad en ${place} reportó estados financieros en ${fy - 1} o ${fy}. Solo reportan las obligadas, unas 30.000 al año: eso no dice que sean pequeñas.` }));
|
| 270 |
+
else {
|
| 271 |
+
f3.body.append(el("div", { class: "firms" }, ...firms.map((r, i) => el("div", { class: "firm" },
|
| 272 |
+
el("span", { class: "k", text: String(i + 1) }),
|
| 273 |
+
el("a", { href: `../historias/tu-empresa/index.html#nit=${r.nit}`, text: r.display_name }),
|
| 274 |
+
el("span", { class: "v", text: `${money(r.ingresos)} de pesos` }),
|
| 275 |
+
el("span", { class: "s", text: `Ingresos de ${r.anio_fiscal}${r.is_live ? "" : " · no renovó en " + Y}` })))));
|
| 276 |
+
f3.fig.append(tableView(`Las que más venden: ${a.nombre}, ${place}`, ["Empresa", "Año", "Ingresos (millones de pesos)"],
|
| 277 |
+
firms.map((r) => [r.display_name, String(r.anio_fiscal), n(r.ingresos / 1e3)])));
|
| 278 |
+
}
|
| 279 |
+
blocks.push(f3.fig);
|
| 280 |
+
}
|
| 281 |
+
out.replaceChildren(...blocks);
|
| 282 |
+
A.reveal(out);
|
| 283 |
+
if (scroll) out.scrollIntoView({ behavior: matchMedia("(prefers-reduced-motion: reduce)").matches ? "auto" : "smooth", block: "start" });
|
| 284 |
+
}
|
| 285 |
+
if (st.clase) render();
|
| 286 |
+
} catch (e) {
|
| 287 |
+
A.fail(app, e, "el explorador");
|
| 288 |
+
}
|
| 289 |
+
</script>
|
| 290 |
+
</body>
|
| 291 |
+
</html>
|
historias/abril-2020/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
@@ -71,7 +73,7 @@ try {
|
|
| 71 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: A.dayMonth(recovered) }),
|
| 72 |
rich("p", {}, ["Ese día, el ritmo semanal de creación de empresas volvió a ser el de las mismas fechas de 2019: ", { b: `${Math.round((A.parseDate(recovered) - A.parseDate(lockStart)) / 864e5)} días` }, " después de empezar la cuarentena."])),
|
| 73 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: A.signedPct(top.ch) }),
|
| 74 |
-
rich("p", {}, ["Las empresas de ", { b: A.
|
| 75 |
|
| 76 |
// ------------------------------------------------------------- 1. 2020 vs 2019
|
| 77 |
const days20 = keys.filter((k) => k >= "2020-01-01" && k < "2021-01-01");
|
|
@@ -171,7 +173,7 @@ try {
|
|
| 171 |
prose({ h2: "No todos se detuvieron igual" },
|
| 172 |
["En abril y mayo de 2020 se crearon ", { b: A.signedPct(hosp.ch).replace("−", "") + " menos" }, " empresas de alojamiento y comida que un año antes. El transporte y almacenamiento, en cambio, cayó apenas un ", { b: pct(Math.abs(trans.ch)) }, `: la logística siguió funcionando, y sobre el año completo terminó ${trans.chy > 0 ? "creciendo" : "cayendo"} un ${pct(Math.abs(trans.chy))}. El comercio cerró 2020 ${com.chy >= 0 ? "por encima" : "por debajo"} de 2019.`]),
|
| 173 |
f3.fig,
|
| 174 |
-
prose(["Mirando la actividad exacta, la pandemia se ve con nitidez. Se crearon más empresas de ", { b: A.
|
| 175 |
web ? [" y de ", { b: "comercio por internet" }, ` (${A.signedPct(web.ch)})`] : "", ". Y una pareja lo resume: las empresas de ", { b: "bares y expendios de bebidas para consumo en el lugar" }, ` ${bars ? A.signedPct(bars.ch) : ""}, y las de `, { b: "tiendas de bebidas y tabaco" }, ` ${shops ? A.signedPct(shops.ch) : ""}.`].flat()),
|
| 176 |
f4.fig,
|
| 177 |
prose("El golpe tampoco fue igual en todas partes. Las cámaras con más actividad en abril y mayo cayeron, pero unas mucho más que otras."),
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/abril-2020/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/abril-2020/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 73 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: A.dayMonth(recovered) }),
|
| 74 |
rich("p", {}, ["Ese día, el ritmo semanal de creación de empresas volvió a ser el de las mismas fechas de 2019: ", { b: `${Math.round((A.parseDate(recovered) - A.parseDate(lockStart)) / 864e5)} días` }, " después de empezar la cuarentena."])),
|
| 75 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: A.signedPct(top.ch) }),
|
| 76 |
+
rich("p", {}, ["Las empresas de ", { b: A.activityName(top.descripcion).toLowerCase() }, ` pasaron de ${n(top.anio_2019)} creadas en 2019 a ${n(top.anio_2020)} en 2020, el mayor salto de cualquier actividad.`])));
|
| 77 |
|
| 78 |
// ------------------------------------------------------------- 1. 2020 vs 2019
|
| 79 |
const days20 = keys.filter((k) => k >= "2020-01-01" && k < "2021-01-01");
|
|
|
|
| 173 |
prose({ h2: "No todos se detuvieron igual" },
|
| 174 |
["En abril y mayo de 2020 se crearon ", { b: A.signedPct(hosp.ch).replace("−", "") + " menos" }, " empresas de alojamiento y comida que un año antes. El transporte y almacenamiento, en cambio, cayó apenas un ", { b: pct(Math.abs(trans.ch)) }, `: la logística siguió funcionando, y sobre el año completo terminó ${trans.chy > 0 ? "creciendo" : "cayendo"} un ${pct(Math.abs(trans.chy))}. El comercio cerró 2020 ${com.chy >= 0 ? "por encima" : "por debajo"} de 2019.`]),
|
| 175 |
f3.fig,
|
| 176 |
+
prose(["Mirando la actividad exacta, la pandemia se ve con nitidez. Se crearon más empresas de ", { b: A.activityName(top.descripcion).toLowerCase() }, ` (${A.signedPct(top.ch)})`,
|
| 177 |
web ? [" y de ", { b: "comercio por internet" }, ` (${A.signedPct(web.ch)})`] : "", ". Y una pareja lo resume: las empresas de ", { b: "bares y expendios de bebidas para consumo en el lugar" }, ` ${bars ? A.signedPct(bars.ch) : ""}, y las de `, { b: "tiendas de bebidas y tabaco" }, ` ${shops ? A.signedPct(shops.ch) : ""}.`].flat()),
|
| 178 |
f4.fig,
|
| 179 |
prose("El golpe tampoco fue igual en todas partes. Las cámaras con más actividad en abril y mayo cayeron, pero unas mucho más que otras."),
|
historias/carrera/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/carrera/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/carrera/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/concentracion/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
@@ -128,6 +130,7 @@ try {
|
|
| 128 |
prose(["Y arriba casi no hay cambios. De las ", { b: `${n(topN)} empresas más grandes de ${P.desde}` }, `, el ${pct(stayed)} seguía en el 10% más grande en ${yr}.`]),
|
| 129 |
f5.fig,
|
| 130 |
readThis(["Solo están las empresas ", { b: "obligadas a reportar" }, " a la Superintendencia de Sociedades, y casi todas las cifras son de las que reportaron todos los años: las que cerraron, se fusionaron o dejaron de estar obligadas no están. No dice cómo se reparte el ingreso entre todas las empresas del país, que en su mayoría no reportan."],
|
|
|
|
| 131 |
["Los ingresos son los del ", { b: "reporte propio" }, " de cada empresa: un grupo empresarial aparece repartido entre sus sociedades, y una empresa que absorbe a otra crece aunque nada haya cambiado. Sumar ingresos no es medir la economía: una venta entre dos de ellas cuenta dos veces."],
|
| 132 |
["Los años que una empresa reportó en otra unidad, en pesos en vez de miles, se dejan por fuera. No hay empresas con nombre: todas las cifras son de grupos."]),
|
| 133 |
moreStories("concentracion"));
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/concentracion/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/concentracion/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 130 |
prose(["Y arriba casi no hay cambios. De las ", { b: `${n(topN)} empresas más grandes de ${P.desde}` }, `, el ${pct(stayed)} seguía en el 10% más grande en ${yr}.`]),
|
| 131 |
f5.fig,
|
| 132 |
readThis(["Solo están las empresas ", { b: "obligadas a reportar" }, " a la Superintendencia de Sociedades, y casi todas las cifras son de las que reportaron todos los años: las que cerraron, se fusionaron o dejaron de estar obligadas no están. No dice cómo se reparte el ingreso entre todas las empresas del país, que en su mayoría no reportan."],
|
| 133 |
+
["Tampoco están las más grandes de todas: los bancos, las aseguradoras y las sociedades que cotizan en bolsa, como Ecopetrol o Bancolombia, reportan a la ", { b: "Superintendencia Financiera" }, ". El «10% más grande» es el de las empresas que reportan a la de Sociedades."],
|
| 134 |
["Los ingresos son los del ", { b: "reporte propio" }, " de cada empresa: un grupo empresarial aparece repartido entre sus sociedades, y una empresa que absorbe a otra crece aunque nada haya cambiado. Sumar ingresos no es medir la economía: una venta entre dos de ellas cuenta dos veces."],
|
| 135 |
["Los años que una empresa reportó en otra unidad, en pesos en vez de miles, se dejan por fuera. No hay empresas con nombre: todas las cifras son de grupos."]),
|
| 136 |
moreStories("concentracion"));
|
historias/conexiones/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/conexiones/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/conexiones/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/depuraciones/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/depuraciones/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/depuraciones/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/duracion/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
@@ -54,9 +56,9 @@ try {
|
|
| 54 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: pct(T.soc) }),
|
| 55 |
rich("p", {}, ["de las ", { b: "sociedades" }, ` creadas entre ${from} y ${to} seguía renovando tres años después; de los comerciantes personas naturales, el `, { b: pct(T.nat) }, "."])),
|
| 56 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: pct(SOC[0].rate) }),
|
| 57 |
-
rich("p", {}, ["de las sociedades de ", { b: A.
|
| 58 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: pct(NAT[NAT.length - 1].rate) }),
|
| 59 |
-
rich("p", {}, ["de los comerciantes de ", { b: A.
|
| 60 |
|
| 61 |
const f1 = figure({ title: "Sociedades: las actividades más y menos estables",
|
| 62 |
sub: `Diferencia, en puntos porcentuales, entre el porcentaje de sociedades de cada actividad que seguía renovando tres años después y el promedio de las sociedades (${pct(T.soc)}). Las diez más altas y las diez más bajas.`, sql: st.sql("clases") });
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/duracion/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/duracion/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 56 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: pct(T.soc) }),
|
| 57 |
rich("p", {}, ["de las ", { b: "sociedades" }, ` creadas entre ${from} y ${to} seguía renovando tres años después; de los comerciantes personas naturales, el `, { b: pct(T.nat) }, "."])),
|
| 58 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: pct(SOC[0].rate) }),
|
| 59 |
+
rich("p", {}, ["de las sociedades de ", { b: A.activityName(SOC[0].descripcion).toLowerCase() }, " seguía renovando: la actividad más estable entre las sociedades."])),
|
| 60 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: pct(NAT[NAT.length - 1].rate) }),
|
| 61 |
+
rich("p", {}, ["de los comerciantes de ", { b: A.activityName(NAT[NAT.length - 1].descripcion).toLowerCase() }, " seguía renovando: la actividad con menos continuidad."])));
|
| 62 |
|
| 63 |
const f1 = figure({ title: "Sociedades: las actividades más y menos estables",
|
| 64 |
sub: `Diferencia, en puntos porcentuales, entre el porcentaje de sociedades de cada actividad que seguía renovando tres años después y el promedio de las sociedades (${pct(T.soc)}). Las diez más altas y las diez más bajas.`, sql: st.sql("clases") });
|
historias/gacelas/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/gacelas/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/gacelas/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/gobiernos/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/gobiernos/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/gobiernos/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/index.html
CHANGED
|
@@ -19,6 +19,8 @@
|
|
| 19 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 20 |
<link rel="stylesheet" href="../assets/amc.css">
|
| 21 |
<link rel="stylesheet" href="../assets/nav.css">
|
|
|
|
|
|
|
| 22 |
</head>
|
| 23 |
<body>
|
| 24 |
<main class="wrap" id="app"><p class="loading">Cargando las historias…</p></main>
|
|
|
|
| 19 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 20 |
<link rel="stylesheet" href="../assets/amc.css">
|
| 21 |
<link rel="stylesheet" href="../assets/nav.css">
|
| 22 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/">
|
| 23 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/">
|
| 24 |
</head>
|
| 25 |
<body>
|
| 26 |
<main class="wrap" id="app"><p class="loading">Cargando las historias…</p></main>
|
historias/latido/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/latido/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/latido/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/margenes/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/margenes/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/margenes/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/marzo/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/marzo/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/marzo/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/migracion/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/migracion/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/migracion/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/negocios/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
@@ -60,11 +62,11 @@ try {
|
|
| 60 |
|
| 61 |
const findings = el("div", { class: "findings" },
|
| 62 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: n(top.activas) }),
|
| 63 |
-
rich("p", {}, ["empresas activas se dedican a ", { b: A.
|
| 64 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: pct(top10 / total) }),
|
| 65 |
rich("p", {}, ["de las empresas activas caben en solo ", { b: "diez actividades" }, ` de las ${n(K.length)}. El resto se reparte en una cola larga de negocios.`])),
|
| 66 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: `${A.n1(churn[0].ratio * 100)}%` }),
|
| 67 |
-
rich("p", {}, [`es la proporción entre las empresas de `, { b: A.
|
| 68 |
|
| 69 |
const f1 = figure({ title: "Todas las empresas activas del país, por actividad",
|
| 70 |
sub: "El área es el número de empresas activas. El color, qué parte son comerciantes personas naturales: más intenso, más personas naturales.", sql: st.sql("clases") });
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/negocios/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/negocios/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 62 |
|
| 63 |
const findings = el("div", { class: "findings" },
|
| 64 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: n(top.activas) }),
|
| 65 |
+
rich("p", {}, ["empresas activas se dedican a ", { b: A.activityName(top.descripcion).toLowerCase() }, `: la actividad más común del país, el ${A.pct1(top.activas / total)} de todas.`])),
|
| 66 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: pct(top10 / total) }),
|
| 67 |
rich("p", {}, ["de las empresas activas caben en solo ", { b: "diez actividades" }, ` de las ${n(K.length)}. El resto se reparte en una cola larga de negocios.`])),
|
| 68 |
el("div", { class: "finding reveal" }, el("p", { class: "n", text: `${A.n1(churn[0].ratio * 100)}%` }),
|
| 69 |
+
rich("p", {}, [`es la proporción entre las empresas de `, { b: A.activityName(churn[0].descripcion).toLowerCase() }, ` creadas en ${year} y las que hay activas: la actividad que más rápido se renueva.`])));
|
| 70 |
|
| 71 |
const f1 = figure({ title: "Todas las empresas activas del país, por actividad",
|
| 72 |
sub: "El área es el número de empresas activas. El color, qué parte son comerciantes personas naturales: más intenso, más personas naturales.", sql: st.sql("clases") });
|
historias/nombres/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/nombres/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/nombres/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/pandemia/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/pandemia/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/pandemia/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/peso/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
@@ -136,6 +138,7 @@ try {
|
|
| 136 |
`. En conjunto, las que más suman son las de ${topSum.franja} años: el ${pct(topSum.ingresos / sum(EI, "ingresos"))} de todos los ingresos.`]),
|
| 137 |
f5.fig,
|
| 138 |
readThis(["Solo están las empresas ", { b: "obligadas a reportar" }, " a la Superintendencia de Sociedades. No son una muestra: una empresa que no reporta no es pequeña, es desconocida. Los comerciantes personas naturales no reportan, y por eso la comparación es con las sociedades activas."],
|
|
|
|
| 139 |
["Los ingresos son los del ", { b: "reporte propio" }, " de cada empresa, no los consolidados de su grupo: un grupo empresarial aparece repartido entre sus sociedades. Y sumar ingresos de empresas no es medir la economía: una venta entre dos de ellas cuenta dos veces."],
|
| 140 |
["La cámara de comercio es la del ", { b: "domicilio" }, " de la empresa, no la de los lugares donde vende. La edad se cuenta desde su primera matrícula."]),
|
| 141 |
moreStories("peso"));
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/peso/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/peso/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 138 |
`. En conjunto, las que más suman son las de ${topSum.franja} años: el ${pct(topSum.ingresos / sum(EI, "ingresos"))} de todos los ingresos.`]),
|
| 139 |
f5.fig,
|
| 140 |
readThis(["Solo están las empresas ", { b: "obligadas a reportar" }, " a la Superintendencia de Sociedades. No son una muestra: una empresa que no reporta no es pequeña, es desconocida. Los comerciantes personas naturales no reportan, y por eso la comparación es con las sociedades activas."],
|
| 141 |
+
["Tampoco están las más grandes de todas: los bancos, las aseguradoras y las sociedades que cotizan en bolsa, como Ecopetrol o Bancolombia, reportan a la ", { b: "Superintendencia Financiera" }, ". «Las que más venden» son, aquí, las que más venden entre las que reportan a la de Sociedades."],
|
| 142 |
["Los ingresos son los del ", { b: "reporte propio" }, " de cada empresa, no los consolidados de su grupo: un grupo empresarial aparece repartido entre sus sociedades. Y sumar ingresos de empresas no es medir la economía: una venta entre dos de ellas cuenta dos veces."],
|
| 143 |
["La cámara de comercio es la del ", { b: "domicilio" }, " de la empresa, no la de los lugares donde vende. La edad se cuenta desde su primera matrícula."]),
|
| 144 |
moreStories("peso"));
|
historias/piramide/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/piramide/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/piramide/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/regiones-tiempo/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/regiones-tiempo/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/regiones-tiempo/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/regiones/index.html
CHANGED
|
@@ -40,6 +40,8 @@ table.all tr.row:hover td { background: var(--surface-2); }
|
|
| 40 |
table.all tr.on td { background: var(--accent-soft); font-weight: 600; }
|
| 41 |
.tablewrap { overflow: auto; max-height: 520px; }
|
| 42 |
</style>
|
|
|
|
|
|
|
| 43 |
</head>
|
| 44 |
<body>
|
| 45 |
<main class="wrap" id="app"><p class="loading">Cargando las regiones…</p></main>
|
|
@@ -188,7 +190,7 @@ try {
|
|
| 188 |
drawTable();
|
| 189 |
const all = el("section", { class: "block" }, el("div", { class: "sec-head" }, el("div", {}, el("p", { class: "kicker", text: "Comparar" }),
|
| 190 |
el("h2", { text: "Todas las cámaras de comercio" }), el("p", { text: "Ordena por cualquier columna y elige una fila para ver su perfil." }))),
|
| 191 |
-
el("div", { class: "card", style: "padding:0" }, el("div", { class: "tablewrap" }, table)));
|
| 192 |
|
| 193 |
sel.addEventListener("change", () => render(sel.value));
|
| 194 |
app.replaceChildren(head, view, all, moreStories("regiones"));
|
|
|
|
| 40 |
table.all tr.on td { background: var(--accent-soft); font-weight: 600; }
|
| 41 |
.tablewrap { overflow: auto; max-height: 520px; }
|
| 42 |
</style>
|
| 43 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/regiones/">
|
| 44 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/regiones/">
|
| 45 |
</head>
|
| 46 |
<body>
|
| 47 |
<main class="wrap" id="app"><p class="loading">Cargando las regiones…</p></main>
|
|
|
|
| 190 |
drawTable();
|
| 191 |
const all = el("section", { class: "block" }, el("div", { class: "sec-head" }, el("div", {}, el("p", { class: "kicker", text: "Comparar" }),
|
| 192 |
el("h2", { text: "Todas las cámaras de comercio" }), el("p", { text: "Ordena por cualquier columna y elige una fila para ver su perfil." }))),
|
| 193 |
+
el("div", { class: "card", style: "padding:0" }, el("div", { class: "tablewrap", tabindex: "0", role: "region", "aria-label": "Tabla de regiones" }, table)));
|
| 194 |
|
| 195 |
sel.addEventListener("change", () => render(sel.value));
|
| 196 |
app.replaceChildren(head, view, all, moreStories("regiones"));
|
historias/sas/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/sas/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/sas/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/software/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/software/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/software/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
|
historias/tu-empresa/index.html
CHANGED
|
@@ -36,7 +36,7 @@
|
|
| 36 |
.profile .pname { font: 800 clamp(28px, 4.4vw, 44px)/1.08 var(--display); letter-spacing: -.03em; margin: 8px 0 0; }
|
| 37 |
.profile .chips { display: flex; flex-wrap: wrap; gap: 8px; margin: 14px 0 0; }
|
| 38 |
.facts2 { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin: 22px 0 0; }
|
| 39 |
-
@media (max-width:
|
| 40 |
.ctx { display: grid; gap: 12px; margin: 22px 0 0; }
|
| 41 |
.ctx .c { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 18px 20px; box-shadow: var(--shadow); }
|
| 42 |
.ctx .c .big { font: 800 34px/1 var(--display); letter-spacing: -.03em; margin: 0 0 6px; }
|
|
@@ -47,6 +47,8 @@
|
|
| 47 |
.chip.ok { background: color-mix(in srgb, var(--up) 14%, transparent); color: var(--up); }
|
| 48 |
.chip.off { background: var(--surface-2); color: var(--ink-2); }
|
| 49 |
</style>
|
|
|
|
|
|
|
| 50 |
</head>
|
| 51 |
<body>
|
| 52 |
<main class="wrap" id="app"><p class="loading">Cargando…</p></main>
|
|
@@ -179,7 +181,7 @@ try {
|
|
| 179 |
if (r.actividad_vivas != null) {
|
| 180 |
const q = { live: r.actividad_vivas, here: r.actividad_camara_vivas };
|
| 181 |
out.push(el("div", { class: "c reveal" }, el("p", { class: "big", text: n(q.live) }),
|
| 182 |
-
rich("p", {}, ["empresas activas en todo el país tienen su misma actividad", act ? [" (", { b: A.
|
| 183 |
}
|
| 184 |
return out;
|
| 185 |
};
|
|
@@ -205,7 +207,7 @@ try {
|
|
| 205 |
const box = el("section", { class: "block", style: "padding-top:28px" },
|
| 206 |
el("p", { class: "kicker", text: "Superintendencia de Sociedades" }), el("h3", { text: "Estados financieros" }));
|
| 207 |
if (!rows.length) {
|
| 208 |
-
box.append(el("p", { class: "lede", text: "Esta empresa no está entre las que reportan estados financieros a la Superintendencia de Sociedades. Eso no dice nada de su tamaño: solo las obligadas a reportar aparecen en estos datos." }));
|
| 209 |
return box;
|
| 210 |
}
|
| 211 |
const last = rows[rows.length - 1];
|
|
@@ -213,7 +215,7 @@ try {
|
|
| 213 |
if (r.ingresos_puesto != null && r.ingresos_anio === last.anio_fiscal) {
|
| 214 |
const q = { n: r.ingresos_entre, above: r.ingresos_puesto - 1 };
|
| 215 |
box.append(rich("p", { class: "lede" }, [`En ${last.anio_fiscal} reportó ingresos por `, { b: `${money(last.ingresos)} de pesos` },
|
| 216 |
-
`. Entre las ${n(q.n)} empresas de ${(sec?.label || "su sector").toLowerCase()} que reportaron ese año, es la `, { b: `número ${n(q.above + 1)}` }, " por ingresos."]));
|
| 217 |
}
|
| 218 |
const max = Math.max(...rows.map((x) => x.ingresos || 0));
|
| 219 |
const card = el("div", { class: "card" });
|
|
@@ -231,7 +233,7 @@ try {
|
|
| 231 |
}
|
| 232 |
card.append(grid, A.tableView("Estados financieros por año, en millones de pesos", ["Año", "Ingresos", "Ganancia", "Activos"],
|
| 233 |
rows.map((x) => [String(x.anio_fiscal), ...[x.ingresos, x.ganancia, x.activos].map((v) => v == null ? "—" : n(v / 1e3))])),
|
| 234 |
-
el("p", { class: "lede", style: "margin:12px 0 0;font-size:13.5px", text: "Ingresos de cada año fiscal, del reporte propio de la empresa (no el consolidado de su grupo). Fuente: estados financieros NIIF, Superintendencia de Sociedades, datos.gov.co." }));
|
| 235 |
box.append(card);
|
| 236 |
return box;
|
| 237 |
}
|
|
|
|
| 36 |
.profile .pname { font: 800 clamp(28px, 4.4vw, 44px)/1.08 var(--display); letter-spacing: -.03em; margin: 8px 0 0; }
|
| 37 |
.profile .chips { display: flex; flex-wrap: wrap; gap: 8px; margin: 14px 0 0; }
|
| 38 |
.facts2 { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin: 22px 0 0; }
|
| 39 |
+
@media (max-width: 900px) { .facts2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
|
| 40 |
.ctx { display: grid; gap: 12px; margin: 22px 0 0; }
|
| 41 |
.ctx .c { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 18px 20px; box-shadow: var(--shadow); }
|
| 42 |
.ctx .c .big { font: 800 34px/1 var(--display); letter-spacing: -.03em; margin: 0 0 6px; }
|
|
|
|
| 47 |
.chip.ok { background: color-mix(in srgb, var(--up) 14%, transparent); color: var(--up); }
|
| 48 |
.chip.off { background: var(--surface-2); color: var(--ink-2); }
|
| 49 |
</style>
|
| 50 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/historias/tu-empresa/">
|
| 51 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/historias/tu-empresa/">
|
| 52 |
</head>
|
| 53 |
<body>
|
| 54 |
<main class="wrap" id="app"><p class="loading">Cargando…</p></main>
|
|
|
|
| 181 |
if (r.actividad_vivas != null) {
|
| 182 |
const q = { live: r.actividad_vivas, here: r.actividad_camara_vivas };
|
| 183 |
out.push(el("div", { class: "c reveal" }, el("p", { class: "big", text: n(q.live) }),
|
| 184 |
+
rich("p", {}, ["empresas activas en todo el país tienen su misma actividad", act ? [" (", { b: A.activityName(act.descripcion).toLowerCase() }, ")"] : "", `; ${n(q.here)} de ellas en ${A.title(r.chamber)}.`].flat())));
|
| 185 |
}
|
| 186 |
return out;
|
| 187 |
};
|
|
|
|
| 207 |
const box = el("section", { class: "block", style: "padding-top:28px" },
|
| 208 |
el("p", { class: "kicker", text: "Superintendencia de Sociedades" }), el("h3", { text: "Estados financieros" }));
|
| 209 |
if (!rows.length) {
|
| 210 |
+
box.append(el("p", { class: "lede", text: "Esta empresa no está entre las que reportan estados financieros a la Superintendencia de Sociedades. Eso no dice nada de su tamaño: solo las obligadas a reportar aparecen en estos datos. Los bancos, las aseguradoras y las sociedades que cotizan en bolsa reportan a la Superintendencia Financiera, y tampoco están." }));
|
| 211 |
return box;
|
| 212 |
}
|
| 213 |
const last = rows[rows.length - 1];
|
|
|
|
| 215 |
if (r.ingresos_puesto != null && r.ingresos_anio === last.anio_fiscal) {
|
| 216 |
const q = { n: r.ingresos_entre, above: r.ingresos_puesto - 1 };
|
| 217 |
box.append(rich("p", { class: "lede" }, [`En ${last.anio_fiscal} reportó ingresos por `, { b: `${money(last.ingresos)} de pesos` },
|
| 218 |
+
`. Entre las ${n(q.n)} empresas de ${(sec?.label || "su sector").toLowerCase()} que reportaron ese año a la Superintendencia de Sociedades, es la `, { b: `número ${n(q.above + 1)}` }, " por ingresos."]));
|
| 219 |
}
|
| 220 |
const max = Math.max(...rows.map((x) => x.ingresos || 0));
|
| 221 |
const card = el("div", { class: "card" });
|
|
|
|
| 233 |
}
|
| 234 |
card.append(grid, A.tableView("Estados financieros por año, en millones de pesos", ["Año", "Ingresos", "Ganancia", "Activos"],
|
| 235 |
rows.map((x) => [String(x.anio_fiscal), ...[x.ingresos, x.ganancia, x.activos].map((v) => v == null ? "—" : n(v / 1e3))])),
|
| 236 |
+
el("p", { class: "lede", style: "margin:12px 0 0;font-size:13.5px", text: "Ingresos de cada año fiscal, del reporte propio de la empresa (no el consolidado de su grupo). Los activos de 2017 vienen, casi siempre, del reporte de 2018, que repite el año anterior: la fuente casi no publicó los de ese año. Fuente: estados financieros NIIF, Superintendencia de Sociedades, datos.gov.co." }));
|
| 237 |
box.append(card);
|
| 238 |
return box;
|
| 239 |
}
|
index.html
CHANGED
|
@@ -19,6 +19,8 @@
|
|
| 19 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 20 |
<link rel="stylesheet" href="assets/amc.css">
|
| 21 |
<link rel="stylesheet" href="assets/nav.css">
|
|
|
|
|
|
|
| 22 |
</head>
|
| 23 |
<body>
|
| 24 |
<main class="wrap" id="app"><p class="loading">Cargando el panorama…</p></main>
|
|
@@ -56,6 +58,7 @@ function hero(s) {
|
|
| 56 |
note,
|
| 57 |
el("div", { style: "display:flex;gap:10px;flex-wrap:wrap;margin-top:24px" },
|
| 58 |
el("a", { class: "btn primary", href: "historias/index.html" }, "Leer las historias", A.icon("arrow")),
|
|
|
|
| 59 |
el("a", { class: "btn", href: "consulta/index.html" }, A.icon("sql"), "Consultar con SQL")),
|
| 60 |
ribbon);
|
| 61 |
}
|
|
@@ -246,11 +249,11 @@ function changes(s) {
|
|
| 246 |
function explore(s) {
|
| 247 |
return el("section", { class: "block", id: "explorar" },
|
| 248 |
el("div", { class: "sec-head" }, el("div", {}, el("p", { class: "kicker", text: "Los datos" }), el("h2", { text: "Haz tus propias preguntas" }),
|
| 249 |
-
el("p", { text: "Los mismos datos que usan las historias, empresa por empresa,
|
| 250 |
el("div", { class: "cta" },
|
| 251 |
-
el("a", { class: "primary", href: "
|
| 252 |
-
el("a", { href: "
|
| 253 |
-
el("a", { href: "metodologia/index.html" }, el("div", { class: "t", text: "
|
| 254 |
}
|
| 255 |
|
| 256 |
function trust(s) {
|
|
|
|
| 19 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 20 |
<link rel="stylesheet" href="assets/amc.css">
|
| 21 |
<link rel="stylesheet" href="assets/nav.css">
|
| 22 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/">
|
| 23 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/">
|
| 24 |
</head>
|
| 25 |
<body>
|
| 26 |
<main class="wrap" id="app"><p class="loading">Cargando el panorama…</p></main>
|
|
|
|
| 58 |
note,
|
| 59 |
el("div", { style: "display:flex;gap:10px;flex-wrap:wrap;margin-top:24px" },
|
| 60 |
el("a", { class: "btn primary", href: "historias/index.html" }, "Leer las historias", A.icon("arrow")),
|
| 61 |
+
el("a", { class: "btn", href: "explorar/index.html" }, "Explorar una actividad"),
|
| 62 |
el("a", { class: "btn", href: "consulta/index.html" }, A.icon("sql"), "Consultar con SQL")),
|
| 63 |
ribbon);
|
| 64 |
}
|
|
|
|
| 249 |
function explore(s) {
|
| 250 |
return el("section", { class: "block", id: "explorar" },
|
| 251 |
el("div", { class: "sec-head" }, el("div", {}, el("p", { class: "kicker", text: "Los datos" }), el("h2", { text: "Haz tus propias preguntas" }),
|
| 252 |
+
el("p", { text: "Los mismos datos que usan las historias, empresa por empresa: sin escribir código, con SQL en tu navegador o descargados." }))),
|
| 253 |
el("div", { class: "cta" },
|
| 254 |
+
el("a", { class: "primary", href: "explorar/index.html" }, el("div", { class: "t", text: "Explorar una actividad →" }), el("div", { class: "d", text: "Cuántas empresas hay en tu actividad y tu región, cuántas se crean cada mes y cuáles venden más. Sin SQL." })),
|
| 255 |
+
el("a", { href: "consulta/index.html" }, el("div", { class: "t", text: "Consulta SQL →" }), el("div", { class: "d", text: `${A.words(s.headline.companies)} de empresas, en tu navegador, sin instalar nada` })),
|
| 256 |
+
el("a", { href: "metodologia/index.html#datos" }, el("div", { class: "t", text: "Datos abiertos" }), el("div", { class: "d", text: "Archivos Parquet con licencia CC BY-SA 4.0, para cualquier herramienta" }))));
|
| 257 |
}
|
| 258 |
|
| 259 |
function trust(s) {
|
metodologia/comparacion/index.html
CHANGED
|
@@ -20,6 +20,8 @@
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
|
|
|
|
|
|
| 23 |
</head>
|
| 24 |
<body>
|
| 25 |
<main class="wrap" id="app"><p class="loading">Cargando la comparación…</p></main>
|
|
|
|
| 20 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Inter+Tight:wght@600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
| 21 |
<link rel="stylesheet" href="../../assets/amc.css">
|
| 22 |
<link rel="stylesheet" href="../../assets/nav.css">
|
| 23 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/metodologia/comparacion/">
|
| 24 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/metodologia/comparacion/">
|
| 25 |
</head>
|
| 26 |
<body>
|
| 27 |
<main class="wrap" id="app"><p class="loading">Cargando la comparación…</p></main>
|
metodologia/index.html
CHANGED
|
@@ -5,6 +5,9 @@
|
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
<title>Metodología · AMC</title>
|
| 7 |
<meta name="description" content="De dónde vienen los datos, qué se hizo con ellos, qué significa cada cifra y cómo descargarlos: la ficha metodológica de Analíticas Mercantiles Colombianas.">
|
|
|
|
|
|
|
|
|
|
| 8 |
<link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">
|
| 9 |
<meta property="og:image" content="https://amc.clyxconsulting.com/assets/og/inicio.png">
|
| 10 |
<meta property="og:image:width" content="1200">
|
|
@@ -82,7 +85,7 @@ ol.steps li b { display: block; }
|
|
| 82 |
.facts tr:last-child th, .facts tr:last-child td { border-bottom: 0; }
|
| 83 |
.facts th { width: 38%; color: var(--ink-2); font-weight: 500; }
|
| 84 |
/* On a phone the label goes above its value: side by side, each value wrapped to four lines. */
|
| 85 |
-
@media (max-width:
|
| 86 |
.facts tr { display: block; border-bottom: 1px solid var(--border); }
|
| 87 |
.facts tr:last-child { border-bottom: 0; }
|
| 88 |
.facts th, .facts td { display: block; width: auto; border-bottom: 0; }
|
|
@@ -117,6 +120,8 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
|
|
| 117 |
|
| 118 |
@media (max-width: 560px) { .sm-hide { display: none; } }
|
| 119 |
</style>
|
|
|
|
|
|
|
| 120 |
</head>
|
| 121 |
<body>
|
| 122 |
<nav class="top" aria-label="Principal">
|
|
@@ -170,6 +175,8 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
|
|
| 170 |
<p>Toda empresa, comerciante y entidad sin ánimo de lucro de Colombia se registra en una cámara de comercio. Las cámaras consolidan esos registros en el <b>RUES</b>, que Confecámaras publica como dato abierto en <a href="https://www.datos.gov.co" target="_blank" rel="noopener">datos.gov.co</a> (conjunto <code>c82u-588k</code>): una fila por matrícula, unos 9,4 millones, con 36 columnas.</p>
|
| 171 |
<p>El sistema revisa la fuente cada día y descarga una copia nueva solo cuando cambia, lo que ocurre aproximadamente una vez al mes. Cada copia se verifica contra un conteo independiente de filas antes de usarse. La fuente se publica con un rezago de unos diez días: el corte actual contiene hechos registrados hasta la fecha que indica la ficha técnica, no hasta el día de la descarga.</p>
|
| 172 |
<p id="estados"><b>Una segunda fuente, para el tamaño.</b> El registro no distingue una empresa grande de una pequeña. Las empresas obligadas a reportar a la <b>Superintendencia de Sociedades</b>, unas 30.000 al año, le envían sus estados financieros NIIF de fin de ejercicio, que la Superintendencia publica en datos.gov.co (conjuntos <code>prwj-nzxa</code> y <code>pfdp-zks5</code>). De ellos se toman cinco cifras por empresa y año: ingresos, ganancia, activos, pasivos y patrimonio, en miles de pesos. Se unen al registro por el NIT, y más del 99,9 % encuentra su empresa. Se revisan cada semana y se publican en la tabla <code>financials</code>.</p>
|
|
|
|
|
|
|
| 173 |
<p>De cada empresa se toma su <b>reporte propio</b>, individual o separado, nunca el consolidado, que suma las cifras de sus subordinadas. Si presentó más de uno para el mismo año, se toma el más reciente, y si cierra cuentas cada seis meses, los ingresos y la ganancia del año suman los dos semestres. Cada estado trae también las cifras del año anterior para comparar, y las comprobaciones verifican que coincidan con las que la empresa reportó ese año.</p>
|
| 174 |
</section>
|
| 175 |
|
|
@@ -193,6 +200,8 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
|
|
| 193 |
<dd>El registro de una empresa o comerciante en una cámara de comercio. Es la unidad de la fuente: una fila del RUES.</dd>
|
| 194 |
<dt>Empresa</dt>
|
| 195 |
<dd>Una persona jurídica o un comerciante persona natural, con todas sus matrículas reunidas. Es la unidad de este panorama: una empresa con matrículas en tres cámaras cuenta una vez.</dd>
|
|
|
|
|
|
|
| 196 |
<dt id="activa">Empresa activa</dt>
|
| 197 |
<dd>La que <b>renovó su matrícula mercantil en el año en curso</b>. Es la única señal de actividad que la fuente registra de forma verificable. No es lo mismo que el estado “ACTIVA” de la matrícula (ver los matices).</dd>
|
| 198 |
<dt>Persona jurídica y persona natural</dt>
|
|
@@ -260,7 +269,7 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
|
|
| 260 |
<h2>Lo que estos datos no pueden decir</h2>
|
| 261 |
<p><b>Cuánto dura una empresa.</b> La fuente guarda solo el último año en que cada empresa renovó, no la historia de sus renovaciones. Se puede saber cuántas empresas creadas en un año siguen renovando hoy, pero no calcular con rigor cuánto tiempo sobreviven (<a href="#supervivencia">por qué</a>).</p>
|
| 262 |
<p><b>Dónde está o cómo contactarla.</b> El RUES abierto no publica direcciones, municipios, teléfonos ni correos. La ubicación disponible es la cámara de comercio.</p>
|
| 263 |
-
<p><b>El tamaño de la mayoría de las empresas.</b> Los ingresos y activos solo existen para las empresas que reportan a la Superintendencia de Sociedades, que no son una muestra: son las obligadas a reportar, en su mayoría grandes y medianas. Una empresa sin estados financieros no es pequeña: no se sabe. Y ninguna fuente aquí mide empleados.</p>
|
| 264 |
<p><b>Quién es cada comerciante persona natural.</b> Por decisión deliberada: ver privacidad.</p>
|
| 265 |
</section>
|
| 266 |
|
|
@@ -293,11 +302,11 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
|
|
| 293 |
<h3>En Power BI</h3>
|
| 294 |
<p class="muted">Descarga el archivo y usa <i>Obtener datos → Parquet</i>.</p>
|
| 295 |
<h3>En Python</h3>
|
| 296 |
-
<pre><code>import duckdb # pip install duckdb
|
| 297 |
url = "https://huggingface.co/datasets/clyxconsultingdev/amc-rues/resolve/main/data/companies.parquet"
|
| 298 |
duckdb.sql(f"SELECT chamber, count(*) AS activas FROM '{url}' WHERE is_live GROUP BY 1 ORDER BY 2 DESC").show()</code></pre>
|
| 299 |
<h3>En R</h3>
|
| 300 |
-
<pre><code>library(duckdb) # install.packages("duckdb")
|
| 301 |
con <- dbConnect(duckdb())
|
| 302 |
url <- "https://huggingface.co/datasets/clyxconsultingdev/amc-rues/resolve/main/data/companies.parquet"
|
| 303 |
dbGetQuery(con, sprintf("SELECT section, count(*) AS activas FROM '%s' WHERE is_live GROUP BY 1", url))</code></pre>
|
|
|
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
<title>Metodología · AMC</title>
|
| 7 |
<meta name="description" content="De dónde vienen los datos, qué se hizo con ellos, qué significa cada cifra y cómo descargarlos: la ficha metodológica de Analíticas Mercantiles Colombianas.">
|
| 8 |
+
<meta property="og:title" content="Metodología de Analíticas Mercantiles Colombianas">
|
| 9 |
+
<meta property="og:description" content="De dónde vienen los datos, qué se hizo con ellos, qué significa cada cifra y cómo descargarlos.">
|
| 10 |
+
<meta property="og:type" content="article">
|
| 11 |
<link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">
|
| 12 |
<meta property="og:image" content="https://amc.clyxconsulting.com/assets/og/inicio.png">
|
| 13 |
<meta property="og:image:width" content="1200">
|
|
|
|
| 85 |
.facts tr:last-child th, .facts tr:last-child td { border-bottom: 0; }
|
| 86 |
.facts th { width: 38%; color: var(--ink-2); font-weight: 500; }
|
| 87 |
/* On a phone the label goes above its value: side by side, each value wrapped to four lines. */
|
| 88 |
+
@media (max-width: 560px) {
|
| 89 |
.facts tr { display: block; border-bottom: 1px solid var(--border); }
|
| 90 |
.facts tr:last-child { border-bottom: 0; }
|
| 91 |
.facts th, .facts td { display: block; width: auto; border-bottom: 0; }
|
|
|
|
| 120 |
|
| 121 |
@media (max-width: 560px) { .sm-hide { display: none; } }
|
| 122 |
</style>
|
| 123 |
+
<link rel="canonical" href="https://amc.clyxconsulting.com/metodologia/">
|
| 124 |
+
<meta property="og:url" content="https://amc.clyxconsulting.com/metodologia/">
|
| 125 |
</head>
|
| 126 |
<body>
|
| 127 |
<nav class="top" aria-label="Principal">
|
|
|
|
| 175 |
<p>Toda empresa, comerciante y entidad sin ánimo de lucro de Colombia se registra en una cámara de comercio. Las cámaras consolidan esos registros en el <b>RUES</b>, que Confecámaras publica como dato abierto en <a href="https://www.datos.gov.co" target="_blank" rel="noopener">datos.gov.co</a> (conjunto <code>c82u-588k</code>): una fila por matrícula, unos 9,4 millones, con 36 columnas.</p>
|
| 176 |
<p>El sistema revisa la fuente cada día y descarga una copia nueva solo cuando cambia, lo que ocurre aproximadamente una vez al mes. Cada copia se verifica contra un conteo independiente de filas antes de usarse. La fuente se publica con un rezago de unos diez días: el corte actual contiene hechos registrados hasta la fecha que indica la ficha técnica, no hasta el día de la descarga.</p>
|
| 177 |
<p id="estados"><b>Una segunda fuente, para el tamaño.</b> El registro no distingue una empresa grande de una pequeña. Las empresas obligadas a reportar a la <b>Superintendencia de Sociedades</b>, unas 30.000 al año, le envían sus estados financieros NIIF de fin de ejercicio, que la Superintendencia publica en datos.gov.co (conjuntos <code>prwj-nzxa</code> y <code>pfdp-zks5</code>). De ellos se toman cinco cifras por empresa y año: ingresos, ganancia, activos, pasivos y patrimonio, en miles de pesos. Se unen al registro por el NIT, y más del 99,9 % encuentra su empresa. Se revisan cada semana y se publican en la tabla <code>financials</code>.</p>
|
| 178 |
+
<p id="estados-faltan"><b>Quiénes no están.</b> Los bancos, las aseguradoras y las demás entidades financieras, y las sociedades que emiten acciones o bonos en la bolsa, reportan a la <b>Superintendencia Financiera</b>, no a la de Sociedades, y no aparecen en estos datos. Entre ellas están algunas de las empresas más grandes del país, como Ecopetrol, Bancolombia o Almacenes Éxito. Por eso, cuando una página ordena o suma ingresos, habla de las empresas que reportan a la Superintendencia de Sociedades, no de las más grandes de Colombia.</p>
|
| 179 |
+
<p><b>Un año incompleto en la fuente, completado con el siguiente.</b> Para 2017 la Superintendencia publicó el balance de muy pocas empresas: unas 200 de 19.600. Pero cada reporte trae también el año anterior para comparar, así que el balance de 2017 se toma del reporte de 2018 cuando la empresa lo presentó y cuadra exactamente: unas 16.500 empresas. Lo mismo se hace con las unas 850 de 2020 a las que les faltaba. La columna <code>balance_origen</code> dice de dónde viene cada balance, porque una empresa puede corregir el año anterior al reportarlo. Los ingresos y la ganancia son siempre los del reporte de ese mismo año.</p>
|
| 180 |
<p>De cada empresa se toma su <b>reporte propio</b>, individual o separado, nunca el consolidado, que suma las cifras de sus subordinadas. Si presentó más de uno para el mismo año, se toma el más reciente, y si cierra cuentas cada seis meses, los ingresos y la ganancia del año suman los dos semestres. Cada estado trae también las cifras del año anterior para comparar, y las comprobaciones verifican que coincidan con las que la empresa reportó ese año.</p>
|
| 181 |
</section>
|
| 182 |
|
|
|
|
| 200 |
<dd>El registro de una empresa o comerciante en una cámara de comercio. Es la unidad de la fuente: una fila del RUES.</dd>
|
| 201 |
<dt>Empresa</dt>
|
| 202 |
<dd>Una persona jurídica o un comerciante persona natural, con todas sus matrículas reunidas. Es la unidad de este panorama: una empresa con matrículas en tres cámaras cuenta una vez.</dd>
|
| 203 |
+
<dt id="nueva">Empresa nueva</dt>
|
| 204 |
+
<dd>La que se matricula <b>por primera vez</b>, en cualquier cámara. Su año de creación es el de su primera matrícula. Por eso un comerciante que cerró un negocio y abre otro con su misma cédula no cuenta como empresa nueva: es la misma empresa, que vuelve.</dd>
|
| 205 |
<dt id="activa">Empresa activa</dt>
|
| 206 |
<dd>La que <b>renovó su matrícula mercantil en el año en curso</b>. Es la única señal de actividad que la fuente registra de forma verificable. No es lo mismo que el estado “ACTIVA” de la matrícula (ver los matices).</dd>
|
| 207 |
<dt>Persona jurídica y persona natural</dt>
|
|
|
|
| 269 |
<h2>Lo que estos datos no pueden decir</h2>
|
| 270 |
<p><b>Cuánto dura una empresa.</b> La fuente guarda solo el último año en que cada empresa renovó, no la historia de sus renovaciones. Se puede saber cuántas empresas creadas en un año siguen renovando hoy, pero no calcular con rigor cuánto tiempo sobreviven (<a href="#supervivencia">por qué</a>).</p>
|
| 271 |
<p><b>Dónde está o cómo contactarla.</b> El RUES abierto no publica direcciones, municipios, teléfonos ni correos. La ubicación disponible es la cámara de comercio.</p>
|
| 272 |
+
<p><b>El tamaño de la mayoría de las empresas.</b> Los ingresos y activos solo existen para las empresas que reportan a la Superintendencia de Sociedades, que no son una muestra: son las obligadas a reportar, en su mayoría grandes y medianas. Una empresa sin estados financieros no es pequeña: no se sabe. Las más grandes del sector financiero y de la bolsa reportan a otra superintendencia y tampoco están (<a href="#estados-faltan">quiénes</a>). Y ninguna fuente aquí mide empleados.</p>
|
| 273 |
<p><b>Quién es cada comerciante persona natural.</b> Por decisión deliberada: ver privacidad.</p>
|
| 274 |
</section>
|
| 275 |
|
|
|
|
| 302 |
<h3>En Power BI</h3>
|
| 303 |
<p class="muted">Descarga el archivo y usa <i>Obtener datos → Parquet</i>.</p>
|
| 304 |
<h3>En Python</h3>
|
| 305 |
+
<pre tabindex="0"><code>import duckdb # pip install duckdb
|
| 306 |
url = "https://huggingface.co/datasets/clyxconsultingdev/amc-rues/resolve/main/data/companies.parquet"
|
| 307 |
duckdb.sql(f"SELECT chamber, count(*) AS activas FROM '{url}' WHERE is_live GROUP BY 1 ORDER BY 2 DESC").show()</code></pre>
|
| 308 |
<h3>En R</h3>
|
| 309 |
+
<pre tabindex="0"><code>library(duckdb) # install.packages("duckdb")
|
| 310 |
con <- dbConnect(duckdb())
|
| 311 |
url <- "https://huggingface.co/datasets/clyxconsultingdev/amc-rues/resolve/main/data/companies.parquet"
|
| 312 |
dbGetQuery(con, sprintf("SELECT section, count(*) AS activas FROM '%s' WHERE is_live GROUP BY 1", url))</code></pre>
|
robots.txt
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
User-agent: *
|
| 2 |
+
Disallow: /assets/og/render.html
|
| 3 |
+
|
| 4 |
+
Sitemap: https://amc.clyxconsulting.com/sitemap.xml
|
sitemap.xml
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
| 3 |
+
<url><loc>https://amc.clyxconsulting.com/boletin/2026-09/</loc></url>
|
| 4 |
+
<url><loc>https://amc.clyxconsulting.com/boletin/</loc></url>
|
| 5 |
+
<url><loc>https://amc.clyxconsulting.com/boletin/ultimo/</loc></url>
|
| 6 |
+
<url><loc>https://amc.clyxconsulting.com/consulta/</loc></url>
|
| 7 |
+
<url><loc>https://amc.clyxconsulting.com/explorar/</loc></url>
|
| 8 |
+
<url><loc>https://amc.clyxconsulting.com/historias/abril-2020/</loc></url>
|
| 9 |
+
<url><loc>https://amc.clyxconsulting.com/historias/carrera/</loc></url>
|
| 10 |
+
<url><loc>https://amc.clyxconsulting.com/historias/concentracion/</loc></url>
|
| 11 |
+
<url><loc>https://amc.clyxconsulting.com/historias/conexiones/</loc></url>
|
| 12 |
+
<url><loc>https://amc.clyxconsulting.com/historias/depuraciones/</loc></url>
|
| 13 |
+
<url><loc>https://amc.clyxconsulting.com/historias/duracion/</loc></url>
|
| 14 |
+
<url><loc>https://amc.clyxconsulting.com/historias/gacelas/</loc></url>
|
| 15 |
+
<url><loc>https://amc.clyxconsulting.com/historias/gobiernos/</loc></url>
|
| 16 |
+
<url><loc>https://amc.clyxconsulting.com/historias/</loc></url>
|
| 17 |
+
<url><loc>https://amc.clyxconsulting.com/historias/latido/</loc></url>
|
| 18 |
+
<url><loc>https://amc.clyxconsulting.com/historias/margenes/</loc></url>
|
| 19 |
+
<url><loc>https://amc.clyxconsulting.com/historias/marzo/</loc></url>
|
| 20 |
+
<url><loc>https://amc.clyxconsulting.com/historias/migracion/</loc></url>
|
| 21 |
+
<url><loc>https://amc.clyxconsulting.com/historias/negocios/</loc></url>
|
| 22 |
+
<url><loc>https://amc.clyxconsulting.com/historias/nombres/</loc></url>
|
| 23 |
+
<url><loc>https://amc.clyxconsulting.com/historias/pandemia/</loc></url>
|
| 24 |
+
<url><loc>https://amc.clyxconsulting.com/historias/peso/</loc></url>
|
| 25 |
+
<url><loc>https://amc.clyxconsulting.com/historias/piramide/</loc></url>
|
| 26 |
+
<url><loc>https://amc.clyxconsulting.com/historias/regiones-tiempo/</loc></url>
|
| 27 |
+
<url><loc>https://amc.clyxconsulting.com/historias/regiones/</loc></url>
|
| 28 |
+
<url><loc>https://amc.clyxconsulting.com/historias/sas/</loc></url>
|
| 29 |
+
<url><loc>https://amc.clyxconsulting.com/historias/software/</loc></url>
|
| 30 |
+
<url><loc>https://amc.clyxconsulting.com/historias/tu-empresa/</loc></url>
|
| 31 |
+
<url><loc>https://amc.clyxconsulting.com/</loc></url>
|
| 32 |
+
<url><loc>https://amc.clyxconsulting.com/metodologia/comparacion/</loc></url>
|
| 33 |
+
<url><loc>https://amc.clyxconsulting.com/metodologia/</loc></url>
|
| 34 |
+
</urlset>
|