# Modelo de datos y formulario — OT (Visita Factibilidad Ecosolar)

> Plantilla **única** para la visita de factibilidad de sistema ecosolar (FV).
> Branding: **Perfect Pool**. Otras plantillas se verán a futuro.

## Origen de los datos

- Las visitas son **`SalesOrder`** en vTiger (subject tipo *"VISITA FACTIBILIDAD SIST. ECOSOLAR"*).
- **Antecedentes** de la OT se **autocompletan** desde el pedido (no los teclea el técnico):

| Campo OT | Origen en vTiger (SalesOrder / Accounts) |
|----------|------------------------------------------|
| Nombre cliente | Nombre Cuenta (Accounts.accountname) |
| Número cliente / RUT | Datos de facturación (RUT) |
| Dirección | **`ship_street`** |
| Comuna | **`ship_city`** |
| Región | **`cf_1030`** |
| Técnico/s | **`cf_900`** "Técnico Instalador" *(por ahora se permite mostrar/elegir cualquiera)* |
| Vendedor (correo) | Usuario "Ingresado por" → **`Users.email1`** |
| N° pedido | `salesorder_no` |

> Mapeo confirmado por Héctor. El técnico puede además editar "Técnico/s de la visita" (texto libre).

## Campos que llena el técnico (por sección)

Tipos: `texto` · `num` · `bool` (Sí/No) · `select` · `area` (texto largo) · `fotos[]`.

**Factibilidad FV:** factibilidad (`select`: Factible / Factible sujeto a / No factible) · motivos (`texto`) ·
comentarios (`area`) · sistema propuesto (`area`) · tipo de sistema (`select`: On grid / Off grid / Híbrido) ·
tamaño kWp (`num`) · cantidad de paneles (`texto`) · inversor (`texto`) · días estimados (`num`).

**Empalme:** número de medidor (`texto`) · protección (`texto`) · tipo de medidor (`select`) ·
red (`select`: Monofásica / Trifásica) · `fotos[]`.

**Conductores:** tipo conductor alimentador (`texto`) · sección alimentador (`texto`) ·
¿alimentador = consumo? (`bool`) · tipo conductor consumo (`texto`) · sección consumo (`texto`) ·
¿tiene generador? (`bool`) · `fotos[]`.

**Punto de conexión:** ¿necesita extensión de cables? (`bool`) · comentarios (`area`) · `fotos[]`.

**Tablero existente:** voltaje (`num`) · comentarios (`area`) · `fotos[]`.

**Montaje de paneles:** bancadas (`texto`) · módulos por bancada (`num`) · tipo de estructura (`select`) ·
material superficie (`texto`) · strings (`num`) · orientación (`texto`) · desviación respecto al norte (`num`) ·
posición de módulos (`texto`) · estructura de cubierta a anclar (`texto`) · acceso de paneles (`texto`) ·
acceso al techo (`area`) · cantidad de escaleras (`texto`) · altura del techo m (`num`) ·
cuerdas de vida (`bool`) · sombra (`bool`) · singularidad (`bool`) · detalle singularidad (`texto`) ·
comentarios (`area`) · `fotos[]`.

**Montaje de equipos:** configuración instalación (`texto`) · tipo de muro inversor (`texto`) ·
dimensiones espacio inversor (`texto`) · ¿espacio con techo/alero? (`bool`) · intensidad wifi (`select`) ·
¿inversor en mismo muro del tablero? (`bool`) · comentarios (`area`) · `fotos[]`.

**Canalizaciones** (3 tramos: Panel–Inversor, Inversor–TGFV, TGFV–TDA): por tramo → distancia m (`texto`) ·
tipo de canalización (`texto`) · tipo de superficie (`texto`) · comentarios generales (`area`) · `foto layout`.

**Glosario:** fijo (imagen de leyenda) — no editable.

## Catálogo de tipos y opciones (según anotaciones)

Los valores de `select`/`multiselect` viven en la tabla **`ot_opciones`** (editables desde
Configuraciones). Campos marcados **(INTERNO)** solo se muestran/usan en la versión interna.

**Selects (con opciones editables):**
- `factibilidad` → Factible · Infactible · Factible sujeto a obras
- `tipo_sistema` → On grid · Off grid · Híbrido
- `tipo_medidor` → Digital · Ruleta · … (editable)
- `red` → Monofásica · Trifásica
- `tipo_estructura_fv` → Coplanar · Ajustable · Coplanar y ajustable
- `posicion_modulos` → Vertical · Horizontal · Vertical y horizontal
- `intensidad_wifi` → Alta · Media · Baja
- `tipo_asesoria` → Visita presencial · … (editable)

**Calculados:**
- `tamano_kwp` = `cantidad_paneles` × `potencia_panel_w` ÷ 1000. (Se captura cantidad + potencia
  por panel; el tamaño se calcula.)

**Booleanos (Sí/No):** ¿alimentador = consumo? · ¿tiene generador? · ¿necesita extensión de cables? ·
cuerdas de vida (INTERNO) · sombra · singularidad · ¿espacio con techo/alero? · ¿inversor en mismo
muro del tablero? · ¿tierra neutralizada? (INTERNO).

**Texto libre / área:** motivos · sistema propuesto · comentarios de cada sección · material de
superficie · strings · orientación · estructura de cubierta · técnico/s de la visita · etc.

**(INTERNO):** inclinación de la superficie · altura del techo · cuerdas de vida · tierra
neutralizada · comentarios internos · configuración instalación. **PDF único** (una sola versión;
estos campos se incluyen en ese PDF).

**Fotos por sección:** empalme, conductores, punto de conexión, tablero, montaje de paneles,
montaje de equipos (inversor y tablero), canalizaciones.

## Estados de la OT
`borrador` (se puede retomar) → `completa` → `enviada` (PDF subido al CRM + correo enviado).

## Esquema de BD propuesto (BD local del módulo)

```sql
CREATE TABLE ot (
  id              INT AUTO_INCREMENT PRIMARY KEY,
  salesorder_no   VARCHAR(50)  NOT NULL,        -- pedido vTiger
  crmid           VARCHAR(50)  NULL,            -- id interno del SalesOrder
  cliente         VARCHAR(190) NULL,
  direccion       VARCHAR(255) NULL,
  comuna          VARCHAR(120) NULL,
  tecnico         VARCHAR(190) NULL,            -- nombre/correo (cf_900)
  vendedor_email  VARCHAR(190) NULL,            -- destino del correo
  estado          ENUM('borrador','completa','enviada') NOT NULL DEFAULT 'borrador',
  datos_json      LONGTEXT     NULL,            -- respuestas del formulario (todas las secciones)
  pdf_docid_crm   VARCHAR(50)  NULL,            -- id del Documento generado en el CRM
  creado_por      VARCHAR(120) NULL,
  fecha_creacion  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  fecha_update    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE ot_fotos (
  id          INT AUTO_INCREMENT PRIMARY KEY,
  ot_id       INT NOT NULL,
  seccion     VARCHAR(60) NOT NULL,             -- empalme, conductores, montaje_paneles, ...
  ruta_local  VARCHAR(255) NOT NULL,            -- archivo subido (no versionado)
  crm_docid   VARCHAR(50)  NULL,                -- id del Document en el CRM (tras subir)
  orden       INT NOT NULL DEFAULT 0,
  FOREIGN KEY (ot_id) REFERENCES ot(id) ON DELETE CASCADE
);
```

> Se usa `datos_json` para las respuestas del formulario (plantilla fija) → simple y flexible
> para el borrador. Si luego se necesita reportería fina, se normaliza por campo.

## Flujo
Técnico ve sus visitas (SalesOrder) → "Crear OT" → llena por secciones (guarda borrador) →
sube fotos (se guardan local y luego como `Documents` en el CRM) → al completar, se genera el
**PDF** (branding Perfect Pool) → se sube al CRM (relacionado al pedido) → correo al **vendedor**
con copia al **técnico**.

## Reuso técnico (de `legacy/despachos`)
- `inc/vtiger.php` nuevo: auth + query `SalesOrder` + `create Documents` + relación (basado en
  `funciones_despacho.php` y `upload_related_documents.php`).
- PHPMailer para el correo. Config y credenciales fuera del repo.
