{{pageTitle}}
{{pageDescription}}
Cuidado com as pessoas.
Precisão nos resultados.
Presença, escala e repasses conectados à sua operação.
Presença e escala
Horas por dia no período selecionado
Seu acompanhamento começa aqui
Importe os registros e cadastre a escala médica.
Tempo por profissional
Maiores totais no período
Presença no período
Primeiro e último evento de cada profissional
| Profissional | Data | Início | Fim | Tempo estimado | Situação | Origem | Repasse estimado | Apuração financeira |
|---|---|---|---|---|---|---|---|---|
| {{initials(r.name)}}{{r.name}}Cód. {{r.code}} | {{formatDate(r.date)}} | {{clockDisplay(r.start)}} | {{clockDisplay(r.end)}} | {{duration(r.observed)}} | {{r.status}} | {{r.source}}Digital incompleto; SQL usado quando disponível | {{money(r.totalCents)}} | {{r.financialStatus}}Ausência declarada: {{r.absenceReason}} |
| Nenhum registro disponível. | ||||||||
Registro digital completo tem prioridade; caso contrário, o SQL importado é usado. O intervalo não desconta pausas e não confirma entrada ou saída física. Ausência estimada exige escala e cobertura confirmada.
Somatórias de todos os resultados filtrados, incluindo as outras páginas. Valores indisponíveis não entram na soma; pendências indicam total parcial.
Horas × tarifa ou valor do plantão, acrescidos dos ajustes por data. Dias pendentes não entram no total. Alterar a escala recalcula os relatórios correspondentes. CSV e PDF incluem o detalhamento financeiro.
| Profissional | Data | Escala contratada | Início estimado | Fim estimado | Tempo estimado | Na escala | Regra / tarifa | Horas elegíveis | Valor horas | Valor plantões | Acréscimos | Descontos | Previsto | Ajuste / justificativa | Atraso* | Saída antes* | Situação | Origem | Repasse estimado | Apuração financeira |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{r.name}}Cód. {{r.code}} | {{formatDate(r.date)}} | {{r.scheduleStart?clockDisplay(r.scheduleStart)+' – '+clockDisplay(r.scheduleEnd):'Não cadastrada'}}até {{formatDate(r.scheduleEnd.slice(0,10))}} | {{clockDisplay(r.start)}} | {{clockDisplay(r.end)}} | {{duration(r.observed)}} | {{duration(r.overlap)}} | {{modeLabel(r.payMode)}}{{r.payMode==='hourly'?money(r.rateCents)+'/h':money(r.shiftRateCents)}} · {{r.payBasis==='observed'&&r.payMode==='hourly'?'intervalo completo':'dentro da escala'}} | {{duration(r.paidSeconds)}} | {{money(r.hourCents)}} | {{money(r.shiftCents)}} | {{money(r.extraCents)}} | {{money(r.discountCents)}} | {{money(r.plannedCents)}} | {{r.adjustmentNote||'—'}} | {{duration(r.late)}} | {{duration(r.early)}} | {{r.status}} | {{r.source}}Digital incompleto; SQL usado quando disponível | {{money(r.totalCents)}} | {{r.financialStatus}}Ausência declarada: {{r.absenceReason}} |
| TOTAL FILTRADO | — | {{duration(reportTotals.scheduled)}} | — | — | {{duration(reportTotals.observed)}} | {{duration(reportTotals.overlap)}} | — | {{duration(reportTotals.paidSeconds)}} | {{money(reportTotals.hourCents)}} | {{money(reportTotals.shiftCents)}} | {{money(reportTotals.extraCents)}} | {{money(reportTotals.discountCents)}} | {{money(reportTotals.plannedCents)}} | — | — | — | — | — | {{money(reportTotals.totalCents)}} | {{reportTotals.paymentPending}} pendências |
| Profissional | Dias com registro | Ausências estimadas | Sem intervalo | Sem cobertura | Tempo estimado | Tempo contratado | Dentro da escala | Valor horas | Plantões | Valor plantões | Acréscimos | Descontos | Previsto | Repasse estimado | Pendências financeiras |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{r.name}}Cód. {{r.code}} | {{r.present}} | {{r.absent}} | {{r.unknown}} | {{r.uncovered}} | {{duration(r.observed)}} | {{duration(r.scheduled)}} | {{duration(r.overlap)}} | {{money(r.hourCents)}} | {{r.shiftCount}} | {{money(r.shiftCents)}} | {{money(r.extraCents)}} | {{money(r.discountCents)}} | {{money(r.plannedCents)}} | {{money(r.totalCents)}} | {{r.paymentPending}} |
| TOTAL FILTRADO | {{reportTotals.present}} | {{reportTotals.absent}} | {{reportTotals.unknown}} | {{reportTotals.uncovered}} | {{duration(reportTotals.observed)}} | {{duration(reportTotals.scheduled)}} | {{duration(reportTotals.overlap)}} | {{money(reportTotals.hourCents)}} | {{reportTotals.shiftCount}} | {{money(reportTotals.shiftCents)}} | {{money(reportTotals.extraCents)}} | {{money(reportTotals.discountCents)}} | {{money(reportTotals.plannedCents)}} | {{money(reportTotals.totalCents)}} | {{reportTotals.paymentPending}} |
* Atraso e saída antecipada estimados pelos eventos, após tolerância de {{tolerance}} minutos. Totais excluem dias sem intervalo. Ausências estimadas significam falta de registro no recorte da consulta, não ausência física comprovada.
Importar registros do MV
Use a exportação da consulta com primeiro e último evento por profissional e dia. Para reimportar o mesmo arquivo, marque a opção de substituição. Registros idênticos serão preservados.
- Linha {{e.line}}: {{e.message}}
Da planilha ao relatório
Validação dos registros
Código do prestador, data, início e fim são obrigatórios. Registros duplicados ou inválidos bloqueiam o envio.
Tempo diário e mensal
O sistema recalcula fim menos início e soma as durações diárias. O total mensal repetido na SQL não é somado.
Comparação com a escala
Cadastre as datas e os horários contratados. A ausência estimada só aparece em dias escalados com cobertura confirmada.
A consulta original considera a manhã e pode omitir turnos da tarde/noite. Para essas escalas, gere a SQL pelo botão em Escala contratada e importe o resultado completo. A SQL original permanece disponível sem alterações.
Histórico de importações
Rastreabilidade e cobertura dos relatórios
| Arquivo | Cobertura | Linhas | Data da importação | Cobertura confirmada |
|---|---|---|---|---|
| {{i.filename}} | {{formatDate(i.from)}} – {{formatDate(i.to)}} | {{i.row_count}} | {{i.created_at}} | |
| Nenhuma importação realizada. | ||||
Importar escala no modelo enviado
DATA · PLANTÃO EM HORAS · HORÁRIO · VALOR PLANTÃO · VALOR FINAL. Nesta planilha, “valor plantão” é a tarifa por hora; o sistema confere horas × tarifa e o total mensal. Dias sem jornada não são importados como escala.
Fotos não são interpretadas automaticamente. Os dois modelos anexados foram transcritos para conferência. Outros meses podem ser importados do Excel/CSV original, uma aba por profissional.
{{g.name}}
{{g.company}} · {{g.specialty}}
{{g.hours}} horas · {{money(g.cents)}}
- {{error}}
Conferir {{g.shifts.length}} jornadas
| Data | Horário | Horas | R$/hora | Previsto |
|---|---|---|---|---|
| {{formatDate(r.date)}} | {{r.start}} – {{r.end}} {{r.next_day?'(+1 dia)':''}} | {{r.hours}} | {{money(amountCents(r.hourly_rate))}} | {{money(Math.round(Number(r.hourly_rate)*100*r.hours))}} |
{{scheduleProgress}}
Cadastrar escala médica
O contrato como referência
A escala permite comparar o intervalo estimado com o horário contratado.
Dia escalado + cobertura confirmada + nenhum registro. Sem confirmação da cobertura, a situação será “Sem cobertura”.
É a interseção do intervalo registrado com o horário contratado. Horas anteriores ou posteriores não entram nessa medida.
Esta versão aceita uma jornada por data de início, de até 24 horas, incluindo término no dia seguinte. A consulta SQL matinal não basta para apurar plantões noturnos: use a extração por escala ou uma marcação digital completa.
Escalas cadastradas
{{data.schedules.length}} datas de trabalho
| Profissional | Data | Horário contratado | Regra | Valor hora | Valor plantão | Acréscimo / desconto | Observação | Ação |
|---|---|---|---|---|---|---|---|---|
| {{s.name}} | {{formatDate(s.date)}} | {{clockDisplay(s.start)}} – {{clockDisplay(s.end)}}até {{formatDate(s.end.slice(0,10))}} | {{modeLabel(s.pay_mode)}} | {{money(amountCents(s.hourly_rate))}} | {{money(amountCents(s.shift_amount))}} | {{money(amountCents(s.extra_amount)||0)}} / {{money(amountCents(s.discount_amount)||0)}} | {{s.note}} | |
| Nenhuma escala neste mês. | ||||||||
Exibindo as primeiras 150 datas. Consulte o relatório diário para ver o período completo.
Cadastrar ou atualizar profissional
Profissionais cadastrados {{data.doctors.length}}
| Código MV | Nome | Especialidade | Ação |
|---|---|---|---|
| {{d.code}} | {{d.name}} | {{d.specialty||'Não informada'}} | |
| Importe a planilha ou cadastre um profissional. | |||
Entre com uma conta médica no site HTTPS para cadastrar uma credencial e usar o dispositivo.
Minha presença de hoje
{{clockState?.doctor?.name||user?.name}} · {{formatDate(bioState.today)}}
Use a impressão digital, o reconhecimento facial ou o desbloqueio aceito pelo celular. O sistema guarda a confirmação criptográfica, nunca sua biometria.
É necessário HTTPS com certificado válido, bloqueio de tela e navegador compatível. Acesse diretamente pelo Chrome ou Safari.
Uma jornada de até 24 horas, com horário do servidor. Sem par digital completo, a apuração continua usando o SQL importado quando disponível.
{{bioAbsenceToday.reason}}
O repasse está pendente de conferência. Registros de atendimento existentes permanecem visíveis.
Cadastrar autenticação
Vincule uma credencial à sua conta antes da primeira marcação.
O próprio dispositivo escolhe o método de desbloqueio permitido. Credenciais podem ser sincronizadas pela conta Apple/Google; o sistema não comprova localização ou presença física.
Minhas credenciais
Nenhuma credencial cadastrada.
Marcações com autenticação do dispositivo
Inícios e términos integram a presença digital. Ausências declaradas ficam pendentes de conferência e não apagam registros importados.
| Usuário | Credencial | Estado | Ação |
|---|---|---|---|
| {{key.name}} | {{key.label}} | {{Number(key.enabled)?'Ativa':'Revogada'}} |
Histórico de confirmações
Últimos 200 eventos| Profissional | Data | Registro | Horário do servidor | Motivo |
|---|---|---|---|---|
| {{event.name}}{{event.code}} | {{formatDate(event.date)}} | {{bioActionName(event.action)}} | {{clockDisplay(event.registered_at)}} | {{event.reason||'—'}} |
| Nenhuma confirmação registrada. | ||||
{{clockState?.doctor?.name||user?.name}}
Prestador {{clockState?.doctor?.code}} · {{formatDate(clockState?.today)}}
Início e término registrados. Este intervalo tem prioridade sobre a planilha SQL na apuração.
Enquanto não houver início e término pelos botões, o sistema usa a planilha SQL disponível para o dia.
SQL importado: {{clockDisplay(pointSQL.start)}} até {{clockDisplay(pointSQL.end)}}.
Ainda não há dados SQL importados para hoje. A apuração ficará pendente até haver informações suficientes.
Uma jornada por data de início, com até 24 horas, sem desconto automático de pausas. O término pode ser registrado no dia seguinte. Não é possível lançar horários retroativos. Marcações abertas há mais de 24 horas permanecem pendentes de conferência.
Meus registros
Últimas 60 datas · origem utilizada na apuração
| Data | Início | Término | Origem | Conferência |
|---|---|---|---|---|
| {{formatDate(r.date)}} | {{clockDisplay(r.start)}} | {{r.source==='Digital incompleto'?'—':clockDisplay(r.end)}} | {{r.source}} | {{r.digitalPending?'Registro digital incompleto':r.end===r.start?'Sem intervalo':'Intervalo disponível'}} |
| Nenhum registro disponível. | ||||
Registros feitos pelos médicos
O administrador cria o acesso individual em Profissionais → Acesso médico. O médico entra no mesmo endereço do sistema e visualiza somente sua área.
Um par digital completo tem prioridade sobre o SQL no dia correspondente. Sem o par completo, o sistema mantém os horários importados. Os registros SQL originais não são apagados.
Marcações digitais
| Médico | Data | Início digital | Término digital | Uso na apuração |
|---|---|---|---|---|
| {{r.name}}{{r.code}} | {{formatDate(r.date)}} | {{clockDisplay(r.start)}} | {{clockDisplay(r.end)}} | {{r.end?'Prioridade: registro digital':'Incompleto: SQL quando disponível'}} |
| Nenhuma marcação digital neste período. | ||||
Criar ou atualizar acesso do médico
Cada conta fica vinculada a um código de prestador. O médico só pode registrar os próprios atendimentos.
Em contas novas, a senha é obrigatória. A senha não é exibida depois de salva. O médico pode trocá-la em Configurações.
| Prestador | Acesso | |
|---|---|---|
| {{a.code}} | {{a.email}} | {{Number(a.enabled)?'Ativo':'Desativado'}} |
Dados da empresa
Prévia do cabeçalho
{{companyForm.name||'Nome da empresa'}}
{{companyForm.cnpj}}
{{companyForm.address}}
{{companyForm.phone}} {{companyForm.email}}
Os dados salvos serão usados nas próximas impressões. Sem logotipo, o relatório mantém um cabeçalho de texto. O CSV contém dados e somatórias, sem imagens.
{{userForm.id?'Editar usuário':'Cadastrar usuário'}}
Administrador: gerencia todo o sistema, empresa e usuários. Gestor: importa dados e configura profissionais e escalas. Consulta: visualiza presença e valores e exporta relatórios. Médico: registra somente os próprios atendimentos e altera sua senha.
Usuários cadastrados
| Nome | Perfil | Prestador | Estado | Ação | |
|---|---|---|---|---|---|
| {{u.name}} | {{u.email}} | {{roleLabel(u.role)}} | {{u.doctor_code||'—'}} | {{Number(u.enabled)?'Ativo':'Desativado'}} | |
| Nenhum usuário encontrado. | |||||
Sua conta
{{user?.name||'Demonstração'}} · {{user?.email||'Dados fictícios'}}
Critérios de apuração
Presença = intervalo digital completo registrado pelo médico; sem ele, intervalo estimado entre o primeiro e o último evento do SQL importado. As fontes são preservadas separadamente. Não há consulta direta ao MV.
Ausências = falta de registro em datas escaladas com cobertura confirmada. A consulta da manhã pode não representar todas as jornadas.
Repasse estimado = valor das horas OU dos plantões + acréscimos − descontos. As tarifas são gravadas por data da escala. A tolerância só afeta indicadores de atraso, não acrescenta tempo remunerável. Totais são somas dos valores diários arredondados em centavos. Não há retenção tributária ou pagamento automático. Dias sem tarifa ou sem intervalo permanecem pendentes; ausência estimada resulta em zero. Escalas e registros ainda abertos não são apurados financeiramente.
