# POSKN-SALUD

Sistema clínico (farmacia/POS, historias, fichas de cliente). **Laravel 13**, PHP 8.3+, MySQL/MariaDB recomendado en producción.

- **Autor:** Luis Arias · [servikn.com](https://servikn.com) · 0424-6284328

## Requisitos locales (WAMP)

- PHP 8.3+ con extensiones `openssl`, `pdo_mysql`, `mbstring`, `tokenizer`, `xml`, `ctype`, `json`, `bcmath`
- Composer
- MySQL o, para pruebas rápidas, SQLite (por defecto en `.env` recién generado)

## Puesta en marcha

```bash
cd c:\wamp64\www\vet
copy .env.example .env
php artisan key:generate
```

Configure `DB_*` en `.env`, cree la base `poskn_salud` (o use SQLite), luego:

```bash
php artisan migrate
php artisan db:seed
```

**Primer administrador (recomendado):** en `.env` defina `ADMIN_EMAIL` y `ADMIN_PASSWORD`, ejecute `php artisan db:seed` y quite o vacíe esas variables después. El usuario recibe el rol `administrador` y el correo queda verificado. **Si cambia `ADMIN_PASSWORD` en local y el login falla**, vuelva a ejecutar `php artisan db:seed`: el seeder alinea nombre, contraseña y rol con el `.env` actual.

**Registro público:** por defecto `ALLOW_PUBLIC_REGISTRATION=false` (no existe `/register`). Actívelo solo si lo necesita.

**Roles (4):** `administrador` (todos los permisos), `gerente` (todos salvo los de `config/poskn.php` → `gerente_denied_permissions`, hoy `users.manage` y `roles.manage`), `medico`, `cajero`. Permisos base en `permission_definitions`; se irán sumando claves al implementar módulos.

Autenticación: **Laravel Breeze** (Blade + Tailwind). En rutas: `middleware(['role:administrador|gerente'])` o `middleware(['permission:pos.use'])`, etc.

## Módulo Clientes y pacientes

- **Clientes** (`/clients`): titular / representante (documento, contacto, foto, notas). Políticas con permisos `clients.view` / `clients.manage`.
- **Pacientes** (mascotas): anidados a un cliente (`/clients/{id}/patients/...`). Misma política de permisos para alta/edición.
- **Historias clínicas** (`/clients/{client}/patients/{patient}/medical-records`): entradas con fecha, peso, temperatura, texto y adjuntos. Permisos `medical_records.view` / `medical_records.edit`.
- **Cajero** puede listar y ver clientes; **médico** y **gerente** gestionan según `PermissionSeeder`.
- Fotos y adjuntos en `storage/app/public` — ejecutar `php artisan storage:link` si hace falta.

## Módulos en la interfaz

- **Farmacia / POS** (`/farmacia/products`, `/farmacia/pos`): inventario y cobros. Las rutas antiguas `/products` y `/pos` redirigen aquí.
- **Clínica** (`/clients`, `/clinica/citas`): clientes, pacientes, historias y **citas** (agenda por día, estados programada / completada / cancelada / no asistió). Permisos `appointments.view` y `appointments.manage` (cajero y médico pueden gestionar citas en recepción/consulta).

## Inventario, POS y reservas clínica → caja

- **Productos**: marque **«Producto farmacia / reserva clínica»** en el formulario para artículos que el médico reserva y solo se cobran en caja vía reserva (no aparecen en el buscador normal del POS).
- **Reservas** (`/clients/{client}/patients/{patient}/product-reservations`): el médico (`reservations.manage`) arma la lista; el cajero en el POS usa **«Cargar en caja»**; al registrar la venta se marca la reserva como cobrada y se enlaza al ticket.
- Permisos: `reservations.view` (médico, cajero, gerente, admin), `reservations.manage` (médico, gerente, admin).
- **POS**: carrito en sesión, checkout, ticket (`/farmacia/pos/ticket/{sale}`). `pos.use`.

Assets: `npm install` y `npm run build` (o `npm run dev` en desarrollo).

**Pruebas:** `php artisan test` — incluye `ModuleAuthorizationTest` y `AppointmentsTest` (citas y permisos).

Documento raíz del sitio: carpeta `public` (en Apache, `DocumentRoot` → `public`).

## API (base para portal futuro)

- `GET /api/v1/status` — comprobación sin autenticación (límite: 60 req/min por IP/usuario).

Tokens de aplicación: **Laravel Sanctum** (`personal_access_tokens`); el modelo `User` incluye `HasApiTokens`.

## Seguridad (checklist producción)

| Acción | Detalle |
|--------|---------|
| `APP_DEBUG` | `false` |
| `APP_ENV` | `production` |
| `APP_KEY` | Único por entorno; nunca en repositorio |
| HTTPS | `FORCE_HTTPS=true` detrás de certificado válido |
| Sesiones | `SESSION_ENCRYPT=true`, cookie `secure` vía HTTPS |
| Proxy | `TRUSTED_PROXIES` si hay CDN / hosting compartido delante del servidor |
| Copias | Base de datos + `storage/app` (adjuntos clínicos) con política definida |
| Actualizaciones | `composer update` y revisiones de seguridad de Laravel |

Cabeceras HTTP: `SecurityHeaders` (X-Frame-Options, nosniff, Referrer-Policy, HSTS en producción).

## Licencia

MIT (framework Laravel y paquetes con sus respectivas licencias).
