Categoria Hito
Urgentes
Categoria Hito
Backlog
Hitos
Hábitos
Estadísticas
Tareas creadas vs completadas — últimas 8 semanas
Creadas
Completadas
Tareas por categoría
Cumpleaños
Vencimientos
Viajes
Nota libre
Notas guardadas
for(let d=1;d<=lastDate;d++){ const ds=yr+'-'+pad(mo+1)+'-'+pad(d); const cls='month-cell'+(ds===TODAY?' mc-today':'')+(ds===S.anchor&&ds!==TODAY?' mc-anchor':''); const dt2=S.tasks.filter(t=>t.date===ds&&!t.isUrgent); const dv=S.vencs.filter(v=>!v.paid&&v.dueDate&&genRecDates(v.dueDate,v.recurrence,v.endDate).includes(ds)); const dvj=S.viajes.filter(vj=>vj.startDate&&vj.endDate&&ds>=vj.startDate&&ds<=vj.endDate); const dc=S.cumples.filter(c=>{const b=parseBd(c.birthday);return b&&b.day===d&&b.mo===mo;}); const dh=S.hitos.filter(h=>h.targetMonth===ym&&!h.completed); let items=''; // 1. Viajes: thin teal line dvj.forEach(vj=>{ const isStart=ds===vj.startDate,isSolo=isStart&&ds===vj.endDate; const p=(vj.paradas||[]).find(q=>q.date===ds); const city=p?p.lugar:''; const showName=isStart||isSolo||(new Date(ds+'T12:00:00').getDay()===1); items+='
' +(city?'
'+esc(trunc(city,20))+'
':'') +'
' +(showName?'
'+esc(trunc(vj.name,20))+'
':'') +'
'; }); // 2. Vencimientos (orange) if(dv.length>0){ dv.slice(0,2).forEach(v=>items+='
📅 '+esc(trunc(v.name,16))+'
'); if(dv.length>2)items+='
+' +(dv.length-2)+' venc.
'; } // 3. Cumpleanos dc.slice(0,2).forEach(c=>items+='
'+bdIcon(daysUntilBd(c.birthday))+' '+esc(trunc(c.name,16))+'
'); if(dc.length>2)items+='
+' +(dc.length-2)+' cump.
'; // 4. Hitos if(dh.length>0){ dh.slice(0,2).forEach(h=>items+='
⬛ '+esc(trunc(h.name,18))+'
'); if(dh.length>2)items+='
+' +(dh.length-2)+' hitos
'; } // 5. Tareas if(dt2.length)items+='
'+dt2.length+' tarea'+(dt2.length>1?'s':'')+'
'; html+='
'+d+'
'+items+'
'; }