This commit is contained in:
2025-10-16 19:49:50 +00:00
parent ba6b4fef4f
commit c4097bc737
119 changed files with 3765 additions and 14390 deletions
@@ -0,0 +1,29 @@
// cross-day.mjs
// Pares ordenados para jornadas que pueden cruzar medianoche.
// rows: [{ doc, name, isoDate, dt_ms, ... }, ...]
export function buildIntervalsCrossDay(rows){
const byDoc = new Map();
rows.forEach(r => {
(byDoc.get(r.doc) || byDoc.set(r.doc, []).get(r.doc))
.push({ ms: r.dt_ms, date: r.isoDate, name: r.name });
});
const out = [];
for (const [doc, arr] of byDoc.entries()){
arr.sort((a,b)=>a.ms-b.ms);
for (let i=0;i<arr.length;i+=2){
const a = arr[i], b = arr[i+1];
if (!b){
out.push({doc, name:a.name, fecha:a.date, desde_ms:a.ms, hasta_ms:null, durMins:null, obs:'incompleto'});
break;
}
const dur = Math.max(0,(b.ms-a.ms)/60000);
out.push({doc, name:a.name, fecha:a.date, desde_ms:a.ms, hasta_ms:b.ms, durMins:dur, obs:''});
}
}
out.sort((x,y)=> x.doc.localeCompare(y.doc) ||
x.fecha.localeCompare(y.fecha) ||
(x.desde_ms - y.desde_ms));
return out;
}
@@ -0,0 +1,34 @@
// same-day.mjs
// Agrupa por (doc, fecha) y arma pares 1-2, 3-4, ...
export function buildIntervals(rows) {
const nameByDoc = new Map();
const byKey = new Map(); // doc|isoDate -> [ms]
for (const r of rows) {
nameByDoc.set(r.doc, r.name);
const key = `${r.doc}|${r.isoDate}`;
(byKey.get(key) || byKey.set(key, []).get(key)).push(r.dt_ms);
}
const result = [];
for (const [key, arr] of byKey.entries()) {
arr.sort((a,b)=>a-b);
const [doc, isoDate] = key.split('|');
const name = nameByDoc.get(doc) || '';
for (let i=0; i<arr.length; i+=2) {
const desde = arr[i];
const hasta = arr[i+1] ?? null;
let durMins = null, obs = '';
if (hasta != null) durMins = Math.max(0, (hasta - desde)/60000);
else obs = 'incompleto';
result.push({ doc, name, isoDate, desde_ms: desde, hasta_ms: hasta, durMins, obs });
}
}
result.sort((a,b)=>{
if (a.doc !== b.doc) return a.doc.localeCompare(b.doc);
if (a.isoDate !== b.isoDate) return a.isoDate.localeCompare(b.isoDate);
return (a.desde_ms||0) - (b.desde_ms||0);
});
return result;
}
@@ -0,0 +1,6 @@
// LineParserInterface.mjs
export class LineParserInterface {
parseLine(/* line:string */) {
throw new Error('parseLine not implemented');
}
}