# Guía de Contribución - CampaignHub

¡Gracias por tu interés en contribuir a CampaignHub! 🎉

## 🤝 Código de Conducta

Este proyecto sigue un Código de Conducta. Al participar, esperamos que lo respetes.

- Sé respetuoso y constructivo
- Acepta críticas constructivas
- Enfócate en lo que es mejor para la comunidad
- Muestra empatía hacia otros miembros

## 🐛 Reportar Bugs

### Antes de Reportar

1. Verifica que no sea un bug ya reportado en [Issues](https://github.com/tu-org/campaignhub/issues)
2. Asegúrate de estar usando la última versión
3. Intenta aislar el problema

### Cómo Reportar

Abre un issue con:

- **Título claro**: Describe el problema en pocas palabras
- **Descripción**: Explica qué esperabas y qué ocurrió
- **Pasos para reproducir**:
  1. Ir a '...'
  2. Hacer click en '...'
  3. Ver error
- **Contexto**:
  - Versión de PHP: `php -v`
  - Versión de Node: `node -v`
  - Sistema operativo
  - Navegador (si aplica)
- **Screenshots**: Si es visual, adjunta capturas
- **Logs**: Incluye `storage/logs/laravel.log` relevantes

## ✨ Proponer Features

Para proponer nuevas funcionalidades:

1. Abre un issue con tag `feature request`
2. Describe el problema que resuelve
3. Propón una solución
4. Explica casos de uso
5. (Opcional) Mockups o wireframes

## 💻 Contribuir Código

### Setup de Desarrollo

1. Fork el repositorio
2. Clona tu fork:
   ```bash
   git clone https://github.com/TU_USUARIO/campaignhub.git
   cd campaignhub
   ```

3. Instala dependencias:
   ```bash
   composer install
   npm install
   ```

4. Crea una rama para tu feature:
   ```bash
   git checkout -b feature/nombre-descriptivo
   ```

### Estándares de Código

#### Backend (PHP/Laravel)

- **PSR-12**: Sigue el estándar PSR-12
- **Pint**: Ejecuta antes de commit
  ```bash
  ./vendor/bin/pint
  ```
- **Type hints**: Siempre que sea posible
- **Docblocks**: Para métodos públicos
- **Tests**: Toda funcionalidad debe tener tests

**Ejemplo:**

```php
<?php

namespace App\Services;

use App\Models\User;

class UserService
{
    /**
     * Activate a user account.
     *
     * @param  User  $user
     * @return bool
     */
    public function activate(User $user): bool
    {
        if ($user->is_active) {
            return false;
        }

        return $user->update(['is_active' => true]);
    }
}
```

#### Frontend (Vue 3/TypeScript)

- **ESLint**: Ejecuta antes de commit
  ```bash
  npm run lint
  ```
- **TypeScript**: Tipado estricto
- **Composition API**: Preferir `<script setup>`
- **Props**: Siempre definir tipos
- **Emits**: Declarar eventos

**Ejemplo:**

```vue
<template>
  <button @click="handleClick" class="btn-primary">
    {{ label }}
  </button>
</template>

<script setup lang="ts">
interface Props {
  label: string
  disabled?: boolean
}

interface Emits {
  (e: 'click', value: string): void
}

const props = withDefaults(defineProps<Props>(), {
  disabled: false
})

const emit = defineEmits<Emits>()

const handleClick = () => {
  if (!props.disabled) {
    emit('click', 'clicked')
  }
}
</script>
```

### Commits

Usamos [Conventional Commits](https://www.conventionalcommits.org/):

```
<type>(<scope>): <subject>

<body>

<footer>
```

**Types:**
- `feat`: Nueva funcionalidad
- `fix`: Corrección de bug
- `docs`: Cambios en documentación
- `style`: Formato, sin cambios de código
- `refactor`: Refactorización
- `test`: Agregar o corregir tests
- `chore`: Tareas de mantenimiento

**Ejemplos:**

```bash
feat(volunteers): add bulk import from CSV
fix(pqrs): resolve duplicate ticket numbers
docs(api): update authentication examples
refactor(events): extract registration logic to service
test(finance): add transaction approval tests
```

### Pull Requests

1. **Sincroniza** con `main`:
   ```bash
   git checkout main
   git pull upstream main
   git checkout feature/tu-feature
   git rebase main
   ```

2. **Push** a tu fork:
   ```bash
   git push origin feature/tu-feature
   ```

3. **Abre PR** en GitHub con:
   - Título descriptivo
   - Descripción clara de cambios
   - Referencias a issues (`Closes #123`)
   - Screenshots (si aplica)
   - Checklist de testing

#### Template de PR

```markdown
## Descripción
Breve descripción de los cambios.

## Tipo de cambio
- [ ] Bug fix
- [ ] Nueva funcionalidad
- [ ] Breaking change
- [ ] Documentación

## ¿Cómo se probó?
- [ ] Tests unitarios
- [ ] Tests de integración
- [ ] Pruebas manuales

## Checklist
- [ ] Mi código sigue el estilo del proyecto
- [ ] He ejecutado Pint/ESLint
- [ ] He agregado tests
- [ ] Los tests pasan
- [ ] He actualizado la documentación
- [ ] No hay conflictos con main

## Screenshots (si aplica)

## Issues relacionados
Closes #123
```

### Testing

#### Backend Tests

```bash
# Todos los tests
php artisan test

# Un archivo específico
php artisan test tests/Feature/VolunteerTest.php

# Con cobertura
php artisan test --coverage --min=80
```

**Ejemplo de test:**

```php
<?php

use App\Models\User;

test('user can be activated', function () {
    $user = User::factory()->create(['is_active' => false]);

    $user->activate();

    expect($user->is_active)->toBeTrue();
});
```

#### Frontend Tests

```bash
npm run test:unit
npm run test:e2e
```

### Revisión de Código

Tu PR será revisado por maintainers. Espera:

- **Comentarios constructivos**
- **Solicitudes de cambios**
- **Aprobación** antes de merge

## 📚 Documentación

Si tu cambio afecta la API o funcionalidad, actualiza:

- `docs/api.md`
- `docs/backlog.md`
- `README.md`
- Comentarios en código
- Tests

## 🏷️ Versionado

Usamos [Semantic Versioning](https://semver.org/):

- **MAJOR**: Cambios incompatibles (breaking changes)
- **MINOR**: Nuevas funcionalidades compatibles
- **PATCH**: Correcciones de bugs

## 🎯 Prioridades

Áreas que necesitan ayuda:

- ✅ Tests (coverage < 80%)
- 🗺️ Mapas (integración Leaflet)
- 📊 Charts (integración Chart.js)
- 🤖 IA (NLP, forecasting)
- 📱 Mobile app
- 🌐 Internacionalización
- ♿ Accesibilidad (WCAG 2.2)

## 📞 Ayuda

¿Necesitas ayuda?

- **Discord**: [Únete a la comunidad](https://discord.gg/campaignhub)
- **Email**: dev@campaignhub.com
- **Discussions**: [GitHub Discussions](https://github.com/tu-org/campaignhub/discussions)

## 📜 Licencia

Al contribuir, aceptas que tus contribuciones se licencien bajo la misma licencia del proyecto.

---

¡Gracias por contribuir! 🚀








