git add .
# 🎯 CURSOR RULES - PRAFROTA ANGULAR WORKSPACE
# Otimização de contexto para IA - Configuração específica do projeto

## 📖 CONTEXTO DO PROJETO
- **Nome**: PraFrota - Sistema de Gestão de Frota
- **Tecnologia**: Angular 19.2.x + TypeScript 5.5.x + Node 20.x
- **Arquitetura**: Multi-projeto workspace com componentes standalone
- **Padrão Principal**: BaseDomainComponent para domínios ERP

## 🏗️ ESTRUTURA DE PROJETOS
```
projects/
├── idt_app/          # Aplicação principal PraFrota
└── libs/             # Bibliotecas compartilhadas
```

## 🎯 PADRÕES OBRIGATÓRIOS

### Componentes
- SEMPRE usar componentes standalone
- Seguir padrão BaseDomainComponent para domínios ERP
- Template mínimo: `drivers.component.ts` como referência perfeita
- Nomenclatura: kebab-case para arquivos, PascalCase para classes
- **SEMPRE arquivos separados**: templateUrl e styleUrl (nunca inline para ERP SaaS)
- **Dashboard Tab System**: Usar `showDashboardTab: true` para habilitar dashboard automático

### Services
- Injectable com `providedIn: 'root'`
- **SEMPRE usar ApiClientService** (NUNCA HttpClient diretamente)
- Implementar DomainService<T> para domínios ERP
- Suffix obrigatório: `Service`
- Localização: `shared/services/` ou `domain/[nome]/`
- **NOMENCLATURA OBRIGATÓRIA**: `create`, `update`, `delete`, `getById`, `get[Domain]s`

### Interfaces
- PascalCase, suffix `.interface.ts`
- Localização: `shared/interfaces/` ou junto ao domínio
- Exportar com naming claro

### Formulários
- SEMPRE usar Reactive Forms (FormBuilder)
- Validação com Validators do Angular
- Componentes de formulário reutilizáveis

## 🚀 TEMPLATE PERFEITO - BaseDomainComponent + Registry Pattern

```typescript
@Component({
  selector: 'app-[domain]',
  standalone: true,
  imports: [CommonModule, TabSystemComponent],
  providers: [DatePipe],
  templateUrl: './[domain].component.html',
  styleUrl: './[domain].component.scss'
})
export class [Domain]Component extends BaseDomainComponent<[Entity]> {
  constructor(
    service: [Domain]Service,
    titleService: TitleService,
    headerActionsService: HeaderActionsService,
    cdr: ChangeDetectorRef,
    private datePipe: DatePipe,
    private tabFormConfigService: TabFormConfigService
  ) {
    super(titleService, headerActionsService, cdr, service);
    
    this.register[Domain]FormConfig();
  }

  protected override getDomainConfig(): DomainConfig {
    return {
      domain: '[domain]',
      title: '[Título Plural]',
      entityName: '[entidade]',
      subTabs: ['dados', 'documentos'],
      showDashboardTab: true, // ✅ NOVO: Habilitar Dashboard Tab
      dashboardConfig: {      // ✅ NOVO: Configuração opcional do dashboard
        title: 'Dashboard de [Título Plural]',
        customKPIs: [
          {
            id: 'custom-kpi',
            label: 'KPI Customizado',
            value: '100%',
            icon: 'fas fa-chart-line',
            color: 'success',
            trend: 'up',
            change: '+5%'
          }
        ]
      },
      columns: [
        { field: "id", header: "Id", sortable: true, filterable: true },
        { field: "name", header: "Nome", sortable: true, filterable: true },
        // ... outras colunas
      ]
    };
  }

  get[Domain]FormConfig(): TabFormConfig {
    return {
      title: 'Dados do [Entidade]',
      entityType: '[domain]',
      fields: [
        // ... configuração específica dos campos
      ],
      subTabs: [
        // ... configuração das sub-abas
      ]
    };
  }

  private register[Domain]FormConfig(): void {
    this.tabFormConfigService.registerFormConfig('[domain]', () => this.get[Domain]FormConfig());
  }
}
```

## 🚫 PADRÕES DE NOMENCLATURA OBRIGATÓRIOS - Services

### ✅ MÉTODOS CORRETOS (Seguir SEMPRE):
```typescript
// ✅ Métodos da interface DomainService (OBRIGATÓRIOS)
getEntities(page: number, pageSize: number, filters: any): Observable<any>
create(data: any): Observable<Entity>
update(id: any, data: any): Observable<Entity>

// ✅ Métodos específicos padrão (OBRIGATÓRIOS)
getById(id: string): Observable<Entity>
delete(id: string): Observable<void>
get[Domain]s(page: number, limit: number, filters?: any): Observable<PaginatedResponse<Entity>>
```

### ❌ MÉTODOS INCORRETOS (NUNCA usar):
```typescript
// ❌ ERRADO - Métodos com sufixos específicos
createRoute() // ❌ Usar apenas: create()
updateRoute() // ❌ Usar apenas: update()  
deleteRoute() // ❌ Usar apenas: delete()
getRoute()    // ❌ Usar apenas: getById()

// ❌ ERRADO - Métodos não padronizados
addEntity()   // ❌ Usar: create()
editEntity()  // ❌ Usar: update()
removeEntity() // ❌ Usar: delete()
findById()    // ❌ Usar: getById()
```

### 📋 LISTA DE CONFORMIDADE:
- ✅ VehiclesService: `create`, `update`, `getById`, `delete`, `getVehicles`
- ✅ DriversService: `create`, `update`, `getById`, `delete`, `getDrivers`  
- ✅ RoutesService: `create`, `update`, `getById`, `delete`, `getRoutes`
- ✅ FinancialCategoriesService: `create`, `update`, `getById`, `delete`
- ✅ AccountPayableService: `create`, `update`, `getById`, `delete`

## 🎯 TEMPLATE PERFEITO - Service com ApiClientService

```typescript
import { Injectable } from '@angular/core';
import { Observable, of, map } from 'rxjs';
import { catchError } from 'rxjs/operators';

import { [Entity] } from './[entity].interface';
import { ApiClientService } from '../../shared/services/api/api-client.service';
import { DomainService } from '../../shared/components/base-domain/base-domain.component';
import { PaginatedResponse } from '../../shared/interfaces/paginate.interface';

@Injectable({
  providedIn: 'root'
})
export class [Domain]Service implements DomainService<[Entity]> {

  constructor(
    private apiClient: ApiClientService
  ) {}

  // ========================================
  // 🎯 IMPLEMENTAÇÃO DA INTERFACE DOMAINSERVICE
  // ========================================

  getEntities(page: number, pageSize: number, filters: any): Observable<{
    data: [Entity][];
    totalCount: number;
    pageCount: number;
    currentPage: number;
  }> {
    return this.get[Domain]s(page, pageSize, filters).pipe(
      map(response => ({
        data: response.data,
        totalCount: response.totalCount,
        pageCount: response.pageCount,
        currentPage: response.currentPage
      }))
    );
  }

  create(data: any): Observable<[Entity]> {
    return this.apiClient.post<[Entity]>('[domain]s', data);
  }

  update(id: any, data: any): Observable<[Entity]> {
    return this.apiClient.patch<[Entity]>(`[domain]s/${id}`, data);
  }

  // ========================================
  // 🎯 MÉTODOS ESPECÍFICOS DO DOMÍNIO
  // ========================================

  get[Domain]s(
    page = 1,
    limit = 10,
    filters?: any
  ): Observable<PaginatedResponse<[Entity]>> {
    
    let url = `[domain]s?page=${page}&limit=${limit}`;
    
    if (filters) {
      const params = new URLSearchParams();
      
      for (const [key, value] of Object.entries(filters)) {
        if (value) {
          params.append(key, value.toString());
        }
      }
      
      if (params.toString()) {
        url += `&${params.toString()}`;
      }
    }

    return this.apiClient.get<PaginatedResponse<[Entity]>>(url).pipe(
      catchError(error => {
        console.warn('⚠️ Backend indisponível, usando dados de fallback', error);
        return of(this.getFallbackData(page, limit, filters));
      })
    );
  }

  getById(id: string): Observable<[Entity]> {
    return this.apiClient.get<[Entity]>(`[domain]s/${id}`);
  }

  delete(id: string): Observable<void> {
    return this.apiClient.delete<void>(`[domain]s/${id}`);
  }

  private getFallbackData(page: number, limit: number, filters?: any): PaginatedResponse<[Entity]> {
    // Implementar dados mock para fallback
    return {
      data: [],
      totalCount: 0,
      pageCount: 0,
      currentPage: page
    };
  }
}
```

### 🎯 Registry Pattern - Funcionamento:
1. **Component** registra configuração no construtor (automático)
2. **TabFormConfigService** consulta registry primeiro (inteligente)  
3. **Sistema** funciona sem modificações (escalável)
4. **Prioridade**: Registry > Service > Default

## 🎯 TEMPLATE HTML OBRIGATÓRIO - BaseDomainComponent

### Template Padrão (OBRIGATÓRIO)
TODOS os componentes que estendem BaseDomainComponent DEVEM usar exatamente este HTML:

```html
<div class="domain-container">
  <div class="main-content">
    <app-tab-system
      #tabSystem
      [config]="tabConfig"
      [events]="tabEvents"
      [showDebugInfo]="false"
      (tabSelected)="onTabSelected($event)"
      (tabClosed)="onTabClosed($event)"
      (tabAdded)="onTabAdded($event)"
      (tableEvent)="onTableEvent($event)">
    </app-tab-system>
  </div>
</div>
```

### ❌ NUNCA FAZER:
- `<app-tab-system></app-tab-system>` (sem bindings)
- Templates customizados para domínios ERP
- Estruturas HTML diferentes

### ✅ SEMPRE FAZER:
- Usar exatamente o template acima
- Incluir todos os bindings de eventos
- Manter estrutura domain-container > main-content
- Referenciar #tabSystem para controle programático

## 🔗 APIS DISPONÍVEIS

### PraFrota Backend
- **Base**: `https://prafrota-be-bff-tenant-api.grupopra.tech`
- **Auth**: Bearer JWT
- **Endpoints**: `/api/v1/[domain]`

### ViaCEP
- **Proxy**: `/api/ws/*`
- **Uso**: Busca de endereços por CEP

### Mercado Live Routes
- **Tipos**: first_mile, line_haul, last_mile
- **Paginação**: Client-side
- **Arquivo**: `mercado-live-routes-data.json`

## 📁 CONVENÇÕES DE ARQUIVO

### Estrutura Component
```
domain/[nome]/
├── [nome].component.ts
├── [nome].component.html
├── [nome].component.scss
├── [nome].service.ts
├── [nome].interface.ts
└── README.md
```

### Imports Essenciais
```typescript
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ReactiveFormsModule } from '@angular/forms';
import { Observable } from 'rxjs';
```

## 🎨 MATERIAL DESIGN
- Usar Angular Material quando necessário
- Preferir componentes customizados em `shared/components/`
- Sistema de tema configurado em CSS variables

## 🔧 COMANDOS DE DESENVOLVIMENTO

### ⚠️ IMPORTANTE: SERVIDOR DE DESENVOLVIMENTO
**NUNCA execute `ng serve` ou comandos similares de desenvolvimento!**
- O servidor já está SEMPRE rodando em modo debug via launch.json
- Aplicação disponível na porta 4200 (localhost:4200)
- Hot reload configurado automaticamente
- Debug mode ativo por padrão

### ✅ COMANDOS PERMITIDOS (Execute livremente):
```bash
# Build de Produção
ng build idt_app --configuration production

# Build de Desenvolvimento
ng build idt_app --configuration development

# Testes
ng test idt_app

# Geração de componentes/services
ng generate component domain/exemplo
ng generate service shared/services/exemplo
```

## 📝 REGRAS ESPECÍFICAS PARA IA

### Quando sugerir código:
1. SEMPRE verificar se existe template similar em `domain/drivers/`
2. PRIORIZAR reutilização de componentes em `shared/`
3. USAR BaseDomainComponent para novos domínios ERP
4. SEGUIR padrão MCP definido em `.mcp/config.json`

### Respostas devem incluir:
- ✅ Código funcional e testável
- ✅ Imports necessários
- ✅ Tipagem TypeScript forte
- ✅ Comentários explicativos em português
- ✅ Padrões do projeto

### NÃO fazer:
- ❌ Componentes não-standalone
- ❌ Services sem Observable  
- ❌ Formulários template-driven
- ❌ Imports desnecessários
- ❌ Console.log em produção
- ❌ **COMANDOS DE SERVIDOR: `ng serve`, `npm start` - já está rodando via debug!**
- ❌ **Templates/styles inline: Use sempre arquivos separados para ERP SaaS**
- ❌ **HttpClient diretamente: SEMPRE usar ApiClientService**
- ❌ **HTML sem bindings: `<app-tab-system></app-tab-system>` está ERRADO**
- ❌ **Construtores com ServiceAdapter: usar service diretamente no super()**
- ❌ **Métodos com sufixos: `createRoute`, `updateRoute`, `deleteRoute` - usar apenas `create`, `update`, `delete`**
- ❌ **Métodos genéricos: `getRoute` - usar `getById` para busca por ID**

### ✅ PODE fazer livremente:
- ✅ **`ng build`** - Qualquer configuração
- ✅ **`ng test`** - Executar testes
- ✅ **`ng generate`** - Criar componentes/services
- ✅ **`npm install`** - Instalar dependências

## 📊 DASHBOARD TAB SYSTEM ⭐ **NOVO**

### Funcionalidade
- **Aba Dashboard**: Aparece ANTES da aba "Lista de [Domínio]"
- **KPIs Automáticos**: Total, Ativos, Recentes (últimos 7 dias)
- **KPIs Customizados**: Definidos por domínio
- **Responsivo**: Desktop e mobile
- **Dark Mode**: Suporte completo

### Como Usar
```typescript
// Configuração mínima
showDashboardTab: true

// Configuração avançada
showDashboardTab: true,
dashboardConfig: {
  title: 'Dashboard de Motoristas',
  customKPIs: [
    {
      id: 'drivers-with-license',
      label: 'Com CNH Válida',
      value: '85%',
      icon: 'fas fa-id-card',
      color: 'success',
      trend: 'up',
      change: '+3%'
    }
  ]
}
```

### Ordem das Abas
1. **Dashboard de [Domínio]** (se habilitado)
2. **Lista de [Domínio]** (sempre)
3. **Abas de Edição** (conforme necessário)

### Cores KPI
- `primary`: Azul (padrão)
- `success`: Verde (positivo)
- `warning`: Amarelo (atenção)
- `danger`: Vermelho (crítico)
- `info`: Azul claro (informativo)

### Ícones Recomendados
- `fas fa-list`: Total
- `fas fa-check-circle`: Ativos
- `fas fa-plus-circle`: Novos
- `fas fa-chart-line`: Crescimento
- `fas fa-users`: Usuários
- `fas fa-car`: Veículos
- `fas fa-dollar-sign`: Financeiro

## 🎯 FOCO PRINCIPAL
- **Template de Referência**: `projects/idt_app/src/app/domain/drivers/drivers.component.ts`
- **Documentação MCP**: `.mcp/config.json` e `.mcp/README.md`
- **Padrões de UI**: `shared/components/data-table/` e `shared/components/tab-system/`
- **Dashboard System**: `shared/components/domain-dashboard/` ⭐ **NOVO**

## 📚 CONTEXTO ADICIONAL
- Projeto em produção com usuários ativos
- Performance crítica para tabelas grandes
- Responsive design obrigatório
- Acessibilidade WCAG 2.1 AA
- SEO otimizado para PWA

---
Este arquivo deve ser usado pela IA para entender o contexto completo do projeto e fornecer respostas precisas e alinhadas com os padrões estabelecidos. 