Dehesa
Gestión ganadera profesional
Dehesa
Gestión ganadera profesional
Conectando...
🐄
Total animales
🐮
Vacas
🐂
Toros
🐄
Terneros
🥩
Novillos/Novillas
📋
Tareas pendientes
💊
Tratamientos activos
🚫
Bajas registradas
Composición del rebaño por tipo
Destetes
📋 Tareas pendientes
Cargando...
📓 Últimos cambios
Sin cambios registrados
🍼 Próximos destetes
Cargando...
🌿 Por explotación
Panel
Animales
Sanidad
Finca
Destetes
Guías
Sanear
<\/body> <\/html>`; // Open new window with HTML report (can be printed/saved) const win = window.open('', '_blank', 'width=700,height=600'); if (win) { win.document.write(htmlBody); win.document.close(); // Add print/email buttons setTimeout(() => { const div = win.document.createElement('div'); div.style.cssText = 'position:fixed;top:10px;right:10px;display:flex;gap:8px;z-index:999'; div.innerHTML = ` `; win.document.body.appendChild(div); }, 300); } // Also generate mailto with plain text summary const mailBody = `Reporte Dehesa Valmayor — ${hoy}\n\nTotal: ${allA.length} | Vacas: ${vacas} | Toros: ${toros} | Terneros: ${terneros} | Novillos: ${novillos}\nBajas: ${bajas} | Tareas pendientes: ${tarPend}\n\nCambios hoy (${hoyEntries.length}):\n` + hoyEntries.map(e => new Date(e.ts).toLocaleTimeString('es-ES',{hour:'2-digit',minute:'2-digit'}) + ' — ' + e.accion + (e.detalle?' — '+e.detalle:'')).join('\n'); diarioLog('📧 Reporte generado', hoy + ' · ' + hoyEntries.length + ' cambios'); } // ================================================================ // INIT EXTRAS // ================================================================ document.addEventListener('DOMContentLoaded', function() { // Add diario trigger to sidebar (very subtle) const sidebar = document.querySelector('.sidebar'); if (sidebar) { const diarioBtn = document.createElement('div'); diarioBtn.style.cssText = 'padding:6px 20px;margin-top:auto;cursor:pointer;opacity:0.3;font-size:0.6rem;color:var(--text3);letter-spacing:0.1em;text-transform:uppercase;transition:opacity 0.2s'; diarioBtn.textContent = '· · · diario'; diarioBtn.title = 'Diario de cambios'; diarioBtn.onmouseover = () => diarioBtn.style.opacity = '0.8'; diarioBtn.onmouseout = () => diarioBtn.style.opacity = '0.3'; diarioBtn.onclick = () => { renderDiario(); openModal('modal-diario'); }; sidebar.appendChild(diarioBtn); } // Start reminder scheduler programarRecordatorios(); // Apply any saved finca names actualizarSelectoresFinca(); }); <\/body> <\/html>`; // Open new window with HTML report (can be printed/saved) const win = window.open('', '_blank', 'width=700,height=600'); if (win) { win.document.write(htmlBody); win.document.close(); // Add print/email buttons setTimeout(() => { const div = win.document.createElement('div'); div.style.cssText = 'position:fixed;top:10px;right:10px;display:flex;gap:8px;z-index:999'; div.innerHTML = ` `; win.document.body.appendChild(div); }, 300); } // Also generate mailto with plain text summary const mailBody = `Reporte Dehesa Valmayor — ${hoy}\n\nTotal: ${allA.length} | Vacas: ${vacas} | Toros: ${toros} | Terneros: ${terneros} | Novillos: ${novillos}\nBajas: ${bajas} | Tareas pendientes: ${tarPend}\n\nCambios hoy (${hoyEntries.length}):\n` + hoyEntries.map(e => new Date(e.ts).toLocaleTimeString('es-ES',{hour:'2-digit',minute:'2-digit'}) + ' — ' + e.accion + (e.detalle?' — '+e.detalle:'')).join('\n'); diarioLog('📧 Reporte generado', hoy + ' · ' + hoyEntries.length + ' cambios'); } // ================================================================ // INIT EXTRAS // ================================================================ document.addEventListener('DOMContentLoaded', function() { // Add diario trigger to sidebar (very subtle) const sidebar = document.querySelector('.sidebar'); if (sidebar) { const diarioBtn = document.createElement('div'); diarioBtn.style.cssText = 'padding:6px 20px;margin-top:auto;cursor:pointer;opacity:0.3;font-size:0.6rem;color:var(--text3);letter-spacing:0.1em;text-transform:uppercase;transition:opacity 0.2s'; diarioBtn.textContent = '· · · diario'; diarioBtn.title = 'Diario de cambios'; diarioBtn.onmouseover = () => diarioBtn.style.opacity = '0.8'; diarioBtn.onmouseout = () => diarioBtn.style.opacity = '0.3'; diarioBtn.onclick = () => { renderDiario(); openModal('modal-diario'); }; sidebar.appendChild(diarioBtn); } // Start reminder scheduler programarRecordatorios(); // Apply any saved finca names actualizarSelectoresFinca(); });