fix: restaura importações vitais e estabiliza lógica de datas
This commit is contained in:
parent
4c8ce88ca1
commit
e58b38f010
|
|
@ -1,4 +1,5 @@
|
||||||
import { Bell, X, CheckCircle, Trash2, ShieldCheck, FileText, Paperclip, DollarSign, AlertTriangle, Info, TrendingUp, CreditCard } from 'lucide-react';
|
import React, { useState, useEffect, useRef } from 'react';
|
||||||
|
import { Bell, X, CheckCircle, Trash2, ShieldCheck, FileText, Paperclip, DollarSign, AlertTriangle, Info, TrendingUp, CreditCard, ClipboardList } from 'lucide-react';
|
||||||
import { SchoolData, Notification, View } from '../types';
|
import { SchoolData, Notification, View } from '../types';
|
||||||
import { dbService } from '../services/dbService';
|
import { dbService } from '../services/dbService';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ import multer from 'multer';
|
||||||
import sharp from 'sharp';
|
import sharp from 'sharp';
|
||||||
import jwt from 'jsonwebtoken';
|
import jwt from 'jsonwebtoken';
|
||||||
import cron from 'node-cron';
|
import cron from 'node-cron';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
// === Novos módulos Self-Hosted (substituem Supabase) ===
|
// === Novos módulos Self-Hosted (substituem Supabase) ===
|
||||||
import {
|
import {
|
||||||
|
|
|
||||||
|
|
@ -145,10 +145,10 @@ export default function Frequencia() {
|
||||||
|
|
||||||
// Merge and Categorize — Clone EXATO do Manager (AttendanceQuery.tsx)
|
// Merge and Categorize — Clone EXATO do Manager (AttendanceQuery.tsx)
|
||||||
const processedItems = deduplicatedLessons.map(lesson => {
|
const processedItems = deduplicatedLessons.map(lesson => {
|
||||||
// Construir janela de tempo EXATAMENTE como o Manager faz (com Date objects)
|
// Construir janela de tempo de forma resiliente
|
||||||
const lessonStart = new Date(lesson.date + 'T' + (lesson.startTime || '00:00') + ':00');
|
const lessonStartMs = parseLessonDateTime(lesson.date, lesson.startTime || '00:00', 0);
|
||||||
const lessonEnd = new Date(lesson.date + 'T' + (lesson.endTime || '23:59') + ':00');
|
const lessonEndMs = parseLessonDateTime(lesson.date, lesson.endTime || '23:59', 23);
|
||||||
const presenceStartWindow = new Date(lessonStart.getTime() - 30 * 60 * 1000); // 30 mins before
|
const presenceStartWindowMs = lessonStartMs - (30 * 60 * 1000); // 30 mins before
|
||||||
|
|
||||||
// Buscar registro com a MESMA lógica do Manager (find, não filter)
|
// Buscar registro com a MESMA lógica do Manager (find, não filter)
|
||||||
let record = attendance.find(a => {
|
let record = attendance.find(a => {
|
||||||
|
|
@ -158,8 +158,8 @@ export default function Frequencia() {
|
||||||
// 2. Match exato de string (formato do JSON/sync)
|
// 2. Match exato de string (formato do JSON/sync)
|
||||||
if (a.date === `${lesson.date}T${lesson.startTime || '00:00'}:00`) return true;
|
if (a.date === `${lesson.date}T${lesson.startTime || '00:00'}:00`) return true;
|
||||||
// 3. Match por janela de tempo (30 min antes até fim da aula)
|
// 3. Match por janela de tempo (30 min antes até fim da aula)
|
||||||
const recordTime = new Date(a.date);
|
const recordTimeMs = new Date(a.date).getTime();
|
||||||
return recordTime >= presenceStartWindow && recordTime <= lessonEnd;
|
return recordTimeMs >= presenceStartWindowMs && recordTimeMs <= lessonEndMs;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Se não encontrou registro real, verificar se precisa de justificativa associada
|
// Se não encontrou registro real, verificar se precisa de justificativa associada
|
||||||
|
|
@ -168,8 +168,8 @@ export default function Frequencia() {
|
||||||
record = attendance.find(a => {
|
record = attendance.find(a => {
|
||||||
if (!a.date || typeof a.date !== 'string' || !a.justification) return false;
|
if (!a.date || typeof a.date !== 'string' || !a.justification) return false;
|
||||||
if (a.date === `${lesson.date}T${lesson.startTime || '00:00'}:00`) return true;
|
if (a.date === `${lesson.date}T${lesson.startTime || '00:00'}:00`) return true;
|
||||||
const recordTime = new Date(a.date);
|
const recordTimeMs = new Date(a.date).getTime();
|
||||||
return recordTime >= presenceStartWindow && recordTime <= lessonEnd;
|
return recordTimeMs >= presenceStartWindowMs && recordTimeMs <= lessonEndMs;
|
||||||
}) || undefined;
|
}) || undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue