.
This commit is contained in:
@@ -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');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user