# Framework de Ecommerce — Instalación y empaquetado

Framework Laravel 11 con Page Builder visual, contabilidad SUNAT (Perú),
carga masiva por Excel e instalador web. Tema beige/oliva.

## ¿Qué trae este paquete?

Este ZIP contiene **el código propio del framework** (app, rutas, migración,
vistas, builder.js, config). **No incluye** la carpeta `vendor/` ni el binario
`artisan` porque se generan con Composer en tu máquina (paso 1). Tampoco trae
`.env`: eso es intencional, así el instalador web se activa en el primer acceso.

## 1. Generar el proyecto base con Composer (en tu PC)

```bash
composer create-project laravel/laravel base-tienda
cd base-tienda
composer require maatwebsite/excel greenter/greenter
```

## 2. Fusionar este framework sobre el proyecto base

Copia el contenido de este ZIP DENTRO de `base-tienda/`, sobrescribiendo:

- `app/`, `routes/`, `resources/`, `database/migrations/`, `database/seeders/`,
  `config/sunat.php`, `bootstrap/app.php`, `bootstrap/providers.php`, `composer.json`.
- Coloca `public/js/builder.js` en `base-tienda/public/js/`.

Fusiona el fragmento `config/services.paypal.php` dentro de tu
`config/services.php` (añade la clave `paypal`).

Registra los providers (ya listados en `bootstrap/providers.php`):
`AppServiceProvider`, `BlockServiceProvider`, `PaymentServiceProvider`.

Ejecuta `composer dump-autoload`.

## 3. Preparar el layout para cPanel / InterServer (mover public a la raíz)

En hosting compartido, `public_html` es la raíz web. Para no exponer todo el
proyecto, reorganiza así el contenido que subirás:

```
public_html/
├── index.php        ← el index.php de ESTE paquete (ya adaptado a __DIR__)
├── .htaccess        ← el .htaccess de ESTE paquete
├── js/  css/        ← mueve aquí lo que estaba en base-tienda/public/
├── vendor/
├── bootstrap/  app/  routes/  resources/  config/  database/  storage/
└── (resto del proyecto Laravel, SIN el archivo .env)
```

Puntos clave del `index.php` incluido:
- Usa `__DIR__` (misma carpeta) en lugar de `__DIR__/../` porque vive en la raíz.
- Usa `$app->handleRequest()` (API de Laravel 11).

## 4. Comprobar que NO exista .env

Borra `base-tienda/.env` si Composer lo creó. Sin `.env`, cualquier ruta
redirige a `/install` (middleware `RedirectIfNotInstalled`).

## 5. Empaquetar y subir a InterServer

1. Comprime TODO el contenido reorganizado (con `vendor/`, sin `.env`) en un `.zip`.
2. En el File Manager de InterServer/cPanel, sube el `.zip` a `public_html`.
3. Extráelo ahí (que los archivos queden en `public_html`, no en una subcarpeta).
4. Da permisos de escritura a `storage/` y `bootstrap/cache/` (755/775) y
   a la raíz (temporalmente, para que el instalador cree `.env`).
5. Crea la base de datos MySQL y un usuario desde el panel de InterServer.
6. Visita `https://tudominio.com/` → te redirige a `/install`.
7. Completa el formulario. El instalador escribe `.env`, genera la APP_KEY,
   corre migraciones + seeder y crea el usuario admin.
8. Por seguridad, quita el permiso de escritura de la raíz tras instalar.

## 6. Configuración post-instalación

- Panel: `https://tudominio.com/admin`
- PayPal: completa `PAYPAL_CLIENT_ID` / `PAYPAL_SECRET` en `.env`
  (sin credenciales, el checkout funciona en modo demo y aprueba el pago).
- SUNAT: coloca tu certificado en `storage/app/sunat/certificado.pem` y llena
  `SUNAT_RUC`, `SUNAT_SOL_USER`, `SUNAT_SOL_PASS` en `.env`.
- Ajusta handling/delivery/envío gratis en Admin → Configuración.

## Notas de arquitectura

- **Page Builder**: la estructura se guarda como JSON en `pages.layout`.
  El frontend (`store/master.blade.php`) recorre el JSON y monta cada bloque
  con `<x-dynamic-component>` según el campo `type`, inyectando `attributes`.
- **Pagos (Strategy)**: `CheckoutController` depende de `PaymentGatewayInterface`,
  resuelta a `PayPalGateway` en `PaymentServiceProvider`. Cambiar de pasarela
  es cambiar un binding.
- **SUNAT**: `SunatService` usa greenter para generar UBL 2.1, firmar y enviar;
  agrega productos y los servicios de handling/delivery como líneas separadas.
- **Carga masiva**: `ProductsImport` resuelve categoría/marca por nombre
  (las crea si faltan) y genera slugs; `ProductsTemplateExport` da la plantilla.
