portal_publico/static/css/conciliacao-fornecedores.css

1055 lines
21 KiB
CSS

/* "Conciliação de Fornecedores" (Utilitários) — .conc-* — só usado em
conciliacao-fornecedores.html. Carrega perfis-acesso.css também, pra
reaproveitar .pa-table/.pa-table-wrap/.pa-search/.status-pill (mesmo
padrão de nao-conformidades.css/dashboard-contabil.css). */
.conc-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: var(--space-4);
margin-bottom: var(--space-5);
}
.conc-header h2 {
margin: 0 0 var(--space-1);
}
.conc-subtitle {
color: var(--text-secondary);
font-size: 0.9rem;
margin: 0;
max-width: 760px;
}
.conc-empty {
color: var(--text-muted);
font-style: italic;
padding: var(--space-4);
text-align: center;
}
.conc-num {
text-align: right !important;
white-space: nowrap;
}
/* .pa-table td:last-child (perfis-acesso.css) alinha a última coluna à
direita; na tabela de fornecedores ela é a Situação, e numa célula de
aviso com colspan ela é a única. */
.conc-table td:last-child,
.pa-table td.conc-empty {
text-align: left;
}
.pa-table td.conc-empty {
text-align: center;
}
.conc-toolbar {
display: flex;
justify-content: space-between;
align-items: center;
gap: var(--space-3);
flex-wrap: wrap;
margin-bottom: var(--space-3);
}
.conc-toolbar .pa-search {
margin-left: auto;
}
/* ---------------- Formulário de nova conciliação ---------------- */
.conc-form {
background: var(--bg-surface);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
padding: var(--space-5);
margin-bottom: var(--space-5);
animation: pidFadeSlideUp 160ms ease-out;
}
.conc-form__grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: var(--space-3) var(--space-4);
}
.conc-form__empresa {
margin: var(--space-1) 0 0;
font-size: 0.82rem;
font-weight: 600;
color: var(--accent);
min-height: 1.2em;
}
.conc-form__empresa.is-erro {
color: var(--danger);
}
.conc-form__empresa.is-carregando {
color: var(--text-muted);
font-weight: 400;
}
.conc-form__hint {
margin: var(--space-1) 0 0;
font-size: 0.75rem;
color: var(--text-muted);
}
.conc-file-field {
display: flex;
align-items: center;
gap: var(--space-3);
flex-wrap: wrap;
}
.conc-file-field__btn {
display: inline-flex;
align-items: center;
gap: var(--space-2);
cursor: pointer;
}
.conc-file-field__input {
display: none;
}
.conc-file-field__name {
font-size: 0.85rem;
color: var(--text-secondary);
}
/* ---------------- Cabeçalho da empresa ---------------- */
.conc-voltar-btn {
display: inline-flex;
align-items: center;
gap: var(--space-1);
margin-bottom: var(--space-3);
}
.conc-empresa {
display: flex;
justify-content: space-between;
align-items: center;
gap: var(--space-4);
background: var(--bg-surface);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
padding: var(--space-3) var(--space-4);
margin-bottom: var(--space-4);
}
.conc-empresa .btn-outline {
display: inline-flex;
align-items: center;
gap: var(--space-2);
white-space: nowrap;
}
.conc-empresa__codigo {
margin-right: var(--space-2);
font-size: 0.75rem;
font-weight: 700;
color: var(--accent);
letter-spacing: 0.04em;
}
.conc-empresa__nome {
display: inline;
margin: 0;
font-size: 1.05rem;
}
.conc-empresa__meta {
display: flex;
flex-wrap: wrap;
gap: var(--space-1) var(--space-5);
margin-top: 4px;
font-size: 0.78rem;
color: var(--text-secondary);
}
.conc-empresa__meta strong {
color: var(--text-primary);
font-weight: 600;
}
.conc-alertas-gerais {
margin-bottom: var(--space-4);
}
.conc-filtro-alerta {
font-size: 0.82rem;
color: var(--text-secondary);
margin: 0 0 var(--space-3);
}
.conc-filtro-alerta button {
color: var(--accent);
font-weight: 600;
margin-left: var(--space-2);
}
/* ---------------- Faixa de indicadores ---------------- */
.conc-cards {
margin-bottom: var(--space-3);
}
.conc-kpis {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr)) minmax(0, 1.4fr);
background: var(--bg-surface);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
overflow: hidden;
}
.conc-kpi,
.conc-progresso {
padding: var(--space-3) var(--space-4);
display: flex;
flex-direction: column;
gap: 2px;
text-align: left;
font: inherit;
color: inherit;
background: none;
border: 0;
border-right: 1px solid var(--border-subtle);
}
.conc-progresso {
border-right: 0;
justify-content: center;
gap: 6px;
}
button.conc-kpi {
cursor: pointer;
transition: background var(--transition-fast);
}
button.conc-kpi:hover {
background: var(--card-bg-hover);
}
button.conc-kpi.is-active {
box-shadow: inset 0 -2px 0 var(--accent);
}
.conc-kpi__rotulo {
font-size: 0.72rem;
color: var(--text-secondary);
}
.conc-kpi__valor {
font-size: 1.35rem;
font-weight: 700;
line-height: 1.2;
color: var(--text-primary);
}
.conc-kpi__detalhe {
font-size: 0.72rem;
color: var(--text-muted);
}
.conc-kpi--warning .conc-kpi__valor {
color: var(--gold);
}
.conc-kpi--danger .conc-kpi__valor {
color: var(--danger);
}
.conc-progresso__topo {
display: flex;
justify-content: space-between;
font-size: 0.82rem;
color: var(--text-secondary);
}
.conc-progresso__topo strong {
color: var(--text-primary);
}
.conc-progresso__barra {
height: 8px;
border-radius: var(--radius-pill);
background: var(--bg-surface-raised);
overflow: hidden;
}
.conc-progresso__barra span {
display: block;
height: 100%;
background: #2f9e6e;
border-radius: var(--radius-pill);
transition: width 0.3s ease;
}
/* Apontamentos menores em etiquetas clicáveis (filtram a tabela). */
.conc-tags {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--space-2);
margin-top: var(--space-3);
}
.conc-tags__rotulo {
font-size: 0.75rem;
color: var(--text-muted);
}
.conc-tag {
font-size: 0.75rem;
padding: 3px 10px;
border-radius: var(--radius-pill);
border: 1px solid var(--border-subtle);
background: var(--bg-surface);
color: var(--text-secondary);
transition: border-color var(--transition-fast), background var(--transition-fast);
}
.conc-tag strong {
color: var(--text-primary);
}
.conc-tag--warning strong {
color: var(--gold);
}
.conc-tag--danger strong {
color: var(--danger);
}
.conc-tag--info strong {
color: var(--accent);
}
.conc-tag:hover,
.conc-tag.is-active {
border-color: var(--accent);
}
.conc-tag.is-active {
background: rgba(var(--accent-rgb), 0.12);
}
/* ---------------- Chips de filtro ---------------- */
.conc-chip-row {
display: flex;
flex-wrap: wrap;
gap: var(--space-2);
}
.conc-chip {
padding: 4px 12px;
border-radius: var(--radius-pill);
border: 1px solid var(--border-subtle);
background: var(--bg-surface);
color: var(--text-secondary);
font-size: 0.8rem;
font-weight: 600;
transition: border-color var(--transition-fast), color var(--transition-fast), background var(--transition-fast);
}
.conc-chip:hover {
color: var(--text-primary);
}
.conc-chip.is-active {
border-color: var(--accent);
color: var(--accent);
background: rgba(var(--accent-rgb), 0.12);
}
.conc-chip__count {
margin-left: 4px;
font-weight: 700;
opacity: 0.8;
}
/* ---------------- Tabela de fornecedores ---------------- */
.conc-table th[data-sort] {
cursor: pointer;
user-select: none;
white-space: nowrap;
}
.conc-sort-icon {
color: var(--text-muted);
font-size: 0.75rem;
}
.conc-table th.is-sort-asc .conc-sort-icon,
.conc-table th.is-sort-desc .conc-sort-icon {
color: var(--accent);
}
.conc-expand-col {
width: 32px;
}
.conc-row {
cursor: pointer;
}
.conc-row.is-aberta td {
background: var(--bg-surface-raised);
}
.conc-expand-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border-radius: var(--radius-sm);
color: var(--text-secondary);
}
.conc-expand-chevron {
transition: transform var(--transition-fast);
}
.conc-row.is-aberta .conc-expand-chevron {
transform: rotate(90deg);
}
.conc-conta-numero {
font-variant-numeric: tabular-nums;
color: var(--text-secondary);
white-space: nowrap;
}
.conc-fornecedor__nome {
font-weight: 600;
}
.conc-fornecedor__alerta {
display: block;
font-size: 0.75rem;
color: var(--text-muted);
margin-top: 2px;
}
.conc-valor {
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.conc-valor--devedor {
color: var(--danger);
}
.conc-valor--zero {
color: var(--text-muted);
}
.conc-valor--vencido {
color: var(--gold);
font-weight: 600;
}
.conc-status {
display: inline-flex;
align-items: center;
gap: 6px;
white-space: nowrap;
}
.conc-status svg {
flex-shrink: 0;
}
.status-pill--ok {
color: #2f9e6e;
background: rgba(47, 158, 110, 0.14);
}
.status-pill--danger {
color: var(--danger);
background: rgba(var(--danger-rgb), 0.14);
}
.status-pill--warning {
color: var(--gold);
background: rgba(var(--gold-rgb), 0.18);
}
.status-pill--neutral {
color: var(--text-secondary);
background: var(--bg-surface-raised);
}
.status-pill--validada {
color: var(--accent);
background: rgba(var(--accent-rgb), 0.14);
}
/* ---------------- Detalhe expandido ---------------- */
.pa-table td.conc-detail-cell {
background: var(--bg-surface-raised);
padding: var(--space-4) var(--space-5);
text-align: left;
cursor: default;
}
/* Só a célula externa da linha de detalhe (`>`): sem isso a regra pegava
também todas as células das sub-tabelas de lançamentos. */
.conc-detail-row:hover > td {
background: var(--bg-surface-raised);
}
.conc-detail {
display: flex;
flex-direction: column;
gap: var(--space-4);
animation: pidFadeIn 140ms ease-out;
}
.conc-alertas {
display: flex;
flex-direction: column;
gap: var(--space-2);
margin: 0;
padding: 0;
list-style: none;
}
.conc-alerta {
display: flex;
align-items: flex-start;
gap: var(--space-2);
font-size: 0.85rem;
padding: var(--space-2) var(--space-3);
border-radius: var(--radius-sm);
background: var(--bg-surface);
border-left: 3px solid var(--border-subtle);
color: var(--text-primary);
}
.conc-alerta--alta {
border-left-color: var(--danger);
}
.conc-alerta--media {
border-left-color: var(--gold);
}
.conc-alerta--baixa {
border-left-color: var(--accent);
}
.conc-alerta__severidade {
font-size: 0.68rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
padding-top: 2px;
min-width: 44px;
}
.conc-alerta--alta .conc-alerta__severidade {
color: var(--danger);
}
.conc-alerta--media .conc-alerta__severidade {
color: var(--gold);
}
.conc-alerta--baixa .conc-alerta__severidade {
color: var(--accent);
}
.conc-detail__secao-titulo {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-3);
flex-wrap: wrap;
margin: 0 0 var(--space-2);
}
.conc-detail__secao-titulo h4 {
margin: 0;
font-size: 0.9rem;
}
.conc-detail__titulo-grupo {
display: flex;
align-items: center;
gap: var(--space-4);
flex-wrap: wrap;
}
.conc-detail__acoes {
display: flex;
align-items: center;
gap: var(--space-3);
flex-wrap: wrap;
}
.conc-selecao-resumo {
font-size: 0.8rem;
color: var(--text-secondary);
}
.conc-selecao-resumo strong {
color: var(--text-primary);
}
.conc-subtabela {
width: 100%;
border-collapse: collapse;
background: var(--bg-surface);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-sm);
overflow: hidden;
}
.conc-subtabela th {
text-align: left;
font-size: 0.68rem;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--text-muted);
padding: var(--space-2) var(--space-3);
border-bottom: 1px solid var(--border-subtle);
}
.conc-subtabela td {
padding: var(--space-2) var(--space-3);
border-bottom: 1px solid var(--border-subtle);
font-size: 0.82rem;
color: var(--text-primary);
vertical-align: top;
}
.conc-subtabela tr:last-child td {
border-bottom: none;
}
/* As sub-tabelas ficam dentro da .pa-table de fornecedores, então
`.pa-table tr:hover td` (perfis-acesso.css) casava com toda célula delas
sempre que o mouse estava em qualquer ponto da linha de detalhe, clareando
todos os lançamentos de uma vez. Estas três regras têm especificidade
maior que aquela: fundo neutro por padrão, destaque só na linha sob o
mouse, e seleção por último para vencer o hover. */
.pa-table .conc-subtabela tr td {
background: transparent;
}
.pa-table .conc-subtabela tbody tr:hover td {
background: var(--card-bg-hover);
}
.pa-table .conc-subtabela tr.is-selecionado td {
background: rgba(var(--accent-rgb), 0.12);
}
.conc-subtabela__check {
width: 28px;
}
.conc-historico {
max-width: 380px;
}
.conc-historico__contrapartida {
display: block;
font-size: 0.72rem;
color: var(--text-muted);
}
.conc-natureza {
font-size: 0.7rem;
font-weight: 700;
padding: 1px 6px;
border-radius: var(--radius-pill);
}
.conc-natureza--C {
color: var(--accent);
background: rgba(var(--accent-rgb), 0.12);
}
.conc-natureza--D {
color: var(--coral);
background: rgba(var(--coral-rgb), 0.14);
}
.conc-situacao {
font-size: 0.78rem;
color: var(--text-secondary);
}
.conc-situacao--vencido,
.conc-situacao--nao_vinculado {
color: var(--gold);
}
.conc-situacao--excedente {
color: var(--danger);
font-weight: 600;
}
.conc-vinculo {
border: 1px solid var(--border-subtle);
border-radius: var(--radius-sm);
background: var(--bg-surface);
margin-bottom: var(--space-2);
}
.conc-vinculo__header {
display: flex;
justify-content: space-between;
align-items: center;
gap: var(--space-3);
padding: var(--space-2) var(--space-3);
border-bottom: 1px solid var(--border-subtle);
font-size: 0.8rem;
color: var(--text-secondary);
}
.conc-vinculo__header strong {
color: var(--text-primary);
}
.conc-vinculo .conc-subtabela {
border: none;
border-radius: 0;
}
.conc-vinculos-lista {
max-height: 420px;
overflow-y: auto;
}
.conc-validacao {
display: flex;
flex-direction: column;
gap: var(--space-2);
border-top: 1px solid var(--border-subtle);
padding-top: var(--space-4);
}
.conc-validacao textarea {
width: 100%;
min-height: 64px;
resize: vertical;
padding: var(--space-2) var(--space-3);
border-radius: var(--radius-sm);
border: 1px solid var(--border-subtle);
background: var(--bg-surface);
color: var(--text-primary);
font: inherit;
font-size: 0.85rem;
}
.conc-validacao textarea:focus {
outline: none;
border-color: var(--accent);
}
.conc-validacao__info {
font-size: 0.78rem;
color: var(--text-muted);
}
.conc-btn-sm {
padding: 4px 12px;
font-size: 0.8rem;
}
.conc-sem-pendencias {
font-size: 0.85rem;
color: var(--text-muted);
font-style: italic;
margin: 0;
}
.conc-detail button:disabled {
opacity: 0.45;
cursor: not-allowed;
}
/* Checkbox de "validado" no fim de cada linha de fornecedor (atalho do
botão "Marcar como validada" do detalhe, mesmo endpoint). */
.conc-table th.conc-validado-col,
.conc-table td.conc-validado-col {
width: 90px;
text-align: center !important;
}
.conc-validado-check {
width: 18px;
height: 18px;
cursor: pointer;
accent-color: var(--accent);
}
/* ---------------- Toggle de validadas ---------------- */
.conc-toggle {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 0.8rem;
color: var(--text-secondary);
white-space: nowrap;
flex-shrink: 0;
margin-left: auto;
cursor: pointer;
}
.conc-toggle input {
accent-color: var(--accent);
}
.conc-toggle .conc-chip__count {
margin-left: 0;
}
/* ---------------- Filtros e cabeçalho fixos ao rolar ---------------- */
/* Sempre com `>`: as sub-tabelas de lançamentos ficam dentro desta tabela,
e um seletor descendente fixava o thead delas no meio da lista. */
/* A página rola pela janela e a .topbar (layout.css) já é sticky com
--topbar-height; os filtros ficam logo abaixo dela e o cabeçalho da
tabela logo abaixo dos filtros (altura fixa de --conc-toolbar-altura
para o cálculo bater). .pa-table-wrap tem overflow:hidden, que anularia
o sticky do thead: esta tabela abre mão dele. */
.conc-detail-view,
#conc-detail-view {
--conc-toolbar-altura: 52px;
--conc-thead-altura: 41px;
--conc-selecao-altura: 44px;
}
.conc-toolbar--fixa {
position: sticky;
top: var(--topbar-height);
z-index: 15;
flex-wrap: nowrap;
height: var(--conc-toolbar-altura);
margin-bottom: 0;
background: var(--bg-canvas);
}
.conc-toolbar--fixa .pa-search {
margin-left: 0;
width: 210px;
flex-shrink: 0;
}
.conc-table-wrap {
overflow: visible;
}
.conc-table > thead > tr > th {
position: sticky;
top: calc(var(--topbar-height) + var(--conc-toolbar-altura));
z-index: 10;
}
.conc-table > thead > tr > th:first-child {
border-top-left-radius: var(--radius-md);
}
.conc-table > thead > tr > th:last-child {
border-top-right-radius: var(--radius-md);
}
/* ---------------- Linhas compactas ---------------- */
.conc-table tbody tr.conc-row > td {
padding-top: 7px;
padding-bottom: 7px;
}
.conc-fornecedor__nome {
font-size: 0.86rem;
}
.conc-fornecedor__alerta {
font-size: 0.72rem;
}
/* Coluna do fornecedor flexível e cortada com reticências (max-width:0 +
largura em % faz a célula ceder espaço em vez de alargar a tabela). */
.conc-table tbody tr.conc-row > td:nth-child(3) {
max-width: 0;
width: 40%;
}
.conc-table tbody tr.conc-row > td:nth-child(3) span {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* "Recolher" no fim da área expandida, à direita das ações da observação. */
.conc-recolher-btn {
display: inline-flex;
align-items: center;
gap: 4px;
margin-left: auto;
}
/* ---------------- Sugestões (dedução da ferramenta, não fato) ---------------- */
.conc-sugestao-tag {
display: inline-block;
margin-right: 6px;
padding: 0 6px;
border-radius: var(--radius-pill);
border: 1px dashed var(--text-muted);
font-size: 0.64rem;
font-weight: 700;
font-style: normal;
letter-spacing: 0.03em;
text-transform: uppercase;
color: var(--text-secondary);
vertical-align: 1px;
}
/* Sugestão numa linha própria, abaixo do fato, em tom neutro: não herda a
cor de alerta da situação (dourado/vermelho), que é do fato. */
.conc-sugestao {
display: block;
margin-top: 3px;
font-style: italic;
font-weight: 400;
color: var(--text-muted);
}
.conc-vinculo--parcial {
border-left: 3px solid var(--gold);
}
/* ---------------- Barra de seleção fixa na conta expandida ---------------- */
/* Com muitos lançamentos, a soma da seleção e o "Vincular selecionados"
ficam fixos logo abaixo do thead da tabela de fornecedores (pedido do
usuário), e o thead da lista de pendentes logo abaixo da barra. O sticky
vale dentro da célula de detalhe: some quando a conta sai da tela. */
.conc-selecao-barra {
position: sticky;
top: calc(var(--topbar-height) + var(--conc-toolbar-altura) + var(--conc-thead-altura));
z-index: 9;
min-height: var(--conc-selecao-altura);
margin: 0 calc(-1 * var(--space-5)) 0;
padding: var(--space-2) var(--space-5);
background: var(--bg-surface-raised);
border-bottom: 1px solid var(--border-subtle);
}
/* overflow:hidden (do raio da borda) faria a tabela virar o contêiner de
rolagem do próprio thead e anularia o sticky */
.conc-subtabela--pendentes {
overflow: visible;
}
.conc-subtabela--pendentes > thead > tr > th {
position: sticky;
top: calc(var(--topbar-height) + var(--conc-toolbar-altura) + var(--conc-thead-altura) + var(--conc-selecao-altura));
z-index: 8;
background: var(--bg-surface);
}
/* Linha do lançamento pendente é clicável (marca/desmarca a seleção). */
.conc-subtabela--pendentes tbody tr {
cursor: pointer;
user-select: none;
}
.conc-subtabela--pendentes tbody tr .conc-historico {
user-select: text;
}
.conc-subtabela__check input {
cursor: pointer;
accent-color: var(--accent);
}
.conc-vinculo__acoes {
display: inline-flex;
gap: var(--space-2);
flex-shrink: 0;
}
.conc-vinculo__acoes button:disabled {
opacity: 0.45;
cursor: not-allowed;
}
/* ---------------- Razão desde a primeira pendência ---------------- */
/* Linhas já vinculadas aparecem apagadas, sem seleção; passando o mouse,
o vínculo inteiro (as outras linhas dele) acende. */
.pa-table .conc-subtabela--pendentes tbody tr.conc-linha--vinculada {
cursor: default;
}
/* Toggle "Ocultar conciliados" ao lado do título do razão. */
.pa-table .conc-subtabela--pendentes.is-ocultando-conciliados tbody tr.conc-linha--vinculada {
display: none;
}
.pa-table .conc-subtabela--pendentes tbody tr.conc-linha--vinculada td {
color: var(--text-muted);
}
.pa-table .conc-subtabela--pendentes tbody tr.conc-linha--vinculada.is-grupo td {
background: rgba(47, 158, 110, 0.1);
color: var(--text-primary);
}
.conc-valor--saldo {
color: var(--text-secondary);
}
.conc-vinculado {
display: inline-flex;
align-items: center;
flex-wrap: wrap;
gap: 6px;
}
.conc-vinculado-tag {
font-size: 0.68rem;
font-weight: 700;
padding: 1px 7px;
border-radius: var(--radius-pill);
color: #2f9e6e;
background: rgba(47, 158, 110, 0.14);
}
.conc-vinculado__tipo {
font-size: 0.76rem;
}
.conc-link-btn {
font-size: 0.76rem;
font-weight: 600;
color: var(--accent);
background: none;
border: 0;
padding: 0;
cursor: pointer;
}
.conc-link-btn:hover {
text-decoration: underline;
}