diff --git a/.agent/history.json b/.agent/history.json
index ab6533e..e07b512 100644
--- a/.agent/history.json
+++ b/.agent/history.json
@@ -35,5 +35,10 @@
"feature": "Ajuste do painel Status de Cobran\u00e7a: centro com total de boletos e legenda vertical com quantitativo e tipografia fluida.",
"status": "active",
"timestamp": "2026-02-08"
+ },
+ {
+ "feature": "Implementado seletor de per\u00edodo (Anual/Mensal) no dashboard do GR com filtros de m\u00eas e ano.",
+ "status": "active",
+ "timestamp": "2026-02-08"
}
]
\ No newline at end of file
diff --git a/README.md b/README.md
index 4b53ea5..f86b587 100644
--- a/README.md
+++ b/README.md
@@ -124,27 +124,79 @@ PlatformSistemas/
└── package.json # Dependências e scripts
```
-## 🎯 Módulos e Features
+## 🎯 Módulos e Ambientes
-### 💰 Financeiro
-- **financeiro-cnab**: Sistema completo de CNAB para geração de remessas, gestão de favorecidos e pagamentos
-- **financeiro-v2**: Módulo avançado de contas a receber/pagar, conciliação e fluxo de caixa
-- **workspace**: Workspace financeiro com gestão de receitas, despesas e conciliação
+### 👥 RH (Recursos Humanos)
+Módulo desenvolvido para atender integralmente as demandas dos setores de RH e Departamento Pessoal.
+- **Funcionalidades**: Gestão de funcionários, controle de ponto eletrônico, processamento de benefícios e cálculos trabalhistas.
+- **Destaque**: Dashboards de contratos de experiência e acompanhamento de admissões.
-### 🚛 Frota
-- **fleet-v2**: Gestão completa de frota com dashboard, manutenções, abastecimentos e monitoramento
+### 💰 CNAB (Financeiro Remessas)
+Módulo financeiro especializado na interface bancária e automação de pagamentos.
+- **Funcionalidades**: Geração e gerenciamento de remessas CNAB, cadastro de favorecidos, processamento de arquivos de retorno e validação de pagamentos TED/PIX.
-### 👥 Recursos Humanos
-- **rh**: Sistema de RH com ponto eletrônico, gestão de funcionários, benefícios e cálculos
+### 🚛 Prafrota (Gestão de Frota)
+Sistema robusto para o controle operacional de frotas de veículos.
+- **Funcionalidades**: Cadastro técnico de veículos, monitoramento em tempo real, gestão de manutenções preventivas/corretivas e controle de abastecimentos.
-### 📋 Gestão de Registros
-- **gr**: Sistema de gestão de registros com Kanban, cadastro de motoristas e contratos
+### 🏦 Financeiro_V2 + Workspace
+Solução avançada para gestão financeira estratégica e operacional.
+- **Funcionalidades**: Gestão de contas a pagar e receber, fluxo de caixa projetado vs. realizado, conciliação bancária automatizada e dashboards de indicadores financeiros (KPIs).
-### 🔬 AutoLab
-- **autolab**: Gestão de laboratório com estoque, vendas e configurações
+### 🍊 OestePan (Customização Prafrota)
+Segmento especializado do Prafrota customizado especificamente para as necessidades logísticas da Oeste Pan.
+- **Funcionalidades**: Além das funções base do Prafrota, inclui integração com Moki para checklists, gestão específica de sinistros e visualização otimizada para a operação do cliente.
-### 🛠️ Desenvolvimento
-- **dev-tools**: Playground para testes de componentes e debug
+### 🔬 AutoLab (Gestão de Oficinas)
+Módulo em fase de finalização focado na operação técnica de laboratórios e oficinas.
+- **Funcionalidades**: Controle de estoque de peças, gestão de ordens de serviço (vendas), cadastro de clientes e configurações técnicas de atendimento.
+
+---
+
+## 🛣️ Estrutura de Rotas e Variáveis
+
+Cada ambiente consome uma API RESTful estruturada para operações de CRUD (Apresentação, Edição e Exclusão).
+
+### Padrão de Endpoints
+As rotas seguem a nomenclatura do recurso base (ex: `/prafrot`, `/workspace`):
+
+- **Apresentação (GET)**:
+ - `/recurso/apresentar`: Lista principal de dados.
+ - `/recurso/listagem`: Alternativa para listagens simplificadas.
+ - `/recurso/:id`: Detalhamento de um registro específico.
+- **Edição/Atualização (PUT/PATCH)**:
+ - `/recurso/edit`: Atualização de campos específicos.
+ - `/recurso/:id`: Atualização completa do registro.
+ - `/recurso/edit/status_global`: Utilizado em Kanbans para movimentação de cards.
+- **Exclusão (DELETE)**:
+ - `/recurso/delete/:id`: Remoção lógica ou física do registro.
+
+---
+
+## 🎨 Design System & Playground
+
+O projeto utiliza um laboratório de componentes (**Playground**) para garantir consistência visual em todos os ambientes.
+
+### Componentes em Uso (Playground)
+Estes componentes são extraídos do Design System e aplicados nos módulos:
+
+| Componente | Função | Ambientes Principais |
+| :--- | :--- | :--- |
+| **ExcelTable** | Tabela de alta performance com filtros | RH, Prafrota, Financeiro |
+| **ItemDetailPanel** | Painel lateral para visualização de detalhes | Prafrota, OestePan |
+| **DashboardKPICard** | Cards de indicadores com micro-gráficos | Financeiro_V2, Workspace |
+| **StatsGrid** | Grid de estatísticas rápidas | RH, Prafrota |
+| **KanbanBoard** | Gestão visual de fluxos e status | GR, RH |
+| **AutoFillInput** | Inputs inteligentes com busca em tempo real | Workspace, Financeiro |
+| **StatusBadge** | Badges coloridos de status dinâmico | Todos |
+
+### Componentes Disponíveis (Candidatos)
+Componentes presentes no laboratório mas com uso restrito ou em homologação:
+- `ThemeTuner`: Ferramenta de ajuste de temas em runtime.
+- `FinesCard`: Card especializado para visualização de multas.
+- `SmartTable`: Versão experimental de tabelas com auto-ajuste.
+
+---
## 🛠️ Tecnologias
diff --git a/src/components/shared/AutoFillInput.jsx b/src/components/shared/AutoFillInput.jsx
index 6e74e13..30fdf54 100644
--- a/src/components/shared/AutoFillInput.jsx
+++ b/src/components/shared/AutoFillInput.jsx
@@ -18,6 +18,7 @@ import { Button } from '@/components/ui/button';
export const AutoFillInput = ({
label,
placeholder = "Comece a digitar para pesquisar...",
+ value = '',
data = [],
apiRoute,
filterField = "name",
@@ -28,12 +29,18 @@ export const AutoFillInput = ({
className,
icon: Icon = Search
}) => {
- const [query, setQuery] = useState('');
+ const [query, setQuery] = useState(value);
+
+ // Sincroniza o valor externo com o estado interno (útil para edição)
+ useEffect(() => {
+ setQuery(value || '');
+ }, [value]);
const [suggestions, setSuggestions] = useState([]);
const [isOpen, setIsOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const [selectedIndex, setSelectedIndex] = useState(-1);
const containerRef = useRef(null);
+ const inputRef = useRef(null);
// Fecha a lista ao clicar fora do componente
useEffect(() => {
@@ -58,7 +65,12 @@ export const AutoFillInput = ({
).slice(0, 10);
setSuggestions(results);
- setIsOpen(true);
+
+ // Só abre automaticamente se o input estiver focado
+ if (document.activeElement === inputRef.current) {
+ setIsOpen(true);
+ }
+
setIsLoading(false);
} else {
setSuggestions([]);
@@ -109,6 +121,7 @@ export const AutoFillInput = ({
setQuery(e.target.value)}
diff --git a/src/features/financeiro-cnab/hooks/useCnabStore.js b/src/features/financeiro-cnab/hooks/useCnabStore.js
index eb4738e..5df183b 100644
--- a/src/features/financeiro-cnab/hooks/useCnabStore.js
+++ b/src/features/financeiro-cnab/hooks/useCnabStore.js
@@ -10,7 +10,7 @@ export const useCnabStore = create((set) => ({
setPaymentMode: (mode) => set({ paymentMode: mode }),
selectedBank: 'INTER', // 'INTER' ou 'BRADESCO'
setSelectedBank: (bank) => set({ selectedBank: bank }),
- /** Bradesco TED: 'ted' = rota /cnab/bradesco/ted, 'folha_pagamento' = rota /cnab/bradesco/folha_pagamento */
- bradescoRemessaVariant: 'ted', // 'ted' | 'folha_pagamento'
+ /** Bradesco TED: 'ted' = rota /cnab/bradesco/ted, 'folha_pagamento' = rota /cnab/bradesco/folha_pagamento, 'cobranca' = rota /cnab/bradesco/cobranca */
+ bradescoRemessaVariant: 'ted', // 'ted' | 'folha_pagamento' | 'cobranca'
setBradescoRemessaVariant: (variant) => set({ bradescoRemessaVariant: variant }),
}));
diff --git a/src/features/financeiro-cnab/hooks/useGerarRemessa.js b/src/features/financeiro-cnab/hooks/useGerarRemessa.js
index 22a7abe..9870a79 100644
--- a/src/features/financeiro-cnab/hooks/useGerarRemessa.js
+++ b/src/features/financeiro-cnab/hooks/useGerarRemessa.js
@@ -158,6 +158,22 @@ const MODEL_SCHEMAS = {
{ key: 'TIPO_CONTA_FAVORECIDA', label: 'Tipo Conta Favorecida', required: false },
{ key: 'FINALIDADE_TED', label: 'Finalidade TED', required: false },
{ key: 'INFORMACAO', label: 'Informação', required: false }
+ ],
+ BRADESCO_COBRANCA: [
+ { key: 'VALOR', label: 'Valor Título', required: true },
+ { key: 'VENCIMENTO', label: 'Data Vencimento', required: true },
+ { key: 'NOSSO_NUMERO', label: 'Nosso Número', required: true },
+ { key: 'NUMERO_DOCUMENTO', label: 'Número Documento', required: true },
+ { key: 'NOME_PAGADOR', label: 'Nome Pagador', required: true },
+ { key: 'CPF_CNPJ_PAGADOR', label: 'CPF/CNPJ Pagador', required: true },
+ { key: 'ENDERECO', label: 'Endereço', required: true },
+ { key: 'BAIRRO', label: 'Bairro', required: true },
+ { key: 'CEP', label: 'CEP', required: true },
+ { key: 'CIDADE', label: 'Cidade', required: true },
+ { key: 'UF', label: 'UF', required: true },
+ { key: 'DATA_EMISSAO', label: 'Data Emissão', required: true },
+ { key: 'USO_EMPRESA', label: 'Uso Empresa', required: false },
+ { key: 'ESPECIE_TITULO', label: 'Espécie Título', required: false }
]
};
@@ -167,9 +183,15 @@ const MODEL_SCHEMAS = {
* 1. Upload → 2. Mapping → 3. Validate Columns → 4. Validate JSON → 5. Generate Excel → 6. Generate REM
*/
export const useGerarRemessa = () => {
- const { selectedBank, paymentMode, bradescoRemessaVariant } = useCnabStore(); // Banco, modo de pagamento e variante TED Bradesco (ted | folha_pagamento)
+ const { selectedBank, paymentMode, bradescoRemessaVariant } = useCnabStore(); // Banco, modo de pagamento e variante TED Bradesco (ted | folha_pagamento | cobranca)
const [step, setStep] = useState('upload'); // upload | mapping | validate | success
- const paymentType = paymentMode; // Usa o paymentMode do store ao invés de estado local
+
+ // Calcula o tipo de pagamento efetivo para seleção do schema
+ const effectivePaymentType = paymentMode === 'TED' && selectedBank === 'BRADESCO' && bradescoRemessaVariant === 'cobranca'
+ ? 'BRADESCO_COBRANCA'
+ : paymentMode;
+
+ const paymentType = paymentMode;
const [loading, setLoading] = useState(false);
// Dados do arquivo
@@ -282,7 +304,7 @@ export const useGerarRemessa = () => {
console.group('🔗 Mapeamento automático de colunas');
console.log('📊 Headers disponíveis:', rawHeaders);
- MODEL_SCHEMAS[paymentType].forEach(field => {
+ MODEL_SCHEMAS[effectivePaymentType].forEach(field => {
// Tenta múltiplas estratégias de matching
const fieldKey = clean(field.key);
const fieldKeyParts = field.key.split('_').map(p => clean(p)).filter(p => p.length > 2);
@@ -378,7 +400,7 @@ export const useGerarRemessa = () => {
// Converte os dados brutos para o formato esperado pelo backend
const mappedData = rawData.map((row, idx) => {
const newRow = { id: row.id || idx + 1 };
- MODEL_SCHEMAS[paymentType].forEach(field => {
+ MODEL_SCHEMAS[effectivePaymentType].forEach(field => {
const sourceCol = columnMapping[field.key];
newRow[field.key] = sourceCol ? (row[sourceCol] || '') : '';
});
@@ -822,6 +844,7 @@ export const useGerarRemessa = () => {
finalize,
downloadRemessa,
reset,
- schemas: MODEL_SCHEMAS
+ schemas: MODEL_SCHEMAS,
+ effectivePaymentType
};
};
diff --git a/src/features/financeiro-cnab/services/cnabService.js b/src/features/financeiro-cnab/services/cnabService.js
index aa3e085..0d12fab 100644
--- a/src/features/financeiro-cnab/services/cnabService.js
+++ b/src/features/financeiro-cnab/services/cnabService.js
@@ -738,6 +738,9 @@ const cnabService = {
} else if (remessaVariant === 'folha_pagamento') {
endpoint = '/cnab/bradesco/folha_pagamento';
console.log('🏦 [CNAB Service] Usando rota Folha de Pagamento (Bradesco)');
+ } else if (remessaVariant === 'cobranca') {
+ endpoint = '/cnab/bradesco/cobranca';
+ console.log('🏦 [CNAB Service] Usando rota Cobrança (Bradesco)');
} else {
endpoint = '/cnab/bradesco/ted';
}
diff --git a/src/features/financeiro-cnab/views/GerarRemessaView.jsx b/src/features/financeiro-cnab/views/GerarRemessaView.jsx
index 748ef6d..6151b46 100644
--- a/src/features/financeiro-cnab/views/GerarRemessaView.jsx
+++ b/src/features/financeiro-cnab/views/GerarRemessaView.jsx
@@ -30,7 +30,8 @@ const GerarRemessaView = () => {
finalize,
downloadRemessa,
reset,
- schemas
+ schemas,
+ effectivePaymentType
} = useGerarRemessa();
const { selectedBank, setSelectedBank, bradescoRemessaVariant, setBradescoRemessaVariant } = useCnabStore();
@@ -189,9 +190,9 @@ const GerarRemessaView = () => {
* DEVE SER DEFINIDO DEPOIS DE processedValidatedData E validationInfo
*/
const validatedColumns = useMemo(() => {
- if (!schemas[paymentType]) return [];
+ if (!schemas[effectivePaymentType]) return [];
- return schemas[paymentType].map(field => ({
+ return schemas[effectivePaymentType].map(field => ({
header: field.label,
field: field.key,
width: 180,
@@ -340,7 +341,8 @@ const GerarRemessaView = () => {
{[
{ value: 'ted', label: 'TED' },
- { value: 'folha_pagamento', label: 'Folha de pagamento' }
+ { value: 'folha_pagamento', label: 'Folha' },
+ { value: 'cobranca', label: 'Cobrança' }
].map(({ value, label }) => (