CRANEGOO v3.0 — Plataforma completa de gestión para grúas y elevadores
13 módulos, 6 roles, 5 idiomas, 4 temas visuales Creador: José Jiménez Salinas — Consultoría Alcaraz Salazar
This commit is contained in:
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.DS_Store
|
||||||
|
*.log
|
||||||
41
CHANGELOG.md
Normal file
41
CHANGELOG.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# CHANGELOG — CRANEGOO v3.0
|
||||||
|
|
||||||
|
## v3.0 — Marzo 2026
|
||||||
|
|
||||||
|
### Módulos Completos
|
||||||
|
- ✅ Dashboard con KPIs operativos + panel financiero (8 indicadores)
|
||||||
|
- ✅ Inventario (equipos + refacciones)
|
||||||
|
- ✅ Servicios (calendario, asignación, checklist, firmas digitales, vistas por rol)
|
||||||
|
- ✅ Mantenimiento (preventivo/correctivo, 3 vistas)
|
||||||
|
- ✅ Cotizaciones (catálogo 32 conceptos, PDF, anticipo, cláusulas)
|
||||||
|
- ✅ Compras (OCs, proveedores, fotos, comprobantes)
|
||||||
|
- ✅ Contable (6 pestañas: control cliente, facturas, estado cuenta, tesorería, SAT/IMSS, nómina)
|
||||||
|
- ✅ GPS (tracking empleados, vista cliente por proyecto)
|
||||||
|
- ✅ Personal (CRUD con credenciales de acceso)
|
||||||
|
- ✅ Clientes (proyectos, equipos, usuarios app con login)
|
||||||
|
- ✅ Reportes (4 tipos, checklists grúa/elevador desde PDFs reales, firmas duales, PDF)
|
||||||
|
- ✅ Manuales (6 categorías, upload/download)
|
||||||
|
- ✅ Configuración (5 idiomas, 4 temas, datos empresa, IVA, idioma por cliente/obra, Acerca de)
|
||||||
|
|
||||||
|
### Funcionalidades Especiales
|
||||||
|
- ✅ Login unificado usuario + contraseña (sin selección de rol visible)
|
||||||
|
- ✅ 6 roles con permisos granulares
|
||||||
|
- ✅ Firma digital canvas (touch + mouse)
|
||||||
|
- ✅ Checklist grúa torre: 22 secciones, ~65 puntos de inspección
|
||||||
|
- ✅ Checklist elevador: 4 secciones (BASE, TORRE, VAGÓN, ARRESTRAMIENTOS), 24 puntos
|
||||||
|
- ✅ Calendario con 8 días festivos mexicanos 2026
|
||||||
|
- ✅ Recargo +25% por trabajo en domingo/festivo
|
||||||
|
- ✅ Roles exclusivos (operadores bloqueados todo el día)
|
||||||
|
- ✅ Aislamiento por proyecto para clientes
|
||||||
|
- ✅ Tesorería con actualización automática de saldos
|
||||||
|
- ✅ Alertas de obligaciones vencidas y créditos al +80%
|
||||||
|
- ✅ Nómina semanal con timbre XML + complemento XML
|
||||||
|
- ✅ Internacionalización 5 idiomas con cambio en tiempo real
|
||||||
|
- ✅ Idioma independiente por cliente/obra
|
||||||
|
- ✅ 4 temas visuales con CSS dinámico
|
||||||
|
- ✅ Branding CRANEGOO separado de empresa cliente
|
||||||
|
|
||||||
|
### Marca
|
||||||
|
- Plataforma: CRANEGOO
|
||||||
|
- Creador: José Jiménez Salinas — Consultoría Alcaraz Salazar
|
||||||
|
- Las empresas de grúas son clientes de la plataforma (multi-tenant ready)
|
||||||
195
README.md
Normal file
195
README.md
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
# CRANEGOO — Plataforma de Gestión para Grúas y Elevadores
|
||||||
|
|
||||||
|
> **Versión:** 3.0
|
||||||
|
> **Creador:** José Jiménez Salinas — Consultoría Alcaraz Salazar
|
||||||
|
> **Contacto:** lalcarazsalazar@consultoria-as.com | 664 217 0990
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ¿Qué es CRANEGOO?
|
||||||
|
|
||||||
|
Sistema integral para la administración de empresas de renta de grúas torre y elevadores de construcción. Diseñado como plataforma SaaS multi-tenant donde cada empresa de grúas es un cliente independiente.
|
||||||
|
|
||||||
|
**Tecnología actual:** React (Single-File JSX, ~7,450 líneas)
|
||||||
|
**Estado:** Prototipo funcional completo — listo para migración a backend
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Módulos (13)
|
||||||
|
|
||||||
|
| # | Módulo | Descripción |
|
||||||
|
|---|--------|-------------|
|
||||||
|
| 1 | 📊 Dashboard | KPIs operativos + panel financiero (saldos, deudas, SAT/IMSS, nómina) |
|
||||||
|
| 2 | 📦 Inventario | CRUD equipos (grúas torre, elevadores) + refacciones |
|
||||||
|
| 3 | 🔧 Servicios | Calendario con festivos, asignación de personal, checklist en campo, firmas digitales |
|
||||||
|
| 4 | 🛠️ Mantenimiento | Preventivo y correctivo, vistas por rol |
|
||||||
|
| 5 | 📝 Cotizaciones | Catálogo de 32 conceptos, generación PDF, anticipo, 7 cláusulas editables |
|
||||||
|
| 6 | 🛒 Compras | Órdenes de compra, proveedores, fotos, comprobantes de pago |
|
||||||
|
| 7 | 📑 Contable | 6 pestañas: Control por cliente, Facturas, Estado de cuenta, Tesorería, SAT/IMSS, Nómina |
|
||||||
|
| 8 | 📍 GPS | Tracking de empleados en tiempo real, vista por proyecto para clientes |
|
||||||
|
| 9 | 👥 Personal | Alta de empleados con credenciales, roles del sistema, acceso a compras |
|
||||||
|
| 10 | 🏢 Clientes | Alta de empresas, proyectos, equipos, usuarios de app (máx 2 por obra) |
|
||||||
|
| 11 | 📋 Reportes | 4 tipos de inspección (grúa/elevador × mant/correctivo), checklists completos, firmas, PDF |
|
||||||
|
| 12 | 📚 Manuales | 6 categorías, upload/download por equipo |
|
||||||
|
| 13 | ⚙️ Configuración | Idiomas (5), temas (4), datos empresa, IVA, idioma por cliente/obra, Acerca de |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Roles y Permisos (6)
|
||||||
|
|
||||||
|
| Rol | Acceso |
|
||||||
|
|-----|--------|
|
||||||
|
| ⚙️ Administrador | Todo — 13 módulos, edición total, configuración |
|
||||||
|
| 🏗️ Jefe de Operaciones | Dashboard, Inventario, Servicios, Mantenimiento, Compras, GPS, Personal, Reportes, Manuales |
|
||||||
|
| 📊 Jefe de Ventas | Dashboard (cobranza), Servicios, Mantenimiento, Cotizaciones, Clientes |
|
||||||
|
| 📑 Contador | Dashboard (financiero), Contable (6 pestañas), Compras (pagos) |
|
||||||
|
| 👷 Empleado | Dashboard, Inventario, Servicios, Mantenimiento, GPS, Reportes, Manuales |
|
||||||
|
| 🏢 Cliente | Dashboard (mi proyecto), Servicios, Mantenimiento, Cotizaciones, GPS |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Autenticación
|
||||||
|
|
||||||
|
Login unificado por usuario + contraseña. El admin asigna credenciales al dar de alta:
|
||||||
|
|
||||||
|
- **Admin:** Credenciales hardcoded en `ADMIN_CREDS`
|
||||||
|
- **Empleados:** Campo `user` + `pass` en el registro del empleado
|
||||||
|
- **Clientes:** Campo `user` + `pass` en cada `appUser` del proyecto
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Funcionalidades Especiales
|
||||||
|
|
||||||
|
### Inspecciones / Checklists
|
||||||
|
- **Grúa Torre:** 22 secciones, ~65 puntos (desde PDF real de Mexus)
|
||||||
|
- **Elevador:** 4 secciones, 24 puntos (BASE, TORRE, VAGÓN, ARRESTRAMIENTOS)
|
||||||
|
- Generación automática al iniciar servicio según tipo de equipo
|
||||||
|
|
||||||
|
### Firmas Digitales
|
||||||
|
- Canvas táctil (mouse + touch) para firma
|
||||||
|
- Técnico firma al completar checklist
|
||||||
|
- Supervisor firma al aprobar reporte
|
||||||
|
- Ambas aparecen en el PDF generado
|
||||||
|
|
||||||
|
### Tesorería
|
||||||
|
- Cuentas bancarias (pesos + dólares) con saldos
|
||||||
|
- Créditos y tarjetas con % de utilización
|
||||||
|
- Transacciones que actualizan saldos automáticamente
|
||||||
|
- Alertas de créditos al +80% de utilización
|
||||||
|
|
||||||
|
### SAT / IMSS / Estatal
|
||||||
|
- Obligaciones fiscales con fechas límite
|
||||||
|
- Alertas de vencimiento en Dashboard
|
||||||
|
- Subir comprobantes de pago
|
||||||
|
|
||||||
|
### Nómina Semanal
|
||||||
|
- Registro con bruto/neto/ISR/IMSS/Infonavit
|
||||||
|
- Upload de XML Timbre y XML Complemento
|
||||||
|
- Comprobante de pago
|
||||||
|
|
||||||
|
### Internacionalización
|
||||||
|
- 5 idiomas: ES-LATAM, ES-España, English, Русский, Français
|
||||||
|
- ~90 claves de traducción
|
||||||
|
- Idioma configurable por cliente y por obra
|
||||||
|
- Cambio en tiempo real
|
||||||
|
|
||||||
|
### Temas Visuales
|
||||||
|
- 4 temas: Oscuro, Claro, Mexus Rojo, Azul Corporativo
|
||||||
|
- CSS dinámico que cambia body, cards, inputs, botones
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Estructura del Código
|
||||||
|
|
||||||
|
```
|
||||||
|
src/App.jsx — Archivo principal (~7,450 líneas)
|
||||||
|
├── Constantes — C (colores), ROLES, SYS_ROLES, EMP_ROLES, SVC_TYPES, etc.
|
||||||
|
├── Init Data — INIT_EQUIPMENT, INIT_EMPLOYEES, etc. (20 arrays, vacíos en versión limpia)
|
||||||
|
├── Traducciones — TRANSLATIONS (~90 claves × 5 idiomas)
|
||||||
|
├── Temas — THEMES (4 temas con paletas completas)
|
||||||
|
├── Checklists — GRUA_TORRE_CHECKLIST (22 secciones), ELEVADOR_CHECKLIST (4 secciones)
|
||||||
|
├── Catálogo — COT_CATALOG (32 conceptos con precios)
|
||||||
|
├── Hooks — useIsMobile()
|
||||||
|
├── Componentes UI — SignaturePad, Field, Modal, Calendar, StatusBadge, etc.
|
||||||
|
├── Módulos — 13 componentes principales (Dashboard, ServicesModule, etc.)
|
||||||
|
├── Login — Autenticación por usuario/contraseña
|
||||||
|
└── App — Estado global, routing, layout
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Roadmap Técnico para Migración
|
||||||
|
|
||||||
|
### Fase 1 — Backend (Supabase o Firebase)
|
||||||
|
- Migrar estado en memoria a base de datos
|
||||||
|
- Autenticación real (JWT + bcrypt)
|
||||||
|
- Storage para archivos/fotos/XMLs/firmas
|
||||||
|
- Real-time subscriptions para GPS y notificaciones
|
||||||
|
|
||||||
|
### Fase 2 — PWA
|
||||||
|
- Service Worker para modo offline
|
||||||
|
- Push notifications
|
||||||
|
- Instalable en homescreen
|
||||||
|
|
||||||
|
### Fase 3 — Mobile (React Native)
|
||||||
|
- Android + iOS + Huawei
|
||||||
|
- Cámara nativa para fotos y firmas
|
||||||
|
- GPS nativo para tracking
|
||||||
|
|
||||||
|
### Fase 4 — Multi-Tenant SaaS
|
||||||
|
- Cada empresa de grúas es un tenant
|
||||||
|
- Onboarding self-service
|
||||||
|
- Billing por suscripción
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cómo Correr en Desarrollo
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Opción 1: Con Vite
|
||||||
|
npm create vite@latest cranegoo -- --template react
|
||||||
|
cd cranegoo
|
||||||
|
# Copiar src/App.jsx al proyecto
|
||||||
|
npm install
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# Opción 2: Con Create React App
|
||||||
|
npx create-react-app cranegoo
|
||||||
|
cd cranegoo
|
||||||
|
# Reemplazar src/App.js con src/App.jsx
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dependencias
|
||||||
|
Solo React — no requiere librerías adicionales. Todo está construido con:
|
||||||
|
- React (useState, useMemo, useRef, useEffect)
|
||||||
|
- CSS-in-JS (inline styles)
|
||||||
|
- Canvas API (para firmas)
|
||||||
|
- Window.open (para generación de PDF)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Credenciales por Defecto
|
||||||
|
|
||||||
|
| Tipo | Usuario | Contraseña |
|
||||||
|
|------|---------|------------|
|
||||||
|
| Administrador | `jose.jimenez` | `mexus2024` |
|
||||||
|
| Administrador (alt) | `admin` | `mexus2024` |
|
||||||
|
|
||||||
|
Los demás usuarios se crean desde el módulo de Personal (empleados) y Clientes (usuarios de obra).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Licencia
|
||||||
|
|
||||||
|
Propiedad intelectual de **José Jiménez Salinas** — Consultoría Alcaraz Salazar.
|
||||||
|
Todos los derechos reservados © 2026.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Contacto
|
||||||
|
|
||||||
|
📧 lalcarazsalazar@consultoria-as.com
|
||||||
|
📞 664 217 0990
|
||||||
|
📍 Tijuana: Misión de San Javier 10661, Zona Urbana Río Tijuana, B.C.
|
||||||
|
📍 Guadalajara: Florencia 2280, Col. Italia Providencia, Jalisco
|
||||||
258
docs/ARQUITECTURA.md
Normal file
258
docs/ARQUITECTURA.md
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
# CRANEGOO — Documentación Técnica para Desarrollador
|
||||||
|
|
||||||
|
## Arquitectura General
|
||||||
|
|
||||||
|
La app es un **Single-File React Component** (`src/App.jsx`) con todo el estado en memoria. No hay backend, base de datos ni API. Esto es un prototipo funcional que debe migrarse a una arquitectura cliente-servidor.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Mapa del Archivo (por líneas aproximadas)
|
||||||
|
|
||||||
|
```
|
||||||
|
Líneas 1-18 → Constantes de color (C), estilos base
|
||||||
|
Líneas 19-148 → ROLES, EQ_TYPES, SVC_TYPES, PRIORITY, EMP_ROLES, EXCLUSIVE_ROLES, etc.
|
||||||
|
Líneas 149-230 → INIT_EMPLOYEES, INIT_CLIENTS (vacíos en versión limpia)
|
||||||
|
Líneas 231-410 → INIT_SERVICES, INIT_MAINTENANCE, INIT_SUPPLIERS, INIT_PURCHASE_ORDERS, etc.
|
||||||
|
Líneas 410-535 → TRANSLATIONS (90 claves × 5 idiomas), THEMES (4), INIT_COMPANY
|
||||||
|
Líneas 535-600 → Hooks (useIsMobile), GSComp (global styles dinámicos por tema)
|
||||||
|
Líneas 600-640 → SignaturePad component (canvas touch+mouse)
|
||||||
|
Líneas 640-680 → Field, Modal, StatusBadge, SvcStatusBadge, PriorityBadge
|
||||||
|
Líneas 680-850 → Calendar component (con festivos 2026, domingos, modales)
|
||||||
|
Líneas 850-1500 → ServicesModule (OpsServicesView, EmpServicesView, VentasServicesView, ClientServicesView)
|
||||||
|
Líneas 1500-2100 → InventoryModule (EquipmentForm, PartForm)
|
||||||
|
Líneas 2100-2500 → MaintenanceModule (OpsMaintenanceView, ClientMaintenanceView, EmpMaintenanceView)
|
||||||
|
Líneas 2500-2950 → ComprasModule (OCs, proveedores, fotos)
|
||||||
|
Líneas 2950-3400 → CotizacionesModule (catálogo, PDF, cláusulas)
|
||||||
|
Líneas 3400-4600 → ContableModule (6 pestañas: resumen, facturas, edocuenta, tesorería, SAT/IMSS, nómina)
|
||||||
|
Líneas 4600-4850 → PersonalModule (CRUD empleados)
|
||||||
|
Líneas 4850-5200 → ClientesModule (CRUD clientes, proyectos, appUsers)
|
||||||
|
Líneas 5200-5400 → Sidebar, Header
|
||||||
|
Líneas 5400-5850 → Dashboard (KPIs, panel financiero, alertas)
|
||||||
|
Líneas 5850-6000 → GPSModule
|
||||||
|
Líneas 6000-6500 → ManualesModule
|
||||||
|
Líneas 6500-6900 → ReportesModule (checklists grúa/elevador, firmas, PDF)
|
||||||
|
Líneas 6900-7200 → ConfigModule (idiomas, temas, empresa, fiscal, acerca de)
|
||||||
|
Líneas 7200-7300 → Login (usuario + contraseña)
|
||||||
|
Líneas 7300-7450 → App (estado global, routing)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Estado Global (en App component)
|
||||||
|
|
||||||
|
Todos estos `useState` viven en `App()` y se pasan como props:
|
||||||
|
|
||||||
|
| State | Tipo | Descripción |
|
||||||
|
|-------|------|-------------|
|
||||||
|
| `role` | string | Rol activo (admin, operaciones, ventas, contador, empleado, cliente) |
|
||||||
|
| `mod` | string | Módulo activo del sidebar |
|
||||||
|
| `equipment` | array | Equipos (grúas, elevadores) |
|
||||||
|
| `parts` | array | Refacciones |
|
||||||
|
| `services` | array | Servicios programados |
|
||||||
|
| `maintenance` | array | Mantenimientos |
|
||||||
|
| `employees` | array | Empleados con credenciales |
|
||||||
|
| `clients` | array | Clientes con proyectos y appUsers |
|
||||||
|
| `invoices` | array | Facturas (ingreso/egreso) |
|
||||||
|
| `quotations` | array | Cotizaciones |
|
||||||
|
| `purchaseOrders` | array | Órdenes de compra |
|
||||||
|
| `suppliers` | array | Proveedores |
|
||||||
|
| `messages` | array | Mensajes internos |
|
||||||
|
| `accounts` | array | Cuentas bancarias |
|
||||||
|
| `credits` | array | Créditos y tarjetas |
|
||||||
|
| `transactions` | array | Movimientos bancarios |
|
||||||
|
| `obligations` | array | Obligaciones SAT/IMSS |
|
||||||
|
| `nomina` | array | Registros de nómina semanal |
|
||||||
|
| `lang` | string | Idioma activo (es-MX, en, ru, fr, es-ES) |
|
||||||
|
| `theme` | string | Tema visual (dark, light, mexus, blue) |
|
||||||
|
| `company` | object | Datos de la empresa |
|
||||||
|
| `clientLangs` | object | Idioma por cliente/obra |
|
||||||
|
| `loggedUserId` | string | ID del usuario logueado |
|
||||||
|
| `loggedUserProject` | string | Proyecto del cliente logueado |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Flujo de Autenticación
|
||||||
|
|
||||||
|
```
|
||||||
|
Login → usuario + contraseña
|
||||||
|
├─ Match ADMIN_CREDS? → onLogin("admin", null, null)
|
||||||
|
├─ Match employee.user + employee.pass? → onLogin(emp.systemRole, emp.id, null)
|
||||||
|
├─ Match client appUser.user + appUser.pass? → onLogin("cliente", cli.id, project)
|
||||||
|
└─ Fallback: Match employee.email + employee.pass? → onLogin(emp.systemRole, emp.id, null)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Para migración:** Reemplazar con JWT + bcrypt. La estructura de roles ya está definida.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Modelo de Datos Clave
|
||||||
|
|
||||||
|
### Employee
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
id: "EMP-001",
|
||||||
|
name: "Carlos Mendoza",
|
||||||
|
role: "Operador de Grúa", // Puesto laboral
|
||||||
|
systemRole: "operaciones", // Rol en la app (empleado|operaciones|ventas|contador)
|
||||||
|
phone, email, curp, nss,
|
||||||
|
emergencyContact, startDate,
|
||||||
|
status: "activo"|"inactivo",
|
||||||
|
user: "carlos.mendoza", // Login
|
||||||
|
pass: "mexus2024", // Contraseña (migrar a hash)
|
||||||
|
comprasAccess: false // Acceso al módulo de compras
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Client
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
id: "CLI-001",
|
||||||
|
company: "Hermosillo y Asociados",
|
||||||
|
contact, phone, email, rfc, address,
|
||||||
|
projects: ["WESTIN Tijuana"],
|
||||||
|
status: "activo",
|
||||||
|
projectDetails: {
|
||||||
|
"WESTIN Tijuana": {
|
||||||
|
equipmentIds: ["MX-GT-001"],
|
||||||
|
notifEmails: ["correo@empresa.mx"],
|
||||||
|
appUsers: [
|
||||||
|
{ name: "Fernando", email: "f@h.mx", user: "fhermosillo", pass: "westin2024" }
|
||||||
|
] // Máximo 2 por proyecto
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Service
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
id: "SVC-001",
|
||||||
|
type: "elevacion_grua", // De SVC_TYPES
|
||||||
|
clientName, project, equipmentId,
|
||||||
|
date, endDate, timeSlot: "07:00-15:00",
|
||||||
|
priority: "alta"|"media"|"baja",
|
||||||
|
status: "pendiente"|"aprobado"|"en_proceso"|"en_sitio"|"completado"|"rechazado",
|
||||||
|
assignedTo: ["EMP-001", "EMP-005"],
|
||||||
|
tracking: {
|
||||||
|
inSite: false,
|
||||||
|
inSiteTime: null,
|
||||||
|
startTime: null, endTime: null,
|
||||||
|
photosStart: [], photosDuring: [], photosEnd: [],
|
||||||
|
employeeNotes: "",
|
||||||
|
checklist: null, // Se genera al iniciar (GRUA o ELEVADOR)
|
||||||
|
empSignature: null, // PNG data URL de firma
|
||||||
|
empSignName: "",
|
||||||
|
approverSignature: null,
|
||||||
|
approverSignName: "",
|
||||||
|
reportApproved: false,
|
||||||
|
reportApprovedAt: null,
|
||||||
|
opsNotes: ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Account (Tesorería)
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
id: "CTA-001",
|
||||||
|
name: "BBVA Empresarial Pesos",
|
||||||
|
bank: "BBVA",
|
||||||
|
type: "pesos"|"dolares",
|
||||||
|
number: "**** 4521",
|
||||||
|
balance: 485000, // Se actualiza con transacciones
|
||||||
|
clabe: "012180001234567890"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Obligation (SAT/IMSS)
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
id: "OBL-001",
|
||||||
|
entity: "SAT"|"IMSS"|"Estatal",
|
||||||
|
type: "ISR Retenciones",
|
||||||
|
period: "Marzo 2026",
|
||||||
|
amount: 18500,
|
||||||
|
dueDate: "2026-04-17",
|
||||||
|
status: "pendiente"|"pagado",
|
||||||
|
receipt: null // { name, data } archivo subido
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Nomina
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
id: "NOM-001",
|
||||||
|
week: "Semana 9 (24 Feb — 2 Mar)",
|
||||||
|
period: "2026-03-02",
|
||||||
|
totalBruto: 95000, totalNeto: 78500,
|
||||||
|
isr: 8500, imss: 4200, infonavit: 3800,
|
||||||
|
employees: 6,
|
||||||
|
timbrada: true, timbreXML: { name, date },
|
||||||
|
complemento: false, compXML: null,
|
||||||
|
receipt: null,
|
||||||
|
notes: ""
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Permisos — Tabla de Referencia
|
||||||
|
|
||||||
|
### canEdit / canOperate / canGrantAccess (ContableModule)
|
||||||
|
```javascript
|
||||||
|
const canEdit = isAdmin || isContador; // Editar/eliminar cuentas, créditos, obligaciones, nómina
|
||||||
|
const canOperate = isAdmin || isContador; // Crear, registrar transacciones, subir comprobantes
|
||||||
|
const canGrantAccess = isAdmin; // Activar visualización a otros roles
|
||||||
|
```
|
||||||
|
|
||||||
|
### Compras — Acciones de pago
|
||||||
|
```javascript
|
||||||
|
(role === "admin" || role === "contador") // Marcar pagado, subir comprobante
|
||||||
|
(role === "admin" || role === "operaciones") // Cancelar/eliminar OC
|
||||||
|
```
|
||||||
|
|
||||||
|
### Roles exclusivos en Scheduling
|
||||||
|
```javascript
|
||||||
|
const EXCLUSIVE_ROLES = ["Operador", "Maniobrista", "Operador de Grúa", ...];
|
||||||
|
// Si un operador tiene cualquier asignación en un día → bloqueado TODO el día
|
||||||
|
// Otros roles (Técnicos, Montadores): disponibles fuera de sus slots asignados
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Internacionalización
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const t = (key) => TRANSLATIONS[key]?.[activeLang] || TRANSLATIONS[key]?.["es-MX"] || key;
|
||||||
|
|
||||||
|
// activeLang se resuelve:
|
||||||
|
// 1. Si es cliente → clientLangs[clientId+"|"+project] || clientLangs[clientId] || lang
|
||||||
|
// 2. Todos los demás → lang (idioma global del sistema)
|
||||||
|
```
|
||||||
|
|
||||||
|
Claves traducidas: sidebar (13), login (6), common (20), roles (6), dashboard (8), services (6), contable (5), config (10), priority (3), reports (5).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Generación de PDF
|
||||||
|
|
||||||
|
Se usa `window.open()` + `document.write()` para generar HTML imprimible. Los PDFs incluyen:
|
||||||
|
- Logo de la empresa (del cliente, no CRANEGOO)
|
||||||
|
- Checklist completo con OK/Defecto
|
||||||
|
- Firmas digitales (imágenes PNG incrustadas)
|
||||||
|
- Datos del equipo, cliente, inspector
|
||||||
|
|
||||||
|
**Para migración:** Reemplazar con librería como `jsPDF` o generación server-side.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Notas para el Programador
|
||||||
|
|
||||||
|
1. **Todo el estado es en memoria** — al recargar se pierde. Prioridad #1: base de datos.
|
||||||
|
2. **Las contraseñas están en texto plano** — migrar a bcrypt + JWT inmediatamente.
|
||||||
|
3. **Las firmas son PNG data URLs** — almacenar en object storage (S3/Firebase Storage).
|
||||||
|
4. **Los archivos subidos (XML, fotos) son data URLs en memoria** — migrar a file storage.
|
||||||
|
5. **El CSS es inline** — considerar migrar a Tailwind CSS o CSS modules.
|
||||||
|
6. **No hay tests** — agregar tests unitarios y de integración.
|
||||||
|
7. **El routing es un switch/case interno** — migrar a React Router.
|
||||||
|
8. **No hay error boundaries** — agregar para producción.
|
||||||
67
docs/SETUP.md
Normal file
67
docs/SETUP.md
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# Guía Rápida de Setup
|
||||||
|
|
||||||
|
## Opción 1: Vite (Recomendada)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://git.consultoria-as.com/consultoria-as/cranegoo.git
|
||||||
|
cd cranegoo
|
||||||
|
npm install
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Luego agregar `vite.config.js`:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { defineConfig } from 'vite'
|
||||||
|
import react from '@vitejs/plugin-react'
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [react()],
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Y crear `index.html` en la raíz:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>CRANEGOO</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="root"></div>
|
||||||
|
<script type="module" src="/src/main.jsx"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
Y `src/main.jsx`:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import React from 'react'
|
||||||
|
import ReactDOM from 'react-dom/client'
|
||||||
|
import App from './App.jsx'
|
||||||
|
|
||||||
|
ReactDOM.createRoot(document.getElementById('root')).render(
|
||||||
|
<React.StrictMode>
|
||||||
|
<App />
|
||||||
|
</React.StrictMode>,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Opción 2: Directa en Claude.ai
|
||||||
|
|
||||||
|
El archivo `src/App.jsx` se puede abrir directamente como artifact en claude.ai para pruebas rápidas.
|
||||||
|
|
||||||
|
## Credenciales Admin
|
||||||
|
|
||||||
|
- **Usuario:** `jose.jimenez`
|
||||||
|
- **Contraseña:** `mexus2024`
|
||||||
|
|
||||||
|
## Notas
|
||||||
|
|
||||||
|
- La app corre 100% en frontend, sin backend
|
||||||
|
- Todo el estado se pierde al recargar
|
||||||
|
- Prioridad para el programador: migrar a Supabase/Firebase
|
||||||
21
package.json
Normal file
21
package.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "cranegoo",
|
||||||
|
"version": "3.0.0",
|
||||||
|
"description": "CRANEGOO — Plataforma de Gestión para Grúas y Elevadores",
|
||||||
|
"author": "José Jiménez Salinas — Consultoría Alcaraz Salazar",
|
||||||
|
"private": true,
|
||||||
|
"license": "UNLICENSED",
|
||||||
|
"dependencies": {
|
||||||
|
"react": "^18.2.0",
|
||||||
|
"react-dom": "^18.2.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@vitejs/plugin-react": "^4.0.0",
|
||||||
|
"vite": "^5.0.0"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build",
|
||||||
|
"preview": "vite preview"
|
||||||
|
}
|
||||||
|
}
|
||||||
7440
src/App.jsx
Normal file
7440
src/App.jsx
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user