Cómo contar cobertura salarial sin inventar salarios en JavaScript
Transparencia: texto y ejemplo preparados con ayuda de IA. Las filas del ejemplo son sintéticas. Una canalización de datos de empleo debería responder dos preguntas distintas: ¿hay un campo de salario? y ¿puedo compara
Transparencia: texto y ejemplo preparados con ayuda de IA. Las filas del ejemplo son sintéticas.
Una canalización de datos de empleo debería responder dos preguntas distintas: ¿hay un campo de salario? y ¿puedo comparar su contenido como bruto anual? En el estudio de MapaLocal sobre salarios por convenio y ofertas contamos 107 campos salariales entre 423 registros filtrados; eso no basta para estimar una media salarial. Aquí mostramos una forma de conservar esa distinción en JavaScript.
Define el contrato de entrada
Este ejemplo supone que la fase de ingesta ya extrajo texto o números. Un valor ausente no equivale a cero. La normalización solo admite bruto anual explícito, o bruto mensual con número de pagas documentado. En producción también habría que controlar moneda, jornada, rangos, procedencia y duplicados.
function classify(row) {
const hasField = row.raw != null && String(row.raw).trim() !== "";
if (!hasField) return { hasField, annual: null };
const validAmount = Number.isFinite(row.amount) && row.amount > 0;
if (!validAmount || row.kind !== "gross") return { hasField, annual: null };
if (row.period === "year") return { hasField, annual: row.amount };
if (row.period === "month" && Number.isInteger(row.payments) && row.payments > 0) {
return { hasField, annual: row.amount * row.payments };
}
return { hasField, annual: null };
}
const example = [
{ raw: null },
{ raw: "1.400 €/mes", amount: 1400, period: "month" },
{ raw: "1.400 € brutos/mes, 14 pagas", amount: 1400,
kind: "gross", period: "month", payments: 14 },
{ raw: "21.000 € brutos/año", amount: 21000, kind: "gross", period: "year" }
].map(classify);
console.assert(example.filter(x => x.hasField).length === 3);
console.assert(example.filter(x => x.annual !== null).length === 2);
console.assert(example[2].annual === 19600);
Publica dos contadores
Guarda por separado el denominador filtrado, el número de campos presentes y el número de importes normalizables. Registra también el criterio de filtrado y la fecha de extracción. El primer cociente mide cobertura; el segundo ayuda a decidir si existe suficiente información comparable. Ninguno vuelve representativa una extracción.
Para inspeccionar errores, conserva un motivo de descarte junto con el dato original: periodo desconocido, bruto sin confirmar o pagas no documentadas. Así se puede revisar la regla sin convertir un supuesto en un resultado.
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.