# 📋 Campos por Tipo de Campanha

## 🎯 Regra Geral

Cada tipo de campanha deve mostrar **APENAS** os campos relevantes para aquele tipo. Campos genéricos que não se aplicam ao tipo selecionado devem ser **ocultos** ou **desabilitados**.

---

## 1️⃣ RewardType_Auto (Oferta Automática)

### ✅ Campos que DEVEM aparecer:
- `campaign_name` (obrigatório)
- `sponsor_name` (opcional - NUNCA obrigatório)
- `establishment_id` (obrigatório)
- `description` (opcional)
- `valid_from` (obrigatório)
- `valid_until` (obrigatório)
- `status` (obrigatório)
- `auto_points_amount` (obrigatório) - Quantidade de pontos a dar
- `auto_points_condition` (opcional) - Condição para receber
- `total_points_limit` (opcional) - Plafond global
- `accumulation_rate` (opcional) - Taxa de acumulação
- `image` / `images` (opcional)
- `notify_push`, `notify_sms`, `notify_email`, `notify_whatsapp` (opcional)
- `new_customers_only`, `vip_only` (opcional)

### ❌ Campos que NÃO devem aparecer:
- `min_purchase_amount` / `min_spend`
- `max_purchase_amount`
- `bonus_multiplier`
- `reward_description`
- `reward_points_cost`
- `reward_stock`
- `conversion_rate`
- Todos os campos de Draw, Exchange, Quiz, Referral, Challenge, Party

---

## 2️⃣ RewardType_Draw (Sorteio)

### ✅ Campos que DEVEM aparecer:
- `campaign_name` (obrigatório)
- `sponsor_name` (opcional - NUNCA obrigatório)
- `establishment_id` (obrigatório)
- `description` (opcional)
- `valid_from` (obrigatório)
- `valid_until` (obrigatório)
- `status` (obrigatório)
- `draw_min_spend` (obrigatório) - Valor mínimo para participar
- `draw_participation_condition` (opcional) - Condição de participação
- `draw_chances_per_purchase` (opcional, default: 1) - Chances por compra
- `draw_prize_description` (obrigatório) - Descrição do prémio
- `draw_date` (obrigatório) - Data do sorteio
- `draw_winners_count` (opcional, default: 1) - Número de vencedores
- `image` / `images` (opcional)
- `notify_push`, `notify_sms`, `notify_email`, `notify_whatsapp` (opcional)
- `new_customers_only`, `vip_only` (opcional)

### ❌ Campos que NÃO devem aparecer:
- `max_purchase_amount`
- `bonus_multiplier`
- `accumulation_rate`
- `total_points_limit`
- `reward_points_cost` (não se aplica a sorteios)
- `reward_stock` (não se aplica a sorteios)
- `conversion_rate`
- Todos os campos de Auto, Exchange, Quiz, Referral, Challenge, Party

---

## 3️⃣ RewardType_Exchange (Troca)

### ✅ Campos que DEVEM aparecer:
- `campaign_name` (obrigatório)
- `sponsor_name` (opcional - NUNCA obrigatório)
- `establishment_id` (obrigatório)
- `description` (opcional)
- `valid_from` (obrigatório)
- `valid_until` (obrigatório)
- `status` (obrigatório)
- `reward_description` (obrigatório) - O que pode ser trocado
- `reward_points_cost` (obrigatório) - Custo em pontos
- `exchange_min_points_required` (opcional) - Pontos mínimos necessários
- `reward_value_mt` (opcional) - Valor em MZN
- `reward_stock` (obrigatório) - Estoque disponível
- `redemption_deadline` (opcional) - Prazo de resgate
- `image` / `images` (opcional)
- `notify_push`, `notify_sms`, `notify_email`, `notify_whatsapp` (opcional)
- `new_customers_only`, `vip_only` (opcional)

### ❌ Campos que NÃO devem aparecer:
- `min_purchase_amount` / `min_spend`
- `max_purchase_amount`
- `bonus_multiplier`
- `accumulation_rate`
- `total_points_limit`
- `conversion_rate`
- Todos os campos de Auto, Draw, Quiz, Referral, Challenge, Party

---

## 4️⃣ RewardType_Quiz (Questões)

### ✅ Campos que DEVEM aparecer:
- `campaign_name` (obrigatório)
- `sponsor_name` (opcional - NUNCA obrigatório)
- `establishment_id` (obrigatório)
- `description` (opcional)
- `valid_from` (obrigatório)
- `valid_until` (obrigatório)
- `status` (obrigatório)
- `quiz_questions` (obrigatório) - Array de questões
- `quiz_points_per_correct` (opcional, default: 10) - Pontos por resposta correta
- `quiz_max_attempts` (opcional, default: 3) - Máximo de tentativas
- `quiz_time_limit_seconds` (opcional) - Tempo limite por pergunta
- `total_points_limit` (opcional) - Plafond global
- `image` / `images` (opcional)
- `notify_push`, `notify_sms`, `notify_email`, `notify_whatsapp` (opcional)
- `new_customers_only`, `vip_only` (opcional)

### ❌ Campos que NÃO devem aparecer:
- `min_purchase_amount` / `min_spend`
- `max_purchase_amount`
- `bonus_multiplier`
- `accumulation_rate`
- `conversion_rate`
- `reward_description`
- `reward_points_cost` (usar `quiz_points_per_correct` em vez disso)
- `reward_stock`
- Todos os campos de Auto, Draw, Exchange, Referral, Challenge, Party

---

## 5️⃣ RewardType_Referral (Indicação)

### ✅ Campos que DEVEM aparecer:
- `campaign_name` (obrigatório)
- `sponsor_name` (opcional - NUNCA obrigatório)
- `establishment_id` (obrigatório)
- `description` (opcional)
- `valid_from` (obrigatório)
- `valid_until` (obrigatório)
- `status` (obrigatório)
- `referral_points_per_referral` (obrigatório) - Pontos por indicação
- `referral_min_referrals` (opcional, default: 1) - Mínimo de indicações
- `referral_bonus_points` (opcional) - Bônus ao completar meta
- `referral_requires_first_purchase` (opcional, default: true) - Requer primeira compra
- `referral_code` (opcional) - Código único de referência
- `total_points_limit` (opcional) - Plafond global
- `image` / `images` (opcional)
- `notify_push`, `notify_sms`, `notify_email`, `notify_whatsapp` (opcional)
- `new_customers_only`, `vip_only` (opcional)

### ❌ Campos que NÃO devem aparecer:
- `min_purchase_amount` / `min_spend`
- `max_purchase_amount`
- `bonus_multiplier`
- `accumulation_rate`
- `conversion_rate`
- `reward_description`
- `reward_points_cost` (usar `referral_points_per_referral` em vez disso)
- `reward_stock`
- Todos os campos de Auto, Draw, Exchange, Quiz, Challenge, Party

---

## 6️⃣ RewardType_Challenge (Desafio)

### ✅ Campos que DEVEM aparecer:
- `campaign_name` (obrigatório)
- `sponsor_name` (opcional - NUNCA obrigatório)
- `establishment_id` (obrigatório)
- `description` (opcional)
- `valid_from` (obrigatório)
- `valid_until` (obrigatório)
- `status` (obrigatório)
- `challenge_objective` (obrigatório) - Objetivo do desafio
- `challenge_target_value` (obrigatório) - Valor alvo
- `challenge_target_type` (obrigatório) - Tipo: 'visits', 'spend', 'purchases', 'points'
- `challenge_reward_points` (obrigatório) - Pontos ao completar
- `challenge_bonus_reward` (opcional) - Recompensa bônus
- `challenge_progress_tracking` (opcional, default: true) - Rastrear progresso
- `image` / `images` (opcional)
- `notify_push`, `notify_sms`, `notify_email`, `notify_whatsapp` (opcional)
- `new_customers_only`, `vip_only` (opcional)

### ❌ Campos que NÃO devem aparecer:
- `min_purchase_amount` / `min_spend`
- `max_purchase_amount`
- `bonus_multiplier`
- `accumulation_rate`
- `total_points_limit`
- `conversion_rate`
- `reward_points_cost` (usar `challenge_reward_points` em vez disso)
- `reward_stock`
- Todos os campos de Auto, Draw, Exchange, Quiz, Referral, Party

---

## 7️⃣ RewardType_Party (Votação)

### ✅ Campos que DEVEM aparecer:
- `campaign_name` (obrigatório)
- `sponsor_name` (opcional - NUNCA obrigatório)
- `establishment_id` (obrigatório)
- `description` (opcional)
- `valid_from` (obrigatório)
- `valid_until` (obrigatório)
- `status` (obrigatório)
- `party_voting_options` (obrigatório) - Array de opções (mín. 2)
- `party_points_per_vote` (obrigatório) - Pontos por voto
- `party_winner_reward` (opcional) - Recompensa do vencedor
- `party_voting_deadline` (obrigatório) - Prazo para votar
- `party_results_date` (opcional) - Data de divulgação
- `image` / `images` (opcional)
- `notify_push`, `notify_sms`, `notify_email`, `notify_whatsapp` (opcional)
- `new_customers_only`, `vip_only` (opcional)

### ❌ Campos que NÃO devem aparecer:
- `min_purchase_amount` / `min_spend`
- `max_purchase_amount`
- `bonus_multiplier`
- `accumulation_rate`
- `total_points_limit`
- `conversion_rate`
- `reward_description`
- `reward_points_cost` (usar `party_points_per_vote` em vez disso)
- `reward_stock`
- Todos os campos de Auto, Draw, Exchange, Quiz, Referral, Challenge

---

## 8️⃣ RewardType_Voucher (Cabaz Digital / Benefício Corporativo)

### ✅ Campos que DEVEM aparecer:
- `campaign_name` (obrigatório)
- `sponsor_name` (opcional - NUNCA obrigatório)
- `establishment_id` (obrigatório)
- `description` (opcional)
- `valid_from` (obrigatório)
- `valid_until` (obrigatório)
- `status` (obrigatório)
- `voucher_code` (opcional) - Código único do voucher
- `voucher_value` (obrigatório) - Valor do voucher em MZN
- `voucher_type` (obrigatório) - Tipo: 'digital', 'physical', 'hybrid'
- `voucher_category` (opcional) - Categoria: alimentação, vestuário, etc
- `voucher_description` (obrigatório) - Descrição detalhada do voucher
- `voucher_terms` (opcional) - Termos e condições
- `voucher_expiry_date` (obrigatório) - Data de expiração do voucher
- `voucher_usage_limit` (opcional, default: 1) - Limite de uso
- `voucher_min_purchase` (opcional) - Compra mínima para usar
- `voucher_max_discount` (opcional) - Desconto máximo em MZN
- `voucher_percentage` (opcional) - Percentual de desconto (0-100)
- `voucher_fixed_amount` (opcional) - Valor fixo de desconto
- `voucher_requires_code` (opcional, default: false) - Se requer código
- `voucher_single_use` (opcional, default: true) - Se é de uso único
- `voucher_apply_to` (opcional) - Aplicar a: 'total', 'items', 'shipping', 'specific'
- `image` / `images` (opcional)
- `notify_push`, `notify_sms`, `notify_email`, `notify_whatsapp` (opcional)
- `new_customers_only`, `vip_only` (opcional)

### ❌ Campos que NÃO devem aparecer:
- `min_purchase_amount` / `min_spend`
- `max_purchase_amount`
- `bonus_multiplier`
- `accumulation_rate`
- `total_points_limit`
- `conversion_rate`
- `reward_description` (usar `voucher_description` em vez disso)
- `reward_points_cost` (vouchers não custam pontos)
- `reward_stock` (usar `voucher_usage_limit` em vez disso)
- Todos os campos de Auto, Draw, Exchange, Quiz, Referral, Challenge, Party

---

## 📊 Resumo: Campos Comuns vs Específicos

### Campos Comuns (Todos os Tipos):
- `type` (obrigatório)
- `campaign_name` (obrigatório)
- `sponsor_name` (opcional - NUNCA obrigatório)
- `establishment_id` (obrigatório)
- `description` (opcional)
- `valid_from` (obrigatório)
- `valid_until` (obrigatório)
- `status` (obrigatório)
- `image` / `images` (opcional)
- `notify_push`, `notify_sms`, `notify_email`, `notify_whatsapp` (opcional)
- `new_customers_only`, `vip_only` (opcional)
- `notes` (opcional)

### Campos que NÃO se aplicam a NENHUM tipo:
- `max_purchase_amount` - Não é usado em nenhum dos 7 tipos padrão
- `bonus_multiplier` - Não é usado em nenhum dos 7 tipos padrão
- `conversion_rate` - Não é usado em nenhum dos 7 tipos padrão (exceto em campanhas legadas)

### Campos Condicionais (apenas para alguns tipos):
- `accumulation_rate` - Apenas para `RewardType_Auto`
- `min_purchase_amount` / `min_spend` - Apenas para `RewardType_Draw` (como `draw_min_spend`)
- `total_points_limit` - Apenas para `RewardType_Auto`, `RewardType_Quiz`, `RewardType_Referral`, `RewardType_Challenge`, `RewardType_Party`
- `reward_description` - Apenas para `RewardType_Exchange`, `RewardType_Draw`, `RewardType_Challenge`
- `reward_points_cost` - Apenas para `RewardType_Exchange`, `RewardType_Draw`, `RewardType_Challenge` (mas cada tipo tem seu próprio campo específico)

---

## 🎨 Recomendação para Frontend

### Estrutura do Formulário:

```javascript
// Campos sempre visíveis (comuns)
const commonFields = [
  'campaign_name',
  'sponsor_name',
  'establishment_id',
  'description',
  'valid_from',
  'valid_until',
  'status',
  'image',
  'images'
];

// Campos por tipo
const fieldsByType = {
  'RewardType_Auto': [
    'auto_points_amount',
    'auto_points_condition',
    'total_points_limit',
    'accumulation_rate'
  ],
  'RewardType_Draw': [
    'draw_min_spend',
    'draw_participation_condition',
    'draw_chances_per_purchase',
    'draw_prize_description',
    'draw_date',
    'draw_winners_count'
  ],
  'RewardType_Exchange': [
    'reward_description',
    'reward_points_cost',
    'exchange_min_points_required',
    'reward_value_mt',
    'reward_stock',
    'redemption_deadline'
  ],
  'RewardType_Quiz': [
    'quiz_questions',
    'quiz_points_per_correct',
    'quiz_max_attempts',
    'quiz_time_limit_seconds',
    'total_points_limit'
  ],
  'RewardType_Referral': [
    'referral_points_per_referral',
    'referral_min_referrals',
    'referral_bonus_points',
    'referral_requires_first_purchase',
    'referral_code',
    'total_points_limit'
  ],
  'RewardType_Challenge': [
    'challenge_objective',
    'challenge_target_value',
    'challenge_target_type',
    'challenge_reward_points',
    'challenge_bonus_reward',
    'challenge_progress_tracking'
  ],
  'RewardType_Party': [
    'party_voting_options',
    'party_points_per_vote',
    'party_winner_reward',
    'party_voting_deadline',
    'party_results_date'
  ],
  'RewardType_Voucher': [
    'voucher_code',
    'voucher_value',
    'voucher_type',
    'voucher_category',
    'voucher_description',
    'voucher_terms',
    'voucher_expiry_date',
    'voucher_usage_limit',
    'voucher_min_purchase',
    'voucher_max_discount',
    'voucher_percentage',
    'voucher_fixed_amount',
    'voucher_requires_code',
    'voucher_single_use',
    'voucher_apply_to'
  ]
};

// Campos que NUNCA devem aparecer
const neverShowFields = [
  'max_purchase_amount',
  'bonus_multiplier',
  'conversion_rate' // Apenas para campanhas legadas
];
```

### Lógica de Exibição:

```javascript
// Mostrar apenas campos relevantes ao tipo selecionado
const shouldShowField = (fieldName, campaignType) => {
  // Campos comuns sempre aparecem
  if (commonFields.includes(fieldName)) {
    return true;
  }
  
  // Campos que nunca devem aparecer
  if (neverShowFields.includes(fieldName)) {
    return false;
  }
  
  // Campos específicos por tipo
  const typeFields = fieldsByType[campaignType] || [];
  return typeFields.includes(fieldName);
};
```

