# 🎯 Currency Input - Exemplo de Integração no PraFrota

## 📋 Uso em FormConfig

Exemplo de como adicionar campos de moeda em qualquer domínio do PraFrota:

### 💰 Exemplo 1: Campo de Valor Simples

```typescript
// Em qualquer component que estende BaseDomainComponent
getFormConfig(): TabFormConfig {
  return {
    title: 'Dados do Produto',
    entityType: 'product',
    fields: [],
    subTabs: [
      {
        id: 'dados',
        label: 'Dados Principais',
        fields: [
          {
            key: 'preco',
            label: 'Preço',
            type: 'currency-input',
            required: true,
            min: 0.01,
            max: 99999.99,
            placeholder: 'Digite o preço'
          }
        ]
      }
    ]
  };
}
```

### 💱 Exemplo 2: Múltiplas Moedas

```typescript
// Campos com diferentes moedas
{
  id: 'financeiro',
  label: 'Dados Financeiros',
  fields: [
    {
      key: 'valorBrl',
      label: 'Valor em Reais',
      type: 'currency-input',
      required: true,
      currency: 'BRL',
      locale: 'pt-BR'
    },
    {
      key: 'valorUsd',
      label: 'Valor em Dólares',
      type: 'currency-input',
      required: false,
      currency: 'USD',
      locale: 'en-US'
    },
    {
      key: 'valorEur',
      label: 'Valor em Euros',
      type: 'currency-input',
      required: false,
      currency: 'EUR',
      locale: 'de-DE'
    }
  ]
}
```

### 💼 Exemplo 3: Domínio Financeiro Completo

```typescript
// projects/idt_app/src/app/domain/finances/account-payable/account-payable.component.ts
export class AccountPayableComponent extends BaseDomainComponent<AccountPayable> {
  
  protected override getDomainConfig(): DomainConfig {
    return {
      domain: 'account-payable',
      title: 'Contas a Pagar',
      entityName: 'conta',
      subTabs: ['dados', 'documentos'],
      columns: [
        { field: "id", header: "Id", sortable: true },
        { field: "description", header: "Descrição", sortable: true },
        { field: "amount", header: "Valor", sortable: true },
        { field: "dueDate", header: "Vencimento", sortable: true }
      ]
    };
  }

  getAccountPayableFormConfig(): TabFormConfig {
    return {
      title: 'Dados da Conta a Pagar',
      entityType: 'account-payable',
      fields: [],
      subTabs: [
        {
          id: 'dados',
          label: 'Dados Principais',
          fields: [
            {
              key: 'description',
              label: 'Descrição',
              type: 'text',
              required: true,
              placeholder: 'Descrição da conta'
            },
            {
              key: 'amount',
              label: 'Valor',
              type: 'currency-input',
              required: true,
              min: 0.01,
              max: 999999.99,
              placeholder: 'Valor da conta'
            },
            {
              key: 'discount',
              label: 'Desconto',
              type: 'currency-input',
              required: false,
              min: 0,
              max: 50000,
              placeholder: 'Valor do desconto'
            },
            {
              key: 'interest',
              label: 'Juros',
              type: 'currency-input',
              required: false,
              min: 0,
              max: 10000,
              placeholder: 'Valor dos juros'
            },
            {
              key: 'totalAmount',
              label: 'Valor Total',
              type: 'currency-input',
              readOnly: true, // Calculado automaticamente
              placeholder: 'Valor calculado'
            }
          ]
        }
      ]
    };
  }
}
```

## 🔧 Validação com Reactive Forms

```typescript
// No service ou component
createForm(): FormGroup {
  return this.fb.group({
    preco: [null, [
      Validators.required,
      Validators.min(0.01),
      Validators.max(999999.99)
    ]],
    desconto: [0], // Opcional
    total: [{ value: 0, disabled: true }] // Calculado
  });
}

// Escutar mudanças para cálculos automáticos
ngOnInit() {
  this.form.get('preco')?.valueChanges.subscribe(() => this.calcularTotal());
  this.form.get('desconto')?.valueChanges.subscribe(() => this.calcularTotal());
}

private calcularTotal(): void {
  const preco = this.form.get('preco')?.value || 0;
  const desconto = this.form.get('desconto')?.value || 0;
  const total = preco - desconto;
  
  this.form.get('total')?.setValue(total, { emitEvent: false });
}
```

## 📊 Integração com Data Table

```typescript
// Exibir valores formatados na tabela
getDomainConfig(): DomainConfig {
  return {
    columns: [
      { 
        field: "amount", 
        header: "Valor", 
        sortable: true,
        // Formato personalizado para exibição
        format: (value: number) => {
          return new Intl.NumberFormat('pt-BR', {
            style: 'currency',
            currency: 'BRL'
          }).format(value);
        }
      }
    ]
  };
}
```

## 🎨 Configurações Avançadas

### Readonly com Valores Calculados

```typescript
{
  key: 'totalCalculado',
  label: 'Total Calculado',
  type: 'currency-input',
  readOnly: true,
  placeholder: 'Calculado automaticamente'
}
```

### Campo Opcional com Valor Padrão

```typescript
{
  key: 'taxaServico',
  label: 'Taxa de Serviço',
  type: 'currency-input',
  required: false,
  defaultValue: 15.50, // Valor padrão
  min: 0,
  max: 1000
}
```

### Validação Personalizada

```typescript
{
  key: 'valorNegociado',
  label: 'Valor Negociado',
  type: 'currency-input',
  required: true,
  validators: [
    Validators.required,
    Validators.min(0.01),
    this.customCurrencyValidator.bind(this) // Validador customizado
  ]
}

// Método do component
customCurrencyValidator(control: AbstractControl): ValidationErrors | null {
  const value = control.value;
  
  if (value && value > 50000) {
    return { exceedsLimit: { max: 50000, actual: value } };
  }
  
  return null;
}
```

## 🚀 Scripts de Geração Automática

```bash
# Usar o script de criação de domínio
npm run create:domain:express -- finances "Financeiro" 4 --currency --commit

# Ou criar manualmente
node scripts/create-domain.js
# Escolher: Incluir campos de moeda? (s/n): s
```

## 📝 Checklist de Implementação

- [ ] ✅ Adicionar campo `type: 'currency-input'` no FormConfig
- [ ] ✅ Configurar validações min/max se necessário
- [ ] ✅ Definir se campo é obrigatório
- [ ] ✅ Escolher moeda apropriada (BRL, USD, EUR, GBP)
- [ ] ✅ Configurar readonly para campos calculados
- [ ] ✅ Implementar cálculos automáticos se aplicável
- [ ] ✅ Testar formatação na interface
- [ ] ✅ Verificar integração com service (API)

## 🎯 Casos de Uso Comuns

### 1. **E-commerce/Produtos**
- Preço de venda
- Preço de custo
- Desconto
- Frete

### 2. **Financeiro**
- Contas a pagar/receber
- Impostos
- Taxas
- Multas

### 3. **Frota/Logística**
- Valor do frete
- Combustível
- Manutenção
- Seguro

### 4. **Recursos Humanos**
- Salários
- Benefícios
- Descontos
- Adicionais

---

**💡 Dica**: O currency-input já está totalmente integrado ao sistema de formulários do PraFrota. Basta usar `type: 'currency-input'` em qualquer TabFormConfig! 