clyxconsultingdev commited on
Commit
3fbda3f
·
verified ·
1 Parent(s): 4d6fb3d

Deploy the site from pipeline commit 4c49973955fc

Browse files
assets/catalog.js CHANGED
@@ -24,6 +24,14 @@ export const STORIES = [
24
  const Y = st.q("anual");
25
  sparkColumns(box, Y.map((r) => r.depositos_constantes), { color: "var(--c3)", highlight: [Y.length - 1] });
26
  } },
 
 
 
 
 
 
 
 
27
  { slug: "turismo", kicker: "Turismo", title: "Quién recibe a los turistas",
28
  dek: "Viviendas turísticas, hoteles y agencias en el Registro Nacional de Turismo: cuántos son, de quién y dónde están.",
29
  thumb: async (box) => {
 
24
  const Y = st.q("anual");
25
  sparkColumns(box, Y.map((r) => r.depositos_constantes), { color: "var(--c3)", highlight: [Y.length - 1] });
26
  } },
27
+ { slug: "bancos", kicker: "Bancos", title: "Diez años de bancos",
28
+ dek: "Depósitos, préstamos y ganancias de los bancos, en pesos constantes: quién tiene el dinero y cuándo pierden.",
29
+ thumb: async (box) => {
30
+ // What the public keeps in the banks, December by December, in constant pesos.
31
+ const st = await story("bancos");
32
+ const Y = st.q("anual");
33
+ sparkColumns(box, Y.map((r) => r.depositos_constantes), { color: "var(--c1)", highlight: [Y.length - 1] });
34
+ } },
35
  { slug: "turismo", kicker: "Turismo", title: "Quién recibe a los turistas",
36
  dek: "Viviendas turísticas, hoteles y agencias en el Registro Nacional de Turismo: cuántos son, de quién y dónde están.",
37
  thumb: async (box) => {
assets/og/bancos.png ADDED
historias/bancos/index.html ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>Diez años de bancos · AMC</title>
7
+ <meta name="description" content="Lo que el público guarda y pide prestado en los bancos de Colombia, año por año en pesos constantes: quién tiene los depósitos, cuánto ganan y cuándo pierden, con los estados que reportan a la Superintendencia Financiera.">
8
+ <meta property="og:title" content="Diez años de bancos">
9
+ <meta property="og:description" content="Depósitos, préstamos y ganancias de los bancos de Colombia, en pesos constantes: quién tiene el dinero y cuándo pierden.">
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/bancos.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/bancos.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
+ <link rel="canonical" href="https://amc.clyxconsulting.com/historias/bancos/">
24
+ <meta property="og:url" content="https://amc.clyxconsulting.com/historias/bancos/">
25
+ <meta property="og:locale" content="es_CO">
26
+ <meta property="og:image:type" content="image/png">
27
+ <meta property="og:image:alt" content="Diez años de bancos">
28
+ </head>
29
+ <body>
30
+ <main class="wrap" id="app"><p class="loading">Cargando la historia…</p></main>
31
+ <noscript><p class="wrap">Esta página necesita JavaScript para dibujar sus gráficos.</p></noscript>
32
+ <script type="module">
33
+ import * as A from "../../assets/amc.js";
34
+ import { moreStories } from "../../assets/catalog.js";
35
+ import { lineChart, barList } from "../../assets/charts.js";
36
+ const { el, n, rich, figure, prose, readThis, tableView, legend } = A;
37
+
38
+ A.chrome("historias/bancos");
39
+ const app = document.getElementById("app");
40
+ const SOURCE = "Superintendencia Financiera (CUIF y entidades vigiladas) · RUES · Confecámaras; precios: DANE. Cálculos de AMC.";
41
+ // Billones: the Spanish 10^12.
42
+ const bn = (v) => `${A.n1(v / 1e12)} billones`;
43
+ const bn1 = (v) => A.n1(v / 1e12);
44
+ const signed = (x) => `${x >= 0 ? "+" : "−"}${A.pct(Math.abs(x))}`;
45
+ // Superfinanciera writes its type names cut short or mistyped; these are the
46
+ // 29 types CUIF carries, as a reader would say them.
47
+ const TYPES = { 1: "Bancos", 2: "Corporaciones financieras", 4: "Compañías de financiamiento", 5: "Fiduciarias",
48
+ 6: "Almacenes generales de depósito", 10: "Sociedades de capitalización", 11: "Corredores de seguros",
49
+ 13: "Aseguradoras generales", 14: "Aseguradoras de vida", 15: "Cooperativas de seguros",
50
+ 22: "Instituciones oficiales especiales", 23: "Administradoras de pensiones y cesantías",
51
+ 25: "Administradoras del régimen de prima media", 32: "Cooperativas financieras",
52
+ 35: "Sistemas de compensación de divisas", 81: "Organismos de autorregulación", 82: "Bolsa de valores",
53
+ 83: "Depósito centralizado de valores", 84: "Calificadoras de valores", 85: "Comisionistas de bolsa",
54
+ 87: "Administradoras de inversión", 118: "Sistemas de pago de bajo valor",
55
+ 128: "Depósitos y pagos electrónicos (SEDPE)", 400: "Bolsa agropecuaria", 401: "Comisionistas de bolsa agropecuaria",
56
+ 501: "Sistemas de negociación de divisas", 502: "Sistemas de negociación de valores", 504: "Cámara de riesgo central de contraparte",
57
+ 509: "Proveedores de precios" };
58
+ // A bank's name as a reader writes it: title case, its acronyms kept, no "S.A.".
59
+ const ACRONYMS = new Set(["BBVA", "GNB", "AV", "BTG", "JP", "UNG", "BNP", "MUFG"]);
60
+ const bank = (s) => String(s || "").replace(/\s+S\.?\s?A\.?$/i, "").split(/\s+/)
61
+ .map((w, i) => ACRONYMS.has(w.toUpperCase()) || /\./.test(w) || w.length === 1 ? w.toUpperCase() : A.title(w).replace(/^(De|Del|La|Las|Los|Y)$/, (m) => (i ? m.toLowerCase() : m))).join(" ").replace(/\bItau\b/, "Itaú");
62
+ const typeOf = (r) => TYPES[r.tipo_entidad] || A.cap(String(r.nombre_tipo || "").toLowerCase());
63
+ const head = (s, last) => el("header", { class: "story-head" },
64
+ el("p", { class: "kicker", text: "Historia · Bancos" }),
65
+ el("h1", { text: "Diez años de bancos" }),
66
+ el("p", { class: "dek", text: "Lo que el público guarda y pide prestado en los bancos, año por año en pesos constantes: quién tiene los depósitos, cuánto ganan y cuándo pierden, con los estados que reportan a la Superintendencia Financiera cada diciembre." }),
67
+ el("div", { class: "meta" }, el("span", { class: "chip", text: `Corte del ${A.date(s.snapshot)}` }),
68
+ el("span", { class: "chip", text: last ? `Estados a diciembre de ${last}` : "Estados: Superintendencia Financiera" }), A.shareButton()));
69
+
70
+ try {
71
+ const [s, st] = await Promise.all([A.summary(), A.story("bancos")]);
72
+ const Y = st.q("anual"), B = st.q("bancos"), T = st.q("tipos"), C = st.q("contraparte");
73
+ if (!Y.length || !B.length) {
74
+ app.replaceChildren(head(s), prose(["Esta edición aún no trae los estados de la Superintendencia Financiera. Vuelve después de la próxima publicación."]), moreStories("bancos"));
75
+ } else {
76
+ const first = Y[0], last = Y[Y.length - 1], F = first.anio_fiscal, L = last.anio_fiscal;
77
+ const growth = last.depositos_constantes / first.depositos_constantes - 1;
78
+ const moved = growth >= 0 ? "creció" : "cayó";
79
+ const totalDep = B.reduce((t, r) => t + (r.depositos || 0), 0);
80
+ const top5 = B.slice(0, 5), share5 = top5.reduce((t, r) => t + (r.depositos || 0), 0) / totalDep;
81
+ const lossShare = (r) => r.con_perdidas / r.bancos;
82
+ const worst = Y.reduce((a, b) => (lossShare(b) > lossShare(a) ? b : a));
83
+ const low = Y.reduce((a, b) => (b.utilidad_constantes < a.utilidad_constantes ? b : a));
84
+ const names = (rows) => rows.map((r) => bank(r.nombre)).join(", ").replace(/, ([^,]*)$/, " y $1");
85
+
86
+ const findings = el("div", { class: "findings" },
87
+ el("div", { class: "finding reveal" }, el("p", { class: "n", text: signed(growth) }),
88
+ rich("p", {}, [`${moved} lo que el público guarda en los bancos entre ${F} y ${L}, descontada la inflación: de `, { b: bn(first.depositos_constantes) }, " a ", { b: bn(last.depositos_constantes) }, ` de pesos de ${L}.`])),
89
+ el("div", { class: "finding reveal" }, el("p", { class: "n", text: A.pct(share5) }),
90
+ rich("p", {}, [`de los depósitos de los ${n(B.length)} bancos están en cinco: `, { b: names(top5) }, "."])),
91
+ el("div", { class: "finding reveal" }, el("p", { class: "n", text: `${n(worst.con_perdidas)} de ${n(worst.bancos)}` }),
92
+ rich("p", {}, [`bancos cerraron ${worst.anio_fiscal} con pérdidas, `, { b: "el peor año de la década" }, ` por esa medida.`])));
93
+
94
+ // 1. The banks' money, year by year, in constant pesos.
95
+ const at = (y) => new Date(Date.UTC(y, 0, 1));
96
+ const f1 = figure({ title: `Activos, cartera y depósitos de los bancos, en pesos de ${L}`,
97
+ sub: `Total de los bancos que reportaron su estado de diciembre de cada año, en billones de pesos de ${L} (IPC del DANE). Cartera: lo que prestan; depósitos: lo que el público guarda en ellos.`,
98
+ sql: st.sql("anual"), source: SOURCE });
99
+ f1.body.append(legend([{ label: "Activos", color: "var(--c1)" }, { label: "Cartera", color: "var(--c2)" }, { label: "Depósitos", color: "var(--c3)" }]));
100
+ lineChart(f1.body, { label: `Activos, cartera y depósitos de los bancos de Colombia, en billones de pesos de ${L}`,
101
+ height: 280, animate: false, yMin: 0, yFormat: (v) => A.n1(v / 1e12),
102
+ series: [{ color: "var(--c1)", values: Y.map((r) => ({ x: at(r.anio_fiscal), y: r.activos_constantes })) },
103
+ { color: "var(--c2)", values: Y.map((r) => ({ x: at(r.anio_fiscal), y: r.cartera_constantes })) },
104
+ { color: "var(--c3)", values: Y.map((r) => ({ x: at(r.anio_fiscal), y: r.depositos_constantes })) }],
105
+ tip: (x, i) => ({ title: `Diciembre de ${Y[i].anio_fiscal}`, rows: [
106
+ { label: "Activos", value: bn(Y[i].activos_constantes), color: A.css("--c1") },
107
+ { label: "Cartera", value: bn(Y[i].cartera_constantes), color: A.css("--c2") },
108
+ { label: "Depósitos", value: bn(Y[i].depositos_constantes), color: A.css("--c3") },
109
+ { label: "Bancos", value: n(Y[i].bancos) }] }) });
110
+ f1.fig.append(tableView(`Bancos de Colombia, en pesos de ${L}`,
111
+ ["Año", "Bancos", "Activos", "Depósitos", "Cartera", "Patrimonio", "Utilidad", "Con pérdidas"],
112
+ Y.map((r) => [String(r.anio_fiscal), n(r.bancos), n(r.activos_constantes), n(r.depositos_constantes), n(r.cartera_constantes),
113
+ n(r.patrimonio_constantes), n(r.utilidad_constantes), n(r.con_perdidas)])));
114
+
115
+ // 2. What they earned, and how many lost money, year by year.
116
+ const f2 = figure({ title: "Lo que ganaron, año por año",
117
+ sub: `Utilidad de todos los bancos sumados, en billones de pesos de ${L}, y cuántos cerraron el año con pérdidas.`,
118
+ sql: st.sql("anual"), source: SOURCE });
119
+ barList(f2.body, Y.map((r) => ({ label: String(r.anio_fiscal), value: Math.max(0, r.utilidad_constantes),
120
+ valueText: `${bn1(r.utilidad_constantes)} · ${n(r.con_perdidas)} con pérdidas`, strong: r === worst || r === low,
121
+ tip: { title: String(r.anio_fiscal), rows: [{ label: "Utilidad", value: bn(r.utilidad_constantes) },
122
+ { label: "Bancos", value: n(r.bancos) }, { label: "Con pérdidas", value: n(r.con_perdidas) }] } })),
123
+ { labelWidth: 90, reserve: 170 });
124
+
125
+ // 3. Who holds the deposits, the newest year.
126
+ const shown = B.slice(0, 12), rest = B.slice(12);
127
+ const restDep = rest.reduce((t, r) => t + (r.depositos || 0), 0);
128
+ const f3 = figure({ title: `Quién tiene los depósitos, ${L}`,
129
+ sub: `Parte de los depósitos de todos los bancos que tiene cada uno, en diciembre de ${L}.`, sql: st.sql("bancos"), source: SOURCE });
130
+ barList(f3.body, [...shown.map((r, i) => ({ label: bank(r.nombre), value: (r.depositos || 0) / totalDep, valueText: A.pct1((r.depositos || 0) / totalDep), strong: i < 5,
131
+ tip: { title: bank(r.nombre), rows: [{ label: "Depósitos", value: bn(r.depositos || 0) }, { label: "Cartera", value: bn(r.cartera || 0) },
132
+ { label: "Activos", value: bn(r.activos) }, { label: "Utilidad", value: bn(r.utilidad || 0) }] } })),
133
+ ...(rest.length ? [{ label: `Los otros ${n(rest.length)}`, value: restDep / totalDep, valueText: A.pct1(restDep / totalDep), dim: true }] : [])],
134
+ { labelWidth: 280, reserve: 60 });
135
+ f3.fig.append(tableView(`Bancos en diciembre de ${L} (pesos de ${L})`, ["Banco", "Depósitos", "Cartera", "Activos", "Utilidad"],
136
+ B.map((r) => [bank(r.nombre), n(r.depositos || 0), n(r.cartera || 0), n(r.activos), n(r.utilidad || 0)])));
137
+
138
+ // 4. Every other supervised type, the newest year.
139
+ const TT = T.slice(0, 12);
140
+ const f4 = figure({ title: `Todo lo que vigila la Superintendencia Financiera, ${L}`,
141
+ sub: `Activos de cada tipo de entidad en diciembre de ${L}, en billones de pesos. Los ${TT.length} tipos con más activos.`, sql: st.sql("tipos"), source: SOURCE });
142
+ barList(f4.body, TT.map((r) => ({ label: typeOf(r), value: r.activos, valueText: bn1(r.activos), strong: r.tipo_entidad === 1,
143
+ tip: { title: typeOf(r), rows: [{ label: "Entidades", value: n(r.entidades) }, { label: "Activos", value: bn(r.activos) },
144
+ { label: "Utilidad", value: bn(r.utilidad || 0) }, { label: "Con pérdidas", value: n(r.con_perdidas) }] } })),
145
+ { labelWidth: 280, reserve: 50 });
146
+ f4.fig.append(tableView(`Entidades vigiladas por tipo, diciembre de ${L} (pesos de ${L})`, ["Tipo", "Entidades", "Activos", "Utilidad", "Con pérdidas"],
147
+ T.map((r) => [typeOf(r), n(r.entidades), n(r.activos), n(r.utilidad || 0), n(r.con_perdidas)])));
148
+
149
+ const banks = T.find((r) => r.tipo_entidad === 1);
150
+ const allAssets = T.reduce((t, r) => t + r.activos, 0);
151
+ app.replaceChildren(head(s, L), findings,
152
+ prose({ h2: "El dinero de todos" },
153
+ [`En diciembre de ${L}, ${n(last.bancos)} bancos tenían activos por ${bn(last.activos_constantes)} de pesos. El público había guardado en ellos ${bn(last.depositos_constantes)}, y ellos prestaban ${bn(last.cartera_constantes)}. Descontada la inflación, los depósitos ${moved === "creció" ? "crecieron" : "cayeron"} un ${A.pct(Math.abs(growth))} desde ${F}.`]),
154
+ f1.fig,
155
+ prose([`El año más flojo fue ${low.anio_fiscal}: los bancos sumaron ${bn(low.utilidad_constantes)} de pesos de ganancia, en pesos de ${L}. En ${worst.anio_fiscal}, ${n(worst.con_perdidas)} de los ${n(worst.bancos)} cerraron con pérdidas.`]),
156
+ f2.fig,
157
+ prose([`Cinco bancos tienen el ${A.pct(share5)} de los depósitos. El más grande, ${bank(B[0].nombre)}, tiene el ${A.pct((B[0].depositos || 0) / totalDep)}.`]),
158
+ f3.fig,
159
+ prose([`Los bancos tienen el ${A.pct(banks.activos / allAssets)} de los activos de todo lo que vigila la Superintendencia Financiera, sin contar la cámara de riesgo central de contraparte.`]),
160
+ f4.fig,
161
+ readThis(...[["Son los ", { b: "establecimientos bancarios" }, " que vigila la Superintendencia Financiera, con lo que reportan en el CUIF, su catálogo de información financiera. Las cooperativas de ahorro y crédito las vigila la Supersolidaria y están en otra historia."],
162
+ ["Las cifras son las del ", { b: "corte de diciembre" }, ` de cada año, en todas las monedas, y solo de los estados que cuadran: activos iguales a pasivos más patrimonio, con margen de un peso. Para comparar años están en pesos de ${L}, con el IPC del DANE: los saldos con el de diciembre y la utilidad con el promedio del año.`],
163
+ [`El número de bancos cambia: de ${n(first.bancos)} en ${F} a ${n(last.bancos)} en ${L}, porque entraron bancos nuevos y otras entidades se convirtieron en bancos. Las sumas son las de los bancos de cada año.`],
164
+ C.length ? [`La `, { b: "cámara de riesgo central de contraparte" }, ` no se suma: sus ${bn(C[0].activos)} de pesos de activos en ${L} son las operaciones entre otros que ella garantiza, no dinero suyo.`] : null,
165
+ ["Las administradoras de pensiones aparecen con su propio balance, no con los fondos de sus afiliados. Cada entidad se une al registro mercantil por el NIT que da la lista de vigiladas de la Superintendencia."]].filter(Boolean)),
166
+ moreStories("bancos"));
167
+ }
168
+ A.footer(s);
169
+ A.reveal();
170
+ window.__amcReady = true;
171
+ } catch (e) { A.fail(app, e); }
172
+ </script>
173
+ </body>
174
+ </html>
historias/tu-empresa/index.html CHANGED
@@ -94,6 +94,10 @@ A.chrome("historias/tu-empresa");
94
  const app = document.getElementById("app");
95
  // The published types: only companies whose names are published can be searched.
96
  const PUBLIC = "('sociedad', 'sin ánimo de lucro', 'economía solidaria', 'entidad pública')";
 
 
 
 
97
  const norm = (t) => t.normalize("NFD").replace(/[̀-ͯ]/g, "").toUpperCase().replace(/[^A-Z0-9Ñ&. ]/g, " ").replace(/\s+/g, " ").trim();
98
  let duck = null;
99
  const db = () => (duck ||= import("../../assets/duck.js"));
@@ -108,12 +112,13 @@ try {
108
  const profile = el("div", { class: "profile" });
109
  const how = A.readThis(["Solo se pueden buscar las ", { b: "sociedades y entidades con personería jurídica" }, ", cuyos datos son públicos. Los comerciantes personas naturales se cuentan en todas las cifras, pero no se nombran ni se pueden buscar (Ley 1581 de 2012)."],
110
  ["La búsqueda encuentra los nombres que tienen ", { b: "palabras que empiezan" }, " por lo que escribes: «ecope» encuentra Ecopetrol, «petrol» no. Un NIT encuentra los que empiezan por esos números."],
111
- ["La ficha muestra los datos del registro: la fecha es la de la primera matrícula, la actividad y la forma jurídica son las actuales, y «activa» quiere decir que renovó su matrícula este año."],
112
  ["Los estados financieros, cuando los hay, son los que la empresa reportó a la Superintendencia de Sociedades. Solo reportan las obligadas, unas 30.000 al año: que una empresa no tenga cifras no quiere decir que sea pequeña."]);
113
  // The other sources, said only when this edition carries them (D34).
114
  A.getJSON("manifest.json").then((m) => {
115
  const has = (f) => m.files?.[`${f}.parquet`]?.rows > 0;
116
  const also = [has("solidarity_entities") && "una cooperativa, un fondo de empleados o una mutual que vigila la Superintendencia de la Economía Solidaria",
 
117
  has("tourism") && "un prestador inscrito en el Registro Nacional de Turismo"].filter(Boolean);
118
  if (also.length) how.append(rich("p", {}, [`Si la empresa es ${also.join(", o ")}, la ficha muestra también esos datos. Se unen por el NIT, y `,
119
  { b: "solo cuando el NIT es el de una sola empresa" }, " del registro."]));
@@ -174,7 +179,7 @@ try {
174
  const b = el("button", { class: "res", type: "button" },
175
  el("span", {}, el("span", { class: "nm", text: r.display_name }), el("br"),
176
  el("span", { class: "sub", text: `${A.title(r.chamber)} · ${A.legalForm(r.legal_form)} · desde ${r.formation_year ?? "—"}` })),
177
- el("span", { class: `chip tag ${r.is_live ? "ok" : "off"}`, text: r.is_live ? "Activa" : "No renovó" }));
178
  b.addEventListener("click", () => { [...results.children].forEach((x) => x.removeAttribute("aria-current")); b.setAttribute("aria-current", "true"); show(r, true); });
179
  return b;
180
  });
@@ -216,15 +221,19 @@ try {
216
  const pricesP = r.nit ? q(`SELECT anio, ipc_promedio FROM prices`) : Promise.resolve(null);
217
  // The sources kept as files (D34), joined by the registry's own key: an
218
  // entity's reports to Supersolidaria and its December statements, and the
219
- // company's registrations in the tourism registry. An edition without
220
- // them, or a company without any, leaves that part out. The statements
221
- // and the deflator are asked for only when the company is an entity.
 
222
  const id = Number(r.company_id);
223
  const solP = q(`SELECT *, (SELECT max(ultimo_reporte) FROM solidarity_entities) AS fuente_hasta
224
  FROM solidarity_entities WHERE company_id = ${id}`);
225
  const solFinP = solP.then((e) => e?.length ? q(`SELECT anio, activos, cartera, depositos, patrimonio, excedentes
226
  FROM solidarity_finances WHERE codigo_entidad = ${Number(e[0].codigo_entidad)} ORDER BY anio`) : null);
227
- const decP = solP.then((e) => e?.length ? q(`SELECT anio, ipc_diciembre FROM prices`) : null);
 
 
 
228
  const tourP = q(`SELECT categoria, divipola, municipio, departamento, habitaciones, camas, empleados, corte
229
  FROM tourism WHERE company_id = ${id}`);
230
  const [[act], [sec]] = await Promise.all([
@@ -237,7 +246,8 @@ try {
237
  el("p", { class: "kicker", text: "Ficha de la empresa" }),
238
  el("h2", { class: "pname", text: r.display_name }),
239
  el("div", { class: "chips" },
240
- el("span", { class: `chip ${r.is_live ? "ok" : "off"}`, text: r.is_live ? `Activa: renovó en ${s.year}` : "No ha renovado este año" }),
 
241
  r.nit ? el("span", { class: "chip", text: `NIT ${r.nit}` }) : null,
242
  el("span", { class: "chip", text: A.legalForm(r.legal_form) }),
243
  el("span", { class: "chip", text: `Cámara de Comercio de ${A.title(r.chamber)}` })),
@@ -271,7 +281,8 @@ try {
271
  // many still renew. Legal persons, as this one is.
272
  const sv = survival(actRows, r, y);
273
  if (sv) {
274
- const tail = r.is_live ? "Esta es una de ellas." : `Esta no ha renovado en ${s.year}.`;
 
275
  items.push(el("div", { class: "c reveal" }, el("p", { class: "big", text: pct(sv.share) }),
276
  rich("p", {}, [`de las `, { b: n(sv.n) }, ` empresas de su actividad creadas ${sv.local ? `en ${camara}` : "en todo el país"} en ${y} siguen activas. `,
277
  { b: tail }, sv.local && sv.national != null ? ` En todo el país, ${pct(sv.national)}.` : ""]),
@@ -280,7 +291,7 @@ try {
280
  const share = (r.cohorte_camara_vivas || 0) / r.cohorte_camara;
281
  items.push(el("div", { class: "c reveal" }, el("p", { class: "big", text: pct(share) }),
282
  rich("p", {}, [`de las `, { b: n(r.cohorte_camara) }, ` empresas de todas las actividades creadas en ${camara} en ${y} siguen activas. `,
283
- { b: r.is_live ? "Esta es una de ellas." : `Esta no ha renovado en ${s.year}.` }]),
284
  el("div", { class: "meter" }, el("i", { style: `width:${share * 100}%` }))));
285
  }
286
  // 3. A local cluster? The activity's share of the chamber's live companies
@@ -298,12 +309,14 @@ try {
298
  }
299
  ctx.append(...items);
300
  A.reveal(ctx);
301
- const [finRows, bench, firms, prices, sol, solFin, dec, tour] =
302
- await Promise.all([finRowsP, benchP, firmsP, pricesP, solP, solFinP, decP, tourP]);
303
  if (me !== turn) return;
304
- const entity = sol?.[0] || null;
305
- const fin = renderFinances(r, sec, act, finRows, bench, prices, entity != null);
306
  if (fin) profile.append(fin);
 
 
307
  const solidarity = renderSolidarity(r, entity, solFin, dec);
308
  if (solidarity) profile.append(solidarity);
309
  const tourism = renderTourism(tour);
@@ -442,11 +455,11 @@ try {
442
  // The company's statements, when it files them (D29). Pure renderer: the
443
  // rows were fetched in parallel in show(). rows === null means no financials
444
  // table in this edition (or the query failed); then the block is left out.
445
- // An entity that reports to Supersolidaria instead (solidary) has its own
446
- // block below, and no note about not filing here.
447
- function renderFinances(r, sec, act, rows, bench, prices, solidary = false) {
448
  if (!r.nit || rows === null) return null;
449
- if (!rows.length && solidary) return null;
450
  const box = el("section", { class: "block", style: "padding-top:28px" },
451
  el("p", { class: "kicker", text: "Superintendencia de Sociedades" }), el("h3", { text: "Estados financieros" }));
452
  if (!rows.length) {
@@ -492,8 +505,8 @@ try {
492
  // Pesos, as money() words thousands: "6,4 billones de pesos"; small sums whole.
493
  const pesos = (v) => (Math.abs(v) >= 1e6 ? `${money(v / 1e3)} de pesos` : `${n(v)} pesos`);
494
  const EVERY = { 12: "cada mes", 4: "cada trimestre", 2: "cada semestre", 1: "una vez al año" };
495
- const GLOSS = (series) => {
496
- const g = { cartera: "la cartera es lo que presta a sus asociados", depositos: "los depósitos, lo que ellos ahorran en ella" };
497
  const t = series.map(([k]) => g[k]).filter(Boolean);
498
  return t.length ? ` ${A.cap(t.join("; "))}.` : "";
499
  };
@@ -513,18 +526,31 @@ try {
513
  ...(e.reportes === 1 ? ["tiene ", { b: "un reporte" }, `, de ${A.monthYear(e.ultimo_reporte)}`]
514
  : ["tiene ", { b: `${n(e.reportes)} reportes` }, `, de ${A.monthYear(e.primer_reporte)} a ${A.monthYear(e.ultimo_reporte)}`]),
515
  every && prev > 2000 ? `; en ${prev} reportó ${every}.` : "."]));
 
 
 
 
 
 
 
 
 
 
 
516
  const ipc = new Map((dec || []).map((p) => [p.anio, Number(p.ipc_diciembre)]));
 
 
517
  const valid = (rows || []).filter((x) => x.activos > 0);
518
  if (!valid.length) return box;
519
  const last = valid[valid.length - 1], L = last.anio;
520
  box.append(rich("p", { class: "lede" }, [`En diciembre de ${L} tenía activos por `, { b: pesos(last.activos) },
521
- ...(last.depositos > 0 ? [", depósitos de sus asociados por ", { b: pesos(last.depositos) }] : []),
522
- ...(last.cartera > 0 ? [" y una cartera de créditos de ", { b: pesos(last.cartera) }] : []), "."]));
523
- // In pesos of December of its latest year: stocks, deflated by December's index.
524
  const pts = valid.filter((x) => ipc.get(x.anio) && ipc.get(L)).map((x) => {
525
- const k = ipc.get(L) / ipc.get(x.anio);
526
  return { anio: x.anio, activos: x.activos * k, cartera: x.cartera > 0 ? x.cartera * k : null, depositos: x.depositos > 0 ? x.depositos * k : null,
527
- patrimonio: x.patrimonio != null ? x.patrimonio * k : null, excedentes: x.excedentes != null ? x.excedentes * k : null };
528
  });
529
  if (pts.length < 3) return box;
530
  const first = pts[0], change = pts[pts.length - 1].activos / first.activos - 1;
@@ -538,22 +564,53 @@ try {
538
  const named3 = series.map(([, , , w]) => w).join(", ").replace(/, ([^,]*)$/, " y $1");
539
  const at = (yy) => new Date(Date.UTC(yy, 0, 1));
540
  const f = A.figure({ title: `${A.cap(named3)}, ${first.anio}–${L}`,
541
- sub: `Cifras de diciembre de cada año, en ${unit} de pesos de diciembre de ${L} (IPC del DANE).${GLOSS(series)}`,
542
- sql: `SELECT anio, activos, cartera, depositos, patrimonio, excedentes\nFROM solidarity_finances\nWHERE codigo_entidad = ${Number(e.codigo_entidad)}\nORDER BY anio`,
543
- source: "Superintendencia de la Economía Solidaria (estados financieros, datos.gov.co) y DANE (IPC). Cálculos de AMC." });
544
  if (series.length > 1) f.body.append(A.legend(series.map(([, label, c]) => ({ label, color: `var(${c})` }))));
545
  lineChart(f.body, { label: `${A.cap(named3)} de la entidad, en ${unit} de pesos de diciembre de ${L}`, height: 240, animate: false, yMin: 0,
546
  xTicks: () => pts.map((p) => at(p.anio)), yFormat: (v) => A.n1(v / div),
547
  series: series.map(([k, , c]) => ({ color: `var(${c})`, width: k === "activos" ? 2.5 : 2, values: pts.map((p) => ({ x: at(p.anio), y: p[k] })) })),
548
  tip: (x, i) => ({ title: `Diciembre de ${pts[i].anio}`, rows: series.map(([k, label, c]) =>
549
  ({ label, value: pts[i][k] == null ? "—" : pesos(pts[i][k]), color: A.css(c) })) }) });
550
- f.fig.append(A.tableView(`Estados de diciembre de la entidad, en millones de pesos de diciembre de ${L}`,
551
- ["Año", "Activos", "Cartera", "Depósitos", "Patrimonio", "Excedentes"],
552
- pts.map((p) => [String(p.anio), ...["activos", "cartera", "depositos", "patrimonio", "excedentes"].map((k) => p[k] == null ? "—" : n(p[k] / 1e6))])));
553
  box.append(f.fig);
554
  return box;
555
  }
556
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
557
  // The company's registrations in the tourism registry (RNT, MinCIT), by
558
  // category and municipality. Rooms are summed as tourism_counts sums them:
559
  // not those of a registration that declares more rooms than beds.
 
94
  const app = document.getElementById("app");
95
  // The published types: only companies whose names are published can be searched.
96
  const PUBLIC = "('sociedad', 'sin ánimo de lucro', 'economía solidaria', 'entidad pública')";
97
+ // Renewed this year (is_live, D19), then cancelled or absorbed in a merger:
98
+ // the count keeps it, the record says so. A transfer to another chamber is
99
+ // not a closure and stays "Activa".
100
+ const cancelled = (r) => r.is_live && /^CANCELADA$|CANCELADA POR FUSI/.test(r.status || "");
101
  const norm = (t) => t.normalize("NFD").replace(/[̀-ͯ]/g, "").toUpperCase().replace(/[^A-Z0-9Ñ&. ]/g, " ").replace(/\s+/g, " ").trim();
102
  let duck = null;
103
  const db = () => (duck ||= import("../../assets/duck.js"));
 
112
  const profile = el("div", { class: "profile" });
113
  const how = A.readThis(["Solo se pueden buscar las ", { b: "sociedades y entidades con personería jurídica" }, ", cuyos datos son públicos. Los comerciantes personas naturales se cuentan en todas las cifras, pero no se nombran ni se pueden buscar (Ley 1581 de 2012)."],
114
  ["La búsqueda encuentra los nombres que tienen ", { b: "palabras que empiezan" }, " por lo que escribes: «ecope» encuentra Ecopetrol, «petrol» no. Un NIT encuentra los que empiezan por esos números."],
115
+ ["La ficha muestra los datos del registro: la fecha es la de la primera matrícula, la actividad y la forma jurídica son las actuales, y «activa» quiere decir que renovó su matrícula este año. Si después de renovar se canceló su matrícula, la ficha lo dice; en las cifras sigue contando como renovada."],
116
  ["Los estados financieros, cuando los hay, son los que la empresa reportó a la Superintendencia de Sociedades. Solo reportan las obligadas, unas 30.000 al año: que una empresa no tenga cifras no quiere decir que sea pequeña."]);
117
  // The other sources, said only when this edition carries them (D34).
118
  A.getJSON("manifest.json").then((m) => {
119
  const has = (f) => m.files?.[`${f}.parquet`]?.rows > 0;
120
  const also = [has("solidarity_entities") && "una cooperativa, un fondo de empleados o una mutual que vigila la Superintendencia de la Economía Solidaria",
121
+ has("financial_entities") && "un banco, una aseguradora u otra entidad que vigila la Superintendencia Financiera",
122
  has("tourism") && "un prestador inscrito en el Registro Nacional de Turismo"].filter(Boolean);
123
  if (also.length) how.append(rich("p", {}, [`Si la empresa es ${also.join(", o ")}, la ficha muestra también esos datos. Se unen por el NIT, y `,
124
  { b: "solo cuando el NIT es el de una sola empresa" }, " del registro."]));
 
179
  const b = el("button", { class: "res", type: "button" },
180
  el("span", {}, el("span", { class: "nm", text: r.display_name }), el("br"),
181
  el("span", { class: "sub", text: `${A.title(r.chamber)} · ${A.legalForm(r.legal_form)} · desde ${r.formation_year ?? "—"}` })),
182
+ el("span", { class: `chip tag ${r.is_live && !cancelled(r) ? "ok" : "off"}`, text: cancelled(r) ? "Cancelada" : r.is_live ? "Activa" : "No renovó" }));
183
  b.addEventListener("click", () => { [...results.children].forEach((x) => x.removeAttribute("aria-current")); b.setAttribute("aria-current", "true"); show(r, true); });
184
  return b;
185
  });
 
221
  const pricesP = r.nit ? q(`SELECT anio, ipc_promedio FROM prices`) : Promise.resolve(null);
222
  // The sources kept as files (D34), joined by the registry's own key: an
223
  // entity's reports to Supersolidaria and its December statements, and the
224
+ // company's registrations in the tourism registry, and a bank's or
225
+ // insurer's Superfinanciera statements. An edition without them, or a
226
+ // company without any, leaves that part out. The statements and the
227
+ // deflator are asked for only when the company is such an entity.
228
  const id = Number(r.company_id);
229
  const solP = q(`SELECT *, (SELECT max(ultimo_reporte) FROM solidarity_entities) AS fuente_hasta
230
  FROM solidarity_entities WHERE company_id = ${id}`);
231
  const solFinP = solP.then((e) => e?.length ? q(`SELECT anio, activos, cartera, depositos, patrimonio, excedentes
232
  FROM solidarity_finances WHERE codigo_entidad = ${Number(e[0].codigo_entidad)} ORDER BY anio`) : null);
233
+ const finEP = q(`SELECT * FROM financial_entities WHERE company_id = ${id}`);
234
+ const finSP = finEP.then((e) => e?.length ? q(`SELECT anio, activos, cartera, depositos, patrimonio, utilidad FROM financial_statements
235
+ WHERE tipo_entidad = ${Number(e[0].tipo_entidad)} AND codigo_entidad = ${Number(e[0].codigo_entidad)} ORDER BY anio`) : null);
236
+ const decP = Promise.all([solP, finEP]).then(([a, b]) => a?.length || b?.length ? q(`SELECT anio, ipc_diciembre, ipc_promedio FROM prices`) : null);
237
  const tourP = q(`SELECT categoria, divipola, municipio, departamento, habitaciones, camas, empleados, corte
238
  FROM tourism WHERE company_id = ${id}`);
239
  const [[act], [sec]] = await Promise.all([
 
246
  el("p", { class: "kicker", text: "Ficha de la empresa" }),
247
  el("h2", { class: "pname", text: r.display_name }),
248
  el("div", { class: "chips" },
249
+ el("span", { class: `chip ${r.is_live && !cancelled(r) ? "ok" : "off"}`, text: cancelled(r) ? `Renovó en ${s.year}; matrícula cancelada después`
250
+ : r.is_live ? `Activa: renovó en ${s.year}` : "No ha renovado este año" }),
251
  r.nit ? el("span", { class: "chip", text: `NIT ${r.nit}` }) : null,
252
  el("span", { class: "chip", text: A.legalForm(r.legal_form) }),
253
  el("span", { class: "chip", text: `Cámara de Comercio de ${A.title(r.chamber)}` })),
 
281
  // many still renew. Legal persons, as this one is.
282
  const sv = survival(actRows, r, y);
283
  if (sv) {
284
+ const tail = cancelled(r) ? `Esta renovó en ${s.year}, pero su matrícula se canceló después.`
285
+ : r.is_live ? "Esta es una de ellas." : `Esta no ha renovado en ${s.year}.`;
286
  items.push(el("div", { class: "c reveal" }, el("p", { class: "big", text: pct(sv.share) }),
287
  rich("p", {}, [`de las `, { b: n(sv.n) }, ` empresas de su actividad creadas ${sv.local ? `en ${camara}` : "en todo el país"} en ${y} siguen activas. `,
288
  { b: tail }, sv.local && sv.national != null ? ` En todo el país, ${pct(sv.national)}.` : ""]),
 
291
  const share = (r.cohorte_camara_vivas || 0) / r.cohorte_camara;
292
  items.push(el("div", { class: "c reveal" }, el("p", { class: "big", text: pct(share) }),
293
  rich("p", {}, [`de las `, { b: n(r.cohorte_camara) }, ` empresas de todas las actividades creadas en ${camara} en ${y} siguen activas. `,
294
+ { b: cancelled(r) ? `Esta renovó en ${s.year}, pero su matrícula se canceló después.` : r.is_live ? "Esta es una de ellas." : `Esta no ha renovado en ${s.year}.` }]),
295
  el("div", { class: "meter" }, el("i", { style: `width:${share * 100}%` }))));
296
  }
297
  // 3. A local cluster? The activity's share of the chamber's live companies
 
309
  }
310
  ctx.append(...items);
311
  A.reveal(ctx);
312
+ const [finRows, bench, firms, prices, sol, solFin, dec, tour, finE, finS] =
313
+ await Promise.all([finRowsP, benchP, firmsP, pricesP, solP, solFinP, decP, tourP, finEP, finSP]);
314
  if (me !== turn) return;
315
+ const entity = sol?.[0] || null, financial = finE?.[0] || null;
316
+ const fin = renderFinances(r, sec, act, finRows, bench, prices, entity != null || financial != null);
317
  if (fin) profile.append(fin);
318
+ const sfc = renderFinancial(r, financial, finS, dec);
319
+ if (sfc) profile.append(sfc);
320
  const solidarity = renderSolidarity(r, entity, solFin, dec);
321
  if (solidarity) profile.append(solidarity);
322
  const tourism = renderTourism(tour);
 
455
  // The company's statements, when it files them (D29). Pure renderer: the
456
  // rows were fetched in parallel in show(). rows === null means no financials
457
  // table in this edition (or the query failed); then the block is left out.
458
+ // An entity that reports to Supersolidaria or Superfinanciera instead
459
+ // (elsewhere) has its own block below, and no note about not filing here.
460
+ function renderFinances(r, sec, act, rows, bench, prices, elsewhere = false) {
461
  if (!r.nit || rows === null) return null;
462
+ if (!rows.length && elsewhere) return null;
463
  const box = el("section", { class: "block", style: "padding-top:28px" },
464
  el("p", { class: "kicker", text: "Superintendencia de Sociedades" }), el("h3", { text: "Estados financieros" }));
465
  if (!rows.length) {
 
505
  // Pesos, as money() words thousands: "6,4 billones de pesos"; small sums whole.
506
  const pesos = (v) => (Math.abs(v) >= 1e6 ? `${money(v / 1e3)} de pesos` : `${n(v)} pesos`);
507
  const EVERY = { 12: "cada mes", 4: "cada trimestre", 2: "cada semestre", 1: "una vez al año" };
508
+ const GLOSS = (series, who) => {
509
+ const g = { cartera: `la cartera es lo que presta a ${who}`, depositos: "los depósitos, lo que ellos guardan en ella" };
510
  const t = series.map(([k]) => g[k]).filter(Boolean);
511
  return t.length ? ` ${A.cap(t.join("; "))}.` : "";
512
  };
 
526
  ...(e.reportes === 1 ? ["tiene ", { b: "un reporte" }, `, de ${A.monthYear(e.ultimo_reporte)}`]
527
  : ["tiene ", { b: `${n(e.reportes)} reportes` }, `, de ${A.monthYear(e.primer_reporte)} a ${A.monthYear(e.ultimo_reporte)}`]),
528
  every && prev > 2000 ? `; en ${prev} reportó ${every}.` : "."]));
529
+ return renderStatements(box, rows, dec, { who: "sus asociados", flow: ["excedentes", "Excedentes"],
530
+ sql: `SELECT anio, activos, cartera, depositos, patrimonio, excedentes\nFROM solidarity_finances\nWHERE codigo_entidad = ${Number(e.codigo_entidad)}\nORDER BY anio`,
531
+ source: "Superintendencia de la Economía Solidaria (estados financieros, datos.gov.co) y DANE (IPC). Cálculos de AMC." });
532
+ }
533
+
534
+ // An entity's December statements, for either supervisor: the latest year
535
+ // in words, the change in real assets, and assets, loans and deposits in
536
+ // pesos of its latest December (stocks by December's index, the year's
537
+ // result by the year's average, D30). o.who owns the deposits; o.flow is
538
+ // the result's column and label.
539
+ function renderStatements(box, rows, dec, o) {
540
  const ipc = new Map((dec || []).map((p) => [p.anio, Number(p.ipc_diciembre)]));
541
+ const avg = new Map((dec || []).map((p) => [p.anio, Number(p.ipc_promedio)]));
542
+ const [fk, flabel] = o.flow;
543
  const valid = (rows || []).filter((x) => x.activos > 0);
544
  if (!valid.length) return box;
545
  const last = valid[valid.length - 1], L = last.anio;
546
  box.append(rich("p", { class: "lede" }, [`En diciembre de ${L} tenía activos por `, { b: pesos(last.activos) },
547
+ ...(last.depositos > 0 ? [`, depósitos de ${o.who} por `, { b: pesos(last.depositos) }] : []),
548
+ ...(last.cartera > 0 ? [" y una cartera de créditos de ", { b: pesos(last.cartera) }] : []), ".",
549
+ ...(last[fk] != null && last[fk] !== 0 ? [` Ese año ${last[fk] > 0 ? "ganó" : "perdió"} `, { b: pesos(Math.abs(last[fk])) }, "."] : [])]));
550
  const pts = valid.filter((x) => ipc.get(x.anio) && ipc.get(L)).map((x) => {
551
+ const k = ipc.get(L) / ipc.get(x.anio), ka = avg.get(x.anio) && avg.get(L) ? avg.get(L) / avg.get(x.anio) : null;
552
  return { anio: x.anio, activos: x.activos * k, cartera: x.cartera > 0 ? x.cartera * k : null, depositos: x.depositos > 0 ? x.depositos * k : null,
553
+ patrimonio: x.patrimonio != null ? x.patrimonio * k : null, flow: x[fk] != null && ka ? x[fk] * ka : null };
554
  });
555
  if (pts.length < 3) return box;
556
  const first = pts[0], change = pts[pts.length - 1].activos / first.activos - 1;
 
564
  const named3 = series.map(([, , , w]) => w).join(", ").replace(/, ([^,]*)$/, " y $1");
565
  const at = (yy) => new Date(Date.UTC(yy, 0, 1));
566
  const f = A.figure({ title: `${A.cap(named3)}, ${first.anio}–${L}`,
567
+ sub: `Cifras de diciembre de cada año, en ${unit} de pesos de diciembre de ${L} (IPC del DANE).${GLOSS(series, o.who)}`,
568
+ sql: o.sql, source: o.source });
 
569
  if (series.length > 1) f.body.append(A.legend(series.map(([, label, c]) => ({ label, color: `var(${c})` }))));
570
  lineChart(f.body, { label: `${A.cap(named3)} de la entidad, en ${unit} de pesos de diciembre de ${L}`, height: 240, animate: false, yMin: 0,
571
  xTicks: () => pts.map((p) => at(p.anio)), yFormat: (v) => A.n1(v / div),
572
  series: series.map(([k, , c]) => ({ color: `var(${c})`, width: k === "activos" ? 2.5 : 2, values: pts.map((p) => ({ x: at(p.anio), y: p[k] })) })),
573
  tip: (x, i) => ({ title: `Diciembre de ${pts[i].anio}`, rows: series.map(([k, label, c]) =>
574
  ({ label, value: pts[i][k] == null ? "—" : pesos(pts[i][k]), color: A.css(c) })) }) });
575
+ f.fig.append(A.tableView(`Estados de diciembre de la entidad, en millones de pesos de ${L}`,
576
+ ["Año", "Activos", "Cartera", "Depósitos", "Patrimonio", flabel],
577
+ pts.map((p) => [String(p.anio), ...["activos", "cartera", "depositos", "patrimonio", "flow"].map((k) => p[k] == null ? "—" : n(p[k] / 1e6))])));
578
  box.append(f.fig);
579
  return box;
580
  }
581
 
582
+ // A bank, insurer, trust company or other entity Superfinanciera supervises:
583
+ // its type, the span of its CUIF reports, and its December statements.
584
+ // Superfinanciera's type names are cut short or mistyped in the source
585
+ // ("COMPANIAS DE FINANCIAMIENTO COMERCI"), and so are the entity names in
586
+ // its statements: the 29 types CUIF carries are written here, and the
587
+ // company keeps the registry's name (the NIT joins them exactly).
588
+ const SFC_TYPES = { 1: "establecimiento bancario", 2: "corporación financiera", 4: "compañía de financiamiento",
589
+ 5: "sociedad fiduciaria", 6: "almacén general de depósito", 10: "sociedad de capitalización", 11: "corredor de seguros",
590
+ 13: "compañía de seguros generales", 14: "compañía de seguros de vida", 15: "cooperativa de seguros",
591
+ 22: "institución oficial especial", 23: "administradora de fondos de pensiones y cesantías",
592
+ 25: "administradora del régimen de prima media", 32: "cooperativa financiera", 85: "comisionista de bolsa de valores",
593
+ 128: "sociedad especializada en depósitos y pagos electrónicos", 35: "administradora de sistemas de compensación y liquidación de divisas",
594
+ 81: "organismo de autorregulación", 82: "bolsa de valores", 83: "depósito centralizado de valores",
595
+ 84: "sociedad calificadora de valores", 87: "sociedad administradora de inversión", 118: "sistema de pago de bajo valor",
596
+ 400: "bolsa agropecuaria", 401: "comisionista de bolsa agropecuaria", 501: "administradora de sistemas de negociación de divisas",
597
+ 502: "administradora de sistemas de negociación de valores", 504: "cámara de riesgo central de contraparte",
598
+ 509: "proveedor de precios para valoración" };
599
+ function renderFinancial(r, e, rows, dec) {
600
+ if (!e) return null;
601
+ const box = el("section", { class: "block reveal", style: "padding-top:28px" },
602
+ el("p", { class: "kicker", text: "Superintendencia Financiera de Colombia" }),
603
+ el("h3", { text: "Vigilada por la Superintendencia Financiera" }));
604
+ const kind = SFC_TYPES[e.tipo_entidad] || (e.nombre_tipo || "").toLowerCase();
605
+ box.append(rich("p", { class: "lede" }, [
606
+ "La Superintendencia Financiera la vigila como ", { b: kind }, ".",
607
+ " Sus estados financieros en los datos abiertos de la Superintendencia (el CUIF, desde 2016) van de ",
608
+ `${A.monthYear(e.primer_reporte)} a ${A.monthYear(e.ultimo_reporte)}.`]));
609
+ return renderStatements(box, rows, dec, { who: "sus clientes", flow: ["utilidad", "Utilidad"],
610
+ sql: `SELECT anio, activos, cartera, depositos, patrimonio, utilidad\nFROM financial_statements\nWHERE tipo_entidad = ${Number(e.tipo_entidad)} AND codigo_entidad = ${Number(e.codigo_entidad)}\nORDER BY anio`,
611
+ source: "Superintendencia Financiera de Colombia (CUIF, datos.gov.co) y DANE (IPC). Cálculos de AMC." });
612
+ }
613
+
614
  // The company's registrations in the tourism registry (RNT, MinCIT), by
615
  // category and municipality. Rooms are summed as tourism_counts sums them:
616
  // not those of a registration that declares more rooms than beds.
metodologia/index.html CHANGED
@@ -16,11 +16,11 @@
16
  "@type": "Dataset",
17
  "name": "Analíticas Mercantiles Colombianas: el registro empresarial de Colombia, depurado",
18
  "alternateName": "AMC",
19
- "description": "El Registro Único Empresarial y Social (RUES) de Colombia, depurado y verificado: una fila por empresa, con sus matrículas reunidas y un margen de error declarado; empresas activas según la renovación de su matrícula; sector CIIU, cámara de comercio, forma jurídica y fecha de creación desde 1878; y los estados financieros de las sociedades que reportan a la Superintendencia de Sociedades. Archivos Parquet abiertos, con el SQL de cada cifra publicada.",
20
  "url": "https://amc.clyxconsulting.com/metodologia/",
21
  "sameAs": "https://huggingface.co/datasets/clyxconsultingdev/amc-rues",
22
  "inLanguage": "es",
23
- "keywords": ["empresas", "Colombia", "registro mercantil", "RUES", "Confecámaras", "cámaras de comercio", "CIIU", "estados financieros", "Superintendencia de Sociedades", "datos abiertos"],
24
  "license": "https://creativecommons.org/licenses/by-sa/4.0/",
25
  "isAccessibleForFree": true,
26
  "creator": { "@type": "Organization", "name": "Clyx Consulting", "url": "https://clyxconsulting.com/" },
@@ -162,8 +162,9 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
162
  <a class="brand" href="../index.html"><span class="mark">AMC</span><span class="name">Analíticas Mercantiles<small>Empresas de Colombia, en datos abiertos</small></span></a>
163
  <a class="by" href="https://clyxconsulting.com/" rel="noopener" aria-label="Un proyecto de Clyx Consulting">por<span class="clyx word" aria-hidden="true"></span></a>
164
  <div class="links">
165
- <a href="../index.html" class="opt">Inicio</a>
166
  <a href="../historias/index.html">Historias</a>
 
 
167
  <a href="../consulta/index.html">Consulta SQL</a>
168
  <a href="../metodologia/index.html" class="opt" aria-current="page">Metodología</a>
169
  <button class="theme" id="theme" type="button" aria-label="Cambiar entre tema claro y oscuro" title="Tema claro / oscuro"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="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"/></svg></button>
@@ -194,7 +195,8 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
194
  <section id="resumen">
195
  <table class="facts" aria-label="Ficha técnica">
196
  <tbody id="facts">
197
- <tr><th>Fuente</th><td>Registro Único Empresarial y Social (RUES), Confecámaras</td></tr>
 
198
  <tr><th>Unidad de análisis</th><td>La empresa: una persona jurídica o un comerciante persona natural, con todas sus matrículas</td></tr>
199
  <tr><th>Cobertura</th><td>Todo el país: las cámaras de comercio que reportan al RUES</td></tr>
200
  <tr><th>Periodicidad</th><td>Aproximadamente mensual, cuando la fuente publica</td></tr>
@@ -208,9 +210,17 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
208
  <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>
209
  <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>
210
  <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>
211
- <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>
212
  <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>
213
  <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>
 
 
 
 
 
 
 
 
214
  </section>
215
 
216
  <section id="proceso">
@@ -236,7 +246,7 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
236
  <dt id="nueva">Empresa nueva</dt>
237
  <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>
238
  <dt id="activa">Empresa activa</dt>
239
- <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>
240
  <dt>Persona jurídica y persona natural</dt>
241
  <dd>Una sociedad, una entidad sin ánimo de lucro, una cooperativa o una entidad pública es una persona jurídica: existe por sus estatutos. Un comerciante persona natural es una persona que ejerce el comercio a título propio. El panorama separa los dos grupos porque se comportan distinto.</dd>
242
  <dt>Sector</dt>
@@ -250,7 +260,7 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
250
 
251
  <section id="matices">
252
  <h2>Cómo leer las cifras</h2>
253
- <p>Cinco matices que cambian las conclusiones si se pasan por alto.</p>
254
 
255
  <div class="nuance" id="minimo">
256
  <h3>El número de empresas activas es un mínimo, y crece durante el año</h3>
@@ -281,6 +291,18 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
281
  <p>El RUES tiene 9,4 millones de matrículas, pero 8,3 millones de empresas: muchas tienen más de una. Cada cifra del panorama dice si cuenta empresas o matrículas, y lo que cambió entre cortes se mide por matrícula, porque así lo registra la fuente.</p>
282
  <p class="why"><b>Por qué importa:</b> sumar matrículas como si fueran empresas infla los totales. Para ver exactamente qué deja por fuera cada cifra, la consulta SQL incluye la tabla <code>coverage</code>.</p>
283
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
284
  <div class="nuance" id="supervivencia">
285
  <h3>Por qué no publicamos tasas de supervivencia</h3>
286
  <p>Es común ver «tasas de supervivencia a cinco años» calculadas con el RUES. Aquí no las hay, por tres razones. <b>Renovar no es sobrevivir:</b> una matrícula puede seguir renovándose sin actividad, un negocio que opera puede dejar de renovar, y la depuración anual de la Ley 1727 de 2014 cancela en bloque matrículas que dejaron de renovar años antes, así que el «cierre» cae en el año de la limpieza y no en el año en que el negocio cerró. <b>La fuente no guarda la historia:</b> de cada matrícula conserva solo el último año renovado, así que no dice en qué año dejó de renovar. <b>Hay un vacío:</b> cerca de una de cada siete matrículas no tiene año de renovación registrado, y contarlas como cerradas inflaría la mortalidad.</p>
@@ -301,8 +323,8 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
301
  <section id="limites">
302
  <h2>Lo que estos datos no pueden decir</h2>
303
  <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>
304
- <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>
305
- <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>
306
  <p><b>Quién es cada comerciante persona natural.</b> Por decisión deliberada: ver privacidad.</p>
307
  </section>
308
 
@@ -313,6 +335,7 @@ footer { padding: 0 0 48px; color: var(--muted); font-size: 13px; }
313
  <li>Las <b>personas jurídicas</b> se publican con su razón social, NIT y matrícula: son datos de empresas.</li>
314
  <li>Los <b>comerciantes personas naturales</b>, y cualquier tipo de organización que no sea claramente una persona jurídica, <b>se cuentan pero nunca se nombran</b>: sin nombre, sin número de identificación, sin matrícula.</li>
315
  <li>El nombre del <b>representante legal</b> no se publica nunca.</li>
 
316
  </ul>
317
  <p>La regla funciona como una lista de lo permitido: si el registro agrega un tipo de organización nuevo, queda oculto hasta que una persona decida lo contrario. Y se comprueba sobre los archivos ya generados, antes de cada publicación.</p>
318
  </section>
@@ -351,11 +374,18 @@ dbGetQuery(con, sprintf("SELECT section, count(*) AS activas FROM '%s' WHERE is_
351
  <h2>Licencia y cómo citar</h2>
352
  <p>Los datos se publican bajo <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.es" target="_blank" rel="noopener">CC BY-SA 4.0</a>, la misma licencia de la fuente: puedes usarlos, compartirlos y transformarlos, también con fines comerciales, siempre que <b>atribuyas la fuente</b> y compartas lo que derives <b>bajo la misma licencia</b>.</p>
353
  <p class="cite" id="cite">Analíticas Mercantiles Colombianas (AMC), a partir del Registro Único Empresarial y Social (RUES), Confecámaras, datos.gov.co.</p>
354
- <p>Si usas la tabla <code>financials</code>, atribuye también su fuente: <i>estados financieros NIIF, Superintendencia de Sociedades, datos.gov.co</i>. Se publica bajo la misma licencia.</p>
 
 
 
 
 
 
 
355
  </section>
356
  </article>
357
  </div>
358
- <footer class="wrap"><p>Fuente: RUES · Confecámaras · datos.gov.co, bajo licencia CC BY-SA 4.0.</p>
359
  <a class="clyx-credit" href="https://clyxconsulting.com/" rel="noopener" aria-label="Un proyecto de Clyx Consulting"><small>Un proyecto de</small><span class="clyx" aria-hidden="true"></span></a></footer>
360
 
361
  <script type="module">
@@ -397,6 +427,29 @@ const DESCRIPTIONS = {
397
  "periods.parquet": "Los periodos presidenciales desde 1990, de posesión a posesión.",
398
  "milestones.parquet": "Leyes y hechos que cambiaron las reglas del registro, con su fuente.",
399
  "activities.parquet": "Los nombres oficiales de las clases CIIU Rev. 4 A.C. del DANE.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
400
  };
401
 
402
  (async () => {
 
16
  "@type": "Dataset",
17
  "name": "Analíticas Mercantiles Colombianas: el registro empresarial de Colombia, depurado",
18
  "alternateName": "AMC",
19
+ "description": "El Registro Único Empresarial y Social (RUES) de Colombia, depurado y verificado: una fila por empresa, con sus matrículas reunidas y un margen de error declarado; empresas activas según la renovación de su matrícula; sector CIIU, cámara de comercio, forma jurídica y fecha de creación desde 1878; los estados financieros de las sociedades que reportan a la Superintendencia de Sociedades, de los bancos y aseguradoras que vigila la Superintendencia Financiera y de las cooperativas que vigila la Supersolidaria; los prestadores del Registro Nacional de Turismo; y series del DANE. Archivos Parquet abiertos, con el SQL de cada cifra publicada.",
20
  "url": "https://amc.clyxconsulting.com/metodologia/",
21
  "sameAs": "https://huggingface.co/datasets/clyxconsultingdev/amc-rues",
22
  "inLanguage": "es",
23
+ "keywords": ["empresas", "Colombia", "registro mercantil", "RUES", "Confecámaras", "cámaras de comercio", "CIIU", "estados financieros", "Superintendencia de Sociedades", "Superintendencia Financiera", "Supersolidaria", "Registro Nacional de Turismo", "DANE", "datos abiertos"],
24
  "license": "https://creativecommons.org/licenses/by-sa/4.0/",
25
  "isAccessibleForFree": true,
26
  "creator": { "@type": "Organization", "name": "Clyx Consulting", "url": "https://clyxconsulting.com/" },
 
162
  <a class="brand" href="../index.html"><span class="mark">AMC</span><span class="name">Analíticas Mercantiles<small>Empresas de Colombia, en datos abiertos</small></span></a>
163
  <a class="by" href="https://clyxconsulting.com/" rel="noopener" aria-label="Un proyecto de Clyx Consulting">por<span class="clyx word" aria-hidden="true"></span></a>
164
  <div class="links">
 
165
  <a href="../historias/index.html">Historias</a>
166
+ <a href="../boletin/index.html">Boletín</a>
167
+ <a href="../explorar/index.html">Explorar</a>
168
  <a href="../consulta/index.html">Consulta SQL</a>
169
  <a href="../metodologia/index.html" class="opt" aria-current="page">Metodología</a>
170
  <button class="theme" id="theme" type="button" aria-label="Cambiar entre tema claro y oscuro" title="Tema claro / oscuro"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="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"/></svg></button>
 
195
  <section id="resumen">
196
  <table class="facts" aria-label="Ficha técnica">
197
  <tbody id="facts">
198
+ <tr><th>Fuente principal</th><td>Registro Único Empresarial y Social (RUES), Confecámaras</td></tr>
199
+ <tr><th>Otras fuentes</th><td>Superintendencias de Sociedades, Financiera y de la Economía Solidaria; Registro Nacional de Turismo (MinCIT); DANE</td></tr>
200
  <tr><th>Unidad de análisis</th><td>La empresa: una persona jurídica o un comerciante persona natural, con todas sus matrículas</td></tr>
201
  <tr><th>Cobertura</th><td>Todo el país: las cámaras de comercio que reportan al RUES</td></tr>
202
  <tr><th>Periodicidad</th><td>Aproximadamente mensual, cuando la fuente publica</td></tr>
 
210
  <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>
211
  <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>
212
  <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>
213
+ <p id="estados-faltan"><b>Quiénes no están.</b> Los bancos, las aseguradoras y las demás entidades financieras reportan a la <b>Superintendencia Financiera</b>, no a la de Sociedades: sus estados están en tablas propias (<a href="#otras">abajo</a>), con otras cuentas, y no entran en las clasificaciones por ingresos. Las sociedades que emiten acciones o bonos en la bolsa, como Ecopetrol o Almacenes Éxito, presentan sus estados a la Superintendencia Financiera como emisores, y esos estados no se publican como datos abiertos: no están. 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>
214
  <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>
215
  <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>
216
+ <p id="otras"><b>Otras fuentes, unidas por el NIT.</b> Tres fuentes más se guardan como archivos aparte, cada una con su propia descarga semanal y sus propias comprobaciones; si una falla, la edición sigue con la copia anterior. Todas se publican en datos.gov.co bajo CC BY-SA 4.0, y cada fila se une al registro por el NIT, solo cuando ese NIT es el de una sola empresa que el registro publica.</p>
217
+ <ul>
218
+ <li><b>Superintendencia de la Economía Solidaria.</b> Las cooperativas, fondos de empleados y mutuales que vigila (conjunto <code>kg2d-yfyg</code>), con su tipo y las fechas de cada reporte desde 2017, y diez cifras de sus estados de cada diciembre (<code>tic6-rbue</code>): activos, cartera, depósitos, patrimonio, aportes, excedentes, ingresos y otras. Tablas <code>solidarity_entities</code> y <code>solidarity_finances</code>.</li>
219
+ <li><b>Superintendencia Financiera.</b> Las entidades que vigila, con su NIT (<code>sr9n-792w</code>), y doce cuentas de sus estados de cada diciembre desde 2016, en todas las monedas (<code>mxk5-ce6w</code>): activos, cartera, depósitos, patrimonio, ingresos y utilidad. Tablas <code>financial_entities</code> y <code>financial_statements</code>.</li>
220
+ <li><b>Registro Nacional de Turismo</b>, del Ministerio de Comercio, Industria y Turismo (<code>thwd-ivmp</code>). Las inscripciones activas de cada mes, con su categoría, municipio y las habitaciones, camas y empleados que declaró cada una. La fuente no guarda historia: AMC conserva una copia de cada mes desde octubre de 2026. Tablas <code>tourism</code> y <code>tourism_counts</code>.</li>
221
+ </ul>
222
+ <p>De los estados de la Supersolidaria y de la Superintendencia Financiera solo se publican los que cuadran: activos iguales a pasivos más patrimonio, con margen de un peso.</p>
223
+ <p id="dane"><b>Las cifras del DANE.</b> La población por departamento, el índice de precios al consumidor, el mercado laboral de la Gran Encuesta Integrada de Hogares, el PIB trimestral y por departamento, y los nombres de la CIIU vienen de publicaciones del DANE, que autoriza su uso y transformación con esta cita: <i>Fuente: Departamento Administrativo Nacional de Estadística: www.dane.gov.co</i>. Tablas <code>population</code>, <code>prices</code>, <code>unemployment</code>, <code>gdp</code>, <code>gdp_departments</code> y <code>activities</code>.</p>
224
  </section>
225
 
226
  <section id="proceso">
 
246
  <dt id="nueva">Empresa nueva</dt>
247
  <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>
248
  <dt id="activa">Empresa activa</dt>
249
+ <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). Una empresa que renovó en el año y después canceló su matrícula, o la fusionó con otra, sigue contando como activa en las cifras, porque renovó; su ficha en <a href="../historias/tu-empresa/index.html">Busca tu empresa</a> dice que se canceló después.</dd>
250
  <dt>Persona jurídica y persona natural</dt>
251
  <dd>Una sociedad, una entidad sin ánimo de lucro, una cooperativa o una entidad pública es una persona jurídica: existe por sus estatutos. Un comerciante persona natural es una persona que ejerce el comercio a título propio. El panorama separa los dos grupos porque se comportan distinto.</dd>
252
  <dt>Sector</dt>
 
260
 
261
  <section id="matices">
262
  <h2>Cómo leer las cifras</h2>
263
+ <p>Matices que cambian las conclusiones si se pasan por alto.</p>
264
 
265
  <div class="nuance" id="minimo">
266
  <h3>El número de empresas activas es un mínimo, y crece durante el año</h3>
 
291
  <p>El RUES tiene 9,4 millones de matrículas, pero 8,3 millones de empresas: muchas tienen más de una. Cada cifra del panorama dice si cuenta empresas o matrículas, y lo que cambió entre cortes se mide por matrícula, porque así lo registra la fuente.</p>
292
  <p class="why"><b>Por qué importa:</b> sumar matrículas como si fueran empresas infla los totales. Para ver exactamente qué deja por fuera cada cifra, la consulta SQL incluye la tabla <code>coverage</code>.</p>
293
  </div>
294
+ <div class="nuance" id="pesos">
295
+ <h3>Las cifras de años distintos se comparan en pesos constantes</h3>
296
+ <p>Un peso de 2017 compraba más que uno de 2025. Cuando una página compara años, lleva las cifras a pesos del año más reciente con el IPC del DANE: los saldos (activos, depósitos, cartera) con el índice de diciembre, y lo que pasa a lo largo del año (ingresos, ganancias, excedentes) con el promedio del año. Las tablas se publican en pesos de cada año, como las reportó cada empresa, con la tabla <code>prices</code> al lado para convertirlas.</p>
297
+ <p class="why"><b>Por qué importa:</b> sumar o comparar pesos de años distintos sin convertirlos hace parecer crecimiento lo que es inflación. Las comprobaciones de cada edición rechazan una historia que lo haga.</p>
298
+ </div>
299
+
300
+ <div class="nuance" id="declarado">
301
+ <h3>Lo que una fuente declara mal se marca, no se corrige</h3>
302
+ <p>Las fuentes traen errores de digitación. En el Registro Nacional de Turismo, unas pocas inscripciones declaran más habitaciones que camas: un operador declaró 181 habitaciones y 2 camas en cada uno de 186 apartamentos. Como toda habitación tiene una cama, las habitaciones de esas inscripciones no se suman; las inscripciones sí se cuentan, con sus camas y empleados. En los estados financieros, una cifra en una unidad dudosa se marca (<code>unidad_dudosa</code>) y un estado que no cuadra no se publica.</p>
303
+ <p class="why"><b>Por qué importa:</b> unos pocos errores pueden mover un total entero; en las viviendas turísticas, los de las habitaciones sumaban casi un tercio. Cada regla dice qué deja fuera, y el dato original se conserva en la tabla de cada fuente.</p>
304
+ </div>
305
+
306
  <div class="nuance" id="supervivencia">
307
  <h3>Por qué no publicamos tasas de supervivencia</h3>
308
  <p>Es común ver «tasas de supervivencia a cinco años» calculadas con el RUES. Aquí no las hay, por tres razones. <b>Renovar no es sobrevivir:</b> una matrícula puede seguir renovándose sin actividad, un negocio que opera puede dejar de renovar, y la depuración anual de la Ley 1727 de 2014 cancela en bloque matrículas que dejaron de renovar años antes, así que el «cierre» cae en el año de la limpieza y no en el año en que el negocio cerró. <b>La fuente no guarda la historia:</b> de cada matrícula conserva solo el último año renovado, así que no dice en qué año dejó de renovar. <b>Hay un vacío:</b> cerca de una de cada siete matrículas no tiene año de renovación registrado, y contarlas como cerradas inflaría la mortalidad.</p>
 
323
  <section id="limites">
324
  <h2>Lo que estos datos no pueden decir</h2>
325
  <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>
326
+ <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; solo para los prestadores turísticos y las entidades de la Supersolidaria hay municipio, y viene de esas fuentes.</p>
327
+ <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 una superintendencia, 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 que emiten en la bolsa tampoco están (<a href="#estados-faltan">quiénes</a>). Y ninguna fuente aquí mide empleados, salvo los que declara cada inscripción del Registro Nacional de Turismo.</p>
328
  <p><b>Quién es cada comerciante persona natural.</b> Por decisión deliberada: ver privacidad.</p>
329
  </section>
330
 
 
335
  <li>Las <b>personas jurídicas</b> se publican con su razón social, NIT y matrícula: son datos de empresas.</li>
336
  <li>Los <b>comerciantes personas naturales</b>, y cualquier tipo de organización que no sea claramente una persona jurídica, <b>se cuentan pero nunca se nombran</b>: sin nombre, sin número de identificación, sin matrícula.</li>
337
  <li>El nombre del <b>representante legal</b> no se publica nunca.</li>
338
+ <li>En las <b>otras fuentes</b> decide el registro: una fila se nombra solo si su NIT es el de una sola empresa que el registro publica. Las demás, como las personas inscritas en el Registro Nacional de Turismo, se cuentan por municipio y categoría, nunca en grupos de menos de cinco prestadores distintos, y su número de documento no sale nunca del servidor. Los nombres, teléfonos, correos y direcciones de representantes y establecimientos que traen esas fuentes ni siquiera se descargan.</li>
339
  </ul>
340
  <p>La regla funciona como una lista de lo permitido: si el registro agrega un tipo de organización nuevo, queda oculto hasta que una persona decida lo contrario. Y se comprueba sobre los archivos ya generados, antes de cada publicación.</p>
341
  </section>
 
374
  <h2>Licencia y cómo citar</h2>
375
  <p>Los datos se publican bajo <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.es" target="_blank" rel="noopener">CC BY-SA 4.0</a>, la misma licencia de la fuente: puedes usarlos, compartirlos y transformarlos, también con fines comerciales, siempre que <b>atribuyas la fuente</b> y compartas lo que derives <b>bajo la misma licencia</b>.</p>
376
  <p class="cite" id="cite">Analíticas Mercantiles Colombianas (AMC), a partir del Registro Único Empresarial y Social (RUES), Confecámaras, datos.gov.co.</p>
377
+ <p>Si usas las tablas de otras fuentes, atribuye también la suya. Todas se publican bajo la misma licencia.</p>
378
+ <ul>
379
+ <li><code>financials</code>: <i>estados financieros NIIF, Superintendencia de Sociedades, datos.gov.co</i>.</li>
380
+ <li><code>financial_entities</code> y <code>financial_statements</code>: <i>Superintendencia Financiera de Colombia, datos.gov.co</i>.</li>
381
+ <li><code>solidarity_entities</code> y <code>solidarity_finances</code>: <i>Superintendencia de la Economía Solidaria, datos.gov.co</i>.</li>
382
+ <li><code>tourism</code> y <code>tourism_counts</code>: <i>Registro Nacional de Turismo, Ministerio de Comercio, Industria y Turismo, datos.gov.co</i>.</li>
383
+ <li><code>population</code>, <code>prices</code>, <code>unemployment</code>, <code>gdp</code>, <code>gdp_departments</code> y <code>activities</code>: <i>Fuente: Departamento Administrativo Nacional de Estadística: www.dane.gov.co</i>.</li>
384
+ </ul>
385
  </section>
386
  </article>
387
  </div>
388
+ <footer class="wrap"><p>Fuente: RUES · Confecámaras · datos.gov.co, bajo licencia CC BY-SA 4.0. Estados financieros: Superintendencias de Sociedades, Financiera y de la Economía Solidaria. Turismo: MinCIT. Cifras de población, precios, PIB y empleo, y la clasificación CIIU: Fuente: Departamento Administrativo Nacional de Estadística: www.dane.gov.co.</p>
389
  <a class="clyx-credit" href="https://clyxconsulting.com/" rel="noopener" aria-label="Un proyecto de Clyx Consulting"><small>Un proyecto de</small><span class="clyx" aria-hidden="true"></span></a></footer>
390
 
391
  <script type="module">
 
427
  "periods.parquet": "Los periodos presidenciales desde 1990, de posesión a posesión.",
428
  "milestones.parquet": "Leyes y hechos que cambiaron las reglas del registro, con su fuente.",
429
  "activities.parquet": "Los nombres oficiales de las clases CIIU Rev. 4 A.C. del DANE.",
430
+ "financials.parquet": "Estados financieros NIIF de las sociedades que reportan a la Superintendencia de Sociedades: ingresos, ganancia, activos, pasivos y patrimonio por empresa y año, en miles de pesos.",
431
+ "benchmarks.parquet": "La distribución de ingresos, crecimiento, margen y endeudamiento de cada actividad y sector, año por año: con qué se compara cada empresa en Busca tu empresa.",
432
+ "name_words.parquet": "Las palabras de cada nombre publicado, ordenadas, para buscar una empresa por nombre o NIT.",
433
+ "name_directory.parquet": "La ficha de búsqueda de cada empresa publicada, con sus comparaciones contadas al publicar.",
434
+ "explorer.parquet": "Empresas creadas y activas por actividad CIIU, cámara y año: los datos del explorador.",
435
+ "explorer_firms.parquet": "Las empresas de cada actividad con sus ingresos más recientes, para el explorador.",
436
+ "explorer_months.parquet": "Empresas creadas por mes en los últimos 36 meses, por actividad y cámara.",
437
+ "id_types.parquet": "Matrículas por año, cámara y tipo de identificación. Solo conteos.",
438
+ "chamber_links.parquet": "Pares de cámaras de comercio que comparten empresas, con cuántas y cuántas por traslado.",
439
+ "regions.parquet": "Las regiones del país y qué departamentos y cámaras reúne cada una.",
440
+ "confecamaras.parquet": "Las cifras de los informes de Confecámaras, con su página, para compararlas con las de AMC.",
441
+ "supersociedades.parquet": "Cuántos estados de AMC coinciden con los publicados por la Superintendencia de Sociedades, año por año.",
442
+ "population.parquet": "La población de cada departamento por año, del DANE.",
443
+ "prices.parquet": "El índice de precios al consumidor del DANE, promedio del año y de diciembre, para llevar pesos a pesos constantes.",
444
+ "unemployment.parquet": "El mercado laboral mes a mes (participación, ocupación, desempleo), de la GEIH del DANE.",
445
+ "gdp.parquet": "El PIB trimestral por grandes ramas, del DANE.",
446
+ "gdp_departments.parquet": "El PIB de cada departamento por año, del DANE.",
447
+ "solidarity_entities.parquet": "Las cooperativas, fondos de empleados y mutuales que vigila la Supersolidaria, con su tipo y sus reportes.",
448
+ "solidarity_finances.parquet": "Los estados de diciembre de esas entidades, desde 2017, solo los que cuadran.",
449
+ "financial_entities.parquet": "Los bancos, aseguradoras y demás entidades que vigila la Superintendencia Financiera, con su NIT.",
450
+ "financial_statements.parquet": "Los estados de diciembre de esas entidades, desde 2016, solo los que cuadran.",
451
+ "tourism.parquet": "Las inscripciones en el Registro Nacional de Turismo de las empresas que el registro publica.",
452
+ "tourism_counts.parquet": "Todas las demás inscripciones, contadas por municipio y categoría, nunca en grupos de menos de cinco prestadores.",
453
  };
454
 
455
  (async () => {
sitemap.xml CHANGED
@@ -6,6 +6,7 @@
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/cara-a-cara/</loc></url>
10
  <url><loc>https://amc.clyxconsulting.com/historias/carrera/</loc></url>
11
  <url><loc>https://amc.clyxconsulting.com/historias/concentracion/</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/bancos/</loc></url>
10
  <url><loc>https://amc.clyxconsulting.com/historias/cara-a-cara/</loc></url>
11
  <url><loc>https://amc.clyxconsulting.com/historias/carrera/</loc></url>
12
  <url><loc>https://amc.clyxconsulting.com/historias/concentracion/</loc></url>