a
AluguemaqSelecione o seu perfil para entrar
Gestão
Marcelo · Lucilene
Cada perfil agora pede senha — assim a Oficina não abre a tela da Gestão, por exemplo.
Senha incorreta. Tente de novo.
Escolher outro perfil
Você é —
?
Conversa interna
Mensagem direta entre perfis
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Aluguemaq — Sistema</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600;9..144,700&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.1.0/dist/tabler-icons.min.css">
<style>
:root{
--bg-app: #F5F2ED;
--bg-sidebar: #1A1A1A;
--bg-card: #FFFFFF;
--bg-soft: #EFEAE2;
--green-deep: #1A1A1A;
--green-mid: #E85A28;
--green-accent: #F1612A;
--terracotta: #E85A28;
--terracotta-soft: #FBE2D5;
--amber: #C98A2B;
--amber-soft: #F5E6C8;
--red: #B23A32;
--red-soft: #F4D9D6;
--blue: #2C5A8A;
--blue-soft: #DDE7F2;
--good: #2F5A3D;
--good-soft: #DCEADF;
--text-main: #211D1A;
--text-mute: #6E6760;
--text-faint: #A39B91;
--border: #E2DACD;
--radius-card: 14px;
--radius-pill: 999px;
--font-display: 'Fraunces', Georgia, serif;
--font-body: 'Inter', -apple-system, sans-serif;
--font-mono: 'IBM Plex Mono', monospace;
--brand-orange: #F1612A;
--brand-black: #1A1A1A;
}
* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
body { margin: 0; font-family: var(--font-body); background: var(--bg-app); color: var(--text-main); }
.profile-switcher {
position: sticky; top: 0; z-index: 50;
background: var(--green-deep); color: #E9E7DE;
display: flex; align-items: center; gap: 14px;
padding: 10px 20px;
border-bottom: 1px solid rgba(255,255,255,0.1);
}
.profile-switcher .brand-mark { width: 30px; height: 30px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; }
.profile-switcher .brand-mark img { width: 100%; height: auto; }
.profile-switcher .brand-label { font-family: var(--font-display); font-size: 14px; }
.global-saldo-pill { margin-left: auto; display: flex; align-items: center; gap: 7px; background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.18); padding: 6px 13px; border-radius: var(--radius-pill); font-size: 12.5px; color: #E9E7DE; cursor: pointer; }
.global-saldo-pill:hover { background: rgba(255,255,255,0.16); }
.global-saldo-pill i { font-size: 14px; }
.global-saldo-pill b { font-family: var(--font-mono); font-weight: 700; color: #fff; }
.profile-switcher select {
margin-left: auto; background: rgba(255,255,255,0.08); color: #fff;
border: 1px solid rgba(255,255,255,0.18); border-radius: 9px;
padding: 7px 12px; font-family: var(--font-body); font-size: 13px; cursor: pointer;
}
.profile-switcher select:focus { outline: 2px solid var(--green-accent); }
.profile-switcher option { color: #232722; }
.device-toggle { display: flex; gap: 4px; background: rgba(255,255,255,0.08); border-radius: 9px; padding: 3px; }
.device-toggle button { background: transparent; border: none; color: #CFD3C7; font-size: 11.5px; padding: 6px 11px; border-radius: 7px; cursor: pointer; display: flex; align-items: center; gap: 5px; font-family: var(--font-body); }
.device-toggle button.active { background: var(--green-mid); color: #fff; }
.device-toggle i { font-size: 14px; }
.shell { display: flex; min-height: calc(100vh - 47px); }
.shell.hidden { display: none; }
.sidebar { width: 240px; background: var(--bg-sidebar); color: #E9E7DE; padding: 20px 16px; display: flex; flex-direction: column; flex-shrink: 0; }
.sidebar-head { padding: 0 8px 16px; margin-bottom: 6px; border-bottom: 1px solid rgba(255,255,255,0.1); }
.sidebar-head .who { font-family: var(--font-display); font-size: 15px; line-height: 1.25; }
.sidebar-head .what { font-size: 11px; color: #9CA89E; margin-top: 1px; }
.nav-group-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: #7E8A7F; padding: 13px 12px 6px; display: flex; align-items: center; gap: 7px; }
.owner-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
.owner-dot.marcelo { background: var(--amber); }
.owner-dot.lucilene { background: var(--blue); }
.nav-group-label:first-of-type { padding-top: 4px; }
.nav-item { display: flex; align-items: center; gap: 11px; padding: 9px 12px; border-radius: 9px; font-size: 13.5px; color: #CFD3C7; cursor: pointer; border: none; background: transparent; width: 100%; text-align: left; font-family: var(--font-body); }
.nav-item i { font-size: 17px; flex-shrink: 0; }
.nav-item:hover { background: rgba(255,255,255,0.06); color: #fff; }
.nav-item.active { background: var(--green-mid); color: #fff; }
.nav-badge { margin-left: auto; background: var(--terracotta); color: #fff; font-size: 10.5px; padding: 1px 7px; border-radius: var(--radius-pill); }
.nav-more-toggle { display: flex; align-items: center; gap: 9px; padding: 9px 12px; margin-top: 6px; border-radius: 9px; font-size: 12.5px; color: #9CA89E; cursor: pointer; border: 1px dashed rgba(255,255,255,0.18); background: transparent; width: 100%; text-align: left; font-family: var(--font-body); }
.nav-more-toggle:hover { color: #fff; border-color: rgba(255,255,255,0.32); }
.nav-more-toggle.expanded i { transform: rotate(90deg); }
.nav-more-toggle i { transition: transform .15s; }
.nav-more-group { display: none; }
.nav-more-group.expanded { display: block; }
.sidebar-footer { margin-top: auto; padding: 12px; display: flex; align-items: center; gap: 10px; border-top: 1px solid rgba(255,255,255,0.1); padding-top: 16px; }
.avatar-mini { width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 600; flex-shrink: 0; }
.avatar-mini.amber { background: var(--amber); color: #3A2A0A; }
.avatar-mini.blue { background: var(--blue-soft); color: var(--blue); }
.sidebar-footer .name { font-size: 13px; color: #fff; }
.sidebar-footer .role { font-size: 11px; color: #9CA89E; }
.main { flex: 1; padding: 26px 36px 48px; max-width: 1140px; }
.topbar { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 22px; }
.page-title { font-family: var(--font-display); font-size: 24px; margin: 0 0 4px; }
.page-sub { font-size: 13.5px; color: var(--text-mute); margin: 0; }
.today-pill { font-size: 12px; color: var(--text-mute); background: var(--bg-card); border: 1px solid var(--border); padding: 7px 14px; border-radius: var(--radius-pill); white-space: nowrap; }
.owner-tag { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; padding: 4px 11px; border-radius: var(--radius-pill); margin-bottom: 8px; font-weight: 600; }
.owner-tag.marcelo { background: var(--amber-soft); color: #7A5410; }
.owner-tag.lucilene { background: var(--blue-soft); color: var(--blue); }
.owner-tag .d { width: 6px; height: 6px; border-radius: 50%; }
.owner-tag.marcelo .d { background: var(--amber); }
.owner-tag.lucilene .d { background: var(--blue); }
.page-view { display: none; }
.page-view.active { display: block; }
.section-label { font-size: 12px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-faint); margin: 22px 0 9px; }
.section-pair-label { display: flex; align-items: center; gap: 7px; font-size: 13px; font-weight: 700; color: var(--text-main); margin: 18px 0 10px; }
.section-pair-label:first-of-type { margin-top: 0; }
.section-pair-label i { font-size: 16px; color: var(--green-mid); }
.check-shortcut { display: flex; align-items: flex-start; gap: 10px; background: var(--bg-soft); border-radius: 9px; padding: 11px 13px; font-size: 13px; cursor: pointer; }
.check-shortcut input { width: 17px; height: 17px; accent-color: var(--green-mid); flex-shrink: 0; margin-top: 1px; }
.check-shortcut b { display: block; font-size: 13px; }
.check-shortcut span { display: block; font-size: 11.5px; color: var(--text-mute); margin-top: 1px; }
.check-shortcut.checked { background: #DCEADF; }
.task-done-row { display: flex; align-items: center; gap: 14px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 13px 16px; margin-bottom: 8px; opacity: 0.7; }
.task-done-row .os-name { text-decoration: line-through; color: var(--text-mute); }
.task-done-row .os-sub { color: var(--text-faint); }
.done-badge { font-size: 11.5px; font-weight: 700; padding: 5px 12px; border-radius: var(--radius-pill); background: #DCEADF; color: var(--green-mid); white-space: nowrap; }
.section-label:first-of-type { margin-top: 0; }
.stat-row, .clickable-stat-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 20px; }
.stat-row.three { grid-template-columns: repeat(3, 1fr); }
.stat-card, .clickable-stat { border-radius: var(--radius-card); padding: 15px; background: var(--bg-card); border: 1px solid var(--border); text-align: left; }
.clickable-stat { cursor: pointer; }
.clickable-stat:hover { border-color: var(--green-accent); }
.stat-card.warn, .clickable-stat.warn { background: var(--terracotta-soft); border-color: transparent; }
.stat-card.danger, .clickable-stat.danger { background: var(--red-soft); border-color: transparent; }
.stat-card.good, .clickable-stat.good { background: #DCEADF; border-color: transparent; }
.stat-card.info, .clickable-stat.info { background: var(--blue-soft); border-color: transparent; }
.stat-num, .clickable-stat .num { font-family: var(--font-display); font-size: 25px; margin: 0; }
.stat-card.warn .stat-num, .clickable-stat.warn .num { color: var(--terracotta); }
.stat-card.danger .stat-num, .clickable-stat.danger .num { color: var(--red); }
.stat-card.good .stat-num, .clickable-stat.good .num { color: var(--green-mid); }
.stat-card.info .stat-num, .clickable-stat.info .num { color: var(--blue); }
.stat-label, .clickable-stat .lbl { font-size: 12px; color: var(--text-mute); margin: 3px 0 0; display: flex; align-items: center; gap: 4px; }
.stat-card.warn .stat-label, .clickable-stat.warn .lbl { color: #8A3F25; }
.stat-card.danger .stat-label, .clickable-stat.danger .lbl { color: #7A2A24; }
.stat-card.good .stat-label, .clickable-stat.good .lbl { color: #2F5A3D; }
.stat-card.info .stat-label, .clickable-stat.info .lbl { color: #1F4368; }
.clickable-stat .lbl i { font-size: 13px; opacity: 0.6; }
.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 20px; }
.panel { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 16px 18px; }
.panel-title { font-size: 12.5px; color: var(--text-mute); margin: 0 0 12px; font-weight: 600; }
.panel-note { font-size: 11.5px; color: var(--text-faint); margin: 12px 0 0; line-height: 1.5; }
.chart-wrap { position: relative; }
.seg-control, .tab-row { display: flex; gap: 6px; margin-bottom: 16px; }
.seg-control { background: var(--bg-soft); border-radius: var(--radius-pill); padding: 3px; width: fit-content; }
.seg-opt { padding: 8px 16px; border-radius: var(--radius-pill); cursor: pointer; color: var(--text-mute); font-weight: 500; font-size: 13px; white-space: nowrap; }
.seg-opt.selected { background: var(--green-deep); color: #fff; }
.tab-row { border-bottom: 1px solid var(--border); }
.tab-btn { font-size: 13px; padding: 9px 14px; border: none; background: transparent; color: var(--text-mute); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; font-family: var(--font-body); }
.tab-btn.active { color: var(--green-mid); border-bottom-color: var(--green-mid); font-weight: 600; }
.bar-row { margin-bottom: 12px; }
.bar-head { display: flex; justify-content: space-between; font-size: 13px; margin-bottom: 5px; }
.bar-head .v { font-weight: 600; }
.bar-head .v.bad { color: var(--red); }
.bar-head .v.good { color: var(--green-mid); }
.bar-track { height: 7px; background: var(--bg-soft); border-radius: 4px; overflow: hidden; }
.bar-fill { height: 100%; border-radius: 4px; }
.bar-fill.terracotta { background: var(--terracotta); }
.bar-fill.green { background: var(--green-accent); }
.bar-fill.blue { background: var(--blue); }
.bar-fill.amber { background: var(--amber); }
.split-bar { display: flex; height: 26px; border-radius: 8px; overflow: hidden; margin-bottom: 10px; }
.legend-row { display: flex; gap: 16px; flex-wrap: wrap; font-size: 12px; }
.legend-item { display: flex; align-items: center; gap: 6px; }
.legend-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.os-list, .os-drill, .equip-status-list { display: flex; flex-direction: column; gap: 8px; }
.os-row, .os-mini { display: flex; align-items: center; gap: 14px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 13px 16px; cursor: pointer; }
.os-row:hover, .os-mini:hover, .os-drill-row:hover { border-color: var(--green-accent); }
.os-row.late, .os-mini.late, .os-drill-row.late, .equip-status-row.late { border-color: var(--red); }
.os-tag, .os-mini-tag, .equip-status-tag, .status-chip { font-size: 11px; font-weight: 600; padding: 3px 9px; border-radius: var(--radius-pill); white-space: nowrap; }
.os-tag.open, .equip-status-tag.sched, .status-chip.wait { background: var(--amber-soft); color: #7A5410; }
.os-tag.progress, .equip-status-tag.out, .status-chip.info { background: var(--blue-soft); color: var(--blue); }
.os-tag.wait, .status-chip.risk { background: var(--terracotta-soft); color: var(--terracotta); }
.os-tag.done, .status-chip.done { background: #DCEADF; color: var(--green-mid); }
.status-chip.risk { background: var(--red-soft); color: var(--red); }
.os-num, .os-mini-num, .os-drill-num { font-size: 12px; color: var(--text-faint); width: 50px; flex-shrink: 0; }
.os-name, .os-mini-name, .os-drill-name { font-size: 14px; font-weight: 600; margin: 0; }
.os-sub, .os-mini-sub, .os-drill-sub { font-size: 12px; color: var(--text-mute); margin: 1px 0 0; }
.os-right { margin-left: auto; text-align: right; }
.os-right .price { font-size: 14px; font-weight: 600; }
.os-right .margin { font-size: 11.5px; }
.os-right .margin.good { color: var(--green-mid); }
.os-right .margin.bad { color: var(--red); }
.os-right .comm { font-size: 11px; color: var(--text-faint); margin-top: 1px; }
.os-drill-row { display: flex; align-items: center; gap: 12px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 10px; padding: 10px 13px; cursor: pointer; }
.os-drill-comment { margin-left: auto; color: var(--text-faint); }
.equip-status-row { display: flex; align-items: center; gap: 12px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 10px; padding: 11px 14px; }
.mech-row { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
.mech-avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--blue-soft); color: var(--blue); display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 600; flex-shrink: 0; }
.mech-name { font-size: 13.5px; flex: 1; font-weight: 600; }
.mech-sub { font-size: 11.5px; color: var(--text-mute); margin: 1px 0 0; font-weight: 400; }
.mech-num { font-size: 13.5px; font-weight: 600; }
.mech-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 16px 18px; margin-bottom: 10px; }
.mech-head { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
.mech-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
.mech-stat { background: var(--bg-soft); border-radius: 9px; padding: 9px; text-align: center; }
.mech-stat .v { font-family: var(--font-display); font-size: 17px; margin: 0; }
.mech-stat .l { font-size: 10.5px; color: var(--text-mute); margin: 1px 0 0; }
.mech-stat.highlight { background: #DCEADF; }
.mech-stat.highlight .v { color: var(--green-mid); }
.few-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.few-table th { text-align: left; font-size: 10.5px; color: var(--text-faint); text-transform: uppercase; letter-spacing: 0.03em; padding: 0 8px 7px; font-weight: 600; border-bottom: 1px solid var(--border); }
.few-table th.num, .few-table td.num { text-align: right; font-family: var(--font-mono); }
.few-table td { padding: 9px 8px; border-bottom: 1px solid var(--border); }
.few-table tbody tr:hover { background: var(--bg-soft); cursor: pointer; }
.few-table .neg { color: var(--red); }
.few-table .pos { color: var(--green-mid); }
.comm-table .person-cell { display: flex; align-items: center; gap: 9px; font-weight: 600; }
.rule-tag { font-size: 10.5px; background: var(--bg-soft); padding: 2px 8px; border-radius: var(--radius-pill); color: var(--text-mute); }
.edit-btn { font-size: 11.5px; padding: 4px 10px; border-radius: 7px; border: 1px solid var(--border); background: #fff; cursor: pointer; color: var(--text-mute); }
.spark-cell { width: 70px; }
.spark-cell svg { display: block; }
.micro-bar-cell { width: 90px; }
.micro-bar-track { height: 5px; background: var(--bg-soft); border-radius: 3px; overflow: hidden; }
.micro-bar-fill { height: 100%; background: var(--text-faint); border-radius: 3px; }
.micro-bar-fill.over { background: var(--terracotta); }
.stock-row { display: flex; align-items: center; gap: 14px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 12px 16px; margin-bottom: 7px; cursor: pointer; }
.stock-row:hover { border-color: var(--green-accent); }
.stock-row.alert { border-color: var(--red); }
.stock-icon { width: 32px; height: 32px; border-radius: 50%; background: var(--bg-soft); color: var(--text-mute); display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: 15px; }
.stock-icon.alert { background: var(--red-soft); color: var(--red); }
.stock-name { font-size: 13.5px; font-weight: 600; margin: 0; }
.stock-sub { font-size: 11.5px; color: var(--text-mute); margin: 1px 0 0; }
.stock-right { margin-left: auto; text-align: right; }
.stock-right .v { font-size: 13px; font-weight: 600; }
.stock-right .l { font-size: 10.5px; color: var(--text-faint); }
.form-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 20px 22px; max-width: 480px; }
.form-label { font-size: 12px; color: var(--text-mute); display: block; margin-bottom: 5px; font-weight: 600; }
.form-row { margin-bottom: 13px; }
.form-row.two { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
input[type=text], input[type=number], input[type=date], select, textarea { width: 100%; padding: 9px 11px; border-radius: 8px; border: 1px solid var(--border); font-family: var(--font-body); font-size: 13.5px; background: #fff; color: var(--text-main); }
textarea { resize: vertical; min-height: 56px; }
input:focus, select:focus, textarea:focus { outline: 2px solid var(--green-accent); outline-offset: 1px; }
input:disabled { background: var(--bg-soft); color: var(--text-faint); cursor: not-allowed; }
.inline-search { display: flex; gap: 8px; }
.inline-search input { flex: 1; }
.search-bar { display: flex; gap: 8px; margin-bottom: 14px; position: relative; }
.search-bar input { flex: 1; }
.pay-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; }
.pay-opt { font-size: 12px; padding: 9px 4px; text-align: center; border-radius: 8px; border: 1px solid var(--border); background: #fff; cursor: pointer; color: var(--text-main); }
.pay-opt.selected, .toggle-opt.selected { background: var(--green-deep); border-color: var(--green-deep); color: #fff; }
.toggle-row { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.toggle-opt { font-size: 13px; padding: 10px; text-align: center; border-radius: 8px; border: 1px solid var(--border); background: #fff; cursor: pointer; color: var(--text-main); display: flex; align-items: center; justify-content: center; gap: 6px; }
.total-box { display: flex; justify-content: space-between; align-items: center; background: var(--bg-soft); border-radius: 9px; padding: 11px 14px; margin: 12px 0 18px; }
.total-box .lbl { font-size: 13px; color: var(--text-mute); }
.total-box .val { font-family: var(--font-display); font-size: 19px; }
.total-box .val.in { color: var(--green-mid); }
.confirm-box, .warn-box, .existing-comment { display: flex; gap: 10px; align-items: flex-start; border-radius: 9px; padding: 10px 12px; margin-bottom: 14px; }
.confirm-box { background: #DCEADF; }
.doc-check-row { display: grid; grid-template-columns: repeat(3,1fr); gap: 8px; margin-top: 6px; }
.doc-check-opt { display: flex; align-items: center; justify-content: center; gap: 7px; padding: 11px 8px; border-radius: 10px; border: 1px solid var(--border); background: #fff; font-size: 12.5px; font-weight: 600; color: var(--text-main); cursor: pointer; }
.doc-check-opt input { accent-color: var(--green-mid); }
.doc-check-opt:has(input:checked) { background: var(--good-soft); border-color: var(--good); color: #1F5C3C; }
.toast-msg { position: fixed; bottom: 28px; left: 50%; transform: translateX(-50%) translateY(20px); background: var(--green-deep); color: #fff; padding: 13px 22px; border-radius: var(--radius-pill); font-size: 13.5px; font-weight: 600; display: flex; align-items: center; gap: 8px; opacity: 0; pointer-events: none; transition: opacity .2s, transform .2s; z-index: 100; }
.toast-msg.show { opacity: 1; transform: translateX(-50%) translateY(0); }
.confirm-box i { color: var(--green-mid); font-size: 17px; margin-top: 1px; }
.confirm-box p { margin: 0; font-size: 12.5px; color: #2F5A3D; }
.confirm-box .b { font-weight: 600; display: block; margin-bottom: 1px; }
.warn-box { background: var(--terracotta-soft); }
.warn-box i { color: var(--terracotta); font-size: 17px; margin-top: 1px; }
.warn-box p { margin: 0; font-size: 12.5px; color: #8A3F25; }
.existing-comment { background: var(--bg-soft); font-size: 12.5px; }
.existing-comment i { font-size: 14px; color: var(--text-faint); margin-top: 1px; }
.existing-comment .meta { color: var(--text-faint); font-size: 11px; margin-top: 2px; }
.comment-box { background: var(--bg-soft); border-radius: 10px; padding: 10px 12px; margin-top: 14px; }
.comment-box textarea { width: 100%; border: none; background: transparent; font-family: var(--font-body); font-size: 13px; resize: vertical; min-height: 50px; padding: 0; }
.comment-target { display: flex; gap: 6px; margin-top: 8px; align-items: center; }
.comment-target .opt { font-size: 11.5px; padding: 5px 11px; border-radius: var(--radius-pill); border: 1px solid var(--border); background: #fff; cursor: pointer; color: var(--text-mute); }
.comment-target .opt.selected { background: var(--green-deep); border-color: var(--green-deep); color: #fff; }
.client-card, .receipt-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 20px 22px; max-width: 480px; }
.client-head { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
.avatar { width: 42px; height: 42px; border-radius: 50%; background: var(--blue-soft); color: var(--blue); display:flex; align-items:center; justify-content:center; font-weight:600; font-size:13px; flex-shrink:0; }
.client-name { font-size: 15px; font-weight: 600; margin: 0; }
.client-meta { font-size: 12px; color: var(--text-mute); margin: 1px 0 0; }
.mini-stats { display: grid; grid-template-columns: repeat(3,1fr); gap: 8px; margin-bottom: 14px; }
.mini-stats .c { background: var(--bg-soft); border-radius: 9px; padding: 10px; text-align: center; }
.mini-stats .c.flag { background: var(--terracotta-soft); }
.mini-stats .num { font-family: var(--font-display); font-size: 17px; margin: 0; }
.mini-stats .flag .num { color: var(--terracotta); }
.mini-stats .lbl { font-size: 10.5px; color: var(--text-mute); margin: 1px 0 0; }
.mini-stats .flag .lbl { color: #8A3F25; }
.history-row { display: flex; justify-content: space-between; font-size: 13px; padding: 8px 0; border-bottom: 1px solid var(--border); }
.history-row:last-child { border-bottom: none; }
.history-row span:last-child { color: var(--text-mute); }
.receipt-head { text-align: center; padding-bottom: 16px; margin-bottom: 16px; border-bottom: 1px dashed var(--border); }
.receipt-head .shop { font-family: var(--font-display); font-size: 17px; margin: 0; }
.receipt-head .doc { font-size: 11.5px; color: var(--text-faint); margin: 2px 0 0; text-transform: uppercase; letter-spacing: 0.04em; }
.receipt-line { display: flex; justify-content: space-between; font-size: 13px; padding: 6px 0; }
.receipt-line .l { color: var(--text-mute); }
.receipt-sign { margin-top: 18px; padding-top: 16px; border-top: 1px dashed var(--border); text-align: center; }
.receipt-sign .line { border-bottom: 1px solid var(--text-faint); height: 30px; margin-bottom: 6px; }
.receipt-sign .lbl { font-size: 11.5px; color: var(--text-faint); }
.ledger-row, .nf-row { display: flex; align-items: center; gap: 12px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 12px 16px; margin-bottom: 7px; }
.ledger-icon, .nf-icon { width: 34px; height: 34px; border-radius: 50%; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.ledger-icon.in { background: #DCEADF; color: var(--green-mid); }
.ledger-icon.out { background: var(--red-soft); color: var(--red); }
.nf-icon { background: var(--blue-soft); color: var(--blue); }
.ledger-name { font-size: 13.5px; font-weight: 600; margin: 0; }
.ledger-sub { font-size: 12px; color: var(--text-mute); margin: 1px 0 0; }
.ledger-val { margin-left: auto; font-size: 14px; font-weight: 600; white-space: nowrap; }
.ledger-val.in { color: var(--green-mid); }
.ledger-val.out { color: var(--red); }
.method-tag { font-size: 10.5px; padding: 2px 8px; border-radius: var(--radius-pill); background: var(--bg-soft); color: var(--text-mute); white-space: nowrap; }
.nf-tag { font-size: 10.5px; font-weight: 600; padding: 2px 8px; border-radius: var(--radius-pill); }
.nf-tag.issued { background: #DCEADF; color: var(--green-mid); }
.nf-tag.pending { background: var(--terracotta-soft); color: var(--terracotta); }
.agenda-day { display: flex; gap: 14px; margin-bottom: 4px; }
.agenda-date { width: 56px; flex-shrink: 0; text-align: center; padding-top: 4px; }
.agenda-date .dow { font-size: 11px; color: var(--text-faint); text-transform: uppercase; }
.agenda-date .dom { font-family: var(--font-display); font-size: 20px; margin: 1px 0; }
.agenda-items { flex: 1; padding-bottom: 18px; border-left: 1px solid var(--border); padding-left: 16px; margin-left: -1px; }
.agenda-item { display: flex; align-items: center; gap: 12px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 11px 14px; margin-bottom: 7px; }
.agenda-item-actions { display: flex; gap: 6px; }
.agenda-item-actions .btn.small { padding: 6px 10px; white-space: nowrap; }
.agenda-item.cancelled { opacity: 0.55; }
.agenda-item.cancelled .agenda-name, .agenda-item.cancelled .agenda-sub { text-decoration: line-through; }
.agenda-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
.agenda-dot.locacao { background: var(--green-accent); }
.agenda-dot.servico { background: var(--amber); }
.agenda-time { font-size: 12px; color: var(--text-faint); width: 42px; flex-shrink: 0; }
.agenda-name { font-size: 13.5px; font-weight: 600; margin: 0; }
.agenda-sub { font-size: 12px; color: var(--text-mute); margin: 1px 0 0; }
.stock-summary { display: grid; grid-template-columns: repeat(3,1fr); gap: 10px; margin-bottom: 18px; }
.stock-summary .card { border-radius: var(--radius-card); padding: 14px; text-align: center; }
.stock-summary .card.free { background: #DCEADF; }
.stock-summary .card.out { background: var(--blue-soft); }
.stock-summary .card.maint { background: var(--terracotta-soft); }
.stock-summary .num { font-family: var(--font-display); font-size: 24px; margin:0; }
.stock-summary .free .num { color: var(--green-mid); }
.stock-summary .out .num { color: var(--blue); }
.stock-summary .maint .num { color: var(--terracotta); }
.stock-summary .lbl { font-size: 12px; margin: 2px 0 0; color: var(--text-mute); }
.equip-row { display: flex; align-items: center; gap: 14px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 13px 16px; margin-bottom: 8px; }
.peca-cat .equip-row { cursor: pointer; transition: border-color .12s, background .12s; }
.peca-cat .equip-row:hover { border-color: var(--terracotta); }
.peca-cat .equip-row.selected-peca { border-color: var(--terracotta); background: var(--terracotta-soft); }
.equip-row.alert { border-color: var(--red); }
.equip-row i.lead { font-size: 20px; color: var(--text-mute); flex-shrink:0; }
.equip-name { font-size: 14px; font-weight: 600; margin: 0; }
.equip-meta { font-size: 12px; color: var(--text-mute); margin: 1px 0 0; }
.tag { font-size: 11.5px; padding: 3px 9px; border-radius: var(--radius-pill); font-weight: 600; }
.tag.free { background: #DCEADF; color: var(--green-mid); }
.tag.out { background: var(--blue-soft); color: var(--blue); }
.tag.maint { background: var(--terracotta-soft); color: var(--terracotta); }
.tag.late { background: var(--red-soft); color: var(--red); }
.tag-row { display: flex; gap: 6px; margin-left: auto; align-items: center; }
.tag-price-btn { width: 20px; height: 20px; border-radius: 50%; border: 1px solid var(--border); background: #fff; color: var(--text-mute); font-size: 13px; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; padding: 0; }
.tag-price-btn:hover { background: var(--bg-soft); color: var(--terracotta); border-color: var(--terracotta); }
.hist-tabs { display: flex; gap: 6px; margin-bottom: 18px; border-bottom: 1px solid var(--border); }
.hist-tab { font-size: 13px; padding: 9px 14px; border: none; background: transparent; color: var(--text-mute); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; font-family: var(--font-body); }
.hist-tab.active { color: var(--green-mid); border-bottom-color: var(--green-mid); font-weight: 600; }
.hist-result-note { font-size: 12.5px; color: var(--text-mute); margin: 0 0 14px; }
.hist-result-note strong { color: var(--text-main); }
.hist-month-label { font-size: 12px; color: var(--text-faint); text-transform: uppercase; letter-spacing: 0.04em; margin: 18px 0 8px; }
.hist-month-label:first-of-type { margin-top: 0; }
.hist-row { display: flex; align-items: center; gap: 13px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 12px 16px; margin-bottom: 7px; }
.hist-row-full { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 12px 16px; margin-bottom: 8px; }
.hist-row-top { display: flex; align-items: center; gap: 13px; }
.hist-row-actions { display: flex; gap: 8px; margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--border); margin-left: 47px; }
.attach-box { display: flex; align-items: center; gap: 10px; border: 1px dashed var(--border); border-radius: 9px; padding: 14px; cursor: pointer; font-size: 13px; color: var(--text-mute); background: var(--bg-soft); }
.attach-box:hover { border-color: var(--green-accent); }
.attach-box i { font-size: 18px; }
.attach-box.attached { border-color: var(--green-mid); border-style: solid; background: #DCEADF; color: #2F5A3D; }
.saida-cat-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
.saida-cat-opt { font-size: 12.5px; padding: 11px 10px; border-radius: 9px; border: 1px solid var(--border); background: #fff; cursor: pointer; text-align: center; }
.saida-cat-opt.selected { background: var(--green-deep); border-color: var(--green-deep); color: #fff; }
.saida-cat-opt#saida-outra-opt { border-style: dashed; color: var(--text-mute); }
.half-sheet-preview { transform: scale(1); }
.half-sheet-preview .receipt-card { padding: 14px 16px; font-size: 12px; }
.half-sheet-divider { display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--text-faint); text-transform: uppercase; letter-spacing: 0.04em; margin: 10px 0; justify-content: center; }
.half-sheet-divider::before, .half-sheet-divider::after { content: ''; flex: 1; border-top: 1px dashed var(--border); }
.status-banner-mini { display: flex; align-items: center; gap: 8px; border-radius: 8px; padding: 9px 12px; margin-bottom: 12px; font-size: 13px; font-weight: 600; }
.status-banner-mini.ok { background: #DCEADF; color: #2F5A3D; }
.status-banner-mini.bad { background: var(--red-soft); color: #7A2A24; }
.status-banner-mini.pending { background: var(--terracotta-soft); color: #8A3F25; }
.client-cat-label { display: flex; align-items: center; gap: 6px; font-size: 11.5px; font-weight: 700; color: var(--text-mute); margin: 14px 0 6px; text-transform: uppercase; letter-spacing: 0.03em; }
.client-cat-label:first-of-type { margin-top: 14px; }
.client-cat-label i { font-size: 13px; color: var(--green-mid); }
.half-sheet-doc { background: #fff; border: 1px solid #999; padding: 10mm 9mm; font-size: 8.5pt; color: #1a1a1a; }
.hsd-header { display: flex; align-items: center; gap: 10px; border-bottom: 2px solid var(--brand-orange, #F1612A); padding-bottom: 6px; margin-bottom: 8px; }
.hsd-logo img { height: 28px; }
.hsd-name { font-size: 11pt; font-weight: 700; margin: 0; color: var(--brand-orange, #F1612A); }
.hsd-num { font-size: 7.5pt; color: #666; margin: 1px 0 0; }
.hsd-company { font-size: 6.8pt; color: #777; margin-bottom: 8px; line-height: 1.4; }
.hsd-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 4px 12px; background: #F5F2ED; border-radius: 4px; padding: 7px 9px; margin-bottom: 8px; }
.hsd-grid .hsd-full { grid-column: 1 / -1; }
.hsd-lbl { font-size: 6.5pt; text-transform: uppercase; letter-spacing: 0.02em; color: #888; display: block; }
.hsd-val { font-size: 8.5pt; font-weight: 600; }
.hsd-problem { border: 1px solid #ddd; border-radius: 4px; padding: 7px 9px; margin-bottom: 8px; }
.hsd-problem p { font-size: 8pt; margin: 2px 0 0; color: #333; }
.hsd-foot-row { display: flex; justify-content: space-between; font-size: 7.5pt; color: #555; margin-bottom: 14px; }
.hsd-sign { text-align: center; margin-top: 6mm; }
.hsd-sign-line { border-top: 1px solid #333; width: 70%; margin: 0 auto 4px; }
.hsd-sign p { font-size: 7.5pt; color: #666; margin: 0; }
.hsd-sign-row { display: flex; gap: 14px; margin-top: 6mm; }
.hsd-sign-row .hsd-sign { flex: 1; margin-top: 0; }
.hsd-sign-row .hsd-sign-line { width: 90%; }
.hsd-status-mini { background: var(--amber-soft); color: #7A5410; font-size: 8pt; font-weight: 600; padding: 5px 9px; border-radius: 4px; margin-bottom: 8px; text-align: center; }
.hist-icon { width: 34px; height: 34px; border-radius: 50%; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.hist-icon.locacao { background: #DCEADF; color: var(--green-mid); }
.hist-icon.servico { background: var(--amber-soft); color: #7A5410; }
.hist-icon.peca { background: var(--blue-soft); color: var(--blue); }
.hist-name { font-size: 13.5px; font-weight: 600; margin: 0; }
.hist-sub { font-size: 12px; color: var(--text-mute); margin: 1px 0 0; }
.hist-date { font-size: 12px; color: var(--text-faint); width: 64px; flex-shrink: 0; text-align: right; }
.hist-val { margin-left: auto; font-size: 13.5px; font-weight: 600; white-space: nowrap; }
.hist-status { font-size: 10.5px; font-weight: 600; padding: 2px 8px; border-radius: var(--radius-pill); white-space: nowrap; }
.hist-status.ok { background: #DCEADF; color: var(--green-mid); }
.hist-status.late { background: var(--red-soft); color: var(--red); }
.chat-toggle { display: flex; gap: 8px; margin-bottom: 16px; }
.chat-toggle .opt { flex: 1; padding: 10px; text-align: center; border-radius: 9px; border: 1px solid var(--border); background: #fff; cursor: pointer; font-size: 13px; display: flex; align-items: center; justify-content: center; gap: 7px; }
.chat-toggle .opt.selected { background: var(--green-deep); border-color: var(--green-deep); color: #fff; }
.chat-window { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 18px 20px; max-width: 540px; min-height: 280px; display: flex; flex-direction: column; }
.chat-msgs { flex: 1; display: flex; flex-direction: column; gap: 10px; margin-bottom: 14px; }
.msg { max-width: 78%; padding: 9px 13px; border-radius: 12px; font-size: 13.5px; line-height: 1.45; }
.msg.me { background: var(--green-deep); color: #fff; align-self: flex-end; border-bottom-right-radius: 4px; }
.msg.them { background: var(--bg-soft); align-self: flex-start; border-bottom-left-radius: 4px; }
.msg.system { background: var(--blue-soft); color: #1F4368; align-self: flex-start; border-bottom-left-radius: 4px; }
.msg-meta { font-size: 10.5px; color: var(--text-faint); margin-top: 3px; }
.chat-input { display: flex; gap: 8px; }
.chat-input input { flex: 1; }
.modal-overlay { display: none; min-height: 100vh; background: rgba(35,39,34,0.45); position: absolute; top: 0; left: 0; right: 0; align-items: flex-start; justify-content: center; padding: 60px 20px; z-index: 10; }
.modal-overlay.open { display: flex; }
.modal-box { background: var(--bg-card); border-radius: var(--radius-card); padding: 22px 24px; max-width: 460px; width: 100%; max-height: 80vh; overflow-y: auto; }
.modal-head { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 14px; }
.modal-close { cursor: pointer; color: var(--text-mute); font-size: 18px; width: 30px; height: 30px; border-radius: 50%; background: var(--bg-soft); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.modal-close:hover { background: var(--red-soft); color: var(--red); }
.modal-title { font-family: var(--font-display); font-size: 18px; margin: 0; }
.modal-sub { font-size: 12.5px; color: var(--text-mute); margin: 2px 0 0; }
.detail-row { display: flex; justify-content: space-between; font-size: 13px; padding: 8px 0; border-bottom: 1px solid var(--border); }
.detail-row:last-child { border-bottom: none; }
.detail-row .l { color: var(--text-mute); }
.detail-row .v.pos { color: var(--green-mid); font-weight: 600; }
.detail-row .v.neg { color: var(--red); font-weight: 600; }
.breakdown { background: var(--bg-soft); border-radius: 9px; padding: 12px 14px; margin: 14px 0; }
.breakdown-row { display: flex; justify-content: space-between; font-size: 13px; padding: 5px 0; }
.breakdown-row.total { border-top: 1px solid var(--border); margin-top: 4px; padding-top: 9px; font-weight: 600; }
.breakdown-row .neg { color: var(--red); }
.breakdown-row .pos { color: var(--green-mid); }
.margin-target-row { display: flex; align-items: center; gap: 10px; margin-bottom: 4px; }
.margin-target-row input[type=range] { flex: 1; }
.margin-target-val { font-family: var(--font-display); font-size: 16px; width: 46px; text-align: right; }
.suggested-price { background: #DCEADF; border-radius: 9px; padding: 12px 14px; margin: 14px 0; text-align: center; }
.suggested-price .lbl { font-size: 11.5px; color: #2F5A3D; }
.suggested-price .val { font-family: var(--font-display); font-size: 26px; color: var(--green-mid); margin: 2px 0 0; }
.cost-source { font-size: 11px; color: var(--text-faint); margin-top: 4px; }
.os-search-results { max-width: 480px; margin-top: 6px; margin-bottom: 0; display: flex; flex-direction: column; gap: 5px; }
.os-search-results.empty { display: none; }
.os-search-item { display: flex; align-items: center; gap: 10px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 9px; padding: 8px 12px; cursor: pointer; font-size: 12.5px; }
.os-search-item:hover { border-color: var(--green-accent); }
.os-search-item .num { color: var(--text-faint); width: 42px; flex-shrink: 0; }
.os-search-item .name { font-weight: 600; flex: 1; }
.os-search-item .tag { font-size: 10px; padding: 2px 7px; border-radius: var(--radius-pill); white-space: nowrap; }
.os-search-item .tag.open { background: var(--bg-soft); color: var(--text-mute); }
.os-search-item .tag.done { background: #DCEADF; color: var(--green-mid); }
.ref-card { display: flex; gap: 10px; align-items: flex-start; background: var(--blue-soft); border-radius: 9px; padding: 10px 12px; margin: 14px 0; max-width: 480px; }
.ref-card i { font-size: 16px; color: var(--blue); margin-top: 1px; }
.ref-card .ref-title { font-size: 12.5px; font-weight: 600; margin: 0; color: #1F4368; }
.ref-card .ref-sub { font-size: 12px; margin: 2px 0 0; color: #1F4368; }
.xml-future { display: flex; align-items: center; gap: 10px; background: var(--bg-soft); border-radius: 9px; padding: 10px 12px; margin-bottom: 16px; font-size: 12px; color: var(--text-mute); }
.xml-future i { font-size: 16px; color: var(--text-faint); }
.xml-future .soon { margin-left: auto; font-size: 10.5px; padding: 2px 8px; border-radius: var(--radius-pill); background: var(--amber-soft); color: #7A5410; font-weight: 600; }
.btn { font-family: var(--font-body); font-size: 13px; padding: 8px 16px; border-radius: 9px; border: 1px solid var(--border); background: var(--bg-card); color: var(--text-main); cursor: pointer; }
.btn:hover { background: var(--bg-soft); }
.btn.primary { background: var(--green-deep); border-color: var(--green-deep); color: #fff; font-weight: 600; }
.btn.primary:hover { background: var(--green-mid); }
.btn.full { width: 100%; display: flex; align-items: center; justify-content: center; gap: 8px; padding: 13px; font-size: 14px; margin-top: 4px; }
.alert-box { display: flex; gap: 12px; align-items: flex-start; border-radius: var(--radius-card); padding: 13px 15px; margin-bottom: 20px; }
.alert-box.warn { background: var(--terracotta-soft); }
.alert-box.danger { background: var(--red-soft); }
.alert-box i { font-size: 18px; color: var(--terracotta); flex-shrink: 0; margin-top: 1px; }
.alert-box.danger i { color: var(--red); }
.alert-box .t { font-weight: 600; font-size: 13.5px; margin: 0; color: #8A3F25; }
.alert-box.danger .t { color: #7A2A24; }
.alert-box .d { font-size: 12.5px; margin: 3px 0 0; color: #8A3F25; }
.alert-box.danger .d { color: #7A2A24; }
.phone-frame-wrap { display: flex; justify-content: center; padding: 24px; background: #DCD8CC; min-height: calc(100vh - 47px); }
.phone { width: 390px; min-height: 700px; background: var(--bg-app); border-radius: 36px; overflow: hidden; box-shadow: 0 0 0 10px #1a1a1a; position: relative; }
.phone-statusbar { height: 30px; display: flex; align-items: center; justify-content: space-between; padding: 0 22px; font-size: 12px; font-weight: 600; }
.phone-appbar { padding: 4px 18px 14px; display: flex; align-items: center; gap: 10px; }
.phone-appbar-title { font-family: var(--font-display); font-size: 19px; margin: 0; }
.phone-appbar-sub { font-size: 12px; color: var(--text-mute); margin: 1px 0 0; }
.phone-screen { padding: 4px 18px 40px; }
.phone-view { display: none; }
.phone-view.active { display: block; }
.phone .seg-control { overflow-x: auto; }
.phone .seg-opt { flex: 1; text-align: center; }
@media (max-width: 940px) {
.sidebar { width: 76px; padding: 20px 8px; }
.sidebar-head .who, .sidebar-head .what, .nav-item span, .sidebar-footer .name, .sidebar-footer .role, .nav-group-label { display: none; }
.nav-item { justify-content: center; padding: 12px 0; }
.nav-badge { display: none; }
.stat-row, .clickable-stat-row, .stat-row.three { grid-template-columns: repeat(2,1fr); }
.two-col { grid-template-columns: 1fr; }
.mech-stats { grid-template-columns: repeat(2,1fr); }
.main { padding: 22px 16px 40px; }
}
</style>
</head>
<body>
<div class="profile-switcher">
<div class="brand-mark"><img src="data:image/png;base64,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" alt="Aluguemaq"></div>
<span class="brand-label">Aluguemaq — Recepção</span>
<span id="global-saldo-caixa-pill" class="global-saldo-pill" onclick="showPV('meire','m-caixa', document.querySelector('[data-view=m-caixa]'))" title="Ver Caixa"><i class="ti ti-cash-register"></i> Saldo em caixa agora <b>R$ 1.840</b></span>
</div>
<div class="shell" id="shell-meire">
<aside class="sidebar">
<div class="sidebar-head">
<div class="who">Aluguemaq</div>
<div class="what">painel da recepção</div>
</div>
<div class="nav-group-label">Hoje</div>
<button class="nav-item active" data-view="m-painel" onclick="showPV('meire','m-painel', this)">
<i class="ti ti-layout-grid"></i><span>Painel do dia</span><span class="nav-badge">6</span>
</button>
<div class="nav-group-label">Atalhos do dia a dia</div>
<button class="nav-item" data-view="m-agenda" onclick="showPV('meire','m-agenda', this)">
<i class="ti ti-calendar-event"></i><span>Agenda</span>
</button>
<button class="nav-item" data-view="m-contrato" onclick="showPV('meire','m-contrato', this)">
<i class="ti ti-file-text"></i><span>Novo Contrato</span>
</button>
<button class="nav-item" data-view="m-ativos" onclick="showPV('meire','m-ativos', this)">
<i class="ti ti-file-check"></i><span>Contratos Ativos</span><span class="nav-badge">16</span>
</button>
<button class="nav-item" data-view="m-recebimento" onclick="showPV('meire','m-recebimento', this)">
<i class="ti ti-clipboard-check"></i><span>Manutenção</span>
</button>
<button class="nav-item" data-view="m-vendapecas" onclick="showPV('meire','m-vendapecas', this)">
<i class="ti ti-shopping-cart"></i><span>Venda Peças</span>
</button>
<button class="nav-item" data-view="m-caixa" onclick="showPV('meire','m-caixa', this)">
<i class="ti ti-cash-register"></i><span>Caixa</span>
</button>
<button class="nav-more-toggle" id="nav-more-toggle" onclick="toggleNavMore()">
<i class="ti ti-dots" id="nav-more-icon"></i><span id="nav-more-label">Mais opções</span>
</button>
<div class="nav-more-group" id="nav-more-group">
<div class="nav-group-label">Consulta</div>
<button class="nav-item" data-view="m-historico" onclick="showPV('meire','m-historico', this)">
<i class="ti ti-history"></i><span>Histórico</span>
</button>
<button class="nav-item" data-view="m-notas" onclick="showPV('meire','m-notas', this)">
<i class="ti ti-receipt-2"></i><span>Recibos e Notas</span>
</button>
<button class="nav-item" data-view="m-clientes" onclick="showPV('meire','m-clientes', this)">
<i class="ti ti-users"></i><span>Cliente</span>
</button>
</div>
<div class="sidebar-footer">
<div class="avatar-mini amber">M</div>
<div><div class="name">Meire</div><div class="role">Recepção</div></div>
</div>
</aside>
<main class="main">
<div id="meire-m-painel" class="page-view active">
<div class="topbar">
<div>
<h1 class="page-title">Bom dia, Meire</h1>
<p class="page-sub">Aqui está o que precisa da sua atenção agora</p>
</div>
<label class="today-pill" style="display:flex; align-items:center; gap:6px; cursor:pointer;" onclick="openPainelDatePicker()">
<i class="ti ti-calendar-event"></i>
<span id="painel-data-label">terça, 23 de junho</span>
<input type="date" id="painel-data-input" value="2026-06-23" max="2026-06-23" onchange="onPainelDataChange()" style="position:absolute; opacity:0; width:1px; height:1px;">
</label>
</div>
<div class="modal-overlay" id="modal-dia-info">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title" id="dia-info-titulo">Resumo do dia</p><p class="modal-sub">Locações, oficina e caixa desse dia</p></div>
<svg class="modal-close" onclick="closeModal('modal-dia-info')" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
</div>
<div class="mini-stats" id="dia-info-stats"></div>
<div id="dia-info-lista"></div>
</div>
</div>
<div class="section-pair-label">
<i class="ti ti-building-store"></i> Loja
</div>
<div class="clickable-stat-row" style="grid-template-columns: repeat(4, 1fr);">
<button class="clickable-stat warn" onclick="openPainelModal('agendadas')"><p class="num">2</p><p class="lbl">locações agendadas <i class="ti ti-chevron-right"></i></p></button>
<button class="clickable-stat danger" onclick="openPainelModal('vencidos')"><p class="num">3</p><p class="lbl">contratos vencidos <i class="ti ti-chevron-right"></i></p></button>
<button class="clickable-stat" onclick="openPainelModal('ativas')"><p class="num">11</p><p class="lbl">locações ativas <i class="ti ti-chevron-right"></i></p></button>
<button class="clickable-stat warn" onclick="openPainelModal('pendentepag')"><p class="num">2</p><p class="lbl">encerrados, pagto. pendente <i class="ti ti-chevron-right"></i></p></button>
</div>
<div class="section-pair-label">
<i class="ti ti-tool"></i> Oficina
</div>
<div class="clickable-stat-row" style="grid-template-columns: repeat(4, 1fr);">
<button class="clickable-stat warn" onclick="openPainelModal('orcamentos')"><p class="num">2</p><p class="lbl">orçamentos parados <i class="ti ti-chevron-right"></i></p></button>
<button class="clickable-stat good" onclick="openPainelModal('prontos')"><p class="num">4</p><p class="lbl">prontos p/ entrega <i class="ti ti-chevron-right"></i></p></button>
<button class="clickable-stat" onclick="openPainelModal('manaberto')"><p class="num">11</p><p class="lbl">man. em aberto <i class="ti ti-chevron-right"></i></p></button>
<button class="clickable-stat warn" onclick="openPainelModal('recusadapronta')"><p class="num">1</p><p class="lbl">recusada, pronta p/ retirada <i class="ti ti-chevron-right"></i></p></button>
</div>
<div id="prontas-retirada-box" style="margin-top:14px;"></div>
<div class="modal-overlay" id="modal-painel-card">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title" id="painel-modal-title">—</p><p class="modal-sub" id="painel-modal-sub">—</p></div>
<svg class="modal-close" onclick="closeModal('modal-painel-card')" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
</div>
<div class="os-drill" id="painel-modal-list"></div>
</div>
</div>
<p class="section-label">SUAS TAREFAS DE HOJE</p>
<p class="panel-note" style="margin:-4px 0 10px;">Junta automaticamente o que está na Agenda de hoje, contratos que vencem hoje e manutenções da Oficina com data de hoje.</p>
<div id="tasks-pending"></div>
<div id="tasks-done-wrap" style="display:none;">
<p class="section-label" style="margin-top:22px;">Concluídas hoje</p>
<div id="tasks-done"></div>
</div>
<div style="display:grid; grid-template-columns: repeat(7,1fr); gap:10px; margin-top:24px; padding-top:20px; border-top:1px solid var(--border);">
<div class="stock-icon" style="width:auto; height:auto; flex-direction:column; gap:6px; padding:13px 4px; border-radius:14px; border:1px solid var(--border); background:#fff; cursor:pointer; font-size:11.5px; color:var(--text-main);" onclick="showPV('meire','m-contrato', document.querySelector('[data-view=m-contrato]'))"><i class="ti ti-file-plus" style="font-size:19px; color:var(--green-mid);"></i>Novo Contrato</div>
<div class="stock-icon" style="width:auto; height:auto; flex-direction:column; gap:6px; padding:13px 4px; border-radius:14px; border:1px solid var(--border); background:#fff; cursor:pointer; font-size:11.5px; color:var(--text-main);" onclick="showPV('meire','m-ativos', document.querySelector('[data-view=m-ativos]'))"><i class="ti ti-truck-return" style="font-size:19px; color:var(--green-mid);"></i>Devolução Equipamento</div>
<div class="stock-icon" style="width:auto; height:auto; flex-direction:column; gap:6px; padding:13px 4px; border-radius:14px; border:1px solid var(--border); background:#fff; cursor:pointer; font-size:11.5px; color:var(--text-main);" onclick="showPV('meire','m-ativos', document.querySelector('[data-view=m-ativos]'))"><i class="ti ti-file-check" style="font-size:19px; color:var(--green-mid);"></i>Contratos Ativos</div>
<div class="stock-icon" style="width:auto; height:auto; flex-direction:column; gap:6px; padding:13px 4px; border-radius:14px; border:1px solid var(--border); background:#fff; cursor:pointer; font-size:11.5px; color:var(--text-main);" onclick="showPV('meire','m-recebimento', document.querySelector('[data-view=m-recebimento]'))"><i class="ti ti-clipboard-check" style="font-size:19px; color:var(--green-mid);"></i>Manutenção</div>
<div class="stock-icon" style="width:auto; height:auto; flex-direction:column; gap:6px; padding:13px 4px; border-radius:14px; border:1px solid var(--border); background:#fff; cursor:pointer; font-size:11.5px; color:var(--text-main);" onclick="showPV('meire','m-vendapecas', document.querySelector('[data-view=m-vendapecas]'))"><i class="ti ti-shopping-cart" style="font-size:19px; color:var(--green-mid);"></i>Venda Peças</div>
<div class="stock-icon" style="width:auto; height:auto; flex-direction:column; gap:6px; padding:13px 4px; border-radius:14px; border:1px solid var(--border); background:#fff; cursor:pointer; font-size:11.5px; color:var(--text-main);" onclick="showPV('meire','m-agenda', document.querySelector('[data-view=m-agenda]'))"><i class="ti ti-calendar-event" style="font-size:19px; color:var(--green-mid);"></i>Agenda</div>
<div class="stock-icon" style="width:auto; height:auto; flex-direction:column; gap:6px; padding:13px 4px; border-radius:14px; border:1px solid var(--border); background:#fff; cursor:pointer; font-size:11.5px; color:var(--text-main);" onclick="showPV('meire','m-caixa', document.querySelector('[data-view=m-caixa]'))"><i class="ti ti-cash-register" style="font-size:19px; color:var(--green-mid);"></i>Caixa</div>
</div>
</div>
<!-- Modal: concluir tarefa com observação -->
<div class="modal-overlay" id="modal-concluir">
<div class="modal-box">
<div class="modal-head">
<div>
<p class="modal-title">Concluir tarefa</p>
<p class="modal-sub" id="concluir-task-name">—</p>
</div>
<svg class="modal-close" onclick="closeModal('modal-concluir')" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
</div>
<p style="font-size:13px; color:var(--text-mute); margin:0 0 10px;">Deseja adicionar alguma observação?</p>
<textarea id="concluir-obs-text" placeholder="Escreva uma observação livre (opcional)..." style="margin-bottom:14px;"></textarea>
<div style="display:flex; flex-direction:column; gap:8px; margin-bottom:16px;">
<label class="check-shortcut">
<input type="checkbox" id="shortcut-agendar" onchange="toggleShortcut('agendar')">
<div style="flex:1;"><b>Agendar retirada/visita</b><span>Cria automaticamente um evento na Agenda</span></div>
</label>
<div id="agendar-fields" style="display:none; margin-left:28px; margin-top:-4px;">
<div class="form-row two">
<div><label class="form-label">Data</label><input type="date"></div>
<div><label class="form-label">Horário</label><input type="text" placeholder="ex: 14:00"></div>
</div>
</div>
<label class="check-shortcut">
<input type="checkbox" id="shortcut-naoautorizada" onchange="toggleShortcut('naoautorizada')">
<div style="flex:1;"><b>OS não autorizada</b><span>Mecânico vê recusa de orçamento — serviço não será realizado</span></div>
</label>
<label class="check-shortcut">
<input type="checkbox" id="shortcut-pago" onchange="toggleShortcut('pago')">
<div style="flex:1;"><b>Pagamento feito</b><span>Lança automático em "Recibos e Notas", pronto pra emitir, e em "Entrada e Saída" no Caixa</span></div>
</label>
</div>
<button class="btn primary full" onclick="confirmConcluir()"><i class="ti ti-check"></i> Concluir tarefa</button>
</div>
</div>
<div id="meire-m-historico" class="page-view">
<div class="topbar">
<div>
<h1 class="page-title">Histórico</h1>
<p class="page-sub">Busque por cliente, equipamento ou serviço — ou veja a lista completa</p>
</div>
</div>
<div class="search-bar">
<input type="text" id="hist-search-field" placeholder="Buscar por nome do cliente, equipamento ou serviço..." oninput="filterHistorico()">
<label class="btn" style="cursor:pointer; position:relative;" onclick="openHistDatePicker()">
<i class="ti ti-filter"></i> <span id="hist-filtro-data-label">Filtrar período</span>
<input type="date" id="hist-data-input" value="" onchange="onHistDataChange()" style="position:absolute; opacity:0; width:1px; height:1px; left:0; top:0;">
</label>
<button class="btn" id="hist-data-clear" style="display:none;" onclick="clearHistDataFilter()"><i class="ti ti-x"></i></button>
</div>
<div class="hist-tabs">
<button class="hist-tab active" data-tab="todos" onclick="setHistTab(this,'todos')">Tudo</button>
<button class="hist-tab" data-tab="locacao" onclick="setHistTab(this,'locacao')">Locações</button>
<button class="hist-tab" data-tab="servico" onclick="setHistTab(this,'servico')">Serviços de oficina</button>
<button class="hist-tab" data-tab="peca" onclick="setHistTab(this,'peca')">Venda de peças</button>
</div>
<p class="hist-result-note" id="hist-result-note">Mostrando <strong>7</strong> registros — do mais recente ao mais antigo</p>
<div id="hist-list-todos">
<p class="hist-month-label">Junho 2026</p>
<div class="hist-row-full" data-date="2026-06-23" data-type="locacao" data-client="carlos eduardo pires">
<div class="hist-row-top">
<div class="hist-icon locacao"><i class="ti ti-rotate-clockwise-2"></i></div>
<div style="flex:1;"><p class="hist-name">Loc. betoneira 400L — Carlos Eduardo Pires</p><p class="hist-sub">Contrato #1248 · PIX</p></div>
<span class="hist-status ok">paga</span><span class="hist-date">23 jun</span><span class="hist-val">R$ 290</span>
</div>
<div class="hist-row-actions">
<button class="btn small" onclick="openVerContrato('Contrato #1248', 'Carlos Eduardo Pires', true)"><i class="ti ti-file-text"></i> Ver Contrato</button>
<button class="btn small" onclick="openVerNota('e-Fatura 1.482', 'Carlos Eduardo Pires', true, '23/06/2026')"><i class="ti ti-receipt-2"></i> Ver Nota</button>
</div>
</div>
<div class="hist-row-full" data-date="2026-06-23" data-type="servico" data-client="cond. reserva real">
<div class="hist-row-top">
<div class="hist-icon servico"><i class="ti ti-tool"></i></div>
<div style="flex:1;"><p class="hist-name">Man. bomba submersível — Cond. Reserva Real</p><p class="hist-sub">OS #243 · José</p></div>
<span class="hist-status ok">paga</span><span class="hist-date">23 jun</span><span class="hist-val">R$ 680</span>
</div>
<div class="hist-row-actions">
<button class="btn small" onclick="openVerContrato('OS #243', 'Cond. Reserva Real', true)"><i class="ti ti-file-text"></i> Ver Contrato</button>
<button class="btn small" onclick="openVerNota('e-Fatura 1.481', 'Cond. Reserva Real', true, '23/06/2026')"><i class="ti ti-receipt-2"></i> Ver Nota</button>
</div>
</div>
<div class="hist-row-full" data-date="2026-06-23" data-type="peca" data-client="balcão">
<div class="hist-row-top">
<div class="hist-icon peca"><i class="ti ti-circle-dot"></i></div>
<div style="flex:1;"><p class="hist-name">Venda balcão — rolamento</p><p class="hist-sub">Cartão</p></div>
<span class="hist-status ok">paga</span><span class="hist-date">23 jun</span><span class="hist-val">R$ 95</span>
</div>
<div class="hist-row-actions">
<button class="btn small" onclick="openVerNota('Recibo balcão', 'Venda de rolamento', false, '—')"><i class="ti ti-receipt-2"></i> Ver Nota</button>
</div>
</div>
<div class="hist-row-full" data-date="2025-12-29" data-type="locacao" data-client="wederson candido de oliveira">
<div class="hist-row-top">
<div class="hist-icon locacao"><i class="ti ti-tools"></i></div>
<div style="flex:1;"><p class="hist-name">Loc. betoneira + martelo 15kg — Wederson Candido</p><p class="hist-sub">Contrato #1239 · dinheiro</p></div>
<span class="hist-status ok">paga</span><span class="hist-date">29 dez</span><span class="hist-val">R$ 435</span>
</div>
<div class="hist-row-actions">
<button class="btn small" onclick="openVerContrato('Contrato #1239', 'Wederson Candido', true)"><i class="ti ti-file-text"></i> Ver Contrato</button>
<button class="btn small" onclick="openVerNota('Recibo #1239', 'Wederson Candido', true, '29/12/2025')"><i class="ti ti-receipt-2"></i> Ver Nota</button>
</div>
</div>
<div class="hist-row-full" data-date="2026-06-18" data-type="locacao" data-client="andaime torre">
<div class="hist-row-top">
<div class="hist-icon locacao"><i class="ti ti-stairs"></i></div>
<div style="flex:1;"><p class="hist-name">Loc. andaime torre 1x1 — Diogo Silva de Oliveira</p><p class="hist-sub">Contrato #1231 · PIX</p></div>
<span class="hist-status late">devolvida com atraso</span><span class="hist-date">18 jun</span><span class="hist-val">R$ 175</span>
</div>
<div class="hist-row-actions">
<button class="btn small" onclick="openVerContrato('Contrato #1231', 'Diogo Silva de Oliveira', false)"><i class="ti ti-file-text"></i> Ver Contrato</button>
<button class="btn small" onclick="openVerNota('e-Fatura 1.401', 'Diogo Silva de Oliveira', true, '18/06/2026')"><i class="ti ti-receipt-2"></i> Ver Nota</button>
</div>
</div>
<p class="hist-month-label">Maio 2026</p>
<div class="hist-row-full" data-date="2026-05-14" data-type="servico" data-client="fazenda dom bosco">
<div class="hist-row-top">
<div class="hist-icon servico"><i class="ti ti-tool"></i></div>
<div style="flex:1;"><p class="hist-name">Serviços diversos — Fazenda Dom Bosco</p><p class="hist-sub">OS #198 · Carlos</p></div>
<span class="hist-status ok">paga</span><span class="hist-date">14 mai</span><span class="hist-val">R$ 1.850</span>
</div>
<div class="hist-row-actions">
<button class="btn small" onclick="openVerContrato('OS #198', 'Fazenda Dom Bosco', true)"><i class="ti ti-file-text"></i> Ver Contrato</button>
<button class="btn small" onclick="openVerNota('e-Fatura 1.310', 'Fazenda Dom Bosco', true, '14/05/2026')"><i class="ti ti-receipt-2"></i> Ver Nota</button>
</div>
</div>
<div class="hist-row-full" data-date="2026-04-28" data-type="peca" data-client="balcão">
<div class="hist-row-top">
<div class="hist-icon peca"><i class="ti ti-bolt"></i></div>
<div style="flex:1;"><p class="hist-name">Venda balcão — capacitor</p><p class="hist-sub">Dinheiro</p></div>
<span class="hist-status ok">paga</span><span class="hist-date">28 abr</span><span class="hist-val">R$ 60</span>
</div>
<div class="hist-row-actions">
<button class="btn small" onclick="openVerNota('Recibo balcão', 'Venda de capacitor', true, '28/04/2026')"><i class="ti ti-receipt-2"></i> Ver Nota</button>
</div>
</div>
</div>
<div class="modal-overlay" id="modal-ver-contrato">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title" id="vc-titulo">Contrato</p><p class="modal-sub" id="vc-cliente">—</p></div>
<svg class="modal-close" onclick="closeModal('modal-ver-contrato')" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
</div>
<div class="status-banner-mini" id="vc-status-banner">—</div>
<button class="btn primary full" style="margin-top:14px;" onclick="emitirContrato()"><i class="ti ti-printer"></i> Emitir Contrato</button>
</div>
</div>
<div class="modal-overlay" id="modal-ver-nota">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title" id="vn-titulo">Nota</p><p class="modal-sub" id="vn-cliente">—</p></div>
<svg class="modal-close" onclick="closeModal('modal-ver-nota')" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
</div>
<div class="status-banner-mini" id="vn-status-banner">—</div>
<div class="detail-row"><span class="l">Data de emissão</span><span id="vn-data">—</span></div>
<button class="btn primary full" style="margin-top:14px;" onclick="emitirNota()"><i class="ti ti-printer"></i> Emitir Nota</button>
</div>
</div>
<div id="hist-list-cliente" style="display:none;">
<div class="client-card" style="margin-bottom: 14px;">
<div class="client-head" style="margin-bottom: 16px;">
<div class="avatar">WC</div>
<div><p class="client-name">Wederson Candido de Oliveira</p><p class="client-meta">CPF verificado · cliente desde out/2025</p></div>
</div>
<div class="mini-stats">
<div class="c"><p class="num">9</p><p class="lbl">locações</p></div>
<div class="c"><p class="num">R$ 2.180</p><p class="lbl">total pago</p></div>
<div class="c flag"><p class="num">1</p><p class="lbl">atraso anterior</p></div>
</div>
<p class="client-cat-label"><i class="ti ti-building-store"></i> Loja — Locação</p>
<div class="history-row"><span>Betoneira + martelo 15kg — Contrato #1239</span><span>29 dez</span></div>
<div class="history-row"><span>Martelo 15kg — Contrato #1190</span><span>22 nov</span></div>
<div class="history-row"><span>Martelo 15kg — Contrato #1142</span><span>15 out</span></div>
<p class="client-cat-label"><i class="ti ti-tool"></i> Oficina — Manutenção</p>
<div class="history-row"><span>Sem OS de oficina registrada</span><span>—</span></div>
<p class="client-cat-label"><i class="ti ti-circle-dot"></i> Peças — Compra e Venda</p>
<div class="history-row"><span>Venda balcão — escova de carvão</span><span>10 nov</span></div>
</div>
<div class="client-card">
<div class="client-head" style="margin-bottom: 16px;">
<div class="avatar">CE</div>
<div><p class="client-name">Carlos Eduardo Pires</p><p class="client-meta">CPF verificado · cliente desde jun/2026</p></div>
</div>
<div class="mini-stats">
<div class="c"><p class="num">1</p><p class="lbl">locações</p></div>
<div class="c"><p class="num">R$ 290</p><p class="lbl">total pago</p></div>
<div class="c"><p class="num">0</p><p class="lbl">atrasos</p></div>
</div>
<p class="client-cat-label"><i class="ti ti-building-store"></i> Loja — Locação</p>
<div class="history-row"><span>Betoneira 400L — Contrato #1248</span><span>23 jun</span></div>
<p class="client-cat-label"><i class="ti ti-tool"></i> Oficina — Manutenção</p>
<div class="history-row"><span>Sem OS de oficina registrada</span><span>—</span></div>
<p class="client-cat-label"><i class="ti ti-circle-dot"></i> Peças — Compra e Venda</p>
<div class="history-row"><span>Sem compra de peças registrada</span><span>—</span></div>
</div>
</div>
<p style="font-size: 11.5px; color: var(--text-faint); margin: 16px 0 0; line-height: 1.5; text-align: center;">
Esse histórico se preenche sozinho — vem dos contratos, ordens de serviço e vendas que já passaram pelo sistema.
</p>
</div>
<div id="meire-m-caixa" class="page-view">
<div class="topbar">
<div>
<h1 class="page-title">Caixa — entrada e saída</h1>
<p class="page-sub" id="caixa-page-sub">Tudo que entrou e saiu hoje, com o método de pagamento</p>
</div>
<label class="today-pill" style="display:flex; align-items:center; gap:6px; cursor:pointer;" onclick="openCaixaDatePicker()">
<i class="ti ti-calendar-event"></i>
<span id="caixa-data-label">terça, 23 de junho</span>
<input type="date" id="caixa-data-input" value="2026-06-23" onchange="onCaixaDataChange()" style="position:absolute; opacity:0; width:1px; height:1px;">
</label>
</div>
<div style="display:grid; grid-template-columns: 1.3fr 1fr; gap:20px; align-items:start; margin-bottom:26px;">
<div class="form-card" style="margin-bottom:0;">
<div class="toggle-row" style="margin-bottom: 14px;">
<div class="toggle-opt selected" onclick="setCaixaMode(this,'entrada')"><i class="ti ti-arrow-down-circle"></i> Entrada</div>
<div class="toggle-opt" onclick="setCaixaMode(this,'saida')"><i class="ti ti-arrow-up-circle"></i> Saída</div>
</div>
<div id="caixa-entrada-fields">
<div class="form-row">
<label class="form-label">Origem do pagamento</label>
<div class="inline-search">
<input type="text" id="caixa-origem-busca" placeholder="Buscar contrato, OS ou venda — ou escreva uma descrição livre" oninput="filterCaixaOrigem()" onfocus="filterCaixaOrigem()">
</div>
<div class="os-search-results" id="caixa-origem-results"></div>
</div>
<div class="form-row two">
<div><label class="form-label">Descrição</label><input type="text" id="caixa-descricao" value="Loc. betoneira — Carlos Eduardo"></div>
<div><label class="form-label">Valor</label><input type="number" id="caixa-valor" value="290"></div>
</div>
</div>
<div id="caixa-saida-fields" style="display:none;">
<div class="form-row">
<label class="form-label">Categoria de saída</label>
<div class="saida-cat-grid">
<div class="saida-cat-opt" onclick="selectSaidaCat(this,'Combustível manutenção equip.')">Combustível manutenção equip.</div>
<div class="saida-cat-opt" onclick="selectSaidaCat(this,'Combustível Caminhonete')">Combustível Caminhonete</div>
<div class="saida-cat-opt" onclick="selectSaidaCat(this,'Combustível Caminhão')">Combustível Caminhão</div>
<div class="saida-cat-opt" onclick="selectSaidaCat(this,'Combustível Moto')">Combustível Moto</div>
<div class="saida-cat-opt" onclick="selectSaidaCat(this,'Pão - Padaria')">Pão - Padaria</div>
<div class="saida-cat-opt" onclick="selectSaidaCat(this,'Lanche Time')">Lanche Time</div>
<div class="saida-cat-opt" onclick="selectSaidaCat(this,'Água Galão')">Água Galão</div>
<div class="saida-cat-opt" id="saida-outra-opt" onclick="selectSaidaOutra(this)">+ Adicionar outra saída</div>
</div>
</div>
<div class="form-row two">
<div><label class="form-label">Descrição</label><input type="text" id="caixa-saida-descricao" placeholder="Selecione uma categoria acima" disabled></div>
<div><label class="form-label">Valor</label><input type="number" id="caixa-saida-valor" value=""></div>
</div>
</div>
<div class="form-row">
<label class="form-label">Forma de pagamento</label>
<div class="pay-grid" id="caixa-pay-grid" style="grid-template-columns: repeat(3,1fr);">
<div class="pay-opt selected" onclick="selectCaixaPay(this)">PIX</div><div class="pay-opt" onclick="selectCaixaPay(this)">Dinheiro</div><div class="pay-opt" onclick="selectCaixaPay(this)">Cartão</div>
</div>
</div>
<button class="btn primary full" onclick="lancarManualCaixa()"><i class="ti ti-check"></i> Lançar no caixa</button>
</div>
<div style="display:flex; flex-direction:column; gap:14px;">
<div style="background: var(--amber-soft); border: 1px solid rgba(0,0,0,0.06); box-shadow: 0 2px 8px rgba(0,0,0,0.05); border-radius: var(--radius-card); padding: 18px 22px;">
<div style="display:flex; align-items:center; justify-content:space-between;">
<div>
<p style="font-size:12.5px; color:#7A5410; margin:0 0 4px; font-weight:600; text-transform:uppercase; letter-spacing:0.03em;">Saldo em caixa agora <span style="text-transform:none; font-weight:500; opacity:0.8;">· Caixa Diário: R$ 50</span></p>
<p style="font-family:var(--font-display); font-weight:600; font-size:34px; color:#7A5410; margin:0;" id="caixa-saldo-valor">+ R$ 1.840</p>
</div>
<i class="ti ti-cash-register" style="font-size:36px; color:#7A5410; opacity:0.5;"></i>
</div>
<div id="caixa-saldo-warning" style="display:none; margin-top:12px; padding-top:12px; border-top:1px solid rgba(122,84,16,0.2); align-items:flex-start; gap:8px;">
<i class="ti ti-alert-triangle" style="color:var(--red); font-size:16px; margin-top:1px;" id="caixa-saldo-icon"></i>
<p style="font-size:12px; color:var(--red); margin:0; line-height:1.4;" id="caixa-saldo-msg">Diferença no caixa de <span id="caixa-saldo-diferenca"></span>, validar entradas e saídas</p>
</div>
</div>
<div style="background: var(--red-soft); border: 1px solid rgba(0,0,0,0.06); box-shadow: 0 2px 8px rgba(0,0,0,0.05); border-radius: var(--radius-card); padding: 16px 20px; display:flex; align-items:center; justify-content:space-between;">
<div>
<p style="font-size:12.5px; color:var(--red); margin:0 0 4px; font-weight:600; text-transform:uppercase; letter-spacing:0.03em;">Saídas hoje</p>
<p style="font-family:var(--font-display); font-weight:600; font-size:26px; color:var(--red); margin:0;" id="caixa-saidas-valor">− R$ 20</p>
</div>
<i class="ti ti-arrow-up-circle" style="font-size:30px; color:var(--red); opacity:0.5;"></i>
</div>
<div style="background: var(--good-soft); border: 1px solid rgba(0,0,0,0.06); box-shadow: 0 2px 8px rgba(0,0,0,0.05); border-radius: var(--radius-card); padding: 16px 20px; display:flex; align-items:center; justify-content:space-between;">
<div>
<p style="font-size:12.5px; color:#1F5C3C; margin:0 0 4px; font-weight:600; text-transform:uppercase; letter-spacing:0.03em;">Entradas hoje</p>
<p style="font-family:var(--font-display); font-weight:600; font-size:26px; color:#1F5C3C; margin:0;" id="caixa-entradas-valor">+ R$ 1.065</p>
</div>
<i class="ti ti-arrow-down-circle" style="font-size:30px; color:#1F5C3C; opacity:0.5;"></i>
</div>
</div>
</div>
<p class="section-label" id="caixa-ledger-label">Lançamentos de hoje</p>
<div id="caixa-ledger-list">
<div class="ledger-row">
<div class="ledger-icon in"><i class="ti ti-arrow-down-left"></i></div>
<div style="flex:1;"><p class="ledger-name">Loc. betoneira — Carlos Eduardo</p><p class="ledger-sub">09:40</p></div>
<span class="method-tag">PIX</span><span class="ledger-val in">+ R$ 290</span>
</div>
<div class="ledger-row">
<div class="ledger-icon in"><i class="ti ti-arrow-down-left"></i></div>
<div style="flex:1;"><p class="ledger-name">Man. bomba submersível — Cond. Reserva Real</p><p class="ledger-sub">10:15</p></div>
<span class="method-tag">PIX</span><span class="ledger-val in">+ R$ 680</span>
</div>
<div class="ledger-row">
<div class="ledger-icon out"><i class="ti ti-arrow-up-right"></i></div>
<div style="flex:1;"><p class="ledger-name">Combustível manutenção equip.</p><p class="ledger-sub">11:02</p></div>
<span class="method-tag">Dinheiro</span><span class="ledger-val out">− R$ 20</span>
</div>
<div class="ledger-row">
<div class="ledger-icon in"><i class="ti ti-arrow-down-left"></i></div>
<div style="flex:1;"><p class="ledger-name">Venda peça — rolamento (via oficina)</p><p class="ledger-sub">11:30 · lançado automático</p></div>
<span class="method-tag">Cartão</span><span class="ledger-val in">+ R$ 95</span>
</div>
</div>
</div>
<div id="meire-m-notas" class="page-view">
<div class="topbar">
<div>
<h1 class="page-title">Recibos e Notas</h1>
<p class="page-sub">Selecione a origem e emita o documento certo — recibo e e-Fatura são independentes</p>
</div>
</div>
<div class="form-card" style="margin-bottom: 26px;">
<div class="form-row">
<label class="form-label">Selecionar serviço, contrato ou venda</label>
<div class="inline-search">
<input type="text" id="recibo-origem-busca" placeholder="Digite o nome do cliente ou número do contrato/OS" oninput="filterReciboOrigem()" onfocus="filterReciboOrigem()" value="Contrato #1248 — Carlos Eduardo Pires — R$ 290">
</div>
<div class="os-search-results" id="recibo-origem-results"></div>
</div>
<div class="confirm-box">
<i class="ti ti-shield-check"></i>
<p><span class="b">Dados conferem com o cadastro do cliente</span>CPF, nome e endereço prontos pra emissão</p>
</div>
<div class="form-row" style="margin-top:14px;">
<label class="form-label">Esse cliente precisa de quais documentos?</label>
<div class="doc-check-row">
<label class="doc-check-opt"><input type="checkbox" checked><i class="ti ti-clipboard-text"></i> Recibo</label>
<label class="doc-check-opt"><input type="checkbox" checked><i class="ti ti-receipt-2"></i> e-Fatura</label>
<label class="doc-check-opt"><input type="checkbox"><i class="ti ti-file-invoice"></i> NF-e</label>
</div>
</div>
<button class="btn primary full" style="margin-top:14px;" onclick="emitirDocsSelecionados()"><i class="ti ti-send-2"></i> Emitir documentos selecionados</button>
<p class="panel-note" style="text-align:center;">Cada cliente pode precisar de um, dois ou os três — marque só os que esse precisa.</p>
</div>
<div class="topbar" style="margin-bottom:10px;">
<p class="section-label" style="margin:0;">Notas recentes</p>
<div class="inline-search" style="max-width:260px;">
<input type="text" id="recibo-recentes-busca" placeholder="Pesquisar por nome..." oninput="filterRecibosRecentes()">
<button class="btn"><i class="ti ti-search"></i></button>
</div>
</div>
<div id="recibos-recentes-list">
<div class="nf-row" data-name="carlos eduardo pires">
<div class="nf-icon"><i class="ti ti-file-invoice"></i></div>
<div style="flex:1;"><p class="ledger-name">e-Fatura 1.482 — Carlos Eduardo Pires</p><p class="ledger-sub">Emitida hoje às 09:42 · R$ 290</p></div>
<span class="nf-tag issued">emitida</span>
</div>
<div class="nf-row" data-name="cond. reserva real">
<div class="nf-icon"><i class="ti ti-file-invoice"></i></div>
<div style="flex:1;"><p class="ledger-name">e-Fatura 1.481 — Cond. Reserva Real</p><p class="ledger-sub">Emitida hoje às 10:18 · R$ 680</p></div>
<span class="nf-tag issued">emitida</span>
</div>
<div class="nf-row" data-name="balcão rolamento">
<div class="nf-icon"><i class="ti ti-file-invoice"></i></div>
<div style="flex:1;"><p class="ledger-name">Venda balcão — rolamento</p><p class="ledger-sub">Aguardando emissão · R$ 95</p></div>
<span class="nf-tag pending">pendente</span>
</div>
</div>
</div>
<div id="meire-m-agenda" class="page-view">
<div class="topbar">
<div>
<h1 class="page-title">Agenda</h1>
<p class="page-sub">Reservas de locação e serviços marcados pra frente</p>
</div>
<button class="btn primary" style="display:flex; align-items:center; gap:6px;" onclick="abrirNovoAgendamento()"><i class="ti ti-plus"></i> Novo agendamento</button>
</div>
<div id="agenda-list">
<div class="agenda-day" data-date="2026-06-24">
<div class="agenda-date"><div class="dow">qua</div><div class="dom">24</div></div>
<div class="agenda-items">
<div class="agenda-item" data-tipo="locacao" data-cliente="Diogo Silva de Oliveira" data-equip="Retirada — andaime torre (2 un.)" data-data="2026-06-24" data-horario="08:00" data-obs="">
<span class="agenda-dot locacao"></span><span class="agenda-time">08:00</span>
<div style="flex:1;"><p class="agenda-name">Retirada — andaime torre (2 un.)</p><p class="agenda-sub">Cliente: Diogo Silva de Oliveira</p></div>
<div class="agenda-item-actions">
<button class="btn small" onclick="editarAgendamento(this.closest('.agenda-item'))">Editar</button>
<button class="btn small" onclick="confirmarCancelarAgendamento(this.closest('.agenda-item'))">Cancelar</button>
</div>
</div>
<div class="agenda-item" data-tipo="servico" data-cliente="Antonio Carlos S. de Assis" data-equip="Manutenção agendada — gerador 8kva" data-data="2026-06-24" data-horario="14:00" data-obs="">
<span class="agenda-dot servico"></span><span class="agenda-time">14:00</span>
<div style="flex:1;"><p class="agenda-name">Manutenção agendada — gerador 8kva</p><p class="agenda-sub">Cliente: Antonio Carlos S. de Assis</p></div>
<div class="agenda-item-actions">
<button class="btn small" onclick="editarAgendamento(this.closest('.agenda-item'))">Editar</button>
<button class="btn small" onclick="confirmarCancelarAgendamento(this.closest('.agenda-item'))">Cancelar</button>
</div>
</div>
</div>
</div>
<div class="agenda-day" data-date="2026-06-25">
<div class="agenda-date"><div class="dow">qui</div><div class="dom">25</div></div>
<div class="agenda-items">
<div class="agenda-item" data-tipo="locacao" data-cliente="Carlos Eduardo Pires" data-equip="Devolução prevista — betoneira 400L" data-data="2026-06-25" data-horario="09:30" data-obs="">
<span class="agenda-dot locacao"></span><span class="agenda-time">09:30</span>
<div style="flex:1;"><p class="agenda-name">Devolução prevista — betoneira 400L</p><p class="agenda-sub">Cliente: Carlos Eduardo Pires</p></div>
<div class="agenda-item-actions">
<button class="btn small" onclick="editarAgendamento(this.closest('.agenda-item'))">Editar</button>
<button class="btn small" onclick="confirmarCancelarAgendamento(this.closest('.agenda-item'))">Cancelar</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal-overlay" id="modal-cancelar-agenda">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title">Cancelar agendamento</p></div>
<svg class="modal-close" onclick="fecharCancelarAgenda()" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
</div>
<p class="panel-note" id="cancelar-agenda-texto" style="margin-bottom:18px;">Tem certeza que deseja cancelar esse agendamento?</p>
<div style="display:grid; grid-template-columns:1fr 1fr; gap:10px;">
<button class="btn full" onclick="fecharCancelarAgenda()">Voltar</button>
<button class="btn primary full" style="background:var(--red); border-color:var(--red);" onclick="confirmCancelarAgendamento()">Sim, cancelar</button>
</div>
</div>
</div>
<div class="modal-overlay" id="modal-novo-agendamento">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title">Novo agendamento</p><p class="modal-sub">Locação futura ou serviço marcado pra frente</p></div>
<svg class="modal-close" onclick="closeModal('modal-novo-agendamento')" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
</div>
<div class="form-row">
<label class="form-label">Tipo</label>
<div class="toggle-row" id="agenda-novo-tipo-row">
<div class="toggle-opt selected" data-tipo="locacao" onclick="setAgendaNovoTipo(this)"><i class="ti ti-rotate-clockwise-2"></i> Locação</div>
<div class="toggle-opt" data-tipo="servico" onclick="setAgendaNovoTipo(this)"><i class="ti ti-tool"></i> Serviço</div>
</div>
</div>
<div class="form-row">
<label class="form-label">Cliente</label>
<div class="inline-search">
<input type="text" id="agenda-novo-cliente" placeholder="Buscar cliente..." oninput="filterClienteAgenda()" onfocus="filterClienteAgenda()">
</div>
<div class="os-search-results" id="agenda-novo-cliente-results"></div>
<div class="confirm-box" id="agenda-novo-cliente-confirm" style="display:none;"></div>
</div>
<div class="form-row"><label class="form-label">Equipamento / serviço</label><input type="text" id="agenda-novo-equip" placeholder="Buscar equipamento..."></div>
<div class="form-row two">
<div><label class="form-label">Data</label><input type="date" id="agenda-novo-data" value="2026-06-24"></div>
<div><label class="form-label">Horário</label><input type="text" id="agenda-novo-horario" placeholder="ex: 14:00"></div>
</div>
<div class="form-row"><label class="form-label">Observação</label><textarea id="agenda-novo-obs" placeholder="Ex: cliente vem buscar pela manhã"></textarea></div>
<button class="btn primary full" id="agenda-salvar-btn" onclick="salvarAgendamento()"><i class="ti ti-calendar-event"></i> Salvar agendamento</button>
</div>
</div>
<div id="meire-m-contrato" class="page-view">
<div class="topbar">
<div>
<h1 class="page-title">Novo contrato</h1>
<p class="page-sub">Escolha o cliente e o equipamento — a baixa no estoque é automática</p>
</div>
<span class="today-pill">contrato #1249</span>
</div>
<div style="display:grid; grid-template-columns: 1fr 1fr; gap:20px; align-items:start;">
<div class="form-card">
<div class="form-row two">
<div>
<label class="form-label">Cliente</label>
<div class="inline-search">
<input type="text" id="contrato-cliente-busca" value="" placeholder="Buscar cliente" oninput="filterClienteContrato()" onfocus="filterClienteContrato()">
<button class="btn" onclick="document.getElementById('contrato-cliente-busca').value=''; filterClienteContrato();"><i class="ti ti-x"></i></button>
</div>
<div class="os-search-results" id="contrato-cliente-results"></div>
</div>
<div>
<label class="form-label">Equipamento</label>
<div class="inline-search">
<input type="text" id="contrato-equip-busca" placeholder="Buscar equipamento" value="" oninput="filterEquipContrato()" onfocus="filterEquipContrato()">
</div>
<div class="os-search-results" id="contrato-equip-results"></div>
<p class="panel-note" style="margin:6px 0 0;" id="contrato-equip-disp"></p>
</div>
</div>
<div class="confirm-box" id="contrato-cliente-confirm" style="display:none;"></div>
<p class="panel-note" style="margin-bottom:14px;">Confira esses dados com o cliente antes de prosseguir — pode existir clientes com o mesmo nome cadastrados.</p>
<div class="form-row two">
<div>
<label class="form-label">Período</label>
<select id="contrato-periodo" onchange="recalcContrato()">
<option value="1" id="opt-periodo-1">Diária — R$ 130</option>
<option value="3" id="opt-periodo-3" selected>3 dias — R$ 290</option>
<option value="7" id="opt-periodo-7">Semanal — R$ 325</option>
<option value="15" id="opt-periodo-15">Quinzenal — R$ 410</option>
<option value="30" id="opt-periodo-30">Mensal — R$ 495</option>
</select>
</div>
<div>
<label class="form-label">Devolução prevista</label>
<input type="text" id="contrato-devolucao" value="26/06/2026" disabled>
<p class="cost-source">Calculada a partir de hoje + período</p>
</div>
</div>
<div class="form-row two">
<div>
<label class="form-label">Valor total</label>
<div class="inline-search">
<input type="number" id="contrato-valor" value="290" oninput="document.getElementById('contrato-valor-display').textContent = 'R$ ' + (parseFloat(this.value)||0).toFixed(0);">
<span class="rule-tag" style="display:flex; align-items:center;">editável</span>
</div>
<p class="cost-source">Cobre mais barato ou mais caro que a tabela</p>
</div>
<div>
<label class="form-label">Forma de retirada</label>
<div class="toggle-row">
<div class="toggle-opt selected" onclick="setRetirada(this,'cliente')"><i class="ti ti-walk"></i> Cliente</div>
<div class="toggle-opt" onclick="setRetirada(this,'aluguemaq')"><i class="ti ti-truck-delivery"></i> Aluguemaq</div>
</div>
</div>
</div>
<div class="form-row">
<label class="form-label">Pagamento</label>
<div class="pay-grid"><div class="pay-opt selected">PIX</div><div class="pay-opt">Dinheiro</div><div class="pay-opt">Cartão</div><div class="pay-opt">Prazo</div></div>
</div>
<div id="entrega-endereco-fields" style="display:none;">
<div class="form-row">
<label class="form-label">Endereço de entrega</label>
<div class="toggle-row" style="margin-bottom:8px;">
<div class="toggle-opt selected" onclick="setEnderecoEntrega(this,'cadastrado')">Endereço cadastrado</div>
<div class="toggle-opt" onclick="setEnderecoEntrega(this,'outro')">Outro endereço</div>
</div>
<input type="text" id="entrega-endereco-input" value="" disabled>
</div>
</div>
<div class="form-row">
<label class="form-label">Adicionar observação (aparece impressa no contrato)</label>
<textarea id="contrato-obs" placeholder="Ex: cliente está levando também ponteira e talhadeira" style="min-height:38px;"></textarea>
</div>
<div class="total-box"><span class="lbl">Valor total</span><span class="val" id="contrato-valor-display">R$ 290</span></div>
<button class="btn primary full" onclick="gerarContrato()"><i class="ti ti-file-check"></i> Gerar contrato e baixar estoque</button>
<p style="font-size: 11.5px; color: var(--text-faint); margin: 12px 0 0; line-height: 1.5;">
<i class="ti ti-arrow-right" style="font-size: 12px;"></i> Se pagamento feito (Pix, Dinheiro ou Cartão), esse valor cai direto na aba Caixa. Se selecionado "Prazo", entra como pendência de pagamento em Contratos Ativos → Pendências.
</p>
</div>
<div>
<p class="section-label" style="margin-top:0;">Estoque de equipamentos</p>
<p class="panel-note" style="margin:-4px 0 10px;">Atualizado sozinho a cada contrato criado ou devolvido</p>
<div class="search-bar">
<input type="text" id="estoque-equip-busca" placeholder="Buscar equipamento" oninput="filterEstoqueEquip()" onkeypress="if(event.key==='Enter'){filterEstoqueEquip();}">
<button class="btn" onclick="filterEstoqueEquip()"><i class="ti ti-filter"></i></button>
</div>
<div style="display:flex; justify-content:flex-end; margin-top:8px;">
<button class="btn" onclick="imprimirTabelaEquipamentos()" title="Imprimir tabela de equipamentos e valores" style="border-radius:var(--radius-pill); display:inline-flex; align-items:center; gap:7px; padding:8px 16px;"><i class="ti ti-printer"></i> Imprimir</button>
</div>
<div class="stock-summary" style="margin-top:12px;">
<div class="card free"><p class="num">38</p><p class="lbl">disponíveis</p></div>
<div class="card out"><p class="num">21</p><p class="lbl">locados</p></div>
<div class="card maint"><p class="num">4</p><p class="lbl">em manutenção</p></div>
</div>
<div id="estoque-equip-list">
<div class="equip-row" data-nome="Betoneira 400L gasolina">
<i class="ti ti-rotate-clockwise-2 lead"></i>
<div style="flex:1;"><p class="equip-name">Betoneira 400L gasolina</p><p class="equip-meta">8 unidades no total · <span style="color:var(--terracotta);"><i class="ti ti-calendar-event" style="font-size:11px;"></i> 1 já tem agendamento p/ amanhã</span></p></div>
<div class="tag-row"><span class="tag free">5 livres</span><span class="tag out">3 locadas</span><button class="tag-price-btn" onclick="verPrecosEquip('Betoneira 400L gasolina')" title="Ver valores">+</button></div>
</div>
<div class="equip-row alert" data-nome="Andaime torre 1x1">
<i class="ti ti-stairs lead"></i>
<div style="flex:1;"><p class="equip-name">Andaime torre 1x1</p><p class="equip-meta">12 unidades · 1 com devolução atrasada</p></div>
<div class="tag-row"><span class="tag free">7 livres</span><span class="tag late">1 atrasada</span><button class="tag-price-btn" onclick="verPrecosEquip('Andaime torre 1x1')" title="Ver valores">+</button></div>
</div>
<div class="equip-row" data-nome="Martelo demolidor 15kg">
<i class="ti ti-tool lead"></i>
<div style="flex:1;"><p class="equip-name">Martelo demolidor 15kg</p><p class="equip-meta">6 unidades no total</p></div>
<div class="tag-row"><span class="tag free">4 livres</span><span class="tag out">2 locadas</span><button class="tag-price-btn" onclick="verPrecosEquip('Martelo demolidor 15kg')" title="Ver valores">+</button></div>
</div>
<div class="equip-row" data-nome="Gerador 10kva gasolina">
<i class="ti ti-bolt lead"></i>
<div style="flex:1;"><p class="equip-name">Gerador 10kva gasolina</p><p class="equip-meta">3 unidades no total</p></div>
<div class="tag-row"><span class="tag free">3 livres</span><button class="tag-price-btn" onclick="verPrecosEquip('Gerador 10kva gasolina')" title="Ver valores">+</button></div>
</div>
</div>
<p class="panel-note" id="estoque-equip-empty" style="display:none;">Nenhum equipamento encontrado com esse nome.</p>
</div>
</div>
</div>
<div class="modal-overlay" id="modal-equip-precos">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title" id="ep-titulo">Equipamento</p><p class="modal-sub">Valores por período de locação</p></div>
<svg class="modal-close" onclick="closeModal('modal-equip-precos')" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
</div>
<div id="ep-lista"></div>
</div>
</div>
<div id="meire-m-ativos" class="page-view">
<div class="topbar">
<div>
<h1 class="page-title">Contratos Ativos</h1>
<p class="page-sub">Contratos em aberto e tudo que precisa de atenção — atrasos, pagamentos, orçamentos parados</p>
</div>
</div>
<div class="hist-tabs" style="margin-bottom:16px;">
<button class="hist-tab active" id="ativos-tab-btn-ativos" onclick="setAtivosTab(this,'ativos')">Ativos</button>
<button class="hist-tab" id="ativos-tab-btn-pendencias" onclick="setAtivosTab(this,'pendencias')">Pendências <span class="nav-badge" style="margin-left:6px;">5</span></button>
</div>
<div id="ativos-tab-ativos">
<div class="search-bar"><input type="text" placeholder="Buscar por cliente ou equipamento"></div>
<div class="os-list">
<div class="os-row late">
<span class="os-tag" style="background:var(--red-soft); color:var(--red);">Prazo</span>
<div style="flex:1;"><p class="os-name">Carlos Eduardo Pires — Betoneira 400L</p><p class="os-sub">Venceu há 3 dias · pagamento a prazo, ainda não cobrado</p></div>
<button class="btn primary" onclick="openBaixaModal(this.closest('.os-row'), 'Carlos Eduardo Pires', 'Betoneira 400L', 290, false)">Dar baixa</button>
</div>
<div class="os-row">
<span class="os-tag open">PIX pago</span>
<div style="flex:1;"><p class="os-name">Wederson Candido — Martelo 15kg</p><p class="os-sub">Devolução prevista 27/06</p></div>
<button class="btn primary" onclick="openBaixaModal(this.closest('.os-row'), 'Wederson Candido', 'Martelo 15kg', 175, true)">Dar baixa</button>
</div>
<div class="os-row">
<span class="os-tag" style="background:var(--red-soft); color:var(--red);">Prazo</span>
<div style="flex:1;"><p class="os-name">Diogo Silva de Oliveira — Andaime torre 1x1 (2un.)</p><p class="os-sub">Devolução prevista hoje · pagamento a prazo</p></div>
<button class="btn primary" onclick="openBaixaModal(this.closest('.os-row'), 'Diogo Silva de Oliveira', 'Andaime torre 1x1 (2un.)', 175, false)">Dar baixa</button>
</div>
</div>
</div>
<div id="ativos-tab-pendencias" style="display:none;">
<div class="clickable-stat-row" style="grid-template-columns: repeat(2, 1fr);">
<div class="stat-card danger"><p class="stat-num">3</p><p class="stat-label">contratos atrasados</p></div>
<div class="stat-card warn"><p class="stat-num">2</p><p class="stat-label">contratos a prazo</p></div>
</div>
<p class="section-label">Contratos atrasados - Renovar ou Devolver</p>
<div class="os-list" style="margin-bottom:22px;">
<div class="os-row late">
<span class="os-tag" style="background:var(--red-soft); color:var(--red);">3 dias</span>
<div style="flex:1;"><p class="os-name">Carlos Eduardo Pires — Betoneira 400L</p><p class="os-sub">Venceu em 20/06</p></div>
<button class="btn" onclick="setAtivosTab(document.getElementById('ativos-tab-btn-ativos'),'ativos')">Ver contrato</button>
</div>
<div class="os-row late">
<span class="os-tag" style="background:var(--red-soft); color:var(--red);">1 dia</span>
<div style="flex:1;"><p class="os-name">Diogo Silva de Oliveira — Andaime torre 1x1</p><p class="os-sub">Venceu hoje</p></div>
<button class="btn" onclick="setAtivosTab(document.getElementById('ativos-tab-btn-ativos'),'ativos')">Ver contrato</button>
</div>
</div>
<p class="section-label">Contratos a prazo, locações ainda não pagas</p>
<div class="os-list">
<div class="os-row">
<span class="os-tag" style="background:var(--terracotta-soft); color:var(--terracotta);">a prazo</span>
<div style="flex:1;"><p class="os-name">Carlos Eduardo Pires</p><p class="os-sub">R$ 290 — Betoneira 400L</p></div>
<button class="btn primary" onclick="openPagoBaixaModal('Carlos Eduardo Pires', 'Betoneira 400L', 290)">Pago - Dar Baixa</button>
</div>
</div>
</div>
</div>
<div class="modal-overlay" id="modal-baixa">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title">Dar baixa no contrato</p><p class="modal-sub" id="baixa-cliente-nome">—</p></div>
<svg class="modal-close" onclick="closeModal('modal-baixa')" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
</div>
<div class="info-row" style="display:flex; justify-content:space-between; font-size:13px; padding:8px 0; border-bottom:1px solid var(--border); margin-bottom:10px;">
<span style="color:var(--text-mute);">Valor do contrato</span><span id="baixa-valor">R$ 290</span>
</div>
<div id="baixa-dynamic-body"></div>
</div>
</div>
<div class="modal-overlay" id="modal-pago-baixa">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title">Registrar pagamento</p><p class="modal-sub" id="pago-baixa-nome">—</p></div>
<svg class="modal-close" onclick="closeModal('modal-pago-baixa')" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
</div>
<div class="detail-row"><span class="l">Valor</span><span id="pago-baixa-valor">R$ 290</span></div>
<div class="form-row" style="margin-top:10px;">
<label class="form-label">Forma de pagamento</label>
<div class="pay-grid" style="grid-template-columns: repeat(3,1fr);">
<div class="pay-opt selected">PIX</div><div class="pay-opt">Dinheiro</div><div class="pay-opt">Cartão</div>
</div>
</div>
<div class="confirm-box">
<i class="ti ti-arrow-right"></i>
<p>Esse pagamento será lançado automaticamente em <b>Caixa → Entrada e saída</b>.</p>
</div>
<button class="btn primary full" onclick="confirmPagoBaixa()"><i class="ti ti-check"></i> Confirmar baixa</button>
<div id="pago-baixa-emitir" style="display:none; margin-top:16px; padding-top:16px; border-top:1px solid var(--border);">
<p class="panel-note" style="margin-bottom:10px;">Pagamento registrado! Deseja emitir algum documento?</p>
<div class="form-row" style="display:grid; grid-template-columns: 1fr 1fr 1fr; gap:8px;">
<button class="btn full" onclick="emitirRecibo(pagoBaixaContexto.cliente, pagoBaixaContexto.valor, 'locação — ' + pagoBaixaContexto.equip)"><i class="ti ti-clipboard-text"></i> Recibo</button>
<button class="btn full" onclick="emitirFaturaE(pagoBaixaContexto.cliente, pagoBaixaContexto.valor, 'locação — ' + pagoBaixaContexto.equip)"><i class="ti ti-receipt-2"></i> e-Fatura</button>
<button class="btn full" onclick="emitirNFe()"><i class="ti ti-file-invoice"></i> NF-e</button>
</div>
</div>
</div>
</div>
<div id="meire-m-clientes" class="page-view">
<div class="topbar">
<div>
<h1 class="page-title">Clientes</h1>
<p class="page-sub">Mesma base usada na locação e na oficina — consulte o CPF pra confirmar dados</p>
</div>
</div>
<div class="tab-row">
<button class="tab-btn active" data-ctab="cadastrar" onclick="setClientesTab(this,'cadastrar')">Cadastrar Cliente</button>
<button class="tab-btn" data-ctab="base" onclick="setClientesTab(this,'base')">Base Clientes</button>
<button class="tab-btn" data-ctab="pendencias" onclick="setClientesTab(this,'pendencias')">Pendências Clientes</button>
</div>
<div id="clientes-tab-cadastrar">
<div class="client-card" style="margin-bottom: 26px;">
<label class="form-label" style="margin-bottom:6px;">Tipo de cliente</label>
<div class="toggle-row" id="cliente-tipo-row" style="margin-bottom:16px;">
<div class="toggle-opt selected" data-tipo="pf" onclick="setTipoCliente(this,'pf')"><i class="ti ti-user"></i> Pessoa Física</div>
<div class="toggle-opt" data-tipo="pj" onclick="setTipoCliente(this,'pj')"><i class="ti ti-building"></i> Pessoa Jurídica</div>
</div>
<!-- ===== Pessoa Física ===== -->
<div id="cliente-campos-pf">
<div class="form-row">
<label class="form-label">CPF</label>
<div class="inline-search"><input type="text" id="cliente-pf-cpf" value="123.456.789-00"><button class="btn primary" onclick="consultarCPF()"><i class="ti ti-search"></i> Consultar</button></div>
<p class="panel-note" style="margin:6px 0 0;">Abre a consulta gratuita da Receita Federal (só CPF + data de nascimento, sem login)</p>
</div>
<div class="form-row"><label class="form-label">Nome completo</label><input type="text" id="cliente-pf-nome" value="Carlos Eduardo Pires"></div>
</div>
<!-- ===== Pessoa Jurídica ===== -->
<div id="cliente-campos-pj" style="display:none;">
<div class="form-row"><label class="form-label">Razão Social</label><input type="text" id="cliente-pj-razao" placeholder="Ex: ASS Engenharia & Construções LTDA"></div>
<div class="form-row">
<label class="form-label">CNPJ</label>
<div class="inline-search"><input type="text" id="cliente-pj-cnpj" placeholder="00.000.000/0000-00"><button class="btn primary" onclick="consultarCNPJ()"><i class="ti ti-search"></i> Consultar</button></div>
</div>
<div class="form-row two">
<div><label class="form-label">Telefone Comercial</label><input type="text" id="cliente-pj-tel-com" placeholder="(31) 0000-0000"></div>
<div><label class="form-label">Telefone Pessoal</label><input type="text" placeholder="(31) 90000-0000"></div>
</div>
</div>
<div class="form-row" id="cliente-telefone-row"><label class="form-label">Telefone</label><input type="text" id="cliente-tel" value="(31) 99876-5432"></div>
<label class="form-label" style="margin-top:4px;">Endereço:</label>
<div class="form-row two">
<div><label class="form-label" style="font-weight:400; font-size:11px;">Rua</label><input type="text" id="cliente-end-rua" value="Rua das Flores"></div>
<div><label class="form-label" style="font-weight:400; font-size:11px;">Número</label><input type="text" id="cliente-end-num" value="220"></div>
</div>
<div class="form-row two">
<div><label class="form-label" style="font-weight:400; font-size:11px;">CEP</label><input type="text" value="36570-000"></div>
<div><label class="form-label" style="font-weight:400; font-size:11px;">Bairro</label><input type="text" id="cliente-end-bairro" value="Centro"></div>
</div>
<div class="form-row">
<label class="form-label">Anexar documento</label>
<div class="attach-box" id="attach-box" onclick="document.getElementById('attach-input').click()">
<i class="ti ti-paperclip"></i>
<span id="attach-label">Anexar RG, CNH ou comprovante (foto ou PDF)</span>
</div>
<input type="file" id="attach-input" style="display:none;" onchange="handleAttach(this)">
</div>
<button class="btn primary full" onclick="salvarCliente()"><i class="ti ti-user-plus"></i> Salvar cliente</button>
</div>
</div>
<div id="clientes-tab-base" style="display:none;">
<div class="search-bar"><input type="text" id="base-clientes-busca" placeholder="Buscar cliente por nome, CPF ou telefone" oninput="filterBaseClientes()"></div>
<p class="hist-result-note" id="base-clientes-count" style="margin:12px 0 14px;">Mostrando <strong>2</strong> clientes cadastrados</p>
<div id="base-clientes-list"></div>
</div>
<div class="modal-overlay" id="modal-resumo-cliente">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title" id="resumo-cliente-nome">Cliente</p><p class="modal-sub" id="resumo-cliente-meta">—</p></div>
<svg class="modal-close" onclick="closeModal('modal-resumo-cliente')" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
</div>
<div class="mini-stats" id="resumo-cliente-stats"></div>
<div class="warn-box" id="resumo-cliente-warn" style="display:none;"><i class="ti ti-alert-triangle"></i><p id="resumo-cliente-warn-text"></p></div>
<div id="resumo-cliente-historico"></div>
<button class="btn primary full" style="margin-top:14px;" id="resumo-cliente-iniciar-btn"><i class="ti ti-file-plus"></i> Iniciar novo contrato</button>
</div>
</div>
<div id="clientes-tab-pendencias" style="display:none;">
<p class="panel-note" style="margin-bottom:14px;">Clientes com algum contrato atrasado, pagamento a prazo ou orçamento pendente.</p>
<div class="client-card" style="margin-bottom: 14px;">
<div class="client-head">
<div class="avatar" style="background:var(--red-soft); color:var(--red);">CE</div>
<div><p class="client-name">Carlos Eduardo Pires</p><p class="client-meta">Betoneira 400L — venceu há 3 dias</p></div>
</div>
<div class="warn-box" style="background:var(--red-soft);"><i class="ti ti-alert-triangle" style="color:var(--red);"></i><p style="color:#7A2A24;">Contrato vencido, pagamento a prazo ainda não cobrado.</p></div>
<button class="btn primary full" style="margin-top:10px;" onclick="openVerContrato('Betoneira 400L — contrato #1204', 'Carlos Eduardo Pires · venceu há 3 dias', false)"><i class="ti ti-file-text"></i> Ver Contrato</button>
</div>
</div>
</div>
<div id="meire-m-recebimento" class="page-view">
<div class="topbar">
<div>
<h1 class="page-title">Manutenção</h1>
<p class="page-sub">Chegada do equipamento quando entra, retirada quando o cliente vem buscar</p>
</div>
</div>
<div class="tab-row">
<button class="tab-btn active" onclick="setManutTab(this,'receb')">Chegada Equipamento</button>
<button class="tab-btn" onclick="setManutTab(this,'recolh')">Retirada Equipamento</button>
<button class="tab-btn" onclick="setManutTab(this,'pend')">Pendências</button>
</div>
<div id="manut-tab-receb">
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; align-items: start;">
<div class="form-card">
<div class="form-row"><label class="form-label">Cliente</label><input type="text" id="receb-cliente" value="João Paulo" oninput="updateRecebPreview()"></div>
<div class="form-row two">
<div><label class="form-label">Telefone</label><input type="text" id="receb-telefone" value="(31) 99123-4567" oninput="updateRecebPreview()"></div>
<div><label class="form-label">Data de entrada</label><input type="date" id="receb-data" value="2026-06-23" oninput="updateRecebPreview()"></div>
</div>
<div class="form-row"><label class="form-label">Equipamento</label><input type="text" id="receb-equip" value="Martelete Bosch" oninput="updateRecebPreview()"></div>
<div class="form-row"><label class="form-label">Problema relatado</label><textarea id="receb-problema" oninput="updateRecebPreview()">Não liga. Cliente diz que parou de funcionar de repente.</textarea></div>
<button class="btn primary full" onclick="printRecebimento()"><i class="ti ti-printer"></i> Imprimir nota (2 vias)</button>
<p class="panel-note" style="text-align:center;">Imprime 1ª via (cliente) e 2ª via (Aluguemaq), idênticas, empilhadas na mesma folha A4. A nota de recolhimento é impressa separadamente, na hora da retirada.</p>
</div>
<div>
<p class="section-label">Pré-visualização — 1ª via (Cliente)</p>
<div class="half-sheet-doc">
<div class="hsd-header">
<div class="hsd-logo"><img src="data:image/png;base64,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" alt="Aluguemaq"></div>
<div class="hsd-title">
<p class="hsd-name">Nota de Recebimento do Equipamento</p>
<p class="hsd-num">Nº 0245 · Oficina</p>
</div>
</div>
<div class="hsd-company">Marcelo Ricardo Piccolo · CNPJ 03.891.294/0001-87 · Av. Joaquim Lopes de Faria, 361, Viçosa-MG</div>
<div class="hsd-grid">
<div><span class="hsd-lbl">Cliente</span><span class="hsd-val" id="prev-cliente">João Paulo</span></div>
<div><span class="hsd-lbl">Telefone</span><span class="hsd-val" id="prev-telefone">(31) 99123-4567</span></div>
<div class="hsd-full"><span class="hsd-lbl">Equipamento</span><span class="hsd-val" id="prev-equip">Martelete Bosch</span></div>
</div>
<div class="hsd-problem"><span class="hsd-lbl">Problema relatado</span><p id="prev-problema">Não liga. Cliente diz que parou de funcionar de repente.</p></div>
<div class="hsd-foot-row"><span>Entrada: <b id="prev-data">23/06/2026</b></span><span>Recebido por: <b>Meire</b></span></div>
<div class="hsd-sign-row">
<div class="hsd-sign"><div class="hsd-sign-line"></div><p>assinatura — <span id="prev-sign-cliente">João Paulo</span></p></div>
<div class="hsd-sign"><div class="hsd-sign-line"></div><p>assinatura — Aluguemaq</p></div>
</div>
</div>
<div class="half-sheet-divider"><i class="ti ti-copy"></i> 2ª via — idêntica, fica com a Aluguemaq</div>
</div>
</div>
</div>
<div id="manut-tab-recolh" style="display:none;">
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; align-items: start;">
<div class="form-card">
<div class="form-row">
<label class="form-label">OS finalizada</label>
<select id="recolh-os-select" onchange="updateRecolhPreview()">
<option value="0">OS #245 — Martelete Bosch — João Paulo</option>
<option value="1">OS #243 — Bomba submersível — Cond. Reserva Real</option>
</select>
</div>
<div class="form-row"><label class="form-label">Serviço realizado</label><input type="text" id="recolh-servico" value="Troca de escova de carvão e teste de funcionamento" oninput="updateRecolhPreview()"></div>
<div class="form-row two">
<div><label class="form-label">Valor cobrado</label><input type="number" id="recolh-cobrado" value="180" oninput="updateRecolhPreview()"></div>
<div><label class="form-label">Valor pago</label><input type="number" id="recolh-pago" value="180" oninput="updateRecolhPreview()"></div>
</div>
<div class="form-row">
<label class="form-label">Situação</label>
<p class="panel-note" id="recolh-situacao-note" style="margin:0; padding:9px 11px; border-radius:8px; background:var(--good-soft); color:#1F5C3C;"><i class="ti ti-circle-check"></i> Pago — calculado automaticamente comparando valor cobrado x valor pago</p>
</div>
<button class="btn primary full" onclick="printRecolhFromForm()"><i class="ti ti-printer"></i> Imprimir nota (2 vias)</button>
<p class="panel-note" style="text-align:center;">Imprime 1ª via (cliente) e 2ª via (Aluguemaq), com o status de pagamento já confirmado.</p>
</div>
<div>
<p class="section-label">Pré-visualização — 1ª via (Cliente)</p>
<div class="half-sheet-doc">
<div class="hsd-header">
<div class="hsd-logo"><img src="data:image/png;base64,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" alt="Aluguemaq"></div>
<div class="hsd-title"><p class="hsd-name">Nota de Recolhimento do Equipamento</p><p class="hsd-num">Nº 0245 · Oficina</p></div>
</div>
<div class="hsd-company">Marcelo Ricardo Piccolo · CNPJ 03.891.294/0001-87 · Av. Joaquim Lopes de Faria, 361, Viçosa-MG</div>
<div class="hsd-status-mini" id="recolh-prev-status" style="background:#DCEADF; color:#2F5A3D;">PAGO — valor recebido integralmente</div>
<div class="hsd-grid">
<div><span class="hsd-lbl">Cliente</span><span class="hsd-val" id="recolh-prev-cliente">João Paulo</span></div>
<div><span class="hsd-lbl">Equipamento</span><span class="hsd-val" id="recolh-prev-equip">Martelete Bosch</span></div>
<div class="hsd-full"><span class="hsd-lbl">Serviço realizado</span><span class="hsd-val" id="recolh-prev-servico" style="font-weight:400; font-size:8.5pt;">Troca de escova de carvão e teste de funcionamento</span></div>
<div><span class="hsd-lbl">Valor cobrado</span><span class="hsd-val" id="recolh-prev-cobrado">R$ 180,00</span></div>
<div><span class="hsd-lbl">Valor pago</span><span class="hsd-val" id="recolh-prev-pago">R$ 180,00</span></div>
</div>
<div class="hsd-sign-row">
<div class="hsd-sign"><div class="hsd-sign-line"></div><p>assinatura — <span id="recolh-prev-sign-cliente">João Paulo</span></p></div>
<div class="hsd-sign"><div class="hsd-sign-line"></div><p>assinatura — Aluguemaq</p></div>
</div>
</div>
<div class="half-sheet-divider"><i class="ti ti-copy"></i> 2ª via — idêntica, fica com a Aluguemaq</div>
</div>
</div>
</div>
<div id="manut-tab-pend" style="display:none;">
<div class="clickable-stat-row" style="grid-template-columns: repeat(4, 1fr);">
<div class="stat-card danger"><p class="stat-num">1</p><p class="stat-label">recusadas, não buscadas</p></div>
<div class="stat-card warn"><p class="stat-num">2</p><p class="stat-label">prontas, aguard. buscar e pagar</p></div>
<div class="stat-card good"><p class="stat-num">1</p><p class="stat-label">prontas, aguard. só buscar</p></div>
<div class="stat-card warn"><p class="stat-num">1</p><p class="stat-label">entregues e não pagas</p></div>
</div>
<p class="section-label">Recusadas — cliente ainda não buscou</p>
<div class="os-list" style="margin-bottom:22px;">
<div class="os-row">
<span class="os-tag" style="background:var(--red-soft); color:var(--red);">recusada</span>
<div style="flex:1;"><p class="os-name">Furadeira de impacto — Sebastião Reis</p><p class="os-sub">Orçamento recusado há 4 dias, equipamento ainda na oficina</p></div>
<button class="btn">Ver OS</button>
</div>
</div>
<p class="section-label">Prontas — aguardando cliente buscar e pagar</p>
<div class="os-list" style="margin-bottom:22px;">
<div class="os-row">
<span class="os-tag wait">pronta</span>
<div style="flex:1;"><p class="os-name">Martelete Bosch — João Paulo</p><p class="os-sub">Serviço concluído, aguardando pagamento na retirada</p></div>
<button class="btn primary">Registrar retirada</button>
</div>
<div class="os-row">
<span class="os-tag wait">pronta</span>
<div style="flex:1;"><p class="os-name">Bomba submersível — Cond. Reserva Real</p><p class="os-sub">Serviço concluído, aguardando pagamento na retirada</p></div>
<button class="btn primary">Registrar retirada</button>
</div>
</div>
<p class="section-label">Prontas — pagas, aguardando só a retirada</p>
<div class="os-list" style="margin-bottom:22px;">
<div class="os-row">
<span class="os-tag open">pago</span>
<div style="flex:1;"><p class="os-name">Esmerilhadeira — Wederson Candido</p><p class="os-sub">Pago no ato, aguardando cliente vir buscar</p></div>
<button class="btn">Ver OS</button>
</div>
</div>
<p class="section-label">Entregues e não pagas</p>
<div class="os-list">
<div class="os-row late">
<span class="os-tag" style="background:var(--terracotta-soft); color:var(--terracotta);">a receber</span>
<div style="flex:1;"><p class="os-name">Serra circular — Cond. Reserva Real</p><p class="os-sub">Entregue há 2 dias, pagamento ainda não recebido</p></div>
<button class="btn primary">Cobrar / Dar baixa</button>
</div>
</div>
</div>
</div>
<div id="meire-m-vendapecas" class="page-view">
<div class="topbar">
<div>
<h1 class="page-title">Venda Peças</h1>
<p class="page-sub">Venda no balcão e controle de estoque das peças, no mesmo lugar</p>
</div>
</div>
<div style="display:grid; grid-template-columns: 1fr 1fr; gap:20px; align-items:start;">
<div class="form-card">
<div class="form-row">
<label class="form-label">Peça selecionada</label>
<div class="confirm-box" id="venda-peca-confirm" style="background:var(--bg-soft);">
<i class="ti ti-package"></i>
<div style="flex:1;">
<b id="venda-peca-nome-display" style="color:var(--text-main);">Rolamento 6203 ZZ</b><br>
<span style="font-size:11.5px; color:var(--text-mute);">R$ <span id="venda-peca-preco-display">95</span> / unidade</span>
</div>
</div>
<p class="cost-source">Escolha a peça na lista de estoque ao lado</p>
</div>
<div class="form-row">
<label class="form-label">Quantidade</label>
<input type="number" id="venda-qtd" value="1" oninput="recalcVendaPeca()" style="max-width:120px;">
</div>
<div class="form-row">
<label class="form-label">Cliente</label>
<div class="inline-search">
<input type="text" id="venda-cliente-busca" placeholder="Buscar cliente — ou deixe em branco para venda de balcão" oninput="filterVendaCliente()" onfocus="filterVendaCliente()">
</div>
<div class="os-search-results" id="venda-cliente-results"></div>
</div>
<div class="form-row">
<label class="form-label">Telefone</label>
<input type="text" id="venda-cliente-tel" placeholder="(31) 9____-____">
</div>
<div class="form-row">
<label class="form-label">Pagamento</label>
<div class="pay-grid"><div class="pay-opt">PIX</div><div class="pay-opt">Dinheiro</div><div class="pay-opt selected">Cartão</div><div class="pay-opt">Prazo</div></div>
</div>
<div class="form-row" id="venda-editar-valor-row" style="display:none;">
<label class="form-label">Valor editado</label>
<input type="number" id="venda-valor-editado" value="95" oninput="document.getElementById('venda-total-display').textContent = 'R$ ' + (parseFloat(this.value)||0).toFixed(0);">
<p class="cost-source">Use pra cobrar mais caro ou mais barato que a tabela</p>
</div>
<div class="total-box">
<span class="lbl">Total da venda</span>
<span class="val in" id="venda-total-display">R$ 95</span>
</div>
<button class="btn" style="width:100%; margin-bottom:8px; display:flex; align-items:center; justify-content:center; gap:6px;" onclick="toggleEditarValorVenda()"><i class="ti ti-pencil"></i> Editar valor</button>
<button class="btn primary full" onclick="printReciboVenda()"><i class="ti ti-receipt"></i> Confirmar venda e emitir recibo</button>
<p style="font-size: 11.5px; color: var(--text-faint); margin: 12px 0 0; line-height: 1.5;">
<i class="ti ti-arrow-right" style="font-size: 12px;"></i> Se pagamento feito (Pix, Dinheiro ou Cartão), esse valor cai direto na aba Caixa. Se selecionado "Prazo", entra como pendência de pagamento. O recibo é impresso em 2 vias (cliente e empresa) na mesma folha, sem mostrar o preço unitário — só nome da peça, quantidade e total.
</p>
</div>
<div style="max-height: calc(100vh - 190px); overflow-y:auto; padding-right:2px;">
<p class="section-label" style="margin-top:0;">Estoque de peças</p>
<div class="search-bar"><input type="text" id="peca-estoque-busca" placeholder="Buscar peça" oninput="filterPecaEstoque()"><button class="btn"><i class="ti ti-filter"></i></button></div>
<div class="stock-summary" style="margin-top:12px;">
<div class="card free"><p class="num">142</p><p class="lbl">itens em estoque</p></div>
<div class="card maint"><p class="num">6</p><p class="lbl">itens sem estoque</p></div>
<div class="card out"><p class="num">23</p><p class="lbl">peças vendidas (mês)</p></div>
</div>
<p class="section-label" style="margin-top:18px;">Componentes Elétricos</p>
<div class="peca-cat" data-cat="eletricos">
<div class="equip-row" data-peca-nome="Capacitor de partida" onclick="selecionarPecaVenda('Capacitor de partida', 45, this)"><i class="ti ti-bolt lead"></i><div style="flex:1;"><p class="equip-name">Capacitor de partida</p><p class="equip-meta">14 unidades — R$ 45</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Capacitor permanente" onclick="selecionarPecaVenda('Capacitor permanente', 38, this)"><i class="ti ti-bolt lead"></i><div style="flex:1;"><p class="equip-name">Capacitor permanente</p><p class="equip-meta">9 unidades — R$ 38</p></div><span class="tag free">ok</span></div>
<div class="equip-row alert" data-peca-nome="Capacitor 25uF" onclick="selecionarPecaVenda('Capacitor 25uF', 32, this)"><i class="ti ti-alert-triangle lead" style="color:var(--red);"></i><div style="flex:1;"><p class="equip-name">Capacitor 25uF</p><p class="equip-meta">0 unidades — sem estoque</p></div><span class="tag late">repor agora</span></div>
<div class="equip-row" data-peca-nome="Platinado / interruptor centrífugo" onclick="selecionarPecaVenda('Platinado / interruptor centrífugo', 34, this)"><i class="ti ti-toggle-left lead"></i><div style="flex:1;"><p class="equip-name">Platinado / interruptor centrífugo</p><p class="equip-meta">6 unidades — R$ 34</p></div><span class="tag free">ok</span></div>
<div class="equip-row alert" data-peca-nome="Escova de carvão" onclick="selecionarPecaVenda('Escova de carvão', 25, this)"><i class="ti ti-alert-triangle lead" style="color:var(--red);"></i><div style="flex:1;"><p class="equip-name">Escova de carvão</p><p class="equip-meta">0 unidades — sem estoque</p></div><span class="tag late">repor agora</span></div>
<div class="equip-row" data-peca-nome="Fio de cobre esmaltado (rolo 1kg)" onclick="selecionarPecaVenda('Fio de cobre esmaltado (rolo 1kg)', 145, this)"><i class="ti ti-cable lead"></i><div style="flex:1;"><p class="equip-name">Fio de cobre esmaltado (rolo 1kg)</p><p class="equip-meta">5 unidades — R$ 145</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Cabo de ligação flexível (m)" onclick="selecionarPecaVenda('Cabo de ligação flexível (m)', 8, this)"><i class="ti ti-cable lead"></i><div style="flex:1;"><p class="equip-name">Cabo de ligação flexível (m)</p><p class="equip-meta">40 unidades — R$ 8</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Ponte retificadora" onclick="selecionarPecaVenda('Ponte retificadora', 28, this)"><i class="ti ti-bolt lead"></i><div style="flex:1;"><p class="equip-name">Ponte retificadora</p><p class="equip-meta">11 unidades — R$ 28</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Diodo" onclick="selecionarPecaVenda('Diodo', 6, this)"><i class="ti ti-bolt lead"></i><div style="flex:1;"><p class="equip-name">Diodo</p><p class="equip-meta">30 unidades — R$ 6</p></div><span class="tag free">ok</span></div>
</div>
<p class="section-label" style="margin-top:18px;">Materiais de Isolamento</p>
<div class="peca-cat" data-cat="isolamento">
<div class="equip-row" data-peca-nome="Filme de poliéster (rolo)" onclick="selecionarPecaVenda('Filme de poliéster (rolo)', 35, this)"><i class="ti ti-stack-2 lead"></i><div style="flex:1;"><p class="equip-name">Filme de poliéster (rolo)</p><p class="equip-meta">8 unidades — R$ 35</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Papel isolante (Nomex)" onclick="selecionarPecaVenda('Papel isolante (Nomex)', 42, this)"><i class="ti ti-stack-2 lead"></i><div style="flex:1;"><p class="equip-name">Papel isolante (Nomex)</p><p class="equip-meta">7 unidades — R$ 42</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Verniz isolante (lata)" onclick="selecionarPecaVenda('Verniz isolante (lata)', 68, this)"><i class="ti ti-droplet lead"></i><div style="flex:1;"><p class="equip-name">Verniz isolante (lata)</p><p class="equip-meta">4 unidades — R$ 68</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Tubo isolante termo-retrátil (m)" onclick="selecionarPecaVenda('Tubo isolante termo-retrátil (m)', 12, this)"><i class="ti ti-tube lead"></i><div style="flex:1;"><p class="equip-name">Tubo isolante termo-retrátil (m)</p><p class="equip-meta">25 unidades — R$ 12</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Fita / cadarço de amarração" onclick="selecionarPecaVenda('Fita / cadarço de amarração', 15, this)"><i class="ti ti-ribbon lead"></i><div style="flex:1;"><p class="equip-name">Fita / cadarço de amarração</p><p class="equip-meta">18 unidades — R$ 15</p></div><span class="tag free">ok</span></div>
</div>
<p class="section-label" style="margin-top:18px;">Peças Mecânicas e Acessórios</p>
<div class="peca-cat" data-cat="mecanicas">
<div class="equip-row selected-peca" data-peca-nome="Rolamento 6203 ZZ" onclick="selecionarPecaVenda('Rolamento 6203 ZZ', 95, this)"><i class="ti ti-circle-dot lead"></i><div style="flex:1;"><p class="equip-name">Rolamento 6203 ZZ</p><p class="equip-meta">22 unidades — R$ 95</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Rolamento 6204 2RS" onclick="selecionarPecaVenda('Rolamento 6204 2RS', 110, this)"><i class="ti ti-circle-dot lead"></i><div style="flex:1;"><p class="equip-name">Rolamento 6204 2RS</p><p class="equip-meta">10 unidades — R$ 110</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Selo mecânico" onclick="selecionarPecaVenda('Selo mecânico', 55, this)"><i class="ti ti-shield lead"></i><div style="flex:1;"><p class="equip-name">Selo mecânico</p><p class="equip-meta">9 unidades — R$ 55</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Ventoinha plástica" onclick="selecionarPecaVenda('Ventoinha plástica', 40, this)"><i class="ti ti-fan lead"></i><div style="flex:1;"><p class="equip-name">Ventoinha plástica</p><p class="equip-meta">6 unidades — R$ 40</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Placa de bornes" onclick="selecionarPecaVenda('Placa de bornes', 22, this)"><i class="ti ti-plug lead"></i><div style="flex:1;"><p class="equip-name">Placa de bornes</p><p class="equip-meta">14 unidades — R$ 22</p></div><span class="tag free">ok</span></div>
<div class="equip-row" data-peca-nome="Retentor / anel O-ring" onclick="selecionarPecaVenda('Retentor / anel O-ring', 14, this)"><i class="ti ti-circle lead"></i><div style="flex:1;"><p class="equip-name">Retentor / anel O-ring</p><p class="equip-meta">20 unidades — R$ 14</p></div><span class="tag free">ok</span></div>
</div>
</div>
</div>
</div>
<div id="meire-m-chat" class="page-view">
<div class="topbar">
<div>
<h1 class="page-title">Chat gestão</h1>
<p class="page-sub">Fale com o Marcelo e a Lucilene, ou pergunte direto pro sistema</p>
</div>
</div>
<div class="chat-toggle">
<div class="opt selected" onclick="setChatMode(this, 'people')"><i class="ti ti-users"></i> Marcelo & Lucilene</div>
<div class="opt" onclick="setChatMode(this, 'system')"><i class="ti ti-robot"></i> Perguntar ao sistema</div>
</div>
<div class="chat-window">
<div class="chat-msgs" id="chat-msgs">
<div class="msg them">Bom dia Meire! Tudo certo por aí?<div class="msg-meta">Lucilene · 08:12</div></div>
<div class="msg me">Bom dia! O cliente Carlos Eduardo tá achando caro a diária da betoneira, pode confirmar se posso dar desconto?<div class="msg-meta">Você · 09:05</div></div>
<div class="msg them">Pode dar até R$ 10 de desconto se ele pegar por 3 dias. Acima disso me chama.<div class="msg-meta">Marcelo · 09:11</div></div>
</div>
<div class="chat-input">
<input type="text" id="chat-input-field" placeholder="Escreva uma mensagem...">
<button class="btn primary" onclick="sendChat()"><i class="ti ti-send"></i></button>
</div>
</div>
</div>
</main>
</div>
<div class="toast-msg" id="toast-msg"><i class="ti ti-check"></i><span id="toast-msg-text">Feito!</span></div>
<script>
function showToast(msg) {
var t = document.getElementById('toast-msg');
document.getElementById('toast-msg-text').textContent = msg;
t.classList.add('show');
clearTimeout(window._toastTimer);
window._toastTimer = setTimeout(function() { t.classList.remove('show'); }, 2600);
}
// Extrai cliente e valor do texto de origem, ex: "Contrato #1248 — Carlos Eduardo Pires — R$ 290"
function extrairDadosOrigem(raw) {
var partes = String(raw || '').split('—').map(function(s) { return s.trim(); });
return {
origemLabel: partes[0] || 'Serviço/venda',
cliente: partes[1] || 'Cliente não informado',
valor: parseMoneyBR(partes[2] || '0')
};
}
function emitirDocsSelecionados() {
var opts = document.querySelectorAll('#meire-m-notas .doc-check-opt');
var selecionados = [];
opts.forEach(function(opt) {
var input = opt.querySelector('input');
if (input.checked) selecionados.push(opt.textContent.trim());
});
if (selecionados.length === 0) { showToast('Selecione ao menos um documento'); return; }
var origemRaw = document.getElementById('recibo-origem-busca').value;
var dados = extrairDadosOrigem(origemRaw);
if (selecionados.indexOf('Recibo') !== -1) emitirRecibo(dados.cliente, dados.valor, dados.origemLabel);
if (selecionados.indexOf('e-Fatura') !== -1) emitirFaturaE(dados.cliente, dados.valor, dados.origemLabel);
if (selecionados.indexOf('NF-e') !== -1) emitirNFe();
showToast('Emitido: ' + selecionados.join(', '));
}
// ===== Emissão de documentos: NF-e, e-Fatura e Recibo =====
// NF-e: direciona pro Emissor Nacional oficial (govbr) — o sistema ainda não emite NF-e diretamente
function emitirNFe() {
window.open('https://www.nfse.gov.br/EmissorNacional/Login?ReturnUrl=%2fEmissorNacional', '_blank');
}
// e-Fatura: gera e imprime em 2 vias, no mesmo modelo usado hoje pela Aluguemaq
function emitirFaturaE(clienteNome, valorNum, origemLabel) {
var agora = new Date();
var dataBR = String(agora.getDate()).padStart(2,'0') + '/' + String(agora.getMonth()+1).padStart(2,'0') + '/' + agora.getFullYear();
var numero = 'ND-' + String(100000 + Math.floor(Math.random() * 900000)).slice(-6);
var body =
'<p style="text-align:center; font-weight:700; font-size:10.5pt; margin:0 0 8px;">Fatura de Locação de Bens Móveis Nº ' + numero + '</p>' +
'<div class="gr">' +
'<div class="full"><span class="lb">Locadora</span><span class="vl">Marcelo Ricardo Piccolo — CNPJ 03.891.294/0001-87 — Av. Joaquim Lopes de Faria, 361, Santo Antônio, Viçosa-MG</span></div>' +
'<div class="full"><span class="lb">Tomador</span><span class="vl">' + clienteNome + '</span></div>' +
'<div><span class="lb">Data de emissão</span><span class="vl">' + dataBR + '</span></div>' +
'<div><span class="lb">Natureza da operação</span><span class="vl">Fatura de Locação de bens móveis</span></div>' +
'</div>' +
'<div class="pb"><p><b>Discriminação:</b> ' + origemLabel + '</p></div>' +
'<div class="stm">Locação de bens móveis — operação NÃO sujeita ao ISS, conforme entendimento da Lei Complementar nº 116/2003.</div>' +
'<div class="ft"><span>Emitido por: <b>Meire</b></span><span style="font-weight:700;">Valor total: R$ ' + valorNum.toLocaleString('pt-BR',{minimumFractionDigits:2}) + '</span></div>';
var titulo = 'Fatura de Locação';
var halves =
buildHalfSheetHTML(titulo, 'Fatura Nº ' + numero, '1ª via — Empresa', body, contratoLogoSrc()) +
buildHalfSheetHTML(titulo, 'Fatura Nº ' + numero, '2ª via — Cliente', body, contratoLogoSrc());
openPrintWindow(titulo, halves);
showToast('e-Fatura ' + numero + ' gerada e impressa (2 vias)');
}
// Recibo: gera e imprime em 2 vias, pra qualquer serviço ou venda avulsa
function emitirRecibo(clienteNome, valorNum, origemLabel) {
var agora = new Date();
var dataBR = String(agora.getDate()).padStart(2,'0') + '/' + String(agora.getMonth()+1).padStart(2,'0') + '/' + agora.getFullYear();
var numero = 'REC-' + String(100000 + Math.floor(Math.random() * 900000)).slice(-6);
var body =
'<p style="text-align:center; font-weight:700; font-size:10.5pt; margin:0 0 10px;">Recibo Nº ' + numero + '</p>' +
'<div class="pb"><p style="font-size:9.5pt; line-height:1.6;">Recebemos de <b>' + clienteNome + '</b> a quantia de <b>R$ ' + valorNum.toLocaleString('pt-BR',{minimumFractionDigits:2}) + '</b>, referente a <b>' + origemLabel + '</b>, para os devidos fins e efeitos de direito.</p></div>' +
'<div class="gr"><div><span class="lb">Data</span><span class="vl">' + dataBR + '</span></div><div><span class="lb">Emitido por</span><span class="vl">Meire</span></div></div>' +
'<div class="sgrow">' +
'<div class="sg"><div class="ln"></div><p>Marcelo Ricardo Piccolo — Locadora</p></div>' +
'<div class="sg"><div class="ln"></div><p>' + clienteNome + '</p></div>' +
'</div>';
var titulo = 'Recibo';
var halves =
buildHalfSheetHTML(titulo, 'Recibo Nº ' + numero, '1ª via — Empresa', body, contratoLogoSrc()) +
buildHalfSheetHTML(titulo, 'Recibo Nº ' + numero, '2ª via — Cliente', body, contratoLogoSrc());
openPrintWindow(titulo, halves);
showToast('Recibo ' + numero + ' gerado e impresso (2 vias)');
}
// ===== Nota de recebimento: preview e impressão =====
function updateRecebPreview() {
document.getElementById('prev-cliente').textContent = document.getElementById('receb-cliente').value;
document.getElementById('prev-telefone').textContent = document.getElementById('receb-telefone').value;
document.getElementById('prev-equip').textContent = document.getElementById('receb-equip').value;
document.getElementById('prev-problema').textContent = document.getElementById('receb-problema').value;
document.getElementById('prev-sign-cliente').textContent = document.getElementById('receb-cliente').value;
var d = document.getElementById('receb-data').value;
if (d) {
var parts = d.split('-');
document.getElementById('prev-data').textContent = parts[2] + '/' + parts[1] + '/' + parts[0];
}
}
function buildHalfSheetHTML(titulo, subtitulo, viaLabel, bodyHTML, logoSrc) {
return '<div class="half">' +
'<div class="via-tag">' + viaLabel + '</div>' +
'<div class="hdr"><img src="' + logoSrc + '"><div><p class="nm">' + titulo + '</p><p class="nu">' + subtitulo + '</p></div></div>' +
'<div class="co">Marcelo Ricardo Piccolo · CNPJ 03.891.294/0001-87 · Insc. Est. 7130891940030 · Av. Joaquim Lopes de Faria, 361, Santo Antônio, Viçosa-MG · (31) 3892-3012 · aluguemaqvicosa@hotmail.com</div>' +
bodyHTML +
'</div>';
}
var printDocStyles =
'@page { size: A4; margin: 0; }' +
'body { margin:0; font-family: Arial, sans-serif; }' +
'.half { width: 210mm; height: 148.5mm; padding: 9mm 12mm; box-sizing: border-box; font-size: 9pt; color:#1a1a1a; position: relative; border-bottom: 1px dashed #bbb; }' +
'.half:last-child { border-bottom: none; }' +
'.via-tag { position:absolute; top:9mm; right:12mm; font-size:7.5pt; font-weight:700; color:#fff; background:#1A1A1A; padding:3px 10px; border-radius:10px; letter-spacing:0.03em; }' +
'.hdr { display:flex; align-items:center; gap:12px; border-bottom:2px solid #F1612A; padding-bottom:8px; margin-bottom:9px; padding-right:30mm; }' +
'.hdr img { height:30px; }' +
'.hdr .nm { font-size:12pt; font-weight:700; color:#F1612A; margin:0; }' +
'.hdr .nu { font-size:8pt; color:#666; margin:2px 0 0; }' +
'.co { font-size:7pt; color:#777; margin-bottom:9px; }' +
'.gr { display:grid; grid-template-columns:1fr 1fr; gap:4px 14px; background:#F5F2ED; border-radius:5px; padding:8px 10px; margin-bottom:9px; }' +
'.gr .full { grid-column:1/-1; }' +
'.lb { font-size:7pt; text-transform:uppercase; color:#888; display:block; }' +
'.vl { font-size:9.5pt; font-weight:600; }' +
'.pb { border:1px solid #ddd; border-radius:5px; padding:8px 10px; margin-bottom:9px; }' +
'.pb p { font-size:8.5pt; margin:3px 0 0; }' +
'.ft { display:flex; justify-content:space-between; font-size:8pt; color:#555; margin-bottom:10px; }' +
'.sg { text-align:center; margin-top:5mm; }' +
'.sg .ln { border-top:1px solid #333; width:65%; margin:0 auto 4px; }' +
'.sg p { font-size:8pt; color:#666; margin:0; }' +
'.sgrow { display:flex; gap:14px; margin-top:5mm; }' +
'.sgrow .sg { flex:1; margin-top:0; }' +
'.sgrow .sg .ln { width:90%; }' +
'.stm { background:#F5E6C8; color:#7A5410; font-size:8.5pt; font-weight:600; padding:6px 10px; border-radius:5px; margin-bottom:9px; text-align:center; }';
function openPrintWindow(title, halvesHTML) {
var w = window.open('', '_blank');
if (!w) {
alert('O navegador bloqueou a janela de impressão.\n\nProcure o aviso de "pop-up bloqueado" perto da barra de endereço, clique nele e escolha "Sempre permitir". Depois clique em imprimir de novo.');
return;
}
w.document.write('<!DOCTYPE html><html><head><meta charset="utf-8"><title>' + title + '</title><style>' + printDocStyles + '</style></head><body>' + halvesHTML + '</body></html>');
w.document.close();
w.onload = function() { w.print(); };
}
// ===== Adicionar Manutenção: Recebimento / Recolhimento tabs =====
function printReciboVenda() {
var payEl = document.querySelector('#meire-m-vendapecas .pay-grid .pay-opt.selected');
var forma = payEl ? payEl.textContent.trim() : 'PIX';
var pecaNome0 = document.getElementById('venda-peca-nome-display').textContent;
var total0 = parseMoneyBR(document.getElementById('venda-total-display').textContent);
var cliente0 = document.getElementById('venda-cliente-busca').value || 'Balcão';
if (forma === 'Prazo') {
adicionarPendenciaAtivos(cliente0, 'Peça — ' + pecaNome0, total0);
showToast('Venda registrada — pagamento a prazo movido para Pendências');
return;
}
lancarNoCaixa('Venda peça — ' + pecaNome0 + ' (' + cliente0 + ')', total0, forma);
var logoSrc = document.querySelector('#manut-tab-receb .hsd-logo img') ? document.querySelector('#manut-tab-receb .hsd-logo img').src : '';
var pecaNome = document.getElementById('venda-peca-nome-display').textContent;
var qtd = document.getElementById('venda-qtd').value;
var cliente = document.getElementById('venda-cliente-busca').value || 'Balcão';
var telefone = document.getElementById('venda-cliente-tel').value || '—';
var total = document.getElementById('venda-total-display').textContent;
var body =
'<div class="gr">' +
'<div><span class="lb">Cliente</span><span class="vl">' + cliente + '</span></div>' +
'<div><span class="lb">Telefone</span><span class="vl">' + telefone + '</span></div>' +
'<div><span class="lb">Peça</span><span class="vl">' + pecaNome + '</span></div>' +
'<div><span class="lb">Quantidade</span><span class="vl">' + qtd + '</span></div>' +
'<div class="full"><span class="lb">Total</span><span class="vl" style="font-size:11pt;">' + total + '</span></div>' +
'</div>' +
'<div class="ft"><span>Vendido por: <b>Meire</b></span></div>' +
'<div class="sg"><div class="ln"></div><p>assinatura do cliente</p></div>';
var halves =
buildHalfSheetHTML('Recibo de Venda — Peça', 'Venda de balcão', '1ª via — Cliente', body, logoSrc) +
buildHalfSheetHTML('Recibo de Venda — Peça', 'Venda de balcão', '2ª via — Aluguemaq', body, logoSrc);
openPrintWindow('Recibo de Venda', halves);
}
function setManutTab(btn, tab) {
document.querySelectorAll('#meire-m-recebimento .tab-btn').forEach(function(b) { b.classList.remove('active'); });
btn.classList.add('active');
document.getElementById('manut-tab-receb').style.display = (tab === 'receb') ? 'block' : 'none';
document.getElementById('manut-tab-recolh').style.display = (tab === 'recolh') ? 'block' : 'none';
document.getElementById('manut-tab-pend').style.display = (tab === 'pend') ? 'block' : 'none';
}
var recolhOSData = [
{ cliente: 'João Paulo', telefone: '(31) 99123-4567', equip: 'Martelete Bosch' },
{ cliente: 'Cond. Reserva Real', telefone: '(31) 3892-1100', equip: 'Bomba submersível' }
];
function updateRecolhPreview() {
var idx = parseInt(document.getElementById('recolh-os-select').value, 10);
var os = recolhOSData[idx];
document.getElementById('recolh-prev-cliente').textContent = os.cliente;
document.getElementById('recolh-prev-equip').textContent = os.equip;
document.getElementById('recolh-prev-servico').textContent = document.getElementById('recolh-servico').value;
document.getElementById('recolh-prev-sign-cliente').textContent = os.cliente;
var cobrado = parseFloat(document.getElementById('recolh-cobrado').value) || 0;
var pago = parseFloat(document.getElementById('recolh-pago').value) || 0;
document.getElementById('recolh-prev-cobrado').textContent = 'R$ ' + cobrado.toFixed(2).replace('.', ',');
document.getElementById('recolh-prev-pago').textContent = 'R$ ' + pago.toFixed(2).replace('.', ',');
var estaPago = (pago >= cobrado);
var statusEl = document.getElementById('recolh-prev-status');
var formNote = document.getElementById('recolh-situacao-note');
if (estaPago) {
statusEl.style.background = '#DCEADF'; statusEl.style.color = '#2F5A3D';
statusEl.textContent = 'PAGO — valor recebido integralmente';
formNote.style.background = 'var(--good-soft)'; formNote.style.color = '#1F5C3C';
formNote.innerHTML = '<i class="ti ti-circle-check"></i> Pago — calculado automaticamente comparando valor cobrado x valor pago';
} else {
var dif = (cobrado - pago).toFixed(2);
statusEl.style.background = '#F4D9D6'; statusEl.style.color = '#7A2A24';
statusEl.textContent = 'EM ABERTO — saldo de R$ ' + dif + ' pendente';
formNote.style.background = 'var(--red-soft)'; formNote.style.color = '#7A2A24';
formNote.innerHTML = '<i class="ti ti-alert-circle"></i> EM ABERTO — saldo de R$ ' + dif + ' pendente (calculado automaticamente)';
}
}
function printRecolhFromForm() {
var idx = parseInt(document.getElementById('recolh-os-select').value, 10);
var os = recolhOSData[idx];
var servico = document.getElementById('recolh-servico').value;
var cobrado = parseFloat(document.getElementById('recolh-cobrado').value) || 0;
var pago = parseFloat(document.getElementById('recolh-pago').value) || 0;
var estaPago = (pago >= cobrado);
printRecolhimento(os.cliente, os.telefone, os.equip, servico, cobrado.toFixed(2), pago.toFixed(2), estaPago);
}
function printRecebimento() {
var logoSrc = document.querySelector('.hsd-logo img').src;
var cliente = document.getElementById('receb-cliente').value;
var telefone = document.getElementById('receb-telefone').value;
var equip = document.getElementById('receb-equip').value;
var problema = document.getElementById('receb-problema').value;
var data = document.getElementById('prev-data').textContent;
var body =
'<div class="gr">' +
'<div><span class="lb">Cliente</span><span class="vl">' + cliente + '</span></div>' +
'<div><span class="lb">Telefone</span><span class="vl">' + telefone + '</span></div>' +
'<div class="full"><span class="lb">Equipamento</span><span class="vl">' + equip + '</span></div>' +
'</div>' +
'<div class="pb"><span class="lb">Problema relatado</span><p>' + problema + '</p></div>' +
'<div class="ft"><span>Entrada: <b>' + data + '</b></span><span>Recebido por: <b>Meire</b></span></div>' +
'<div class="sgrow">' +
'<div class="sg"><div class="ln"></div><p>assinatura — ' + cliente + '</p></div>' +
'<div class="sg"><div class="ln"></div><p>assinatura — Aluguemaq</p></div>' +
'</div>';
var halves =
buildHalfSheetHTML('Nota de Recebimento do Equipamento', 'Nº 0245 · Oficina', '1ª via — Cliente', body, logoSrc) +
buildHalfSheetHTML('Nota de Recebimento do Equipamento', 'Nº 0245 · Oficina', '2ª via — Aluguemaq', body, logoSrc);
openPrintWindow('Nota de Recebimento do Equipamento', halves);
}
function printRecolhimento(cliente, telefone, equip, servico, valorCobrado, valorPago, pago) {
var logoSrc = document.querySelector('.hsd-logo img') ? document.querySelector('.hsd-logo img').src : '';
var diferenca = (parseFloat(valorCobrado) - parseFloat(valorPago)).toFixed(2);
var statusHTML = pago
? '<div class="stm" style="background:#DCEADF; color:#2F5A3D;">PAGO — valor recebido integralmente na retirada</div>'
: '<div class="stm" style="background:#F4D9D6; color:#7A2A24;">EM ABERTO — saldo de R$ ' + diferenca + ' ainda pendente</div>';
var body =
statusHTML +
'<div class="gr">' +
'<div><span class="lb">Cliente</span><span class="vl">' + cliente + '</span></div>' +
'<div><span class="lb">Telefone</span><span class="vl">' + telefone + '</span></div>' +
'<div class="full"><span class="lb">Equipamento</span><span class="vl">' + equip + '</span></div>' +
'<div class="full"><span class="lb">Serviço realizado</span><span class="vl">' + servico + '</span></div>' +
'<div><span class="lb">Valor cobrado</span><span class="vl">R$ ' + valorCobrado + '</span></div>' +
'<div><span class="lb">Valor pago</span><span class="vl">R$ ' + valorPago + '</span></div>' +
'</div>' +
'<div class="ft"><span>Entregue por: <b>Meire</b></span></div>' +
'<div class="sgrow">' +
'<div class="sg"><div class="ln"></div><p>assinatura — ' + cliente + '</p></div>' +
'<div class="sg"><div class="ln"></div><p>assinatura — Aluguemaq</p></div>' +
'</div>';
var halves =
buildHalfSheetHTML('Nota de Recolhimento do Equipamento', 'Nº 0245 · Oficina', '1ª via — Cliente', body, logoSrc) +
buildHalfSheetHTML('Nota de Recolhimento do Equipamento', 'Nº 0245 · Oficina', '2ª via — Aluguemaq', body, logoSrc);
openPrintWindow('Nota de Recolhimento do Equipamento', halves);
}
function setClientesTab(btn, tab) {
document.querySelectorAll('#meire-m-clientes .tab-btn').forEach(function(b) { b.classList.remove('active'); });
btn.classList.add('active');
document.getElementById('clientes-tab-cadastrar').style.display = (tab === 'cadastrar') ? 'block' : 'none';
document.getElementById('clientes-tab-base').style.display = (tab === 'base') ? 'block' : 'none';
document.getElementById('clientes-tab-pendencias').style.display = (tab === 'pendencias') ? 'block' : 'none';
}
var clientesResumo = {
wederson: {
nome: 'Wederson Candido de Oliveira', avatar: 'WC', meta: 'CPF verificado · cliente desde out/2025',
stats: [ { num: '9', lbl: 'locações' }, { num: 'R$ 2.180', lbl: 'total pago' }, { num: '1', lbl: 'atraso anterior', flag: true } ],
warn: 'Devolveu o martelete 3 dias após o vencimento em dezembro. Considere pedir pagamento adiantado.',
historico: [ { desc: 'Betoneira + martelo 15kg', data: '29 dez' } ]
},
carlos: {
nome: 'Carlos Eduardo Pires', avatar: 'CE', meta: 'CPF verificado · cliente desde jun/2026',
stats: [ { num: '1', lbl: 'locações' }, { num: 'R$ 290', lbl: 'total pago' }, { num: '0', lbl: 'atrasos' } ],
warn: null,
historico: []
}
};
var clientesBanco = [];
function iniciaisCliente(nome) {
var p = (nome || '').trim().split(/\s+/);
return (((p[0] ? p[0][0] : '') + (p.length > 1 ? p[p.length - 1][0] : '')).toUpperCase()) || '?';
}
function renderBaseClientes() {
var lista = document.getElementById('base-clientes-list');
if (!lista) return;
var buscaEl = document.getElementById('base-clientes-busca');
var q = (buscaEl ? buscaEl.value : '').toLowerCase().trim();
var filtrados = clientesBanco.filter(function (c) {
if (!q) return true;
return ((c.nome || '') + ' ' + (c.cpf || '') + ' ' + (c.cnpj || '') + ' ' + (c.tel || '')).toLowerCase().includes(q);
});
lista.innerHTML = filtrados.map(function (c) {
var doc = c.cnpj ? ('CNPJ ' + c.cnpj) : ('CPF ' + (c.cpf || '—'));
var temDoc = !!c.documento;
return '<div class="os-row" style="cursor:default; margin-bottom:8px;">' +
'<div class="avatar">' + iniciaisCliente(c.nome) + '</div>' +
'<div style="flex:1;">' +
'<p class="os-name">' + (c.nome || '') + '</p>' +
'<p class="os-sub">' + doc + ' · ' + (c.tel || 'sem telefone') + (c.endereco ? ' · ' + c.endereco : '') + '</p>' +
'</div>' +
'<div style="display:flex; gap:8px; align-items:center;">' +
(temDoc
? '<button class="btn" onclick="verDocumentoCliente(\'' + c._id + '\')"><i class="ti ti-paperclip"></i> Ver documento</button>'
: '<span style="font-size:11.5px; color:var(--text-faint);">sem documento</span>') +
'<button class="btn primary" onclick="iniciarContratoClienteBanco(\'' + c._id + '\')"><i class="ti ti-file-plus"></i> Iniciar Novo Contrato</button>' +
'</div>' +
'</div>';
}).join('');
var count = filtrados.length;
var noteEl = document.getElementById('base-clientes-count');
if (noteEl) noteEl.innerHTML = 'Mostrando <strong>' + count + '</strong> cliente' + (count === 1 ? '' : 's') + ' cadastrado' + (count === 1 ? '' : 's');
}
function filterBaseClientes() { renderBaseClientes(); }
function iniciarContratoClienteBanco(id) {
var c = clientesBanco.find(function (x) { return String(x._id) === String(id); });
if (!c) return;
showPV('meire', 'm-contrato', document.querySelector('[data-view=m-contrato]'));
selectClienteContrato({ nome: c.nome || '', cpf: c.cpf || '', cnpj: c.cnpj || '', tel: c.tel || '', end: c.endereco || '' });
}
function verDocumentoCliente(id) {
var c = clientesBanco.find(function (x) { return String(x._id) === String(id); });
if (c && c.documento) { window.open(c.documento, '_blank'); }
else { alert('Este cliente ainda não tem documento anexado.'); }
}
function verResumoCliente(key) {
var c = clientesResumo[key];
if (!c) return;
document.getElementById('resumo-cliente-nome').textContent = c.nome;
document.getElementById('resumo-cliente-meta').textContent = c.meta;
var statsBox = document.getElementById('resumo-cliente-stats');
statsBox.innerHTML = c.stats.map(function(s) {
return '<div class="c' + (s.flag ? ' flag' : '') + '"><p class="num">' + s.num + '</p><p class="lbl">' + s.lbl + '</p></div>';
}).join('');
var warnBox = document.getElementById('resumo-cliente-warn');
if (c.warn) {
warnBox.style.display = 'flex';
document.getElementById('resumo-cliente-warn-text').textContent = c.warn;
} else {
warnBox.style.display = 'none';
}
var histBox = document.getElementById('resumo-cliente-historico');
histBox.innerHTML = c.historico.map(function(h) {
return '<div class="history-row"><span>' + h.desc + '</span><span>' + h.data + '</span></div>';
}).join('');
document.getElementById('resumo-cliente-iniciar-btn').onclick = function() { iniciarContratoCliente(key); };
document.getElementById('modal-resumo-cliente').classList.add('open');
}
function iniciarContratoCliente(key) {
var c = clientesResumo[key];
if (!c) return;
var dados = clientesContrato.find(function(cc) { return cc.nome === c.nome; });
closeModal('modal-resumo-cliente');
showPV('meire', 'm-contrato', document.querySelector('[data-view=m-contrato]'));
if (dados) { selectClienteContrato(dados); }
}
// ===== Pendências: pago - dar baixa =====
var pagoBaixaContexto = { cliente: '', equip: '', valor: 0 };
function openPagoBaixaModal(cliente, equip, valor) {
pagoBaixaContexto = { cliente: cliente, equip: equip, valor: valor };
document.getElementById('pago-baixa-nome').textContent = cliente + ' — ' + equip;
document.getElementById('pago-baixa-valor').textContent = 'R$ ' + valor;
document.getElementById('pago-baixa-emitir').style.display = 'none';
document.getElementById('modal-pago-baixa').classList.add('open');
}
function confirmPagoBaixa() {
document.getElementById('pago-baixa-emitir').style.display = 'block';
showToast('Pagamento registrado e lançado no caixa');
}
// ===== Pendências: autorização de OS =====
function setOSAutorizacao(btn, osName, autorizada) {
var row = btn.closest('.os-row');
var actionsWrap = btn.parentElement;
if (autorizada) {
row.querySelector('.os-tag').textContent = 'autorizada';
row.querySelector('.os-tag').style.background = '#DCEADF';
row.querySelector('.os-tag').style.color = 'var(--green-mid)';
actionsWrap.innerHTML = '<span style="font-size:12px; color:var(--green-mid); display:flex; align-items:center; gap:5px;"><i class="ti ti-check"></i> Liberada pro mecânico</span>';
} else {
row.querySelector('.os-tag').textContent = 'não autorizada';
row.querySelector('.os-tag').style.background = 'var(--red-soft)';
row.querySelector('.os-tag').style.color = 'var(--red)';
actionsWrap.innerHTML = '<span style="font-size:12px; color:var(--red); display:flex; align-items:center; gap:5px;"><i class="ti ti-ban"></i> Mecânico não pode iniciar</span>';
}
}
// ===== Caixa: entrada/saída =====
function setAgendaNovoTipo(el) {
el.parentElement.querySelectorAll('.toggle-opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
}
function filterClienteAgenda() {
var q = document.getElementById('agenda-novo-cliente').value.toLowerCase().trim();
var box = document.getElementById('agenda-novo-cliente-results');
var confirmBox = document.getElementById('agenda-novo-cliente-confirm');
box.innerHTML = '';
confirmBox.style.display = 'none';
confirmBox.innerHTML = '';
if (q === '') { box.classList.add('empty'); return; }
var matches = clientesContrato.filter(function(c) { return c.nome.toLowerCase().includes(q); });
box.classList.toggle('empty', matches.length === 0);
matches.forEach(function(c) {
var item = document.createElement('div');
item.className = 'os-search-item';
item.onclick = function() { selectClienteAgenda(c); };
item.innerHTML = '<span class="name">' + c.nome + '</span><span class="tag open">CPF ' + c.cpf.slice(-6) + '</span>';
box.appendChild(item);
});
}
function selectClienteAgenda(c) {
document.getElementById('agenda-novo-cliente').value = c.nome;
document.getElementById('agenda-novo-cliente-results').innerHTML = '';
document.getElementById('agenda-novo-cliente-results').classList.add('empty');
var confirmBox = document.getElementById('agenda-novo-cliente-confirm');
confirmBox.style.display = 'flex';
confirmBox.innerHTML =
'<i class="ti ti-id"></i>' +
'<div style="flex:1; display:grid; grid-template-columns: 1fr 1fr; gap:4px 14px; font-size:12.5px; color:#2F5A3D;">' +
'<div><span class="b" style="display:block;">Telefone</span>' + c.tel + '</div>' +
'<div><span class="b" style="display:block;">Endereço</span>' + c.end + '</div>' +
'</div>';
}
var agendaEditando = null;
function abrirNovoAgendamento() {
agendaEditando = null;
document.getElementById('agenda-novo-cliente').value = '';
document.getElementById('agenda-novo-equip').value = '';
document.getElementById('agenda-novo-horario').value = '';
document.getElementById('agenda-novo-obs').value = '';
document.getElementById('agenda-novo-cliente-confirm').style.display = 'none';
document.getElementById('agenda-salvar-btn').innerHTML = '<i class="ti ti-calendar-event"></i> Salvar agendamento';
document.getElementById('modal-novo-agendamento').classList.add('open');
}
function editarAgendamento(itemEl) {
agendaEditando = itemEl;
document.getElementById('agenda-novo-cliente').value = itemEl.getAttribute('data-cliente') || '';
document.getElementById('agenda-novo-equip').value = itemEl.getAttribute('data-equip') || '';
document.getElementById('agenda-novo-data').value = itemEl.getAttribute('data-data') || '';
document.getElementById('agenda-novo-horario').value = itemEl.getAttribute('data-horario') || '';
document.getElementById('agenda-novo-obs').value = itemEl.getAttribute('data-obs') || '';
var tipo = itemEl.getAttribute('data-tipo') || 'locacao';
document.querySelectorAll('#agenda-novo-tipo-row .toggle-opt').forEach(function(o) {
o.classList.toggle('selected', o.getAttribute('data-tipo') === tipo);
});
document.getElementById('agenda-novo-cliente-confirm').style.display = 'none';
document.getElementById('agenda-salvar-btn').innerHTML = '<i class="ti ti-check"></i> Salvar alterações';
document.getElementById('modal-novo-agendamento').classList.add('open');
}
var agendaCancelandoEl = null;
function confirmarCancelarAgendamento(itemEl) {
agendaCancelandoEl = itemEl;
var nome = itemEl.getAttribute('data-cliente') || '';
document.getElementById('cancelar-agenda-texto').textContent =
'Tem certeza que deseja cancelar o agendamento de ' + nome + '? Essa ação não pode ser desfeita.';
document.getElementById('modal-cancelar-agenda').classList.add('open');
}
function fecharCancelarAgenda() {
agendaCancelandoEl = null;
closeModal('modal-cancelar-agenda');
}
function cancelarAgendamento(itemEl) {
itemEl.classList.add('cancelled');
var sub = itemEl.querySelector('.agenda-sub');
sub.innerHTML = sub.innerHTML + ' · <b>Agendamento Cancelado</b>';
var actions = itemEl.querySelector('.agenda-item-actions');
if (actions) actions.style.display = 'none';
showToast('Agendamento cancelado');
}
function confirmCancelarAgendamento() {
if (agendaCancelandoEl) { cancelarAgendamento(agendaCancelandoEl); }
agendaCancelandoEl = null;
closeModal('modal-cancelar-agenda');
}
function salvarAgendamento() {
var tipoEl = document.querySelector('#agenda-novo-tipo-row .toggle-opt.selected');
var tipo = tipoEl ? tipoEl.getAttribute('data-tipo') : 'locacao';
var cliente = document.getElementById('agenda-novo-cliente').value.trim() || 'Cliente não informado';
var equip = document.getElementById('agenda-novo-equip').value.trim() || 'Sem descrição';
var dataVal = document.getElementById('agenda-novo-data').value; // yyyy-mm-dd
var horario = document.getElementById('agenda-novo-horario').value.trim() || '—';
var obs = document.getElementById('agenda-novo-obs').value.trim();
if (!dataVal) { alert('Escolha uma data para o agendamento.'); return; }
if (agendaEditando) {
var oldDay = agendaEditando.closest('.agenda-day');
agendaEditando.remove();
if (oldDay && !oldDay.querySelector('.agenda-item')) oldDay.remove();
agendaEditando = null;
}
var parts = dataVal.split('-');
var d = new Date(parseInt(parts[0],10), parseInt(parts[1],10)-1, parseInt(parts[2],10));
var diasSemana = ['dom','seg','ter','qua','qui','sex','sáb'];
var dow = diasSemana[d.getDay()];
var dom = d.getDate();
var list = document.getElementById('agenda-list');
var dayGroup = list.querySelector('.agenda-day[data-date="' + dataVal + '"]');
if (!dayGroup) {
dayGroup = document.createElement('div');
dayGroup.className = 'agenda-day';
dayGroup.setAttribute('data-date', dataVal);
dayGroup.innerHTML =
'<div class="agenda-date"><div class="dow">' + dow + '</div><div class="dom">' + dom + '</div></div>' +
'<div class="agenda-items"></div>';
var placed = false;
var existingDays = list.querySelectorAll('.agenda-day');
for (var i = 0; i < existingDays.length; i++) {
if (existingDays[i].getAttribute('data-date') > dataVal) {
list.insertBefore(dayGroup, existingDays[i]);
placed = true;
break;
}
}
if (!placed) list.appendChild(dayGroup);
}
var item = document.createElement('div');
item.className = 'agenda-item';
item.setAttribute('data-tipo', tipo);
item.setAttribute('data-cliente', cliente);
item.setAttribute('data-equip', equip);
item.setAttribute('data-data', dataVal);
item.setAttribute('data-horario', horario);
item.setAttribute('data-obs', obs);
item.innerHTML =
'<span class="agenda-dot ' + tipo + '"></span><span class="agenda-time">' + horario + '</span>' +
'<div style="flex:1;"><p class="agenda-name">' + equip + '</p><p class="agenda-sub">Cliente: ' + cliente + '</p></div>' +
'<div class="agenda-item-actions">' +
'<button class="btn small" onclick="editarAgendamento(this.closest(\'.agenda-item\'))">Editar</button>' +
'<button class="btn small" onclick="confirmarCancelarAgendamento(this.closest(\'.agenda-item\'))">Cancelar</button>' +
'</div>';
dayGroup.querySelector('.agenda-items').appendChild(item);
document.getElementById('agenda-novo-cliente').value = '';
document.getElementById('agenda-novo-equip').value = '';
document.getElementById('agenda-novo-horario').value = '';
document.getElementById('agenda-novo-obs').value = '';
closeModal('modal-novo-agendamento');
showToast('Agendamento salvo');
}
function setCaixaMode(el, mode) {
el.parentElement.querySelectorAll('.toggle-opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
document.getElementById('caixa-entrada-fields').style.display = (mode === 'entrada') ? 'block' : 'none';
document.getElementById('caixa-saida-fields').style.display = (mode === 'saida') ? 'block' : 'none';
}
function openCaixaDatePicker() {
var input = document.getElementById('caixa-data-input');
if (input.showPicker) { input.showPicker(); } else { input.focus(); input.click(); }
}
function openPainelDatePicker() {
var input = document.getElementById('painel-data-input');
if (input.showPicker) { input.showPicker(); } else { input.focus(); input.click(); }
}
function onPainelDataChange() {
var val = document.getElementById('painel-data-input').value; // yyyy-mm-dd
if (!val) return;
var parts = val.split('-');
var d = new Date(parseInt(parts[0],10), parseInt(parts[1],10)-1, parseInt(parts[2],10));
var diasSemana = ['domingo','segunda','terça','quarta','quinta','sexta','sábado'];
var meses = ['janeiro','fevereiro','março','abril','maio','junho','julho','agosto','setembro','outubro','novembro','dezembro'];
var label = diasSemana[d.getDay()] + ', ' + d.getDate() + ' de ' + meses[d.getMonth()];
document.getElementById('painel-data-label').textContent = label;
var hoje = (val === '2026-06-23');
var subEl = document.querySelector('#modal-dia-info .modal-sub');
if (subEl) { subEl.textContent = hoje ? 'Locações, oficina e caixa de hoje' : 'Locações, oficina e caixa desse dia — o que foi concluído e o que ficou pendente'; }
showDiaInfoModal(label, val);
}
var diaInfoNomes = {
concluidas: ['Cobrar Carlos Eduardo — pagamento recebido', 'Ligar para João — orçamento aprovado', 'Avisar Maria — equipamento retirado', 'Contrato #1247 renovado', 'Devolução conferida — andaime torre', 'Peça separada para Wederson'],
pendentes: ['Cobrar Diogo — ainda não retornou', 'Confirmar horário de entrega com cliente', 'Aguardando peça do fornecedor'],
contratos: ['Contrato — Carlos Eduardo Pires — Betoneira 400L', 'Contrato — Wederson Candido — Martelo 15kg', 'Contrato — Diogo Silva de Oliveira — Andaime torre 1x1 (2un.)', 'Contrato — Maria Aparecida — Compactador de solo'],
devolucoes: ['Devolução — Andaime torre 1x1 — Diogo Silva', 'Devolução — Betoneira 400L — Carlos Eduardo', 'Devolução — Martelo demolidor — Wederson'],
oficina: ['OS #243 — Bomba submersível — Cond. Reserva Real', 'OS #241 — Motor monofásico — troca de rolamento', 'OS #239 — Serra circular — revisão geral']
};
function toggleDiaDetalhe(tipo, rowEl) {
var existing = document.getElementById('dia-info-detalhe-' + tipo);
if (existing) { existing.remove(); rowEl.classList.remove('expanded'); return; }
document.querySelectorAll('#dia-info-lista .dia-info-detalhe').forEach(function(el) { el.remove(); });
document.querySelectorAll('#dia-info-lista .history-row').forEach(function(el) { el.classList.remove('expanded'); });
rowEl.classList.add('expanded');
var qtd = parseInt(rowEl.querySelector('span:last-child').textContent, 10) || 0;
var lista = diaInfoNomes[tipo] || [];
var box = document.createElement('div');
box.className = 'dia-info-detalhe';
box.id = 'dia-info-detalhe-' + tipo;
box.style.cssText = 'margin: 0 0 8px; padding: 8px 12px 8px 32px; background: var(--bg-soft); border-radius: 8px; font-size: 12.5px;';
if (qtd === 0 || lista.length === 0) {
box.innerHTML = '<p style="margin:0; color:var(--text-faint);">Nada registrado nesse dia.</p>';
} else {
var itens = lista.slice(0, Math.max(qtd, 1));
box.innerHTML = itens.map(function(nome) { return '<p style="margin:4px 0;">• ' + nome + '</p>'; }).join('');
}
rowEl.insertAdjacentElement('afterend', box);
}
function showDiaInfoModal(label, dataISO) {
var seed = 0;
(dataISO || label).split('').forEach(function(c) { seed += c.charCodeAt(0); });
var hoje = (dataISO === '2026-06-23');
var entradas = hoje ? 1065 : 300 + (seed % 12) * 85;
var saidas = hoje ? 20 : 10 + (seed % 6) * 15;
var contratos = hoje ? 3 : 1 + (seed % 4);
var devolucoes = hoje ? 2 : (seed % 3);
var concluidas = hoje ? 2 : 2 + (seed % 5);
var pendentes = hoje ? 1 : (seed % 3);
var oficinaQtd = seed % 3;
document.getElementById('dia-info-titulo').textContent = label.charAt(0).toUpperCase() + label.slice(1);
document.getElementById('dia-info-stats').innerHTML =
'<div class="c"><p class="num">R$ ' + entradas.toLocaleString('pt-BR') + '</p><p class="lbl">entradas</p></div>' +
'<div class="c"><p class="num">R$ ' + saidas.toLocaleString('pt-BR') + '</p><p class="lbl">saídas</p></div>' +
'<div class="c"><p class="num">' + contratos + '</p><p class="lbl">contratos criados</p></div>';
document.getElementById('dia-info-lista').innerHTML =
'<div class="history-row" style="color:var(--good); cursor:pointer;" onclick="toggleDiaDetalhe(\'concluidas\', this)"><span><i class="ti ti-circle-check"></i> Tarefas concluídas no dia</span><span>' + concluidas + '</span></div>' +
'<div class="history-row" style="cursor:pointer;' + (pendentes > 0 ? ' color:var(--red);' : '') + '" onclick="toggleDiaDetalhe(\'pendentes\', this)"><span><i class="ti ti-alert-circle"></i> Ficaram pendentes</span><span>' + pendentes + '</span></div>' +
'<div class="history-row" style="cursor:pointer;" onclick="toggleDiaDetalhe(\'contratos\', this)"><span><i class="ti ti-file-plus"></i> Contratos gerados</span><span>' + contratos + '</span></div>' +
'<div class="history-row" style="cursor:pointer;" onclick="toggleDiaDetalhe(\'devolucoes\', this)"><span><i class="ti ti-truck-return"></i> Devoluções</span><span>' + devolucoes + '</span></div>' +
'<div class="history-row" style="cursor:pointer;" onclick="toggleDiaDetalhe(\'oficina\', this)"><span><i class="ti ti-tool"></i> Serviços de oficina</span><span>' + oficinaQtd + '</span></div>' +
'<p class="panel-note" style="margin-top:6px;"><i class="ti ti-info-circle" style="font-size:12px;"></i> Clique em um item pra ver o detalhe' + (hoje ? '' : ' — dados ilustrativos deste protótipo, no sistema real mostra os lançamentos e pendências reais desse dia') + '.</p>';
document.getElementById('modal-dia-info').classList.add('open');
}
function meireISOHoje() {
var d = new Date();
return d.getFullYear() + '-' + String(d.getMonth()+1).padStart(2,'0') + '-' + String(d.getDate()).padStart(2,'0');
}
var CAIXA_HOJE_ISO = meireISOHoje();
var caixaHojeSnapshot = null; // preenchido no load com os dados originais de "hoje"
var caixaEntradaTemplates = [
{ nome: 'Loc. betoneira — Carlos Eduardo', metodo: 'PIX' },
{ nome: 'Loc. andaime torre — Diogo Silva de Oliveira', metodo: 'Cartão' },
{ nome: 'Man. bomba submersível — Cond. Reserva Real', metodo: 'PIX' },
{ nome: 'Venda peça — rolamento (via oficina)', metodo: 'Dinheiro' },
{ nome: 'Loc. martelete — Wederson Candido', metodo: 'Cartão' },
{ nome: 'OS oficina — troca de escova de carvão', metodo: 'PIX' }
];
var caixaSaidaTemplates = [
{ nome: 'Combustível manutenção equip.', metodo: 'Dinheiro' },
{ nome: 'Compra de peças — fornecedor', metodo: 'PIX' },
{ nome: 'Manutenção da van', metodo: 'Dinheiro' },
{ nome: 'Material de limpeza / loja', metodo: 'Dinheiro' }
];
function gerarLedgerRowHTML(nome, hora, metodo, tipo, valor) {
var icon = tipo === 'in' ? 'ti-arrow-down-left' : 'ti-arrow-up-right';
var sinal = tipo === 'in' ? '+' : '−';
return '<div class="ledger-row">' +
'<div class="ledger-icon ' + tipo + '"><i class="ti ' + icon + '"></i></div>' +
'<div style="flex:1;"><p class="ledger-name">' + nome + '</p><p class="ledger-sub">' + hora + '</p></div>' +
'<span class="method-tag">' + metodo + '</span><span class="ledger-val ' + tipo + '">' + sinal + ' R$ ' + formatMoneyBR(valor) + '</span>' +
'</div>';
}
function gerarDadosCaixaDia(dataISO) {
var seed = 0;
dataISO.split('').forEach(function(c) { seed += c.charCodeAt(0); });
var entradas = 300 + (seed % 12) * 85;
var saidas = 10 + (seed % 6) * 15;
var nEntradas = 2 + (seed % 3);
var entradaBase = Math.round(entradas / nEntradas);
var lancamentos = [];
var horaBase = 8 + (seed % 4);
for (var i = 0; i < nEntradas; i++) {
var t = caixaEntradaTemplates[(seed + i * 3) % caixaEntradaTemplates.length];
var valorItem = (i === nEntradas - 1) ? (entradas - entradaBase * (nEntradas - 1)) : entradaBase;
var hh = String(Math.min(horaBase + i, 18)).padStart(2, '0');
var mm = String((seed * (i + 1)) % 60).padStart(2, '0');
lancamentos.push({ nome: t.nome, hora: hh + ':' + mm, metodo: t.metodo, tipo: 'in', valor: valorItem });
}
var ts = caixaSaidaTemplates[seed % caixaSaidaTemplates.length];
lancamentos.push({ nome: ts.nome, hora: String(Math.min(horaBase + nEntradas, 18)).padStart(2, '0') + ':' + String((seed * 7) % 60).padStart(2, '0'), metodo: ts.metodo, tipo: 'out', valor: saidas });
return { entradas: entradas, saidas: saidas, lancamentos: lancamentos };
}
function aplicarDadosCaixaDia(dados) {
document.getElementById('caixa-entradas-valor').textContent = '+ R$ ' + formatMoneyBR(dados.entradas);
document.getElementById('caixa-saidas-valor').textContent = '− R$ ' + formatMoneyBR(dados.saidas);
var saldo = dados.entradas - dados.saidas + CAIXA_DIARIO_BASE;
document.getElementById('caixa-saldo-valor').textContent = '+ R$ ' + formatMoneyBR(saldo);
var list = document.getElementById('caixa-ledger-list');
list.innerHTML = dados.lancamentos.map(function(l) { return gerarLedgerRowHTML(l.nome, l.hora, l.metodo, l.tipo, l.valor); }).join('');
validarSaldoCaixa();
}
function restaurarCaixaHoje() {
if (!caixaHojeSnapshot) return;
document.getElementById('caixa-entradas-valor').textContent = caixaHojeSnapshot.entradasHTML;
document.getElementById('caixa-saidas-valor').textContent = caixaHojeSnapshot.saidasHTML;
document.getElementById('caixa-saldo-valor').textContent = caixaHojeSnapshot.saldoHTML;
document.getElementById('caixa-ledger-list').innerHTML = caixaHojeSnapshot.ledgerHTML;
validarSaldoCaixa();
}
if (document.getElementById('caixa-entradas-valor')) {
caixaHojeSnapshot = {
entradasHTML: document.getElementById('caixa-entradas-valor').textContent,
saidasHTML: document.getElementById('caixa-saidas-valor').textContent,
saldoHTML: document.getElementById('caixa-saldo-valor').textContent,
ledgerHTML: document.getElementById('caixa-ledger-list').innerHTML
};
}
function onCaixaDataChange() {
var val = document.getElementById('caixa-data-input').value; // yyyy-mm-dd
if (!val) return;
var parts = val.split('-');
var d = new Date(parseInt(parts[0],10), parseInt(parts[1],10)-1, parseInt(parts[2],10));
var diasSemana = ['domingo','segunda','terça','quarta','quinta','sexta','sábado'];
var meses = ['janeiro','fevereiro','março','abril','maio','junho','julho','agosto','setembro','outubro','novembro','dezembro'];
var label = diasSemana[d.getDay()] + ', ' + d.getDate() + ' de ' + meses[d.getMonth()];
document.getElementById('caixa-data-label').textContent = label;
var hoje = (val === CAIXA_HOJE_ISO);
document.getElementById('caixa-page-sub').textContent = hoje
? 'Tudo que entrou e saiu hoje, com o método de pagamento'
: 'Tudo que entrou e saiu em ' + label + ', com o método de pagamento';
var ledgerLabel = document.getElementById('caixa-ledger-label');
if (ledgerLabel) { ledgerLabel.textContent = hoje ? 'Lançamentos de hoje' : 'Lançamentos de ' + label; }
if (hoje) {
restaurarCaixaHoje();
} else {
aplicarDadosCaixaDia(gerarDadosCaixaDia(val));
}
showDiaInfoModal(label, val);
}
var caixaOrigens = [
{ nome: 'Contrato #1248 — Carlos Eduardo Pires', valor: 290 },
{ nome: 'OS #243 — Cond. Reserva Real', valor: 680 },
{ nome: 'Venda balcão — rolamento', valor: 95 }
];
function filterCaixaOrigem() {
var q = document.getElementById('caixa-origem-busca').value.toLowerCase().trim();
var box = document.getElementById('caixa-origem-results');
box.innerHTML = '';
if (q === '') { box.classList.add('empty'); return; }
var matches = caixaOrigens.filter(function(o) { return o.nome.toLowerCase().includes(q); });
box.classList.toggle('empty', matches.length === 0);
matches.forEach(function(o) {
var item = document.createElement('div');
item.className = 'os-search-item';
item.onclick = function() {
document.getElementById('caixa-origem-busca').value = o.nome;
document.getElementById('caixa-descricao').value = o.nome;
document.getElementById('caixa-valor').value = o.valor;
box.innerHTML = ''; box.classList.add('empty');
};
item.innerHTML = '<span class="name">' + o.nome + '</span><span class="tag done">R$ ' + o.valor + '</span>';
box.appendChild(item);
});
}
function selectSaidaCat(el, nome) {
document.querySelectorAll('.saida-cat-opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
var desc = document.getElementById('caixa-saida-descricao');
desc.value = nome;
desc.disabled = false;
document.getElementById('caixa-saida-valor').focus();
}
function selectSaidaOutra(el) {
document.querySelectorAll('.saida-cat-opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
var desc = document.getElementById('caixa-saida-descricao');
desc.value = '';
desc.disabled = false;
desc.placeholder = 'Digite a descrição da saída';
desc.focus();
}
function filterVendaCliente() {
var q = document.getElementById('venda-cliente-busca').value.toLowerCase().trim();
var box = document.getElementById('venda-cliente-results');
box.innerHTML = '';
if (q === '') { box.classList.add('empty'); return; }
var matches = clientesContrato.filter(function(c) { return c.nome.toLowerCase().includes(q); });
box.classList.toggle('empty', matches.length === 0);
matches.forEach(function(c) {
var item = document.createElement('div');
item.className = 'os-search-item';
item.onclick = function() {
document.getElementById('venda-cliente-busca').value = c.nome;
document.getElementById('venda-cliente-tel').value = c.tel;
box.innerHTML = ''; box.classList.add('empty');
};
item.innerHTML = '<span class="name">' + c.nome + '</span><span class="tag open">' + c.tel + '</span>';
box.appendChild(item);
});
}
// ===== Recibos e Notas =====
function filterReciboOrigem() {
var q = document.getElementById('recibo-origem-busca').value.toLowerCase().trim();
var box = document.getElementById('recibo-origem-results');
box.innerHTML = '';
if (q === '') { box.classList.add('empty'); return; }
var matches = caixaOrigens.filter(function(o) { return o.nome.toLowerCase().includes(q); });
box.classList.toggle('empty', matches.length === 0);
matches.forEach(function(o) {
var item = document.createElement('div');
item.className = 'os-search-item';
item.onclick = function() {
document.getElementById('recibo-origem-busca').value = o.nome + ' — R$ ' + o.valor;
box.innerHTML = ''; box.classList.add('empty');
};
item.innerHTML = '<span class="name">' + o.nome + '</span><span class="tag done">R$ ' + o.valor + '</span>';
box.appendChild(item);
});
}
function filterRecibosRecentes() {
var q = document.getElementById('recibo-recentes-busca').value.toLowerCase().trim();
document.querySelectorAll('#recibos-recentes-list .nf-row').forEach(function(row) {
var name = row.getAttribute('data-name') || '';
row.style.display = (q === '' || name.includes(q)) ? 'flex' : 'none';
});
}
// ===== Clientes: Pessoa Física / Pessoa Jurídica =====
function setTipoCliente(el, tipo) {
document.querySelectorAll('#cliente-tipo-row .toggle-opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
document.getElementById('cliente-campos-pf').style.display = (tipo === 'pf') ? 'block' : 'none';
document.getElementById('cliente-campos-pj').style.display = (tipo === 'pj') ? 'block' : 'none';
}
// Consulta pública e gratuita da Receita Federal (só CPF + data de nascimento, sem login)
function consultarCPF() {
window.open('https://servicos.receita.fazenda.gov.br/servicos/cpf/consultasituacao/consultapublica.asp', '_blank');
}
// Consulta pública e gratuita da Receita Federal p/ CNPJ (situação cadastral da empresa)
function consultarCNPJ() {
window.open('https://solucoes.receita.fazenda.gov.br/servicos/cnpjreva/cnpjreva_solicitacao.asp', '_blank');
}
// ===== Clientes: anexo de documento =====
function handleAttach(input) {
var box = document.getElementById('attach-box');
var label = document.getElementById('attach-label');
if (input.files && input.files[0]) {
box.classList.add('attached');
label.textContent = 'Anexado: ' + input.files[0].name;
}
}
// ===== Helpers: lançar no caixa / mover para histórico / pendências =====
function parseMoneyBR(str) {
var s = String(str).replace('R$', '').replace(/[−–—-]/g, '').replace(/\s+/g, '').replace(/\./g, '').replace(',', '.').trim();
return Math.abs(parseFloat(s)) || 0;
}
function formatMoneyBR(num) {
return num.toLocaleString('pt-BR', { minimumFractionDigits: 0, maximumFractionDigits: 0 });
}
function lancarNoCaixa(descricao, valor, metodo) {
var list = document.getElementById('caixa-ledger-list');
var row = document.createElement('div');
row.className = 'ledger-row';
var agora = new Date();
var hh = String(agora.getHours()).padStart(2,'0'), mi = String(agora.getMinutes()).padStart(2,'0');
row.innerHTML = '<div class="ledger-icon in"><i class="ti ti-arrow-down-left"></i></div>' +
'<div style="flex:1;"><p class="ledger-name">' + descricao + '</p><p class="ledger-sub">' + hh + ':' + mi + ' · lançado automático</p></div>' +
'<span class="method-tag">' + metodo + '</span><span class="ledger-val in">+ R$ ' + formatMoneyBR(valor) + '</span>';
list.insertBefore(row, list.firstChild);
var entradasEl = document.getElementById('caixa-entradas-valor');
var saldoEl = document.getElementById('caixa-saldo-valor');
var novaEntrada = parseMoneyBR(entradasEl.textContent) + valor;
var novoSaldo = parseMoneyBR(saldoEl.textContent) + valor;
entradasEl.textContent = '+ R$ ' + formatMoneyBR(novaEntrada);
saldoEl.textContent = '+ R$ ' + formatMoneyBR(novoSaldo);
validarSaldoCaixa();
}
function lancarSaidaNoCaixa(descricao, valor, metodo) {
var list = document.getElementById('caixa-ledger-list');
var row = document.createElement('div');
row.className = 'ledger-row';
var agora = new Date();
var hh = String(agora.getHours()).padStart(2,'0'), mi = String(agora.getMinutes()).padStart(2,'0');
row.innerHTML = '<div class="ledger-icon out"><i class="ti ti-arrow-up-right"></i></div>' +
'<div style="flex:1;"><p class="ledger-name">' + descricao + '</p><p class="ledger-sub">' + hh + ':' + mi + ' · lançado por Meire</p></div>' +
'<span class="method-tag">' + metodo + '</span><span class="ledger-val out">− R$ ' + formatMoneyBR(valor) + '</span>';
list.insertBefore(row, list.firstChild);
var saidasEl = document.getElementById('caixa-saidas-valor');
var saldoEl = document.getElementById('caixa-saldo-valor');
saidasEl.textContent = '− R$ ' + formatMoneyBR(parseMoneyBR(saidasEl.textContent) + valor);
saldoEl.textContent = '+ R$ ' + formatMoneyBR(parseMoneyBR(saldoEl.textContent) - valor);
validarSaldoCaixa();
}
function selectCaixaPay(el) {
document.querySelectorAll('#caixa-pay-grid .pay-opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
}
// Lançamento manual pelo formulário do Caixa (botão "Lançar no caixa")
function lancarManualCaixa() {
var modoEntrada = document.getElementById('caixa-entrada-fields').style.display !== 'none';
var payEl = document.querySelector('#caixa-pay-grid .pay-opt.selected');
var metodo = payEl ? payEl.textContent.trim() : 'PIX';
if (modoEntrada) {
var desc = document.getElementById('caixa-descricao').value.trim();
var valor = parseFloat(document.getElementById('caixa-valor').value) || 0;
if (!desc || valor <= 0) { alert('Preencha a descrição e um valor maior que zero.'); return; }
lancarNoCaixa(desc, valor, metodo);
document.getElementById('caixa-descricao').value = '';
document.getElementById('caixa-valor').value = '';
document.getElementById('caixa-origem-busca').value = '';
} else {
var descS = document.getElementById('caixa-saida-descricao').value.trim();
var valorS = parseFloat(document.getElementById('caixa-saida-valor').value) || 0;
if (!descS) { alert('Escolha uma categoria de saída (ou "+ Adicionar outra saída").'); return; }
if (valorS <= 0) { alert('Preencha um valor maior que zero para a saída.'); return; }
lancarSaidaNoCaixa(descS, valorS, metodo);
document.getElementById('caixa-saida-valor').value = '';
}
showToast('Lançado no caixa ✓');
}
var CAIXA_DIARIO_BASE = 50;
function validarSaldoCaixa() {
var entradas = parseMoneyBR(document.getElementById('caixa-entradas-valor').textContent);
var saidasEl = document.getElementById('caixa-saidas-valor');
var saidas = saidasEl ? parseMoneyBR(saidasEl.textContent) : 0;
var saldoAtual = parseMoneyBR(document.getElementById('caixa-saldo-valor').textContent);
var esperado = entradas - saidas + CAIXA_DIARIO_BASE;
var diff = saldoAtual - esperado;
var warnBox = document.getElementById('caixa-saldo-warning');
var icon = document.getElementById('caixa-saldo-icon');
var msg = document.getElementById('caixa-saldo-msg');
warnBox.style.display = 'flex';
if (Math.abs(diff) > 0.5) {
icon.className = 'ti ti-alert-triangle';
icon.style.color = 'var(--red)';
msg.style.color = 'var(--red)';
msg.innerHTML = 'Diferença no caixa de <b>R$ ' + formatMoneyBR(Math.abs(diff)) + '</b>, validar entradas e saídas';
} else {
icon.className = 'ti ti-circle-check';
icon.style.color = 'var(--good)';
msg.style.color = 'var(--good)';
msg.innerHTML = 'Valor em Caixa Correto';
}
}
function moverParaHistorico(nome, sub, valor, metodoOuStatus, statusClass, statusLabel) {
var list = document.getElementById('hist-list-todos');
var row = document.createElement('div');
row.className = 'hist-row-full';
var hoje = new Date();
row.setAttribute('data-date', CAIXA_HOJE_ISO);
row.setAttribute('data-type', 'locacao');
row.setAttribute('data-client', nome.toLowerCase());
row.innerHTML = '<div class="hist-row-top">' +
'<div class="hist-icon locacao"><i class="ti ti-rotate-clockwise-2"></i></div>' +
'<div style="flex:1;"><p class="hist-name">' + sub + '</p><p class="hist-sub">' + metodoOuStatus + '</p></div>' +
'<span class="hist-status ' + statusClass + '">' + statusLabel + '</span><span class="hist-date">23 jun</span><span class="hist-val">R$ ' + formatMoneyBR(valor) + '</span>' +
'</div>';
var firstMonthLabel = list.querySelector('.hist-month-label');
if (firstMonthLabel) { list.insertBefore(row, firstMonthLabel.nextSibling); } else { list.insertBefore(row, list.firstChild); }
}
// ===== Sincronização com a Gestão (Marcelo) via localStorage compartilhado =====
function aluguemaqSalvarLista(chave, lista) {
try { localStorage.setItem(chave, JSON.stringify(lista)); } catch (e) { /* localStorage indisponível neste contexto */ }
}
function aluguemaqLerLista(chave) {
try { var v = localStorage.getItem(chave); return v ? JSON.parse(v) : []; } catch (e) { return []; }
}
function aluguemaqAdicionarPendenciaPagamento(cliente, equip, valor) {
var lista = aluguemaqLerLista('aluguemaq_pendencias_pagamento');
lista.push({ cliente: cliente, equip: equip, valor: valor, criadoEm: Date.now() });
aluguemaqSalvarLista('aluguemaq_pendencias_pagamento', lista);
}
function aluguemaqAdicionarRetiradoSemPagar(cliente, equip, valor) {
var lista = aluguemaqLerLista('aluguemaq_retirado_sem_pagar');
lista.push({ cliente: cliente, equip: equip, valor: valor, criadoEm: Date.now() });
aluguemaqSalvarLista('aluguemaq_retirado_sem_pagar', lista);
}
function adicionarPendenciaAtivos(cliente, equip, valor) {
var list = document.querySelector('#ativos-tab-pendencias .os-list');
var row = document.createElement('div');
row.className = 'os-row';
row.innerHTML = '<span class="os-tag" style="background:var(--terracotta-soft); color:var(--terracotta);">a prazo</span>' +
'<div style="flex:1;"><p class="os-name">' + cliente + '</p><p class="os-sub">R$ ' + formatMoneyBR(valor) + ' — ' + equip + '</p></div>' +
'<button class="btn primary" onclick="openPagoBaixaModal(\'' + cliente + '\', \'' + equip + '\', ' + valor + ')">Pago - Dar Baixa</button>';
list.appendChild(row);
aluguemaqAdicionarPendenciaPagamento(cliente, equip, valor);
}
// ===== Contratos ativos: dar baixa =====
var baixaState = {};
function openBaixaModal(rowEl, cliente, equip, valor, jaPago) {
baixaState = { rowEl: rowEl, cliente: cliente, equip: equip, valor: valor, jaPago: jaPago };
document.getElementById('baixa-cliente-nome').textContent = cliente + ' — ' + equip;
document.getElementById('baixa-valor').textContent = 'R$ ' + valor;
var body = document.getElementById('baixa-dynamic-body');
if (!jaPago) {
body.innerHTML =
'<p class="panel-note" style="margin-bottom:12px;">O que aconteceu com esse contrato?</p>' +
'<button class="btn primary full" style="margin-bottom:8px;" onclick="baixaResolver(\'devolvido-pago\')"><i class="ti ti-check"></i> Devolvido e Pago</button>' +
'<button class="btn full" style="margin-bottom:8px;" onclick="baixaResolver(\'devolvido-prazo\')"><i class="ti ti-clock"></i> Devolvido e a Prazo</button>' +
'<button class="btn full" onclick="baixaResolver(\'pago-nao-devolvido\')"><i class="ti ti-cash\"></i> Pago e Não Devolvido</button>';
} else {
body.innerHTML =
'<p class="panel-note" style="margin-bottom:12px;">Já está pago. O equipamento foi devolvido?</p>' +
'<button class="btn primary full" style="margin-bottom:8px;" onclick="baixaResolver(\'finalizar\')"><i class="ti ti-check"></i> Devolvido - Finalizar Contrato</button>' +
'<button class="btn full" onclick="baixaAbrirAtualizar()"><i class="ti ti-refresh"></i> Atualizar Contrato</button>' +
'<div id="baixa-atualizar-box" style="display:none; margin-top:14px; padding-top:14px; border-top:1px solid var(--border);">' +
'<div class="form-row"><label class="form-label">Dias a mais / novo valor da diária extra</label><input type="number" id="baixa-atualizar-valor" value="130"></div>' +
'<div class="form-row"><label class="form-label">Esse acréscimo já foi pago?</label>' +
'<div class="toggle-row"><div class="toggle-opt selected" onclick="setBaixaToggle(this,\'acrescimo\',\'pago\')">Pago</div><div class="toggle-opt" onclick="setBaixaToggle(this,\'acrescimo\',\'prazo\')">A prazo</div></div></div>' +
'<button class="btn primary full" onclick="baixaResolver(\'atualizado\')"><i class="ti ti-check"></i> Confirmar atualização</button>' +
'</div>';
}
document.getElementById('modal-baixa').classList.add('open');
}
function baixaAbrirAtualizar() {
document.getElementById('baixa-atualizar-box').style.display = 'block';
}
function setBaixaToggle(el, group, value) {
el.parentElement.querySelectorAll('.toggle-opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
baixaState.acrescimoForma = (group === 'acrescimo') ? value : baixaState.acrescimoForma;
}
function baixaResolver(acao) {
var s = baixaState;
if (acao === 'devolvido-pago') {
lancarNoCaixa('Loc. ' + s.equip + ' — ' + s.cliente, s.valor, 'PIX');
moverParaHistorico(s.cliente, 'Loc. ' + s.equip + ' — ' + s.cliente, s.valor, 'PIX', 'ok', 'paga');
if (s.rowEl) s.rowEl.remove();
showToast('Contrato finalizado — devolvido e pago');
} else if (acao === 'devolvido-prazo') {
adicionarPendenciaAtivos(s.cliente, s.equip, s.valor);
moverParaHistorico(s.cliente, 'Loc. ' + s.equip + ' — ' + s.cliente, s.valor, 'a prazo', 'late', 'pendente');
if (s.rowEl) s.rowEl.remove();
showToast('Equipamento devolvido — pagamento pendente movido para Pendências');
} else if (acao === 'pago-nao-devolvido') {
lancarNoCaixa('Loc. ' + s.equip + ' — ' + s.cliente + ' (pago, equip. ainda com cliente)', s.valor, 'PIX');
if (s.rowEl) {
s.rowEl.querySelector('.os-tag').outerHTML = '<span class="os-tag open">Pago — aguardando devolução</span>';
s.rowEl.querySelector('.os-sub').textContent = 'Pago hoje · equipamento ainda não devolvido';
var btn = s.rowEl.querySelector('button');
btn.setAttribute('onclick', "openBaixaModal(this.closest('.os-row'), '" + s.cliente + "', '" + s.equip + "', " + s.valor + ", true)");
}
showToast('Pagamento lançado no Caixa — aguardando devolução do equipamento');
} else if (acao === 'finalizar') {
moverParaHistorico(s.cliente, 'Loc. ' + s.equip + ' — ' + s.cliente, s.valor, 'PIX', 'ok', 'paga');
if (s.rowEl) s.rowEl.remove();
showToast('Contrato finalizado e movido para o Histórico');
} else if (acao === 'atualizado') {
var extra = parseFloat(document.getElementById('baixa-atualizar-valor').value) || 0;
var forma = baixaState.acrescimoForma || 'pago';
if (forma === 'pago') { lancarNoCaixa('Acréscimo diária — ' + s.equip + ' — ' + s.cliente, extra, 'PIX'); }
else { adicionarPendenciaAtivos(s.cliente, s.equip + ' (acréscimo)', extra); }
if (s.rowEl) { s.rowEl.querySelector('.os-sub').textContent = 'Contrato atualizado — +R$ ' + formatMoneyBR(extra) + (forma === 'pago' ? ' pago' : ' a prazo'); }
showToast('Contrato atualizado');
}
closeModal('modal-baixa');
}
// ===== Histórico: Ver Contrato / Ver Nota =====
function openVerContrato(titulo, cliente, pago) {
document.getElementById('vc-titulo').textContent = titulo;
document.getElementById('vc-cliente').textContent = cliente;
var banner = document.getElementById('vc-status-banner');
if (pago) {
banner.className = 'status-banner-mini ok';
banner.innerHTML = '<i class="ti ti-circle-check"></i> Contrato fechado e pago';
} else {
banner.className = 'status-banner-mini bad';
banner.innerHTML = '<i class="ti ti-alert-circle"></i> Contrato fechado — ainda devendo';
}
document.getElementById('modal-ver-contrato').classList.add('open');
}
function openVerNota(titulo, cliente, emitida, data) {
document.getElementById('vn-titulo').textContent = titulo;
document.getElementById('vn-cliente').textContent = cliente;
document.getElementById('vn-data').textContent = data;
var banner = document.getElementById('vn-status-banner');
if (emitida) {
banner.className = 'status-banner-mini ok';
banner.innerHTML = '<i class="ti ti-circle-check"></i> Nota já emitida';
} else {
banner.className = 'status-banner-mini pending';
banner.innerHTML = '<i class="ti ti-clock"></i> Nota ainda não emitida';
}
document.getElementById('modal-ver-nota').classList.add('open');
}
// Numeração sequencial — ajuste ALUGUEMAQ_PROX_CONTRATO/NOTA para o próximo número real
// assim que tiver o último contrato/nota emitido no papel (o sistema conta a partir daqui).
var ALUGUEMAQ_PROX_CONTRATO = 541; // último real: 000540 (contrato de locação enviado)
var ALUGUEMAQ_PROX_NOTA = 50; // último real: ND-000049 (fatura de locação enviada)
function proximoNumeroContrato() { return String(ALUGUEMAQ_PROX_CONTRATO++).padStart(6, '0') + '-01'; }
function proximoNumeroNota() { return 'ND-' + String(ALUGUEMAQ_PROX_NOTA++).padStart(6, '0'); }
function emitirContrato() {
var titulo = document.getElementById('vc-titulo').textContent;
var cliente = document.getElementById('vc-cliente').textContent;
var numero = proximoNumeroContrato();
var hoje = new Date();
var hojeBR = String(hoje.getDate()).padStart(2,'0') + '/' + String(hoje.getMonth()+1).padStart(2,'0') + '/' + hoje.getFullYear();
var body =
'<p style="text-align:center; font-weight:700; font-size:10.5pt; margin:0 0 8px;">Contrato de Locação de Bens Móveis Nº ' + numero + '</p>' +
'<div class="gr">' +
'<div class="full"><span class="lb">Locadora</span><span class="vl">Marcelo Ricardo Piccolo — CNPJ 03.891.294/0001-87</span></div>' +
'<div class="full"><span class="lb">Locatário</span><span class="vl">' + cliente + '</span></div>' +
'<div><span class="lb">Data de emissão</span><span class="vl">' + hojeBR + '</span></div>' +
'<div><span class="lb">Modalidade</span><span class="vl">Diária</span></div>' +
'</div>' +
'<div class="pb"><p style="font-weight:700; margin:0 0 4px;">Cláusulas e Condições</p>' +
'<p>1º. Condições de renovação: não ocorrendo a devolução dos equipamentos até o último dia de vigência do prazo de locação, este contrato está automaticamente renovado por igual período, emitindo-se nova fatura. A Locadora reserva-se o direito de não renovar o contrato caso haja alguma cláusula não integralmente cumprida, incluindo-se a inadimplência dos pagamentos das faturas, exigindo-se a devolução imediata dos bens locados.</p>' +
'<p>2º. Reposição dos bens: em caso de extravio, furto, roubo ou qualquer outro evento que impossibilite a devolução dos bens locados, a Locatária pagará à Locadora o valor de mercado dos bens faltantes, sendo que a locação será cobrada até a efetiva comprovação deste pagamento.</p>' +
'<p>3º. Manutenção do equipamento: correrá por conta da Locatária toda e qualquer despesa necessária à manutenção dos objetos locados, assim como as despesas de transporte de envio e posterior devolução.</p>' +
'<p>4º. Fica eleito o foro da comarca de Viçosa-MG como competente para dirimir quaisquer dúvidas oriundas deste contrato.</p></div>' +
'<div class="ft"><span>Emitido por: <b>Meire</b></span><span>Locação de bens móveis — operação NÃO sujeita ao ISS, conforme Lei Complementar nº 116/2003.</span></div>' +
'<div class="sgrow">' +
'<div class="sg"><div class="ln"></div><p>assinatura — Locadora</p></div>' +
'<div class="sg"><div class="ln"></div><p>assinatura — ' + cliente + '</p></div>' +
'</div>';
var halves =
buildHalfSheetHTML(titulo, 'Contrato de locação Nº ' + numero, '1ª via — Cliente', body, contratoLogoSrc()) +
buildHalfSheetHTML(titulo, 'Contrato de locação Nº ' + numero, '2ª via — Aluguemaq', body, contratoLogoSrc());
closeModal('modal-ver-contrato');
openPrintWindow(titulo, halves);
}
function emitirNota() {
var titulo = document.getElementById('vn-titulo').textContent;
var cliente = document.getElementById('vn-cliente').textContent;
var data = document.getElementById('vn-data').textContent;
var numero = proximoNumeroNota();
var body =
'<p style="text-align:center; font-weight:700; font-size:10.5pt; margin:0 0 8px;">Fatura de Locação Nº ' + numero + '</p>' +
'<div class="gr">' +
'<div class="full"><span class="lb">Tomador</span><span class="vl">' + cliente + '</span></div>' +
'<div><span class="lb">Data de emissão</span><span class="vl">' + data + '</span></div>' +
'<div><span class="lb">Natureza da operação</span><span class="vl">Fatura de Locação de bens móveis</span></div>' +
'</div>' +
'<div class="pb"><p><b>Observações:</b> Locação de bens móveis – operação NÃO sujeita ao ISS, conforme entendimento da Lei Complementar nº 116/2003.</p></div>' +
'<div class="ft"><span>Emitido por: <b>Meire</b></span></div>';
var halves =
buildHalfSheetHTML(titulo, 'Fatura de Locação Nº ' + numero, '1ª via — Cliente', body, contratoLogoSrc()) +
buildHalfSheetHTML(titulo, 'Fatura de Locação Nº ' + numero, '2ª via — Aluguemaq', body, contratoLogoSrc());
closeModal('modal-ver-nota');
openPrintWindow(titulo, halves);
}
function contratoLogoSrc() {
var img = document.querySelector('.hsd-logo img') || document.querySelector('.brand-mark img');
return img ? img.src : '';
}
// ===== Venda de peças =====
var vendaPecaPrecoAtual = 95;
function selecionarPecaVenda(nome, preco, el) {
vendaPecaPrecoAtual = preco;
document.getElementById('venda-peca-nome-display').textContent = nome;
document.getElementById('venda-peca-preco-display').textContent = preco;
document.querySelectorAll('.peca-cat .equip-row').forEach(function(r) { r.classList.remove('selected-peca'); });
if (el) el.classList.add('selected-peca');
recalcVendaPeca();
}
function filterPecaEstoque() {
var q = document.getElementById('peca-estoque-busca').value.toLowerCase().trim();
document.querySelectorAll('.peca-cat').forEach(function(cat) {
var visivelNaCategoria = 0;
cat.querySelectorAll('.equip-row').forEach(function(row) {
var nome = (row.getAttribute('data-peca-nome') || '').toLowerCase();
var show = q === '' || nome.includes(q);
row.style.display = show ? 'flex' : 'none';
if (show) visivelNaCategoria++;
});
var label = cat.previousElementSibling;
if (label && label.classList.contains('section-label')) {
label.style.display = visivelNaCategoria === 0 ? 'none' : 'block';
}
});
}
function recalcVendaPeca() {
var preco = vendaPecaPrecoAtual || 0;
var qtd = parseInt(document.getElementById('venda-qtd').value, 10) || 1;
var total = preco * qtd;
document.getElementById('venda-total-display').textContent = 'R$ ' + total.toFixed(0);
var editRow = document.getElementById('venda-editar-valor-row');
if (editRow.style.display !== 'none') {
document.getElementById('venda-valor-editado').value = total;
}
}
function toggleEditarValorVenda() {
var row = document.getElementById('venda-editar-valor-row');
var showing = row.style.display !== 'none';
row.style.display = showing ? 'none' : 'block';
if (!showing) {
var preco = vendaPecaPrecoAtual || 0;
var qtd = parseInt(document.getElementById('venda-qtd').value, 10) || 1;
document.getElementById('venda-valor-editado').value = preco * qtd;
}
}
// ===== Painel do dia: cards clicáveis =====
var painelCardData = {
agendadas: { title: 'Locações agendadas', items: [
{ name: 'Retirada — andaime torre (2 un.)', sub: 'Diogo Silva de Oliveira · qua, 08:00', phone: '(31) 98876-4521' },
{ name: 'Manutenção agendada — gerador 8kva', sub: 'Antonio Carlos S. de Assis · qua, 14:00', phone: '(31) 99742-1180' }
]},
vencidos: { title: 'Contratos vencidos', items: [
{ name: 'Carlos Eduardo Pires — Betoneira 400L', sub: 'Venceu há 3 dias', late: true, phone: '(31) 98501-3327' },
{ name: 'Diogo Silva de Oliveira — Andaime torre 1x1', sub: 'Venceu hoje', late: true, phone: '(31) 98876-4521' },
{ name: 'Helio Flavano — Gerador 3,5kva', sub: 'Venceu há 1 dia', late: true, phone: '(31) 99618-7702' }
]},
ativas: { title: 'Locações ativas', items: [
{ name: 'Carlos Eduardo Pires — Betoneira 400L', sub: 'Devolução 26/06', phone: '(31) 98501-3327' },
{ name: 'Wederson Candido — Martelo 15kg', sub: 'Devolução 27/06', phone: '(31) 99205-8846' },
{ name: 'Geraldo Eustáquio — Compressor de ar', sub: 'Devolução 29/06', phone: '(31) 98413-9074' }
]},
orcamentos: { title: 'Orçamentos parados', items: [
{ name: 'Martelete Bosch — João Paulo', sub: 'Orçamento enviado há 2 dias, sem resposta', phone: '(31) 99870-2216' },
{ name: 'Serra mármore — Samuel', sub: 'Orçamento enviado ontem, sem resposta', phone: '(31) 98344-5093' }
]},
prontos: { title: 'Prontos para entrega', items: [
{ name: 'Compressor de ar — Maria', sub: 'Pronto desde ontem', phone: '(31) 99133-6482' },
{ name: 'Furadeira de impacto — Renata Costa', sub: 'Pronto hoje', phone: '(31) 98720-5511' },
{ name: 'Serra mármore — Samuel', sub: 'Pronto há 1 dia', phone: '(31) 98344-5093' },
{ name: 'Esmerilhadeira — Antonio Francisco', sub: 'Pronto há 2 dias', phone: '(31) 99461-8830' }
]},
manaberto: { title: 'Manutenções em aberto', items: [
{ name: 'Martelete Bosch — João Paulo', sub: 'Em andamento · José', phone: '(31) 99870-2216' },
{ name: 'Lavadora alta pressão — Maria A. Lopes', sub: 'Em andamento · José', phone: '(31) 99133-6482' },
{ name: 'Betoneira 400L — Geraldo Eustáquio', sub: 'Aguard. peça há 6 dias', late: true, phone: '(31) 98413-9074' },
{ name: 'Compressor de ar — Fazenda Dom Bosco', sub: 'Aguard. peça há 8 dias', late: true, phone: '(31) 3891-2240' }
]},
pendentepag: { title: 'Contratos encerrados, pagamento pendente', items: [
{ name: 'Wederson Candido — Martelo 15kg', sub: 'Devolvido 20/06 · falta receber R$ 180', late: true, phone: '(31) 99205-8846' },
{ name: 'Renata Costa — Furadeira de impacto', sub: 'Devolvido ontem · falta receber R$ 60', late: true, phone: '(31) 98720-5511' }
]},
recusadapronta: { title: 'OS recusadas, prontas pra retirada', items: [
{ name: 'Martelete Bosch — João Paulo', sub: 'Orçamento recusado · equipamento pronto na oficina', phone: '(31) 99870-2216' }
]}
};
function openPainelModal(key) {
var data = painelCardData[key];
document.getElementById('painel-modal-title').textContent = data.title;
document.getElementById('painel-modal-sub').textContent = data.items.length + (data.items.length === 1 ? ' item' : ' itens');
var list = document.getElementById('painel-modal-list');
list.innerHTML = '';
data.items.forEach(function(item) {
var row = document.createElement('div');
row.className = 'os-drill-row' + (item.late ? ' late' : '');
var phoneHTML = item.phone
? '<a href="tel:' + item.phone.replace(/\D/g, '') + '" style="display:flex; align-items:center; gap:5px; font-size:12.5px; font-weight:600; color:var(--blue, #2C5A8A); text-decoration:none; white-space:nowrap; padding:6px 10px; border:1px solid var(--border); border-radius:999px; background:#fff;" title="Ligar para o cliente"><i class="ti ti-phone"></i>' + item.phone + '</a>'
: '';
row.innerHTML = '<div style="flex:1;"><p class="os-drill-name">' + item.name + '</p><p class="os-drill-sub">' + item.sub + '</p></div>' + phoneHTML;
list.appendChild(row);
});
document.getElementById('modal-painel-card').classList.add('open');
}
function closeModal(id) { document.getElementById(id).classList.remove('open'); }
// ===== Tarefas de hoje: simula a junção de Agenda + Contratos + Oficina =====
// Em produção (com backend) isso seria consultado direto nessas 3 fontes,
// filtrado pela data de hoje. Aqui os itens já vêm marcados com a origem.
var tarefasHojeFontes = [
{ id: 't1', origem: 'contrato', icon: 'ti-phone', name: 'Cobrar Carlos Eduardo', tel: '(31) 99999-6666', sub: 'Betoneira — venceu há 3 dias' },
{ id: 't2', origem: 'oficina', icon: 'ti-file-text', name: 'Ligar para João', tel: '(31) 99123-4567', sub: 'Orçamento da martelete enviado ontem' },
{ id: 't3', origem: 'oficina', icon: 'ti-truck-delivery', name: 'Avisar Maria', tel: '(31) 98877-2233', sub: 'Compressor de ar pronto pra retirar' },
{ id: 't4', origem: 'agenda', icon: 'ti-calendar-event', name: 'Retirada — andaime torre (2 un.)', tel: '(31) 99012-3344', sub: 'Diogo Silva de Oliveira · hoje, 08:00' }
];
var origemStyle = {
contrato: { bg: 'var(--red-soft)', color: '#7A2A24', label: 'Contrato' },
oficina: { bg: 'var(--amber-soft)', color: '#7A5410', label: 'Oficina' },
agenda: { bg: 'var(--blue-soft)', color: 'var(--blue)', label: 'Agenda' }
};
function renderTarefasHoje() {
var wrap = document.getElementById('tasks-pending');
wrap.innerHTML = '';
tarefasHojeFontes.forEach(function(t) {
var st = origemStyle[t.origem];
var row = document.createElement('div');
row.className = 'os-row';
row.setAttribute('data-task-id', t.id);
row.innerHTML =
'<div class="stock-icon" style="background:' + st.bg + '; color:' + st.color + ';"><i class="ti ' + t.icon + '"></i></div>' +
'<div style="flex:1;"><p class="os-name">' + t.name + (t.tel ? ' <span style="font-weight:400; color:var(--text-mute);">— ' + t.tel + '</span>' : '') + '</p><p class="os-sub"><span style="font-weight:600; color:' + st.color + ';">' + st.label + '</span> · ' + t.sub + '</p></div>' +
'<button class="btn" onclick="openConcluirModal(\'' + t.id + '\', \'' + t.name.replace(/'/g, "\\'") + '\')">Concluir</button>';
wrap.appendChild(row);
});
}
renderTarefasHoje();
validarSaldoCaixa();
var currentTaskId = null, currentTaskName = '';
function openConcluirModal(taskId, taskName) {
currentTaskId = taskId;
currentTaskName = taskName;
document.getElementById('concluir-task-name').textContent = taskName;
document.getElementById('concluir-obs-text').value = '';
document.getElementById('shortcut-agendar').checked = false;
document.getElementById('shortcut-naoautorizada').checked = false;
document.getElementById('shortcut-pago').checked = false;
document.getElementById('agendar-fields').style.display = 'none';
document.querySelectorAll('.check-shortcut').forEach(function(l) { l.classList.remove('checked'); });
document.getElementById('modal-concluir').classList.add('open');
}
function toggleShortcut(name) {
var checkbox = document.getElementById('shortcut-' + name);
var label = checkbox.closest('.check-shortcut');
label.classList.toggle('checked', checkbox.checked);
if (name === 'agendar') {
document.getElementById('agendar-fields').style.display = checkbox.checked ? 'block' : 'none';
}
}
function confirmConcluir() {
var row = document.querySelector('[data-task-id="' + currentTaskId + '"]');
if (!row) { closeModal('modal-concluir'); return; }
var agendou = document.getElementById('shortcut-agendar').checked;
var naoAutorizada = document.getElementById('shortcut-naoautorizada').checked;
var pago = document.getElementById('shortcut-pago').checked;
var obs = document.getElementById('concluir-obs-text').value.trim();
var extras = [];
if (agendou) extras.push('<span style="color:var(--blue);"><i class="ti ti-calendar-event"></i> agendado na Agenda</span>');
if (naoAutorizada) extras.push('<span style="color:var(--terracotta);"><i class="ti ti-ban"></i> OS não autorizada</span>');
if (pago) extras.push('<span style="color:var(--green-mid);"><i class="ti ti-receipt"></i> lançado em Recibos e Notas</span>');
var nameEl = row.querySelector('.os-name').textContent;
var subEl = row.querySelector('.os-sub').textContent;
var doneRow = document.createElement('div');
doneRow.className = 'task-done-row';
doneRow.innerHTML =
'<div class="stock-icon" style="background:#DCEADF; color:var(--green-mid);"><i class="ti ti-check"></i></div>' +
'<div style="flex:1;"><p class="os-name">' + nameEl + '</p><p class="os-sub">' + subEl +
(obs ? ' · "' + obs + '"' : '') +
(extras.length ? ' · ' + extras.join(' · ') : '') +
'</p></div>' +
'<span class="done-badge">Concluído</span>';
document.getElementById('tasks-done').appendChild(doneRow);
document.getElementById('tasks-done-wrap').style.display = 'block';
row.remove();
closeModal('modal-concluir');
}
// ===== Novo Contrato: dados de exemplo =====
// cnpj só existe se o cliente foi cadastrado como Pessoa Jurídica — entra sozinho no contrato quando existir
var clientesContrato = [
{ nome: 'Carlos Eduardo Pires', cpf: '123.456.789-00', cnpj: '', tel: '(31) 99876-5432', end: 'Rua das Flores, 220, Centro, Viçosa-MG' },
{ nome: 'Carlos Eduardo Pires', cpf: '987.654.321-00', cnpj: '', tel: '(31) 98123-4455', end: 'Rua São José, 88, Santo Antônio, Viçosa-MG' },
{ nome: 'Wederson Candido de Oliveira', cpf: '456.789.123-00', cnpj: '', tel: '(31) 99012-3344', end: 'Av. Bueno Brandão, 12, Centro, Viçosa-MG' },
{ nome: 'ASS Engenharia & Construções LTDA', cpf: '', cnpj: '35.249.401/0001-64', tel: '(31) 3892-3012', end: 'Rua Presidente Tancredo Neves, 74 - Ap 604, Centro, Viçosa-MG' }
];
// indenizacao = valor que o Marcelo define pra cada equipamento (tela de cadastro de equipamento, a criar) — usado automaticamente no contrato
var equipContrato = [
{ nome: 'Betoneira 400L gasolina', disp: 3, precos: { 1: 130, 3: 290, 7: 325, 15: 410, 30: 495 }, indenizacao: 4200 },
{ nome: 'Martelo demolidor 15kg', disp: 2, precos: { 1: 90, 3: 210, 7: 245, 15: 320, 30: 390 }, indenizacao: 3800 },
{ nome: 'Andaime torre 1x1', disp: 7, precos: { 1: 60, 3: 150, 7: 180, 15: 230, 30: 300 }, indenizacao: 1900 },
{ nome: 'Gerador 10kva gasolina', disp: 3, precos: { 1: 150, 3: 330, 7: 380, 15: 470, 30: 560 }, indenizacao: 5600 }
];
// ===== Carrega clientes e equipamentos do banco (API); mantém o mock acima como fallback se a API falhar =====
function carregarBaseDados() {
fetch('/api/dados/clientes', { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (lista) {
if (!Array.isArray(lista) || !lista.length) return;
clientesBanco = lista;
clientesContrato.length = 0;
lista.forEach(function (c) {
clientesContrato.push({ nome: c.nome || '', cpf: c.cpf || '', cnpj: c.cnpj || '', tel: c.tel || '', end: c.endereco || '', _id: c._id });
});
if (typeof renderBaseClientes === 'function') renderBaseClientes();
})
.catch(function () {});
fetch('/api/dados/equipamentos', { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (lista) {
if (!Array.isArray(lista) || !lista.length) return;
equipContrato.length = 0;
lista.forEach(function (e) {
equipContrato.push({ nome: e.nome || '', disp: (e.quantidade != null ? e.quantidade : 0), precos: e.precos || {}, indenizacao: e.indenizacao || 0, _id: e._id });
});
})
.catch(function () {});
// Numeração persistente: próximo número = maior número já salvo no banco + 1
fetch('/api/dados/contratos', { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (lista) {
if (!Array.isArray(lista)) return;
var maxNum = 540;
lista.forEach(function (c) {
var n = parseInt(String(c.numero || '').split('-')[0], 10);
if (!isNaN(n) && n > maxNum) maxNum = n;
});
if (maxNum + 1 > ALUGUEMAQ_PROX_CONTRATO) ALUGUEMAQ_PROX_CONTRATO = maxNum + 1;
})
.catch(function () {});
}
carregarBaseDados();
renderContratosBanco();
renderProntasRetirada();
renderCaixaMeireBanco();
// ===== Caixa da Recepção: exibe os lançamentos do banco (movimentos_caixa) — os dois caixas veem os mesmos lançamentos =====
function renderCaixaMeireBanco() {
var list = document.getElementById('caixa-ledger-list');
if (!list) return;
fetch('/api/dados/movimentos_caixa', { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (movs) {
if (!Array.isArray(movs)) return;
Array.prototype.slice.call(list.querySelectorAll('.caixa-banco')).forEach(function (el) { el.remove(); });
movs.slice().reverse().forEach(function (m) {
var entrada = m.tipo !== 'saida';
var row = document.createElement('div');
row.className = 'ledger-row caixa-banco';
row.innerHTML = '<div class="ledger-icon ' + (entrada ? 'in' : 'out') + '"><i class="ti ' + (entrada ? 'ti-arrow-down-left' : 'ti-arrow-up-right') + '"></i></div>' +
'<div style="flex:1;"><p class="ledger-name">' + (m.descricao || 'Lançamento') + '</p><p class="ledger-sub">' + (m.origem ? m.origem + ' · ' : '') + 'do banco</p></div>' +
'<span class="ledger-val ' + (entrada ? 'in' : 'out') + '">' + (entrada ? '+ ' : '− ') + 'R$ ' + formatMoneyBR(Number(m.valor) || 0) + '</span>';
list.insertBefore(row, list.firstChild);
});
})
.catch(function () {});
}
// ===== Oficina -> Recepção: equipamentos prontos para retirada (lidos do banco) =====
function renderProntasRetirada() {
var box = document.getElementById('prontas-retirada-box');
if (!box) return;
fetch('/api/dados/ordens_servico', { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (lista) {
if (!Array.isArray(lista)) { box.innerHTML = ''; return; }
var prontas = lista.filter(function (o) { return o.status === 'pronto'; });
if (!prontas.length) { box.innerHTML = ''; return; }
box.innerHTML =
'<div style="background:#DCEADF; border:1px solid rgba(47,143,91,0.35); border-radius:14px; padding:14px 16px;">' +
'<p style="margin:0 0 8px; font-weight:700; color:#245239; font-size:13.5px;"><i class="ti ti-truck-delivery"></i> ' + prontas.length + ' equipamento' + (prontas.length === 1 ? '' : 's') + ' pronto' + (prontas.length === 1 ? '' : 's') + ' para retirada — ligar para o cliente</p>' +
prontas.map(function (o) {
return '<div style="font-size:13px; color:#245239; padding:3px 0;"><b>' + (o.equipamento || 'Equipamento') + '</b> — ' + (o.cliente || '') + ' <span style="color:var(--text-mute);">(OS #' + (o.numero || '') + ', vindo da Oficina)</span></div>';
}).join('') +
'</div>';
})
.catch(function () {});
}
// ===== Salvar novo cliente no banco (POST) =====
function salvarCliente() {
var ehPJ = document.getElementById('cliente-campos-pj').style.display !== 'none';
function v(id) { var el = document.getElementById(id); return el ? el.value.trim() : ''; }
var nome = ehPJ ? v('cliente-pj-razao') : v('cliente-pf-nome');
if (!nome) { alert('Informe o nome do cliente (ou a razão social).'); return; }
var rua = v('cliente-end-rua'), num = v('cliente-end-num'), bairro = v('cliente-end-bairro');
var endereco = [(rua + (num ? ', ' + num : '')).trim(), bairro].filter(Boolean).join(', ');
var dados = {
nome: nome,
cpf: ehPJ ? '' : v('cliente-pf-cpf'),
cnpj: ehPJ ? v('cliente-pj-cnpj') : '',
tel: ehPJ ? v('cliente-pj-tel-com') : v('cliente-tel'),
endereco: endereco,
tipo: ehPJ ? 'PJ' : 'PF',
documento: null
};
fetch('/api/dados/clientes', {
method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin',
body: JSON.stringify(dados)
})
.then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); })
.then(function (res) {
if (res.ok) { alert('Cliente salvo no banco de dados.'); carregarBaseDados(); }
else { alert('Não deu para salvar: ' + ((res.j && res.j.erro) || 'erro no servidor')); }
})
.catch(function () { alert('Sem conexão com o servidor. Tente de novo.'); });
}
var contratoEquipSelecionado = null;
var contratoClienteSelecionado = null;
function filterEstoqueEquip() {
var q = document.getElementById('estoque-equip-busca').value.toLowerCase().trim();
var rows = document.querySelectorAll('#estoque-equip-list .equip-row');
var visible = 0;
rows.forEach(function(row) {
var nome = (row.getAttribute('data-nome') || '').toLowerCase();
var show = q === '' || nome.includes(q);
row.style.display = show ? 'flex' : 'none';
if (show) visible++;
});
document.getElementById('estoque-equip-empty').style.display = (visible === 0) ? 'block' : 'none';
}
function verPrecosEquip(nome) {
var e = equipContrato.find(function(x) { return x.nome === nome; });
var precos = e ? e.precos : { 1: 130, 3: 290, 7: 325, 15: 410, 30: 495 };
var labels = [ ['1','Diária'], ['3','3 dias'], ['7','Semanal'], ['15','Quinzenal'], ['30','Mensal'] ];
document.getElementById('ep-titulo').textContent = nome;
document.getElementById('ep-lista').innerHTML = labels.map(function(l) {
return '<div class="detail-row"><span class="l">' + l[1] + '</span><span>R$ ' + precos[l[0]] + '</span></div>';
}).join('');
document.getElementById('modal-equip-precos').classList.add('open');
}
function imprimirTabelaEquipamentos() {
var labels = [ ['1','Diária'], ['3','3 dias'], ['7','Semanal'], ['15','Quinzenal'], ['30','Mensal'] ];
var logoSrc = contratoLogoSrc();
var linhas = equipContrato.map(function(e) {
return '<tr><td>' + e.nome + '</td>' + labels.map(function(l) { return '<td>R$ ' + e.precos[l[0]] + '</td>'; }).join('') + '</tr>';
}).join('');
var html =
'<html><head><meta charset="UTF-8"><title>Tabela de Equipamentos e Valores</title><style>' +
'body{font-family:Arial,Helvetica,sans-serif; padding:28px; color:#211D1A;}' +
'.head{display:flex; align-items:center; gap:12px; border-bottom:3px solid #1A1A1A; padding-bottom:14px; margin-bottom:18px;}' +
'.head img{width:42px; height:auto;} h1{font-size:20px; margin:0;} p{margin:2px 0 0; color:#6E6760; font-size:12.5px;}' +
'table{width:100%; border-collapse:collapse; font-size:13px;}' +
'th{background:#1A1A1A; color:#fff; text-align:left; padding:9px 10px;}' +
'td{padding:9px 10px; border-bottom:1px solid #E2DACD;}' +
'tr:nth-child(even) td{background:#F5F2ED;}' +
'.foot{margin-top:22px; font-size:11px; color:#A39B91;}' +
'</style></head><body>' +
'<div class="head">' + (logoSrc ? '<img src="' + logoSrc + '">' : '') + '<div><h1>Aluguemaq — Tabela de Equipamentos e Valores</h1><p>Preços por período de locação · atualizado hoje</p></div></div>' +
'<table><thead><tr><th>Equipamento</th>' + labels.map(function(l) { return '<th>' + l[1] + '</th>'; }).join('') + '</tr></thead><tbody>' + linhas + '</tbody></table>' +
'<p class="foot">Impresso por Meire — uso interno, para consulta rápida no balcão.</p>' +
'</body></html>';
var w = window.open('', '_blank');
if (!w) {
alert('O navegador bloqueou a janela de impressão.\n\nProcure o aviso de "pop-up bloqueado" perto da barra de endereço, clique nele e escolha "Sempre permitir". Depois clique em imprimir de novo.');
return;
}
w.document.write(html);
w.document.close();
w.focus();
setTimeout(function() { w.print(); }, 300);
}
function filterClienteContrato() {
var q = document.getElementById('contrato-cliente-busca').value.toLowerCase().trim();
var box = document.getElementById('contrato-cliente-results');
box.innerHTML = '';
var confirmBox = document.getElementById('contrato-cliente-confirm');
confirmBox.style.display = 'none';
confirmBox.innerHTML = '';
if (q === '') { box.classList.add('empty'); return; }
var matches = clientesContrato.filter(function(c) { return c.nome.toLowerCase().includes(q); });
if (matches.length === 0) { box.classList.add('empty'); return; }
box.classList.remove('empty');
matches.forEach(function(c) {
var item = document.createElement('div');
item.className = 'os-search-item';
item.onclick = function() { selectClienteContrato(c); };
item.innerHTML = '<span class="name">' + c.nome + '</span><span class="tag open">CPF ' + c.cpf.slice(-6) + '</span>';
box.appendChild(item);
});
if (matches.length > 1) {
var warn = document.createElement('div');
warn.style.cssText = 'font-size:11.5px; color:var(--terracotta); padding:4px 6px;';
warn.innerHTML = '<i class="ti ti-alert-triangle"></i> ' + matches.length + ' clientes com esse nome — confira o CPF antes de continuar';
box.appendChild(warn);
}
}
function selectClienteContrato(c) {
contratoClienteSelecionado = c;
document.getElementById('contrato-cliente-busca').value = c.nome;
document.getElementById('contrato-cliente-results').innerHTML = '';
document.getElementById('contrato-cliente-results').classList.add('empty');
var confirmBox = document.getElementById('contrato-cliente-confirm');
confirmBox.style.display = 'flex';
confirmBox.innerHTML =
'<i class="ti ti-id"></i>' +
'<div style="flex:1; display:grid; grid-template-columns: 1fr 1fr; gap:4px 14px; font-size:12.5px; color:#2F5A3D;">' +
(c.cnpj ? '<div><span class="b" style="display:block;">CNPJ</span>' + c.cnpj + '</div>' : '<div><span class="b" style="display:block;">CPF</span>' + c.cpf + '</div>') +
'<div><span class="b" style="display:block;">Telefone</span>' + c.tel + '</div>' +
'<div style="grid-column:1/-1;"><span class="b" style="display:block;">Endereço</span>' + c.end + '</div>' +
'</div>';
}
function filterEquipContrato() {
var q = document.getElementById('contrato-equip-busca').value.toLowerCase().trim();
var box = document.getElementById('contrato-equip-results');
var dispNote = document.getElementById('contrato-equip-disp');
box.innerHTML = '';
dispNote.textContent = '';
if (q === '') { box.classList.add('empty'); return; }
var matches = equipContrato.filter(function(e) { return e.nome.toLowerCase().includes(q); });
box.classList.toggle('empty', matches.length === 0);
matches.forEach(function(e) {
var item = document.createElement('div');
item.className = 'os-search-item';
item.onclick = function() {
document.getElementById('contrato-equip-busca').value = e.nome;
box.innerHTML = ''; box.classList.add('empty');
dispNote.textContent = e.disp + ' unidades disponíveis agora';
contratoEquipSelecionado = e;
recalcContrato();
};
item.innerHTML = '<span class="name">' + e.nome + '</span><span class="tag done">' + e.disp + ' disponíveis</span>';
box.appendChild(item);
});
}
function recalcContrato() {
var dias = parseInt(document.getElementById('contrato-periodo').value, 10);
var hoje = new Date(2026, 5, 23); // 23/06/2026, data fixa de referência do protótipo
var devolucao = new Date(hoje);
devolucao.setDate(devolucao.getDate() + dias);
var dd = String(devolucao.getDate()).padStart(2, '0');
var mm = String(devolucao.getMonth() + 1).padStart(2, '0');
var yyyy = devolucao.getFullYear();
document.getElementById('contrato-devolucao').value = dd + '/' + mm + '/' + yyyy;
var precosPadrao = { 1: 130, 3: 290, 7: 325, 15: 410, 30: 495 };
var precos = (contratoEquipSelecionado && contratoEquipSelecionado.precos) ? contratoEquipSelecionado.precos : precosPadrao;
var labels = { 1: 'Diária', 3: '3 dias', 7: 'Semanal', 15: 'Quinzenal', 30: 'Mensal' };
[1,3,7,15,30].forEach(function(p) {
var opt = document.getElementById('opt-periodo-' + p);
if (opt) opt.textContent = labels[p] + ' — R$ ' + precos[p];
});
document.getElementById('contrato-valor').value = precos[dias] || 290;
document.getElementById('contrato-valor-display').textContent = 'R$ ' + (precos[dias] || 290);
}
// ===== Contratos salvos no banco: salvar, listar, ver e dar baixa =====
var contratosBanco = [];
function salvarContratoNoBanco(dados) {
fetch('/api/dados/contratos', {
method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin',
body: JSON.stringify(dados)
}).then(function (r) { if (r.ok && typeof renderContratosBanco === 'function') renderContratosBanco(); })
.catch(function () {});
}
function renderContratosBanco() {
fetch('/api/dados/contratos', { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (lista) {
if (!Array.isArray(lista)) return;
contratosBanco = lista;
var list = document.querySelector('#ativos-tab-ativos .os-list');
if (!list) return;
Array.prototype.slice.call(list.querySelectorAll('.contrato-banco')).forEach(function (el) { el.remove(); });
lista.slice().reverse().forEach(function (c) {
var row = document.createElement('div');
row.className = 'os-row contrato-banco';
var tag = c.pago
? '<span class="os-tag open">' + (c.formaPagamento || 'Pago') + ' pago</span>'
: '<span class="os-tag" style="background:var(--red-soft); color:var(--red);">Prazo</span>';
row.innerHTML = tag +
'<div style="flex:1;"><p class="os-name">Nº ' + (c.numero || '') + ' · ' + (c.cliente || '') + ' — ' + (c.equipamento || '') + '</p>' +
'<p class="os-sub">Devolução prevista ' + (c.devolucao || '—') + '</p></div>' +
'<button class="btn" onclick="verContratoBanco(\'' + c._id + '\')"><i class="ti ti-file-text"></i> Ver Contrato</button>' +
'<button class="btn primary" onclick="darBaixaContratoBanco(this.closest(\'.os-row\'), \'' + c._id + '\')">Dar baixa</button>';
list.insertBefore(row, list.firstChild);
});
})
.catch(function () {});
}
function verContratoBanco(id) {
var c = contratosBanco.find(function (x) { return String(x._id) === String(id); });
if (c) imprimirContratoDados(c);
}
function darBaixaContratoBanco(rowEl, id) {
var c = contratosBanco.find(function (x) { return String(x._id) === String(id); });
if (c) openBaixaModal(rowEl, c.cliente || '', c.equipamento || '', Number(c.valor) || 0, !!c.pago);
}
// Reimprime um contrato (2 vias) a partir dos dados salvos no banco
function imprimirContratoDados(d) {
var valor = Number(d.valor) || 0;
var indenizacao = Number(d.indenizacao) || 0;
var cliente = d.cliente || '';
var equip = d.equipamento || '';
var cnpj = d.cnpj || '';
var endereco = d.endereco || '';
var obra = d.obra || '';
var obs = d.obs || '';
var numero = d.numero || '';
var inicioBR = '';
if (d.criadoEm) {
var dt = new Date(d.criadoEm);
if (!isNaN(dt.getTime())) inicioBR = String(dt.getDate()).padStart(2, '0') + '/' + String(dt.getMonth() + 1).padStart(2, '0') + '/' + dt.getFullYear();
}
var terminoBR = d.devolucao || '';
var quadroA =
'<div class="gr">' +
'<div class="full"><span class="lb">Locadora</span><span class="vl">Marcelo Ricardo Piccolo — CNPJ 03.891.294/0001-87 — Av. Joaquim Lopes de Faria, 361, Santo Antônio, Viçosa-MG</span></div>' +
'<div class="full"><span class="lb">Locatário</span><span class="vl">' + cliente + (cnpj ? ' — CNPJ ' + cnpj : '') + '</span></div>' +
(endereco ? '<div class="full"><span class="lb">Endereço</span><span class="vl">' + endereco + '</span></div>' : '') +
(obra ? '<div class="full"><span class="lb">Local da obra/evento</span><span class="vl">' + obra + '</span></div>' : '') +
'</div>';
var quadroB =
'<div class="gr">' +
'<div class="full"><span class="lb">Equipamento</span><span class="vl">' + equip + '</span></div>' +
'<div><span class="lb">Valor de locação</span><span class="vl">R$ ' + valor.toLocaleString('pt-BR', { minimumFractionDigits: 2 }) + '</span></div>' +
'<div><span class="lb">Valor de indenização</span><span class="vl">' + (indenizacao > 0 ? 'R$ ' + indenizacao.toLocaleString('pt-BR', { minimumFractionDigits: 2 }) : 'conforme tabela vigente') + '</span></div>' +
'<div><span class="lb">Início do período</span><span class="vl">' + inicioBR + '</span></div>' +
'<div><span class="lb">Término previsto</span><span class="vl">' + terminoBR + '</span></div>' +
'</div>';
var body =
'<p style="text-align:center; font-weight:700; font-size:10.5pt; margin:0 0 8px;">Contrato de Locação de Bens Móveis Nº ' + numero + '</p>' +
quadroA + quadroB +
(obs ? '<div class="pb"><p><b>Observações do atendimento:</b> ' + obs + '</p></div>' : '') +
'<div class="pb"><p style="font-weight:700; margin:0 0 4px;">Cláusulas e Condições</p>' +
'<p>1º. Condições de renovação: não ocorrendo a devolução dos equipamentos até o último dia de vigência do prazo de locação, este contrato está automaticamente renovado por igual período, emitindo-se nova fatura. A Locadora reserva-se o direito de não renovar o contrato caso haja alguma cláusula não integralmente cumprida, incluindo-se a inadimplência dos pagamentos das faturas, exigindo-se a devolução imediata dos bens locados.</p>' +
'<p>2º. Reposição dos bens: em caso de extravio, furto, roubo ou qualquer outro evento que impossibilite a devolução dos bens locados, a Locatária pagará à Locadora o valor de mercado dos bens faltantes, sendo que a locação será cobrada até a efetiva comprovação deste pagamento.</p>' +
'<p>3º. Manutenção do equipamento: correrá por conta da Locatária toda e qualquer despesa necessária à manutenção dos objetos locados, assim como as despesas de transporte de envio e posterior devolução.</p>' +
'<p>4º. Fica eleito o foro da comarca de Viçosa-MG como competente para dirimir quaisquer dúvidas oriundas deste contrato.</p></div>' +
'<div class="ft"><span>Emitido por: <b>Meire</b></span><span>Locação de bens móveis — operação NÃO sujeita ao ISS, conforme Lei Complementar nº 116/2003.</span></div>' +
'<div class="sgrow">' +
'<div class="sg"><div class="ln"></div><p>assinatura — Locadora</p></div>' +
'<div class="sg"><div class="ln"></div><p>assinatura — ' + cliente + '</p></div>' +
'</div>';
var titulo = equip;
var halves =
buildHalfSheetHTML(titulo, 'Contrato de locação Nº ' + numero, '1ª via — Empresa', body, contratoLogoSrc()) +
buildHalfSheetHTML(titulo, 'Contrato de locação Nº ' + numero, '2ª via — Cliente', body, contratoLogoSrc());
openPrintWindow(titulo, halves);
}
function gerarContrato() {
var cliente = document.getElementById('contrato-cliente-busca').value.trim() || 'Cliente não informado';
var equip = document.getElementById('contrato-equip-busca').value.trim() || 'Equipamento não informado';
var valor = parseFloat(document.getElementById('contrato-valor').value) || 0;
var devolucao = document.getElementById('contrato-devolucao').value;
var payEl = document.querySelector('#meire-m-contrato .pay-grid .pay-opt.selected');
var forma = payEl ? payEl.textContent.trim() : 'PIX';
var numero = proximoNumeroContrato();
var jaPago = (forma !== 'Prazo');
// CNPJ e endereço vêm do cadastro do cliente selecionado acima (não precisa digitar de novo)
var cnpj = (contratoClienteSelecionado && contratoClienteSelecionado.cnpj) ? contratoClienteSelecionado.cnpj : '';
var endereco = (contratoClienteSelecionado && contratoClienteSelecionado.end) ? contratoClienteSelecionado.end : '';
// Local da obra: se o cliente escolheu "Outro endereço" na entrega, usa esse; senão é o próprio endereço do cliente
var enderecoEntregaInput = document.getElementById('entrega-endereco-input');
var obraOutro = (enderecoEntregaInput && !enderecoEntregaInput.disabled) ? enderecoEntregaInput.value.trim() : '';
var obra = obraOutro || '';
// Valor de indenização vem do cadastro do equipamento (definido pelo Marcelo no estoque)
var indenizacao = (contratoEquipSelecionado && contratoEquipSelecionado.indenizacao) ? contratoEquipSelecionado.indenizacao : 0;
var obs = (document.getElementById('contrato-obs') || {}).value.trim();
var list = document.querySelector('#ativos-tab-ativos .os-list');
var row = document.createElement('div');
row.className = 'os-row';
var tagHTML = jaPago ? '<span class="os-tag open">' + forma + ' pago</span>' : '<span class="os-tag" style="background:var(--red-soft); color:var(--red);">Prazo</span>';
row.innerHTML = tagHTML +
'<div style="flex:1;"><p class="os-name">' + cliente + ' — ' + equip + '</p><p class="os-sub">Devolução prevista ' + devolucao + '</p></div>' +
'<button class="btn primary" onclick="openBaixaModal(this.closest(\'.os-row\'), \'' + cliente + '\', \'' + equip + '\', ' + valor + ', ' + jaPago + ')">Dar baixa</button>';
list.appendChild(row);
if (jaPago) {
lancarNoCaixa('Loc. ' + equip + ' — ' + cliente, valor, forma);
} else {
adicionarPendenciaAtivos(cliente, equip, valor);
}
// Persiste o contrato no banco de dados
salvarContratoNoBanco({
numero: numero,
cliente: cliente,
cnpj: cnpj,
endereco: endereco,
equipamento: equip,
valor: valor,
devolucao: devolucao,
formaPagamento: forma,
pago: jaPago,
indenizacao: indenizacao,
obra: obra,
obs: obs
});
// ----- Monta e já abre o contrato impresso, no modelo real da Aluguemaq -----
var agora = new Date();
var inicioBR = String(agora.getDate()).padStart(2,'0') + '/' + String(agora.getMonth()+1).padStart(2,'0') + '/' + agora.getFullYear() + ' ' + String(agora.getHours()).padStart(2,'0') + ':' + String(agora.getMinutes()).padStart(2,'0');
var terminoBR = devolucao + ' ' + String(agora.getHours()).padStart(2,'0') + ':' + String(agora.getMinutes()).padStart(2,'0');
var quadroA =
'<div class="gr">' +
'<div class="full"><span class="lb">Locadora</span><span class="vl">Marcelo Ricardo Piccolo — CNPJ 03.891.294/0001-87 — Av. Joaquim Lopes de Faria, 361, Santo Antônio, Viçosa-MG</span></div>' +
'<div class="full"><span class="lb">Locatário</span><span class="vl">' + cliente + (cnpj ? ' — CNPJ ' + cnpj : '') + '</span></div>' +
(endereco ? '<div class="full"><span class="lb">Endereço</span><span class="vl">' + endereco + '</span></div>' : '') +
(obra ? '<div class="full"><span class="lb">Local da obra/evento</span><span class="vl">' + obra + '</span></div>' : '') +
'</div>';
var quadroB =
'<div class="gr">' +
'<div class="full"><span class="lb">Equipamento</span><span class="vl">' + equip + '</span></div>' +
'<div><span class="lb">Valor de locação</span><span class="vl">R$ ' + valor.toLocaleString('pt-BR',{minimumFractionDigits:2}) + '</span></div>' +
'<div><span class="lb">Valor de indenização</span><span class="vl">' + (indenizacao > 0 ? 'R$ ' + indenizacao.toLocaleString('pt-BR',{minimumFractionDigits:2}) : 'conforme tabela vigente') + '</span></div>' +
'<div><span class="lb">Início do período</span><span class="vl">' + inicioBR + '</span></div>' +
'<div><span class="lb">Término previsto</span><span class="vl">' + terminoBR + '</span></div>' +
'</div>';
var body =
'<p style="text-align:center; font-weight:700; font-size:10.5pt; margin:0 0 8px;">Contrato de Locação de Bens Móveis Nº ' + numero + '</p>' +
quadroA + quadroB +
(obs ? '<div class="pb"><p><b>Observações do atendimento:</b> ' + obs + '</p></div>' : '') +
'<div class="pb"><p style="font-weight:700; margin:0 0 4px;">Cláusulas e Condições</p>' +
'<p>1º. Condições de renovação: não ocorrendo a devolução dos equipamentos até o último dia de vigência do prazo de locação, este contrato está automaticamente renovado por igual período, emitindo-se nova fatura. A Locadora reserva-se o direito de não renovar o contrato caso haja alguma cláusula não integralmente cumprida, incluindo-se a inadimplência dos pagamentos das faturas, exigindo-se a devolução imediata dos bens locados.</p>' +
'<p>2º. Reposição dos bens: em caso de extravio, furto, roubo ou qualquer outro evento que impossibilite a devolução dos bens locados, a Locatária pagará à Locadora o valor de mercado dos bens faltantes, sendo que a locação será cobrada até a efetiva comprovação deste pagamento.</p>' +
'<p>3º. Manutenção do equipamento: correrá por conta da Locatária toda e qualquer despesa necessária à manutenção dos objetos locados, assim como as despesas de transporte de envio e posterior devolução.</p>' +
'<p>4º. Fica eleito o foro da comarca de Viçosa-MG como competente para dirimir quaisquer dúvidas oriundas deste contrato.</p></div>' +
'<div class="ft"><span>Emitido por: <b>Meire</b></span><span>Locação de bens móveis — operação NÃO sujeita ao ISS, conforme Lei Complementar nº 116/2003.</span></div>' +
'<div class="sgrow">' +
'<div class="sg"><div class="ln"></div><p>assinatura — Locadora</p></div>' +
'<div class="sg"><div class="ln"></div><p>assinatura — ' + cliente + '</p></div>' +
'</div>';
var titulo = equip;
var halves =
buildHalfSheetHTML(titulo, 'Contrato de locação Nº ' + numero, '1ª via — Empresa', body, contratoLogoSrc()) +
buildHalfSheetHTML(titulo, 'Contrato de locação Nº ' + numero, '2ª via — Cliente', body, contratoLogoSrc());
document.getElementById('vc-titulo').textContent = 'Contrato ' + numero;
document.getElementById('vc-cliente').textContent = cliente + ' — ' + equip;
var banner = document.getElementById('vc-status-banner');
if (jaPago) {
banner.className = 'status-banner-mini ok';
banner.innerHTML = '<i class="ti ti-circle-check"></i> Pago (' + forma + ') — lançado no Caixa';
} else {
banner.className = 'status-banner-mini pending';
banner.innerHTML = '<i class="ti ti-clock"></i> Pagamento a prazo — pendente';
}
openPrintWindow(titulo, halves);
showToast('Contrato ' + numero + ' gerado, impresso (2 vias) e estoque baixado');
}
function setRetirada(el, tipo) {
el.parentElement.querySelectorAll('.toggle-opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
document.getElementById('entrega-endereco-fields').style.display = (tipo === 'aluguemaq') ? 'block' : 'none';
if (tipo === 'aluguemaq') {
var cadastradoOpt = document.querySelector('#entrega-endereco-fields .toggle-opt[onclick*="cadastrado"]');
if (cadastradoOpt) { setEnderecoEntrega(cadastradoOpt, 'cadastrado'); }
}
}
function setEnderecoEntrega(el, tipo) {
el.parentElement.querySelectorAll('.toggle-opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
var input = document.getElementById('entrega-endereco-input');
if (tipo === 'cadastrado') {
input.value = 'Rua das Flores, 220, Centro, Viçosa-MG';
input.disabled = true;
} else {
input.value = '';
input.disabled = false;
input.placeholder = 'Digite o endereço de entrega (ex: endereço da obra)';
input.focus();
}
}
document.querySelectorAll('.pay-opt, .toggle-opt').forEach(function(el) {
if (el.closest('#entrega-endereco-fields') || el.parentElement.querySelector('[onclick*="setRetirada"]') || el.parentElement.querySelector('[onclick*="setEnderecoEntrega"]')) return;
el.addEventListener('click', function() {
el.parentElement.querySelectorAll('.pay-opt, .toggle-opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
});
});
function showPV(profile, viewId, btn) {
document.querySelectorAll('#shell-meire .page-view').forEach(function(v) { v.classList.remove('active'); });
document.getElementById(profile + '-' + viewId).classList.add('active');
document.querySelectorAll('#shell-meire .nav-item').forEach(function(n) { n.classList.remove('active'); });
if (btn) btn.classList.add('active');
if (btn && document.getElementById('nav-more-group') && document.getElementById('nav-more-group').contains(btn)) {
expandNavMore();
}
}
function toggleNavMore() {
var group = document.getElementById('nav-more-group');
if (group.classList.contains('expanded')) { collapseNavMore(); } else { expandNavMore(); }
}
function expandNavMore() {
document.getElementById('nav-more-group').classList.add('expanded');
document.getElementById('nav-more-toggle').classList.add('expanded');
document.getElementById('nav-more-label').textContent = 'Menos opções';
}
function collapseNavMore() {
document.getElementById('nav-more-group').classList.remove('expanded');
document.getElementById('nav-more-toggle').classList.remove('expanded');
document.getElementById('nav-more-label').textContent = 'Mais opções';
}
var currentHistTab = 'todos';
function setAtivosTab(btn, tab) {
document.getElementById('ativos-tab-btn-ativos').classList.remove('active');
document.getElementById('ativos-tab-btn-pendencias').classList.remove('active');
btn.classList.add('active');
document.getElementById('ativos-tab-ativos').style.display = (tab === 'ativos') ? 'block' : 'none';
document.getElementById('ativos-tab-pendencias').style.display = (tab === 'pendencias') ? 'block' : 'none';
}
function setHistTab(btn, tab) {
document.querySelectorAll('.hist-tab').forEach(function(t) { t.classList.remove('active'); });
btn.classList.add('active');
currentHistTab = tab;
document.getElementById('hist-list-todos').style.display = (tab === 'cliente') ? 'none' : 'block';
document.getElementById('hist-list-cliente').style.display = (tab === 'cliente') ? 'block' : 'none';
if (tab === 'cliente') {
document.getElementById('hist-result-note').innerHTML = 'Mostrando <strong>1</strong> cliente com histórico';
return;
}
filterHistorico();
}
var histDataFiltro = '';
function openHistDatePicker() {
var input = document.getElementById('hist-data-input');
if (input.showPicker) { input.showPicker(); } else { input.focus(); input.click(); }
}
function onHistDataChange() {
var val = document.getElementById('hist-data-input').value; // yyyy-mm-dd
histDataFiltro = val || '';
if (val) {
var parts = val.split('-');
var d = new Date(parseInt(parts[0],10), parseInt(parts[1],10)-1, parseInt(parts[2],10));
var meses = ['jan','fev','mar','abr','mai','jun','jul','ago','set','out','nov','dez'];
document.getElementById('hist-filtro-data-label').textContent = d.getDate() + ' ' + meses[d.getMonth()] + ' de ' + d.getFullYear();
document.getElementById('hist-data-clear').style.display = 'inline-flex';
showDiaInfoModal(document.getElementById('hist-filtro-data-label').textContent, val);
}
filterHistorico();
}
function clearHistDataFilter() {
histDataFiltro = '';
document.getElementById('hist-data-input').value = '';
document.getElementById('hist-filtro-data-label').textContent = 'Filtrar período';
document.getElementById('hist-data-clear').style.display = 'none';
filterHistorico();
}
function filterHistorico() {
var query = document.getElementById('hist-search-field').value.toLowerCase().trim();
var rows = document.querySelectorAll('#hist-list-todos .hist-row-full');
var visibleCount = 0;
rows.forEach(function(row) {
var type = row.getAttribute('data-type');
var client = row.getAttribute('data-client') || '';
var date = row.getAttribute('data-date') || '';
var text = row.textContent.toLowerCase();
var matchesTab = (currentHistTab === 'todos') || (type === currentHistTab);
var matchesQuery = (query === '') || text.includes(query) || client.includes(query);
var matchesData = (histDataFiltro === '') || (date === histDataFiltro);
var show = matchesTab && matchesQuery && matchesData;
row.style.display = show ? 'block' : 'none';
if (show) visibleCount++;
});
document.getElementById('hist-result-note').innerHTML = 'Mostrando <strong>' + visibleCount + '</strong> registros — do mais recente ao mais antigo';
}
function setChatMode(el, mode) {
document.querySelectorAll('.chat-toggle .opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
var field = document.getElementById('chat-input-field');
field.placeholder = mode === 'people' ? 'Escreva uma mensagem...' : 'Pergunte algo, ex: quantas betoneiras estão livres?';
field.dataset.mode = mode;
}
function sendChat() {
var field = document.getElementById('chat-input-field');
var text = field.value.trim();
if (!text) return;
var msgs = document.getElementById('chat-msgs');
var me = document.createElement('div');
me.className = 'msg me';
me.innerHTML = text + '<div class="msg-meta">Você · agora</div>';
msgs.appendChild(me);
field.value = '';
var mode = field.dataset.mode || 'people';
setTimeout(function() {
var reply = document.createElement('div');
if (mode === 'system') {
reply.className = 'msg system';
reply.innerHTML = 'Você tem 5 betoneiras livres agora — 3 no modelo gasolina e 2 elétricas.<div class="msg-meta">Sistema · agora</div>';
} else {
reply.className = 'msg them';
reply.innerHTML = 'Recebido, já te respondo!<div class="msg-meta">Marcelo · agora</div>';
}
msgs.appendChild(reply);
msgs.scrollTop = msgs.scrollHeight;
}, 600);
msgs.scrollTop = msgs.scrollHeight;
}
var chatField = document.getElementById('chat-input-field');
if (chatField) chatField.addEventListener('keypress', function(e) { if (e.key === 'Enter') sendChat(); });
// ===== Datas reais (=hoje) no Painel do Dia e no Caixa =====
(function initDatasReaisMeire() {
var d = new Date();
var diasSemana = ['domingo','segunda','terça','quarta','quinta','sexta','sábado'];
var meses = ['janeiro','fevereiro','março','abril','maio','junho','julho','agosto','setembro','outubro','novembro','dezembro'];
var label = diasSemana[d.getDay()] + ', ' + d.getDate() + ' de ' + meses[d.getMonth()];
var iso = CAIXA_HOJE_ISO;
[['painel-data-label','painel-data-input'], ['caixa-data-label','caixa-data-input']].forEach(function(par) {
var lbl = document.getElementById(par[0]);
var inp = document.getElementById(par[1]);
if (lbl) lbl.textContent = label;
if (inp) { inp.value = iso; inp.max = iso; }
});
})();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Aluguemaq — Oficina</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.1.0/dist/tabler-icons.min.css">
<style>
:root{
--bg-app: #F5F2ED;
--bg-sidebar: #1A1A1A;
--bg-card: #FFFFFF;
--bg-soft: #EFEAE2;
--green-deep: #1A1A1A;
--green-mid: #E85A28;
--green-accent: #F1612A;
--terracotta: #E85A28;
--terracotta-soft: #FBE2D5;
--amber: #C98A2B;
--amber-soft: #F5E6C8;
--red: #B23A32;
--red-soft: #F4D9D6;
--good: #2F8F5B;
--good-soft: #DCEADF;
--blue: #2C5A8A;
--blue-soft: #DDE7F2;
--text-main: #211D1A;
--text-mute: #6E6760;
--text-faint: #A39B91;
--border: #E2DACD;
--radius-card: 14px;
--radius-pill: 999px;
--font-display: 'Source Serif 4', Georgia, serif;
--font-body: 'Inter', -apple-system, sans-serif;
}
* { box-sizing: border-box; }
body { margin: 0; font-family: var(--font-body); background: var(--bg-app); color: var(--text-main); }
.shell { display: flex; min-height: 100vh; }
.sidebar { width: 234px; background: var(--bg-sidebar); color: #E9E7DE; padding: 24px 16px; display: flex; flex-direction: column; flex-shrink: 0; }
.brand { display: flex; align-items: center; gap: 10px; padding: 0 8px 22px; margin-bottom: 14px; border-bottom: 1px solid rgba(255,255,255,0.1); }
.brand-mark { width: 34px; height: 34px; border-radius: 9px; background: var(--terracotta); display: flex; align-items: center; justify-content: center; font-family: var(--font-display); font-size: 18px; color: #fff; flex-shrink: 0; }
.brand-name { font-family: var(--font-display); font-size: 15px; line-height: 1.25; }
.brand-name span { display: block; font-family: var(--font-body); font-size: 11px; color: #9CA89E; margin-top: 1px; }
.nav-group-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: #7E8A7F; padding: 14px 12px 6px; }
.nav-item { display: flex; align-items: center; gap: 11px; padding: 10px 12px; border-radius: 9px; font-size: 14px; color: #CFD3C7; cursor: pointer; border: none; background: transparent; width: 100%; text-align: left; font-family: var(--font-body); }
.nav-item i { font-size: 18px; flex-shrink: 0; }
.nav-item:hover { background: rgba(255,255,255,0.06); color: #fff; }
.nav-item.active { background: var(--green-mid); color: #fff; }
.nav-badge { margin-left: auto; background: var(--terracotta); color: #fff; font-size: 11px; padding: 1px 7px; border-radius: var(--radius-pill); }
.sidebar-footer { margin-top: auto; padding: 12px; display: flex; align-items: center; gap: 10px; border-top: 1px solid rgba(255,255,255,0.1); padding-top: 16px; }
.avatar-mini { width: 32px; height: 32px; border-radius: 50%; background: var(--amber); display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 600; color: #3A2A0A; flex-shrink: 0; }
.sidebar-footer .name { font-size: 13px; color: #fff; }
.sidebar-footer .role { font-size: 11px; color: #9CA89E; }
.main { flex: 1; padding: 28px 36px 48px; max-width: 1040px; }
.topbar { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 26px; }
.page-title { font-family: var(--font-display); font-size: 26px; margin: 0 0 4px; }
.page-sub { font-size: 13.5px; color: var(--text-mute); margin: 0; }
.today-pill { font-size: 12px; color: var(--text-mute); background: var(--bg-card); border: 1px solid var(--border); padding: 7px 14px; border-radius: var(--radius-pill); white-space: nowrap; }
.view { display: none; }
.view.active { display: block; }
.toolbar { display: flex; gap: 10px; margin-bottom: 16px; }
.toolbar input { flex: 1; }
.seg-control { display: flex; background: var(--bg-soft); border-radius: var(--radius-pill); padding: 3px; gap: 2px; }
.seg-opt { padding: 8px 16px; border-radius: var(--radius-pill); cursor: pointer; color: var(--text-mute); font-weight: 500; font-size: 13px; white-space: nowrap; }
.seg-opt.selected { background: var(--green-deep); color: #fff; }
.start-here-banner { display: flex; align-items: center; gap: 10px; background: var(--terracotta); color: #fff; border-radius: 12px; padding: 12px 16px; margin-bottom: 14px; font-size: 13.5px; font-weight: 700; }
.start-here-banner i { font-size: 18px; }
.os-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 22px; }
.os-row { display: flex; align-items: center; gap: 14px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 13px 16px; cursor: pointer; position: relative; }
.os-row:hover { border-color: var(--green-accent); }
.os-row.late { border-color: var(--red); }
.os-row.first-up { border: 2px solid var(--terracotta); }
.os-row.denied { border-color: var(--red); background: var(--red-soft); }
.os-row.internal { border-color: var(--blue); background: var(--blue-soft); }
.first-up-pin { position: absolute; top: -10px; left: 14px; background: var(--terracotta); color: #fff; font-size: 10.5px; font-weight: 700; padding: 3px 10px; border-radius: var(--radius-pill); display: flex; align-items: center; gap: 5px; }
.os-tag { font-size: 11px; font-weight: 600; padding: 3px 9px; border-radius: var(--radius-pill); white-space: nowrap; }
.os-tag.open { background: var(--bg-soft); color: var(--text-mute); }
.os-tag.toiniciar { background: var(--good-soft); color: var(--good); }
.os-tag.progress { background: var(--blue-soft); color: var(--blue); }
.os-tag.wait { background: var(--terracotta-soft); color: var(--terracotta); }
.os-tag.done { background: var(--good-soft); color: var(--good); }
.os-tag.denied { background: var(--red); color: #fff; }
.os-tag.internal { background: var(--blue); color: #fff; }
.btn-ready-inline { background: var(--good); border: none; color: #fff; font-weight: 700; font-size: 12px; padding: 9px 14px; border-radius: var(--radius-pill); cursor: pointer; display: flex; align-items: center; gap: 6px; margin-left: auto; white-space: nowrap; }
.btn-ready-inline:hover { background: #267a4c; }
.os-num { font-size: 12px; color: var(--text-faint); width: 50px; flex-shrink: 0; }
.os-name { font-size: 14px; font-weight: 600; margin: 0; }
.os-sub { font-size: 12px; color: var(--text-mute); margin: 1px 0 0; }
.os-right { margin-left: auto; }
.os-detail-grid { display: grid; grid-template-columns: 1.3fr 1fr; gap: 20px; align-items: start; }
.few-table { width: 100%; border-collapse: collapse; font-size: 13px; margin-top: 4px; }
.few-table th { text-align: left; font-size: 11px; color: var(--text-faint); text-transform: uppercase; letter-spacing: 0.03em; padding: 0 10px 8px; font-weight: 600; border-bottom: 1px solid var(--border); }
.few-table th.num, .few-table td.num { text-align: right; }
.few-table td { padding: 11px 10px; border-bottom: 1px solid var(--border); }
.few-table tbody tr:hover { background: var(--bg-soft); }
.os-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 22px 24px; }
.os-card-head { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 4px; }
.os-card-num { font-size: 12px; color: var(--text-faint); }
.os-card-status { font-size: 11px; font-weight: 600; padding: 3px 10px; border-radius: var(--radius-pill); }
.os-card-status.open { background: var(--bg-soft); color: var(--text-mute); }
.os-card-status.progress { background: var(--blue-soft); color: var(--blue); }
.os-card-status.wait { background: var(--terracotta-soft); color: var(--terracotta); }
.os-card-status.done { background: var(--good-soft); color: var(--good); }
.os-card-status.denied { background: var(--red); color: #fff; }
.os-card-status.internal { background: var(--blue); color: #fff; }
.os-card-equip { font-family: var(--font-display); font-size: 19px; margin: 6px 0 1px; }
.os-card-client { font-size: 13px; color: var(--text-mute); margin: 0; }
.os-card-problem { font-size: 12.5px; color: var(--text-mute); margin: 10px 0 0; background: var(--bg-soft); padding: 9px 11px; border-radius: 9px; }
.denied-banner { display: flex; gap: 12px; align-items: flex-start; background: var(--red-soft); border-radius: 12px; padding: 16px 18px; margin-bottom: 18px; }
.denied-banner i { font-size: 24px; color: var(--red); flex-shrink: 0; margin-top: 1px; }
.denied-banner b { display: block; font-size: 15px; color: #7A2A24; margin-bottom: 4px; }
.denied-banner span { font-size: 13px; color: #7A2A24; line-height: 1.5; }
.ready-btn { width: 100%; padding: 16px; border-radius: 12px; border: none; background: var(--good); color: #fff; font-weight: 700; font-size: 15px; display: flex; align-items: center; justify-content: center; gap: 8px; margin-top: 18px; cursor: pointer; }
.field-row { margin: 16px 0 0; }
.field-label { font-size: 12px; color: var(--text-mute); display: block; margin-bottom: 5px; font-weight: 600; }
select, textarea, input[type=text] { width: 100%; padding: 9px 11px; border-radius: 8px; border: 1px solid var(--border); font-family: var(--font-body); font-size: 13.5px; background: #fff; color: var(--text-main); }
textarea { resize: vertical; min-height: 60px; }
input:disabled { color: var(--text-faint); background: var(--bg-soft); }
.date-trio { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; margin-top: 16px; }
.date-box { background: var(--bg-soft); border-radius: 9px; padding: 10px 11px; }
.date-box .l { font-size: 10.5px; color: var(--text-faint); text-transform: uppercase; letter-spacing: 0.03em; line-height: 1.3; }
.date-box .v { font-size: 13px; font-weight: 600; margin-top: 3px; }
.date-box .v.pending { color: var(--text-faint); font-weight: 400; }
.date-box.alert { background: var(--terracotta-soft); }
.date-box.alert .l { color: var(--terracotta); }
.date-box.alert .v { color: var(--terracotta); }
.action-row { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; margin-top: 18px; }
.action-btn { display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 14px 4px; border-radius: var(--radius-card); border: 1px solid var(--border); background: #fff; cursor: pointer; font-size: 12.5px; color: var(--text-main); }
.action-btn i { font-size: 20px; }
.action-btn.active-progress { background: var(--blue-soft); border-color: transparent; color: var(--blue); }
.action-btn.active-wait { background: var(--terracotta-soft); border-color: transparent; color: var(--terracotta); }
.finalizar-btn { width: 100%; margin-top: 18px; padding: 14px; border-radius: var(--radius-card); border: 2px solid var(--good); background: var(--good-soft); color: var(--good); font-weight: 700; font-size: 14.5px; display: flex; align-items: center; justify-content: center; gap: 8px; cursor: pointer; }
.finalizar-btn.confirming { background: var(--good); color: #fff; }
.finalizar-btn.done-state { background: var(--good); border-color: var(--good); color: #fff; }
.checklist { display: flex; flex-direction: column; gap: 7px; margin-top: 8px; }
.check-item { display: flex; align-items: center; gap: 10px; background: var(--bg-soft); border-radius: 8px; padding: 10px 12px; font-size: 13.5px; }
.check-item input { width: 16px; height: 16px; accent-color: var(--green-mid); flex-shrink: 0; }
.other-box { background: var(--bg-soft); border-radius: 8px; padding: 10px 12px; }
.other-box .top-row { display: flex; align-items: center; gap: 10px; font-size: 13.5px; }
.other-search-wrap { margin-left: 26px; margin-top: 8px; display: none; }
.other-box.expanded .other-search-wrap { display: block; }
.other-search-results { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; }
.other-search-item { background: #fff; border: 1px solid var(--border); border-radius: 7px; padding: 7px 10px; font-size: 12.5px; cursor: pointer; }
.other-search-item:hover { border-color: var(--green-accent); }
.other-free-text { margin-top: 6px; display: none; }
.other-free-text.show { display: block; }
.quick-desc-row { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; margin-top: 8px; }
.quick-desc-opt { display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 12px 4px; border-radius: 10px; border: 1px solid var(--border); background: #fff; font-size: 11.5px; text-align: center; color: var(--text-main); cursor: pointer; }
.quick-desc-opt i { font-size: 19px; color: var(--text-mute); }
.quick-desc-opt:hover { border-color: var(--green-accent); }
.quick-desc-opt.selected { background: var(--good-soft); border-color: var(--good); color: var(--good); }
.quick-desc-opt.selected i { color: var(--good); }
.btn { font-family: var(--font-body); font-size: 13px; padding: 8px 16px; border-radius: 9px; border: 1px solid var(--border); background: var(--bg-card); color: var(--text-main); cursor: pointer; }
.btn.primary { background: var(--green-deep); border-color: var(--green-deep); color: #fff; font-weight: 600; }
.btn.full { width: 100%; display: flex; align-items: center; justify-content: center; gap: 8px; padding: 13px; font-size: 14px; margin-top: 18px; }
.info-side { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 18px 20px; }
.info-row { display: flex; justify-content: space-between; font-size: 13px; padding: 8px 0; border-bottom: 1px solid var(--border); }
.info-row:last-child { border-bottom: none; }
.info-row .l { color: var(--text-mute); }
.success-overlay { display: none; position: fixed; inset: 0; background: rgba(26,26,26,0.55); align-items: center; justify-content: center; z-index: 50; }
.success-overlay.show { display: flex; }
.success-box { background: #fff; border-radius: 20px; padding: 36px 32px; text-align: center; width: 320px; position: relative; }
.success-box .modal-close-x { position: absolute; top: 14px; right: 14px; font-size: 16px; color: var(--text-mute); cursor: pointer; width: 28px; height: 28px; border-radius: 50%; background: var(--bg-soft); display: flex; align-items: center; justify-content: center; }
.success-box .modal-close-x:hover { background: var(--red-soft); color: var(--red); }
.success-box .check-circle { width: 68px; height: 68px; border-radius: 50%; background: var(--good-soft); color: var(--good); display: flex; align-items: center; justify-content: center; margin: 0 auto 16px; font-size: 34px; }
.success-box h3 { font-family: var(--font-display); font-size: 21px; margin: 0 0 5px; }
.success-box p { font-size: 13.5px; color: var(--text-mute); margin: 0 0 20px; }
.success-box button { width: 100%; padding: 13px; border-radius: 12px; border: none; background: var(--green-deep); color: #fff; font-weight: 600; font-size: 14px; cursor: pointer; }
.success-box .check-circle.warn { background: var(--terracotta-soft); color: var(--terracotta); }
.confirm-actions { display: flex; gap: 10px; }
.confirm-actions button { flex: 1; padding: 13px; border-radius: 12px; border: none; font-weight: 600; font-size: 14px; cursor: pointer; }
.confirm-actions .btn-cancel { background: var(--bg-soft); color: var(--text-main); }
.confirm-actions .btn-confirm { background: var(--terracotta); color: #fff; }
@media (max-width: 880px) {
.sidebar { width: 76px; padding: 20px 8px; }
.brand-name, .nav-item span, .sidebar-footer .name, .sidebar-footer .role, .nav-group-label { display: none; }
.nav-item { justify-content: center; padding: 12px 0; }
.nav-badge { display: none; }
.os-detail-grid { grid-template-columns: 1fr; }
.main { padding: 22px 16px 40px; }
}
</style>
</head>
<body>
<div class="shell">
<aside class="sidebar">
<div class="brand">
<div class="brand-mark">A</div>
<div class="brand-name">Aluguemaq<span>painel da oficina</span></div>
</div>
<div class="nav-group-label">Oficina</div>
<button class="nav-item active" data-view="lista" onclick="showView('lista', this)">
<i class="ti ti-tool"></i><span>Ordens de serviço</span><span class="nav-badge">6</span>
</button>
<button class="nav-item" data-view="finalizadas" onclick="showView('finalizadas', this)">
<i class="ti ti-history"></i><span>OS finalizadas</span>
</button>
<div class="sidebar-footer">
<div class="avatar-mini">JS</div>
<div><div class="name">José</div><div class="role">Mecânico</div></div>
</div>
</aside>
<main class="main">
<div id="view-lista" class="view active">
<div class="topbar">
<div>
<h1 class="page-title">Ordens de serviço</h1>
<p class="page-sub">A OS chega aqui assim que a Meire gera a nota de recebimento</p>
</div>
</div>
<div class="toolbar">
<input type="text" placeholder="Buscar por cliente ou equipamento">
<div class="seg-control">
<div class="seg-opt selected" onclick="setListFilter(this,'todas')">Todas</div>
<div class="seg-opt" onclick="setListFilter(this,'aberto')">Em aberto</div>
<div class="seg-opt" onclick="setListFilter(this,'andamento')">Andamento</div>
<div class="seg-opt" onclick="setListFilter(this,'peca')">Peça</div>
</div>
</div>
<!-- Ordenado sempre por dias em aberto, do maior pro menor. A mais antiga ganha destaque "comece por aqui". -->
<div class="os-list">
<div class="os-row first-up" data-status="peca" data-days="8" onclick="goToOS('238')">
<span class="first-up-pin"><i class="ti ti-arrow-up"></i> Comece por aqui</span>
<span class="os-num" style="margin-top:10px;">#238</span>
<span class="os-tag wait" style="margin-top:10px;">aguard. peça</span>
<div style="margin-top:10px;"><p class="os-name">Compressor de ar</p><p class="os-sub">Fazenda Dom Bosco · aberta há 8 dias</p></div>
</div>
<div class="os-row internal" data-status="aberto" data-days="0" onclick="goToOS('250')">
<span class="os-num">#250</span>
<span class="os-tag internal"><i class="ti ti-tools" style="font-size:10px;"></i> man. interna</span>
<div><p class="os-name">Martelo demolidor 15kg</p><p class="os-sub">Manutenção interna · veio da locação</p></div>
</div>
<div class="os-row late" data-status="peca" data-days="6" onclick="goToOS('241')">
<span class="os-num">#241</span>
<span class="os-tag wait">aguard. peça</span>
<div><p class="os-name">Betoneira 400L</p><p class="os-sub">Geraldo Eustáquio · aberta há 6 dias</p></div>
</div>
<div class="os-row" data-status="andamento" data-days="2" onclick="goToOS('244')">
<span class="os-num">#244</span>
<span class="os-tag progress">andamento</span>
<div><p class="os-name">Lavadora alta pressão</p><p class="os-sub">Maria A. Lopes · aberta há 2 dias · José</p></div>
</div>
<div class="os-row denied" data-status="aberto" data-days="1" onclick="goToOS('236')">
<span class="os-num">#236</span>
<span class="os-tag denied"><i class="ti ti-ban" style="font-size:10px;"></i> não autorizada</span>
<div style="flex:1;"><p class="os-name">Serra mármore</p><p class="os-sub">Samuel · orçamento recusado há 1 dia</p></div>
<button class="btn-ready-inline" onclick="event.stopPropagation(); confirmReadyFromList('236')"><i class="ti ti-truck-delivery"></i> Pronto para retirada</button>
</div>
<div class="os-row" data-status="aberto" data-days="0" onclick="goToOS('245')">
<span class="os-num">#245</span>
<span class="os-tag toiniciar">a iniciar</span>
<div><p class="os-name">Martelete Bosch</p><p class="os-sub">João Paulo · recebida hoje</p></div>
</div>
<div class="os-row" data-status="aberto" data-days="0" onclick="goToOS('246')">
<span class="os-num">#246</span>
<span class="os-tag toiniciar">a iniciar</span>
<div><p class="os-name">Esmerilhadeira 7"</p><p class="os-sub">Antonio Francisco · recebida hoje</p></div>
</div>
</div>
</div>
<!-- ===== Tela: OS Finalizadas (histórico por mecânico) ===== -->
<div id="view-finalizadas" class="view">
<div class="topbar">
<div>
<h1 class="page-title">OS finalizadas</h1>
<p class="page-sub">Histórico de serviços já concluídos, por mecânico</p>
</div>
</div>
<div class="toolbar">
<input type="text" placeholder="Buscar por cliente ou equipamento" id="finalizadas-busca" oninput="filterFinalizadas()">
<div class="seg-control" id="mecanico-tabs">
<div class="seg-opt selected" onclick="setMecanicoFilter(this,'todos')">Todos</div>
<div class="seg-opt" onclick="setMecanicoFilter(this,'jose')">José</div>
<div class="seg-opt" onclick="setMecanicoFilter(this,'carlos')">Carlos</div>
</div>
</div>
<table class="few-table" id="finalizadas-table">
<thead>
<tr>
<th>OS</th><th>Equipamento / cliente</th><th>Mecânico</th><th>Peças usadas</th><th>O que foi feito</th><th class="num">Data</th>
</tr>
</thead>
<tbody>
<tr data-mecanico="jose" data-search="bomba submersível cond. reserva real">
<td>#243</td><td>Bomba submersível — Cond. Reserva Real</td><td>José</td><td>rolamento, selo</td><td>Troquei peça, Testei ok</td><td class="num">22/06</td>
</tr>
<tr data-mecanico="jose" data-search="guincho talha elétrica fund. arthur bernardes">
<td>#240</td><td>Guincho talha elétrica — Fund. Arthur Bernardes</td><td>José</td><td>capacitor</td><td>Troquei peça</td><td class="num">19/06</td>
</tr>
<tr data-mecanico="carlos" data-search="lavadora alta pressão maria a. lopes">
<td>#233</td><td>Lavadora alta pressão — Maria A. Lopes</td><td>Carlos</td><td>—</td><td>Ajustei/limpei, Testei ok</td><td class="num">17/06</td>
</tr>
<tr data-mecanico="carlos" data-search="martelo demolidor m15-03">
<td>#221</td><td>Martelo demolidor (man. interna, nº M15-03)</td><td>Carlos</td><td>escova de carvão</td><td>Troquei peça, Testei ok</td><td class="num">14/06</td>
</tr>
<tr data-mecanico="jose" data-search="serra mármore samuel">
<td>#210</td><td>Serra mármore — Samuel</td><td>José</td><td>carvão (par)</td><td>Troquei peça</td><td class="num">10/06</td>
</tr>
<tr data-mecanico="carlos" data-search="betoneira 400l b400-12">
<td>#198</td><td>Betoneira 400L (man. interna, nº B400-12)</td><td>Carlos</td><td>rolamento</td><td>Troquei peça, Ajustei/limpei, Testei ok</td><td class="num">05/06</td>
</tr>
</tbody>
</table>
<p class="panel-note" id="finalizadas-empty" style="display:none; text-align:center; margin-top:18px;">Nenhuma OS encontrada com esse filtro.</p>
</div>
<!-- ===== Tela de detalhe: OS normal (aberta/andamento/peça) ===== -->
<div id="view-os" class="view">
<div class="topbar">
<div style="display:flex; align-items:center; gap:10px;">
<i class="ti ti-arrow-left" style="font-size:19px; cursor:pointer;" onclick="showView('lista', document.querySelector('[data-view=lista]'))"></i>
<div>
<h1 class="page-title">OS #241</h1>
<p class="page-sub">Betoneira 400L · Geraldo Eustáquio</p>
</div>
</div>
</div>
<div class="os-detail-grid">
<div class="os-card">
<div class="os-card-head">
<span class="os-card-num">recebida há 6 dias, 08:40</span>
<span class="os-card-status wait" id="status-pill">aguard. peça</span>
</div>
<p class="os-card-equip">Betoneira 400L</p>
<p class="os-card-client">Cliente: Geraldo Eustáquio · (31) 99876-1234</p>
<p class="os-card-problem">Problema relatado: barulho forte ao girar, suspeita de rolamento.</p>
<div class="field-row">
<label class="field-label">Data de recebimento</label>
<input type="text" value="17/06/2026, 08:40 — preenchida pela nota da Meire" disabled>
</div>
<div class="field-row">
<label class="field-label">Responsável</label>
<select>
<option>Selecionar mecânico</option>
<option selected>José</option>
<option>Carlos</option>
</select>
</div>
<div class="action-row">
<div class="action-btn" id="btn-iniciar" onclick="setOSStatus('progress')"><i class="ti ti-player-play"></i>Iniciar</div>
<div class="action-btn active-wait" id="btn-aguardar" onclick="setOSStatus('wait')"><i class="ti ti-clock-pause"></i>Aguard. peça</div>
</div>
<div class="date-trio">
<div class="date-box"><div class="l">Início</div><div class="v pending" id="data-inicio">—</div></div>
<div class="date-box alert" id="date-box-aguardando"><div class="l">Aguard. peça desde</div><div class="v" id="data-aguardando">17/06, 08:40</div></div>
<div class="date-box"><div class="l">Fim</div><div class="v pending" id="data-fim">—</div></div>
</div>
<div class="field-row">
<label class="field-label">Peças usadas</label>
<div class="checklist">
<label class="check-item"><input type="checkbox"> Escova de carvão</label>
<label class="check-item"><input type="checkbox" checked> Rolamento</label>
<label class="check-item"><input type="checkbox"> Capacitor</label>
<div class="other-box" id="other-box">
<label class="top-row">
<input type="checkbox" id="other-check" onchange="toggleOther()">
<span>Outra peça</span>
</label>
<div class="other-search-wrap" id="other-search-wrap">
<input type="text" placeholder="Buscar no estoque..." id="other-search-field" oninput="filterOtherPeca()">
<div class="other-search-results" id="other-search-results"></div>
<div class="other-free-text" id="other-free-text">
<p style="font-size:11.5px; color:var(--text-faint); margin:6px 0 4px;">Não achou? Digite o nome:</p>
<input type="text" placeholder="Nome da peça">
</div>
</div>
</div>
</div>
</div>
<div class="field-row">
<label class="field-label">O que foi feito</label>
<div class="quick-desc-row">
<div class="quick-desc-opt" onclick="selectQuickDesc(this)"><i class="ti ti-replace"></i>Troquei peça</div>
<div class="quick-desc-opt" onclick="selectQuickDesc(this)"><i class="ti ti-adjustments"></i>Ajustei/limpei</div>
</div>
<textarea placeholder="Quer detalhar mais? (opcional)" style="margin-top:8px;"></textarea>
</div>
<button class="finalizar-btn" id="btn-finalizar" onclick="handleFinalizarClick()">
<i class="ti ti-check"></i><span id="finalizar-label">Finalizar serviço</span>
</button>
</div>
<div class="info-side">
<p class="field-label" style="margin-bottom:14px;">Histórico do equipamento</p>
<div class="info-row"><span class="l">Última manutenção</span><span>14 mar 2026</span></div>
<div class="info-row"><span class="l">Total de OS</span><span>3</span></div>
<div class="info-row"><span class="l">Cliente desde</span><span>set 2025</span></div>
</div>
</div>
</div>
<!-- ===== Tela de detalhe: MANUTENÇÃO INTERNA (equipamento próprio, sem cliente) ===== -->
<div id="view-os-internal" class="view">
<div class="topbar">
<div style="display:flex; align-items:center; gap:10px;">
<i class="ti ti-arrow-left" style="font-size:19px; cursor:pointer;" onclick="showView('lista', document.querySelector('[data-view=lista]'))"></i>
<div>
<h1 class="page-title">OS #250</h1>
<p class="page-sub">Martelo demolidor 15kg · Manutenção interna</p>
</div>
</div>
</div>
<div class="os-detail-grid">
<div class="os-card">
<div class="os-card-head">
<span class="os-card-num">enviada hoje, 09:15</span>
<span class="os-card-status internal" id="status-pill-internal">manutenção interna</span>
</div>
<p class="os-card-equip">Martelo demolidor 15kg</p>
<p class="os-card-client"><i class="ti ti-tools" style="font-size:12px; vertical-align:-1px;"></i> Equipamento próprio — voltou da locação pra revisão</p>
<p class="os-card-problem">Motivo: cliente relatou perda de força ao devolver. Verificar e revisar antes de voltar pro estoque.</p>
<div class="field-row">
<label class="field-label">Número do equipamento</label>
<input type="text" placeholder="Digite o número na etiqueta (ex: M15-07)" id="equip-numero-field">
</div>
<div class="field-row">
<label class="field-label">Responsável</label>
<select>
<option>Selecionar mecânico</option>
<option selected>José</option>
<option>Carlos</option>
</select>
</div>
<div class="action-row">
<div class="action-btn" id="btn-iniciar-internal" onclick="setOSStatusInternal('progress')"><i class="ti ti-player-play"></i>Iniciar</div>
<div class="action-btn" id="btn-aguardar-internal" onclick="setOSStatusInternal('wait')"><i class="ti ti-clock-pause"></i>Aguard. peça</div>
</div>
<div class="date-trio">
<div class="date-box"><div class="l">Início</div><div class="v pending" id="data-inicio-internal">—</div></div>
<div class="date-box" id="date-box-aguardando-internal"><div class="l">Aguard. peça desde</div><div class="v pending" id="data-aguardando-internal">—</div></div>
<div class="date-box"><div class="l">Fim</div><div class="v pending" id="data-fim-internal">—</div></div>
</div>
<div class="field-row">
<label class="field-label">Peças usadas</label>
<div class="checklist">
<label class="check-item"><input type="checkbox"> Escova de carvão</label>
<label class="check-item"><input type="checkbox"> Rolamento</label>
<label class="check-item"><input type="checkbox"> Capacitor</label>
<div class="other-box" id="other-box-internal">
<label class="top-row">
<input type="checkbox" id="other-check-internal" onchange="toggleOtherInternal()">
<span>Outra peça</span>
</label>
<div class="other-search-wrap" id="other-search-wrap-internal">
<input type="text" placeholder="Buscar no estoque..." id="other-search-field-internal" oninput="filterOtherPecaInternal()">
<div class="other-search-results" id="other-search-results-internal"></div>
</div>
</div>
</div>
</div>
<div class="field-row">
<label class="field-label">O que foi feito</label>
<div class="quick-desc-row">
<div class="quick-desc-opt" onclick="selectQuickDesc(this)"><i class="ti ti-replace"></i>Troquei peça</div>
<div class="quick-desc-opt" onclick="selectQuickDesc(this)"><i class="ti ti-adjustments"></i>Ajustei/limpei</div>
</div>
<textarea placeholder="Quer detalhar mais? (opcional)" style="margin-top:8px;"></textarea>
</div>
<button class="finalizar-btn" id="btn-finalizar-internal" onclick="handleFinalizarInternalClick()">
<i class="ti ti-check"></i><span id="finalizar-label-internal">Finalizar manutenção</span>
</button>
</div>
<div class="info-side">
<p class="field-label" style="margin-bottom:14px;">Sobre este equipamento</p>
<div class="info-row"><span class="l">Categoria</span><span>Martelo demolidor 15kg</span></div>
<div class="info-row"><span class="l">Motivo da manutenção</span><span>Perda de força</span></div>
<div class="info-row"><span class="l">Destino ao finalizar</span><span>Volta ao estoque</span></div>
</div>
</div>
</div>
<!-- ===== Tela de detalhe: OS NÃO AUTORIZADA ===== -->
<div id="view-os-denied" class="view">
<div class="topbar">
<div style="display:flex; align-items:center; gap:10px;">
<i class="ti ti-arrow-left" style="font-size:19px; cursor:pointer;" onclick="showView('lista', document.querySelector('[data-view=lista]'))"></i>
<div>
<h1 class="page-title">OS #236</h1>
<p class="page-sub">Serra mármore · Samuel</p>
</div>
</div>
</div>
<div style="max-width: 620px;">
<div class="denied-banner">
<i class="ti ti-ban"></i>
<div>
<b>Orçamento não autorizado</b>
<span>O cliente não aprovou o serviço. Não inicie nenhum trabalho nesse equipamento — só confirme a retirada quando ele vier buscar.</span>
</div>
</div>
<div class="os-card">
<div class="os-card-head">
<span class="os-card-num">recebida há 1 dia, 14:10</span>
<span class="os-card-status denied">não autorizada</span>
</div>
<p class="os-card-equip">Serra mármore</p>
<p class="os-card-client">Cliente: Samuel · (31) 99654-3210</p>
<p class="os-card-problem">Problema relatado: carvões gastos, motor fraco. Orçamento enviado e recusado pelo cliente.</p>
<button class="ready-btn" onclick="confirmReady()">
<i class="ti ti-truck-delivery"></i> Liberado Para Retirada
</button>
</div>
</div>
</div>
</main>
</div>
<div class="success-overlay" id="success-overlay">
<div class="success-box">
<i class="ti ti-x modal-close-x" onclick="closeSuccess()"></i>
<div class="check-circle"><i class="ti ti-check"></i></div>
<h3>Feito!</h3>
<p id="success-message">Mais 1 hoje.</p>
<button onclick="closeSuccess()">Voltar pra fila</button>
</div>
</div>
<div class="success-overlay" id="confirm-overlay">
<div class="success-box">
<i class="ti ti-x modal-close-x" onclick="closeConfirm()"></i>
<div class="check-circle warn"><i class="ti ti-tool"></i></div>
<h3>Confirmar finalização</h3>
<p id="confirm-message">Equipamento testado e funcionando, deseja finalizar?</p>
<div class="confirm-actions">
<button class="btn-cancel" onclick="closeConfirm()">Cancelar</button>
<button class="btn-confirm" onclick="executeConfirm()">Sim, finalizar</button>
</div>
</div>
</div>
<script>
function showView(name, btn) {
document.querySelectorAll('.view').forEach(v => v.classList.remove('active'));
document.getElementById('view-' + name).classList.add('active');
document.querySelectorAll('.nav-item').forEach(n => n.classList.remove('active'));
if (btn) btn.classList.add('active');
}
var deniedOS = ['236'];
var internalOS = ['250'];
// ===== OS Finalizadas: filtro por mecânico + busca =====
var finalizadasMecanicoAtual = 'todos';
function setMecanicoFilter(el, mecanico) {
document.querySelectorAll('#mecanico-tabs .seg-opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
finalizadasMecanicoAtual = mecanico;
filterFinalizadas();
}
function filterFinalizadas() {
var q = document.getElementById('finalizadas-busca').value.toLowerCase().trim();
var rows = document.querySelectorAll('#finalizadas-table tbody tr');
var visibleCount = 0;
rows.forEach(function(row) {
var mecanico = row.getAttribute('data-mecanico');
var search = row.getAttribute('data-search') || '';
var matchesMecanico = (finalizadasMecanicoAtual === 'todos') || (mecanico === finalizadasMecanicoAtual);
var matchesQuery = (q === '') || search.includes(q);
var show = matchesMecanico && matchesQuery;
row.style.display = show ? '' : 'none';
if (show) visibleCount++;
});
document.getElementById('finalizadas-table').style.display = visibleCount > 0 ? 'table' : 'none';
document.getElementById('finalizadas-empty').style.display = visibleCount > 0 ? 'none' : 'block';
}
var osAtual = {};
function goToOS(num) {
if (deniedOS.indexOf(num) !== -1) {
showView('os-denied', document.querySelector('[data-view=lista]'));
} else if (internalOS.indexOf(num) !== -1) {
showView('os-internal', document.querySelector('[data-view=lista]'));
} else {
var _row = document.querySelector('.os-row[onclick*="' + num + '"]');
osAtual = {
numero: num,
equipamento: (_row && _row.querySelector('.os-name')) ? _row.querySelector('.os-name').textContent.trim() : '',
cliente: (_row && _row.querySelector('.os-sub')) ? _row.querySelector('.os-sub').textContent.split('·')[0].trim() : ''
};
// Reseta o estado de exemplo: só a OS #241 vem pré-carregada com "aguardando peça" há 6 dias
if (num !== '241') {
aguardandoDesde = null;
var dAg = document.getElementById('data-aguardando');
dAg.textContent = '—';
dAg.classList.add('pending');
document.getElementById('date-box-aguardando').classList.remove('alert');
document.getElementById('btn-aguardar').classList.remove('active-wait');
}
showView('os', document.querySelector('[data-view=lista]'));
}
}
function confirmReadyFromList(num) {
var row = document.querySelector('.os-row[onclick*="' + num + '"]');
if (row) {
var equip = row.querySelector('.os-name') ? row.querySelector('.os-name').textContent.trim() : '';
var subTxt = row.querySelector('.os-sub') ? row.querySelector('.os-sub').textContent : '';
var cliente = subTxt.split('·')[0].trim();
// grava no banco -> aparece na Recepção (e na Gestão) como pronto para retirada
fetch('/api/dados/ordens_servico', {
method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin',
body: JSON.stringify({ numero: num, equipamento: equip, cliente: cliente, status: 'pronto' })
}).catch(function () {});
row.remove();
}
document.getElementById('success-message').textContent = 'Equipamento marcado pronto pra retirada. A Meire já foi avisada.';
document.getElementById('success-overlay').classList.add('show');
}
function setListFilter(el, filter) {
document.querySelectorAll('.seg-opt').forEach(o => o.classList.remove('selected'));
el.classList.add('selected');
document.querySelectorAll('#view-lista .os-row').forEach(row => {
var status = row.getAttribute('data-status');
row.style.display = (filter === 'todas' || status === filter) ? 'flex' : 'none';
});
}
function sortOSList() {
var list = document.querySelector('#view-lista .os-list');
var rows = Array.prototype.slice.call(list.querySelectorAll('.os-row'));
rows.sort(function(a, b) {
return parseInt(b.getAttribute('data-days'), 10) - parseInt(a.getAttribute('data-days'), 10);
});
document.querySelectorAll('.first-up-pin').forEach(function(p) { p.remove(); });
document.querySelectorAll('.os-row').forEach(function(r) { r.classList.remove('first-up'); });
rows.forEach(function(row, i) {
list.appendChild(row);
if (i === 0) {
row.classList.add('first-up');
var pin = document.createElement('span');
pin.className = 'first-up-pin';
pin.innerHTML = '<i class="ti ti-arrow-up"></i> Comece por aqui';
row.insertBefore(pin, row.firstChild);
}
});
}
sortOSList();
// ===== Peças: busca em vez de texto livre =====
var estoquePecas = ['Rolamento', 'Capacitor', 'Escova de carvão', 'Selo mecânico', 'Correia', 'Mancal', 'Vela de ignição', 'Filtro de ar', 'Carvão (par)'];
function toggleOther() {
var box = document.getElementById('other-box');
var checked = document.getElementById('other-check').checked;
box.classList.toggle('expanded', checked);
if (checked) document.getElementById('other-search-field').focus();
}
function filterOtherPeca() {
var q = document.getElementById('other-search-field').value.toLowerCase().trim();
var results = document.getElementById('other-search-results');
var freeText = document.getElementById('other-free-text');
results.innerHTML = '';
if (q === '') { freeText.classList.remove('show'); return; }
var matches = estoquePecas.filter(function(p) { return p.toLowerCase().includes(q); });
matches.forEach(function(p) {
var item = document.createElement('div');
item.className = 'other-search-item';
item.textContent = p;
item.onclick = function() {
document.getElementById('other-search-field').value = p;
results.innerHTML = '';
freeText.classList.remove('show');
};
results.appendChild(item);
});
freeText.classList.toggle('show', matches.length === 0);
}
// ===== O que foi feito: seleção rápida =====
function selectQuickDesc(el) {
el.classList.toggle('selected');
}
// ===== Status da OS, com rastreio de "aguardando peça desde" =====
var aguardandoDesde = new Date(2026, 5, 17, 8, 40); // exemplo pré-carregado: já aguardando peça há 6 dias
function setOSStatus(state) {
var pill = document.getElementById('status-pill');
var now = new Date();
var time = now.getHours() + ':' + String(now.getMinutes()).padStart(2,'0');
document.getElementById('btn-iniciar').classList.remove('active-progress');
document.getElementById('btn-aguardar').classList.remove('active-wait');
if (state === 'progress') {
pill.textContent = 'em andamento';
pill.className = 'os-card-status progress';
document.getElementById('btn-iniciar').classList.add('active-progress');
if (document.getElementById('data-inicio').textContent === '—') {
document.getElementById('data-inicio').textContent = 'hoje, ' + time;
document.getElementById('data-inicio').classList.remove('pending');
}
// Se já estava aguardando peça antes de iniciar, mostra quanto tempo esperou
if (aguardandoDesde) {
var diffMs = now - aguardandoDesde;
var diffDias = Math.floor(diffMs / (1000 * 60 * 60 * 24));
var box = document.getElementById('date-box-aguardando');
var label = diffDias >= 1 ? (diffDias + (diffDias === 1 ? ' dia' : ' dias') + ' de espera') : 'menos de 1 dia de espera';
document.getElementById('data-aguardando').textContent = label;
box.classList.remove('alert');
}
} else if (state === 'wait') {
pill.textContent = 'aguard. peça';
pill.className = 'os-card-status wait';
document.getElementById('btn-aguardar').classList.add('active-wait');
// Sempre mostra a data/hora em que o mecânico clicou em "aguardar peça" (igual ao "Iniciar")
if (!aguardandoDesde) aguardandoDesde = now;
var dataAg = document.getElementById('data-aguardando');
dataAg.textContent = 'hoje, ' + time;
dataAg.classList.remove('pending');
document.getElementById('date-box-aguardando').classList.add('alert');
}
}
// ===== Finalizar: pede confirmação explícita antes de gravar =====
var pendingFinalizar = null; // 'normal' ou 'internal'
function handleFinalizarClick() {
pendingFinalizar = 'normal';
document.getElementById('confirm-message').textContent = 'Equipamento testado e funcionando, deseja finalizar?';
document.getElementById('confirm-overlay').classList.add('show');
}
function closeConfirm() {
pendingFinalizar = null;
document.getElementById('confirm-overlay').classList.remove('show');
}
function executeConfirm() {
document.getElementById('confirm-overlay').classList.remove('show');
if (pendingFinalizar === 'normal') finalizarNormal();
else if (pendingFinalizar === 'internal') finalizarInternal();
pendingFinalizar = null;
}
function finalizarNormal() {
var pill = document.getElementById('status-pill');
var now = new Date();
var time = now.getHours() + ':' + String(now.getMinutes()).padStart(2,'0');
pill.textContent = 'finalizada';
pill.className = 'os-card-status done';
document.getElementById('btn-finalizar').classList.add('done-state');
document.getElementById('finalizar-label').innerHTML = '<i class="ti ti-check"></i> Finalizada';
document.getElementById('data-fim').textContent = 'hoje, ' + time;
document.getElementById('data-fim').classList.remove('pending');
if (document.getElementById('data-inicio').textContent === '—') {
document.getElementById('data-inicio').textContent = 'hoje, ' + time;
document.getElementById('data-inicio').classList.remove('pending');
}
// grava a OS finalizada como pronta para retirada -> aparece na Recepção e na Gestão
if (osAtual && osAtual.numero) {
fetch('/api/dados/ordens_servico', {
method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin',
body: JSON.stringify({ numero: osAtual.numero, equipamento: osAtual.equipamento, cliente: osAtual.cliente, status: 'pronto', finalizada: true })
}).catch(function () {});
}
document.getElementById('success-message').textContent = 'Mais 1 hoje. Bom trabalho!';
document.getElementById('success-overlay').classList.add('show');
}
// ===== Manutenção interna: peças (busca própria) =====
function toggleOtherInternal() {
var box = document.getElementById('other-box-internal');
var checked = document.getElementById('other-check-internal').checked;
box.classList.toggle('expanded', checked);
if (checked) document.getElementById('other-search-field-internal').focus();
}
function filterOtherPecaInternal() {
var q = document.getElementById('other-search-field-internal').value.toLowerCase().trim();
var results = document.getElementById('other-search-results-internal');
results.innerHTML = '';
if (q === '') return;
var matches = estoquePecas.filter(function(p) { return p.toLowerCase().includes(q); });
matches.forEach(function(p) {
var item = document.createElement('div');
item.className = 'other-search-item';
item.textContent = p;
item.onclick = function() {
document.getElementById('other-search-field-internal').value = p;
results.innerHTML = '';
};
results.appendChild(item);
});
}
// ===== Manutenção interna: status (mesma lógica de aguardando peça) =====
var aguardandoDesdeInternal = null;
function setOSStatusInternal(state) {
var pill = document.getElementById('status-pill-internal');
var now = new Date();
var time = now.getHours() + ':' + String(now.getMinutes()).padStart(2,'0');
document.getElementById('btn-iniciar-internal').classList.remove('active-progress');
document.getElementById('btn-aguardar-internal').classList.remove('active-wait');
if (state === 'progress') {
pill.textContent = 'em andamento';
pill.className = 'os-card-status progress';
document.getElementById('btn-iniciar-internal').classList.add('active-progress');
if (document.getElementById('data-inicio-internal').textContent === '—') {
document.getElementById('data-inicio-internal').textContent = 'hoje, ' + time;
document.getElementById('data-inicio-internal').classList.remove('pending');
}
if (aguardandoDesdeInternal) {
var diffDias = Math.floor((now - aguardandoDesdeInternal) / (1000 * 60 * 60 * 24));
var box = document.getElementById('date-box-aguardando-internal');
var label = diffDias >= 1 ? (diffDias + (diffDias === 1 ? ' dia' : ' dias') + ' de espera') : 'menos de 1 dia de espera';
document.getElementById('data-aguardando-internal').textContent = label;
document.getElementById('data-aguardando-internal').classList.remove('pending');
box.classList.remove('alert');
}
} else if (state === 'wait') {
pill.textContent = 'aguard. peça';
pill.className = 'os-card-status wait';
document.getElementById('btn-aguardar-internal').classList.add('active-wait');
if (document.getElementById('data-inicio-internal').textContent === '—' && !aguardandoDesdeInternal) {
aguardandoDesdeInternal = now;
document.getElementById('data-aguardando-internal').textContent = 'hoje, ' + time;
document.getElementById('data-aguardando-internal').classList.remove('pending');
document.getElementById('date-box-aguardando-internal').classList.add('alert');
}
}
}
// ===== Manutenção interna: finalizar (exige confirmação, e devolve ao estoque) =====
function handleFinalizarInternalClick() {
var numeroEquip = document.getElementById('equip-numero-field').value.trim();
if (!numeroEquip) {
document.getElementById('equip-numero-field').style.borderColor = 'var(--red)';
document.getElementById('equip-numero-field').focus();
return;
}
pendingFinalizar = 'internal';
document.getElementById('confirm-message').textContent = 'Equipamento testado e funcionando, deseja finalizar e devolver ao estoque?';
document.getElementById('confirm-overlay').classList.add('show');
}
function finalizarInternal() {
var pill = document.getElementById('status-pill-internal');
var now = new Date();
var time = now.getHours() + ':' + String(now.getMinutes()).padStart(2,'0');
var numeroEquip = document.getElementById('equip-numero-field').value.trim();
pill.textContent = 'finalizada';
pill.className = 'os-card-status done';
document.getElementById('btn-finalizar-internal').classList.add('done-state');
document.getElementById('finalizar-label-internal').innerHTML = '<i class="ti ti-check"></i> Finalizada';
document.getElementById('data-fim-internal').textContent = 'hoje, ' + time;
document.getElementById('data-fim-internal').classList.remove('pending');
if (document.getElementById('data-inicio-internal').textContent === '—') {
document.getElementById('data-inicio-internal').textContent = 'hoje, ' + time;
document.getElementById('data-inicio-internal').classList.remove('pending');
}
document.getElementById('success-message').textContent = 'Martelo demolidor 15kg (nº ' + numeroEquip + ') voltou para o estoque e já está disponível para locação.';
document.getElementById('success-overlay').classList.add('show');
}
function confirmReady() {
document.getElementById('success-message').textContent = 'Equipamento marcado pronto pra retirada. A Meire já foi avisada.';
document.getElementById('success-overlay').classList.add('show');
}
function closeSuccess() {
document.getElementById('success-overlay').classList.remove('show');
showView('lista', document.querySelector('[data-view=lista]'));
}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Locação Viçosa — Marcelo · Gestão</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.1.0/dist/tabler-icons.min.css">
<style>
:root{
--bg-app: #F5F2ED;
--bg-sidebar: #1A1A1A;
--bg-card: #FFFFFF;
--bg-soft: #EFEAE2;
--green-deep: #1A1A1A;
--green-mid: #E85A28;
--green-accent: #F1612A;
--terracotta: #E85A28;
--terracotta-soft: #FBE2D5;
--amber: #C98A2B;
--amber-soft: #F5E6C8;
--red: #B23A32;
--red-soft: #F4D9D6;
--good: #2F8F5B;
--good-soft: #DCEADF;
--blue: #2C5A8A;
--blue-soft: #DDE7F2;
--text-main: #211D1A;
--text-mute: #6E6760;
--text-faint: #A39B91;
--border: #E2DACD;
--radius-card: 14px;
--radius-pill: 999px;
--font-display: 'Source Serif 4', Georgia, serif;
--font-body: 'Inter', -apple-system, sans-serif;
--font-mono: 'IBM Plex Mono', monospace;
}
* { box-sizing: border-box; }
body { margin: 0; font-family: var(--font-body); background: var(--bg-app); color: var(--text-main); }
.shell { display: flex; min-height: 100vh; }
.sidebar { width: 240px; background: var(--bg-sidebar); color: #E9E7DE; padding: 24px 16px; display: flex; flex-direction: column; flex-shrink: 0; }
.brand { display: flex; align-items: center; gap: 10px; padding: 0 8px 22px; margin-bottom: 10px; border-bottom: 1px solid rgba(255,255,255,0.1); }
.brand-mark { width: 34px; height: 34px; border-radius: 9px; background: var(--terracotta); display: flex; align-items: center; justify-content: center; font-family: var(--font-display); font-size: 18px; color: #fff; flex-shrink: 0; }
.brand-name { font-family: var(--font-display); font-size: 15px; line-height: 1.25; }
.brand-name span { display: block; font-family: var(--font-body); font-size: 11px; color: #9CA89E; margin-top: 1px; }
.nav-group-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: #7E8A7F; padding: 13px 12px 6px; }
.nav-item { display: flex; align-items: center; gap: 11px; padding: 9px 12px; border-radius: 9px; font-size: 13.5px; color: #CFD3C7; cursor: pointer; border: none; background: transparent; width: 100%; text-align: left; font-family: var(--font-body); }
.nav-item i { font-size: 17px; flex-shrink: 0; }
.nav-item:hover { background: rgba(255,255,255,0.06); color: #fff; }
.nav-item.active { background: var(--green-mid); color: #fff; }
.nav-badge { margin-left: auto; background: var(--terracotta); color: #fff; font-size: 10.5px; padding: 1px 7px; border-radius: var(--radius-pill); }
.nav-more-toggle { display: flex; align-items: center; gap: 9px; padding: 9px 12px; margin-top: 6px; border-radius: 9px; font-size: 12.5px; color: #9CA89E; cursor: pointer; border: 1px dashed rgba(255,255,255,0.18); background: transparent; width: 100%; text-align: left; font-family: var(--font-body); }
.nav-more-toggle:hover { color: #fff; border-color: rgba(255,255,255,0.32); }
.nav-more-toggle.expanded i { transform: rotate(90deg); }
.nav-more-toggle i { transition: transform .15s; }
.nav-more-group { display: none; }
.nav-more-group.expanded { display: block; }
/* ===== Novo menu: Marcelo / Lucilene ===== */
.nav-owner-label { display:flex; align-items:center; gap:8px; padding: 16px 12px 7px; margin-top: 4px; }
.nav-owner-label .dot { width:7px; height:7px; border-radius:50%; background: var(--green-mid); flex-shrink:0; }
.nav-owner-label span { font-size: 11.5px; text-transform: uppercase; letter-spacing: 0.07em; color: #9CA89E; font-weight: 700; }
.nav-owner-label.lucilene .dot { background: #8A9BC9; }
.nav-group-toggle { display: flex; align-items: center; gap: 11px; padding: 9px 12px; border-radius: 9px; font-size: 13.5px; color: #CFD3C7; cursor: pointer; border: none; background: transparent; width: 100%; text-align: left; font-family: var(--font-body); font-weight: 600; }
.nav-group-toggle:hover { background: rgba(255,255,255,0.06); color: #fff; }
.nav-group-toggle i.chev { margin-left: auto; font-size: 15px; transition: transform .15s; }
.nav-group-toggle.expanded i.chev { transform: rotate(90deg); }
.nav-group-toggle i.gicon { font-size: 17px; flex-shrink: 0; }
.nav-sub-items { display: none; padding-left: 14px; border-left: 1px solid rgba(255,255,255,0.1); margin: 2px 0 4px 21px; }
.nav-sub-items.expanded { display: block; }
.nav-sub-items .nav-item { font-size: 12.8px; padding: 7px 10px; }
.nav-sub-items .nav-item i { font-size: 14px; }
/* ===== Filtro de período ===== */
.period-filter-row { display: flex; gap: 6px; margin-bottom: 18px; flex-wrap: wrap; align-items: center; }
.period-btn { font-size: 12.5px; padding: 7px 13px; border-radius: var(--radius-pill); border: 1px solid var(--border); background: #fff; color: var(--text-mute); cursor: pointer; font-family: var(--font-body); font-weight: 600; }
.period-btn.active { background: var(--text-main); color: #fff; border-color: var(--text-main); }
.period-btn.custom { display:flex; align-items:center; gap:5px; }
.period-range-note { font-size: 12px; color: var(--text-faint); margin-left: 4px; }
/* ===== Duas colunas 50/50 (Contas a pagar / receber) ===== */
.two-col-50 { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; align-items: start; }
.col-head { display:flex; align-items:center; justify-content:space-between; margin-bottom: 12px; }
@media (max-width: 980px) { .two-col-50 { grid-template-columns: 1fr; } }
/* ===== Cards de calculadora (Andaimes) ===== */
.andaime-opt-row { display: flex; gap: 10px; margin-bottom: 14px; flex-wrap: wrap; }
.andaime-opt { flex: 1; min-width: 130px; border: 1px solid var(--border); border-radius: 12px; padding: 12px 14px; cursor: pointer; text-align:center; background:#fff; }
.andaime-opt.selected { border-color: var(--terracotta); background: var(--terracotta-soft); }
.andaime-opt i { font-size: 20px; display:block; margin-bottom:5px; color: var(--text-mute); }
.andaime-opt.selected i { color: var(--terracotta); }
.andaime-opt .nm { font-size: 12.5px; font-weight: 600; }
.andaime-toggle-row { display:flex; gap: 10px; margin-bottom: 14px; }
.andaime-toggle { flex:1; border:1px solid var(--border); border-radius:12px; padding: 12px; text-align:center; cursor:pointer; background:#fff; font-size:13px; font-weight:600; color:var(--text-mute); }
.andaime-toggle.selected { border-color: var(--blue); background: var(--blue-soft); color: var(--blue); }
.idle-bar-track { background: var(--bg-soft); border-radius: 6px; height: 8px; overflow:hidden; margin-top:4px; }
.idle-bar-fill { height:100%; background: var(--terracotta); border-radius:6px; }
/* ===== Abas internas dos hubs (Oficina / Loja / Peças) ===== */
.tab-panel { display: none; }
.tab-panel.active { display: block; }
@media print {
.sidebar, .topbar, .fin-tab-row, .vg-shortcuts, .chat-fab-wrap, .chat-panel,
#tab-fin-folha-contador .btn, #tab-fin-folha-contador input { display: none !important; }
#view-fin-folha, #tab-fin-folha-contador { display: block !important; }
main { padding: 0 !important; }
body { background: #fff !important; }
}
/* ===== "vs mês passado" no Painel do Dia ===== */
.mom-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.mom-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 14px 16px; }
.mom-lbl { font-size: 12px; color: var(--text-mute); margin: 0 0 6px; }
.mom-num { font-family: var(--font-display); font-size: 21px; margin: 0 0 4px; }
.mom-num.good { color: var(--good); }
.mom-num.danger { color: var(--red); }
.mom-cmp { font-size: 11.5px; color: var(--text-faint); margin: 0; }
.mom-cmp .up { color: var(--good); font-weight: 700; }
.mom-cmp .down { color: var(--red); font-weight: 700; }
@media (max-width: 900px) { .mom-grid { grid-template-columns: repeat(2, 1fr); } }
.fat-compare-box { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 16px 18px; margin-bottom: 16px; }
.fat-compare-legend { display: flex; gap: 14px; margin-bottom: 14px; font-size: 11px; color: var(--text-mute); }
.fat-compare-legend span { display: flex; align-items: center; gap: 4px; }
.fat-compare-dot { width: 9px; height: 9px; border-radius: 2px; display: inline-block; }
.fat-compare-row { margin-bottom: 16px; }
.fat-compare-row:last-child { margin-bottom: 0; }
.fat-compare-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 7px; }
.fat-compare-label { font-size: 12.5px; font-weight: 600; color: var(--text-main); }
.fat-compare-delta { font-size: 11.5px; font-weight: 700; }
.fat-compare-delta.up { color: var(--good); }
.fat-compare-delta.down { color: var(--red); }
.fat-bar-line { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
.fat-bar-line:last-child { margin-bottom: 0; }
.fat-bar-fill { height: 14px; border-radius: 3px; }
.fat-bar-fill.prev { background: rgba(232,90,40,0.22); }
.fat-bar-fill.curr { background: var(--green-mid); }
.fat-compare-box.receita .fat-bar-fill.prev { background: rgba(150,150,140,0.3); }
.fat-compare-box.receita .fat-bar-fill.curr { background: var(--good); }
.fat-bar-val { font-size: 11px; color: var(--text-mute); white-space: nowrap; flex-shrink: 0; min-width: 62px; text-align: right; }
.fat-bar-val.curr { color: var(--text-main); font-weight: 600; }
.eq-parado-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 12px 14px; margin-bottom: 8px; cursor: pointer; }
.eq-parado-top { display: flex; align-items: center; gap: 12px; margin-bottom: 9px; }
.eq-parado-icon { width: 32px; height: 32px; border-radius: 8px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; background: var(--red-soft); color: var(--red); }
.eq-parado-icon.amber { background: var(--amber-soft); color: var(--amber); }
.eq-parado-name { font-size: 13.5px; font-weight: 600; margin: 0; color: var(--text-main); }
.eq-parado-sub { font-size: 11.5px; color: var(--text-mute); margin: 2px 0 0; }
.sidebar-footer { margin-top: auto; padding: 12px; display: flex; align-items: center; gap: 10px; border-top: 1px solid rgba(255,255,255,0.1); padding-top: 16px; }
.avatar-mini { width: 32px; height: 32px; border-radius: 50%; background: var(--amber); display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 600; color: #3A2A0A; flex-shrink: 0; }
.sidebar-footer .name { font-size: 13px; color: #fff; }
.sidebar-footer .role { font-size: 11px; color: #9CA89E; }
.main { flex: 1; padding: 28px 36px 48px; max-width: 1140px; }
.topbar { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 22px; }
.page-title { font-family: var(--font-display); font-size: 24px; margin: 0 0 4px; }
.page-sub { font-size: 13.5px; color: var(--text-mute); margin: 0; }
.today-pill { font-size: 12px; color: var(--text-mute); background: var(--bg-card); border: 1px solid var(--border); padding: 7px 14px; border-radius: var(--radius-pill); white-space: nowrap; }
/* ===== Seletor de período (substitui a fileira de botões) ===== */
.period-select { position: relative; flex-shrink: 0; }
.period-pill { font-size: 12px; color: var(--text-main); background: var(--bg-card); border: 1px solid var(--border); padding: 7px 10px 7px 14px; border-radius: var(--radius-pill); white-space: nowrap; cursor: pointer; display:flex; align-items:center; gap:7px; font-family: var(--font-body); font-weight: 600; }
.period-pill:hover { border-color: var(--text-faint); }
.period-pill i.ti-chevron-down { font-size: 14px; color: var(--text-mute); transition: transform .15s; }
.period-select.open .period-pill i.ti-chevron-down { transform: rotate(180deg); }
.period-dropdown { position:absolute; top:calc(100% + 6px); right:0; background:#fff; border:1px solid var(--border); border-radius:12px; box-shadow: 0 10px 28px rgba(33,29,26,0.12); min-width:210px; z-index:30; display:none; padding:6px; }
.period-select.open .period-dropdown { display:block; }
.period-dropdown-item { padding:9px 12px; border-radius:8px; font-size:13px; cursor:pointer; color:var(--text-main); font-weight: 500; }
.period-dropdown-item:hover { background: var(--bg-soft); }
.period-dropdown-item.active { background: var(--terracotta-soft); color: var(--terracotta); font-weight: 700; }
.view { display: none; }
.view.active { display: block; }
.section-label { font-size: 12px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-faint); margin: 22px 0 9px; }
.section-toggle { display: flex; align-items: center; gap: 8px; background: none; border: none; padding: 0; margin: 22px 0 14px; cursor: pointer; font-size: 12px; font-weight: 700; color: var(--text-faint); text-transform: uppercase; letter-spacing: 0.05em; font-family: var(--font-body); }
.section-toggle:hover { color: var(--text-mute); }
.section-toggle-hint { font-weight: 600; text-transform: none; color: var(--green-mid); letter-spacing: 0; font-size: 11.5px; }
.section-toggle-chev { transition: transform .15s ease; color: var(--text-faint); flex-shrink: 0; }
.section-toggle.expanded .section-toggle-chev { transform: rotate(180deg); }
.os-list { display: flex; flex-direction: column; gap: 8px; }
.os-row { display: flex; align-items: center; gap: 13px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 12px 16px; cursor: pointer; }
.os-row:hover { border-color: var(--green-accent); }
.os-row i { font-size: 17px; flex-shrink: 0; }
.os-name { font-size: 13.5px; font-weight: 600; margin: 0; color: var(--text-main); }
.os-sub { font-size: 11.5px; color: var(--text-mute); margin: 2px 0 0; }
.os-right { margin-left: auto; text-align: right; }
.os-right .price { font-family: var(--font-display); font-size: 15px; color: var(--text-main); }
.os-right .margin { font-family: var(--font-display); font-size: 15px; font-weight: 600; }
.os-right .margin.good { color: var(--good); }
.os-right .margin.bad { color: var(--red); }
.vg-grid-top { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-bottom: 12px; }
.vg-grid-top.three { grid-template-columns: repeat(3, 1fr); }
.vg-card-big { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 18px; }
.vg-card-big.good { background: var(--good-soft); border-color: transparent; }
.vg-card-big.danger { background: var(--red-soft); border-color: transparent; }
.vg-card-big.warn { background: var(--amber-soft); border-color: transparent; }
.vg-top { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }
.vg-icon { width: 30px; height: 30px; border-radius: 8px; background: rgba(0,0,0,0.05); display: flex; align-items: center; justify-content: center; font-size: 15px; color: var(--text-mute); }
.vg-icon.vg-sign { font-weight: 800; font-size: 18px; line-height: 1; }
.vg-card-big.good .vg-icon { background: rgba(47,143,91,0.16); color: var(--good); }
.vg-card-big.danger .vg-icon { background: rgba(178,58,50,0.14); color: var(--red); }
.vg-card-big.warn .vg-icon { background: rgba(201,138,43,0.18); color: var(--amber); }
.vg-trend { font-size: 10.5px; font-weight: 700; padding: 3px 8px; border-radius: var(--radius-pill); background: rgba(0,0,0,0.05); color: var(--text-mute); white-space: nowrap; }
.vg-trend.up { background: rgba(47,143,91,0.16); color: var(--good); }
.vg-trend.down { background: rgba(178,58,50,0.14); color: var(--red); }
.vg-num-big { font-family: var(--font-display); font-size: 25px; margin: 0; color: var(--text-main); }
.vg-label-big { font-size: 12px; color: var(--text-mute); margin: 3px 0 0; }
.vg-card-big.good .vg-label-big, .vg-card-big.danger .vg-label-big, .vg-card-big.warn .vg-label-big { color: var(--text-main); }
.vg-grid-mini { display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; margin-bottom: 20px; }
.vg-mini { background: var(--bg-card); border: 1px solid var(--border); border-radius: 10px; padding: 12px 10px; }
.vg-mini.danger { background: var(--red-soft); border-color: transparent; }
.vg-mini.good { background: var(--good-soft); border-color: transparent; }
.vg-mini i { font-size: 14px; color: var(--text-mute); display: block; margin-bottom: 6px; }
.vg-mini.danger i { color: var(--red); }
.vg-mini.good i { color: var(--good); }
.vg-mini-num { font-family: var(--font-display); font-size: 16px; margin: 0; color: var(--text-main); }
.vg-mini-label { font-size: 10px; color: var(--text-mute); margin: 2px 0 0; line-height: 1.3; }
.vg-mini-trend { font-size: 9.5px; font-weight: 700; margin: 3px 0 0; }
.vg-mini-trend.up { color: var(--good); }
.vg-mini-trend.down { color: var(--red); }
.vg-summary-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 20px; }
.vg-summary-row { display: flex; gap: 10px; align-items: flex-start; border-radius: 10px; padding: 11px 13px; }
.vg-summary-row i { font-size: 16px; margin-top: 1px; flex-shrink: 0; }
.vg-summary-row .t { font-size: 12.5px; font-weight: 700; margin: 0; }
.vg-summary-row .d { font-size: 11.5px; margin: 2px 0 0; }
.vg-summary-row.danger { background: var(--red-soft); }
.vg-summary-row.danger i, .vg-summary-row.danger .t, .vg-summary-row.danger .d { color: #7A2A24; }
.vg-summary-row.warn { background: var(--terracotta-soft); }
.vg-summary-row.warn i, .vg-summary-row.warn .t, .vg-summary-row.warn .d { color: #8A3F25; }
.vg-summary-row.amber { background: var(--amber-soft); }
.vg-summary-row.amber i, .vg-summary-row.amber .t, .vg-summary-row.amber .d { color: #7A5410; }
.vg-summary-row.info { background: var(--blue-soft); }
.vg-summary-row.info i, .vg-summary-row.info .t, .vg-summary-row.info .d { color: #1F4368; }
.vg-summary-row.good { background: var(--good-soft); }
.vg-summary-row.good i, .vg-summary-row.good .t, .vg-summary-row.good .d { color: #235C3E; }
.vg-shortcuts { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }
.vg-shortcut { display: flex; flex-direction: column; align-items: center; gap: 7px; padding: 16px 4px; border-radius: var(--radius-card); border: 1px solid var(--border); background: var(--bg-card); cursor: pointer; font-size: 12.5px; color: var(--text-main); }
.vg-shortcut:hover { border-color: var(--green-accent); background: var(--bg-soft); }
.vg-shortcut i { font-size: 21px; color: var(--green-mid); }
.vf-divider { border-top: 2px solid var(--border); padding-top: 24px; margin-top: 26px; }
.vf-title { font-family: var(--font-display); font-size: 19px; margin: 0 0 4px; color: var(--text-main); }
.vf-subtitle { font-size: 12.5px; color: var(--text-mute); margin: 0 0 18px; }
.vf-result-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.vf-result-num { font-family: var(--font-display); font-size: 19px; margin: 0; color: var(--text-main); }
.vf-result-num.good { color: var(--good); }
.vf-result-num.danger { color: var(--red); }
.vf-result-num.warn { color: var(--terracotta); }
.vf-result-label { font-size: 11.5px; color: var(--text-mute); margin: 3px 0 0; }
.vf-divider-v { border-left: 1px solid var(--border); padding-left: 16px; }
.vf-bar-row { margin-bottom: 12px; }
.vf-bar-head { display: flex; justify-content: space-between; margin-bottom: 5px; }
.vf-bar-head span:first-child { font-size: 12.5px; color: var(--text-main); font-weight: 600; }
.vf-bar-val { font-size: 12.5px; color: var(--text-main); font-weight: 700; }
.vf-bar-track { height: 8px; background: var(--bg-soft); border-radius: 5px; overflow: hidden; }
.vf-bar-fill { height: 100%; border-radius: 5px; }
.vf-bar-fill.good { background: var(--good); }
.vf-bar-fill.terracotta { background: var(--terracotta); }
.vf-legend-row { display: flex; gap: 16px; margin-bottom: 12px; }
.vf-legend-item { display: flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--text-main); }
.vf-legend-item .dot { width: 9px; height: 9px; border-radius: 50%; display: inline-block; }
.vf-legend-item.warn .dot { background: var(--terracotta); }
.vf-legend-item.danger .dot { background: var(--red); }
.vf-conta-list { display: flex; flex-direction: column; gap: 8px; }
.vf-conta-row { display: flex; align-items: center; gap: 12px; border-radius: 9px; padding: 11px 13px; }
.vf-conta-row.warn { background: var(--amber-soft); }
.vf-conta-row.warn i { color: #7A5410; }
.vf-conta-row.warn .sub { color: #7A5410; }
.vf-conta-row.danger { background: var(--red-soft); }
.vf-conta-row.danger i { color: #7A2A24; }
.vf-conta-row.danger .sub { color: #7A2A24; }
.vf-conta-row i { font-size: 15px; flex-shrink: 0; }
.vf-conta-row .nm { font-size: 12.5px; font-weight: 600; margin: 0; color: var(--text-main); }
.vf-conta-row .sub { font-size: 10.5px; font-weight: 700; margin: 2px 0 0; }
.vf-conta-row .val { font-family: var(--font-display); font-size: 15px; margin: 0; color: var(--text-main); }
.section-label:first-of-type { margin-top: 0; }
.clickable-stat-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 20px; }
.clickable-stat { border-radius: var(--radius-card); padding: 15px; background: var(--bg-card); border: 1px solid var(--border); cursor: pointer; text-align: left; }
.clickable-stat:hover { border-color: var(--green-accent); }
.clickable-stat.warn { background: var(--terracotta-soft); border-color: transparent; }
.clickable-stat.danger { background: var(--red-soft); border-color: transparent; }
.clickable-stat.good { background: #DCEADF; border-color: transparent; }
.clickable-stat.info { background: var(--blue-soft); border-color: transparent; }
.clickable-stat .num { font-family: var(--font-display); font-size: 25px; margin: 0; }
.clickable-stat.warn .num { color: var(--terracotta); }
.clickable-stat.danger .num { color: var(--red); }
.clickable-stat.good .num { color: var(--green-mid); }
.clickable-stat.info .num { color: var(--blue); }
.clickable-stat .lbl { font-size: 12px; color: var(--text-mute); margin: 2px 0 0; display: flex; align-items: center; gap: 4px; }
.clickable-stat.warn .lbl { color: #8A3F25; }
.clickable-stat.danger .lbl { color: #7A2A24; }
.clickable-stat.good .lbl { color: #2F5A3D; }
.clickable-stat.info .lbl { color: #1F4368; }
.clickable-stat .lbl i { font-size: 13px; opacity: 0.6; }
.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 20px; }
.panel { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 16px 18px; }
.panel-title { font-size: 12.5px; color: var(--text-mute); margin: 0 0 12px; font-weight: 600; }
.panel-note { font-size: 11.5px; color: var(--text-faint); margin: 12px 0 0; line-height: 1.5; }
.chart-wrap { position: relative; }
.split-bar { display: flex; height: 26px; border-radius: 8px; overflow: hidden; margin-bottom: 10px; }
.legend-row { display: flex; gap: 16px; flex-wrap: wrap; font-size: 12px; }
.legend-item { display: flex; align-items: center; gap: 6px; }
.legend-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.os-drill { display: flex; flex-direction: column; gap: 7px; }
.os-drill-row { display: flex; align-items: center; gap: 12px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 10px; padding: 10px 13px; cursor: pointer; }
.os-drill-row:hover { border-color: var(--green-accent); }
.os-drill-row.late { border-color: var(--red); }
.os-drill-row.baixa-rot { border-color: var(--amber); }
.rot-tag { font-size: 10.5px; font-weight: 700; padding: 2px 8px; border-radius: 99px; white-space: nowrap; }
.rot-tag.parado { background: var(--red-soft); color: var(--red); }
.rot-tag.baixa-rot { background: var(--amber-soft); color: #7A5410; }
.os-drill-num { font-size: 11px; color: var(--text-faint); width: 42px; flex-shrink: 0; }
.os-drill-name { font-size: 13px; font-weight: 600; margin: 0; }
.os-drill-sub { font-size: 11.5px; color: var(--text-mute); margin: 0; }
.os-drill-comment { margin-left: auto; color: var(--text-faint); }
.modal-overlay { display: none; min-height: 100vh; background: rgba(35,39,34,0.45); position: absolute; top: 0; left: 0; right: 0; align-items: flex-start; justify-content: center; padding: 60px 20px; z-index: 10; }
.modal-overlay.open { display: flex; }
.modal-box { background: var(--bg-card); border-radius: var(--radius-card); padding: 22px 24px; max-width: 460px; width: 100%; max-height: 80vh; overflow-y: auto; }
.modal-head { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 14px; }
.modal-close { cursor: pointer; color: var(--text-mute); font-size: 18px; width: 30px; height: 30px; border-radius: 50%; background: var(--bg-soft); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.modal-close:hover { background: var(--red-soft); color: var(--red); }
.modal-title { font-family: var(--font-display); font-size: 18px; margin: 0; }
.modal-sub { font-size: 12.5px; color: var(--text-mute); margin: 2px 0 0; }
.detail-row { display: flex; justify-content: space-between; font-size: 13px; padding: 8px 0; border-bottom: 1px solid var(--border); }
.detail-row:last-child { border-bottom: none; }
.detail-row .l { color: var(--text-mute); }
.detail-row .v.pos { color: var(--green-mid); font-weight: 600; }
.detail-row .v.neg { color: var(--red); font-weight: 600; }
.comment-box { background: var(--bg-soft); border-radius: 10px; padding: 10px 12px; margin-top: 14px; }
.comment-box textarea { width: 100%; border: none; background: transparent; font-family: var(--font-body); font-size: 13px; resize: vertical; min-height: 50px; padding: 0; }
.comment-target { display: flex; gap: 6px; margin-top: 8px; }
.comment-target .opt { font-size: 11.5px; padding: 5px 11px; border-radius: var(--radius-pill); border: 1px solid var(--border); background: #fff; cursor: pointer; color: var(--text-mute); }
.comment-target .opt.selected { background: var(--green-deep); border-color: var(--green-deep); color: #fff; }
.existing-comment { display: flex; gap: 9px; align-items: flex-start; font-size: 12.5px; background: var(--bg-soft); padding: 9px 11px; border-radius: 9px; margin-bottom: 8px; }
.existing-comment i { font-size: 14px; color: var(--text-faint); margin-top: 1px; }
.existing-comment .meta { color: var(--text-faint); font-size: 11px; margin-top: 2px; }
.equip-status-list { display: flex; flex-direction: column; gap: 7px; }
.equip-status-row { display: flex; align-items: center; gap: 12px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 10px; padding: 11px 14px; }
.equip-status-tag { font-size: 10.5px; font-weight: 600; padding: 3px 9px; border-radius: var(--radius-pill); white-space: nowrap; }
.equip-status-tag.out { background: var(--blue-soft); color: var(--blue); }
.equip-status-tag.maint { background: var(--terracotta-soft); color: var(--terracotta); }
.equip-status-tag.sched { background: var(--amber-soft); color: #7A5410; }
.search-bar { display: flex; gap: 8px; margin-bottom: 14px; }
.search-bar input { flex: 1; padding: 9px 12px; border-radius: 8px; border: 1px solid var(--border); font-size: 13.5px; background: #fff; }
.few-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.few-table th { text-align: left; font-size: 10.5px; color: var(--text-faint); text-transform: uppercase; letter-spacing: 0.03em; padding: 0 8px 7px; font-weight: 600; border-bottom: 1px solid var(--border); }
.few-table th.num, .few-table td.num { text-align: right; font-family: var(--font-mono); }
.few-table td { padding: 7px 8px; border-bottom: 1px solid var(--border); }
.few-table tbody tr:hover { background: var(--bg-soft); cursor: pointer; }
.few-table .neg { color: var(--red); }
.few-table .pos { color: var(--green-mid); }
.status-chip { font-size: 10.5px; font-weight: 600; padding: 3px 9px; border-radius: var(--radius-pill); white-space: nowrap; }
.status-chip.done { background: #DCEADF; color: var(--green-mid); }
.status-chip.wait { background: var(--amber-soft); color: #7A5410; }
.status-chip.info { background: var(--blue-soft); color: var(--blue); }
.status-chip.risk { background: var(--red-soft); color: var(--red); }
.spark-cell { width: 70px; }
.spark-cell svg { display: block; }
.micro-bar-cell { width: 90px; }
.micro-bar-track { height: 5px; background: var(--bg-soft); border-radius: 3px; overflow: hidden; }
.micro-bar-fill { height: 100%; background: var(--text-faint); border-radius: 3px; }
.micro-bar-fill.over { background: var(--terracotta); }
.stock-row { display: flex; align-items: center; gap: 14px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 12px 16px; margin-bottom: 7px; cursor: pointer; }
.stock-row:hover { border-color: var(--green-accent); }
.stock-row.alert { border-color: var(--red); }
.stock-icon { width: 32px; height: 32px; border-radius: 50%; background: var(--bg-soft); color: var(--text-mute); display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: 15px; }
.stock-icon.alert { background: var(--red-soft); color: var(--red); }
.stock-name { font-size: 13.5px; font-weight: 600; margin: 0; }
.stock-sub { font-size: 11.5px; color: var(--text-mute); margin: 1px 0 0; }
.stock-right { margin-left: auto; text-align: right; }
.stock-right .v { font-size: 13px; font-weight: 600; }
.stock-right .l { font-size: 10.5px; color: var(--text-faint); }
.tab-row { display: flex; gap: 6px; margin-bottom: 16px; border-bottom: 1px solid var(--border); }
.tab-btn { font-size: 13px; padding: 9px 14px; border: none; background: transparent; color: var(--text-mute); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; font-family: var(--font-body); }
.tab-btn.active { color: var(--green-mid); border-bottom-color: var(--green-mid); font-weight: 600; }
.form-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: 20px 22px; max-width: 480px; }
.form-label { font-size: 12px; color: var(--text-mute); display: block; margin-bottom: 5px; font-weight: 600; }
.form-row { margin-bottom: 13px; }
.form-row.two { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
input:not([type=checkbox]):not([type=radio]):not([type=file]):not([type=range]), select { width: 100%; padding: 9px 11px; border-radius: 8px; border: 1px solid var(--border); font-family: var(--font-body); font-size: 13.5px; background: #fff; color: var(--text-main); }
input:focus, select:focus { outline: 2px solid var(--green-accent); outline-offset: 1px; }
input:disabled { background: var(--bg-soft); color: var(--text-faint); cursor: not-allowed; }
.xml-future { display: flex; align-items: center; gap: 10px; background: var(--bg-soft); border-radius: 9px; padding: 10px 12px; margin-bottom: 16px; font-size: 12px; color: var(--text-mute); }
.xml-future i { font-size: 16px; color: var(--text-faint); }
.xml-future .soon { margin-left: auto; font-size: 10.5px; padding: 2px 8px; border-radius: var(--radius-pill); background: var(--amber-soft); color: #7A5410; font-weight: 600; }
.loc-chip { display: inline-flex; align-items: center; gap: 6px; background: var(--bg-soft); border-radius: 7px; padding: 4px 10px; font-size: 12px; font-weight: 600; color: var(--text-main); cursor: pointer; }
.loc-chip:hover { background: var(--border); }
.loc-chip.empty { background: var(--terracotta-soft); color: #8A3F25; }
.loc-chip i { font-size: 13px; color: var(--text-mute); }
.loc-chip.empty i { color: #8A3F25; }
.loc-chip-input { border: 1.5px solid var(--good); border-radius: 7px; padding: 3px 8px; font-size: 12px; font-weight: 600; width: 60px; outline: none; }
.pp-search-wrap { position: relative; margin-bottom: 4px; }
.pp-search-wrap i { position: absolute; left: 14px; top: 50%; transform: translateY(-50%); font-size: 16px; color: var(--text-faint); }
.pp-search-wrap input { width: 100%; padding: 13px 14px 13px 40px; border-radius: 10px; border: 1px solid var(--border); font-size: 15px; box-sizing: border-box; background: #fff; font-family: var(--font-body); }
.pp-stat-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin: 20px 0 24px; }
.pp-stat { background: var(--bg-soft); border-radius: 12px; padding: 16px; }
.pp-stat.good { background: var(--good-soft); }
.pp-stat .lbl { font-size: 11px; color: var(--text-mute); margin: 0 0 6px; text-transform: uppercase; letter-spacing: 0.03em; }
.pp-stat.good .lbl { color: #2F5A3D; }
.pp-stat .num { font-family: var(--font-display); font-size: 22px; margin: 0; color: var(--text-main); }
.pp-stat.good .num { color: var(--good); }
.pp-stat.warn { background: var(--amber-soft); }
.pp-stat.warn .lbl { color: #7A5410; }
.pp-stat.warn .num { color: var(--amber); }
.pp-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 16px; padding: 24px; }
.pp-field-label { font-size: 14px; color: var(--text-main); font-weight: 700; display: block; margin-bottom: 10px; }
.pp-price-wrap { position: relative; margin-bottom: 8px; }
.pp-price-currency { position: absolute; left: 16px; top: 50%; transform: translateY(-50%); font-size: 22px; color: var(--text-faint); font-family: var(--font-display); }
input.pp-price-input { width: 100%; padding: 16px 16px 16px 48px; border-radius: 12px; border: 2px solid var(--good); font-size: 26px; font-family: var(--font-display); box-sizing: border-box; color: var(--text-main); background: #FBFCFA; }
.pp-imposto-note { font-size: 11.5px; color: var(--text-faint); margin: 0 0 20px; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
input[type=number].pp-imposto-inline { width: 42px; padding: 3px 6px; border-radius: 6px; border: 1px solid var(--border); font-size: 11.5px; text-align: center; display: inline-block; }
.pp-flow-summary { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 13px; color: var(--text-mute); background: var(--bg-soft); border-radius: 10px; padding: 12px 14px; margin-bottom: 20px; }
.pp-flow-summary b { color: var(--text-main); }
.pp-flow-summary b.neg { color: var(--red); }
.pp-flow-summary b.pos { color: var(--good); }
.pp-flow-summary i { font-size: 13px; color: var(--text-faint); }
.pp-margem-banner { display: flex; align-items: center; gap: 10px; background: var(--amber-soft); border-radius: 10px; padding: 12px 14px; margin-bottom: 20px; font-size: 13px; color: #7A5410; }
.pp-margem-banner i { font-size: 17px; color: var(--amber); }
.ps-back-btn { width: 36px; height: 36px; border-radius: 10px; border: 1px solid var(--border); background: #fff; display: flex; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0; }
.ps-back-btn i { font-size: 17px; color: var(--text-mute); }
.ps-add-peca-row { display: grid; grid-template-columns: 2fr 1fr auto; gap: 8px; margin-top: 10px; }
.ps-add-peca-row input[type=number] { text-align: center; }
.ps-add-peca-row .pp-search-wrap input { padding: 9px 11px 9px 32px; font-size: 13px; }
.ps-add-peca-row .pp-search-wrap i { font-size: 14px; }
.ps-add-peca-row input[type=number] { padding: 9px 11px; font-size: 13px; border-radius: 10px; border: 1px solid var(--border); box-sizing: border-box; }
.ledger-remove { width: 22px; height: 22px; border-radius: 6px; border: none; background: transparent; cursor: pointer; display: flex; align-items: center; justify-content: center; margin-left: 6px; }
.ledger-remove i { font-size: 14px; color: var(--text-faint); }
.ledger-remove:hover i { color: var(--red); }
.ps-tab-row { display: flex; gap: 6px; margin-bottom: 20px; overflow-x: auto; }
.ps-tab-btn { font-size: 13px; padding: 10px 16px; border: 1px solid var(--border); border-radius: 10px; background: #fff; color: var(--text-mute); font-weight: 600; display: flex; align-items: center; gap: 7px; white-space: nowrap; cursor: pointer; font-family: var(--font-body); }
.ps-tab-btn.active { background: var(--green-deep); color: #fff; border-color: var(--green-deep); }
.ps-tab-badge { background: var(--bg-soft); font-size: 11px; padding: 1px 7px; border-radius: 99px; color: var(--text-mute); }
.ps-tab-badge.active { background: var(--terracotta); color: #fff; }
.ps-tab-badge.danger { background: var(--red-soft); color: var(--red); }
.ps-os-icon { width: 38px; height: 38px; border-radius: 10px; background: var(--bg-soft); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.ps-os-icon i { font-size: 18px; color: var(--text-mute); }
.ps-os-icon.good { background: var(--good-soft); }
.ps-os-icon.good i { color: var(--good); }
.ps-os-icon.warn { background: var(--terracotta-soft); }
.ps-os-icon.warn i { color: var(--terracotta); }
.rec-insight-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 18px; }
.rec-insight-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 14px; padding: 18px; }
.rec-insight-title { font-size: 11px; color: var(--text-faint); text-transform: uppercase; letter-spacing: 0.03em; margin: 0 0 12px; }
.rec-insight-row { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid var(--bg-soft); }
.rec-insight-row:last-child { border-bottom: none; }
.rec-insight-row .nm { font-size: 13px; color: var(--text-main); font-weight: 600; }
.rec-insight-row .val { font-size: 12px; color: var(--red); font-weight: 700; }
.rec-causa-banner { display: flex; gap: 12px; align-items: flex-start; background: var(--blue-soft); border-radius: 14px; padding: 16px 18px; margin-bottom: 24px; }
.rec-causa-banner i { font-size: 19px; color: var(--blue); flex-shrink: 0; margin-top: 1px; }
.rec-causa-banner .t { font-size: 13px; font-weight: 700; margin: 0; color: #0C447C; }
.rec-causa-banner .d { font-size: 12px; margin: 4px 0 0; color: #1F4368; line-height: 1.5; }
.fin-tab-row { display: flex; gap: 6px; margin-bottom: 20px; overflow-x: auto; }
.fin-tab-btn { font-size: 13px; padding: 10px 16px; border: 1px solid var(--border); border-radius: 10px; background: #fff; color: var(--text-mute); font-weight: 600; display: flex; align-items: center; gap: 7px; white-space: nowrap; cursor: pointer; font-family: var(--font-body); }
.fin-tab-btn.active { background: var(--green-deep); color: #fff; border-color: var(--green-deep); }
.cal-legend { display: flex; gap: 16px; font-size: 12px; color: var(--text-mute); margin-bottom: 14px; flex-wrap: wrap; }
.cal-legend span { display: flex; align-items: center; gap: 6px; }
.cal-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.cal-dot.red { background: var(--red); }
.cal-dot.amber { background: var(--amber); }
.cal-dot.blue { background: var(--blue); }
.cal-weekdays { display: grid; grid-template-columns: repeat(7,1fr); text-align: center; font-size: 11px; font-weight: 700; color: var(--text-faint); text-transform: uppercase; margin-bottom: 6px; }
.cal-grid { display: grid; grid-template-columns: repeat(7,1fr); gap: 6px; }
.cal-day { min-height: 62px; border-radius: 10px; border: 1px solid var(--border); background: var(--bg-card); padding: 6px 6px; position: relative; }
.cal-day.empty { border: none; background: transparent; }
.cal-day.has-evento { cursor: pointer; }
.cal-day.has-evento:hover { border-color: var(--green-accent); }
.cal-day.hoje { border: 1.5px solid var(--green-mid); }
.cal-daynum { font-size: 12px; color: var(--text-mute); font-weight: 600; }
.cal-day.hoje .cal-daynum { color: var(--green-mid); font-weight: 800; }
.cal-dots { position: absolute; bottom: 8px; left: 6px; display: flex; gap: 3px; }
.status-badge { font-size: 11px; font-weight: 700; padding: 3px 9px; border-radius: 20px; display: inline-block; }
.status-badge.good { background: var(--good-soft); color: #235C3E; }
.status-badge.warn { background: var(--amber-soft); color: #7A5410; }
.mes-nav-df { display: flex; align-items: center; justify-content: center; gap: 16px; margin-bottom: 16px; }
.mes-nav-df button { border: 1px solid var(--border); background: #fff; width: 30px; height: 30px; border-radius: 50%; font-size: 14px; cursor: pointer; color: var(--text-main); display: flex; align-items: center; justify-content: center; }
.mes-nav-df-label { font-size: 12.5px; font-weight: 700; color: var(--text-mute); text-transform: uppercase; letter-spacing: .4px; min-width: 140px; text-align: center; }
.df-faturamento-input { margin-top: 8px; width: 100%; padding: 7px 9px; border: 1px solid var(--border); border-radius: 7px; font-size: 12.5px; background: #fff; color: var(--text-main); font-family: var(--font-body); }
.fin-tab-badge { background: var(--bg-soft); font-size: 10.5px; padding: 1px 7px; border-radius: 99px; color: var(--text-mute); }
.fin-tab-badge.danger { background: var(--red-soft); color: var(--red); }
.fin-tab-badge.warn { background: var(--amber-soft); color: #7A5410; }
.fin-stat-row3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-bottom: 22px; }
.fin-stat { background: var(--bg-soft); border-radius: 12px; padding: 16px; }
.fin-stat.good { background: var(--good-soft); }
.fin-stat.danger { background: var(--red-soft); }
.fin-stat.warn { background: var(--amber-soft); }
.fin-stat .lbl { font-size: 11px; color: var(--text-mute); margin: 0 0 6px; text-transform: uppercase; letter-spacing: 0.03em; }
.fin-stat.good .lbl { color: #2F5A3D; }
.fin-stat.danger .lbl { color: #7A2A24; }
.fin-stat.warn .lbl { color: #7A5410; }
.fin-stat .num { font-family: var(--font-display); font-size: 21px; margin: 0; color: var(--text-main); }
.fin-stat.good .num { color: var(--good); }
.fin-stat.danger .num { color: var(--red); }
.fin-stat.warn .num { color: var(--amber); }
.fin-section-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; }
.fin-ledger-list { display: flex; flex-direction: column; gap: 8px; }
.fin-ledger-row { display: flex; align-items: center; gap: 12px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 13px 16px; }
.fin-ledger-icon { width: 34px; height: 34px; border-radius: 9px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; background: var(--bg-soft); }
.fin-ledger-icon i { font-size: 16px; color: var(--text-mute); }
.fin-ledger-icon.in { background: var(--good-soft); }
.fin-ledger-icon.in i { color: var(--good); }
.fin-ledger-icon.out { background: var(--red-soft); }
.fin-ledger-icon.out i { color: var(--red); }
.fin-ledger-icon.warn { background: var(--amber-soft); }
.fin-ledger-icon.warn i { color: var(--amber); }
.fin-ledger-row .nm { font-size: 13px; font-weight: 600; margin: 0; color: var(--text-main); }
.fin-ledger-row .sub { font-size: 11px; color: var(--text-mute); margin: 1px 0 0; }
.fin-ledger-row .val { font-family: var(--font-display); font-size: 15px; }
.fin-ledger-row .val.in { color: var(--good); }
.fin-ledger-row .val.out { color: var(--red); }
.fin-ledger-row .val.warn { color: var(--amber); }
.fin-edit-btn { width: 26px; height: 26px; border-radius: 7px; border: none; background: var(--bg-soft); cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.fin-edit-btn i { font-size: 13px; color: var(--text-faint); }
.fin-conta-list { display: flex; flex-direction: column; gap: 8px; }
.fin-conta-card { border-radius: 12px; padding: 14px 16px; background: var(--bg-card); border: 1px solid var(--border); }
.fin-conta-card.danger { background: var(--red-soft); border-color: transparent; }
.fin-conta-card.warn { background: var(--amber-soft); border-color: transparent; }
.fin-conta-top { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }
.fin-conta-top i { font-size: 17px; color: var(--text-mute); flex-shrink: 0; }
.fin-conta-card.danger .fin-conta-top i { color: var(--red); }
.fin-conta-card.warn .fin-conta-top i { color: var(--amber); }
.fin-conta-top .nm { font-size: 13.5px; font-weight: 700; margin: 0; color: var(--text-main); }
.fin-conta-top .sub { font-size: 11px; margin: 2px 0 0; color: var(--text-mute); }
.fin-conta-card.danger .fin-conta-top .sub { color: #7A2A24; }
.fin-conta-card.warn .fin-conta-top .sub { color: #7A5410; }
.fin-conta-top .val { font-family: var(--font-display); font-size: 16px; color: var(--text-main); white-space: nowrap; }
.fin-conta-actions { display: flex; gap: 8px; }
.attach-box { display: flex; align-items: center; gap: 10px; border: 1px dashed var(--border); border-radius: 9px; padding: 14px; cursor: pointer; font-size: 13px; color: var(--text-mute); background: var(--bg-soft); }
.attach-box:hover { border-color: var(--green-accent); }
.attach-box i { font-size: 18px; }
.toggle-row { display: flex; gap: 8px; }
.toggle-opt { flex: 1; padding: 10px; border-radius: 9px; border: 1px solid var(--border); background: #fff; color: var(--text-mute); font-size: 12.5px; font-weight: 600; display: flex; align-items: center; justify-content: center; gap: 6px; cursor: pointer; }
.toggle-opt.selected { background: var(--green-deep); color: #fff; border-color: var(--green-deep); }
.fp-list { display: flex; flex-direction: column; gap: 6px; }
.fp-row { display: flex; align-items: center; gap: 12px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 12px 16px; }
.fp-row.mecanico { background: var(--good-soft); border-color: transparent; }
.fp-avatar { width: 36px; height: 36px; border-radius: 50%; background: var(--bg-soft); display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700; color: var(--text-mute); flex-shrink: 0; }
.fp-avatar.mecanico { background: #fff; color: var(--good); }
.fp-name { font-size: 13.5px; font-weight: 700; margin: 0; color: var(--text-main); }
.fp-sub { font-size: 11px; margin: 1px 0 0; color: var(--text-mute); }
.fp-row.mecanico .fp-sub { color: #2F5A3D; }
.fp-rh { font-family: var(--font-display); font-size: 16px; color: var(--good); width: 64px; text-align: right; }
.fp-rh.muted { color: var(--text-faint); font-size: 16px; }
.fp-gift-btn { width: 30px; height: 30px; border-radius: 8px; border: none; background: #fff; cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.fp-row:not(.mecanico) .fp-gift-btn { background: var(--bg-soft); }
.fp-gift-btn i { font-size: 15px; color: var(--amber); }
.eq-action-wrap { position: relative; display: inline-block; }
.eq-action-btn { width: 26px; height: 26px; border-radius: 50%; border: 1px solid var(--border); background: #fff; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; color: var(--text-mute); vertical-align: middle; transition: all .12s ease; }
.eq-action-btn.plus:hover { background: var(--good-soft); color: var(--good); border-color: var(--good); }
.eq-action-btn.x { margin-left: 5px; }
.eq-action-btn.x:hover { background: var(--red-soft); color: var(--red); border-color: var(--red); }
.eq-action-btn.redo { color: var(--text-mute); }
.eq-action-btn.redo:hover { background: var(--blue-soft); color: var(--blue); border-color: var(--blue); }
.eq-dropdown { position: absolute; right: 0; top: 32px; background: #fff; border: 1px solid var(--border); border-radius: 12px; box-shadow: 0 12px 32px rgba(20,16,8,0.16); min-width: 226px; z-index: 60; padding: 6px; display: none; }
.eq-dropdown.open { display: block; animation: eqDropIn .12s ease; }
@keyframes eqDropIn { from { opacity:0; transform: translateY(-4px); } to { opacity:1; transform: translateY(0); } }
.eq-dropdown button { width: 100%; text-align: left; padding: 9px 10px; border: none; background: transparent; border-radius: 8px; font-size: 12.5px; cursor: pointer; color: var(--text-main); display: flex; align-items: center; gap: 10px; white-space: nowrap; }
.eq-dropdown button:hover { background: var(--bg-soft); }
.eq-dropdown button svg { color: var(--text-mute); flex-shrink: 0; }
.eq-link-btn { border: none; background: transparent; color: var(--green-mid); font-size: 11px; font-weight: 700; cursor: pointer; padding: 0; margin-left: 8px; }
.eq-link-btn:hover { text-decoration: underline; }
.eq-muted { color: var(--text-faint); }
.eq-table-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 14px; padding: 6px 8px; }
.eq-table th { white-space: nowrap; padding-bottom: 12px; }
.eq-table td { padding: 12px 10px; vertical-align: middle; }
.eq-table tbody tr:last-child td { border-bottom: none; }
.eq-table tbody tr.eq-row-off { opacity: 0.5; }
.eq-table tbody tr.eq-row-off:hover { background: transparent; cursor: default; }
.eq-person { display: flex; align-items: center; gap: 10px; }
.eq-avatar { width: 30px; height: 30px; border-radius: 50%; background: var(--bg-soft); color: var(--text-mute); display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 700; flex-shrink: 0; }
.eq-avatar.mecanico { background: var(--good-soft); color: var(--good); }
.eq-name { font-weight: 700; font-size: 13px; color: var(--text-main); margin: 0; }
#afAnexoBtn.attached { background: var(--good-soft); border-color: var(--good); color: var(--good); }
.eq-anexo-link { color: var(--blue); display: inline-flex; cursor: pointer; }
.eq-anexo-link:hover { color: var(--green-deep); }
.doc-row { display: flex; align-items: center; gap: 12px; padding: 12px 14px; border: 1px solid var(--border); border-radius: 10px; margin-bottom: 8px; background: var(--bg-card); }
.doc-row.tem-anexo .doc-icon { background: var(--good-soft); color: var(--good); }
.doc-icon { width: 34px; height: 34px; border-radius: 8px; background: var(--bg-soft); display: flex; align-items: center; justify-content: center; color: var(--text-mute); flex-shrink: 0; }
.doc-info { flex: 1; min-width: 0; }
.doc-nome { font-weight: 700; font-size: 13px; margin: 0; color: var(--text-main); }
.doc-sub { font-size: 11.5px; color: var(--text-mute); margin: 2px 0 0; }
.doc-valor { font-size: 13px; font-weight: 600; color: var(--text-main); margin-right: 4px; white-space: nowrap; }
.doc-btn-abrir { background: var(--blue); color: #fff; border: none; border-radius: 8px; padding: 8px 14px; font-size: 12px; font-weight: 600; cursor: pointer; white-space: nowrap; text-decoration: none; display: inline-flex; align-items: center; gap: 6px; }
.doc-btn-abrir:hover { background: #1F4368; }
.doc-sem-anexo { font-size: 11px; color: var(--text-faint); font-style: italic; white-space: nowrap; }
.chat-toggle { display: flex; gap: 8px; margin-bottom: 16px; }
.chat-toggle .opt { flex: 1; padding: 10px; border-radius: 10px; border: 1px solid var(--border); background: #fff; color: var(--text-mute); font-size: 13px; font-weight: 600; display: flex; align-items: center; justify-content: center; gap: 7px; cursor: pointer; }
.chat-toggle .opt.selected { background: var(--green-deep); color: #fff; border-color: var(--green-deep); }
.chat-window { background: var(--bg-card); border: 1px solid var(--border); border-radius: 16px; padding: 18px; margin-bottom: 12px; min-height: 220px; }
.chat-msgs { display: flex; flex-direction: column; gap: 12px; margin-bottom: 14px; }
.msg-row { display: flex; gap: 10px; align-items: flex-end; }
.msg-row.me { justify-content: flex-end; }
.msg-avatar { width: 28px; height: 28px; border-radius: 50%; background: var(--bg-soft); display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 700; color: var(--text-mute); flex-shrink: 0; }
.msg-avatar.system { background: var(--blue-soft); color: var(--blue); font-size: 13px; }
.msg { padding: 10px 14px; max-width: 80%; font-size: 13px; line-height: 1.5; }
.msg.them { background: var(--bg-soft); border-radius: 14px 14px 14px 4px; color: var(--text-main); }
.msg.me { background: var(--green-deep); border-radius: 14px 14px 4px 14px; color: #fff; }
.msg.system { background: var(--blue-soft); border-radius: 14px 14px 14px 4px; color: #0C447C; }
.msg-meta { font-size: 10px; margin-top: 4px; opacity: 0.7; }
.msg.me .msg-meta { color: rgba(255,255,255,0.7); }
.msg.them .msg-meta, .msg.system .msg-meta { color: var(--text-faint); }
.chat-input { display: flex; gap: 8px; }
.chat-input input { flex: 1; padding: 12px 14px; border-radius: 10px; border: 1px solid var(--border); font-size: 13.5px; box-sizing: border-box; }
.chat-input .btn.primary { width: 44px; height: 44px; border-radius: 10px; padding: 0; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.breakdown { background: var(--bg-soft); border-radius: 9px; padding: 12px 14px; margin: 14px 0; }
.breakdown-row { display: flex; justify-content: space-between; font-size: 13px; padding: 5px 0; }
.breakdown-row.total { border-top: 1px solid var(--border); margin-top: 4px; padding-top: 9px; font-weight: 600; }
.breakdown-row .neg { color: var(--red); }
.breakdown-row .pos { color: var(--green-mid); }
.margin-target-row { display: flex; align-items: center; gap: 10px; margin-bottom: 4px; }
.margin-target-row input[type=range] { flex: 1; }
.margin-target-val { font-family: var(--font-display); font-size: 16px; width: 46px; text-align: right; }
.suggested-price { background: #DCEADF; border-radius: 9px; padding: 12px 14px; margin: 14px 0; text-align: center; }
.suggested-price .lbl { font-size: 11.5px; color: #2F5A3D; }
.suggested-price .val { font-family: var(--font-display); font-size: 26px; color: var(--green-mid); margin: 2px 0 0; }
.os-search-results { max-width: 480px; margin-top: 6px; margin-bottom: 0; display: flex; flex-direction: column; gap: 5px; }
.os-search-results.empty { display: none; }
.os-search-item { display: flex; align-items: center; gap: 10px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 9px; padding: 8px 12px; cursor: pointer; font-size: 12.5px; }
.os-search-item:hover { border-color: var(--green-accent); }
.os-search-item .num { color: var(--text-faint); width: 42px; flex-shrink: 0; }
.os-search-item .name { font-weight: 600; flex: 1; }
.os-search-item .tag { font-size: 10px; padding: 2px 7px; border-radius: var(--radius-pill); white-space: nowrap; }
.os-search-item .tag.open { background: var(--bg-soft); color: var(--text-mute); }
.os-search-item .tag.done { background: #DCEADF; color: var(--green-mid); }
.ref-card { display: flex; gap: 10px; align-items: flex-start; background: var(--blue-soft); border-radius: 9px; padding: 10px 12px; margin: 14px 0; max-width: 480px; }
.ref-card i { font-size: 16px; color: var(--blue); margin-top: 1px; }
.ref-card .ref-title { font-size: 12.5px; font-weight: 600; margin: 0; color: #1F4368; }
.ref-card .ref-sub { font-size: 12px; margin: 2px 0 0; color: #1F4368; }
.cost-source { font-size: 11px; color: var(--text-faint); margin-top: 4px; }
.btn { font-family: var(--font-body); font-size: 13px; padding: 8px 16px; border-radius: 9px; border: 1px solid var(--border); background: var(--bg-card); color: var(--text-main); cursor: pointer; }
.btn.primary { background: var(--green-deep); border-color: var(--green-deep); color: #fff; font-weight: 600; }
.btn.full { width: 100%; display: flex; align-items: center; justify-content: center; gap: 8px; padding: 13px; font-size: 14px; }
.btn.ghost { background: transparent; }
.alert-box { display: flex; gap: 12px; align-items: flex-start; border-radius: var(--radius-card); padding: 13px 15px; margin-bottom: 20px; }
.alert-box.warn { background: var(--terracotta-soft); }
.alert-box.danger { background: var(--red-soft); }
.alert-box.danger i { color: var(--red); }
.alert-box.danger .t, .alert-box.danger .d { color: #7A2A24; }
.alert-box i { font-size: 18px; color: var(--terracotta); flex-shrink: 0; margin-top: 1px; }
.alert-box .t { font-weight: 600; font-size: 13.5px; margin: 0; color: #8A3F25; }
.alert-box .d { font-size: 12.5px; margin: 3px 0 0; color: #8A3F25; }
@media (max-width: 940px) {
.sidebar { width: 76px; padding: 20px 8px; }
.brand-name, .nav-item span, .sidebar-footer .name, .sidebar-footer .role, .nav-group-label { display: none; }
.nav-item { justify-content: center; padding: 12px 0; }
.nav-badge { display: none; }
.clickable-stat-row { grid-template-columns: repeat(2,1fr); }
.two-col { grid-template-columns: 1fr; }
.main { padding: 22px 16px 40px; }
}
.fin-origin-tag { display: inline-block; font-size: 10.5px; font-weight: 600; padding: 2px 7px; border-radius: 20px; }
.fin-origin-tag.recepcao { background: var(--good-soft); color: #2F5A3D; }
.fin-origin-tag.gestao-manual { background: var(--amber-soft); color: #7A5410; }
.fin-origin-tag.gestao-auto { background: #E3E9F5; color: #2A3F6E; }
.fin-edit-btn-txt { display: flex; align-items: center; gap: 5px; border: 1px solid var(--border); background: var(--bg-card); border-radius: 8px; padding: 6px 11px; font-size: 12px; font-weight: 600; color: var(--text-mute); cursor: pointer; flex-shrink: 0; font-family: var(--font-body); }
.fin-edit-btn-txt:hover { border-color: var(--green-mid); color: var(--green-mid); }
.fin-edit-btn-txt i { font-size: 12px; }
</style>
</head>
<body>
<div class="shell">
<aside class="sidebar">
<div class="brand">
<div class="brand-mark">A</div>
<div class="brand-name">Aluguemaq<span>painel · Gestão</span></div>
</div>
<div class="nav-owner-label"><span class="dot"></span><span>Marcelo</span></div>
<button class="nav-item" data-view="visaogeral" onclick="showView('visaogeral', this)">
<i class="ti ti-sun"></i><span>Painel do Dia</span>
</button>
<div class="nav-group-label" style="padding-top:14px;">Operação</div>
<button class="nav-item" data-view="oficina" onclick="showView('oficina', this)">
<i class="ti ti-tool"></i><span>Oficina</span>
</button>
<button class="nav-item" data-view="loja" onclick="showView('loja', this)">
<i class="ti ti-building-store"></i><span>Loja</span>
</button>
<button class="nav-item" data-view="pecas" onclick="showView('pecas', this)">
<i class="ti ti-settings"></i><span>Peças</span>
</button>
<button class="nav-item" data-view="estoque" onclick="showView('estoque', this)">
<i class="ti ti-forklift"></i><span>Estoque de Equipamentos</span>
</button>
<div class="nav-owner-label lucilene"><span class="dot"></span><span>Lucilene</span></div>
<button class="nav-item" data-view="fin-caixa" onclick="showView('fin-caixa', this)">
<i class="ti ti-cash"></i><span>Painel do Dia</span>
</button>
<button class="nav-item" data-view="fin-contas" onclick="showView('fin-contas', this)">
<i class="ti ti-file-invoice"></i><span>Contas a Pagar e Receber</span>
</button>
<button class="nav-item" data-view="fin-folha" onclick="showView('fin-folha', this)">
<i class="ti ti-users"></i><span>Gestão Equipe</span>
</button>
<button class="nav-item" data-view="fin-pessoal" onclick="showView('fin-pessoal', this)">
<i class="ti ti-home-heart"></i><span>Despesas Família</span>
</button>
<div class="sidebar-footer">
<div class="avatar-mini">M</div>
<div style="flex:1;"><div class="name">Marcelo</div><div class="role">Gestão</div></div>
<i class="ti ti-message-circle-2" style="font-size:18px; color:#CFD3C7; cursor:pointer;" onclick="showView('chatmarcelo', null)" title="Chat com a Meire"></i>
</div>
</aside>
<main class="main">
<div id="view-estoque" class="view">
<div class="topbar">
<div>
<h1 class="page-title">Estoque de Equipamentos</h1>
<p class="page-sub">Quantidade, custo médio, indenização e diárias — o que você editar aqui passa a valer nos próximos contratos</p>
</div>
</div>
<div id="estoque-gestao-list"></div>
</div>
<div id="view-visaogeral" class="view active">
<div class="topbar">
<div>
<h1 class="page-title">Bom dia, Marcelo</h1>
<p class="page-sub">O essencial do negócio, de um olhar só</p>
</div>
<label class="today-pill" style="display:flex; align-items:center; gap:6px; cursor:pointer;" onclick="openGestaoDatePicker('vg')">
<i class="ti ti-calendar-event"></i>
<span id="vg-data-label">terça, 23 de junho</span>
<input type="date" id="vg-data-input" onchange="onGestaoDataChange('vg')" style="position:absolute; opacity:0; width:1px; height:1px;">
</label>
</div>
<div id="vg-data-banner" style="display:none; margin:0 0 16px; padding:11px 14px; background:var(--amber-soft); border:1px solid rgba(122,84,16,0.18); border-radius:10px; font-size:12.5px; color:#7A5410; align-items:center; gap:10px;">
<i class="ti ti-history"></i>
<span id="vg-data-banner-text" style="flex:1;">—</span>
<button onclick="voltarGestaoHoje('vg')" style="border:none; background:#7A5410; color:#fff; font-size:12px; font-weight:600; padding:6px 12px; border-radius:999px; cursor:pointer;">Voltar para hoje</button>
</div>
<p class="section-label" style="margin-top:0;">Acesso rápido</p>
<div class="vg-shortcuts">
<div class="vg-shortcut" onclick="showView('oficina', document.querySelector('[data-view=oficina]'))"><i class="ti ti-tool"></i>Oficina</div>
<div class="vg-shortcut" onclick="showView('loja', document.querySelector('[data-view=loja]'))"><i class="ti ti-building-store"></i>Loja</div>
<div class="vg-shortcut" onclick="showView('pecas', document.querySelector('[data-view=pecas]'))"><i class="ti ti-chart-line"></i>Peças</div>
<div class="vg-shortcut" onclick="showView('fin-caixa', document.querySelector('[data-view=fin-caixa]'))"><i class="ti ti-report-money"></i>Caixa</div>
</div>
<div id="prontas-retirada-box-gestao" style="margin-bottom:16px;"></div>
<p class="section-label">Hoje vs. ontem</p>
<div class="vg-grid-top three">
<div class="vg-card-big warn">
<div class="vg-top"><span class="vg-icon vg-sign" id="vg-sign-saldo" style="background:rgba(201,138,43,0.18); color:var(--amber);">+</span><span class="vg-trend up">+8% vs. ontem</span></div>
<p class="vg-num-big">R$ 8.940</p>
<p class="vg-label-big">Saldo em caixa hoje</p>
</div>
<div class="vg-card-big good">
<div class="vg-top"><span class="vg-icon vg-sign" style="background:rgba(47,143,91,0.16); color:var(--good);">+</span><span class="vg-trend up">+22% vs. ontem</span></div>
<p class="vg-num-big">R$ 1.840</p>
<p class="vg-label-big">Entrou hoje</p>
</div>
<div class="vg-card-big danger">
<div class="vg-top"><span class="vg-icon vg-sign">−</span><span class="vg-trend down">-15% vs. ontem</span></div>
<p class="vg-num-big">R$ 540</p>
<p class="vg-label-big">Saiu hoje</p>
</div>
</div>
<button class="section-toggle" id="resumo-op-toggle" onclick="toggleResumoOperacao()">
<span>Resumo da operação</span>
<span class="section-toggle-hint" id="resumo-op-hint">(Ver mais)</span>
<svg class="section-toggle-chev" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"/></svg>
</button>
<div class="vg-summary-list" id="vg-summary-list" style="display:none;">
<div class="vg-summary-row danger">
<i class="ti ti-alert-octagon"></i>
<div>
<p class="t">2 equipamentos já foram retirados sem o cliente pagar</p>
<p class="d">Helio Flavano (4 dias) e Lucas Batista (6 dias).</p>
</div>
</div>
<div class="vg-summary-row warn">
<i class="ti ti-file-invoice"></i>
<div>
<p class="t">3 contratos estão pendentes de pagamento</p>
<p class="d">Carlos Eduardo Pires (R$ 290), Wederson Candido (R$ 435) e Diogo Silva (R$ 175).</p>
</div>
</div>
<div class="vg-summary-row amber">
<i class="ti ti-clock-pause"></i>
<div>
<p class="t">2 OS estão aguardando peça chegar para finalizar serviço</p>
<p class="d">Betoneira 400L de Geraldo Eustáquio (6 dias, aguardando rolamento) e Compressor de ar da Fazenda Dom Bosco (8 dias, aguardando correia).</p>
</div>
</div>
<div class="vg-summary-row warn">
<i class="ti ti-ban"></i>
<div>
<p class="t">2 OS tiveram o orçamento recusado</p>
<p class="d">OS #236 — Serra mármore (Samuel, R$ 220) e OS #198 — Lavadora alta pressão (Maria A. Lopes, R$ 340).</p>
</div>
</div>
<div class="vg-summary-row info">
<i class="ti ti-inbox"></i>
<div>
<p class="t">3 OS estão em aberto na oficina, sem preço definido</p>
<p class="d">OS #245 — Martelete Bosch, OS #241 — Betoneira 400L e OS #246 — Esmerilhadeira 7".</p>
</div>
</div>
<div class="vg-summary-row info">
<i class="ti ti-tool"></i>
<div>
<p class="t">2 OS estão em andamento na oficina</p>
<p class="d">Sendo executadas pelos mecânicos José e Carlos.</p>
</div>
</div>
<div class="vg-summary-row good">
<i class="ti ti-file-invoice"></i>
<div>
<p class="t">14 contratos estão ativos no momento</p>
<p class="d">3 contratos foram iniciados hoje.</p>
</div>
</div>
</div>
<p class="panel-note" id="vg-summary-sync-note" style="margin:-12px 0 20px; display:none;">Dados ilustrativos deste protótipo — em produção, essa lista atualiza sozinha sempre que a Meire lança um contrato a prazo ou o mecânico registra uma OS aguardando peça.</p>
<p class="section-label">Esse mês até hoje, vs. mês passado</p>
<div class="vg-card-big good mes-compare-card" style="margin-bottom:14px;">
<div class="vg-top"><span class="vg-icon vg-sign">+</span><span class="vg-trend up">+18% vs. mês passado</span></div>
<p class="vg-num-big">+ R$ 4.260</p>
<p class="vg-label-big">Lucro até dia 23 (mês passado nesse ponto: + R$ 3.610)</p>
</div>
<div class="mom-grid" style="grid-template-columns: repeat(2,1fr); margin-bottom:16px;">
<div class="mom-card">
<p class="mom-lbl">Entradas</p>
<p class="mom-num good">R$ 21.340</p>
<p class="mom-cmp">mês passado: R$ 19.800 <span class="up">+8%</span></p>
</div>
<div class="mom-card">
<p class="mom-lbl">Saídas</p>
<p class="mom-num danger">R$ 17.080</p>
<p class="mom-cmp">mês passado: R$ 16.190 <span class="down">+5%</span></p>
</div>
</div>
<div class="fat-compare-box receita">
<p class="section-label" style="margin:0 0 2px;">Faturamento por linha</p>
<div class="fat-compare-legend">
<span><span class="fat-compare-dot" style="background:rgba(180,170,150,0.4);"></span>Mês passado</span>
<span><span class="fat-compare-dot" style="background:var(--good);"></span>Mês atual</span>
</div>
<div class="fat-compare-row">
<div class="fat-compare-head"><span class="fat-compare-label">Locação</span><span class="fat-compare-delta up">+12%</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill prev" style="width:56%;"></div><span class="fat-bar-val">R$ 11.100</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill curr" style="width:62%;"></div><span class="fat-bar-val curr">R$ 12.400</span></div>
</div>
<div class="fat-compare-row">
<div class="fat-compare-head"><span class="fat-compare-label">Oficina</span><span class="fat-compare-delta down">-4%</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill prev" style="width:32%;"></div><span class="fat-bar-val">R$ 6.400</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill curr" style="width:31%;"></div><span class="fat-bar-val curr">R$ 6.140</span></div>
</div>
<div class="fat-compare-row">
<div class="fat-compare-head"><span class="fat-compare-label">Peças</span><span class="fat-compare-delta up">+22%</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill prev" style="width:12%;"></div><span class="fat-bar-val">R$ 2.300</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill curr" style="width:14%;"></div><span class="fat-bar-val curr">R$ 2.800</span></div>
</div>
</div>
<div class="rec-causa-banner" style="margin-top:16px;">
<i class="ti ti-bulb"></i>
<div>
<p class="t">Locação: +12% vs. mês passado</p>
<p class="d">Puxada pela locação de andaimes, que sozinha somou +R$ 900 vs. mês passado.</p>
</div>
</div>
<div class="rec-causa-banner" style="margin-top:10px; background:var(--red-soft);">
<i class="ti ti-trending-down" style="color:var(--red);"></i>
<div>
<p class="t" style="color:#7A2A24;">Oficina: -4% vs. mês passado</p>
<p class="d" style="color:#7A2A24;">2 orçamentos recusados no valor de R$ 560 no total pesaram no resultado do mês.</p>
</div>
</div>
<div class="rec-causa-banner" style="margin-top:10px;">
<i class="ti ti-bulb"></i>
<div>
<p class="t">Peças: +22% vs. mês passado</p>
<p class="d">Compras maiores por causa do aumento de OS na oficina elevaram o volume vendido no balcão.</p>
</div>
</div>
<p class="section-label">Equipamentos parados — considere reduzir preço ou promoção</p>
<div class="eq-parado-card" onclick="openTab('loja','parados')">
<div class="eq-parado-top">
<div class="eq-parado-icon"><i class="ti ti-tool"></i></div>
<div style="flex:1;"><p class="eq-parado-name">Compactador de placa</p><p class="eq-parado-sub">parado há 46 dias · última locação em 08/05</p></div>
<span class="rot-tag parado">parado 30+ dias</span>
</div>
<div class="idle-bar-track"><div class="idle-bar-fill" style="width:95%;"></div></div>
</div>
<div class="eq-parado-card" onclick="openTab('loja','parados')">
<div class="eq-parado-top">
<div class="eq-parado-icon"><i class="ti ti-tool"></i></div>
<div style="flex:1;"><p class="eq-parado-name">Serra mármore (unidade 2)</p><p class="eq-parado-sub">parada há 38 dias · última locação em 16/05</p></div>
<span class="rot-tag parado">parado 30+ dias</span>
</div>
<div class="idle-bar-track"><div class="idle-bar-fill" style="width:80%;"></div></div>
</div>
<div class="eq-parado-card" onclick="openTab('loja','parados')">
<div class="eq-parado-top">
<div class="eq-parado-icon amber"><i class="ti ti-rotate-2"></i></div>
<div style="flex:1;"><p class="eq-parado-name">Betoneira 150L (unidade 3)</p><p class="eq-parado-sub">parada há só 14 dias · só 2 locações nos últimos 6 meses · penúltima em 09/01</p></div>
<span class="rot-tag baixa-rot">baixa rotatividade</span>
</div>
<div class="idle-bar-track"><div class="idle-bar-fill" style="width:40%; background:var(--amber);"></div></div>
</div>
<p class="panel-note" style="margin-top:8px;">Considera tanto equipamento parado há mais de 30 dias quanto equipamento com baixa rotatividade — mesmo parado há pouco tempo, se a penúltima locação foi há muito tempo, o giro dele é baixo.</p>
<div class="vg-shortcut" style="background:#fff; border:1px solid var(--border); margin-top:10px;" onclick="openTab('loja','parados')"><i class="ti ti-hourglass-low"></i>Ver todos os equipamentos parados</div>
</div>
<div id="view-oficina" class="view"><div class="topbar">
<div>
<h1 class="page-title">Oficina</h1>
<p class="page-sub">Clique em qualquer número pra ver as ordens de serviço por trás dele</p>
</div>
<div class="period-select" id="periodo-oficina">
<button class="period-pill" onclick="togglePeriodoDropdown(this)">
<i class="ti ti-calendar"></i><span id="periodo-oficina-label">Semanal · 17 a 23 de junho</span><i class="ti ti-chevron-down"></i>
</button>
<div class="period-dropdown">
<div class="period-dropdown-item" onclick="setPeriodo('oficina','dia', this)">Diário</div>
<div class="period-dropdown-item active" onclick="setPeriodo('oficina','semanal', this)">Semanal</div>
<div class="period-dropdown-item" onclick="setPeriodo('oficina','quinzenal', this)">Quinzenal</div>
<div class="period-dropdown-item" onclick="setPeriodo('oficina','mensal', this)">Mensal</div>
<div class="period-dropdown-item" onclick="abrirPersonalizarPeriodo('oficina', this)">Personalizar período</div><div class="period-custom-range" id="periodo-oficina-custom" style="display:none; padding:8px 10px 6px; border-top:1px solid var(--border); margin-top:4px;"><p style="font-size:11px; color:var(--text-faint); margin:0 0 6px;">Data inicial e data final</p><div style="display:flex; align-items:center; gap:6px; margin-bottom:8px;"><input type="date" id="periodo-oficina-ini" style="width:100%; font-size:12px; padding:6px 7px; border:1px solid var(--border); border-radius:7px; font-family:var(--font-body);"><span style="font-size:11px; color:var(--text-faint);">até</span><input type="date" id="periodo-oficina-fim" style="width:100%; font-size:12px; padding:6px 7px; border:1px solid var(--border); border-radius:7px; font-family:var(--font-body);"></div><button class="btn primary" style="width:100%; padding:7px; font-size:12px;" onclick="aplicarPeriodoPersonalizado('oficina')">Aplicar período</button></div>
</div>
</div>
</div><div class="fin-tab-row"><button class="fin-tab-btn active" data-tab="visaogeral" onclick="setSubTab('oficina','visaogeral', this)">Visão Geral</button><button class="fin-tab-btn" data-tab="precificacao" onclick="setSubTab('oficina','precificacao', this)">Precificação</button><button class="fin-tab-btn" data-tab="comissao" onclick="setSubTab('oficina','comissao', this)">Comissão por mecânico</button><button class="fin-tab-btn" data-tab="pendencias" onclick="setSubTab('oficina','pendencias', this)">Pendências</button></div><div id="tab-oficina-visaogeral" class="tab-panel active">
<div class="clickable-stat-row" id="oficina-stats-row">
<button class="clickable-stat" onclick="openOSModal('aberto')">
<p class="num" id="of-num-aberto">3</p>
<p class="lbl">em aberto <i class="ti ti-chevron-right"></i></p>
</button>
<button class="clickable-stat info" onclick="openOSModal('andamento')">
<p class="num" id="of-num-andamento">2</p>
<p class="lbl">em andamento <i class="ti ti-chevron-right"></i></p>
</button>
<button class="clickable-stat warn" onclick="openOSModal('peca')">
<p class="num" id="of-num-peca">2</p>
<p class="lbl">aguard. peça <i class="ti ti-chevron-right"></i></p>
</button>
<button class="clickable-stat good" onclick="openOSModal('prontas')">
<p class="num" id="of-num-finalizadas">62</p>
<p class="lbl">finalizadas no período <i class="ti ti-chevron-right"></i></p>
</button>
</div>
<p class="section-label">Depois que o mecânico finaliza — o que falta com o cliente</p>
<div class="clickable-stat-row">
<button class="clickable-stat warn" onclick="openOSModal('aguardando_cliente')">
<p class="num">4</p>
<p class="lbl">pronto, aguard. cliente <i class="ti ti-chevron-right"></i></p>
</button>
<button class="clickable-stat info" onclick="openOSModal('pago_nao_retirado')">
<p class="num">1</p>
<p class="lbl">pago, aguard. cliente <i class="ti ti-chevron-right"></i></p>
</button>
<button class="clickable-stat danger" onclick="openOSModal('retirado_nao_pago')">
<p class="num">2</p>
<p class="lbl">retirado, não pago <i class="ti ti-chevron-right"></i></p>
</button>
<button class="clickable-stat" onclick="openOSModal('recusadas_oficina')">
<p class="num">2</p>
<p class="lbl">recusadas no período <i class="ti ti-chevron-right"></i></p>
</button>
</div>
<div class="two-col" style="margin-top:6px;">
<div class="vg-shortcut" style="background:#fff; border:1px solid var(--border);" onclick="showView('finalizadas', null)"><i class="ti ti-clipboard-check"></i>Ver todas as OS finalizadas</div>
<div class="vg-shortcut" style="background:#fff; border:1px solid var(--border);" onclick="openTab('oficina','pendencias')"><i class="ti ti-alert-circle"></i>Ver pendências de pagamento</div>
</div>
<p class="section-label" style="margin-top:20px;">Média de OS por dia da semana — entradas x finalizadas</p>
<div class="panel" style="margin-bottom:22px;">
<div class="chart-wrap" style="height: 220px;"><canvas id="chart-os-semana"></canvas></div>
<div class="legend-row" style="margin-top:10px;">
<span class="legend-item"><span class="legend-dot" style="background:#DDE7F2;"></span>Média de OS que entram</span>
<span class="legend-item"><span class="legend-dot" style="background:var(--good);"></span>Média de OS finalizadas</span>
</div>
<p class="panel-note">Segunda e sexta são os dias que mais recebem equipamento — vale escalar reforço nesses dias. Fim de semana tem bem menos movimento, quase só finalização de serviço que ficou pendente.</p>
</div>
<p class="section-label">Por mecânico hoje</p>
<div class="two-col">
<div class="panel">
<p class="panel-title">José</p>
<div class="os-drill">
<div class="os-drill-row" onclick="openSingleOS('245')">
<span class="os-drill-num">#245</span>
<div style="flex:1;"><p class="os-drill-name">Martelete Bosch</p><p class="os-drill-sub">em andamento · João Paulo</p></div>
<i class="ti ti-message-circle-2 os-drill-comment"></i>
</div>
<div class="os-drill-row late" onclick="openSingleOS('241')">
<span class="os-drill-num">#241</span>
<div style="flex:1;"><p class="os-drill-name">Betoneira 400L</p><p class="os-drill-sub">aguard. peça há 6 dias</p></div>
</div>
</div>
</div>
<div class="panel">
<p class="panel-title">Carlos</p>
<div class="os-drill">
<div class="os-drill-row late" onclick="openSingleOS('238')">
<span class="os-drill-num">#238</span>
<div style="flex:1;"><p class="os-drill-name">Compressor de ar</p><p class="os-drill-sub">aguard. peça há 8 dias</p></div>
</div>
</div>
</div>
</div>
<div class="alert-box" style="background: var(--red-soft);">
<i class="ti ti-alert-octagon" style="color: var(--red);"></i>
<div>
<p class="t" style="color: #7A2A24;">2 equipamentos já foram retirados sem o cliente pagar</p>
<p class="d" style="color: #7A2A24;">Helio Flavano (4 dias) e Lucas Batista (6 dias). Vale a Meire entrar em contato antes que vire inadimplência de locação também.</p>
</div>
</div>
<div class="alert-box warn">
<i class="ti ti-alert-triangle"></i>
<div>
<p class="t">2 ordens de serviço aguardam peça há mais de 5 dias</p>
<p class="d">A escova de carvão está com estoque baixo — pode ser o motivo. Veja em Estoque e reposição.</p>
</div>
</div>
<div class="modal-overlay" id="modal-os">
<div class="modal-box">
<div class="modal-head">
<div>
<p class="modal-title" id="modal-os-title">Em aberto</p>
<p class="modal-sub" id="modal-os-sub">3 ordens de serviço</p>
</div>
<i class="ti ti-x modal-close" onclick="closeModal('modal-os')"></i>
</div>
<div class="os-drill" id="modal-os-list"></div>
</div>
</div>
<div class="modal-overlay" id="modal-single">
<div class="modal-box">
<div class="modal-head">
<div>
<p class="modal-title">OS #245 — Martelete Bosch</p>
<p class="modal-sub">João Paulo · responsável: José</p>
</div>
<i class="ti ti-x modal-close" onclick="closeModal('modal-single')"></i>
</div>
<div class="existing-comment">
<i class="ti ti-message-circle-2"></i>
<div>
Cliente perguntou se sai hoje ainda — pode confirmar com ele?
<div class="meta">Meire · hoje, 09:12</div>
</div>
</div>
<div class="comment-box">
<textarea placeholder="Escreva um comentário sobre essa OS..."></textarea>
<div class="comment-target">
<span>Visível para:</span>
<span class="opt selected">Meire</span>
<span class="opt">Mecânico</span>
<span class="opt">Ambos</span>
</div>
</div>
<button class="btn primary full"><i class="ti ti-send"></i> Enviar comentário</button>
</div>
</div>
</div><div id="tab-oficina-precificacao" class="tab-panel">
<div class="ps-tab-row">
<button class="ps-tab-btn active" onclick="setPSTab(this,'precificar')">Pra precificar <span class="ps-tab-badge active" id="ps-badge-precificar">3</span></button>
<button class="ps-tab-btn" onclick="setPSTab(this,'recusadas')">Recusadas <span class="ps-tab-badge" id="ps-badge-recusadas">2</span></button>
<button class="ps-tab-btn" onclick="setPSTab(this,'pagas')">Realizadas e pagas <span class="ps-tab-badge" id="ps-badge-pagas">28</span></button>
<button class="ps-tab-btn" onclick="setPSTab(this,'pendentes')">Pendentes <span class="ps-tab-badge" id="ps-badge-pendentes">2</span></button>
</div>
<div id="ps-tab-precificar">
<div class="search-bar"><input type="text" placeholder="Buscar por OS, cliente ou equipamento..."></div>
<div class="os-list">
<div class="os-row" style="border-color: var(--good); border-width: 1.5px;" onclick="openPSCalc('245')">
<div class="ps-os-icon good"><i class="ti ti-tool"></i></div>
<div style="flex:1;"><p class="os-name">OS #245 — Martelete Bosch</p><p class="os-sub">João Paulo · recebida hoje · sem preço definido</p></div>
<i class="ti ti-chevron-right" style="color:var(--good);"></i>
</div>
<div class="os-row" onclick="openPSCalc('241')">
<div class="ps-os-icon warn"><i class="ti ti-clock-pause"></i></div>
<div style="flex:1;"><p class="os-name">OS #241 — Betoneira 400L</p><p class="os-sub">Geraldo Eustáquio · aguard. peça há 6 dias · sem preço definido</p></div>
<i class="ti ti-chevron-right" style="color:var(--text-faint);"></i>
</div>
<div class="os-row" onclick="openPSCalc('246')">
<div class="ps-os-icon"><i class="ti ti-tool"></i></div>
<div style="flex:1;"><p class="os-name">OS #246 — Esmerilhadeira 7"</p><p class="os-sub">Antonio Francisco · recebida hoje · sem preço definido</p></div>
<i class="ti ti-chevron-right" style="color:var(--text-faint);"></i>
</div>
</div>
<p class="panel-note" style="text-align:center;">Clique numa OS pra abrir a calculadora de preço dela</p>
</div>
<div id="ps-tab-recusadas" style="display:none;">
<div class="rec-insight-grid">
<div class="rec-insight-card">
<p class="rec-insight-title">Clientes que mais recusam</p>
<div class="rec-insight-row"><span class="nm">Samuel</span><span class="val">3 de 4</span></div>
<div class="rec-insight-row"><span class="nm">Maria A. Lopes</span><span class="val">2 de 3</span></div>
</div>
<div class="rec-insight-card">
<p class="rec-insight-title">Serviços com mais recusa</p>
<div class="rec-insight-row"><span class="nm">Serra mármore</span><span class="val">4 recusas</span></div>
<div class="rec-insight-row"><span class="nm">Lavadora alta pressão</span><span class="val">3 recusas</span></div>
</div>
</div>
<div class="rec-causa-banner">
<i class="ti ti-bulb"></i>
<div>
<p class="t">Possível causa: preço acima do esperado</p>
<p class="d">Serra mármore tem o maior número de recusas e o orçamento médio (R$ 235) está 40% acima da média de outros serviços parecidos.</p>
</div>
</div>
<p class="section-label">Lista de OS recusadas</p>
<div class="os-list">
<div class="os-row" style="border-color: var(--red); background: var(--red-soft);">
<i class="ti ti-ban" style="color:var(--red);"></i>
<div style="flex:1;"><p class="os-name">OS #236 — Serra mármore</p><p class="os-sub" style="color:#7A2A24;">Samuel · R$ 220,00 recusado há 1 dia</p></div>
</div>
<div class="os-row" style="border-color: var(--red); background: var(--red-soft);">
<i class="ti ti-ban" style="color:var(--red);"></i>
<div style="flex:1;"><p class="os-name">OS #198 — Lavadora alta pressão</p><p class="os-sub" style="color:#7A2A24;">Maria A. Lopes · R$ 340,00 recusado há 5 dias</p></div>
</div>
</div>
</div>
<div id="ps-tab-pagas" style="display:none;">
<div class="os-list">
<div class="os-row">
<i class="ti ti-circle-check" style="color:var(--good);"></i>
<div style="flex:1;"><p class="os-name">OS #243 — Bomba submersível</p><p class="os-sub">Cond. Reserva Real · cobrado R$ 680,00 · pago em 22/06</p></div>
<div class="os-right"><div class="margin good">+R$ 410</div></div>
</div>
<div class="os-row">
<i class="ti ti-circle-check" style="color:var(--good);"></i>
<div style="flex:1;"><p class="os-name">OS #240 — Guincho talha elétrica</p><p class="os-sub">Fund. Arthur Bernardes · cobrado R$ 465,00 · pago em 21/06</p></div>
<div class="os-right"><div class="margin good">+R$ 250</div></div>
</div>
</div>
</div>
<div id="ps-tab-pendentes" style="display:none;">
<div class="os-list">
<div class="os-row" style="background: var(--amber-soft); border-color: transparent;">
<i class="ti ti-clock" style="color:var(--amber);"></i>
<div style="flex:1;"><p class="os-name">OS #236 — Serra mármore</p><p class="os-sub" style="color:#7A5410;">Samuel · cobrado R$ 50,00 · pronto, aguard. cliente</p></div>
<div class="os-right"><div class="price">R$ 50</div></div>
</div>
<div class="os-row" style="background: var(--red-soft); border-color: transparent;">
<i class="ti ti-alert-octagon" style="color:var(--red);"></i>
<div style="flex:1;"><p class="os-name">OS #233 — Lavadora alta pressão</p><p class="os-sub" style="color:#7A2A24;">Maria A. Lopes · cobrado R$ 180,00 · retirado, não pago</p></div>
<div class="os-right"><div class="price">R$ 180</div></div>
</div>
</div>
</div>
<div id="ps-calc-detail" style="display:none;">
<div style="display:flex; align-items:center; gap:10px; margin-bottom:16px;">
<button class="ps-back-btn" onclick="closePSCalc()"><i class="ti ti-arrow-left"></i></button>
<div><p class="page-title" style="font-size:18px; margin:0;" id="ps-calc-title">OS #245 — Martelete Bosch</p><p class="page-sub" id="ps-calc-sub">João Paulo · recebida hoje</p></div>
</div>
<div class="pp-card" style="margin-bottom:16px; padding:20px;">
<p class="panel-title">Mão de obra</p>
<div class="form-row two">
<div><label class="form-label">Tempo estimado pro serviço</label><input type="text" id="ps-tempo" value="6h" oninput="recalcPS()"></div>
<div class="confirm-box" style="margin-bottom:0; background:var(--blue-soft);"><i class="ti ti-clock-hour-4" style="color:var(--blue);"></i><p style="color:#1F4368;" id="ps-mo-detalhe">R$ 26,80/h (média mecânicos) × 6h = <b>R$ 160,80</b></p></div>
</div>
<p class="cost-source" style="display:flex; align-items:center; gap:5px; cursor:pointer;" onclick="showView('fin-folha', document.querySelector('[data-view=fin-folha]'))"><i class="ti ti-link"></i>Vem da Gestão Equipe (José R$ 25,00/h + Carlos R$ 28,60/h)</p>
</div>
<div class="pp-card" style="margin-bottom:16px; padding:20px;">
<p class="panel-title">Peças que vão ser usadas</p>
<div id="ps-pecas-list">
<div class="ledger-row" data-custo="37.00">
<div class="ledger-icon in"><i class="ti ti-circle-dot"></i></div>
<div style="flex:1;"><p class="ledger-name">Escova de carvão</p><p class="ledger-sub">2 un. × R$ 18,50</p></div>
<span class="ledger-val in">R$ 37,00</span>
<button class="ledger-remove" onclick="this.closest('.ledger-row').remove(); recalcPS();"><i class="ti ti-x"></i></button>
</div>
</div>
<div class="ps-add-peca-row">
<div class="pp-search-wrap" style="margin-bottom:0;">
<i class="ti ti-search"></i>
<input type="text" id="ps-peca-search" placeholder="Peça (estoque ou nova)" oninput="filterPSPeca()" onfocus="filterPSPeca()" autocomplete="off">
</div>
<input type="number" id="ps-peca-qtd" placeholder="Qtd." value="1" min="1">
<button class="btn" onclick="adicionarPSPeca()"><i class="ti ti-plus"></i> Adicionar</button>
</div>
<div class="os-search-results empty" id="ps-peca-results"></div>
<p class="cost-source">Peça do estoque já vem com o custo médio. Peça nova você digita o custo manualmente.</p>
<div class="breakdown" style="margin-top:10px;"><div class="breakdown-row total"><span>Total peças</span><span id="ps-total-pecas">R$ 37,00</span></div></div>
</div>
<div class="two-col" style="margin-bottom:16px;">
<div class="pp-card" style="background:var(--blue-soft); border-color:transparent; padding:16px;"><p class="panel-title" style="color:#1F4368;">Custo total (peças + mão de obra)</p><p style="font-family:var(--font-display); font-size:19px; margin:0; color:#0C447C;" id="ps-custo-total">R$ 197,80</p></div>
<div class="pp-card" style="padding:16px;"><p class="panel-title">Cobrado em serviço parecido</p><p style="font-family:var(--font-display); font-size:19px; margin:0;">R$ 280,00</p></div>
</div>
<div class="pp-card">
<label class="pp-field-label">Quanto você quer cobrar?</label>
<div style="position:relative; margin-bottom:6px;">
<span style="position:absolute; left:14px; top:50%; transform:translateY(-50%); font-size:18px; color:var(--text-faint); font-family:var(--font-display);">R$</span>
<input type="number" id="ps-preco" value="280" oninput="recalcPS()" style="width:100%; padding:13px 13px 13px 40px; border-radius:10px; border:2px solid var(--good); font-size:20px; font-family:var(--font-display); box-sizing:border-box;">
</div>
<div class="form-row"><label class="form-label">Imposto estimado (Simples)</label><input type="number" id="ps-imposto" value="6" oninput="recalcPS()"></div>
<p class="cost-source" style="margin-top:-8px; margin-bottom:14px;">Confirme a alíquota real com seu contador</p>
<div class="pp-flow-summary" id="ps-explicacao">
Custo total <b>R$ 197,80</b> <i class="ti ti-arrow-right"></i> cobra <b>R$ 280,00</b> <i class="ti ti-arrow-right"></i> imposto <b class="neg">R$ 16,80</b> <i class="ti ti-arrow-right"></i> <b class="pos">ganha R$ 65,40</b>
</div>
<div class="breakdown">
<div class="breakdown-row"><span>Peças</span><span id="ps-resumo-pecas">R$ 37,00</span></div>
<div class="breakdown-row"><span>Mão de obra (6h × R$ 26,80)</span><span id="ps-resumo-mo">R$ 160,80</span></div>
<div class="breakdown-row"><span>Imposto (6% sobre venda)</span><span class="neg" id="ps-resumo-imposto">- R$ 16,80</span></div>
<div class="breakdown-row total"><span>Margem nesse preço</span><span class="pos" id="ps-resumo-margem">R$ 65,40 (23%)</span></div>
</div>
<button class="btn primary full" onclick="sendPriceToMeire()"><i class="ti ti-send"></i> Enviar preço pra Meire cobrar</button>
</div>
</div>
</div><div id="tab-oficina-comissao" class="tab-panel">
<div style="display:flex; align-items:center; justify-content:space-between; margin-bottom:16px;">
<p class="panel-title" style="margin:0;">Quanto cada mecânico acumulou de comissão no período</p>
<div class="period-select" id="periodo-comissao">
<button class="period-pill" onclick="togglePeriodoDropdown(this)">
<i class="ti ti-calendar"></i><span id="periodo-comissao-label">Mensal · 1 a 23 de junho</span><i class="ti ti-chevron-down"></i>
</button>
<div class="period-dropdown">
<div class="period-dropdown-item" onclick="setPeriodo('comissao','dia', this)">Diário</div>
<div class="period-dropdown-item" onclick="setPeriodo('comissao','semanal', this)">Semanal</div>
<div class="period-dropdown-item" onclick="setPeriodo('comissao','quinzenal', this)">Quinzenal</div>
<div class="period-dropdown-item active" onclick="setPeriodo('comissao','mensal', this)">Mensal</div>
<div class="period-dropdown-item" onclick="abrirPersonalizarPeriodo('comissao', this)">Personalizar período</div><div class="period-custom-range" id="periodo-comissao-custom" style="display:none; padding:8px 10px 6px; border-top:1px solid var(--border); margin-top:4px;"><p style="font-size:11px; color:var(--text-faint); margin:0 0 6px;">Data inicial e data final</p><div style="display:flex; align-items:center; gap:6px; margin-bottom:8px;"><input type="date" id="periodo-comissao-ini" style="width:100%; font-size:12px; padding:6px 7px; border:1px solid var(--border); border-radius:7px; font-family:var(--font-body);"><span style="font-size:11px; color:var(--text-faint);">até</span><input type="date" id="periodo-comissao-fim" style="width:100%; font-size:12px; padding:6px 7px; border:1px solid var(--border); border-radius:7px; font-family:var(--font-body);"></div><button class="btn primary" style="width:100%; padding:7px; font-size:12px;" onclick="aplicarPeriodoPersonalizado('comissao')">Aplicar período</button></div>
</div>
</div>
</div>
<div class="two-col">
<div class="panel">
<div style="display:flex; align-items:center; gap:10px; margin-bottom:12px;">
<div class="fp-avatar mecanico">JS</div>
<div><p class="panel-title" style="margin:0;">José</p><p class="panel-note" style="margin:0;" id="jose-os-count">9 OS com comissão no período</p></div>
</div>
<p class="vg-num-big" style="font-size:28px;" id="jose-comissao-valor">R$ 640,00</p>
<p class="vg-label-big">Comissão acumulada</p>
</div>
<div class="panel">
<div style="display:flex; align-items:center; gap:10px; margin-bottom:12px;">
<div class="fp-avatar mecanico">CA</div>
<div><p class="panel-title" style="margin:0;">Carlos</p><p class="panel-note" style="margin:0;" id="carlos-os-count">6 OS com comissão no período</p></div>
</div>
<p class="vg-num-big" style="font-size:28px;" id="carlos-comissao-valor">R$ 410,00</p>
<p class="vg-label-big">Comissão acumulada</p>
</div>
</div>
<p class="section-label" style="margin-top:20px;">Detalhe por OS</p>
<table class="few-table">
<thead><tr><th>OS</th><th>Equipamento / cliente</th><th>Mecânico</th><th class="num">Preço</th><th class="num">Comissão</th></tr></thead>
<tbody id="comissao-detalhe-tbody">
<tr><td>#240</td><td>Guincho talha elétrica — Fund. Arthur Bernardes</td><td>José</td><td class="num">465</td><td class="num">8</td></tr>
<tr><td>#236</td><td>Serra mármore — Samuel</td><td>José</td><td class="num">50</td><td class="num">2</td></tr>
<tr><td>#229</td><td>Talha elétrica — Marco Thulio</td><td>José</td><td class="num">280</td><td class="num">8</td></tr>
<tr><td>#221</td><td>Compactador de solo — Reginaldo</td><td>Carlos</td><td class="num">340</td><td class="num">10</td></tr>
</tbody>
</table>
<p class="panel-note" style="margin-top:12px;">"sem regra configurada" (visto em algumas OS) significa que essa OS não tem % de comissão definido — vale revisar com o mecânico.</p>
</div><div id="tab-oficina-pendencias" class="tab-panel">
<div class="clickable-stat-row">
<div class="clickable-stat warn"><p class="num">2</p><p class="lbl">aguardando peça há +5 dias</p></div>
<div class="clickable-stat"><p class="num">4</p><p class="lbl">pronto, aguard. cliente</p></div>
<div class="clickable-stat danger"><p class="num">2</p><p class="lbl">retirado, não pago</p></div>
</div>
<p class="section-label">Aguardando peça</p>
<div class="os-drill" style="margin-bottom:20px;">
<div class="os-drill-row late"><span class="os-drill-num">#241</span><div style="flex:1;"><p class="os-drill-name">Betoneira 400L</p><p class="os-drill-sub">Geraldo Eustáquio · José · aguard. peça há 6 dias</p></div></div>
<div class="os-drill-row late"><span class="os-drill-num">#238</span><div style="flex:1;"><p class="os-drill-name">Compressor de ar</p><p class="os-drill-sub">Fazenda Dom Bosco · Carlos · aguard. peça há 8 dias</p></div></div>
</div>
<p class="section-label">Pronto, aguardando cliente buscar</p>
<div class="os-drill" style="margin-bottom:20px;">
<div class="os-drill-row"><span class="os-drill-num">#236</span><div style="flex:1;"><p class="os-drill-name">Serra mármore</p><p class="os-drill-sub">Samuel · pronto há 1 dia</p></div></div>
<div class="os-drill-row"><span class="os-drill-num">#234</span><div style="flex:1;"><p class="os-drill-name">Esmerilhadeira</p><p class="os-drill-sub">Antonio Francisco · pronto há 2 dias</p></div></div>
</div>
<p class="section-label">Retirado, não pago — igual contrato vencido</p>
<div class="os-drill">
<div class="os-drill-row late"><span class="os-drill-num">#227</span><div style="flex:1;"><p class="os-drill-name">Betoneira 150L</p><p class="os-drill-sub">Helio Flavano · retirou há 4 dias</p></div></div>
<div class="os-drill-row late"><span class="os-drill-num">#224</span><div style="flex:1;"><p class="os-drill-name">Gerador 3,5kva</p><p class="os-drill-sub">Lucas Batista · retirou há 6 dias</p></div></div>
</div>
</div></div>
<div id="view-loja" class="view"><div class="topbar">
<div>
<h1 class="page-title">Loja</h1>
<p class="page-sub">Tudo que a Meire já registrou na locação, sem precisar perguntar pra ela</p>
</div>
<div class="period-select" id="periodo-loja">
<button class="period-pill" onclick="togglePeriodoDropdown(this)">
<i class="ti ti-calendar"></i><span id="periodo-loja-label">Semanal · 17 a 23 de junho</span><i class="ti ti-chevron-down"></i>
</button>
<div class="period-dropdown">
<div class="period-dropdown-item" onclick="setPeriodo('loja','dia', this)">Diário</div>
<div class="period-dropdown-item active" onclick="setPeriodo('loja','semanal', this)">Semanal</div>
<div class="period-dropdown-item" onclick="setPeriodo('loja','quinzenal', this)">Quinzenal</div>
<div class="period-dropdown-item" onclick="setPeriodo('loja','mensal', this)">Mensal</div>
<div class="period-dropdown-item" onclick="abrirPersonalizarPeriodo('loja', this)">Personalizar período</div><div class="period-custom-range" id="periodo-loja-custom" style="display:none; padding:8px 10px 6px; border-top:1px solid var(--border); margin-top:4px;"><p style="font-size:11px; color:var(--text-faint); margin:0 0 6px;">Data inicial e data final</p><div style="display:flex; align-items:center; gap:6px; margin-bottom:8px;"><input type="date" id="periodo-loja-ini" style="width:100%; font-size:12px; padding:6px 7px; border:1px solid var(--border); border-radius:7px; font-family:var(--font-body);"><span style="font-size:11px; color:var(--text-faint);">até</span><input type="date" id="periodo-loja-fim" style="width:100%; font-size:12px; padding:6px 7px; border:1px solid var(--border); border-radius:7px; font-family:var(--font-body);"></div><button class="btn primary" style="width:100%; padding:7px; font-size:12px;" onclick="aplicarPeriodoPersonalizado('loja')">Aplicar período</button></div>
</div>
</div>
</div><div class="fin-tab-row"><button class="fin-tab-btn active" data-tab="visaogeral" onclick="setSubTab('loja','visaogeral', this)">Visão Geral</button><button class="fin-tab-btn" data-tab="andaimes" onclick="setSubTab('loja','andaimes', this)">Andaimes</button><button class="fin-tab-btn" data-tab="parados" onclick="setSubTab('loja','parados', this)">Equip. parados</button></div><div id="tab-loja-visaogeral" class="tab-panel active">
<div class="clickable-stat-row">
<div class="clickable-stat info"><p class="num">21</p><p class="lbl">equipamentos locados</p></div>
<div class="clickable-stat warn"><p class="num">4</p><p class="lbl">em manutenção</p></div>
<div class="clickable-stat"><p class="num">3</p><p class="lbl">serviços agendados hoje</p></div>
<div class="clickable-stat danger"><p class="num">1</p><p class="lbl">devolução atrasada</p></div>
</div>
<p class="section-label">Equipamentos locados agora</p>
<div class="equip-status-list" style="margin-bottom: 20px;">
<div class="equip-status-row">
<i class="ti ti-rotate-clockwise-2" style="color:var(--text-mute);"></i>
<div style="flex:1;"><p class="os-drill-name">Betoneira 400L — Carlos Eduardo Pires</p><p class="os-drill-sub">devolução prevista 26/06</p></div>
<span class="equip-status-tag out">locado</span>
</div>
<div class="equip-status-row">
<i class="ti ti-stairs" style="color:var(--red);"></i>
<div style="flex:1;"><p class="os-drill-name">Andaime torre 1x1 — Diogo Silva</p><p class="os-drill-sub">venceu há 1 dia</p></div>
<span class="equip-status-tag out" style="background:var(--red-soft); color:var(--red);">atrasado</span>
</div>
</div>
<p class="section-label">Serviços agendados pra hoje</p>
<div class="equip-status-list">
<div class="equip-status-row">
<i class="ti ti-calendar-event" style="color:var(--text-mute);"></i>
<div style="flex:1;"><p class="os-drill-name">Manutenção gerador 8kva</p><p class="os-drill-sub">Antonio Carlos S. de Assis · 14:00</p></div>
<span class="equip-status-tag sched">agendado</span>
</div>
<div class="equip-status-row">
<i class="ti ti-truck-delivery" style="color:var(--text-mute);"></i>
<div style="flex:1;"><p class="os-drill-name">Entrega bomba submersível</p><p class="os-drill-sub">Cond. Reserva Real · 10:00</p></div>
<span class="equip-status-tag sched">agendado</span>
</div>
</div>
<p class="section-label">Faturamento de locação no período</p>
<div class="panel" style="margin-bottom:20px;">
<p class="panel-title" id="loja-fat-titulo">R$ 9.840 nos últimos 7 dias</p>
<div class="chart-wrap" style="height: 180px;"><canvas id="chart-loja-faturamento"></canvas></div>
</div>
<div class="two-col">
<div class="vg-shortcut" style="background:#fff; border:1px solid var(--border);" onclick="openTab('loja','andaimes')"><i class="ti ti-stairs"></i>Precificar andaime</div>
<div class="vg-shortcut" style="background:#fff; border:1px solid var(--border);" onclick="openTab('loja','parados')"><i class="ti ti-hourglass-low"></i>Ver equipamentos parados</div>
</div>
</div><div id="tab-loja-andaimes" class="tab-panel">
<p class="section-label" style="margin-top:0;">Tipo de andaime</p>
<div class="andaime-opt-row" id="andaime-tipo-row">
<div class="andaime-opt selected" data-preco="18" onclick="selectAndaimeTipo(this)"><i class="ti ti-stairs"></i><p class="nm">Torre 1x1</p></div>
<div class="andaime-opt" data-preco="26" onclick="selectAndaimeTipo(this)"><i class="ti ti-stairs"></i><p class="nm">Torre 1,5x1</p></div>
<div class="andaime-opt" data-preco="34" onclick="selectAndaimeTipo(this)"><i class="ti ti-building-skyscraper"></i><p class="nm">Fachadeiro</p></div>
<div class="andaime-opt" data-preco="22" onclick="selectAndaimeTipo(this)"><i class="ti ti-tools-kitchen-2"></i><p class="nm">Suspenso (balancim)</p></div>
</div>
<p class="section-label">Com rodízio?</p>
<div class="andaime-toggle-row" id="andaime-rodizio-row">
<div class="andaime-toggle selected" data-valor="0" onclick="selectAndaimeToggle(this,'rodizio')">Não</div>
<div class="andaime-toggle" data-valor="6" onclick="selectAndaimeToggle(this,'rodizio')">Sim, com rodízio</div>
</div>
<p class="section-label">Com sapata?</p>
<div class="andaime-toggle-row" id="andaime-sapata-row">
<div class="andaime-toggle selected" data-valor="0" onclick="selectAndaimeToggle(this,'sapata')">Não</div>
<div class="andaime-toggle" data-valor="4" onclick="selectAndaimeToggle(this,'sapata')">Sim, com sapata</div>
</div>
<div class="pp-card">
<label class="pp-field-label">Quantidade de módulos / peças</label>
<input type="number" id="andaime-qtd" value="6" oninput="recalcAndaime()" class="pp-price-input" style="width:100%; border:1px solid var(--border); border-radius:10px; padding:10px 14px; font-size:16px;">
<div class="pp-flow-summary" id="andaime-explicacao" style="margin-top:16px;">
6 módulos × R$ 18,00 + rodízio R$ 0,00 + sapata R$ 0,00 = <b class="pos">R$ 108,00 / dia</b>
</div>
<div class="breakdown">
<div class="breakdown-row"><span>Valor base por módulo</span><span id="andaime-base">R$ 18,00</span></div>
<div class="breakdown-row"><span>Acréscimo rodízio</span><span id="andaime-add-rodizio">R$ 0,00</span></div>
<div class="breakdown-row"><span>Acréscimo sapata</span><span id="andaime-add-sapata">R$ 0,00</span></div>
<div class="breakdown-row total"><span>Diária sugerida</span><span class="pos" id="andaime-total">R$ 108,00</span></div>
</div>
<p class="panel-note">Valor por dia. Pra contrato semanal ou mensal, o sistema de contrato (Recepção) já aplica o desconto padrão em cima desse valor.</p>
<button class="btn primary full" onclick="usarPrecoAndaime()"><i class="ti ti-check"></i> Usar esse valor no contrato</button>
</div>
</div><div id="tab-loja-parados" class="tab-panel">
<div class="fin-stat-row3" style="grid-template-columns: repeat(2,1fr); margin-bottom:18px;">
<div class="fin-stat danger"><p class="lbl">Parados 30+ dias</p><p class="num">2</p></div>
<div class="fin-stat warn"><p class="lbl">Baixa rotatividade</p><p class="num">2</p></div>
</div>
<div class="eq-parado-card">
<div class="eq-parado-top">
<div class="eq-parado-icon"><i class="ti ti-tool"></i></div>
<div style="flex:1;"><p class="eq-parado-name">Compactador de placa</p><p class="eq-parado-sub">parado há 46 dias · última locação em 08/05</p></div>
<span class="rot-tag parado">parado 30+ dias</span>
</div>
<div class="idle-bar-track"><div class="idle-bar-fill" style="width:95%;"></div></div>
</div>
<div class="eq-parado-card">
<div class="eq-parado-top">
<div class="eq-parado-icon"><i class="ti ti-tool"></i></div>
<div style="flex:1;"><p class="eq-parado-name">Serra mármore (unidade 2)</p><p class="eq-parado-sub">parada há 38 dias · última locação em 16/05</p></div>
<span class="rot-tag parado">parado 30+ dias</span>
</div>
<div class="idle-bar-track"><div class="idle-bar-fill" style="width:80%;"></div></div>
</div>
<div class="eq-parado-card">
<div class="eq-parado-top">
<div class="eq-parado-icon amber"><i class="ti ti-rotate-2"></i></div>
<div style="flex:1;"><p class="eq-parado-name">Betoneira 150L (unidade 3)</p><p class="eq-parado-sub">parada há só 14 dias · só 2 locações nos últimos 6 meses · penúltima em 09/01</p></div>
<span class="rot-tag baixa-rot">baixa rotatividade</span>
</div>
<div class="idle-bar-track"><div class="idle-bar-fill" style="width:55%; background:var(--amber);"></div></div>
</div>
<div class="eq-parado-card">
<div class="eq-parado-top">
<div class="eq-parado-icon amber"><i class="ti ti-rotate-2"></i></div>
<div style="flex:1;"><p class="eq-parado-name">Furadeira de impacto (unidade 4)</p><p class="eq-parado-sub">parada há 9 dias · só 1 locação nos últimos 4 meses · penúltima em 22/02</p></div>
<span class="rot-tag baixa-rot">baixa rotatividade</span>
</div>
<div class="idle-bar-track"><div class="idle-bar-fill" style="width:35%; background:var(--amber);"></div></div>
</div>
<div class="eq-parado-card">
<div class="eq-parado-top">
<div class="eq-parado-icon" style="background:var(--bg-soft); color:var(--text-mute);"><i class="ti ti-tool"></i></div>
<div style="flex:1;"><p class="eq-parado-name">Andaime fachadeiro</p><p class="eq-parado-sub">parado há 19 dias · última locação em 04/06</p></div>
</div>
<div class="idle-bar-track"><div class="idle-bar-fill" style="width:40%; background:var(--text-faint);"></div></div>
</div>
<p class="panel-note" style="margin-top:14px;">Lista considera dois critérios: equipamento parado há mais de 30 dias <b>e</b> equipamento com baixa rotatividade — mesmo parado há pouco tempo, se a penúltima locação foi há muito tempo, o giro dele é baixo e também merece atenção. Pode ser hora de baixar o preço da diária, colocar em promoção ou considerar vender.</p>
</div></div>
<div id="view-finalizadas" class="view">
<div class="topbar">
<div style="display:flex; align-items:center; gap:10px;">
<i class="ti ti-arrow-left" style="font-size:19px; cursor:pointer;" onclick="showView('oficina', document.querySelector('[data-view=oficina]'))"></i>
<div>
<h1 class="page-title">OS finalizadas pela oficina</h1>
<p class="page-sub">Serviço, cliente, o que foi feito, lucro e comissão — e se já foi pago e retirado</p>
</div>
</div>
</div>
<div class="search-bar">
<input type="text" placeholder="Buscar por cliente, equipamento ou mecânico">
<button class="btn"><i class="ti ti-filter"></i></button>
</div>
<table class="few-table">
<thead>
<tr>
<th>OS</th><th>Equipamento / cliente</th><th>Responsável</th><th>Peças usadas</th>
<th>Situação</th>
<th class="num">Preço</th><th class="num">Lucro</th><th class="num">Comissão</th>
</tr>
</thead>
<tbody>
<tr onclick="openFinalizadaDetail('243')">
<td>#243</td>
<td>Bomba submersível — Cond. Reserva Real</td>
<td>Carlos</td>
<td>rolamento, selo</td>
<td><span class="status-chip done">pago + retirado</span></td>
<td class="num">680</td>
<td class="num pos">+410</td>
<td class="num">—</td>
</tr>
<tr onclick="openFinalizadaDetail('240')">
<td>#240</td>
<td>Guincho talha elétrica — Fund. Arthur Bernardes</td>
<td>José</td>
<td>capacitor</td>
<td><span class="status-chip done">pago + retirado</span></td>
<td class="num">465</td>
<td class="num pos">+250</td>
<td class="num">8</td>
</tr>
<tr onclick="openFinalizadaDetail('236')">
<td>#236</td>
<td>Serra mármore — Samuel</td>
<td>José</td>
<td>carvão (par)</td>
<td><span class="status-chip wait">aguard. cliente</span></td>
<td class="num">50</td>
<td class="num neg">-12</td>
<td class="num">2</td>
</tr>
<tr onclick="openFinalizadaDetail('233')">
<td>#233</td>
<td>Lavadora alta pressão — Maria A. Lopes</td>
<td>Carlos</td>
<td>—</td>
<td><span class="status-chip risk">retirado, não pago</span></td>
<td class="num">180</td>
<td class="num pos">+125</td>
<td class="num">—</td>
</tr>
<tr onclick="openFinalizadaDetail('229')">
<td>#229</td>
<td>Talha elétrica — Marco Thulio</td>
<td>José</td>
<td>—</td>
<td><span class="status-chip info">pago, na loja</span></td>
<td class="num">280</td>
<td class="num pos">+150</td>
<td class="num">8</td>
</tr>
</tbody>
</table>
<p class="panel-note" style="margin-top:12px;">"Pago + retirado" é o ciclo completo. "Retirado, não pago" merece atenção — é a mesma lógica do contrato de locação vencido, só que do lado da oficina.</p>
<div class="modal-overlay" id="modal-finalizada">
<div class="modal-box">
<div class="modal-head">
<div>
<p class="modal-title">OS #243 — Bomba submersível</p>
<p class="modal-sub">Cond. Reserva Real</p>
</div>
<i class="ti ti-x modal-close" onclick="closeModal('modal-finalizada')"></i>
</div>
<div class="detail-row"><span class="l">Responsável</span><span>Carlos</span></div>
<div class="detail-row"><span class="l">Recebida</span><span>20/06, 09:10</span></div>
<div class="detail-row"><span class="l">Iniciada</span><span>20/06, 14:00</span></div>
<div class="detail-row"><span class="l">Finalizada</span><span>22/06, 11:30</span></div>
<div class="detail-row"><span class="l">Peças usadas</span><span>rolamento, selo</span></div>
<div class="detail-row"><span class="l">Descrição</span><span>troca de rolamento e selo, teste de funcionamento</span></div>
<div class="detail-row"><span class="l">Preço cobrado</span><span>R$ 680</span></div>
<div class="detail-row"><span class="l">Custo peças</span><span>R$ 150</span></div>
<div class="detail-row"><span class="l">Mão de obra</span><span>R$ 120</span></div>
<div class="detail-row"><span class="l">Lucro</span><span class="v pos">+ R$ 410</span></div>
<div class="detail-row"><span class="l">Comissão Carlos</span><span>sem regra configurada</span></div>
</div>
</div>
</div>
<!-- ===== NOVA: Comissão por mecânico ===== -->
<!-- ===== NOVA: Pendências (Oficina) ===== -->
<!-- ===== NOVA: Andaimes (precificação) ===== -->
<!-- ===== NOVA: Equipamentos parados ===== -->
<div id="view-pecas" class="view"><div class="topbar">
<div>
<h1 class="page-title">Visão Geral — Peças</h1>
<p class="page-sub">Busque uma peça pra ver consumo, margem e o que mais usa ela</p>
</div>
<span class="today-pill">junho · até hoje</span>
</div><div class="fin-tab-row"><button class="fin-tab-btn active" data-tab="visaogeral" onclick="setSubTab('pecas','visaogeral', this)">Visão Geral</button><button class="fin-tab-btn" data-tab="estoque" onclick="setSubTab('pecas','estoque', this)">Estoque e reposição</button><button class="fin-tab-btn" data-tab="precpecas" onclick="setSubTab('pecas','precpecas', this)">Precificação Peças</button></div><div id="tab-pecas-visaogeral" class="tab-panel active">
<div class="search-bar">
<input type="text" id="pecas-search" placeholder="Buscar peça, ex: rolamento" oninput="filterPecas()">
</div>
<div class="clickable-stat-row">
<div class="clickable-stat good" onclick="abrirResumoInfo('Lucro/prejuízo do mês', 'R$ 1.260 em junho', '<div class=\'detail-row\'><span class=\'l\'>Receita com vendas de peças</span><span>R$ 3.140</span></div><div class=\'detail-row\'><span class=\'l\'>Custo das peças vendidas</span><span>R$ 1.640</span></div><div class=\'detail-row\'><span class=\'l\'>Impostos estimados</span><span>R$ 240</span></div><div class=\'detail-row\'><span class=\'l\'>Lucro líquido do mês</span><span style=\'color:var(--good); font-weight:700;\'>R$ 1.260</span></div><p class=\'panel-note\' style=\'margin-top:10px;\'>Considera todas as vendas de balcão e peças usadas em OS cobradas do cliente. Não inclui peças usadas em manutenção própria dos equipamentos de locação.</p>')"><p class="num">R$ 1.260</p><p class="lbl">lucro/prejuízo do mês</p></div>
<div class="clickable-stat warn" onclick="abrirResumoInfo('Peças vendidas abaixo do preço', '3 vendas em junho', '<div class=\'detail-row\'><span class=\'l\'>Rolamento 6203 ZZ</span><span>vendido a R$ 80 (tabela R$ 95)</span></div><div class=\'detail-row\'><span class=\'l\'>Capacitor 25uF</span><span>vendido a R$ 30 (tabela R$ 38)</span></div><div class=\'detail-row\'><span class=\'l\'>Escova de carvão</span><span>vendido a R$ 20 (tabela R$ 25)</span></div><p class=\'panel-note\' style=\'margin-top:10px;\'>Vendas abaixo da tabela reduzem sua margem — vale conversar com a Meire sobre quando é ok negociar e quando não.</p>')"><p class="num">3</p><p class="lbl">peças vendidas abaixo do preço</p></div>
<div class="clickable-stat" onclick="abrirResumoInfo('Peças vendidas', '42 peças em junho', '<div class=\'detail-row\'><span class=\'l\'>Venda balcão</span><span>14 peças (34%)</span></div><div class=\'detail-row\'><span class=\'l\'>Usadas em OS de serviço</span><span>19 peças (45%)</span></div><div class=\'detail-row\'><span class=\'l\'>Manutenção própria</span><span>9 peças (21%)</span></div><p class=\'panel-note\' style=\'margin-top:10px;\'>Só venda balcão e OS geram receita direta — manutenção própria é custo interno.</p>')"><p class="num">42</p><p class="lbl">peças vendidas</p></div>
<div class="clickable-stat info" onclick="abrirResumoInfo('Lucro médio por venda', 'R$ 29,80 por venda', '<div class=\'detail-row\'><span class=\'l\'>Lucro total do mês</span><span>R$ 1.260</span></div><div class=\'detail-row\'><span class=\'l\'>Peças vendidas (balcão + OS)</span><span>33 vendas</span></div><div class=\'detail-row\'><span class=\'l\'>Lucro médio por venda</span><span style=\'color:var(--blue); font-weight:700;\'>R$ 29,80</span></div><p class=\'panel-note\' style=\'margin-top:10px;\'>Média simples — algumas peças dão bem mais margem que outras, vale olhar item a item na Precificação.</p>')"><p class="num">R$ 29,80</p><p class="lbl">lucro médio por venda</p></div>
</div>
<p class="section-label">Quantidade vendida e lucro por mês</p>
<div class="panel" style="margin-bottom: 22px;">
<div class="chart-wrap" style="height: 240px;"><canvas id="chart-pecas-mensal"></canvas></div>
<div class="legend-row" style="margin-top:10px;">
<span class="legend-item"><span class="legend-dot" style="background:#DDE7F2;"></span>Peças vendidas</span>
<span class="legend-item"><span class="legend-dot" style="background:var(--good);"></span>Lucro (R$)</span>
</div>
</div>
<p class="section-label">Resumo do mês</p>
<div class="panel" style="margin-bottom: 22px;">
<p class="panel-title">Uso do estoque de peças em junho</p>
<div class="split-bar">
<div style="width:34%; background:var(--green-accent);"></div>
<div style="width:45%; background:var(--blue);"></div>
<div style="width:21%; background:var(--amber);"></div>
</div>
<div class="legend-row">
<span class="legend-item"><span class="legend-dot" style="background:var(--green-accent);"></span>Venda balcão 34%</span>
<span class="legend-item"><span class="legend-dot" style="background:var(--blue);"></span>OS de serviço 45%</span>
<span class="legend-item"><span class="legend-dot" style="background:var(--amber);"></span>Manutenção própria 21%</span>
</div>
<p class="panel-note">Manutenção dos equipamentos de locação consome 1 a cada 5 peças do estoque — esse custo não aparece em nenhuma venda, mas precisa entrar no preço da diária pra não ficar invisível.</p>
</div>
<p class="section-label">Detalhe — clique pra ver a origem exata</p>
<table class="few-table" id="pecas-detalhe-table">
<thead>
<tr><th>Peça</th><th>Destino</th><th>Referência</th><th class="num">Qtd.</th><th class="num">Data</th></tr>
</thead>
<tbody>
<tr data-search="rolamento" onclick="openSingleOS('241')" style="cursor:pointer;">
<td>Rolamento</td><td>OS de serviço</td><td>OS #241 — Geraldo Eustáquio</td><td class="num">2</td><td class="num">18/06</td>
</tr>
<tr data-search="rolamento" onclick="openFinalizadaDetail('243')" style="cursor:pointer;">
<td>Rolamento</td><td>OS de serviço</td><td>OS #243 — Cond. Reserva Real</td><td class="num">1</td><td class="num">20/06</td>
</tr>
<tr data-search="rolamento" style="cursor:pointer;" onclick="abrirResumoInfo('Rolamento — Manutenção própria', '3 unidades em 15/06', '<div class=\'detail-row\'><span class=\'l\'>Peça</span><span>Rolamento</span></div><div class=\'detail-row\'><span class=\'l\'>Destino</span><span>Manutenção própria</span></div><div class=\'detail-row\'><span class=\'l\'>Referência</span><span>Andaime torre #14 (estoque interno)</span></div><div class=\'detail-row\'><span class=\'l\'>Quantidade</span><span>3 un.</span></div><div class=\'detail-row\'><span class=\'l\'>Data</span><span>15/06/2026</span></div><p class=\'panel-note\' style=\'margin-top:10px;\'>Peça usada pra manter o próprio equipamento de locação funcionando — não gerou receita direta, é custo interno.</p>')">
<td>Rolamento</td><td>Manutenção própria</td><td>Andaime torre #14 (estoque interno)</td><td class="num">3</td><td class="num">15/06</td>
</tr>
<tr data-search="rolamento" style="cursor:pointer;" onclick="abrirResumoInfo('Rolamento — Venda balcão', '4 unidades em 23/06', '<div class=\'detail-row\'><span class=\'l\'>Peça</span><span>Rolamento</span></div><div class=\'detail-row\'><span class=\'l\'>Destino</span><span>Venda balcão</span></div><div class=\'detail-row\'><span class=\'l\'>Referência</span><span>Nota de venda #1.482</span></div><div class=\'detail-row\'><span class=\'l\'>Quantidade</span><span>4 un.</span></div><div class=\'detail-row\'><span class=\'l\'>Data</span><span>23/06/2026</span></div>')">
<td>Rolamento</td><td>Venda balcão</td><td>Nota de venda #1.482</td><td class="num">4</td><td class="num">23/06</td>
</tr>
<tr data-search="capacitor" style="cursor:pointer;" onclick="abrirResumoInfo('Capacitor — Contrato de locação', '1 unidade em 29/05', '<div class=\'detail-row\'><span class=\'l\'>Peça</span><span>Capacitor</span></div><div class=\'detail-row\'><span class=\'l\'>Destino</span><span>Contrato de locação</span></div><div class=\'detail-row\'><span class=\'l\'>Referência</span><span>Contrato #1239 — Wederson Candido</span></div><div class=\'detail-row\'><span class=\'l\'>Quantidade</span><span>1 un.</span></div><div class=\'detail-row\'><span class=\'l\'>Data</span><span>29/05/2026</span></div>')">
<td>Capacitor</td><td>Contrato de locação</td><td>Contrato #1239 — Wederson Candido</td><td class="num">1</td><td class="num">29/05</td>
</tr>
</tbody>
</table>
</div><div id="tab-pecas-estoque" class="tab-panel">
<div class="tab-row" style="justify-content:space-between; display:flex; align-items:center;">
<div style="display:flex; gap:8px;">
<button class="tab-btn active" onclick="setEstoqueTab(this,'preditivo')">Visão preditiva</button>
<button class="tab-btn" onclick="setEstoqueTab(this,'atual')">Estoque atual</button>
<button class="tab-btn" onclick="setEstoqueTab(this,'fornecedores')">Fornecedores</button>
</div>
<button class="btn primary" style="display:flex; align-items:center; gap:6px;" onclick="showView('compra', null)"><i class="ti ti-plus"></i> Lançar compra</button>
</div>
<div class="search-bar">
<input type="text" id="estoque-search" placeholder="Buscar peça ou fornecedor..." oninput="filterEstoqueTabs()">
</div>
<div id="estoque-preditivo">
<div class="stock-row alert" data-search="escova de carvão">
<div class="stock-icon alert"><i class="ti ti-alert-triangle"></i></div>
<div style="flex:1;"><p class="stock-name">Escova de carvão</p><p class="stock-sub">3 unidades · consumo de 2/dia</p></div>
<div class="stock-right"><div class="v" style="color:var(--red)">acaba em 1-2 dias</div><div class="l">repor agora</div></div>
</div>
<div class="stock-row alert" data-search="capacitor">
<div class="stock-icon alert"><i class="ti ti-alert-triangle"></i></div>
<div style="flex:1;"><p class="stock-name">Capacitor</p><p class="stock-sub">8 unidades · consumo de 1,5/dia</p></div>
<div class="stock-right"><div class="v" style="color:var(--terracotta)">acaba em 5 dias</div><div class="l">comprar essa semana</div></div>
</div>
<div class="stock-row" data-search="rolamento">
<div class="stock-icon"><i class="ti ti-circle-dot"></i></div>
<div style="flex:1;"><p class="stock-name">Rolamento</p><p class="stock-sub">22 unidades · consumo de 0,8/dia</p></div>
<div class="stock-right"><div class="v">acaba em ~27 dias</div><div class="l">tranquilo</div></div>
</div>
</div>
<div id="estoque-atual" style="display:none;">
<div class="clickable-stat-row" id="estoque-atual-resumo" style="grid-template-columns: repeat(3,1fr); margin-bottom:16px;"></div>
<table class="few-table">
<thead><tr><th>Peça</th><th>Localizador</th><th class="num">Em estoque</th><th class="num">Custo médio</th><th class="num">Valor em estoque</th></tr></thead>
<tbody>
<tr data-search="escova de carvão" data-parada="0">
<td>Escova de carvão</td>
<td><span class="loc-chip" onclick="event.stopPropagation(); editLocalizador(this)"><i class="ti ti-map-pin"></i>A-1</span></td>
<td class="num">3</td><td class="num">18,50</td><td class="num">55,50</td>
</tr>
<tr data-search="capacitor" data-parada="1">
<td>Capacitor</td>
<td><span class="loc-chip" onclick="event.stopPropagation(); editLocalizador(this)"><i class="ti ti-map-pin"></i>B-2</span></td>
<td class="num">8</td><td class="num">42,00</td><td class="num">336,00</td>
</tr>
<tr data-search="rolamento" data-parada="0">
<td>Rolamento</td>
<td><span class="loc-chip" onclick="event.stopPropagation(); editLocalizador(this)"><i class="ti ti-map-pin"></i>A-3</span></td>
<td class="num">22</td><td class="num">54,80</td><td class="num">1.205,60</td>
</tr>
<tr data-search="carvão serra mármore" data-parada="1">
<td>Carvão serra mármore</td>
<td><span class="loc-chip empty" onclick="event.stopPropagation(); editLocalizador(this)"><i class="ti ti-map-pin-off"></i>definir</span></td>
<td class="num">14</td><td class="num">9,20</td><td class="num">128,80</td>
</tr>
</tbody>
</table>
<p class="panel-note">Clique no localizador pra editar — formato livre, ex: "A-1" (corredor A, linha 1). Linhas marcadas como "parada" são peças sem saída recente.</p>
</div>
<div id="estoque-fornecedores" style="display:none;">
<table class="few-table">
<thead><tr><th>Fornecedor</th><th>Peça</th><th class="num">Última compra</th><th class="num">Preço médio</th><th>NF</th></tr></thead>
<tbody>
<tr data-search="dht importação rolamento" onclick="openFornecedorDetail('rolamento')"><td>DHT Importação</td><td>Rolamento</td><td class="num">08/06</td><td class="num">52,40</td><td>37.901</td></tr>
<tr data-search="makita do brasil capacitor" onclick="openFornecedorDetail('capacitor')"><td>Makita do Brasil</td><td>Capacitor</td><td class="num">25/05</td><td class="num">44,90</td><td>340.787</td></tr>
<tr data-search="dht importação escova de carvão" onclick="openFornecedorDetail('escova')"><td>DHT Importação</td><td>Escova de carvão</td><td class="num">02/06</td><td class="num">19,10</td><td>37.735</td></tr>
</tbody>
</table>
<p class="panel-note">DHT Importação é quem vende rolamento mais barato historicamente — pode valer negociar volume maior pra conseguir desconto.</p>
</div>
</div><div id="tab-pecas-precpecas" class="tab-panel">
<div style="display:grid; grid-template-columns: 1.3fr 1fr; gap:22px; align-items:start;">
<div>
<div class="pp-search-wrap">
<i class="ti ti-search"></i>
<input type="text" id="pp-peca-search" placeholder="Buscar peça..." value="Rolamento" oninput="filterPPPeca()" onfocus="filterPPPeca()" autocomplete="off">
</div>
<div class="os-search-results" id="pp-peca-results"></div>
<div class="pp-stat-row">
<div class="pp-stat"><p class="lbl">Custo médio estoque</p><p class="num" id="pp-custo">R$ 54,80</p></div>
<div class="pp-stat"><p class="lbl">Valor última venda</p><p class="num" id="pp-ultima-venda">R$ 95,00</p></div>
<div class="pp-stat good"><p class="lbl">Margem última venda</p><p class="num" id="pp-margem-ultima">73%</p></div>
</div>
<div class="pp-card">
<label class="pp-field-label">Quanto você quer cobrar?</label>
<div class="pp-price-wrap">
<span class="pp-price-currency">R$</span>
<input type="number" id="pp-preco" value="80" oninput="recalcPP()" class="pp-price-input">
</div>
<p class="pp-imposto-note">
<i class="ti ti-info-circle"></i>
Imposto estimado (Simples): <input type="number" id="pp-imposto" value="7" oninput="recalcPP()" class="pp-imposto-inline">% — confirme com seu contador
</p>
<div class="pp-flow-summary" id="pp-explicacao">
Custo <b>R$ 54,80</b> <i class="ti ti-arrow-right"></i> cobra <b>R$ 80,00</b> <i class="ti ti-arrow-right"></i> imposto <b class="neg">R$ 5,60</b> <i class="ti ti-arrow-right"></i> <b class="pos">ganha R$ 19,60</b>
</div>
<div class="pp-margem-banner" id="pp-margem-atual-box">
<i class="ti ti-percentage"></i>
<span>Margem atual com esse preço: <b id="pp-margem-atual">46%</b> sobre o custo</span>
</div>
<div class="breakdown">
<div class="breakdown-row"><span>Custo da peça</span><span id="pp-resumo-custo">R$ 54,80</span></div>
<div class="breakdown-row"><span>Imposto (7% sobre venda)</span><span class="neg" id="pp-resumo-imposto">- R$ 5,60</span></div>
<div class="breakdown-row total"><span>Lucro líquido nessa margem</span><span class="pos" id="pp-resumo-lucro">R$ 19,60</span></div>
</div>
<p class="panel-note" id="pp-comparativo">Comparado à última venda: <b style="color:var(--text-main);">R$ 80,00 vs. R$ 95,00</b></p>
<button class="btn primary full" onclick="usarPrecoPeca()"><i class="ti ti-check"></i> Usar esse preço de venda</button>
</div>
</div>
<div>
<p class="section-label" style="margin-top:0;">Estoque de peças</p>
<div class="search-bar">
<input type="text" id="pp-estoque-busca" placeholder="Buscar peça" oninput="filterEstoquePecasLateral()">
<button class="btn"><i class="ti ti-filter"></i></button>
</div>
<div id="pp-estoque-lateral-list" style="display:flex; flex-direction:column; gap:8px; margin-top:10px;">
<div class="stock-row" data-search="escova de carvão" onclick="selecionarPecaDoEstoque('escova de carvão')" style="cursor:pointer;"><div class="stock-icon alert"><i class="ti ti-alert-triangle"></i></div><div style="flex:1;"><p class="stock-name">Escova de carvão</p><p class="stock-sub">3 unidades — R$ 18,50 custo</p></div></div>
<div class="stock-row" data-search="capacitor" onclick="selecionarPecaDoEstoque('capacitor')" style="cursor:pointer;"><div class="stock-icon"><i class="ti ti-bolt"></i></div><div style="flex:1;"><p class="stock-name">Capacitor</p><p class="stock-sub">8 unidades — R$ 42,00 custo</p></div></div>
<div class="stock-row" data-search="rolamento" onclick="selecionarPecaDoEstoque('rolamento')" style="cursor:pointer;"><div class="stock-icon"><i class="ti ti-circle-dot"></i></div><div style="flex:1;"><p class="stock-name">Rolamento</p><p class="stock-sub">22 unidades — R$ 54,80 custo</p></div></div>
<div class="stock-row" data-search="carvão serra mármore" onclick="selecionarPecaDoEstoque('carvão serra mármore')" style="cursor:pointer;"><div class="stock-icon"><i class="ti ti-disc"></i></div><div style="flex:1;"><p class="stock-name">Carvão serra mármore</p><p class="stock-sub">14 unidades — R$ 9,20 custo</p></div></div>
</div>
<p class="panel-note" style="margin-top:10px;">Clique numa peça pra já ver o preço dela na precificação ao lado — mesma visão de estoque que a Meire vê na tela de Venda de Peças, sempre sincronizada.</p>
</div>
</div>
</div></div>
<div class="modal-overlay" id="modal-info-resumo">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title" id="resumo-titulo">—</p><p class="modal-sub" id="resumo-sub">—</p></div>
<i class="ti ti-x modal-close" onclick="closeModal('modal-info-resumo')"></i>
</div>
<div id="resumo-corpo"></div>
</div>
</div>
<div class="modal-overlay" id="modal-fornecedor-detail">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title" id="fd-titulo">Compra — Rolamento</p><p class="modal-sub" id="fd-sub">NF 37.901</p></div>
<i class="ti ti-x modal-close" onclick="closeModal('modal-fornecedor-detail')"></i>
</div>
<div class="detail-row"><span class="l">Fornecedor</span><span id="fd-fornecedor">DHT Importação</span></div>
<div class="detail-row"><span class="l">Data da compra</span><span id="fd-data">08/06/2026</span></div>
<div class="detail-row"><span class="l">Quantidade</span><span id="fd-qtd">20 un.</span></div>
<div class="detail-row"><span class="l">Valor total da compra</span><span id="fd-valor-total">R$ 1.048,00</span></div>
<div class="detail-row"><span class="l">Frete</span><span id="fd-frete">R$ 40,00</span></div>
<div class="detail-row"><span class="l">Custo unitário (com frete)</span><span id="fd-unitario">R$ 54,40</span></div>
<div class="detail-row"><span class="l">Número da NF</span><span id="fd-nf">37.901</span></div>
</div>
</div>
<div id="view-compra" class="view">
<div class="topbar">
<div style="display:flex; align-items:center; gap:10px;">
<i class="ti ti-arrow-left" style="font-size:19px; cursor:pointer;" onclick="openTab('pecas','estoque')"></i>
<div>
<h1 class="page-title">Lançar compra de peça</h1>
<p class="page-sub">Registra fornecedor, valor e nota fiscal pra comparar preço depois</p>
</div>
</div>
</div>
<div class="xml-future">
<i class="ti ti-file-upload"></i>
Importar XML de NF-e automaticamente
<span class="soon">em breve</span>
</div>
<div class="form-card">
<div class="form-row">
<label class="form-label">Peça</label>
<input type="text" id="compra-peca" value="Rolamento" list="lista-pecas" oninput="recalcCompra()">
<datalist id="lista-pecas">
<option value="Rolamento">
<option value="Capacitor">
<option value="Escova de carvão">
<option value="Carvão serra mármore">
</datalist>
</div>
<div class="form-row two">
<div><label class="form-label">Quantidade</label><input type="number" id="compra-qtd" value="20" oninput="recalcCompra()"></div>
<div><label class="form-label">Valor total da compra</label><input type="number" id="compra-valor" value="1048.00" oninput="recalcCompra()"></div>
</div>
<div class="form-row two">
<div><label class="form-label">Frete</label><input type="number" id="compra-frete" value="40.00" oninput="recalcCompra()"></div>
<div><label class="form-label">Número da NF</label><input type="text" placeholder="ex: 37.901"></div>
</div>
<div class="form-row">
<label class="form-label">Fornecedor</label>
<input type="text" value="DHT Importação" list="lista-fornecedores">
<datalist id="lista-fornecedores">
<option value="DHT Importação">
<option value="Makita do Brasil">
</datalist>
<p class="cost-source">Digite pra buscar no histórico — se for novo, é só escrever o nome</p>
</div>
<div class="form-row">
<label class="form-label">Data da compra</label>
<input type="text" value="23/06/2026" style="max-width:160px;">
</div>
<div class="breakdown">
<div class="breakdown-row"><span>Total da compra (peças + frete)</span><span style="font-weight:600;" id="compra-total-geral">R$ 1.088,00</span></div>
<div class="breakdown-row"><span>Custo médio anterior e qtd. no estoque</span><span id="compra-custo-anterior">R$ 54,80 (22 un.)</span></div>
<div class="breakdown-row total"><span>Novo custo médio ponderado</span><span id="compra-novo-custo" style="color:var(--good);">R$ 53,70</span></div>
<p class="panel-note" id="compra-explicacao" style="margin-top:10px;">Cálculo: ((22 un. × R$ 54,80) + (20 un. × R$ 54,40)) ÷ 42 un. = R$ 53,70. O custo de R$ 54,40 por unidade já inclui o frete rateado (R$ 1.088,00 ÷ 20 un.).</p>
</div>
<button class="btn primary full"><i class="ti ti-device-floppy"></i> Lançar compra</button>
</div>
</div>
<div id="view-editaritem" class="view">
<div class="topbar">
<div style="display:flex; align-items:center; gap:10px;">
<i class="ti ti-arrow-left" style="font-size:19px; cursor:pointer;" onclick="openTab('pecas','estoque')"></i>
<div>
<h1 class="page-title">Editar item — Rolamento</h1>
<p class="page-sub">Ajuste manual de quantidade ou dados do item</p>
</div>
</div>
</div>
<div class="form-card">
<div class="form-row two">
<div><label class="form-label">Quantidade em estoque</label><input type="number" value="22"></div>
<div><label class="form-label">Estoque de segurança (alerta)</label><input type="number" value="10"></div>
</div>
<div class="form-row">
<label class="form-label">Custo médio atual</label>
<input type="text" value="R$ 54,80 (calculado automaticamente pelas compras)" disabled>
</div>
<button class="btn primary full"><i class="ti ti-device-floppy"></i> Salvar ajuste</button>
</div>
</div>
<div id="view-fin-caixa" class="view">
<div class="topbar">
<div>
<h1 class="page-title">Painel do Dia</h1>
<p class="page-sub">Seu resumo financeiro do dia — tudo que entrou, saiu e o que precisa da sua atenção</p>
</div>
<label class="today-pill" style="display:flex; align-items:center; gap:6px; cursor:pointer;" onclick="openGestaoDatePicker('fc')">
<i class="ti ti-calendar-event"></i>
<span id="fc-data-label">terça, 23 de junho</span>
<input type="date" id="fc-data-input" onchange="onGestaoDataChange('fc')" style="position:absolute; opacity:0; width:1px; height:1px;">
</label>
</div>
<div id="fc-data-banner" style="display:none; margin:0 0 16px; padding:11px 14px; background:var(--amber-soft); border:1px solid rgba(122,84,16,0.18); border-radius:10px; font-size:12.5px; color:#7A5410; align-items:center; gap:10px;">
<i class="ti ti-history"></i>
<span id="fc-data-banner-text" style="flex:1;">—</span>
<button onclick="voltarGestaoHoje('fc')" style="border:none; background:#7A5410; color:#fff; font-size:12px; font-weight:600; padding:6px 12px; border-radius:999px; cursor:pointer;">Voltar para hoje</button>
</div>
<p class="section-label" style="margin-top:0;">Acesso rápido</p>
<div class="vg-shortcuts">
<div class="vg-shortcut" onclick="openContas('pagar')"><i class="ti ti-file-invoice"></i>Contas a Pagar</div>
<div class="vg-shortcut" onclick="openContas('receber')"><i class="ti ti-file-dollar"></i>Contas a Receber</div>
<div class="vg-shortcut" onclick="showView('fin-folha', document.querySelector('[data-view=fin-folha]'))"><i class="ti ti-users"></i>Gestão Equipe</div>
<div class="vg-shortcut" onclick="showView('fin-pessoal', document.querySelector('[data-view=fin-pessoal]'))"><i class="ti ti-home-heart"></i>Despesas Família</div>
</div>
<p class="section-label">Hoje vs. ontem</p>
<div class="vg-grid-top three">
<div class="vg-card-big warn">
<div class="vg-top"><span class="vg-icon vg-sign" id="pd-sign-saldo" style="background:rgba(201,138,43,0.18); color:var(--amber);">+</span><span class="vg-trend up">+8% vs. ontem</span></div>
<p class="vg-num-big">R$ 8.940</p>
<p class="vg-label-big">Saldo em caixa hoje</p>
</div>
<div class="vg-card-big good">
<div class="vg-top"><span class="vg-icon vg-sign" style="background:rgba(47,143,91,0.16); color:var(--good);">+</span><span class="vg-trend up">+22% vs. ontem</span></div>
<p class="vg-num-big">R$ 1.840</p>
<p class="vg-label-big">Entrou hoje</p>
</div>
<div class="vg-card-big danger">
<div class="vg-top"><span class="vg-icon vg-sign">−</span><span class="vg-trend down">-15% vs. ontem</span></div>
<p class="vg-num-big">R$ 540</p>
<p class="vg-label-big">Saiu hoje</p>
</div>
</div>
<div class="fin-section-head">
<p class="section-label" style="margin:0;">Lançamentos de hoje</p>
<button class="btn primary" style="display:flex; align-items:center; gap:6px;" onclick="abrirNovoLancamento()"><i class="ti ti-plus"></i> Novo lançamento</button>
</div>
<div class="fin-ledger-list" id="pd-ledger-list">
<div class="fin-ledger-row">
<div class="fin-ledger-icon in"><i class="ti ti-arrow-down-circle"></i></div>
<div style="flex:1;">
<p class="nm">Contrato #1248 — Carlos Eduardo Pires</p>
<p class="sub">PIX · 09:42 · <span class="fin-origin-tag recepcao">Lançamento Automático Recepção</span></p>
</div>
<span class="val in">+R$ 290</span>
<button class="fin-edit-btn-txt" onclick="editarLancamento(this)"><i class="ti ti-pencil"></i> Editar</button>
</div>
<div class="fin-ledger-row">
<div class="fin-ledger-icon out"><i class="ti ti-arrow-up-circle"></i></div>
<div style="flex:1;">
<p class="nm">Combustível caminhonete</p>
<p class="sub">Dinheiro · 11:20 · <span class="fin-origin-tag recepcao">Lançamento Automático Recepção</span></p>
</div>
<span class="val out">-R$ 180</span>
<button class="fin-edit-btn-txt" onclick="editarLancamento(this)"><i class="ti ti-pencil"></i> Editar</button>
</div>
<div class="fin-ledger-row">
<div class="fin-ledger-icon in"><i class="ti ti-arrow-down-circle"></i></div>
<div style="flex:1;">
<p class="nm">Venda balcão — rolamento</p>
<p class="sub">Cartão · 14:05 · <span class="fin-origin-tag recepcao">Lançamento Automático Recepção</span></p>
</div>
<span class="val in">+R$ 95</span>
<button class="fin-edit-btn-txt" onclick="editarLancamento(this)"><i class="ti ti-pencil"></i> Editar</button>
</div>
<div class="fin-ledger-row">
<div class="fin-ledger-icon out"><i class="ti ti-arrow-up-circle"></i></div>
<div style="flex:1;">
<p class="nm">Conta de energia — paga</p>
<p class="sub">Boleto · 15:30 · <span class="fin-origin-tag gestao-auto">Lançamento Automático Gestão</span></p>
</div>
<span class="val out">-R$ 480</span>
<button class="fin-edit-btn-txt" onclick="editarLancamento(this)"><i class="ti ti-pencil"></i> Editar</button>
</div>
<div class="fin-ledger-row">
<div class="fin-ledger-icon out"><i class="ti ti-arrow-up-circle"></i></div>
<div style="flex:1;">
<p class="nm">Material de limpeza</p>
<p class="sub">Dinheiro · 16:10 · <span class="fin-origin-tag gestao-manual">Lançamento Manual Gestão</span></p>
</div>
<span class="val out">-R$ 65</span>
<button class="fin-edit-btn-txt" onclick="editarLancamento(this)"><i class="ti ti-pencil"></i> Editar</button>
</div>
</div>
<p class="panel-note" style="text-align:center; margin-top:12px;">Tudo que a Meire lança na recepção cai aqui sozinho — clique em Editar se precisar ajustar algo</p>
<p class="section-label" style="margin-top:28px;">Esse mês até hoje, vs. mês passado</p>
<div class="vg-card-big good mes-compare-card" style="margin-bottom:14px;">
<div class="vg-top"><span class="vg-icon vg-sign">+</span><span class="vg-trend up">+18% vs. mês passado</span></div>
<p class="vg-num-big">R$ 4.260</p>
<p class="vg-label-big">Saldo acumulado até dia 23 (mês passado nesse ponto: R$ 3.610)</p>
</div>
<div class="mom-grid" style="grid-template-columns: repeat(2,1fr); margin-bottom:16px;">
<div class="mom-card">
<p class="mom-lbl">Entradas</p>
<p class="mom-num good">R$ 21.340</p>
<p class="mom-cmp">mês passado: R$ 19.800 <span class="up">+8%</span></p>
</div>
<div class="mom-card">
<p class="mom-lbl">Saídas</p>
<p class="mom-num danger">R$ 17.080</p>
<p class="mom-cmp">mês passado: R$ 16.190 <span class="down">+5%</span></p>
</div>
</div>
<div class="fat-compare-box receita">
<p class="section-label" style="margin:0 0 2px;">Faturamento por linha</p>
<div class="fat-compare-legend">
<span><span class="fat-compare-dot" style="background:rgba(180,170,150,0.4);"></span>Mês passado</span>
<span><span class="fat-compare-dot" style="background:var(--good);"></span>Mês atual</span>
</div>
<div class="fat-compare-row">
<div class="fat-compare-head"><span class="fat-compare-label">Locação</span><span class="fat-compare-delta up">+12%</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill prev" style="width:56%;"></div><span class="fat-bar-val">R$ 11.100</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill curr" style="width:62%;"></div><span class="fat-bar-val curr">R$ 12.400</span></div>
</div>
<div class="fat-compare-row">
<div class="fat-compare-head"><span class="fat-compare-label">Oficina</span><span class="fat-compare-delta down">-4%</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill prev" style="width:32%;"></div><span class="fat-bar-val">R$ 6.400</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill curr" style="width:31%;"></div><span class="fat-bar-val curr">R$ 6.140</span></div>
</div>
<div class="fat-compare-row">
<div class="fat-compare-head"><span class="fat-compare-label">Peças</span><span class="fat-compare-delta up">+22%</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill prev" style="width:12%;"></div><span class="fat-bar-val">R$ 2.300</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill curr" style="width:14%;"></div><span class="fat-bar-val curr">R$ 2.800</span></div>
</div>
</div>
<div class="fat-compare-box" style="margin-top:28px;">
<p class="section-label" style="margin:0 0 2px;">Despesas fixas por linha — mês vs. mês</p>
<div class="fat-compare-legend">
<span><span class="fat-compare-dot" style="background:rgba(232,90,40,0.4);"></span>Mês passado</span>
<span><span class="fat-compare-dot" style="background:var(--green-mid);"></span>Mês atual</span>
</div>
<div class="fat-compare-row">
<div class="fat-compare-head"><span class="fat-compare-label">Folha de pagamento</span><span class="fat-compare-delta down">0%</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill prev" style="width:74%;"></div><span class="fat-bar-val">R$ 8.900</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill curr" style="width:74%;"></div><span class="fat-bar-val curr">R$ 8.900</span></div>
</div>
<div class="fat-compare-row">
<div class="fat-compare-head"><span class="fat-compare-label">Aluguel</span><span class="fat-compare-delta down">0%</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill prev" style="width:21%;"></div><span class="fat-bar-val">R$ 2.500</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill curr" style="width:21%;"></div><span class="fat-bar-val curr">R$ 2.500</span></div>
</div>
<div class="fat-compare-row">
<div class="fat-compare-head"><span class="fat-compare-label">Energia</span><span class="fat-compare-delta up">+18%</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill prev" style="width:6%;"></div><span class="fat-bar-val">R$ 400</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill curr" style="width:7%;"></div><span class="fat-bar-val curr">R$ 480</span></div>
</div>
<div class="fat-compare-row">
<div class="fat-compare-head"><span class="fat-compare-label">Faxina</span><span class="fat-compare-delta down">0%</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill prev" style="width:3%;"></div><span class="fat-bar-val">R$ 200</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill curr" style="width:3%;"></div><span class="fat-bar-val curr">R$ 200</span></div>
</div>
<div class="fat-compare-row">
<div class="fat-compare-head"><span class="fat-compare-label">Internet + telefone</span><span class="fat-compare-delta down">0%</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill prev" style="width:2%;"></div><span class="fat-bar-val">R$ 220</span></div>
<div class="fat-bar-line"><div class="fat-bar-fill curr" style="width:2%;"></div><span class="fat-bar-val curr">R$ 220</span></div>
</div>
</div>
<p class="panel-note" style="margin-top:6px;">Energia foi o que mais pesou entre as despesas fixas esse mês (+18% vs. mês passado, reajuste de tarifa).</p>
<div class="rec-causa-banner" style="margin-top:16px;">
<i class="ti ti-bulb"></i>
<div><p class="t">O que mais pesou na saída esse mês</p><p class="d">Aluguel + energia subiu R$ 400 (reajuste de energia) e Peças cresceu R$ 380 — compras maiores por causa do aumento de OS na oficina. Do lado da entrada, a locação de andaimes puxou o crescimento (+R$ 900 vs. mês passado).</p></div>
</div>
<p class="section-label" style="margin-top:28px;">Entrada x saída — últimos 6 meses</p>
<div class="chart-wrap" style="height: 200px;"><canvas id="chart-caixa-tendencia"></canvas></div>
<div class="rec-causa-banner" style="margin-top:16px; background:var(--amber-soft);">
<i class="ti ti-trending-up" style="color:var(--amber);"></i>
<div><p class="t" style="color:#7A5410;">Tendência: saída crescendo mais rápido que entrada</p><p class="d" style="color:#7A5410;">Nos últimos 3 meses a saída cresceu 18% enquanto a entrada cresceu 9%. Vale revisar despesas recorrentes.</p></div>
</div>
</div>
<div id="view-fin-contas" class="view">
<div class="topbar">
<div>
<h1 class="page-title">Contas a Pagar e Receber</h1>
<p class="page-sub">Visão mensal, contas a pagar e contas a receber</p>
</div>
</div>
<div class="fin-tab-row">
<button class="fin-tab-btn active" data-tab="mensal" onclick="setSubTab('fin-contas','mensal', this)">Visão Mensal</button>
<button class="fin-tab-btn" data-tab="pagar" onclick="setSubTab('fin-contas','pagar', this)">Contas a Pagar</button>
<button class="fin-tab-btn" data-tab="receber" onclick="setSubTab('fin-contas','receber', this)">Contas a Receber</button>
</div>
<!-- ===== VISÃO MENSAL (calendário) ===== -->
<div id="tab-fin-contas-mensal" class="tab-panel active">
<p class="panel-note" style="margin:0 0 14px;">Tudo que tem data marcada — contas a pagar e a receber — num só calendário. Clique num dia pra ver o detalhe e dar baixa.</p>
<select id="contas-mes-filtro" onchange="onContasMesChange()" class="today-pill" style="cursor:pointer; border:1px solid var(--border); font-family:var(--font-body); margin-bottom:12px;"></select>
<div id="contas-mes-banner" style="display:none; margin:0 0 14px; padding:11px 14px; background:var(--amber-soft); border:1px solid rgba(122,84,16,0.18); border-radius:10px; font-size:12.5px; color:#7A5410; align-items:center; gap:10px;">
<i class="ti ti-history"></i>
<span id="contas-mes-banner-text" style="flex:1;">—</span>
<button onclick="voltarContasMesAtual()" style="border:none; background:#7A5410; color:#fff; font-size:12px; font-weight:600; padding:6px 12px; border-radius:999px; cursor:pointer;">Voltar ao mês atual</button>
</div>
<div class="cal-legend">
<span><span class="cal-dot red"></span>Pagar — vencida</span>
<span><span class="cal-dot amber"></span>Pagar — a vencer</span>
<span><span class="cal-dot blue"></span>Receber</span>
</div>
<div class="cal-weekdays">
<span>D</span><span>S</span><span>T</span><span>Q</span><span>Q</span><span>S</span><span>S</span>
</div>
<div class="cal-grid" id="cal-contas-grid"></div>
<div id="cal-dia-detalhe" style="margin-top:18px;"></div>
</div>
<!-- ===== CONTAS A PAGAR ===== -->
<div id="tab-fin-contas-pagar" class="tab-panel">
<div class="col-head">
<p class="section-label" style="margin:0;">Contas a pagar</p>
<button class="btn primary" style="display:flex; align-items:center; gap:6px;" onclick="abrirNovaConta('pagar')"><i class="ti ti-plus"></i> Nova conta</button>
</div>
<div class="rec-causa-banner" id="banner-contas-vencidas" style="background:var(--red-soft); margin-bottom:18px;">
<i class="ti ti-alert-octagon" style="color:var(--red);"></i>
<div><p class="t" style="color:#7A2A24;">1 conta vencida</p><p class="d" style="color:#7A2A24;">Aluguel da loja — venceu há 2 dias, R$ 2.500,00</p></div>
</div>
<div class="fin-conta-list" id="contas-pagar-list">
<div class="fin-conta-card danger" data-categoria="Aluguel">
<div class="fin-conta-top">
<i class="ti ti-home"></i>
<div style="flex:1;"><p class="nm">Aluguel da loja</p><p class="sub">Venceu há 2 dias · 21/06</p></div>
<span class="val">R$ 2.500,00</span>
</div>
<div class="fin-conta-actions">
<button class="btn primary" style="flex:1;" onclick="marcarContaPaga(this)">Marcar como pago</button>
<button class="btn" onclick="abrirAnexoConta(this)"><i class="ti ti-paperclip"></i> Anexar</button>
</div>
</div>
<div class="fin-conta-card warn" data-categoria="Energia">
<div class="fin-conta-top">
<i class="ti ti-bolt"></i>
<div style="flex:1;"><p class="nm">Conta de energia</p><p class="sub">Vence em 2 dias · 25/06</p></div>
<span class="val">R$ 480,00</span>
</div>
<div class="fin-conta-actions">
<button class="btn primary" style="flex:1;" onclick="marcarContaPaga(this)">Marcar como pago</button>
<button class="btn" onclick="abrirAnexoConta(this)"><i class="ti ti-paperclip"></i> Anexar</button>
</div>
</div>
<div class="fin-conta-card" data-categoria="Fornecedor">
<div class="fin-conta-top">
<i class="ti ti-tool"></i>
<div style="flex:1;"><p class="nm">Fornecedor de peças</p><p class="sub">Vence em 5 dias · 28/06</p></div>
<span class="val">R$ 1.350,00</span>
</div>
<div class="fin-conta-actions">
<button class="btn primary" style="flex:1;" onclick="marcarContaPaga(this)">Marcar como pago</button>
<button class="btn" onclick="abrirAnexoConta(this)"><i class="ti ti-paperclip"></i> Anexar</button>
</div>
</div>
</div>
<p class="section-label" style="margin-top:24px;">Já pagas — com comprovante</p>
<div class="fin-ledger-list" id="contas-pagas-list">
<div class="fin-ledger-row" data-categoria="Água/Internet">
<div class="fin-ledger-icon in"><i class="ti ti-circle-check"></i></div>
<div style="flex:1;"><p class="nm">Internet + telefone</p><p class="sub">Pago em 18/06 · comprovante anexado</p></div>
<span class="val">R$ 220,00</span>
<button class="fin-edit-btn"><i class="ti ti-file-check"></i></button>
</div>
</div>
</div>
<!-- ===== CONTAS A RECEBER ===== -->
<div id="tab-fin-contas-receber" class="tab-panel">
<div class="col-head"><p class="section-label" style="margin:0;">Contas a receber</p><button class="btn primary" style="display:flex; align-items:center; gap:6px;" onclick="abrirNovaConta('receber')"><i class="ti ti-plus"></i> Nova conta</button></div>
<div class="fin-conta-list" id="contas-receber-list">
<div class="fin-conta-card danger" style="padding:14px 16px;" data-categoria="Locação">
<div class="fin-conta-top" style="margin-bottom:0;">
<i class="ti ti-alert-triangle"></i>
<div style="flex:1;"><p class="nm">Carlos Eduardo Pires</p><p class="sub">Betoneira 400L · venceu há 3 dias</p></div>
<span class="val">R$ 290</span>
<button class="btn" onclick="abrirAnexoConta(this)" style="margin-left:8px;"><i class="ti ti-paperclip"></i></button>
<button class="btn primary" style="margin-left:8px;" onclick="marcarContaRecebida(this)">Marcar recebido</button>
</div>
</div>
<div class="fin-conta-card warn" style="padding:14px 16px;" data-categoria="Locação">
<div class="fin-conta-top" style="margin-bottom:0;">
<i class="ti ti-clock"></i>
<div style="flex:1;"><p class="nm">Wederson Candido</p><p class="sub">Martelo 15kg · vence hoje</p></div>
<span class="val">R$ 435</span>
<button class="btn" onclick="abrirAnexoConta(this)" style="margin-left:8px;"><i class="ti ti-paperclip"></i></button>
<button class="btn primary" style="margin-left:8px;" onclick="marcarContaRecebida(this)">Marcar recebido</button>
</div>
</div>
</div>
<p class="section-label" style="margin-top:24px;">Recebidas — notas emitidas</p>
<div class="fin-ledger-list" id="contas-recebidas-list">
<p class="panel-note" id="contas-recebidas-vazio">Nenhuma conta recebida neste mês ainda.</p>
</div>
</div>
</div>
<div id="view-fin-folha" class="view">
<div class="topbar">
<div>
<h1 class="page-title">Gestão Equipe</h1>
<p class="page-sub">Cadastro, horas e envio pro contador — bonificação, férias e vale se lançam direto na linha do funcionário</p>
</div>
<select id="eq-mes-filtro" onchange="onEquipeMesChange()" class="today-pill" style="cursor:pointer; border:1px solid var(--border); font-family:var(--font-body);"></select>
</div>
<div id="eq-mes-banner" style="display:none; margin:0 0 16px; padding:11px 14px; background:var(--amber-soft); border:1px solid rgba(122,84,16,0.18); border-radius:10px; font-size:12.5px; color:#7A5410; align-items:center; gap:10px;">
<i class="ti ti-history"></i>
<span id="eq-mes-banner-text" style="flex:1;">—</span>
<button onclick="voltarEquipeMesAtual()" style="border:none; background:#7A5410; color:#fff; font-size:12px; font-weight:600; padding:6px 12px; border-radius:999px; cursor:pointer;">Voltar ao mês atual</button>
</div>
<div class="fin-tab-row">
<button class="fin-tab-btn active" data-tab="resumo" onclick="setSubTab('fin-folha','resumo', this)">Resumo</button>
<button class="fin-tab-btn" data-tab="abono" onclick="setSubTab('fin-folha','abono', this)">Lançar Abono/Falta</button>
<button class="fin-tab-btn" data-tab="contador" onclick="setSubTab('fin-folha','contador', this)">Enviar ao Contador</button>
</div>
<!-- ===== RESUMO ===== -->
<div id="tab-fin-folha-resumo" class="tab-panel active">
<p class="section-label">Visão geral</p>
<div class="pp-stat-row" style="grid-template-columns: repeat(5,1fr); margin-bottom:26px;">
<div class="pp-stat good"><p class="lbl">Funcionários ativos</p><p class="num" id="kpi-eq-ativos">-</p></div>
<div class="pp-stat"><p class="lbl">Folha base do mês</p><p class="num" id="kpi-eq-folha" style="font-size:19px;">-</p></div>
<div class="pp-stat"><p class="lbl">R$/h médio mecânicos</p><p class="num" id="kpi-eq-rh" style="font-size:19px;">-</p></div>
<div class="pp-stat warn"><p class="lbl">Abonos/faltas no mês</p><p class="num" id="kpi-eq-abonos">-</p></div>
<div class="pp-stat"><p class="lbl">Rotatividade do mês</p><p class="num" id="kpi-eq-rotatividade" style="font-size:19px;">-</p><p class="panel-note" id="kpi-eq-rotatividade-cmp" style="margin:4px 0 0; font-size:11px;">-</p></div>
</div>
<p class="section-label" id="eq-mes-ref-label">Equipe — mês de referência: junho/2026</p>
<div class="eq-table-card">
<div style="overflow-x:auto;">
<table class="few-table eq-table">
<thead>
<tr>
<th>Funcionário</th><th>Admissão</th><th>Demissão</th><th>Tempo de casa</th><th>Cargo</th>
<th class="num">Salário base</th><th class="num">R$/h</th><th class="num">Comissões</th>
<th class="num">Bonificações</th><th class="num">Vale antecipado</th><th>Férias no mês</th><th></th>
</tr>
</thead>
<tbody id="eq-tbl-resumo"></tbody>
</table>
</div>
</div>
<p class="panel-note" style="margin-top:8px;">R$/h vem do salário base dividido pela carga horária mensal cadastrada. A dos mecânicos alimenta a Precificação Serviço da Oficina. Comissões vêm direto da aba "Comissão por mecânico" da Oficina — nenhum lançamento manual aqui. Funcionários desligados somem dos formulários de lançamento, mas continuam aqui pro histórico.</p>
<p class="section-label" style="margin-top:28px;">Cadastrar funcionário</p>
<div class="pp-card">
<div class="form-row" style="display:grid; grid-template-columns:repeat(5,1fr); gap:12px;">
<div><label class="form-label">Nome</label><input id="eqNome"></div>
<div><label class="form-label">Cargo</label><input id="eqCargo"></div>
<div><label class="form-label">Data de admissão</label><input type="date" id="eqAdmissao"></div>
<div><label class="form-label">Salário base (R$)</label><input type="number" step="0.01" id="eqSalario"></div>
<div><label class="form-label">Carga horária mensal (h)</label><input type="number" step="1" id="eqCargaHoraria" placeholder="220"></div>
</div>
<button class="btn primary" style="margin-top:8px;" onclick="addFuncionarioEquipe()"><i class="ti ti-plus"></i> Adicionar funcionário</button>
</div>
</div>
<!-- ===== LANÇAR ABONO/FALTA ===== -->
<div id="tab-fin-folha-abono" class="tab-panel">
<div class="pp-card" style="margin-bottom:18px;">
<p class="panel-title" style="margin-bottom:14px;">Lançar abono, falta ou atestado</p>
<div class="form-row" style="display:grid; grid-template-columns:repeat(4,1fr); gap:12px;">
<div><label class="form-label">Funcionário</label><select id="afFuncionario" class="emp-select-equipe"></select></div>
<div><label class="form-label">Tipo</label>
<select id="afTipo" onchange="atualizarDescontoPadraoAbono()">
<option value="Atraso">Atraso</option>
<option value="Saída antecipada">Saída antecipada</option>
<option value="Falta">Falta</option>
<option value="Abono">Abono (falta justificada)</option>
<option value="Atestado médico">Atestado médico</option>
</select>
</div>
<div><label class="form-label">Data</label><input type="date" id="afData"></div>
<div><label class="form-label">Horas</label><input type="number" step="0.5" id="afHoras" placeholder="deixe em branco p/ dia inteiro"></div>
</div>
<div class="form-row" style="display:grid; grid-template-columns:2fr 1fr; gap:12px; align-items:end; margin-top:2px;">
<div><label class="form-label">Motivo / observação</label><input id="afMotivo" placeholder="ex: atraso no ônibus, consulta médica, filho doente..."></div>
<button class="btn" type="button" id="afAnexoBtn" style="display:flex; align-items:center; justify-content:center; gap:7px;" onclick="document.getElementById('afAnexoInput').click()"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.44 11.05 12.25 20.24a5.5 5.5 0 0 1-7.78-7.78l9.19-9.19a3.5 3.5 0 0 1 4.95 4.95L9.41 17.4a1.5 1.5 0 0 1-2.12-2.12l8.49-8.49"/></svg><span id="afAnexoLabel">Anexar atestado/comprovante</span></button>
<input type="file" id="afAnexoInput" accept="image/*,.pdf" style="display:none;" onchange="onAnexoAbonoSelecionado(event)">
</div>
<label style="display:flex; align-items:center; gap:8px; margin-top:12px; font-size:12.5px; color:var(--text-mute); cursor:pointer;">
<input type="checkbox" id="afNaoDescontar" style="width:15px; height:15px;"> Não descontar do salário (abonado pelo gestor)
</label>
<button class="btn primary" style="margin-top:14px;" onclick="addAbonoEquipe()"><i class="ti ti-plus"></i> Registrar</button>
</div>
<p class="section-label">Registro do mês — o que desconta e o que não desconta</p>
<div class="eq-table-card">
<div style="overflow-x:auto;">
<table class="few-table eq-table">
<thead><tr><th>Funcionário</th><th>Tipo</th><th>Data</th><th class="num">Horas</th><th>Motivo</th><th>Desconto</th><th></th></tr></thead>
<tbody id="eq-tbl-abonos"></tbody>
</table>
</div>
</div>
<p class="panel-note" style="margin-top:8px;">Atrasos, saídas antecipadas e faltas descontam por padrão. Abonos e atestados médicos não descontam — anexe o comprovante pra manter o registro completo.</p>
</div>
<!-- ===== ENVIAR AO CONTADOR ===== -->
<div id="tab-fin-folha-contador" class="tab-panel">
<div class="pp-card" style="margin-bottom:18px;">
<p class="panel-title" style="margin-bottom:6px;">Resumo do mês para o contador</p>
<p class="panel-note" style="margin:0 0 14px;">Escolha a competência. O resumo reúne horas trabalhadas, comissões (vindas da Oficina), bonificações, vales antecipados e férias de todos os funcionários, além das contas pagas e notas recebidas naquele mês (com os anexos de "Contas a Pagar e Receber") — pronto pra enviar ao contador.</p>
<div class="form-row" style="display:grid; grid-template-columns:repeat(3,1fr); gap:12px; align-items:end;">
<div><label class="form-label">Competência</label><input type="month" id="envCompetencia" value="2026-07"></div>
<button class="btn primary" onclick="gerarPreviaContador()"><i class="ti ti-file-text"></i> Gerar prévia</button>
<button class="btn" onclick="window.print()"><i class="ti ti-printer"></i> Imprimir / salvar PDF</button>
</div>
</div>
<div class="pp-card" id="previaEnvioCard" style="display:none; margin-bottom:18px;">
<p class="panel-title" style="margin-bottom:14px;">Prévia — competência <span id="previaCompetenciaLabel"></span></p>
<div style="overflow-x:auto;">
<table class="few-table">
<thead>
<tr>
<th>Funcionário</th><th>Cargo</th><th class="num">Salário base</th><th class="num">Horas no mês</th>
<th class="num">Comissões</th><th class="num">Bonificações</th><th class="num">Vale antecipado</th><th>Férias no mês</th>
</tr>
</thead>
<tbody id="eq-tbl-previa"></tbody>
</table>
</div>
<p class="panel-note" style="margin-top:8px;">Use "Imprimir / salvar PDF" pra gerar o arquivo pronto pra enviar ao contador por e-mail ou WhatsApp.</p>
</div>
<div class="pp-card" id="previaDocumentosCard" style="display:none; margin-bottom:18px;">
<p class="panel-title" style="margin-bottom:4px;">Documentos pra baixar — competência <span id="previaDocCompetenciaLabel"></span></p>
<p class="panel-note" style="margin:0 0 16px;" id="previaDocResumo">-</p>
<div id="previaDocumentosList"></div>
</div>
<div class="pp-card" id="previaContabilCard" style="display:none;">
<p class="panel-title" style="margin-bottom:6px;">Contábil do período — Contas a Pagar e Receber</p>
<p class="panel-note" style="margin:0 0 14px;">Notas emitidas, faturas de locação e contas pagas (energia, água, aluguel, honorário, boletos) — puxado direto de "Contas a Pagar e Receber", com os anexos de lá.</p>
<p class="section-label" style="margin:0 0 8px;">Contas pagas</p>
<div style="overflow-x:auto;">
<table class="few-table">
<thead><tr><th>Categoria</th><th>Descrição</th><th class="num">Valor</th><th>Pago em</th><th>Documento</th></tr></thead>
<tbody id="eq-tbl-previa-pagas"></tbody>
</table>
</div>
<p class="section-label" style="margin:20px 0 8px;">Notas emitidas / recebidas</p>
<div style="overflow-x:auto;">
<table class="few-table">
<thead><tr><th>Categoria</th><th>Descrição</th><th class="num">Valor</th><th>Recebido em</th><th>Documento</th></tr></thead>
<tbody id="eq-tbl-previa-recebidas"></tbody>
</table>
</div>
</div>
</div>
</div>
<!-- ===== Modais de lançamento rápido (Gestão Equipe) ===== -->
<div class="modal-overlay" id="modal-eq-bonificacao">
<div class="modal-box" style="max-width:380px;">
<div class="modal-head">
<p class="modal-title">Bonificação — <span id="eqbn-nome"></span></p>
<span class="modal-close" onclick="closeModal('modal-eq-bonificacao')"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18M6 6l12 12"/></svg></span>
</div>
<div class="form-row"><label class="form-label">Valor (R$)</label><input type="number" step="0.01" id="eqbnValor"></div>
<div class="form-row"><label class="form-label">Mês</label><input type="month" id="eqbnMes" value="2026-06"></div>
<div class="form-row"><label class="form-label">Motivo</label><input id="eqbnMotivo" placeholder="ex: meta de produtividade"></div>
<button class="btn primary full" onclick="salvarBonificacaoEquipe()"><i class="ti ti-check"></i> Adicionar bonificação</button>
</div>
</div>
<div class="modal-overlay" id="modal-eq-ferias">
<div class="modal-box" style="max-width:380px;">
<div class="modal-head">
<p class="modal-title">Agendar férias — <span id="eqfv-nome"></span></p>
<span class="modal-close" onclick="closeModal('modal-eq-ferias')"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18M6 6l12 12"/></svg></span>
</div>
<div class="form-row"><label class="form-label">Início</label><input type="date" id="eqfvInicio"></div>
<div class="form-row"><label class="form-label">Fim</label><input type="date" id="eqfvFim"></div>
<p class="panel-note" style="margin:0 0 12px;">Direito padrão: 30 dias por período aquisitivo de 12 meses trabalhados.</p>
<button class="btn primary full" onclick="salvarFeriasEquipe()"><i class="ti ti-check"></i> Agendar férias</button>
</div>
</div>
<div class="modal-overlay" id="modal-eq-vale">
<div class="modal-box" style="max-width:380px;">
<div class="modal-head">
<p class="modal-title">Vale adiantamento — <span id="eqvl-nome"></span></p>
<span class="modal-close" onclick="closeModal('modal-eq-vale')"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18M6 6l12 12"/></svg></span>
</div>
<div class="form-row"><label class="form-label">Data</label><input type="date" id="eqvlData"></div>
<div class="form-row"><label class="form-label">Valor (R$)</label><input type="number" step="0.01" id="eqvlValor"></div>
<div class="form-row"><label class="form-label">Motivo</label><input id="eqvlMotivo" placeholder="opcional"></div>
<button class="btn primary full" onclick="salvarValeEquipe()"><i class="ti ti-printer"></i> Lançar Vale e Imprimir Comprovante</button>
</div>
</div>
<div id="view-fin-pessoal" class="view">
<div class="topbar">
<div>
<h1 class="page-title">Despesas Família</h1>
<p class="page-sub">Gasto pessoal separado do caixa da empresa</p>
</div>
</div>
<div>
<p class="panel-note" style="margin:0 0 16px;">Retiradas do caixa da empresa pra uso pessoal — manter separado ajuda a ver o resultado real do negócio.</p>
<div class="mes-nav-df">
<button onclick="mudarMesDespesasFamilia(-1)"><i class="ti ti-chevron-left"></i></button>
<div class="mes-nav-df-label" id="df-rotulo-mes">Junho de 2026</div>
<button onclick="mudarMesDespesasFamilia(1)"><i class="ti ti-chevron-right"></i></button>
</div>
<div class="fin-stat-row3" style="grid-template-columns: repeat(2,1fr);">
<div class="fin-stat warn"><p class="lbl">Retirado esse mês</p><p class="num" id="df-valor-retirado">R$ 0</p></div>
<div class="fin-stat">
<p class="lbl">% do que entrou no mês</p>
<p class="num" id="df-valor-percentual">0%</p>
<input type="number" class="df-faturamento-input" id="df-campo-faturamento" placeholder="Faturamento do mês (R$)" onchange="atualizarFaturamentoDespesasFamilia()">
</div>
</div>
<div class="pp-card" style="margin-bottom:18px;">
<p class="panel-title" style="margin-bottom:10px;">Pró-labore combinado do mês</p>
<div class="form-row">
<label class="form-label">Valor combinado (meta mensal de retirada)</label>
<input type="number" id="df-prolabore-input" placeholder="ex: 4000" onchange="atualizarProLaboreDF()">
</div>
<div style="background:var(--bg-soft); border-radius:999px; height:10px; overflow:hidden; margin:10px 0 6px;">
<div id="df-prolabore-barra" style="height:100%; width:0%; background:var(--good); border-radius:999px; transition:width .2s;"></div>
</div>
<p class="panel-note" id="df-prolabore-texto" style="margin:0;">Defina um valor combinado pra acompanhar o quanto já foi retirado.</p>
</div>
<div id="df-alerta-limite" style="display:none; margin-bottom:18px; padding:12px 16px; background:var(--red-soft); border-radius:10px; display:flex; align-items:center; gap:10px;">
<i class="ti ti-alert-triangle" style="color:var(--red); font-size:18px;"></i>
<p style="margin:0; font-size:12.5px; color:#7A2A24;" id="df-alerta-limite-texto">—</p>
</div>
<div class="pp-card" style="margin-bottom:18px;">
<p class="panel-title" style="margin-bottom:10px;">Evolução — últimos 6 meses</p>
<div id="df-evolucao-lista"></div>
</div>
<div class="pp-card">
<p class="panel-title" style="margin-bottom:14px;">Lançar despesa da família</p>
<div class="form-row two">
<div><label class="form-label">Descrição</label><input type="text" id="gp-descricao" placeholder="ex: Mercado, viagem, presente..."></div>
<div><label class="form-label">Valor</label><input type="number" id="gp-valor" placeholder="0,00"></div>
</div>
<div class="form-row two">
<div><label class="form-label">Quem retirou</label>
<select id="gp-quem"><option>Marcelo</option><option>Lucilene</option></select>
</div>
<div><label class="form-label">Data</label><input type="date" id="gp-data"></div>
</div>
<button class="btn primary full" onclick="lancarGastoPessoal()"><i class="ti ti-plus"></i> Lançar</button>
</div>
<p class="section-label">Histórico do mês</p>
<div class="fin-ledger-list" id="gp-historico-list"></div>
<p class="panel-note" id="df-vazio-nota" style="display:none; text-align:center;">Nenhuma retirada registrada neste mês.</p>
</div>
</div>
<div class="modal-overlay" id="modal-anexo">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title">Anexar arquivos</p><p class="modal-sub">Comprovante de pagamento e conta original</p></div>
<i class="ti ti-x modal-close" onclick="closeModal('modal-anexo')"></i>
</div>
<div class="form-row">
<label class="form-label">Comprovante de pagamento</label>
<div class="attach-box" id="attach-comprovante-box" onclick="document.getElementById('attach-comprovante-input').click()"><i class="ti ti-paperclip"></i><span id="attach-comprovante-label">Clique para selecionar o arquivo</span></div>
<input type="file" id="attach-comprovante-input" accept="image/*,.pdf" style="display:none;" onchange="onAnexoContaSelecionado(event,'comprovante')">
</div>
<div class="form-row">
<label class="form-label">Arquivo da conta (boleto, fatura)</label>
<div class="attach-box" id="attach-contaorig-box" onclick="document.getElementById('attach-contaorig-input').click()"><i class="ti ti-paperclip"></i><span id="attach-contaorig-label">Clique para selecionar o arquivo</span></div>
<input type="file" id="attach-contaorig-input" accept="image/*,.pdf" style="display:none;" onchange="onAnexoContaSelecionado(event,'contaorig')">
</div>
<button class="btn primary full" onclick="salvarAnexoConta()"><i class="ti ti-check"></i> Salvar anexos</button>
</div>
</div>
<div class="modal-overlay" id="modal-novo-lancamento">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title" id="ml-titulo">Novo lançamento</p><p class="modal-sub" id="ml-sub">Entrada ou saída manual no caixa</p></div>
<i class="ti ti-x modal-close" onclick="closeModal('modal-novo-lancamento')"></i>
</div>
<div class="form-row">
<label class="form-label">Tipo</label>
<div class="toggle-row" id="ml-tipo-toggle">
<div class="toggle-opt selected"><i class="ti ti-arrow-down-circle"></i> Entrada</div>
<div class="toggle-opt"><i class="ti ti-arrow-up-circle"></i> Saída</div>
</div>
</div>
<div class="form-row"><label class="form-label">Descrição</label><input type="text" id="ml-descricao" placeholder="ex: Pagamento de cliente"></div>
<div class="form-row"><label class="form-label">Valor</label><input type="number" id="ml-valor" placeholder="0,00"></div>
<button class="btn primary full" onclick="salvarLancamento()"><i class="ti ti-check"></i> Lançar</button>
</div>
</div>
<div class="modal-overlay" id="modal-nova-conta">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title" id="nc-titulo">Nova conta a pagar</p><p class="modal-sub">Cadastre com vencimento — aparece no calendário e na lista</p></div>
<i class="ti ti-x modal-close" onclick="closeModal('modal-nova-conta')"></i>
</div>
<div class="form-row"><label class="form-label">Descrição</label><input type="text" id="nc-descricao" placeholder="ex: Aluguel da loja, Cliente João..."></div>
<div class="form-row two">
<div><label class="form-label">Categoria</label>
<select id="nc-categoria">
<option>Aluguel</option><option>Energia</option><option>Água/Internet</option>
<option>Fornecedor</option><option>Honorário</option><option>Locação</option><option>Outros</option>
</select>
</div>
<div><label class="form-label">Valor</label><input type="number" id="nc-valor" placeholder="0,00"></div>
</div>
<div class="form-row"><label class="form-label">Vencimento</label><input type="date" id="nc-vencimento"></div>
<div class="form-row" style="display:flex; align-items:center; gap:8px;">
<input type="checkbox" id="nc-recorrente" style="width:auto;" onchange="document.getElementById('nc-recorrencia-opts').style.display = this.checked ? 'block' : 'none';">
<label class="form-label" style="margin:0;" for="nc-recorrente">Conta recorrente (repete todo mês — ex: energia, água, aluguel)</label>
</div>
<div id="nc-recorrencia-opts" style="display:none; padding:10px 12px; background:var(--bg-soft); border-radius:8px; margin-bottom:12px;">
<label class="form-label">Repetir por quantos meses</label>
<input type="number" id="nc-recorrencia-meses" value="12" min="1" max="36">
</div>
<button class="btn primary full" onclick="salvarNovaConta()"><i class="ti ti-check"></i> Salvar conta</button>
</div>
</div>
<div class="modal-overlay" id="modal-confirma-lancamento">
<div class="modal-box" style="max-width:360px; text-align:center; position:relative;">
<i class="ti ti-x modal-close" style="position:absolute; top:14px; right:14px;" onclick="closeModal('modal-confirma-lancamento')"></i>
<i class="ti ti-circle-check" style="font-size:40px; color:var(--good); display:block; margin:4px auto 10px;"></i>
<p class="modal-title" style="text-align:center;">Lançamento salvo</p>
<p class="panel-note" style="text-align:center;">Já atualizamos o saldo do dia.</p>
<button class="btn primary full" style="margin-top:14px;" onclick="closeModal('modal-confirma-lancamento')">Ok, entendi</button>
</div>
</div>
<div class="modal-overlay" id="modal-bonificacao">
<div class="modal-box">
<div class="modal-head">
<div><p class="modal-title">Adicionar bonificação</p><p class="modal-sub" id="bonificacao-nome">—</p></div>
<i class="ti ti-x modal-close" onclick="closeModal('modal-bonificacao')"></i>
</div>
<div class="form-row"><label class="form-label">Valor</label><input type="number" placeholder="0,00"></div>
<div class="form-row"><label class="form-label">Mês</label><input type="text" placeholder="ex: Junho/2026"></div>
<div class="form-row"><label class="form-label">Motivo</label><input type="text" placeholder="ex: meta de produtividade"></div>
<button class="btn primary full" onclick="closeModal('modal-bonificacao')"><i class="ti ti-check"></i> Registrar bonificação</button>
</div>
</div>
<div id="view-chatmarcelo" class="view">
<div class="topbar">
<div>
<h1 class="page-title">Chat</h1>
<p class="page-sub">Fale com a Meire, ou pergunte direto pro sistema</p>
</div>
</div>
<div class="chat-toggle">
<div class="opt selected" onclick="setChatModeMarcelo(this, 'people')"><i class="ti ti-user"></i> Meire</div>
<div class="opt" onclick="setChatModeMarcelo(this, 'system')"><i class="ti ti-robot"></i> Perguntar ao sistema</div>
</div>
<div class="chat-window">
<div class="chat-msgs" id="chat-msgs-marcelo">
<div class="msg-row them">
<div class="msg-avatar">ME</div>
<div class="msg them">Bom dia! O cliente Carlos Eduardo tá achando caro a diária da betoneira, pode confirmar se posso dar desconto?<div class="msg-meta">Meire · 09:05</div></div>
</div>
<div class="msg-row me">
<div class="msg me">Pode dar até R$ 10 de desconto se ele pegar por 3 dias. Acima disso me chama.<div class="msg-meta">Você · 09:11</div></div>
</div>
</div>
<div class="chat-input">
<input type="text" id="chat-input-field-marcelo" placeholder="Escreva uma mensagem...">
<button class="btn primary" onclick="sendChatMarcelo()"><i class="ti ti-send"></i></button>
</div>
</div>
</div>
</main>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js"></script>
<script>
function showView(name, btn) {
document.querySelectorAll('.view').forEach(v => v.classList.remove('active'));
var target = document.getElementById('view-' + name);
if (!target) return;
target.classList.add('active');
document.querySelectorAll('.nav-item').forEach(n => n.classList.remove('active'));
if (btn) btn.classList.add('active');
if (name === 'fin-caixa') setTimeout(initCaixaChart, 0);
// se o item clicado estiver dentro de um subgrupo (Oficina/Loja/Peças), expande esse subgrupo
if (btn) {
var parentSub = btn.closest('.nav-sub-items');
if (parentSub) {
parentSub.classList.add('expanded');
var toggleBtn = parentSub.previousElementSibling;
if (toggleBtn && toggleBtn.classList.contains('nav-group-toggle')) toggleBtn.classList.add('expanded');
}
} else {
// veio de um atalho/link interno (ex: "Ver todas as OS finalizadas") — expande o subgrupo certo se existir
var matching = document.querySelector('.nav-item[data-view="' + name + '"]');
if (matching) {
var sub = matching.closest('.nav-sub-items');
if (sub) {
sub.classList.add('expanded');
var tb = sub.previousElementSibling;
if (tb && tb.classList.contains('nav-group-toggle')) tb.classList.add('expanded');
}
matching.classList.add('active');
}
}
}
function toggleSubgroup(id, toggleBtn) {
var group = document.getElementById(id);
var expanding = !group.classList.contains('expanded');
group.classList.toggle('expanded');
toggleBtn.classList.toggle('expanded', expanding);
}
// ===== Abas internas dos hubs (Oficina / Loja / Peças) =====
function setSubTab(hub, tab, btn) {
document.querySelectorAll('#view-' + hub + ' .tab-panel').forEach(p => p.classList.remove('active'));
var panel = document.getElementById('tab-' + hub + '-' + tab);
if (panel) panel.classList.add('active');
document.querySelectorAll('#view-' + hub + ' .fin-tab-row .fin-tab-btn').forEach(b => b.classList.remove('active'));
if (btn) btn.classList.add('active');
window.dispatchEvent(new Event('resize'));
if (hub === 'pecas' && tab === 'estoque') filterEstoqueTabs();
}
// abre um hub (Oficina/Loja/Peças) já numa aba específica — usado por atalhos de outras telas
function openTab(hub, tab) {
showView(hub, document.querySelector('.nav-item[data-view="' + hub + '"]'));
if (tab && tab !== 'visaogeral') {
var btn = document.querySelector('#view-' + hub + ' .fin-tab-row .fin-tab-btn[data-tab="' + tab + '"]');
if (btn) setSubTab(hub, tab, btn);
}
}
// ===== Filtro de período (Oficina / Loja / Comissão) — dropdown único =====
var periodoNomes = { dia: 'Diário', semanal: 'Semanal', quinzenal: 'Quinzenal', mensal: 'Mensal', personalizado: 'Personalizado' };
var periodoDatas = {
dia: 'terça, 23 de junho',
semanal: '17 a 23 de junho',
quinzenal: '10 a 23 de junho',
mensal: '1 a 23 de junho',
personalizado: 'período personalizado'
};
var periodoDadosOficina = {
dia: { aberto: 1, andamento: 1, peca: 2, finalizadas: 4 },
semanal: { aberto: 3, andamento: 2, peca: 2, finalizadas: 14 },
quinzenal: { aberto: 4, andamento: 3, peca: 2, finalizadas: 31 },
mensal: { aberto: 3, andamento: 2, peca: 2, finalizadas: 62 },
personalizado: { aberto: 3, andamento: 2, peca: 2, finalizadas: 62 }
};
var periodoDadosLoja = {
dia: 'R$ 1.840 hoje',
semanal: 'R$ 9.840 nos últimos 7 dias',
quinzenal: 'R$ 18.200 nos últimos 15 dias',
mensal: 'R$ 31.600 em junho',
personalizado: 'R$ 31.600 no período selecionado'
};
function togglePeriodoDropdown(pillBtn) {
var wrap = pillBtn.closest('.period-select');
var wasOpen = wrap.classList.contains('open');
document.querySelectorAll('.period-select.open').forEach(w => w.classList.remove('open'));
if (!wasOpen) wrap.classList.add('open');
}
document.addEventListener('click', function(e) {
if (!e.target.closest('.period-select')) {
document.querySelectorAll('.period-select.open').forEach(w => w.classList.remove('open'));
}
});
function abrirPersonalizarPeriodo(scope, item) {
var wrap = item.closest('.period-select');
var custom = document.getElementById('periodo-' + scope + '-custom');
if (!custom) return;
var isOpen = custom.style.display === 'block';
document.querySelectorAll('.period-custom-range').forEach(function(c) { c.style.display = 'none'; });
custom.style.display = isOpen ? 'none' : 'block';
var iniEl = document.getElementById('periodo-' + scope + '-ini');
var fimEl = document.getElementById('periodo-' + scope + '-fim');
if (iniEl && !iniEl.value) iniEl.value = '2026-06-01';
if (fimEl && !fimEl.value) fimEl.value = '2026-06-23';
}
function aplicarPeriodoPersonalizado(scope) {
var iniEl = document.getElementById('periodo-' + scope + '-ini');
var fimEl = document.getElementById('periodo-' + scope + '-fim');
if (!iniEl.value || !fimEl.value) { return; }
var fmt = function(v) { var p = v.split('-'); return p[2] + '/' + p[1]; };
var wrap = document.getElementById('periodo-' + scope);
wrap.querySelectorAll('.period-dropdown-item').forEach(function(b) { b.classList.remove('active'); });
var itemPersonalizar = wrap.querySelector('.period-dropdown-item[onclick*="abrirPersonalizarPeriodo"]');
if (itemPersonalizar) itemPersonalizar.classList.add('active');
var label = 'Personalizado · ' + fmt(iniEl.value) + ' a ' + fmt(fimEl.value);
var pillLabel = document.getElementById('periodo-' + scope + '-label');
if (pillLabel) pillLabel.textContent = label;
document.getElementById('periodo-' + scope + '-custom').style.display = 'none';
wrap.classList.remove('open');
if (scope === 'oficina') {
var d = periodoDadosOficina.mensal;
if (d) {
document.getElementById('of-num-aberto').textContent = d.aberto;
document.getElementById('of-num-andamento').textContent = d.andamento;
document.getElementById('of-num-peca').textContent = d.peca;
document.getElementById('of-num-finalizadas').textContent = d.finalizadas;
}
atualizarChartOSSemana('personalizado');
}
if (scope === 'loja') {
var fat = document.getElementById('loja-fat-titulo');
if (fat && periodoDadosLoja.mensal) fat.textContent = periodoDadosLoja.mensal;
atualizarChartLoja('personalizado');
}
if (scope === 'comissao') {
aplicarDadosComissao(periodoDadosComissao.mensal);
}
}
var periodoDadosComissao = {
dia: {
jose: { os: 1, total: 80 }, carlos: { os: 1, total: 60 },
detalhe: [
{ os: '#245', desc: 'Martelete Bosch — João Paulo', mec: 'José', preco: 180, comissao: 8 },
{ os: '#243', desc: 'Bomba submersível — Cond. Reserva Real', mec: 'Carlos', preco: 680, comissao: 60 }
]
},
semanal: {
jose: { os: 4, total: 296 }, carlos: { os: 2, total: 180 },
detalhe: [
{ os: '#245', desc: 'Martelete Bosch — João Paulo', mec: 'José', preco: 180, comissao: 8 },
{ os: '#240', desc: 'Guincho talha elétrica — Fund. Arthur Bernardes', mec: 'José', preco: 465, comissao: 8 },
{ os: '#236', desc: 'Serra mármore — Samuel', mec: 'José', preco: 50, comissao: 2 },
{ os: '#221', desc: 'Compactador de solo — Reginaldo', mec: 'Carlos', preco: 340, comissao: 10 }
]
},
quinzenal: {
jose: { os: 7, total: 480 }, carlos: { os: 4, total: 290 },
detalhe: [
{ os: '#240', desc: 'Guincho talha elétrica — Fund. Arthur Bernardes', mec: 'José', preco: 465, comissao: 8 },
{ os: '#236', desc: 'Serra mármore — Samuel', mec: 'José', preco: 50, comissao: 2 },
{ os: '#229', desc: 'Talha elétrica — Marco Thulio', mec: 'José', preco: 280, comissao: 8 },
{ os: '#221', desc: 'Compactador de solo — Reginaldo', mec: 'Carlos', preco: 340, comissao: 10 }
]
},
mensal: {
jose: { os: 9, total: 640 }, carlos: { os: 6, total: 410 },
detalhe: [
{ os: '#240', desc: 'Guincho talha elétrica — Fund. Arthur Bernardes', mec: 'José', preco: 465, comissao: 8 },
{ os: '#236', desc: 'Serra mármore — Samuel', mec: 'José', preco: 50, comissao: 2 },
{ os: '#229', desc: 'Talha elétrica — Marco Thulio', mec: 'José', preco: 280, comissao: 8 },
{ os: '#221', desc: 'Compactador de solo — Reginaldo', mec: 'Carlos', preco: 340, comissao: 10 }
]
}
};
function formatBRNum(n) {
return n.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
}
function aplicarDadosComissao(dados) {
if (!dados) return;
document.getElementById('jose-os-count').textContent = dados.jose.os + ' OS com comissão no período';
document.getElementById('jose-comissao-valor').textContent = 'R$ ' + formatBRNum(dados.jose.total);
document.getElementById('carlos-os-count').textContent = dados.carlos.os + ' OS com comissão no período';
document.getElementById('carlos-comissao-valor').textContent = 'R$ ' + formatBRNum(dados.carlos.total);
var tbody = document.getElementById('comissao-detalhe-tbody');
if (tbody && dados.detalhe) {
tbody.innerHTML = dados.detalhe.map(function(r) {
return '<tr><td>' + r.os + '</td><td>' + r.desc + '</td><td>' + r.mec + '</td><td class="num">' + r.preco + '</td><td class="num">' + r.comissao + '</td></tr>';
}).join('');
}
}
function setPeriodo(scope, periodo, item) {
var wrap = item.closest('.period-select');
wrap.querySelectorAll('.period-dropdown-item').forEach(b => b.classList.remove('active'));
item.classList.add('active');
var custom = document.getElementById('periodo-' + scope + '-custom');
if (custom) custom.style.display = 'none';
var dataLabel = periodoDatas[periodo];
var fullLabel = periodoNomes[periodo] + ' · ' + dataLabel;
var pillLabel = document.getElementById('periodo-' + scope + '-label');
if (pillLabel) pillLabel.textContent = fullLabel;
wrap.classList.remove('open');
if (scope === 'oficina') {
var d = periodoDadosOficina[periodo];
if (d) {
document.getElementById('of-num-aberto').textContent = d.aberto;
document.getElementById('of-num-andamento').textContent = d.andamento;
document.getElementById('of-num-peca').textContent = d.peca;
document.getElementById('of-num-finalizadas').textContent = d.finalizadas;
}
atualizarChartOSSemana(periodo);
}
if (scope === 'loja') {
var fat = document.getElementById('loja-fat-titulo');
if (fat && periodoDadosLoja[periodo]) fat.textContent = periodoDadosLoja[periodo];
atualizarChartLoja(periodo);
}
if (scope === 'comissao') {
aplicarDadosComissao(periodoDadosComissao[periodo] || periodoDadosComissao.mensal);
}
}
function closeModal(id) { document.getElementById(id).classList.remove('open'); }
var osData = {
aberto: { title: 'Em aberto', items: [
{ num:'#245', name:'Martelete Bosch', sub:'João Paulo · recebida hoje' },
{ num:'#246', name:'Esmerilhadeira 7"', sub:'Antonio Francisco · recebida hoje' },
{ num:'#247', name:'Serra circular', sub:'Lucas Andrade · recebida hoje' }
]},
andamento: { title: 'Em andamento', items: [
{ num:'#245', name:'Martelete Bosch', sub:'João Paulo · José' },
{ num:'#244', name:'Lavadora alta pressão', sub:'Maria A. Lopes · José' }
]},
peca: { title: 'Aguardando peça', items: [
{ num:'#241', name:'Betoneira 400L', sub:'Geraldo Eustáquio · José · 6 dias', late:true },
{ num:'#238', name:'Compressor de ar', sub:'Fazenda Dom Bosco · Carlos · 8 dias', late:true }
]},
prontas: { title: 'Finalizadas pela oficina (mês)', items: [
{ num:'#243', name:'Bomba submersível', sub:'Cond. Reserva Real · Carlos' },
{ num:'#240', name:'Guincho talha elétrica', sub:'Fund. Arthur Bernardes · José' }
]},
aguardando_cliente: { title: 'Pronto, aguardando cliente', items: [
{ num:'#236', name:'Serra mármore', sub:'Samuel · pronto há 1 dia · não pago, não retirado' },
{ num:'#234', name:'Esmerilhadeira', sub:'Antonio Francisco · pronto há 2 dias · não pago, não retirado' },
{ num:'#232', name:'Furadeira de impacto', sub:'Renata Costa · pronto hoje · não pago, não retirado' },
{ num:'#230', name:'Roçadeira', sub:'Pedro Henrique · pronto há 3 dias · não pago, não retirado' }
]},
pago_nao_retirado: { title: 'Pago, aguard. cliente', items: [
{ num:'#229', name:'Talha elétrica', sub:'Marco Thulio · pago há 2 dias, aguardando cliente buscar' }
]},
retirado_nao_pago: { title: 'Retirado, não pago', items: [
{ num:'#227', name:'Betoneira 150L', sub:'Helio Flavano · retirou há 4 dias, ainda não pagou', late:true },
{ num:'#224', name:'Gerador 3,5kva', sub:'Lucas Batista · retirou há 6 dias, ainda não pagou', late:true }
]},
concluida: { title: 'Concluídas (pago + retirado)', items: [
{ num:'#243', name:'Bomba submersível', sub:'Cond. Reserva Real · pago e retirado em 22/06' },
{ num:'#240', name:'Guincho talha elétrica', sub:'Fund. Arthur Bernardes · pago e retirado em 21/06' }
]},
recusadas_oficina: { title: 'Recusadas no período', items: [
{ num:'#233', name:'Furadeira de bancada', sub:'Weverton Alves · orçamento recusado, sem conserto' },
{ num:'#219', name:'Vibrador de imersão', sub:'Sítio Boa Vista · cliente preferiu comprar novo' }
]}
};
function openOSModal(type) {
var data = osData[type];
document.getElementById('modal-os-title').textContent = data.title;
document.getElementById('modal-os-sub').textContent = data.items.length + ' ordens de serviço';
var list = document.getElementById('modal-os-list');
list.innerHTML = '';
data.items.forEach(function(item) {
var row = document.createElement('div');
row.className = 'os-drill-row' + (item.late ? ' late' : '');
row.innerHTML = '<span class="os-drill-num">' + item.num + '</span><div style="flex:1;"><p class="os-drill-name">' + item.name + '</p><p class="os-drill-sub">' + item.sub + '</p></div>';
list.appendChild(row);
});
document.getElementById('modal-os').classList.add('open');
}
function openSingleOS() { document.getElementById('modal-single').classList.add('open'); }
function openFinalizadaDetail() { document.getElementById('modal-finalizada').classList.add('open'); }
var chartPecasInstance = null;
function abrirResumoInfo(titulo, sub, bodyHTML) {
document.getElementById('resumo-titulo').textContent = titulo;
document.getElementById('resumo-sub').textContent = sub;
document.getElementById('resumo-corpo').innerHTML = bodyHTML;
document.getElementById('modal-info-resumo').classList.add('open');
}
var pecasAgregadoDefault = {
stats: { lucro: 'R$ 1.260', abaixo: '3', vendidas: '42', lucroMedio: 'R$ 29,80' },
uso: { balcao: 34, os: 45, manutencao: 21 },
chart: { vendidas: [28, 31, 26, 35, 44, 42], lucro: [780, 860, 705, 990, 1340, 1260] }
};
var pecaDataset = {
'rolamento': {
stats: { lucro: 'R$ 660', abaixo: '1', vendidas: '22', lucroMedio: 'R$ 30,00' },
uso: { balcao: 40, os: 50, manutencao: 10 },
chart: { vendidas: [3, 4, 3, 4, 5, 3], lucro: [90, 120, 90, 120, 150, 90] }
},
'capacitor': {
stats: { lucro: 'R$ 180', abaixo: '1', vendidas: '9', lucroMedio: 'R$ 20,00' },
uso: { balcao: 20, os: 60, manutencao: 20 },
chart: { vendidas: [1, 2, 1, 2, 2, 1], lucro: [20, 40, 20, 40, 40, 20] }
},
'escova de carvão': {
stats: { lucro: 'R$ 60', abaixo: '1', vendidas: '6', lucroMedio: 'R$ 10,00' },
uso: { balcao: 10, os: 70, manutencao: 20 },
chart: { vendidas: [1, 1, 1, 1, 1, 1], lucro: [10, 10, 10, 10, 10, 10] }
},
'carvão serra mármore': {
stats: { lucro: 'R$ 90', abaixo: '0', vendidas: '5', lucroMedio: 'R$ 18,00' },
uso: { balcao: 60, os: 10, manutencao: 30 },
chart: { vendidas: [1, 0, 1, 1, 1, 1], lucro: [18, 0, 18, 18, 18, 18] }
}
};
var pecasStatCardEls = null;
function getPecasStatCardEls() {
if (!pecasStatCardEls) {
pecasStatCardEls = document.querySelectorAll('#tab-pecas-visaogeral .clickable-stat-row .clickable-stat');
}
return pecasStatCardEls;
}
function aplicarDadosPeca(dados, tituloPeca) {
var cards = getPecasStatCardEls();
if (cards && cards.length === 4) {
cards[0].querySelector('.num').textContent = dados.stats.lucro;
cards[1].querySelector('.num').textContent = dados.stats.abaixo;
cards[2].querySelector('.num').textContent = dados.stats.vendidas;
cards[3].querySelector('.num').textContent = dados.stats.lucroMedio;
}
var usoBar = document.querySelector('#tab-pecas-visaogeral .split-bar');
if (usoBar) {
var divs = usoBar.querySelectorAll('div');
divs[0].style.width = dados.uso.balcao + '%';
divs[1].style.width = dados.uso.os + '%';
divs[2].style.width = dados.uso.manutencao + '%';
var legend = usoBar.nextElementSibling;
if (legend && legend.classList.contains('legend-row')) {
var items = legend.querySelectorAll('.legend-item');
items[0].lastChild.textContent = 'Venda balcão ' + dados.uso.balcao + '%';
items[1].lastChild.textContent = 'OS de serviço ' + dados.uso.os + '%';
items[2].lastChild.textContent = 'Manutenção própria ' + dados.uso.manutencao + '%';
}
}
var panelTitle = document.querySelector('#tab-pecas-visaogeral .panel .panel-title');
if (panelTitle) { panelTitle.textContent = 'Uso do estoque' + (tituloPeca ? ' — ' + tituloPeca : ' de peças em junho'); }
if (chartPecasInstance) {
chartPecasInstance.data.datasets[0].data = dados.chart.vendidas;
chartPecasInstance.data.datasets[1].data = dados.chart.lucro;
chartPecasInstance.update();
}
}
function filterPecas() {
var qRaw = document.getElementById('pecas-search').value;
var q = qRaw.toLowerCase().trim();
document.querySelectorAll('#pecas-detalhe-table tbody tr').forEach(function(row) {
var name = row.getAttribute('data-search') || '';
row.style.display = (q === '' || name.includes(q)) ? '' : 'none';
});
if (q === '') {
aplicarDadosPeca(pecasAgregadoDefault, null);
return;
}
var match = null, matchNome = null;
Object.keys(pecaDataset).forEach(function(nome) {
if (nome.includes(q) || q.includes(nome)) { match = pecaDataset[nome]; matchNome = nome; }
});
if (match) {
aplicarDadosPeca(match, matchNome.charAt(0).toUpperCase() + matchNome.slice(1));
}
}
var fornecedorDetailData = {
rolamento: { titulo: 'Compra — Rolamento', fornecedor: 'DHT Importação', data: '08/06/2026', qtd: '20 un.', valorTotal: 'R$ 1.048,00', frete: 'R$ 40,00', unitario: 'R$ 54,40', nf: '37.901' },
capacitor: { titulo: 'Compra — Capacitor', fornecedor: 'Makita do Brasil', data: '25/05/2026', qtd: '10 un.', valorTotal: 'R$ 440,00', frete: 'R$ 9,00', unitario: 'R$ 44,90', nf: '340.787' },
escova: { titulo: 'Compra — Escova de carvão', fornecedor: 'DHT Importação', data: '02/06/2026', qtd: '30 un.', valorTotal: 'R$ 555,00', frete: 'R$ 18,00', unitario: 'R$ 19,10', nf: '37.735' }
};
function openFornecedorDetail(key) {
var d = fornecedorDetailData[key];
if (!d) return;
document.getElementById('fd-titulo').textContent = d.titulo;
document.getElementById('fd-sub').textContent = 'NF ' + d.nf;
document.getElementById('fd-fornecedor').textContent = d.fornecedor;
document.getElementById('fd-data').textContent = d.data;
document.getElementById('fd-qtd').textContent = d.qtd;
document.getElementById('fd-valor-total').textContent = d.valorTotal;
document.getElementById('fd-frete').textContent = d.frete;
document.getElementById('fd-unitario').textContent = d.unitario;
document.getElementById('fd-nf').textContent = d.nf;
document.getElementById('modal-fornecedor-detail').classList.add('open');
}
function filterEstoquePecasLateral() {
var q = document.getElementById('pp-estoque-busca').value.toLowerCase().trim();
document.querySelectorAll('#pp-estoque-lateral-list .stock-row').forEach(function(row) {
var name = row.getAttribute('data-search') || row.textContent.toLowerCase();
row.style.display = (q === '' || name.toLowerCase().includes(q)) ? 'flex' : 'none';
});
}
function atualizarResumoEstoqueAtual() {
var rows = document.querySelectorAll('#estoque-atual tbody tr');
var valorParadoTotal = 0, maiorValorParadoNome = '—', maiorValorParado = 0;
var maiorQtdNome = '—', maiorQtd = -1;
rows.forEach(function(row) {
var nome = row.children[0].textContent.trim();
var qtd = parseInt(row.children[2].textContent.replace(/\./g, ''), 10) || 0;
var valor = parseFloat(row.children[4].textContent.replace(/\./g, '').replace(',', '.')) || 0;
var parada = row.getAttribute('data-parada') === '1';
if (parada) {
valorParadoTotal += valor;
if (valor > maiorValorParado) { maiorValorParado = valor; maiorValorParadoNome = nome; }
}
if (qtd > maiorQtd) { maiorQtd = qtd; maiorQtdNome = nome; }
});
var wrap = document.getElementById('estoque-atual-resumo');
if (!wrap) return;
wrap.innerHTML =
'<div class="clickable-stat warn"><p class="num">R$ ' + valorParadoTotal.toLocaleString('pt-BR', {minimumFractionDigits:2, maximumFractionDigits:2}) + '</p><p class="lbl">valor parado em estoque</p></div>' +
'<div class="clickable-stat danger"><p class="num" style="font-size:18px;">' + maiorValorParadoNome + '</p><p class="lbl">maior valor parado (R$ ' + maiorValorParado.toLocaleString('pt-BR', {minimumFractionDigits:2, maximumFractionDigits:2}) + ')</p></div>' +
'<div class="clickable-stat info"><p class="num" style="font-size:18px;">' + maiorQtdNome + '</p><p class="lbl">maior quantidade disponível (' + maiorQtd + ' un.)</p></div>';
}
function setEstoqueTab(btn, tab) {
document.querySelectorAll('#tab-pecas-estoque .tab-btn').forEach(b => b.classList.remove('active'));
btn.classList.add('active');
document.getElementById('estoque-preditivo').style.display = (tab === 'preditivo') ? 'block' : 'none';
document.getElementById('estoque-atual').style.display = (tab === 'atual') ? 'block' : 'none';
document.getElementById('estoque-fornecedores').style.display = (tab === 'fornecedores') ? 'block' : 'none';
if (tab === 'atual') { atualizarResumoEstoqueAtual(); }
filterEstoqueTabs();
}
function filterEstoqueTabs() {
var q = document.getElementById('estoque-search').value.toLowerCase().trim();
document.querySelectorAll('#estoque-preditivo .stock-row, #estoque-atual tbody tr, #estoque-fornecedores tbody tr').forEach(function(row) {
var name = row.getAttribute('data-search') || row.textContent.toLowerCase();
row.style.display = (q === '' || name.toLowerCase().includes(q)) ? '' : 'none';
});
}
function editLocalizador(chip) {
if (chip.querySelector('input')) return;
var current = chip.textContent.trim() === 'definir' ? '' : chip.textContent.trim();
var input = document.createElement('input');
input.type = 'text';
input.value = current;
input.className = 'loc-chip-input';
chip.replaceWith(input);
input.focus();
input.select();
function commit() {
var val = input.value.trim();
var newChip = document.createElement('span');
newChip.onclick = function(e) { e.stopPropagation(); editLocalizador(newChip); };
if (val === '') {
newChip.className = 'loc-chip empty';
newChip.innerHTML = '<i class="ti ti-map-pin-off"></i>definir';
} else {
newChip.className = 'loc-chip';
newChip.innerHTML = '<i class="ti ti-map-pin"></i>' + val;
}
input.replaceWith(newChip);
}
input.addEventListener('blur', commit);
input.addEventListener('keydown', function(e) { if (e.key === 'Enter') commit(); });
}
function recalcCompra() {
var qtd = parseFloat(document.getElementById('compra-qtd').value) || 0;
var valorTotal = parseFloat(document.getElementById('compra-valor').value) || 0;
var frete = parseFloat(document.getElementById('compra-frete').value) || 0;
var custosAntigos = { 'rolamento': { custo: 54.80, qtd: 22 }, 'capacitor': { custo: 42.00, qtd: 8 }, 'escova de carvão': { custo: 18.50, qtd: 3 }, 'carvão serra mármore': { custo: 9.20, qtd: 14 } };
var pecaNome = (document.getElementById('compra-peca').value || '').toLowerCase().trim();
var anterior = custosAntigos[pecaNome] || { custo: 0, qtd: 0 };
var totalGeral = valorTotal + frete;
var custoUnitNovo = qtd > 0 ? totalGeral / qtd : 0;
var qtdFinal = anterior.qtd + qtd;
var novoCusto = qtdFinal > 0 ? ((anterior.qtd * anterior.custo) + (qtd * custoUnitNovo)) / qtdFinal : 0;
document.getElementById('compra-total-geral').textContent = 'R$ ' + totalGeral.toFixed(2).replace('.', ',');
document.getElementById('compra-custo-anterior').textContent = 'R$ ' + anterior.custo.toFixed(2).replace('.', ',') + ' (' + anterior.qtd + ' un.)';
document.getElementById('compra-novo-custo').textContent = 'R$ ' + novoCusto.toFixed(2).replace('.', ',');
document.getElementById('compra-explicacao').textContent =
'Cálculo: ((' + anterior.qtd + ' un. × R$ ' + anterior.custo.toFixed(2).replace('.', ',') + ') + (' + qtd + ' un. × R$ ' + custoUnitNovo.toFixed(2).replace('.', ',') + ')) ÷ ' + qtdFinal + ' un. = R$ ' + novoCusto.toFixed(2).replace('.', ',') + '. O custo de R$ ' + custoUnitNovo.toFixed(2).replace('.', ',') + ' por unidade já inclui o frete rateado (R$ ' + totalGeral.toFixed(2).replace('.', ',') + ' ÷ ' + qtd + ' un.).';
}
function sendPriceToMeire() {
document.getElementById('calc-sent-note') && (document.getElementById('calc-sent-note').style.display = 'block');
document.getElementById('ps-calc-detail').style.display = 'none';
}
// ===== Precificação Peças =====
var ppDados = {
'rolamento': { custo: 54.80, ultimaVenda: 95.00 },
'capacitor': { custo: 42.00, ultimaVenda: 78.00 },
'escova de carvão': { custo: 18.50, ultimaVenda: 35.00 },
'carvão serra mármore': { custo: 9.20, ultimaVenda: 22.00 }
};
var ppPecaAtual = 'rolamento';
function filterPPPeca() {
var q = document.getElementById('pp-peca-search').value.toLowerCase().trim();
var box = document.getElementById('pp-peca-results');
box.innerHTML = '';
var matches = Object.keys(ppDados).filter(function(nome) { return nome.includes(q); });
box.classList.toggle('empty', matches.length === 0);
matches.forEach(function(nome) {
var item = document.createElement('div');
item.className = 'os-search-item';
item.innerHTML = '<span class="name">' + nome.charAt(0).toUpperCase() + nome.slice(1) + '</span>';
item.onclick = function() {
document.getElementById('pp-peca-search').value = nome.charAt(0).toUpperCase() + nome.slice(1);
ppPecaAtual = nome;
box.innerHTML = '';
box.classList.add('empty');
carregarPPPeca();
};
box.appendChild(item);
});
}
function carregarPPPeca() {
var dados = ppDados[ppPecaAtual] || { custo: 0, ultimaVenda: 0 };
document.getElementById('pp-custo').textContent = 'R$ ' + dados.custo.toFixed(2).replace('.', ',');
document.getElementById('pp-ultima-venda').textContent = 'R$ ' + dados.ultimaVenda.toFixed(2).replace('.', ',');
var margemUltima = dados.custo > 0 ? ((dados.ultimaVenda - dados.custo) / dados.custo) * 100 : 0;
document.getElementById('pp-margem-ultima').textContent = Math.round(margemUltima) + '%';
recalcPP();
}
function selecionarPecaDoEstoque(nome) {
if (!ppDados[nome]) return;
ppPecaAtual = nome;
document.getElementById('pp-peca-search').value = nome.charAt(0).toUpperCase() + nome.slice(1);
var box = document.getElementById('pp-peca-results');
box.innerHTML = '';
box.classList.add('empty');
carregarPPPeca();
}
function recalcPP() {
var dados = ppDados[ppPecaAtual] || { custo: 0, ultimaVenda: 0 };
var preco = parseFloat(document.getElementById('pp-preco').value) || 0;
var impostoPerc = parseFloat(document.getElementById('pp-imposto').value) || 0;
var imposto = preco * (impostoPerc / 100);
var lucro = preco - dados.custo - imposto;
var margemAtual = dados.custo > 0 ? ((preco - dados.custo) / dados.custo) * 100 : 0;
document.getElementById('pp-explicacao').innerHTML =
'Custo <b>R$ ' + dados.custo.toFixed(2).replace('.', ',') + '</b> <i class="ti ti-arrow-right"></i> cobra <b>R$ ' + preco.toFixed(2).replace('.', ',') + '</b> <i class="ti ti-arrow-right"></i> imposto <b class="neg">R$ ' + imposto.toFixed(2).replace('.', ',') + '</b> <i class="ti ti-arrow-right"></i> <b class="pos">ganha R$ ' + lucro.toFixed(2).replace('.', ',') + '</b>';
document.getElementById('pp-margem-atual').textContent = Math.round(margemAtual) + '%';
document.getElementById('pp-resumo-custo').textContent = 'R$ ' + dados.custo.toFixed(2).replace('.', ',');
document.getElementById('pp-resumo-imposto').textContent = '- R$ ' + imposto.toFixed(2).replace('.', ',');
document.getElementById('pp-resumo-lucro').textContent = 'R$ ' + lucro.toFixed(2).replace('.', ',');
document.getElementById('pp-comparativo').innerHTML = 'Comparado à última venda: <b style="color:var(--text-main);">R$ ' + preco.toFixed(2).replace('.', ',') + ' vs. R$ ' + dados.ultimaVenda.toFixed(2).replace('.', ',') + '</b>';
}
function usarPrecoPeca() {
var preco = document.getElementById('pp-preco').value;
alert('Novo preço de venda definido: R$ ' + preco);
}
// ===== Precificação Serviço =====
function setPSTab(btn, tab) {
document.querySelectorAll('#view-oficina .ps-tab-btn').forEach(function(b) { b.classList.remove('active'); });
btn.classList.add('active');
document.querySelectorAll('#view-oficina .ps-tab-badge').forEach(function(b) { b.classList.remove('active', 'danger'); });
var badge = document.getElementById('ps-badge-' + tab);
if (badge) { badge.classList.add(tab === 'pendentes' ? 'danger' : 'active'); }
document.getElementById('ps-tab-precificar').style.display = (tab === 'precificar') ? 'block' : 'none';
document.getElementById('ps-tab-recusadas').style.display = (tab === 'recusadas') ? 'block' : 'none';
document.getElementById('ps-tab-pagas').style.display = (tab === 'pagas') ? 'block' : 'none';
document.getElementById('ps-tab-pendentes').style.display = (tab === 'pendentes') ? 'block' : 'none';
document.getElementById('ps-calc-detail').style.display = 'none';
}
var psOSData = {
'245': { titulo: 'OS #245 — Martelete Bosch', sub: 'João Paulo · recebida hoje' },
'241': { titulo: 'OS #241 — Betoneira 400L', sub: 'Geraldo Eustáquio · aguard. peça há 6 dias' },
'246': { titulo: 'OS #246 — Esmerilhadeira 7"', sub: 'Antonio Francisco · recebida hoje' }
};
function openPSCalc(num) {
var dados = psOSData[num] || { titulo: 'OS #' + num, sub: '' };
document.getElementById('ps-calc-title').textContent = dados.titulo;
document.getElementById('ps-calc-sub').textContent = dados.sub;
document.getElementById('ps-tab-precificar').style.display = 'none';
document.getElementById('ps-calc-detail').style.display = 'block';
recalcPS();
}
function closePSCalc() {
document.getElementById('ps-calc-detail').style.display = 'none';
document.getElementById('ps-tab-precificar').style.display = 'block';
}
function filterPSPeca() {
var q = document.getElementById('ps-peca-search').value.toLowerCase().trim();
var box = document.getElementById('ps-peca-results');
box.innerHTML = '';
if (q === '') { box.classList.add('empty'); return; }
var matches = Object.keys(ppDados).filter(function(nome) { return nome.includes(q); });
box.classList.toggle('empty', matches.length === 0);
matches.forEach(function(nome) {
var item = document.createElement('div');
item.className = 'os-search-item';
var custo = ppDados[nome].custo;
item.innerHTML = '<span class="name">' + nome.charAt(0).toUpperCase() + nome.slice(1) + '</span><span class="tag done">R$ ' + custo.toFixed(2).replace('.', ',') + '</span>';
item.onclick = function() {
document.getElementById('ps-peca-search').value = nome.charAt(0).toUpperCase() + nome.slice(1);
box.innerHTML = '';
box.classList.add('empty');
};
box.appendChild(item);
});
}
function adicionarPSPeca() {
var nomeInput = document.getElementById('ps-peca-search');
var nome = nomeInput.value.trim();
var qtd = parseFloat(document.getElementById('ps-peca-qtd').value) || 1;
if (!nome) { nomeInput.focus(); return; }
var nomeKey = nome.toLowerCase();
var custoUnit;
var isNova = false;
if (ppDados[nomeKey]) {
custoUnit = ppDados[nomeKey].custo;
} else {
var manual = prompt('Peça nova, fora do estoque. Qual o custo unitário (R$)?');
custoUnit = parseFloat((manual || '0').replace(',', '.')) || 0;
isNova = true;
}
var custoTotal = custoUnit * qtd;
var row = document.createElement('div');
row.className = 'ledger-row';
row.setAttribute('data-custo', custoTotal.toFixed(2));
row.innerHTML =
'<div class="ledger-icon in"><i class="ti ti-' + (isNova ? 'pencil' : 'circle-dot') + '"></i></div>' +
'<div style="flex:1;"><p class="ledger-name">' + nome + (isNova ? ' (nova, fora do estoque)' : '') + '</p><p class="ledger-sub">' + qtd + ' un. × R$ ' + custoUnit.toFixed(2).replace('.', ',') + '</p></div>' +
'<span class="ledger-val in">R$ ' + custoTotal.toFixed(2).replace('.', ',') + '</span>' +
'<button class="ledger-remove" onclick="this.closest(\'.ledger-row\').remove(); recalcPS();"><i class="ti ti-x"></i></button>';
document.getElementById('ps-pecas-list').appendChild(row);
nomeInput.value = '';
document.getElementById('ps-peca-qtd').value = '1';
document.getElementById('ps-peca-results').innerHTML = '';
document.getElementById('ps-peca-results').classList.add('empty');
recalcPS();
}
var psMecanicoRH = 26.80;
function recalcPS() {
var tempoStr = (document.getElementById('ps-tempo').value || '0').replace('h', '').trim();
var tempo = parseFloat(tempoStr) || 0;
var custoMaoDeObra = tempo * psMecanicoRH;
var totalPecas = 0;
document.querySelectorAll('#ps-pecas-list .ledger-row').forEach(function(row) {
totalPecas += parseFloat(row.getAttribute('data-custo')) || 0;
});
var custoTotal = totalPecas + custoMaoDeObra;
var preco = parseFloat(document.getElementById('ps-preco').value) || 0;
var impostoPerc = parseFloat(document.getElementById('ps-imposto').value) || 0;
var imposto = preco * (impostoPerc / 100);
var margem = preco - custoTotal - imposto;
var margemPerc = preco > 0 ? (margem / preco) * 100 : 0;
document.getElementById('ps-mo-detalhe').innerHTML = 'R$ ' + psMecanicoRH.toFixed(2).replace('.', ',') + '/h (média mecânicos) × ' + tempo + 'h = <b>R$ ' + custoMaoDeObra.toFixed(2).replace('.', ',') + '</b>';
document.getElementById('ps-total-pecas').textContent = 'R$ ' + totalPecas.toFixed(2).replace('.', ',');
document.getElementById('ps-custo-total').textContent = 'R$ ' + custoTotal.toFixed(2).replace('.', ',');
document.getElementById('ps-explicacao').innerHTML =
'Custo total: <b style="color:var(--text-main);">R$ ' + custoTotal.toFixed(2).replace('.', ',') + '</b> → Você cobra: <b style="color:var(--text-main);">R$ ' + preco.toFixed(2).replace('.', ',') + '</b> → Imposto (' + impostoPerc + '%): <b style="color:var(--red);">R$ ' + imposto.toFixed(2).replace('.', ',') + '</b> → <b style="color:var(--good);">Você ganha: R$ ' + margem.toFixed(2).replace('.', ',') + '</b>';
document.getElementById('ps-resumo-pecas').textContent = 'R$ ' + totalPecas.toFixed(2).replace('.', ',');
document.getElementById('ps-resumo-mo').textContent = 'R$ ' + custoMaoDeObra.toFixed(2).replace('.', ',');
document.getElementById('ps-resumo-imposto').textContent = '- R$ ' + imposto.toFixed(2).replace('.', ',');
document.getElementById('ps-resumo-margem').textContent = 'R$ ' + margem.toFixed(2).replace('.', ',') + ' (' + Math.round(margemPerc) + '%)';
}
// ===== Folha de Pagamento: bonificação =====
function openBonificacaoModal(nome) {
document.getElementById('bonificacao-nome').textContent = nome;
document.getElementById('modal-bonificacao').classList.add('open');
}
// ===== Gestão Equipe =====
var EQUIPE_HOJE = new Date(); // data real de hoje
var EQUIPE_MES_REF = '2026-06';
var equipeFuncionarios = [
{ nome: 'José', cargo: 'Mecânico', admissao: '2022-03-14', demissao: null, salario: 3000, cargaHoraria: 220 },
{ nome: 'Carlos', cargo: 'Mecânico', admissao: '2023-07-01', demissao: null, salario: 3200, cargaHoraria: 220 },
{ nome: 'Meire', cargo: 'Recepção', admissao: '2021-01-10', demissao: null, salario: 2200, cargaHoraria: 220 },
{ nome: 'Lucilene', cargo: 'Financeiro', admissao: '2015-01-01', demissao: null, salario: 2800, cargaHoraria: 220 },
{ nome: 'Marcelo', cargo: 'Sócio-gestor', admissao: '2015-01-01', demissao: null, salario: 2000, cargaHoraria: 220 }
];
var equipeFerias = [
{ funcionario: 'José', inicio: '2026-08-10', fim: '2026-09-08', status: 'planejada' },
{ funcionario: 'Meire', inicio: '2025-11-03', fim: '2025-12-02', status: 'gozada' }
];
var equipeAbonos = [
{ funcionario: 'José', tipo: 'Atraso', data: '2026-06-20', horas: 0.5, motivo: 'trânsito', desconta: true, anexado: false },
{ funcionario: 'Carlos', tipo: 'Atestado médico', data: '2026-06-15', horas: 8, motivo: 'consulta odontológica', desconta: false, anexado: true }
];
var equipeBonificacoes = [
{ funcionario: 'José', data: '2026-05-15', valor: 300, motivo: 'meta de produtividade' },
{ funcionario: 'Meire', data: '2025-12-20', valor: 1100, motivo: '13º proporcional' }
];
var equipeVales = [
{ funcionario: 'José', data: '2026-06-05', valor: 400, motivo: 'adiantamento' }
];
var EQUIPE_COMISSAO_MAP = { 'José': 'jose', 'Carlos': 'carlos' };
var EQUIPE_ROTATIVIDADE_MES_PASSADO = 4.5; // referência ilustrativa do mês anterior (maio/2026)
// Rotatividade = desligamentos no mês / equipe no início do mês, em %
function equipeTaxaRotatividade(mesRef) {
mesRef = mesRef || EQUIPE_MES_REF;
var noInicioDoMes = equipeFuncionarios.filter(function (f) { return f.admissao.slice(0, 7) <= mesRef; }).length;
var desligadosNoMes = equipeFuncionarios.filter(function (f) { return f.demissao && f.demissao.slice(0, 7) === mesRef; }).length;
return noInicioDoMes > 0 ? (desligadosNoMes / noInicioDoMes) * 100 : 0;
}
function fmtDataBR(iso) {
var p = iso.split('-');
return p[2] + '/' + p[1] + '/' + p[0];
}
function fmtMesAnoBR(iso) {
var meses = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'];
var p = iso.split('-');
return meses[parseInt(p[1], 10) - 1] + '/' + p[0];
}
function diasEntre(ini, fim) {
var d1 = new Date(ini + 'T00:00:00'), d2 = new Date(fim + 'T00:00:00');
return Math.round((d2 - d1) / 86400000) + 1;
}
function equipeTempoDeCasa(admissaoStr, demissaoStr) {
var a = new Date(admissaoStr + 'T00:00:00');
var ate = demissaoStr ? new Date(demissaoStr + 'T00:00:00') : EQUIPE_HOJE;
var meses = (ate.getFullYear() - a.getFullYear()) * 12 + (ate.getMonth() - a.getMonth());
if (ate.getDate() < a.getDate()) meses--;
if (meses < 0) meses = 0;
var anos = Math.floor(meses / 12), restoMeses = meses % 12;
if (anos === 0) return restoMeses + (restoMeses === 1 ? ' mês' : ' meses');
return anos + (anos === 1 ? ' ano' : ' anos') + (restoMeses > 0 ? ' e ' + restoMeses + (restoMeses === 1 ? ' mês' : ' meses') : '');
}
function equipeRhHora(f) {
var carga = f.cargaHoraria || 220;
return carga > 0 ? f.salario / carga : 0;
}
function equipeHorasDescontadasNoMes(nome, mesRef) {
mesRef = mesRef || EQUIPE_MES_REF;
return equipeAbonos.filter(function (a) { return a.funcionario === nome && a.data.slice(0, 7) === mesRef && a.desconta; })
.reduce(function (s, a) { return s + (a.horas || 8); }, 0);
}
function equipeHorasEfetivasNoMes(f, mesRef) {
var carga = f.cargaHoraria || 220;
return Math.max(carga - equipeHorasDescontadasNoMes(f.nome, mesRef), 0);
}
function equipeSomaMes(lista, nome, mesRef) {
mesRef = mesRef || EQUIPE_MES_REF;
return lista.filter(function (item) { return item.funcionario === nome && item.data.slice(0, 7) === mesRef; })
.reduce(function (s, item) { return s + item.valor; }, 0);
}
function equipeFeriasRegistro(nome, mesRef) {
mesRef = mesRef || EQUIPE_MES_REF;
return equipeFerias.find(function (fe) { return fe.funcionario === nome && fe.inicio.slice(0, 7) <= mesRef && fe.fim.slice(0, 7) >= mesRef; });
}
// Comissões vêm direto da Oficina (aba "Comissão por mecânico"), sem lançamento manual aqui.
function equipeComissaoNoMes(nome, mesRef) {
mesRef = mesRef || EQUIPE_MES_REF;
if (mesRef !== EQUIPE_MES_REF) return 0; // só temos o detalhe de OS pro mês corrente neste protótipo
var chave = EQUIPE_COMISSAO_MAP[nome];
if (!chave || !periodoDadosComissao.mensal[chave]) return 0;
return periodoDadosComissao.mensal[chave].total;
}
function popularSelectsEquipe() {
var ativos = equipeFuncionarios.filter(function (f) { return !f.demissao; });
var optionsHtml = ativos.map(function (f) { return '<option value="' + f.nome + '">' + f.nome + '</option>'; }).join('');
document.querySelectorAll('.emp-select-equipe').forEach(function (sel) {
var atual = sel.value;
sel.innerHTML = optionsHtml;
if (atual && ativos.some(function (f) { return f.nome === atual; })) sel.value = atual;
});
}
function addFuncionarioEquipe() {
var nome = document.getElementById('eqNome').value.trim();
var cargo = document.getElementById('eqCargo').value.trim();
var admissao = document.getElementById('eqAdmissao').value;
var salario = parseFloat(document.getElementById('eqSalario').value) || 0;
var cargaHoraria = parseFloat(document.getElementById('eqCargaHoraria').value) || 220;
if (!nome || !cargo || !admissao) { document.getElementById('eqNome').focus(); return; }
equipeFuncionarios.push({ nome: nome, cargo: cargo, admissao: admissao, demissao: null, salario: salario, cargaHoraria: cargaHoraria });
document.getElementById('eqNome').value = '';
document.getElementById('eqCargo').value = '';
document.getElementById('eqAdmissao').value = '';
document.getElementById('eqSalario').value = '';
document.getElementById('eqCargaHoraria').value = '';
popularSelectsEquipe();
renderResumoEquipeTabela();
renderKpisEquipe();
}
function desligarFuncionario(nome) {
fecharDropdownsEquipe();
var entrada = prompt('Data de desligamento de ' + nome + ' (dd/mm/aaaa):');
if (!entrada) return;
var partes = entrada.split('/');
if (partes.length !== 3 || partes[0].length > 2 || partes[1].length > 2 || partes[2].length !== 4) {
alert('Data inválida. Use o formato dd/mm/aaaa.');
return;
}
var iso = partes[2] + '-' + partes[1].padStart(2, '0') + '-' + partes[0].padStart(2, '0');
var func = equipeFuncionarios.find(function (f) { return f.nome === nome; });
if (func) func.demissao = iso;
popularSelectsEquipe();
renderResumoEquipeTabela();
renderKpisEquipe();
}
function reativarFuncionario(nome) {
var func = equipeFuncionarios.find(function (f) { return f.nome === nome; });
if (func) func.demissao = null;
popularSelectsEquipe();
renderResumoEquipeTabela();
renderKpisEquipe();
}
function marcarFeriasGozada(nome) {
var fe = equipeFeriasRegistro(nome);
if (fe) fe.status = 'gozada';
renderResumoEquipeTabela();
}
// ===== dropdown "+" por linha =====
function slugifyEquipe(nome) {
return nome.normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/[^a-zA-Z0-9]/g, '');
}
function fecharDropdownsEquipe() {
document.querySelectorAll('.eq-dropdown.open').forEach(function (d) { d.classList.remove('open'); });
}
function toggleEqDropdown(ev, nome) {
ev.stopPropagation();
var id = 'eq-dd-' + slugifyEquipe(nome);
var alvo = document.getElementById(id);
var jaAberto = alvo && alvo.classList.contains('open');
fecharDropdownsEquipe();
if (alvo && !jaAberto) alvo.classList.add('open');
}
document.addEventListener('click', fecharDropdownsEquipe);
// ===== modais de lançamento rápido por linha =====
function abrirModalEquipe(tipo, nome) {
fecharDropdownsEquipe();
if (tipo === 'bonificacao') {
document.getElementById('eqbn-nome').textContent = nome;
document.getElementById('eqbnValor').value = '';
document.getElementById('eqbnMotivo').value = '';
document.getElementById('modal-eq-bonificacao').classList.add('open');
document.getElementById('modal-eq-bonificacao').dataset.nome = nome;
} else if (tipo === 'ferias') {
document.getElementById('eqfv-nome').textContent = nome;
document.getElementById('eqfvInicio').value = '';
document.getElementById('eqfvFim').value = '';
document.getElementById('modal-eq-ferias').classList.add('open');
document.getElementById('modal-eq-ferias').dataset.nome = nome;
} else if (tipo === 'vale') {
document.getElementById('eqvl-nome').textContent = nome;
document.getElementById('eqvlData').value = '';
document.getElementById('eqvlValor').value = '';
document.getElementById('eqvlMotivo').value = '';
document.getElementById('modal-eq-vale').classList.add('open');
document.getElementById('modal-eq-vale').dataset.nome = nome;
}
}
function salvarBonificacaoEquipe() {
var nome = document.getElementById('modal-eq-bonificacao').dataset.nome;
var valor = parseFloat(document.getElementById('eqbnValor').value) || 0;
var mes = document.getElementById('eqbnMes').value || EQUIPE_MES_REF;
var motivo = document.getElementById('eqbnMotivo').value.trim();
if (!nome || valor <= 0) return;
equipeBonificacoes.push({ funcionario: nome, data: mes + '-01', valor: valor, motivo: motivo || '-' });
closeModal('modal-eq-bonificacao');
renderResumoEquipeTabela();
}
function salvarFeriasEquipe() {
var nome = document.getElementById('modal-eq-ferias').dataset.nome;
var inicio = document.getElementById('eqfvInicio').value;
var fim = document.getElementById('eqfvFim').value;
if (!nome || !inicio || !fim) return;
equipeFerias.push({ funcionario: nome, inicio: inicio, fim: fim, status: 'planejada' });
closeModal('modal-eq-ferias');
renderResumoEquipeTabela();
}
function salvarValeEquipe() {
var nome = document.getElementById('modal-eq-vale').dataset.nome;
var data = document.getElementById('eqvlData').value;
var valor = parseFloat(document.getElementById('eqvlValor').value) || 0;
var motivo = document.getElementById('eqvlMotivo').value.trim();
if (!nome || !data || valor <= 0) { alert('Preencha a data e o valor do vale.'); return; }
// abre a janela de impressão já na hora do clique, antes de qualquer outra coisa —
// isso evita que o navegador bloqueie o pop-up por não achar que veio direto do clique.
var janelaImpressao = window.open('', '_blank');
equipeVales.push({ funcionario: nome, data: data, valor: valor, motivo: motivo || '-' });
closeModal('modal-eq-vale');
renderResumoEquipeTabela();
var func = equipeFuncionarios.find(function (f) { return f.nome === nome; });
if (!janelaImpressao) {
alert('O vale foi registrado, mas o navegador bloqueou a janela de impressão do comprovante.\n\nProcure o aviso de "pop-up bloqueado" perto da barra de endereço, clique nele e escolha "Sempre permitir".');
return;
}
imprimirComprovanteVale(janelaImpressao, { nome: nome, cargo: func ? func.cargo : '-', data: data, valor: valor, motivo: motivo || '-' });
}
function imprimirComprovanteVale(win, dados) {
var via = function (titulo) {
return '<div class="via">' +
'<div class="via-head"><span class="via-empresa">Aluguemaq</span><span class="via-tag">' + titulo + '</span></div>' +
'<h2>Comprovante de Vale / Adiantamento</h2>' +
'<table class="via-table">' +
'<tr><td>Funcionário</td><td>' + dados.nome + '</td></tr>' +
'<tr><td>Cargo</td><td>' + dados.cargo + '</td></tr>' +
'<tr><td>Data</td><td>' + fmtDataBR(dados.data) + '</td></tr>' +
'<tr><td>Valor</td><td>R$ ' + dados.valor.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + '</td></tr>' +
'<tr><td>Motivo</td><td>' + dados.motivo + '</td></tr>' +
'</table>' +
'<p class="via-declar">Declaro ter recebido, nesta data, o valor acima referente a vale/adiantamento salarial, a ser descontado conforme acordado com a empresa.</p>' +
'<div class="via-sign"><div class="linha"></div><p>Assinatura do funcionário</p></div>' +
'<div class="via-sign"><div class="linha"></div><p>Assinatura do responsável — Aluguemaq</p></div>' +
'</div>';
};
var html = '<html><head><title>Comprovante de Vale - ' + dados.nome + '</title><meta charset="utf-8"><style>' +
'body{font-family:Georgia,"Times New Roman",serif; padding:22px; color:#2b2620; background:#fff;} ' +
'.via{border:1.5px dashed #c9822a; border-radius:12px; padding:22px 26px; margin-bottom:22px;} ' +
'.via-head{display:flex; align-items:center; justify-content:space-between; margin-bottom:6px;} ' +
'.via-empresa{font-weight:700; font-size:13px; letter-spacing:0.04em;} ' +
'.via-tag{font-size:10.5px; text-transform:uppercase; letter-spacing:0.06em; color:#8a8172;} ' +
'h2{font-size:16px; margin:0 0 16px;} ' +
'.via-table{width:100%; border-collapse:collapse; margin-bottom:16px;} ' +
'.via-table td{padding:7px 4px; border-bottom:1px solid #eee; font-size:13px;} ' +
'.via-table td:first-child{color:#8a8172; width:150px;} ' +
'.via-declar{font-size:11.5px; color:#555; margin-bottom:30px; line-height:1.5;} ' +
'.via-sign{margin-bottom:18px;} .linha{border-bottom:1px solid #333; width:75%; margin-bottom:5px;} .via-sign p{font-size:11px; color:#8a8172; margin:0;} ' +
'@media print { body{padding:0;} .via{page-break-inside:avoid;} }' +
'</style></head><body>' +
via('Via 1 — Empresa') + via('Via 2 — Funcionário') +
'<script>window.onload = function(){ setTimeout(function(){ window.print(); }, 200); };<' + '/script>' +
'</body></html>';
if (!win) {
alert('O navegador bloqueou a janela de impressão. O vale já foi lançado normalmente — libere pop-ups pra este site e tente lançar de novo se quiser o comprovante.');
return;
}
win.document.open();
win.document.write(html);
win.document.close();
}
var ICON_PLUS = '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14M5 12h14"/></svg>';
var ICON_X = '<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18M6 6l12 12"/></svg>';
var ICON_GIFT = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="8" width="18" height="4" rx="1"/><path d="M12 8v13M19 12v6.4a1.6 1.6 0 0 1-1.6 1.6H6.6A1.6 1.6 0 0 1 5 18.4V12"/><path d="M7.5 8a2.5 2.5 0 1 1 0-5C10.5 3 12 8 12 8s1.5-5 4.5-5a2.5 2.5 0 1 1 0 5"/></svg>';
var ICON_PLANE = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M16 10h4.5a1.8 1.8 0 0 1 0 3.6H16l-4 6.9h-2.4l1.6-6.9H7.5l-1.8 2.1H3.2l1.3-3.6-1.3-3.6h2.5L7.5 10h3.7L9.6 3.1H12L16 10Z"/></svg>';
var ICON_CASH = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="6.5" width="19" height="11" rx="2"/><circle cx="12" cy="12" r="2.3"/><path d="M6.5 9v0M17.5 15v0"/></svg>';
var ICON_REDO = '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round"><path d="M20 11a8 8 0 1 0-2.2 6.9"/><path d="M20 5v6h-6"/></svg>';
var ICON_PAPERCLIP = '<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.44 11.05 12.25 20.24a5.5 5.5 0 0 1-7.78-7.78l9.19-9.19a3.5 3.5 0 0 1 4.95 4.95L9.41 17.4a1.5 1.5 0 0 1-2.12-2.12l8.49-8.49"/></svg>';
function equipeIniciais(nome) {
var partes = nome.trim().split(/\s+/);
if (partes.length === 1) return partes[0].slice(0, 2).toUpperCase();
return (partes[0][0] + partes[partes.length - 1][0]).toUpperCase();
}
function renderResumoEquipeTabela() {
var tbl = document.getElementById('eq-tbl-resumo');
if (!tbl) return;
var ordenado = equipeFuncionarios.slice().sort(function (a, b) {
if (!!a.demissao !== !!b.demissao) return a.demissao ? 1 : -1;
return a.nome.localeCompare(b.nome);
});
tbl.innerHTML = ordenado.map(function (f) {
var slug = slugifyEquipe(f.nome);
var rh = equipeRhHora(f);
var comissoes = equipeComissaoNoMes(f.nome);
var bonif = equipeSomaMes(equipeBonificacoes, f.nome);
var vale = equipeSomaMes(equipeVales, f.nome);
var feriasReg = equipeFeriasRegistro(f.nome);
var desligado = !!f.demissao;
var ehMecanico = f.cargo.indexOf('Mecânico') > -1;
var feriasCell = '<span class="eq-muted">—</span>';
if (feriasReg) {
if (feriasReg.status === 'gozada') {
feriasCell = '<span class="status-badge good">Gozada</span>';
} else {
feriasCell = '<span class="status-badge warn">Planejada</span><button class="eq-link-btn" onclick="marcarFeriasGozada(\'' + f.nome + '\')">marcar gozada</button>';
}
}
var acao = desligado
? '<button class="eq-action-btn redo" title="Reativar" onclick="reativarFuncionario(\'' + f.nome + '\')">' + ICON_REDO + '</button>'
: '<div class="eq-action-wrap">' +
'<button class="eq-action-btn plus" title="Lançar" onclick="toggleEqDropdown(event, \'' + f.nome + '\')">' + ICON_PLUS + '</button>' +
'<div class="eq-dropdown" id="eq-dd-' + slug + '">' +
'<button onclick="abrirModalEquipe(\'bonificacao\', \'' + f.nome + '\')">' + ICON_GIFT + '<span>Adicionar bonificação</span></button>' +
'<button onclick="abrirModalEquipe(\'ferias\', \'' + f.nome + '\')">' + ICON_PLANE + '<span>Agendar férias</span></button>' +
'<button onclick="abrirModalEquipe(\'vale\', \'' + f.nome + '\')">' + ICON_CASH + '<span>Lançar vale adiantamento</span></button>' +
'</div>' +
'</div>' +
'<button class="eq-action-btn x" title="Desligar" onclick="desligarFuncionario(\'' + f.nome + '\')">' + ICON_X + '</button>';
return '<tr' + (desligado ? ' class="eq-row-off"' : '') + '>' +
'<td><div class="eq-person"><div class="eq-avatar' + (ehMecanico ? ' mecanico' : '') + '">' + equipeIniciais(f.nome) + '</div><div><p class="eq-name">' + f.nome + '</p>' + (desligado ? '<span class="status-badge warn">Desligado</span>' : '') + '</div></div></td>' +
'<td>' + fmtDataBR(f.admissao) + '</td>' +
'<td>' + (f.demissao ? fmtDataBR(f.demissao) : '<span class="eq-muted">—</span>') + '</td>' +
'<td>' + equipeTempoDeCasa(f.admissao, f.demissao) + '</td>' +
'<td>' + f.cargo + '</td>' +
'<td class="num">R$ ' + f.salario.toLocaleString('pt-BR') + '</td>' +
'<td class="num">R$ ' + rh.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + '</td>' +
'<td class="num">R$ ' + comissoes.toLocaleString('pt-BR') + '</td>' +
'<td class="num">R$ ' + bonif.toLocaleString('pt-BR') + '</td>' +
'<td class="num">R$ ' + vale.toLocaleString('pt-BR') + '</td>' +
'<td style="white-space:nowrap;">' + feriasCell + '</td>' +
'<td style="white-space:nowrap;">' + acao + '</td>' +
'</tr>';
}).join('');
}
var afAnexoNomeArquivo = null;
var afAnexoURL = null;
function atualizarDescontoPadraoAbono() {
var tipo = document.getElementById('afTipo').value;
var chk = document.getElementById('afNaoDescontar');
chk.checked = (tipo === 'Abono' || tipo === 'Atestado médico');
}
function onAnexoAbonoSelecionado(ev) {
var file = ev.target.files && ev.target.files[0];
var btn = document.getElementById('afAnexoBtn');
var label = document.getElementById('afAnexoLabel');
if (file) {
afAnexoNomeArquivo = file.name;
afAnexoURL = URL.createObjectURL(file);
btn.classList.add('attached');
label.textContent = file.name.length > 24 ? file.name.slice(0, 21) + '…' : file.name;
} else {
afAnexoNomeArquivo = null;
afAnexoURL = null;
btn.classList.remove('attached');
label.textContent = 'Anexar atestado/comprovante';
}
}
function resetAnexoAbono() {
afAnexoNomeArquivo = null;
afAnexoURL = null;
var btn = document.getElementById('afAnexoBtn');
var label = document.getElementById('afAnexoLabel');
var input = document.getElementById('afAnexoInput');
if (btn) btn.classList.remove('attached');
if (label) label.textContent = 'Anexar atestado/comprovante';
if (input) input.value = '';
}
function addAbonoEquipe() {
var funcionario = document.getElementById('afFuncionario').value;
var tipo = document.getElementById('afTipo').value;
var data = document.getElementById('afData').value;
var horasVal = document.getElementById('afHoras').value;
var horas = horasVal ? parseFloat(horasVal) : null;
var motivo = document.getElementById('afMotivo').value.trim();
var naoDescontar = document.getElementById('afNaoDescontar').checked;
if (!funcionario || !tipo || !data) return;
equipeAbonos.push({ funcionario: funcionario, tipo: tipo, data: data, horas: horas, motivo: motivo || '-', desconta: !naoDescontar, anexado: !!afAnexoNomeArquivo, arquivo: afAnexoNomeArquivo, arquivoURL: afAnexoURL });
document.getElementById('afHoras').value = '';
document.getElementById('afMotivo').value = '';
document.getElementById('afNaoDescontar').checked = false;
resetAnexoAbono();
renderTabelaAbonos();
renderResumoEquipeTabela();
renderKpisEquipe();
}
function renderTabelaAbonos() {
var tbl = document.getElementById('eq-tbl-abonos');
if (!tbl) return;
var ordenado = equipeAbonos.slice().sort(function (a, b) { return b.data.localeCompare(a.data); }).slice(0, 20);
tbl.innerHTML = ordenado.length ? ordenado.map(function (a) {
var badge = a.desconta ? '<span class="status-badge warn">Desconta</span>' : '<span class="status-badge good">Não desconta</span>';
var anexo = a.anexado
? (a.arquivoURL
? '<a href="' + a.arquivoURL + '" target="_blank" class="eq-anexo-link" title="Ver ' + (a.arquivo || 'comprovante') + '">' + ICON_PAPERCLIP + '</a>'
: '<span class="eq-muted" title="' + (a.arquivo || 'Comprovante anexado') + '">' + ICON_PAPERCLIP + '</span>')
: '';
return '<tr><td>' + a.funcionario + '</td><td>' + a.tipo + '</td><td>' + fmtDataBR(a.data) + '</td><td class="num">' + (a.horas ? a.horas + 'h' : 'dia inteiro') + '</td><td>' + a.motivo + '</td><td>' + badge + '</td><td>' + anexo + '</td></tr>';
}).join('') : '<tr><td colspan="7" style="color:var(--text-faint);">Nenhum lançamento.</td></tr>';
}
function gerarPreviaContador() {
var competencia = document.getElementById('envCompetencia').value;
if (!competencia) return;
document.getElementById('previaCompetenciaLabel').textContent = fmtMesAnoBR(competencia);
var linhas = equipeFuncionarios.map(function (f) {
var horas = equipeHorasEfetivasNoMes(f, competencia);
var comissoes = equipeComissaoNoMes(f.nome, competencia);
var bonif = equipeSomaMes(equipeBonificacoes, f.nome, competencia);
var vale = equipeSomaMes(equipeVales, f.nome, competencia);
var feriasReg = equipeFeriasRegistro(f.nome, competencia);
return '<tr><td><strong>' + f.nome + '</strong></td><td>' + f.cargo + '</td><td class="num">R$ ' + f.salario.toLocaleString('pt-BR') + '</td><td class="num">' + (horas ? horas + 'h' : '-') + '</td><td class="num">R$ ' + comissoes.toLocaleString('pt-BR') + '</td><td class="num">R$ ' + bonif.toLocaleString('pt-BR') + '</td><td class="num">R$ ' + vale.toLocaleString('pt-BR') + '</td><td>' + (feriasReg ? (feriasReg.status === 'gozada' ? 'Gozada' : 'Planejada') : '-') + '</td></tr>';
}).join('');
document.getElementById('eq-tbl-previa').innerHTML = linhas;
document.getElementById('previaEnvioCard').style.display = 'block';
var celulaDocumento = function (item) {
return item.anexoUrl
? '<a href="' + item.anexoUrl + '" target="_blank" class="eq-anexo-link" style="text-decoration:underline; display:inline;" title="Ver ' + item.anexoNome + '">Ver anexo</a>'
: '<span class="eq-muted" style="font-style:italic;">Sem anexo</span>';
};
var linhaContabil = function (item) {
return '<tr><td>' + item.categoria + '</td><td>' + item.nome + '</td><td class="num">R$ ' + item.valor.toLocaleString('pt-BR') + '</td><td>' + fmtDataBR(item.data) + '</td><td>' + celulaDocumento(item) + '</td></tr>';
};
var pagasDoMes = contasContabilPagas.filter(function (c) { return c.data.slice(0, 7) === competencia; });
var recebidasDoMes = contasContabilRecebidas.filter(function (c) { return c.data.slice(0, 7) === competencia; });
document.getElementById('eq-tbl-previa-pagas').innerHTML = pagasDoMes.length
? pagasDoMes.map(linhaContabil).join('')
: '<tr><td colspan="5" style="color:var(--text-faint);">Nenhuma conta paga nessa competência.</td></tr>';
document.getElementById('eq-tbl-previa-recebidas').innerHTML = recebidasDoMes.length
? recebidasDoMes.map(linhaContabil).join('')
: '<tr><td colspan="5" style="color:var(--text-faint);">Nenhuma conta recebida nessa competência.</td></tr>';
document.getElementById('previaContabilCard').style.display = 'block';
// ===== Documentos pra baixar: lista consolidada, com botão de abrir bem visível =====
var todosItens = pagasDoMes.map(function (c) { return Object.assign({ tipoLabel: 'Pago em' }, c); })
.concat(recebidasDoMes.map(function (c) { return Object.assign({ tipoLabel: 'Recebido em' }, c); }));
document.getElementById('previaDocCompetenciaLabel').textContent = fmtMesAnoBR(competencia);
var comAnexo = todosItens.filter(function (i) { return i.anexoUrl; }).length;
document.getElementById('previaDocResumo').textContent = todosItens.length
? comAnexo + ' de ' + todosItens.length + ' documento' + (todosItens.length === 1 ? '' : 's') + ' dessa competência ' + (todosItens.length === 1 ? 'tem' : 'têm') + ' comprovante anexado. Clique em "Abrir documento" pra ver ou baixar.'
: 'Nenhuma conta paga ou recebida nessa competência ainda.';
document.getElementById('previaDocumentosList').innerHTML = todosItens.length
? todosItens.map(function (item) {
var temAnexo = !!item.anexoUrl;
var acao = temAnexo
? '<a class="doc-btn-abrir" href="' + item.anexoUrl + '" target="_blank">' + ICON_PAPERCLIP + ' Abrir documento</a>'
: '<span class="doc-sem-anexo">Sem documento anexado</span>';
return '<div class="doc-row' + (temAnexo ? ' tem-anexo' : '') + '">' +
'<div class="doc-icon">' + ICON_PAPERCLIP + '</div>' +
'<div class="doc-info"><p class="doc-nome">' + item.nome + '</p><p class="doc-sub">' + item.categoria + ' · ' + item.tipoLabel + ' ' + fmtDataBR(item.data) + '</p></div>' +
'<span class="doc-valor">R$ ' + item.valor.toLocaleString('pt-BR') + '</span>' +
acao +
'</div>';
}).join('')
: '';
document.getElementById('previaDocumentosCard').style.display = 'block';
}
function renderKpisEquipe() {
var elAtivos = document.getElementById('kpi-eq-ativos');
if (!elAtivos) return;
var ativos = equipeFuncionarios.filter(function (f) { return !f.demissao; });
elAtivos.textContent = ativos.length;
var folha = ativos.reduce(function (s, f) { return s + f.salario; }, 0);
document.getElementById('kpi-eq-folha').textContent = 'R$ ' + folha.toLocaleString('pt-BR');
var mecanicos = ativos.filter(function (f) { return f.cargo.indexOf('Mecânico') > -1; });
var mediaRh = mecanicos.length ? mecanicos.reduce(function (s, f) { return s + equipeRhHora(f); }, 0) / mecanicos.length : 0;
document.getElementById('kpi-eq-rh').textContent = 'R$ ' + mediaRh.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
var abonosMes = equipeAbonos.filter(function (a) { return a.data.slice(0, 7) === EQUIPE_MES_REF; });
document.getElementById('kpi-eq-abonos').textContent = abonosMes.length;
var rotAtual = equipeTaxaRotatividade(EQUIPE_MES_REF);
var elRot = document.getElementById('kpi-eq-rotatividade');
var elRotCmp = document.getElementById('kpi-eq-rotatividade-cmp');
if (elRot) {
elRot.textContent = rotAtual.toLocaleString('pt-BR', { minimumFractionDigits: 1, maximumFractionDigits: 1 }) + '%';
var diff = rotAtual - EQUIPE_ROTATIVIDADE_MES_PASSADO;
var sinal = diff > 0 ? '+' : (diff < 0 ? '−' : '');
elRotCmp.textContent = sinal + Math.abs(diff).toLocaleString('pt-BR', { minimumFractionDigits: 1, maximumFractionDigits: 1 }) + ' p.p. vs. mês passado (' + EQUIPE_ROTATIVIDADE_MES_PASSADO.toLocaleString('pt-BR', { minimumFractionDigits: 1, maximumFractionDigits: 1 }) + '%)';
elRotCmp.style.color = diff > 0 ? 'var(--red)' : (diff < 0 ? 'var(--good)' : 'var(--text-faint)');
}
}
function initGestaoEquipe() {
popularSelectsEquipe();
renderResumoEquipeTabela();
renderTabelaAbonos();
renderKpisEquipe();
}
// ===== Precificar Andaimes =====
var andaimeState = { base: 18, rodizio: 0, sapata: 0 };
function selectAndaimeTipo(el) {
document.querySelectorAll('#andaime-tipo-row .andaime-opt').forEach(o => o.classList.remove('selected'));
el.classList.add('selected');
andaimeState.base = parseFloat(el.getAttribute('data-preco'));
recalcAndaime();
}
function selectAndaimeToggle(el, tipo) {
var row = el.parentElement;
row.querySelectorAll('.andaime-toggle').forEach(o => o.classList.remove('selected'));
el.classList.add('selected');
andaimeState[tipo] = parseFloat(el.getAttribute('data-valor'));
recalcAndaime();
}
function recalcAndaime() {
var qtd = parseFloat(document.getElementById('andaime-qtd').value) || 0;
var base = andaimeState.base;
var totalBase = qtd * base;
var total = totalBase + andaimeState.rodizio + andaimeState.sapata;
document.getElementById('andaime-base').textContent = 'R$ ' + base.toFixed(2).replace('.', ',');
document.getElementById('andaime-add-rodizio').textContent = 'R$ ' + andaimeState.rodizio.toFixed(2).replace('.', ',');
document.getElementById('andaime-add-sapata').textContent = 'R$ ' + andaimeState.sapata.toFixed(2).replace('.', ',');
document.getElementById('andaime-total').textContent = 'R$ ' + total.toFixed(2).replace('.', ',');
document.getElementById('andaime-explicacao').innerHTML =
qtd + ' módulos × R$ ' + base.toFixed(2).replace('.', ',') + ' + rodízio R$ ' + andaimeState.rodizio.toFixed(2).replace('.', ',') +
' + sapata R$ ' + andaimeState.sapata.toFixed(2).replace('.', ',') + ' = <b class="pos">R$ ' + total.toFixed(2).replace('.', ',') + ' / dia</b>';
}
function usarPrecoAndaime() {
var total = document.getElementById('andaime-total').textContent;
alert('Diária de locação definida: ' + total);
}
document.addEventListener('DOMContentLoaded', function() {
if (document.getElementById('andaime-qtd')) recalcAndaime();
});
// ===== Gráfico faturamento Loja =====
var chartLojaInstance = null;
var chartLojaDadosPorPeriodo = {
dia: { labels: ['6h','9h','12h','15h','18h','21h','Agora'], data: [120, 340, 410, 380, 290, 180, 120] },
semanal: { labels: ['Qui', 'Sex', 'Sáb', 'Seg', 'Ter', 'Qua', 'Hoje'], data: [1120, 1480, 900, 1560, 1720, 1220, 1840] },
quinzenal: { labels: ['Sem 1', 'Sem 2', 'Esta semana'], data: [8100, 8260, 9840] },
mensal: { labels: ['Sem 1', 'Sem 2', 'Sem 3', 'Até hoje'], data: [7200, 8100, 8260, 8040] },
personalizado: { labels: ['Início', 'Meio', 'Fim'], data: [10200, 11400, 9800] }
};
function atualizarChartLoja(periodo) {
if (!chartLojaInstance) return;
var d = chartLojaDadosPorPeriodo[periodo] || chartLojaDadosPorPeriodo.mensal;
chartLojaInstance.data.labels = d.labels;
chartLojaInstance.data.datasets[0].data = d.data;
chartLojaInstance.update();
}
var ctxLoja = document.getElementById('chart-loja-faturamento');
if (ctxLoja && typeof Chart !== 'undefined') {
chartLojaInstance = new Chart(ctxLoja, {
type: 'bar',
data: {
labels: ['Qui', 'Sex', 'Sáb', 'Seg', 'Ter', 'Qua', 'Hoje'],
datasets: [{ label: 'Faturamento', data: [1120, 1480, 900, 1560, 1720, 1220, 1840], backgroundColor: '#E85A28', borderRadius: 3 }]
},
options: {
responsive: true, maintainAspectRatio: false,
layout: { padding: { top: 20 } },
plugins: { legend: { display: false } },
scales: { y: { grid: { color: '#ECE8DD' }, ticks: { font: { size: 10 } } }, x: { grid: { display: false }, ticks: { font: { size: 11 } } } }
},
plugins: [{
id: 'valueLabelsLoja',
afterDatasetsDraw: function(chart) {
var ctx2 = chart.ctx;
var meta = chart.getDatasetMeta(0);
meta.data.forEach(function(bar, idx) {
ctx2.save();
ctx2.font = 'bold 10.5px -apple-system, sans-serif';
ctx2.textAlign = 'center';
ctx2.fillStyle = '#6E6760';
ctx2.fillText('R$ ' + chart.data.datasets[0].data[idx].toLocaleString('pt-BR'), bar.x, bar.y - 6);
ctx2.restore();
});
}
}]
});
}
var caixaChartInitialized = false;
function initCaixaChart() {
if (caixaChartInitialized) return;
var ctx = document.getElementById('chart-caixa-tendencia');
if (!ctx || typeof Chart === 'undefined') return;
caixaChartInitialized = true;
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun'],
datasets: [
{ label: 'Entrou', data: [29500, 32000, 34500, 31000, 38000, 42652], backgroundColor: '#97C459', borderRadius: 3 },
{ label: 'Saiu', data: [21000, 22000, 24500, 25500, 23000, 30188], backgroundColor: '#E24B4A', borderRadius: 3 }
]
},
options: {
responsive: true,
maintainAspectRatio: false,
layout: { padding: { top: 20 } },
plugins: { legend: { display: true, position: 'top', labels: { boxWidth: 11, font: { size: 11 } } } },
scales: {
y: { grid: { color: '#ECE8DD' }, ticks: { font: { size: 10 } } },
x: { grid: { display: false }, ticks: { font: { size: 11 } } }
}
},
plugins: [{
id: 'valueLabelsCaixa',
afterDatasetsDraw: function(chart) {
var ctx2 = chart.ctx;
chart.data.datasets.forEach(function(dataset, i) {
var meta = chart.getDatasetMeta(i);
meta.data.forEach(function(bar, idx) {
ctx2.save();
ctx2.font = '9.5px -apple-system, sans-serif';
ctx2.textAlign = 'center';
ctx2.fillStyle = '#6E6760';
var valorFmt = 'R$ ' + (dataset.data[idx] / 1000).toFixed(1).replace('.', ',') + 'k';
ctx2.fillText(valorFmt, bar.x, bar.y - 6);
ctx2.restore();
});
});
}
}]
});
}
// ===== Painel do Dia (Lucilene) — atalhos e lançamentos =====
function openContas(foco) {
showView('fin-contas', document.querySelector('[data-view=fin-contas]'));
var tab = foco === 'pagar' ? 'pagar' : 'receber';
var btn = document.querySelector('#view-fin-contas .fin-tab-row .fin-tab-btn[data-tab="' + tab + '"]');
if (btn) setSubTab('fin-contas', tab, btn);
}
// ===== Contas a Pagar/Receber: Visão Mensal (calendário) =====
var contasCalendarioDados = {
18: [{ tipo: 'pagar', status: 'paga', nome: 'Internet + telefone', valor: 220, obs: 'Pago · comprovante anexado' }],
20: [{ tipo: 'receber', status: 'vencida', nome: 'Carlos Eduardo Pires', valor: 290, obs: 'Betoneira 400L · venceu há 3 dias' }],
21: [{ tipo: 'pagar', status: 'vencida', nome: 'Aluguel da loja', valor: 2500, obs: 'Venceu há 2 dias' }],
23: [{ tipo: 'receber', status: 'avencer', nome: 'Wederson Candido', valor: 435, obs: 'Martelo 15kg · vence hoje' }],
25: [{ tipo: 'pagar', status: 'avencer', nome: 'Conta de energia', valor: 480, obs: 'Vence em 2 dias' }],
28: [{ tipo: 'pagar', status: 'avencer', nome: 'Fornecedor de peças', valor: 1350, obs: 'Vence em 5 dias' }]
};
var CAL_HOJE = 23, CAL_DIAS_NO_MES = 30, CAL_PRIMEIRO_DIA_SEMANA = 1; // junho/2026 começa numa segunda
function renderCalendarioContas() {
var grid = document.getElementById('cal-contas-grid');
if (!grid || grid.dataset.rendered) return;
grid.dataset.rendered = '1';
var html = '';
for (var i = 0; i < CAL_PRIMEIRO_DIA_SEMANA; i++) { html += '<div class="cal-day empty"></div>'; }
for (var d = 1; d <= CAL_DIAS_NO_MES; d++) {
var eventos = contasCalendarioDados[d];
var classes = 'cal-day' + (d === CAL_HOJE ? ' hoje' : '') + (eventos ? ' has-evento' : '');
var dots = '';
if (eventos) {
dots = '<div class="cal-dots">' + eventos.map(function (e) {
var cor = e.tipo === 'pagar' ? (e.status === 'vencida' ? 'red' : (e.status === 'paga' ? 'blue' : 'amber')) : (e.status === 'vencida' ? 'red' : 'blue');
return '<span class="cal-dot ' + cor + '"></span>';
}).join('') + '</div>';
}
html += '<div class="' + classes + '" ' + (eventos ? 'onclick="mostrarContasDoDia(' + d + ')"' : '') + '><span class="cal-daynum">' + d + '</span>' + dots + '</div>';
}
grid.innerHTML = html;
mostrarContasDoDia(CAL_HOJE);
}
function mostrarContasDoDia(dia) {
var painel = document.getElementById('cal-dia-detalhe');
if (!painel) return;
var eventos = contasCalendarioDados[dia] || [];
if (!eventos.length) { painel.innerHTML = '<p class="panel-note">Nenhuma conta com data nesse dia.</p>'; return; }
var titulo = (dia === CAL_HOJE ? 'Hoje, dia ' : 'Dia ') + dia + '/06';
painel.innerHTML = '<p class="section-label" style="margin:0 0 8px;">' + titulo + '</p>' + eventos.map(function (e, idx) {
var jaBaixado = e.status === 'paga' || e.status === 'recebida';
var vencida = e.status === 'vencida';
var cls = jaBaixado ? '' : (vencida ? 'danger' : 'warn');
var icone = e.tipo === 'pagar' ? 'ti-arrow-up-circle' : 'ti-arrow-down-circle';
var tipoLabel = e.tipo === 'pagar' ? 'A pagar' : 'A receber';
var baixaBtn = jaBaixado ? '' : '<button class="btn primary" style="margin-top:8px;" onclick="darBaixaContaDoDia(' + dia + ',' + idx + ')"><i class="ti ti-check"></i> Dar baixa</button>';
return '<div class="fin-conta-card ' + cls + '" style="margin-bottom:8px;"><div class="fin-conta-top" style="margin-bottom:0;"><i class="ti ' + icone + '"></i>' +
'<div style="flex:1;"><p class="nm">' + e.nome + ' <span style="font-weight:400; color:var(--text-mute); font-size:11.5px;">· ' + tipoLabel + '</span></p><p class="sub">' + e.obs + '</p></div>' +
'<span class="val">R$ ' + e.valor.toFixed(2).replace('.', ',') + '</span></div>' + baixaBtn + '</div>';
}).join('');
}
// ===== Contas a Pagar: marcar como pago + anexar comprovante =====
var contaAnexoAtual = null;
var contaAnexoTemp = { nome: null, url: null };
var contasContabilPagas = [
{ nome: 'Internet + telefone', categoria: 'Água/Internet', valor: 220, data: '2026-06-18', anexoNome: null, anexoUrl: null }
];
var contasContabilRecebidas = [];
function abrirAnexoConta(btn) {
contaAnexoAtual = btn.closest('.fin-conta-card');
resetAnexoContaTemp();
document.getElementById('modal-anexo').classList.add('open');
}
function resetAnexoContaTemp() {
contaAnexoTemp = { nome: null, url: null };
var lblC = document.getElementById('attach-comprovante-label'); if (lblC) lblC.textContent = 'Clique para selecionar o arquivo';
var lblO = document.getElementById('attach-contaorig-label'); if (lblO) lblO.textContent = 'Clique para selecionar o arquivo';
var inC = document.getElementById('attach-comprovante-input'); if (inC) inC.value = '';
var inO = document.getElementById('attach-contaorig-input'); if (inO) inO.value = '';
}
function onAnexoContaSelecionado(ev, tipo) {
var file = ev.target.files && ev.target.files[0];
if (!file) return;
var url = URL.createObjectURL(file);
contaAnexoTemp = { nome: file.name, url: url };
var lblId = tipo === 'comprovante' ? 'attach-comprovante-label' : 'attach-contaorig-label';
document.getElementById(lblId).textContent = file.name;
}
function salvarAnexoConta() {
if (contaAnexoAtual && contaAnexoTemp.url) {
contaAnexoAtual.dataset.anexoNome = contaAnexoTemp.nome;
contaAnexoAtual.dataset.anexoUrl = contaAnexoTemp.url;
var btnAnexar = contaAnexoAtual.querySelector('[onclick*="abrirAnexoConta"]');
if (btnAnexar) {
btnAnexar.innerHTML = '<i class="ti ti-file-check"></i> Anexado';
btnAnexar.classList.add('anexado');
}
}
contaAnexoAtual = null;
closeModal('modal-anexo');
}
function marcarContaPaga(btn) {
var card = btn.closest('.fin-conta-card');
var nome = card.querySelector('.nm').textContent.trim();
var valorTxt = card.querySelector('.val').textContent.trim();
var valorNum = parseFloat(valorTxt.replace('R$', '').replace(/\./g, '').replace(',', '.')) || 0;
var categoria = card.dataset.categoria || 'Outros';
var anexoNome = card.dataset.anexoNome || null;
var anexoUrl = card.dataset.anexoUrl || null;
card.remove();
var hoje = new Date(2026, 5, 23);
var isoData = hoje.getFullYear() + '-' + String(hoje.getMonth() + 1).padStart(2, '0') + '-' + String(hoje.getDate()).padStart(2, '0');
var dataStr = String(hoje.getDate()).padStart(2, '0') + '/' + String(hoje.getMonth() + 1).padStart(2, '0');
contasContabilPagas.push({ nome: nome, categoria: categoria, valor: valorNum, data: isoData, anexoNome: anexoNome, anexoUrl: anexoUrl });
var listaPagas = document.getElementById('contas-pagas-list');
var anexoHtml = anexoUrl ? ' · <a href="' + anexoUrl + '" target="_blank" class="eq-anexo-link" style="display:inline;" title="Ver ' + anexoNome + '">comprovante</a>' : '';
var row = document.createElement('div');
row.className = 'fin-ledger-row';
row.innerHTML = '<div class="fin-ledger-icon in"><i class="ti ti-circle-check"></i></div>' +
'<div style="flex:1;"><p class="nm">' + nome + '</p><p class="sub">Pago em ' + dataStr + anexoHtml + '</p></div>' +
'<span class="val">' + valorTxt + '</span>';
listaPagas.prepend(row);
atualizarBannerVencidas();
}
function emitirNotaGestao() {
window.open('https://www.nfse.gov.br/EmissorNacional/Login?ReturnUrl=%2fEmissorNacional', '_blank');
}
function marcarContaRecebida(btn) {
var card = btn.closest('.fin-conta-card');
var contratoId = card.dataset.contratoId || null;
var nome = card.querySelector('.nm').textContent.trim();
var valorTxt = card.querySelector('.val').textContent.trim();
var valorNum = parseFloat(valorTxt.replace('R$', '').replace(/\./g, '').replace(',', '.')) || 0;
var categoria = card.dataset.categoria || 'Locação';
var anexoNome = card.dataset.anexoNome || null;
var anexoUrl = card.dataset.anexoUrl || null;
card.remove();
var hoje = new Date(2026, 5, 23);
var isoData = hoje.getFullYear() + '-' + String(hoje.getMonth() + 1).padStart(2, '0') + '-' + String(hoje.getDate()).padStart(2, '0');
var dataStr = String(hoje.getDate()).padStart(2, '0') + '/' + String(hoje.getMonth() + 1).padStart(2, '0');
contasContabilRecebidas.push({ nome: nome, categoria: categoria, valor: valorNum, data: isoData, anexoNome: anexoNome, anexoUrl: anexoUrl });
var vazio = document.getElementById('contas-recebidas-vazio');
if (vazio) vazio.style.display = 'none';
var listaRecebidas = document.getElementById('contas-recebidas-list');
var anexoHtml = anexoUrl ? ' · <a href="' + anexoUrl + '" target="_blank" class="eq-anexo-link" style="display:inline;" title="Ver ' + anexoNome + '">nota</a>' : '';
var row = document.createElement('div');
row.className = 'fin-ledger-row';
row.innerHTML = '<div class="fin-ledger-icon in"><i class="ti ti-circle-check"></i></div>' +
'<div style="flex:1;"><p class="nm">' + nome + '</p><p class="sub">Recebido em ' + dataStr + anexoHtml + '</p></div>' +
'<span class="val">R$ ' + valorNum.toLocaleString('pt-BR') + '</span>' +
'<button class="btn" style="margin-left:8px;" onclick="emitirNotaGestao()"><i class="ti ti-file-invoice"></i> Emitir nota</button>';
listaRecebidas.prepend(row);
// Se a conta veio de um contrato do banco: marca o contrato como pago e lança a
// entrada no caixa (movimentos_caixa) — a baixa passa a ser de verdade e some das pendências.
if (contratoId) {
fetch('/api/dados/contratos/' + contratoId, {
method: 'PUT', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin',
body: JSON.stringify({ pago: true })
}).catch(function () {});
fetch('/api/dados/movimentos_caixa', {
method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin',
body: JSON.stringify({ tipo: 'entrada', descricao: nome, valor: valorNum, origem: 'contrato', contratoId: contratoId, perfil: 'gestao', data: isoData })
}).then(function () { if (typeof renderCaixaBanco === 'function') renderCaixaBanco(); }).catch(function () {});
}
}
function atualizarBannerVencidas() {
var banner = document.getElementById('banner-contas-vencidas');
if (!banner) return;
var vencidas = document.querySelectorAll('#tab-fin-contas-pagar .fin-conta-card.danger').length;
if (vencidas === 0) { banner.style.display = 'none'; return; }
banner.style.display = 'flex';
banner.querySelector('.t').textContent = vencidas + (vencidas === 1 ? ' conta vencida' : ' contas vencidas');
}
// ===== Item 10/11: Nova conta (manual, com opção recorrente) =====
var nc_tipoAtual = 'pagar';
function abrirNovaConta(tipo) {
nc_tipoAtual = tipo;
document.getElementById('nc-titulo').textContent = tipo === 'pagar' ? 'Nova conta a pagar' : 'Nova conta a receber';
document.getElementById('nc-descricao').value = '';
document.getElementById('nc-valor').value = '';
document.getElementById('nc-vencimento').value = '';
document.getElementById('nc-recorrente').checked = false;
document.getElementById('nc-recorrencia-opts').style.display = 'none';
document.getElementById('modal-nova-conta').classList.add('open');
}
function salvarNovaConta() {
var desc = document.getElementById('nc-descricao').value.trim();
var categoria = document.getElementById('nc-categoria').value;
var valor = parseFloat(document.getElementById('nc-valor').value) || 0;
var venc = document.getElementById('nc-vencimento').value; // yyyy-mm-dd
var recorrente = document.getElementById('nc-recorrente').checked;
if (!desc || valor <= 0 || !venc) { document.getElementById('nc-descricao').focus(); return; }
var partes = venc.split('-');
var dVenc = new Date(parseInt(partes[0],10), parseInt(partes[1],10)-1, parseInt(partes[2],10));
var hoje = new Date();
hoje.setHours(0,0,0,0);
var diffDias = Math.round((dVenc - hoje) / 86400000);
var vencida = diffDias < 0;
var dataStr = String(dVenc.getDate()).padStart(2,'0') + '/' + String(dVenc.getMonth()+1).padStart(2,'0');
var subLabel = vencida ? ('Venceu há ' + Math.abs(diffDias) + ' dia' + (Math.abs(diffDias)===1?'':'s') + ' · ' + dataStr)
: (diffDias === 0 ? ('Vence hoje · ' + dataStr) : ('Vence em ' + diffDias + ' dia' + (diffDias===1?'':'s') + ' · ' + dataStr));
var recTag = recorrente ? ' <span style="font-weight:400; color:var(--text-mute); font-size:11px;">🔁 recorrente</span>' : '';
var card = document.createElement('div');
card.className = 'fin-conta-card' + (nc_tipoAtual === 'pagar' ? (vencida ? ' danger' : (diffDias <= 3 ? ' warn' : '')) : (vencida ? ' danger' : ' warn'));
card.dataset.categoria = categoria;
card.dataset.venc = venc;
if (nc_tipoAtual === 'pagar') {
card.innerHTML = '<div class="fin-conta-top"><i class="ti ti-file-invoice"></i><div style="flex:1;"><p class="nm">' + desc + recTag + '</p><p class="sub">' + subLabel + '</p></div><span class="val">R$ ' + valor.toLocaleString('pt-BR',{minimumFractionDigits:2}) + '</span></div>' +
'<div class="fin-conta-actions"><button class="btn primary" style="flex:1;" onclick="marcarContaPaga(this)">Marcar como pago</button><button class="btn" onclick="abrirAnexoConta(this)"><i class="ti ti-paperclip"></i> Anexar</button></div>';
document.getElementById('contas-pagar-list').appendChild(card);
} else {
card.style.padding = '14px 16px';
card.innerHTML = '<div class="fin-conta-top" style="margin-bottom:0;"><i class="ti ti-file-dollar"></i><div style="flex:1;"><p class="nm">' + desc + recTag + '</p><p class="sub">' + subLabel + '</p></div><span class="val">R$ ' + valor.toLocaleString('pt-BR',{minimumFractionDigits:2}) + '</span><button class="btn" onclick="abrirAnexoConta(this)" style="margin-left:8px;"><i class="ti ti-paperclip"></i></button><button class="btn primary" style="margin-left:8px;" onclick="marcarContaRecebida(this)">Marcar recebido</button></div>';
document.getElementById('contas-receber-list').appendChild(card);
}
atualizarBannerVencidas();
// Se o vencimento cai no mês exibido no calendário, também aparece lá
var mesVenc = venc.slice(0,7);
if (mesVenc === CONTAS_MES_ATUAL) {
var dia = dVenc.getDate();
if (!contasCalendarioDados[dia]) contasCalendarioDados[dia] = [];
contasCalendarioDados[dia].push({ tipo: nc_tipoAtual, status: vencida ? 'vencida' : 'avencer', nome: desc, valor: valor, obs: subLabel, categoria: categoria });
document.getElementById('cal-contas-grid').dataset.rendered = '';
renderCalendarioContas();
}
if (recorrente) {
showToastGestao('Conta salva. Repetição automática dos próximos meses fica disponível quando o sistema tiver banco de dados.');
}
closeModal('modal-nova-conta');
}
function showToastGestao(msg) {
var t = document.createElement('div');
t.textContent = msg;
t.style.cssText = 'position:fixed; bottom:24px; left:50%; transform:translateX(-50%); background:#1A1A1A; color:#fff; padding:10px 18px; border-radius:999px; font-size:12.5px; z-index:999; max-width:80%; text-align:center; box-shadow:0 6px 18px rgba(0,0,0,0.25);';
document.body.appendChild(t);
setTimeout(function(){ t.remove(); }, 3200);
}
// ===== Item 11: dar baixa direto no calendário (Visão Mensal) e lançar no caixa da Gestão =====
function darBaixaContaDoDia(dia, idx) {
var evento = (contasCalendarioDados[dia] || [])[idx];
if (!evento) return;
evento.status = evento.tipo === 'pagar' ? 'paga' : 'recebida';
var hora = new Date().toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' });
var isEntrada = evento.tipo === 'receber';
var list = document.getElementById('pd-ledger-list');
if (list) {
var row = document.createElement('div');
row.className = 'fin-ledger-row';
row.innerHTML = '<div class="fin-ledger-icon ' + (isEntrada ? 'in' : 'out') + '"><i class="ti ' + (isEntrada ? 'ti-arrow-down-circle' : 'ti-arrow-up-circle') + '"></i></div>' +
'<div style="flex:1;"><p class="nm">' + evento.nome + '</p><p class="sub">' + hora + ' · <span class="fin-origin-tag gestao-manual">Baixa via Contas a ' + (isEntrada?'Receber':'Pagar') + '</span></p></div>' +
'<span class="val ' + (isEntrada ? 'in' : 'out') + '">' + (isEntrada ? '+R$ ' : '-R$ ') + evento.valor.toFixed(0) + '</span>';
list.prepend(row);
}
atualizarKpisCaixaGestao(evento.valor, isEntrada);
showToastGestao((evento.tipo === 'pagar' ? 'Pagamento' : 'Recebimento') + ' registrado e lançado no caixa ✓');
document.getElementById('cal-contas-grid').dataset.rendered = '';
renderCalendarioContas();
mostrarContasDoDia(dia);
}
function atualizarKpisCaixaGestao(valor, isEntrada) {
var saldoEl = document.querySelector('#view-visaogeral .vg-card-big.warn .vg-num-big');
var entrouEl = document.querySelector('#view-visaogeral .vg-card-big.good .vg-num-big');
var saiuEl = document.querySelector('#view-visaogeral .vg-card-big.danger .vg-num-big');
var parse = function(txt){ return parseFloat(String(txt).replace('R$','').replace(/\./g,'').replace(',','.').trim()) || 0; };
if (saldoEl) saldoEl.textContent = 'R$ ' + (parse(saldoEl.textContent) + (isEntrada ? valor : -valor)).toLocaleString('pt-BR');
if (isEntrada && entrouEl) entrouEl.textContent = 'R$ ' + (parse(entrouEl.textContent) + valor).toLocaleString('pt-BR');
if (!isEntrada && saiuEl) saiuEl.textContent = 'R$ ' + (parse(saiuEl.textContent) + valor).toLocaleString('pt-BR');
}
// ===== Item 11: filtro de mês retroativo na Visão Mensal =====
var CONTAS_MES_ATUAL = (function(){ var d = new Date(); return d.getFullYear() + '-' + String(d.getMonth()+1).padStart(2,'0'); })();
(function initContasMesFiltro() {
var sel = document.getElementById('contas-mes-filtro');
if (!sel) return;
var agora = new Date();
var meses = ['janeiro','fevereiro','março','abril','maio','junho','julho','agosto','setembro','outubro','novembro','dezembro'];
for (var i = 0; i < 13; i++) {
var d = new Date(agora.getFullYear(), agora.getMonth() - i, 1);
var opt = document.createElement('option');
opt.value = d.getFullYear() + '-' + String(d.getMonth()+1).padStart(2,'0');
opt.textContent = meses[d.getMonth()].charAt(0).toUpperCase() + meses[d.getMonth()].slice(1) + '/' + d.getFullYear();
sel.appendChild(opt);
}
})();
function onContasMesChange() {
var sel = document.getElementById('contas-mes-filtro');
var banner = document.getElementById('contas-mes-banner');
var atual = sel.options[0].value;
if (sel.value === atual) {
banner.style.display = 'none';
} else {
banner.style.display = 'flex';
document.getElementById('contas-mes-banner-text').textContent =
'Você selecionou ' + sel.options[sel.selectedIndex].textContent + '. O histórico de meses fechados fica disponível quando o sistema tiver banco de dados — o calendário abaixo continua mostrando o mês atual.';
}
}
function voltarContasMesAtual() {
var sel = document.getElementById('contas-mes-filtro');
sel.selectedIndex = 0;
onContasMesChange();
}
// ===== Item 10: sincronizar Contas a Receber com o que a Meire lança (localStorage) =====
// Agora lê os contratos PENDENTES (pago:false) direto do banco — o que a Meire
// gera aparece aqui em qualquer computador (não mais via localStorage/mesma aba).
var contasSincronizadasDaMeire = {};
function sincronizarContasReceberDaMeire() {
var lista = document.getElementById('contas-receber-list');
if (!lista) return;
fetch('/api/dados/contratos', { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (contratos) {
if (!Array.isArray(contratos)) return;
contratos.filter(function (c) { return c.pago === false; }).forEach(function (c) {
var chave = 'contrato-' + c._id;
if (contasSincronizadasDaMeire[chave]) return;
contasSincronizadasDaMeire[chave] = true;
var card = document.createElement('div');
card.className = 'fin-conta-card warn';
card.style.padding = '14px 16px';
card.dataset.categoria = 'Locação';
card.dataset.contratoId = c._id;
card.innerHTML = '<div class="fin-conta-top" style="margin-bottom:0;"><i class="ti ti-headset"></i><div style="flex:1;"><p class="nm">' + escapeHTMLShared(c.cliente || '') + ' <span style="font-weight:400; color:var(--text-mute); font-size:11px;">· contrato nº ' + escapeHTMLShared(c.numero || '') + ', lançado pela Meire</span></p><p class="sub">' + escapeHTMLShared(c.equipamento || '') + '</p></div><span class="val">R$ ' + Number(c.valor).toLocaleString('pt-BR', { minimumFractionDigits: 2 }) + '</span><button class="btn" onclick="abrirAnexoConta(this)" style="margin-left:8px;"><i class="ti ti-paperclip"></i></button><button class="btn primary" style="margin-left:8px;" onclick="marcarContaRecebida(this)">Marcar recebido</button></div>';
lista.appendChild(card);
});
})
.catch(function () {});
}
sincronizarContasReceberDaMeire();
// ===== Oficina -> Gestão: equipamentos prontos para retirada (lidos do banco) =====
function renderProntasRetiradaGestao() {
var box = document.getElementById('prontas-retirada-box-gestao');
if (!box) return;
fetch('/api/dados/ordens_servico', { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (lista) {
if (!Array.isArray(lista)) { box.innerHTML = ''; return; }
var prontas = lista.filter(function (o) { return o.status === 'pronto'; });
if (!prontas.length) { box.innerHTML = ''; return; }
box.innerHTML =
'<div style="background:#DCEADF; border:1px solid rgba(47,143,91,0.35); border-radius:14px; padding:14px 16px;">' +
'<p style="margin:0 0 8px; font-weight:700; color:#245239; font-size:13.5px;"><i class="ti ti-truck-delivery"></i> ' + prontas.length + ' equipamento' + (prontas.length === 1 ? '' : 's') + ' pronto' + (prontas.length === 1 ? '' : 's') + ' para retirada (Oficina)</p>' +
prontas.map(function (o) {
return '<div style="font-size:13px; color:#245239; padding:3px 0;"><b>' + escapeHTMLShared(o.equipamento || 'Equipamento') + '</b> — ' + escapeHTMLShared(o.cliente || '') + ' <span style="color:var(--text-mute);">(OS #' + escapeHTMLShared(o.numero || '') + ')</span></div>';
}).join('') +
'</div>';
})
.catch(function () {});
}
renderProntasRetiradaGestao();
// ===== Estoque de Equipamentos (Gestão): editar quantidade, custo, indenização e diárias =====
// O que for salvo aqui vale nos próximos contratos (a Recepção lê os equipamentos do banco).
function renderEstoqueGestao() {
var box = document.getElementById('estoque-gestao-list');
if (!box) return;
fetch('/api/dados/equipamentos', { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (lista) {
if (!Array.isArray(lista)) { box.innerHTML = '<p class="panel-note">Não foi possível carregar os equipamentos.</p>'; return; }
var estInput = 'width:100%; padding:8px 10px; border:1px solid var(--border); border-radius:8px; font-family:var(--font-body); font-size:14px; margin-top:3px;';
var estLbl = 'font-size:11px; color:var(--text-mute); display:block;';
var periodos = [['1', '1 dia'], ['3', '3 dias'], ['7', '7 dias'], ['15', '15 dias'], ['30', '30 dias']];
box.innerHTML = lista.map(function (e) {
var p = e.precos || {};
return '<div class="fin-conta-card" style="padding:16px; margin-bottom:12px;" data-id="' + e._id + '">' +
'<p style="font-weight:700; font-size:15px; margin:0 0 12px;">' + escapeHTMLShared(e.nome || '') + '</p>' +
'<div style="display:grid; grid-template-columns:repeat(3,1fr); gap:10px; margin-bottom:12px;">' +
'<div><label style="' + estLbl + '">Qtd. em estoque</label><input type="number" class="eq-qtd" value="' + (e.quantidade != null ? e.quantidade : 0) + '" style="' + estInput + '"></div>' +
'<div><label style="' + estLbl + '">Custo médio (R$)</label><input type="number" class="eq-custo" value="' + (e.custoMedio != null ? e.custoMedio : '') + '" style="' + estInput + '"></div>' +
'<div><label style="' + estLbl + '">Indenização (R$)</label><input type="number" class="eq-indeniz" value="' + (e.indenizacao != null ? e.indenizacao : 0) + '" style="' + estInput + '"></div>' +
'</div>' +
'<label style="' + estLbl + ' margin-bottom:4px;">Diárias por período (R$) — valem nos próximos contratos</label>' +
'<div style="display:grid; grid-template-columns:repeat(5,1fr); gap:8px; margin:4px 0 14px;">' +
periodos.map(function (per) { return '<div><label style="' + estLbl + '">' + per[1] + '</label><input type="number" class="eq-preco" data-p="' + per[0] + '" value="' + (p[per[0]] != null ? p[per[0]] : '') + '" style="' + estInput + '"></div>'; }).join('') +
'</div>' +
'<button class="btn primary" onclick="salvarEquipamento(this)">Salvar alterações</button>' +
'</div>';
}).join('');
})
.catch(function () { box.innerHTML = '<p class="panel-note">Erro ao carregar os equipamentos.</p>'; });
}
function salvarEquipamento(btn) {
var card = btn.closest('[data-id]');
if (!card) return;
var id = card.getAttribute('data-id');
var precos = {};
card.querySelectorAll('.eq-preco').forEach(function (inp) { precos[inp.getAttribute('data-p')] = Number(inp.value) || 0; });
var custoRaw = card.querySelector('.eq-custo').value;
var dados = {
quantidade: Number(card.querySelector('.eq-qtd').value) || 0,
custoMedio: (custoRaw === '' ? null : Number(custoRaw)),
indenizacao: Number(card.querySelector('.eq-indeniz').value) || 0,
precos: precos
};
btn.disabled = true; btn.textContent = 'Salvando...';
fetch('/api/dados/equipamentos/' + id, {
method: 'PUT', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin',
body: JSON.stringify(dados)
})
.then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); })
.then(function (res) {
btn.disabled = false;
if (res.ok) { btn.textContent = 'Salvo ✓'; setTimeout(function () { btn.textContent = 'Salvar alterações'; }, 1600); }
else { btn.textContent = 'Salvar alterações'; alert('Não deu para salvar: ' + ((res.j && res.j.erro) || 'erro no servidor')); }
})
.catch(function () { btn.disabled = false; btn.textContent = 'Salvar alterações'; alert('Sem conexão com o servidor.'); });
}
renderEstoqueGestao();
// ===== Caixa da Gestão: exibe os lançamentos do banco (movimentos_caixa), ex.: baixas de contas a receber =====
function renderCaixaBanco() {
var lista = document.getElementById('pd-ledger-list');
if (!lista) return;
fetch('/api/dados/movimentos_caixa', { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (movs) {
if (!Array.isArray(movs)) return;
Array.prototype.slice.call(lista.querySelectorAll('.caixa-banco')).forEach(function (el) { el.remove(); });
movs.slice().reverse().forEach(function (m) {
var entrada = m.tipo !== 'saida';
var row = document.createElement('div');
row.className = 'fin-ledger-row caixa-banco';
row.innerHTML = '<div class="fin-ledger-icon ' + (entrada ? 'in' : 'out') + '"><i class="ti ' + (entrada ? 'ti-arrow-down-circle' : 'ti-arrow-up-circle') + '"></i></div>' +
'<div style="flex:1;"><p class="nm">' + escapeHTMLShared(m.descricao || 'Lançamento') + '</p><p class="sub">' + (entrada ? 'Entrada' : 'Saída') + (m.origem ? ' · ' + escapeHTMLShared(m.origem) : '') + '</p></div>' +
'<span class="val ' + (entrada ? 'in' : 'out') + '">R$ ' + Number(m.valor || 0).toLocaleString('pt-BR', { minimumFractionDigits: 2 }) + '</span>';
lista.insertBefore(row, lista.firstChild);
});
})
.catch(function () {});
}
renderCaixaBanco();
var lancamentoEmEdicao = null;
function abrirNovoLancamento() {
lancamentoEmEdicao = null;
document.getElementById('ml-titulo').textContent = 'Novo lançamento';
document.getElementById('ml-sub').textContent = 'Entrada ou saída manual no caixa';
document.getElementById('ml-descricao').value = '';
document.getElementById('ml-valor').value = '';
document.getElementById('modal-novo-lancamento').classList.add('open');
}
function editarLancamento(btn) {
var row = btn.closest('.fin-ledger-row');
lancamentoEmEdicao = row;
var nome = row.querySelector('.nm').textContent;
var valEl = row.querySelector('.val');
var valorNumerico = valEl.textContent.replace(/[^\d,]/g, '').replace(',', '.');
var isEntrada = valEl.classList.contains('in');
document.getElementById('ml-titulo').textContent = 'Editar lançamento';
document.getElementById('ml-sub').textContent = 'Ajuste os dados desse lançamento';
document.getElementById('ml-descricao').value = nome;
document.getElementById('ml-valor').value = valorNumerico;
var opts = document.querySelectorAll('#ml-tipo-toggle .toggle-opt');
opts.forEach(function (o) { o.classList.remove('selected'); });
opts[isEntrada ? 0 : 1].classList.add('selected');
document.getElementById('modal-novo-lancamento').classList.add('open');
}
function salvarLancamento() {
var desc = document.getElementById('ml-descricao').value.trim();
var valor = parseFloat(document.getElementById('ml-valor').value) || 0;
if (!desc || valor <= 0) { document.getElementById('ml-descricao').focus(); return; }
var isEntrada = document.querySelector('#ml-tipo-toggle .toggle-opt.selected i').classList.contains('ti-arrow-down-circle');
if (lancamentoEmEdicao) {
lancamentoEmEdicao.querySelector('.nm').textContent = desc;
var valEl = lancamentoEmEdicao.querySelector('.val');
valEl.textContent = (isEntrada ? '+R$ ' : '-R$ ') + valor.toFixed(0);
valEl.className = 'val ' + (isEntrada ? 'in' : 'out');
var iconEl = lancamentoEmEdicao.querySelector('.fin-ledger-icon');
iconEl.className = 'fin-ledger-icon ' + (isEntrada ? 'in' : 'out');
iconEl.querySelector('i').className = 'ti ' + (isEntrada ? 'ti-arrow-down-circle' : 'ti-arrow-up-circle');
} else {
var list = document.getElementById('pd-ledger-list');
var row = document.createElement('div');
row.className = 'fin-ledger-row';
var hora = new Date().toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' });
row.innerHTML = '<div class="fin-ledger-icon ' + (isEntrada ? 'in' : 'out') + '"><i class="ti ' + (isEntrada ? 'ti-arrow-down-circle' : 'ti-arrow-up-circle') + '"></i></div>' +
'<div style="flex:1;"><p class="nm">' + desc + '</p><p class="sub">' + hora + ' · <span class="fin-origin-tag gestao-manual">Lançamento Manual Gestão</span></p></div>' +
'<span class="val ' + (isEntrada ? 'in' : 'out') + '">' + (isEntrada ? '+R$ ' : '-R$ ') + valor.toFixed(0) + '</span>' +
'<button class="fin-edit-btn-txt" onclick="editarLancamento(this)"><i class="ti ti-pencil"></i> Editar</button>';
list.prepend(row);
}
closeModal('modal-novo-lancamento');
document.getElementById('modal-confirma-lancamento').classList.add('open');
}
function lancarGastoPessoal() {
var desc = document.getElementById('gp-descricao').value.trim();
var valor = parseFloat(document.getElementById('gp-valor').value) || 0;
var quem = document.getElementById('gp-quem').value;
var data = document.getElementById('gp-data').value;
if (!desc || valor <= 0 || !data) { document.getElementById('gp-descricao').focus(); return; }
gastosFamiliaDados.push({ id: 'g' + Date.now(), descricao: desc, valor: valor, quem: quem, data: data });
mesAtualDF = data.slice(0, 7);
document.getElementById('gp-descricao').value = '';
document.getElementById('gp-valor').value = '';
document.getElementById('gp-data').value = '';
renderDespesasFamilia();
}
var gastosFamiliaDados = [
{ id: 'g1', descricao: 'Mercado', valor: 680, quem: 'Marcelo', data: '2026-06-18' },
{ id: 'g2', descricao: 'Viagem em família', valor: 3500, quem: 'Lucilene', data: '2026-06-10' },
{ id: 'g3', descricao: 'Presente aniversário', valor: 1500, quem: 'Marcelo', data: '2026-06-05' }
];
var faturamentosMensaisDF = { '2026-06': 42000 };
var mesAtualDF = '2026-06';
var proLaboreDefinidoDF = 4000; // meta mensal combinada — ajuste conforme combinado com a família
function rotuloMesDF(m) {
var meses = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];
var partes = m.split('-');
return meses[parseInt(partes[1], 10) - 1] + ' de ' + partes[0];
}
function mudarMesDespesasFamilia(delta) {
var partes = mesAtualDF.split('-').map(Number);
var d = new Date(partes[0], partes[1] - 1 + delta, 1);
mesAtualDF = d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0');
renderDespesasFamilia();
}
function atualizarFaturamentoDespesasFamilia() {
var val = parseFloat(document.getElementById('df-campo-faturamento').value) || 0;
faturamentosMensaisDF[mesAtualDF] = val;
renderDespesasFamilia();
}
function atualizarProLaboreDF() {
proLaboreDefinidoDF = parseFloat(document.getElementById('df-prolabore-input').value) || 0;
renderDespesasFamilia();
}
function excluirGastoPessoal(id) {
if (!confirm('Excluir este lançamento?')) return;
gastosFamiliaDados = gastosFamiliaDados.filter(function (g) { return g.id !== id; });
renderDespesasFamilia();
}
function iconeGastoFamilia(desc) {
var d = desc.toLowerCase();
if (d.indexOf('mercado') > -1 || d.indexOf('compra') > -1) return 'ti-shopping-cart';
if (d.indexOf('viagem') > -1) return 'ti-plane';
if (d.indexOf('presente') > -1) return 'ti-gift';
if (d.indexOf('farm') > -1) return 'ti-first-aid-kit';
if (d.indexOf('carro') > -1 || d.indexOf('conserto') > -1) return 'ti-car';
return 'ti-receipt';
}
function renderDespesasFamilia() {
var rotuloEl = document.getElementById('df-rotulo-mes');
if (rotuloEl) rotuloEl.textContent = rotuloMesDF(mesAtualDF);
var doMes = gastosFamiliaDados.filter(function (g) { return g.data.slice(0, 7) === mesAtualDF; });
var total = doMes.reduce(function (s, g) { return s + g.valor; }, 0);
var elRetirado = document.getElementById('df-valor-retirado');
if (elRetirado) elRetirado.textContent = 'R$ ' + Math.round(total).toLocaleString('pt-BR');
var faturamento = faturamentosMensaisDF[mesAtualDF] || 0;
var campoFat = document.getElementById('df-campo-faturamento');
if (campoFat) campoFat.value = faturamento || '';
var pct = faturamento > 0 ? Math.round((total / faturamento) * 100) : 0;
var elPct = document.getElementById('df-valor-percentual');
if (elPct) elPct.textContent = pct + '%';
// Pró-labore combinado: barra de consumo
var campoProLabore = document.getElementById('df-prolabore-input');
if (campoProLabore && !campoProLabore.matches(':focus')) campoProLabore.value = proLaboreDefinidoDF || '';
var barra = document.getElementById('df-prolabore-barra');
var textoProLabore = document.getElementById('df-prolabore-texto');
if (barra && textoProLabore) {
if (proLaboreDefinidoDF > 0) {
var pctProLabore = Math.min(Math.round((total / proLaboreDefinidoDF) * 100), 100);
barra.style.width = pctProLabore + '%';
barra.style.background = total > proLaboreDefinidoDF ? 'var(--red)' : (pctProLabore > 80 ? 'var(--amber)' : 'var(--good)');
textoProLabore.textContent = 'R$ ' + Math.round(total).toLocaleString('pt-BR') + ' de R$ ' + proLaboreDefinidoDF.toLocaleString('pt-BR') + ' combinados (' + Math.round((total / proLaboreDefinidoDF) * 100) + '%)';
} else {
barra.style.width = '0%';
textoProLabore.textContent = 'Defina um valor combinado pra acompanhar o quanto já foi retirado.';
}
}
// Alerta: passou do pró-labore combinado OU acima de 30% do faturamento (referência de saúde financeira)
var alertaBox = document.getElementById('df-alerta-limite');
var alertaTexto = document.getElementById('df-alerta-limite-texto');
if (alertaBox && alertaTexto) {
if (proLaboreDefinidoDF > 0 && total > proLaboreDefinidoDF) {
alertaBox.style.display = 'flex';
alertaTexto.textContent = 'A retirada da família já passou o combinado em R$ ' + Math.round(total - proLaboreDefinidoDF).toLocaleString('pt-BR') + ' neste mês.';
} else if (faturamento > 0 && pct > 30) {
alertaBox.style.display = 'flex';
alertaTexto.textContent = 'A retirada da família está em ' + pct + '% do faturamento do mês — acima dos 30% que costumam ser saudáveis pra reinvestir no negócio.';
} else {
alertaBox.style.display = 'none';
}
}
// Evolução — últimos 6 meses
var evoEl = document.getElementById('df-evolucao-lista');
if (evoEl) {
var partesM = mesAtualDF.split('-').map(Number);
var meses6 = [];
for (var i = 5; i >= 0; i--) {
var dEvo = new Date(partesM[0], partesM[1] - 1 - i, 1);
meses6.push(dEvo.getFullYear() + '-' + String(dEvo.getMonth() + 1).padStart(2, '0'));
}
var totaisPorMes = meses6.map(function (m) {
return gastosFamiliaDados.filter(function (g) { return g.data.slice(0, 7) === m; }).reduce(function (s, g) { return s + g.valor; }, 0);
});
var maxEvo = Math.max.apply(null, totaisPorMes.concat([1]));
evoEl.innerHTML = meses6.map(function (m, i) {
var largura = Math.round((totaisPorMes[i] / maxEvo) * 100);
return '<div style="display:flex; align-items:center; gap:10px; margin-bottom:8px;">' +
'<span style="width:70px; font-size:11.5px; color:var(--text-mute); flex-shrink:0;">' + rotuloMesDF(m).split(' de ')[0].slice(0,3) + '/' + m.slice(2,4) + '</span>' +
'<div style="flex:1; background:var(--bg-soft); border-radius:6px; height:16px; overflow:hidden;"><div style="height:100%; width:' + largura + '%; background:' + (m === mesAtualDF ? 'var(--amber)' : '#C9C2B5') + '; border-radius:6px;"></div></div>' +
'<span style="width:80px; text-align:right; font-size:11.5px; font-weight:600;">R$ ' + Math.round(totaisPorMes[i]).toLocaleString('pt-BR') + '</span>' +
'</div>';
}).join('');
}
var lista = document.getElementById('gp-historico-list');
var vazio = document.getElementById('df-vazio-nota');
if (!lista) return;
if (doMes.length === 0) {
lista.innerHTML = '';
if (vazio) vazio.style.display = 'block';
return;
}
if (vazio) vazio.style.display = 'none';
var ordenados = doMes.slice().sort(function (a, b) { return b.data.localeCompare(a.data); });
lista.innerHTML = ordenados.map(function (g) {
var partes = g.data.split('-');
var dataFmt = partes[2] + '/' + partes[1];
return '<div class="fin-ledger-row">' +
'<div class="fin-ledger-icon warn"><i class="ti ' + iconeGastoFamilia(g.descricao) + '"></i></div>' +
'<div style="flex:1;"><p class="nm">' + g.descricao + '</p><p class="sub">' + g.quem + ' · ' + dataFmt + '</p></div>' +
'<span class="val warn">R$ ' + g.valor.toLocaleString('pt-BR') + '</span>' +
'<button class="fin-edit-btn-txt" onclick="excluirGastoPessoal(\'' + g.id + '\')"><i class="ti ti-trash"></i></button>' +
'</div>';
}).join('');
}
// ===== Chat do Marcelo =====
function setChatModeMarcelo(el, mode) {
document.querySelectorAll('#view-chatmarcelo .chat-toggle .opt').forEach(function(o) { o.classList.remove('selected'); });
el.classList.add('selected');
var field = document.getElementById('chat-input-field-marcelo');
field.placeholder = mode === 'system' ? 'Pergunte algo, ex: quantas OS estão em aberto?' : 'Escreva uma mensagem...';
field.dataset.mode = mode;
}
function sendChatMarcelo() {
var field = document.getElementById('chat-input-field-marcelo');
var text = field.value.trim();
if (!text) return;
var msgs = document.getElementById('chat-msgs-marcelo');
var meRow = document.createElement('div');
meRow.className = 'msg-row me';
meRow.innerHTML = '<div class="msg me">' + text + '<div class="msg-meta">Você · agora</div></div>';
msgs.appendChild(meRow);
field.value = '';
var mode = field.dataset.mode || 'people';
setTimeout(function() {
var replyRow = document.createElement('div');
if (mode === 'system') {
replyRow.className = 'msg-row them';
replyRow.innerHTML = '<div class="msg-avatar system"><i class="ti ti-robot"></i></div><div class="msg system">Você tem 6 OS em aberto na oficina, 3 delas ainda sem preço definido.<div class="msg-meta">Sistema · agora</div></div>';
} else {
replyRow.className = 'msg-row them';
replyRow.innerHTML = '<div class="msg-avatar">ME</div><div class="msg them">Combinado!<div class="msg-meta">Meire · agora</div></div>';
}
msgs.appendChild(replyRow);
msgs.scrollTop = msgs.scrollHeight;
}, 600);
msgs.scrollTop = msgs.scrollHeight;
}
var chatFieldMarcelo = document.getElementById('chat-input-field-marcelo');
if (chatFieldMarcelo) chatFieldMarcelo.addEventListener('keypress', function(e) { if (e.key === 'Enter') sendChatMarcelo(); });
// ===== Resumo da operação: sincronizado com o que a Meire lança no sistema dela =====
function aluguemaqLerListaCompartilhada(chave) {
try { var v = localStorage.getItem(chave); return v ? JSON.parse(v) : null; } catch (e) { return null; }
}
function escapeHTMLShared(s) {
return String(s == null ? '' : s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
}
function renderResumoOperacao() {
var pendPagamento = aluguemaqLerListaCompartilhada('aluguemaq_pendencias_pagamento');
var retiradoSemPagar = aluguemaqLerListaCompartilhada('aluguemaq_retirado_sem_pagar');
var temDadosReais = (pendPagamento && pendPagamento.length) || (retiradoSemPagar && retiradoSemPagar.length);
if (!temDadosReais) { return; } // sem dados reais ainda — mantém os exemplos ilustrativos já no HTML
var wrap = document.getElementById('vg-summary-list');
var html = '';
if (retiradoSemPagar && retiradoSemPagar.length) {
var nomesR = retiradoSemPagar.map(function(r) { return escapeHTMLShared(r.cliente); }).join(', ');
html += '<div class="vg-summary-row danger"><i class="ti ti-alert-octagon"></i><div>' +
'<p class="t">' + retiradoSemPagar.length + ' equipamento(s) já foram retirados sem o cliente pagar</p>' +
'<p class="d">' + nomesR + '.</p></div></div>';
}
if (pendPagamento && pendPagamento.length) {
var itensP = pendPagamento.map(function(p) { return escapeHTMLShared(p.cliente) + ' (R$ ' + formatBRNum(p.valor) + ')'; }).join(', ');
html += '<div class="vg-summary-row warn"><i class="ti ti-file-invoice"></i><div>' +
'<p class="t">' + pendPagamento.length + ' contrato(s) estão pendentes de pagamento</p>' +
'<p class="d">' + itensP + '.</p></div></div>';
}
wrap.innerHTML = html || wrap.innerHTML;
var note = document.getElementById('vg-summary-sync-note');
if (note) { note.textContent = 'Atualizado automaticamente a partir dos lançamentos da Meire no sistema dela.'; }
}
function toggleResumoOperacao() {
var list = document.getElementById('vg-summary-list');
var note = document.getElementById('vg-summary-sync-note');
var hint = document.getElementById('resumo-op-hint');
var toggle = document.getElementById('resumo-op-toggle');
var expandido = list.style.display !== 'none';
list.style.display = expandido ? 'none' : 'flex';
note.style.display = expandido ? 'none' : 'block';
hint.textContent = expandido ? '(Ver mais)' : '(Ver menos)';
toggle.classList.toggle('expanded', !expandido);
}
function atualizarSinalSaldoHoje() {
var el = document.getElementById('vg-sign-saldo');
var numEl = el ? el.closest('.vg-card-big').querySelector('.vg-num-big') : null;
if (!el || !numEl) return;
var valor = parseFloat(numEl.textContent.replace('R$', '').replace(/\./g, '').replace(',', '.').trim()) || 0;
el.textContent = valor >= 0 ? '+' : '−';
}
// ===== "Esse mês vs. mês passado": verde se maior que mês passado, âmbar se menor, sinal no quadradinho =====
function atualizarComparativoMes() {
document.querySelectorAll('.mes-compare-card').forEach(function (card) {
var numEl = card.querySelector('.vg-num-big');
var lblEl = card.querySelector('.vg-label-big');
var signEl = card.querySelector('.vg-sign');
if (!numEl || !lblEl || !signEl) return;
var atual = parseFloat(numEl.textContent.replace(/[^\d,-]/g, '').replace(',', '.')) || 0;
var m = lblEl.textContent.match(/R\$\s*([\d.,]+)/);
var passado = m ? parseFloat(m[1].replace(/\./g, '').replace(',', '.')) : 0;
var maiorQueMesPassado = atual >= passado;
card.classList.remove('good', 'warn');
card.classList.add(maiorQueMesPassado ? 'good' : 'warn');
signEl.textContent = maiorQueMesPassado ? '+' : '−';
});
}
carregarPPPeca();
recalcPS();
recalcCompra();
atualizarSinalSaldoHoje();
atualizarComparativoMes();
atualizarResumoEstoqueAtual();
renderCalendarioContas();
renderDespesasFamilia();
initGestaoEquipe();
renderResumoOperacao();
window.addEventListener('storage', function(e) {
if (e.key === 'aluguemaq_pendencias_pagamento' || e.key === 'aluguemaq_retirado_sem_pagar') {
renderResumoOperacao();
sincronizarContasReceberDaMeire();
}
});
var chartOSSemanaInstance = null;
var chartOSDadosPorPeriodo = {
dia: { entram: [0,0,0,0,0,0,4], finalizadas: [0,0,0,0,0,0,3] },
semanal: { entram: [3.2, 2.1, 2.4, 2.0, 3.6, 1.1, 0.3], finalizadas: [1.8, 2.6, 2.3, 2.8, 2.0, 1.4, 0.2] },
quinzenal: { entram: [3.0, 2.3, 2.6, 2.2, 3.4, 1.3, 0.5], finalizadas: [2.0, 2.4, 2.5, 2.6, 2.2, 1.5, 0.4] },
mensal: { entram: [2.9, 2.4, 2.7, 2.3, 3.2, 1.4, 0.6], finalizadas: [2.1, 2.3, 2.6, 2.5, 2.4, 1.6, 0.5] },
personalizado: { entram: [2.9, 2.4, 2.7, 2.3, 3.2, 1.4, 0.6], finalizadas: [2.1, 2.3, 2.6, 2.5, 2.4, 1.6, 0.5] }
};
function atualizarChartOSSemana(periodo) {
if (!chartOSSemanaInstance) return;
var d = chartOSDadosPorPeriodo[periodo] || chartOSDadosPorPeriodo.mensal;
chartOSSemanaInstance.data.datasets[0].data = d.entram;
chartOSSemanaInstance.data.datasets[1].data = d.finalizadas;
chartOSSemanaInstance.update();
}
var ctxOSSemana = document.getElementById('chart-os-semana');
if (ctxOSSemana && typeof Chart !== 'undefined') {
chartOSSemanaInstance = new Chart(ctxOSSemana, {
type: 'bar',
data: {
labels: ['Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado', 'Domingo'],
datasets: [
{ label: 'Média de OS que entram', data: [3.2, 2.1, 2.4, 2.0, 3.6, 1.1, 0.3], backgroundColor: '#DDE7F2', borderRadius: 3 },
{ label: 'Média de OS finalizadas', data: [1.8, 2.6, 2.3, 2.8, 2.0, 1.4, 0.2], backgroundColor: '#2F8F5B', borderRadius: 3 }
]
},
options: {
responsive: true,
maintainAspectRatio: false,
layout: { padding: { top: 18 } },
plugins: { legend: { display: false } },
scales: {
y: { beginAtZero: true, title: { display: true, text: 'média de OS/dia', font: { size: 10.5 } }, grid: { color: '#ECE8DD' }, ticks: { font: { size: 11 } } },
x: { grid: { display: false }, ticks: { font: { size: 11 } } }
}
},
plugins: [{
id: 'valueLabelsOSSemana',
afterDatasetsDraw: function(chart) {
var ctx2 = chart.ctx;
chart.data.datasets.forEach(function(dataset, i) {
var meta = chart.getDatasetMeta(i);
meta.data.forEach(function(bar, idx) {
ctx2.save();
ctx2.font = '9.5px -apple-system, sans-serif';
ctx2.textAlign = 'center';
ctx2.fillStyle = i === 0 ? '#6E6760' : '#2F5A3D';
ctx2.fillText(dataset.data[idx].toFixed(1), bar.x, bar.y - 5);
ctx2.restore();
});
});
}
}]
});
}
var ctxPecas = document.getElementById('chart-pecas-mensal');
if (ctxPecas && typeof Chart !== 'undefined') {
chartPecasInstance = new Chart(ctxPecas, {
data: {
labels: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun'],
datasets: [
{
type: 'bar',
label: 'Peças vendidas',
data: [28, 31, 26, 35, 44, 42],
backgroundColor: '#DDE7F2',
yAxisID: 'y',
borderRadius: 3
},
{
type: 'line',
label: 'Lucro (R$)',
data: [780, 860, 705, 990, 1340, 1260],
borderColor: '#2F8F5B',
backgroundColor: '#2F8F5B',
yAxisID: 'y1',
tension: 0.3,
pointRadius: 4
}
]
},
options: {
responsive: true,
maintainAspectRatio: false,
layout: { padding: { top: 20 } },
plugins: { legend: { display: false } },
scales: {
y: { position: 'left', title: { display: true, text: 'unidades', font: { size: 10.5 } }, grid: { color: '#ECE8DD' }, ticks: { font: { size: 11 } } },
y1: { position: 'right', title: { display: true, text: 'lucro (R$)', font: { size: 10.5 } }, grid: { display: false }, ticks: { font: { size: 11 } } },
x: { grid: { display: false }, ticks: { font: { size: 11 } } }
}
},
plugins: [{
id: 'valueLabelsPecas',
afterDatasetsDraw: function(chart) {
var ctx = chart.ctx;
chart.data.datasets.forEach(function(dataset, i) {
var meta = chart.getDatasetMeta(i);
meta.data.forEach(function(point, idx) {
ctx.save();
ctx.font = '10.5px -apple-system, sans-serif';
ctx.textAlign = 'center';
if (dataset.type === 'bar') {
ctx.fillStyle = '#6E6760';
ctx.fillText(dataset.data[idx], point.x, point.y - 6);
} else {
ctx.fillStyle = '#2F5A3D';
ctx.font = 'bold 10.5px -apple-system, sans-serif';
ctx.fillText('R$' + dataset.data[idx], point.x, point.y - 10);
}
ctx.restore();
});
});
}
}]
});
}
document.addEventListener('click', function(e) {
var opt = e.target.closest('.toggle-opt');
if (opt && opt.closest('#modal-novo-lancamento')) {
opt.parentElement.querySelectorAll('.toggle-opt').forEach(function(o) { o.classList.remove('selected'); });
opt.classList.add('selected');
}
});
// ===== Datas reais (=hoje) nos Painéis do Dia + navegação retroativa =====
var GESTAO_MESES = ['janeiro','fevereiro','março','abril','maio','junho','julho','agosto','setembro','outubro','novembro','dezembro'];
var GESTAO_DIAS = ['domingo','segunda','terça','quarta','quinta','sexta','sábado'];
function gestaoISO(d) { return d.getFullYear() + '-' + String(d.getMonth()+1).padStart(2,'0') + '-' + String(d.getDate()).padStart(2,'0'); }
function gestaoLabelDia(d) { return GESTAO_DIAS[d.getDay()] + ', ' + d.getDate() + ' de ' + GESTAO_MESES[d.getMonth()]; }
var GESTAO_HOJE_ISO = gestaoISO(new Date());
['vg','fc'].forEach(function(prefix) {
var lbl = document.getElementById(prefix + '-data-label');
var inp = document.getElementById(prefix + '-data-input');
if (!lbl || !inp) return;
lbl.textContent = gestaoLabelDia(new Date());
inp.value = GESTAO_HOJE_ISO;
inp.max = GESTAO_HOJE_ISO;
});
function openGestaoDatePicker(prefix) {
var input = document.getElementById(prefix + '-data-input');
if (input.showPicker) { input.showPicker(); } else { input.focus(); input.click(); }
}
function onGestaoDataChange(prefix) {
var val = document.getElementById(prefix + '-data-input').value;
if (!val) return;
var parts = val.split('-');
var d = new Date(parseInt(parts[0],10), parseInt(parts[1],10)-1, parseInt(parts[2],10));
document.getElementById(prefix + '-data-label').textContent = gestaoLabelDia(d);
var banner = document.getElementById(prefix + '-data-banner');
if (val === GESTAO_HOJE_ISO) {
banner.style.display = 'none';
} else {
banner.style.display = 'flex';
document.getElementById(prefix + '-data-banner-text').textContent =
'Você está vendo ' + gestaoLabelDia(d) + '. O histórico diário passará a ser guardado quando o sistema tiver banco de dados — neste protótipo, os números abaixo são do dia de exemplo.';
}
}
function voltarGestaoHoje(prefix) {
document.getElementById(prefix + '-data-input').value = GESTAO_HOJE_ISO;
onGestaoDataChange(prefix);
}
// ===== Gestão Equipe: mês atual + filtro de meses/anos passados =====
(function initEquipeMesFiltro() {
var sel = document.getElementById('eq-mes-filtro');
if (!sel) return;
var agora = new Date();
for (var i = 0; i < 13; i++) {
var d = new Date(agora.getFullYear(), agora.getMonth() - i, 1);
var opt = document.createElement('option');
opt.value = d.getFullYear() + '-' + String(d.getMonth()+1).padStart(2,'0');
opt.textContent = GESTAO_MESES[d.getMonth()].charAt(0).toUpperCase() + GESTAO_MESES[d.getMonth()].slice(1) + '/' + d.getFullYear();
sel.appendChild(opt);
}
var refLabel = document.getElementById('eq-mes-ref-label');
if (refLabel) refLabel.textContent = 'Equipe — mês de referência: ' + GESTAO_MESES[agora.getMonth()] + '/' + agora.getFullYear();
})();
function onEquipeMesChange() {
var sel = document.getElementById('eq-mes-filtro');
var banner = document.getElementById('eq-mes-banner');
var tabela = document.querySelector('#tab-fin-folha-resumo');
var atual = sel.options[0].value;
if (sel.value === atual) {
banner.style.display = 'none';
if (tabela) tabela.style.opacity = '';
} else {
banner.style.display = 'flex';
document.getElementById('eq-mes-banner-text').textContent =
'Você selecionou ' + sel.options[sel.selectedIndex].textContent + '. O fechamento de meses anteriores passará a ficar salvo quando o sistema tiver banco de dados — os números exibidos são do mês atual.';
if (tabela) tabela.style.opacity = '0.45';
}
}
function voltarEquipeMesAtual() {
var sel = document.getElementById('eq-mes-filtro');
sel.selectedIndex = 0;
onEquipeMesChange();
}
</script>
</body>
</html>