@codemind.ec/medusa-plugin-invoice 1.0.6 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,12 +9,13 @@ Plugin de **facturación y cotización PDF** para Medusa v2 — genera facturas
9
9
 
10
10
  ## Features
11
11
 
12
- - **Generación de PDFs** — facturas de pedido y proformas de cotización vía pdfmake + Handlebars.
13
- - **Plantillas HTML editables** — CRUD completo de plantillas con preview en tiempo real desde el admin.
14
- - **Configuración de empresa** — logo, RUC, dirección, teléfono, notas de pie de factura.
12
+ - **Multi-empresa** — registra múltiples empresas (InvoiceConfig) y asigna una por defecto. Cada plantilla puede vincularse a una empresa específica.
13
+ - **Generación de PDFs** — facturas de pedido y proformas de cotización vía pdfmake + Handlebars/Puppeteer.
14
+ - **Variables de empresa unificadas** — `company_name`, `company_ruc`, `company_address`, `company_phone`, `company_email` y `company_logo_base64` están disponibles en **todos** los tipos de plantilla gracias a `buildCompanyContext()` en la clase base.
15
+ - **Plantillas HTML editables** — CRUD completo de plantillas con preview en tiempo real, paleta de variables categorizada y selector de empresa.
15
16
  - **Strategy Pattern** — cada tipo de documento (factura, proforma) tiene su propia estrategia extensible.
16
17
  - **Templates embebidos** — plantillas por defecto incluidas en el código; restaurables con un clic.
17
- - **Admin UI** — widget de descarga en pedidos, editor de plantillas con CodeMirror, página de configuración.
18
+ - **Admin UI** — dashboard "Comprobantes y Cotizaciones" con gestión de empresas, editor de plantillas con CodeMirror, widget de descarga en pedidos.
18
19
 
19
20
  ---
20
21
 
@@ -80,26 +81,37 @@ Todos los valores se pueden editar después desde el admin.
80
81
  ```
81
82
  medusa-plugin-invoice/
82
83
  ├── src/
83
- │ ├── admin/ # UI del admin (widgets + rutas)
84
- │ │ ├── widgets/order-invoice.tsx # Botón "Descargar comprobante" en pedidos
85
- │ │ └── routes/ # Páginas de config y plantillas
86
- │ ├── api/ # Rutas REST del plugin
87
- │ │ └── admin/
88
- │ │ ├── invoice-config/ # GET/POST configuración de empresa
89
- │ │ └── invoice-templates/ # CRUD de plantillas + preview + restore
84
+ │ ├── admin/ # UI del admin (widgets + rutas)
85
+ │ │ ├── widgets/order-invoice.tsx # Botón "Descargar comprobante" en pedidos
86
+ │ │ └── routes/invoice-config/
87
+ ├── page.tsx # Dashboard: Comprobantes y Cotizaciones
88
+ │ │ ├── companies/
89
+ │ │ ├── page.tsx # Lista de empresas
90
+ │ │ │ ├── new/page.tsx # Crear empresa
91
+ │ │ │ └── [id]/page.tsx # Editar empresa
92
+ │ │ └── invoice-templates/
93
+ │ │ ├── page.tsx # Lista de plantillas
94
+ │ │ └── [id]/page.tsx # Editor de plantilla (CodeMirror + variables)
95
+ │ ├── api/admin/
96
+ │ │ ├── invoice-config/ # CRUD multi-empresa
97
+ │ │ │ ├── route.ts # GET (listar) / POST (crear)
98
+ │ │ │ └── [id]/
99
+ │ │ │ ├── route.ts # GET / POST / DELETE por ID
100
+ │ │ │ └── set-default/route.ts # POST marcar como default
101
+ │ │ └── invoice-templates/ # CRUD de plantillas + preview + restore
90
102
  │ └── modules/
91
103
  │ └── invoice-generator/
92
- │ ├── models/ # Invoice, InvoiceConfig, InvoiceTemplate
104
+ │ ├── models/ # Invoice, InvoiceConfig, InvoiceTemplate
93
105
  │ ├── templates/
94
- │ │ ├── strategy.ts # BaseDocumentStrategy + TemplateFactory
95
- │ │ ├── order-invoice.ts # Estrategia de factura de pedido
96
- │ │ ├── quote-proforma.ts # Estrategia de proforma de cotización
97
- │ │ └── defaults/index.ts # HTML embebido de plantillas por defecto
98
- │ ├── loaders/ # Seed de config y plantillas iniciales
99
- │ ├── migrations/ # Migraciones de base de datos
100
- │ ├── service.ts # InvoiceGeneratorService
101
- │ └── index.ts # INVOICE_MODULE export
102
- └── index.d.ts # Declaraciones de tipos
106
+ │ │ ├── strategy.ts # BaseDocumentStrategy + buildCompanyContext()
107
+ │ │ ├── order-invoice.ts # Estrategia de factura de pedido
108
+ │ │ ├── quote-proforma.ts # Estrategia de proforma de cotización
109
+ │ │ └── defaults/index.ts # HTML embebido de plantillas por defecto
110
+ │ ├── loaders/ # Seed de config y plantillas iniciales
111
+ │ ├── migrations/ # Migraciones de base de datos
112
+ │ ├── service.ts # InvoiceGeneratorService
113
+ │ └── index.ts # INVOICE_MODULE export
114
+ └── index.d.ts # Declaraciones de tipos
103
115
  ```
104
116
 
105
117
  ### Separación de responsabilidades
@@ -120,12 +132,16 @@ medusa-plugin-invoice/
120
132
 
121
133
  ## API Routes
122
134
 
123
- ### Invoice Config
135
+ ### Invoice Config (Multi-empresa)
124
136
 
125
137
  | Método | Ruta | Descripción |
126
138
  |--------|------|-------------|
127
- | `GET` | `/admin/invoice-config` | Obtener configuración actual |
128
- | `POST` | `/admin/invoice-config` | Actualizar configuración |
139
+ | `GET` | `/admin/invoice-config` | Listar todas las empresas |
140
+ | `POST` | `/admin/invoice-config` | Crear nueva empresa |
141
+ | `GET` | `/admin/invoice-config/:id` | Obtener empresa por ID |
142
+ | `POST` | `/admin/invoice-config/:id` | Actualizar empresa |
143
+ | `DELETE` | `/admin/invoice-config/:id` | Eliminar empresa |
144
+ | `POST` | `/admin/invoice-config/:id/set-default` | Marcar empresa como predeterminada |
129
145
 
130
146
  ### Invoice Templates
131
147
 
@@ -189,7 +205,12 @@ import { TemplateFactory, BaseDocumentStrategy } from "@codemind.ec/medusa-plugi
189
205
 
190
206
  class MyCustomStrategy extends BaseDocumentStrategy<MyInput> {
191
207
  async buildDocumentDefinition(input, config, htmlTemplate?) {
192
- if (htmlTemplate) return this.renderHtmlTemplate(htmlTemplate, input)
208
+ // buildCompanyContext() inyecta automáticamente las 6 variables de empresa
209
+ const companyCtx = await this.buildCompanyContext(config)
210
+
211
+ if (htmlTemplate) {
212
+ return this.renderHtmlTemplate(htmlTemplate, { ...companyCtx, ...myData })
213
+ }
193
214
  // ... construir doc pdfmake programáticamente
194
215
  }
195
216
  }
@@ -197,6 +218,51 @@ class MyCustomStrategy extends BaseDocumentStrategy<MyInput> {
197
218
  TemplateFactory.register("my_custom_doc", MyCustomStrategy)
198
219
  ```
199
220
 
221
+ ### Variables de empresa disponibles en todas las plantillas
222
+
223
+ `buildCompanyContext(config)` retorna:
224
+
225
+ | Variable | Descripción |
226
+ |----------|-------------|
227
+ | `company_name` | Nombre de la empresa |
228
+ | `company_ruc` | RUC / NIT / identificador fiscal |
229
+ | `company_address` | Dirección de la empresa |
230
+ | `company_phone` | Teléfono |
231
+ | `company_email` | Email |
232
+ | `company_logo_base64` | Logo en base64 (data URI) |
233
+
234
+ ### Resolución de empresa en plantillas
235
+
236
+ Cuando se genera un PDF, el servicio resuelve la empresa con esta prioridad:
237
+
238
+ 1. `template.company_id` — si la plantilla tiene una empresa asignada.
239
+ 2. `is_default = true` — la empresa marcada como predeterminada.
240
+ 3. Primera empresa — fallback al primer registro.
241
+
242
+ ---
243
+
244
+ ## Changelog
245
+
246
+ ### 1.2.0
247
+
248
+ - **Variables de empresa unificadas** — `buildCompanyContext()` en `BaseDocumentStrategy` garantiza que las 6 variables de empresa (`company_name`, `company_ruc`, `company_address`, `company_phone`, `company_email`, `company_logo_base64`) estén disponibles en **todos** los tipos de plantilla (factura y proforma).
249
+ - Paleta de variables categorizada en el editor ahora muestra las mismas variables de empresa para ambos tipos de documento.
250
+ - Datos de preview actualizados para proforma con campos de empresa completos.
251
+
252
+ ### 1.1.0
253
+
254
+ - **Soporte multi-empresa** — múltiples configuraciones de empresa con `is_default`.
255
+ - **Asociación plantilla-empresa** — campo `company_id` en plantillas para vincular a una empresa específica.
256
+ - **API CRUD completa** — nuevos endpoints `GET/POST/DELETE /admin/invoice-config/:id` y `POST /admin/invoice-config/:id/set-default`.
257
+ - **Dashboard renovado** — página principal "Comprobantes y Cotizaciones" con tarjetas de navegación.
258
+ - **Gestión de empresas** — páginas de listado, creación y edición de empresas.
259
+ - **Editor de plantillas mejorado** — paleta de variables categorizada, selector de empresa, preview con logo placeholder.
260
+ - Migración automática para `is_default` y `company_id`.
261
+
262
+ ### 1.0.0
263
+
264
+ - Release inicial: generación PDF, plantillas editables, configuración de empresa, strategy pattern.
265
+
200
266
  ---
201
267
 
202
268
  ## License
package/package.json CHANGED
@@ -1,91 +1,90 @@
1
1
  {
2
- "name": "@codemind.ec/medusa-plugin-invoice",
3
- "version": "1.0.6",
4
- "description": "Invoice & quotation PDF widget for Medusa v2 admin — download order receipts and manage company billing config.",
5
- "author": "Kollor <dev@codemind.ec> (https://codemind.ec)",
6
- "license": "MIT",
7
- "files": [
8
- ".medusa/server",
9
- "index.d.ts"
10
- ],
11
- "types": "./index.d.ts",
12
- "exports": {
13
- ".": {
14
- "types": "./index.d.ts",
15
- "default": "./.medusa/server/src/index.js"
16
- },
17
- "./package.json": "./package.json",
18
- "./modules/invoice-generator": {
19
- "types": "./index.d.ts",
20
- "default": "./.medusa/server/src/modules/invoice-generator/index.js"
21
- },
22
- "./modules/*": "./.medusa/server/src/modules/*/index.js",
23
- "./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
24
- "./admin": {
25
- "import": "./.medusa/server/src/admin/index.mjs",
26
- "require": "./.medusa/server/src/admin/index.js",
27
- "default": "./.medusa/server/src/admin/index.js"
28
- }
2
+ "name": "@codemind.ec/medusa-plugin-invoice",
3
+ "version": "1.2.0",
4
+ "description": "Invoice & quotation PDF widget for Medusa v2 admin — download order receipts and manage company billing config.",
5
+ "author": "Kollor <dev@codemind.ec> (https://codemind.ec)",
6
+ "license": "MIT",
7
+ "files": [
8
+ ".medusa/server",
9
+ "index.d.ts"
10
+ ],
11
+ "types": "./index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./index.d.ts",
15
+ "default": "./.medusa/server/src/index.js"
29
16
  },
30
- "keywords": [
31
- "medusa",
32
- "medusa-plugin",
33
- "medusa-v2",
34
- "plugin",
35
- "invoice",
36
- "pdf",
37
- "comprobante",
38
- "codemind",
39
- "kollor"
40
- ],
41
- "scripts": {
42
- "build": "medusa plugin:build",
43
- "dev": "medusa plugin:develop",
44
- "prepublishOnly": "medusa plugin:build"
17
+ "./package.json": "./package.json",
18
+ "./modules/invoice-generator": {
19
+ "types": "./index.d.ts",
20
+ "default": "./.medusa/server/src/modules/invoice-generator/index.js"
45
21
  },
46
- "devDependencies": {
47
- "@medusajs/admin-sdk": "2.13.3",
48
- "@medusajs/admin-shared": "2.13.3",
49
- "@medusajs/cli": "2.13.3",
50
- "@medusajs/framework": "2.13.3",
51
- "@medusajs/icons": "^2.13.3",
52
- "@medusajs/js-sdk": "^2.13.3",
53
- "@medusajs/medusa": "2.13.3",
54
- "@medusajs/test-utils": "2.13.3",
55
- "@medusajs/ui": "^4.1.3",
56
- "@swc/core": "^1.7.28",
57
- "@tanstack/react-query": "^5.64.2",
58
- "@types/node": "^20",
59
- "@types/pdfmake": "^0.2.11",
60
- "@types/react": "^18.3.3",
61
- "@types/react-dom": "^18.3.0",
62
- "handlebars": "^4.7.8",
63
- "prop-types": "^15.8.1",
64
- "react": "^18.3.1",
65
- "react-dom": "^18.3.1",
66
- "react-hook-form": "^7.54.2",
67
- "ts-node": "^10.9.2",
68
- "typescript": "^5",
69
- "vite": "^5.4.14"
70
- },
71
- "dependencies": {
72
- "@codemirror/lang-html": "^6.4.11",
73
- "@codemirror/theme-one-dark": "^6.1.3",
74
- "@uiw/react-codemirror": "^4.25.8",
75
- "axios": "^1.7.7",
76
- "pdfmake": "^0.2.20",
77
- "puppeteer-core": "^24.0.0"
78
- },
79
- "peerDependencies": {
80
- "@medusajs/admin-sdk": "2.13.3",
81
- "@medusajs/cli": "2.13.3",
82
- "@medusajs/framework": "2.13.3",
83
- "@medusajs/icons": "^2.13.3",
84
- "@medusajs/medusa": "2.13.3",
85
- "@medusajs/test-utils": "2.13.3",
86
- "@medusajs/ui": "^4.1.3"
87
- },
88
- "engines": {
89
- "node": ">=20"
22
+ "./modules/*": "./.medusa/server/src/modules/*/index.js",
23
+ "./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
24
+ "./admin": {
25
+ "import": "./.medusa/server/src/admin/index.mjs",
26
+ "require": "./.medusa/server/src/admin/index.js",
27
+ "default": "./.medusa/server/src/admin/index.js"
90
28
  }
91
- }
29
+ },
30
+ "keywords": [
31
+ "medusa",
32
+ "medusa-plugin",
33
+ "medusa-v2",
34
+ "plugin",
35
+ "invoice",
36
+ "pdf",
37
+ "comprobante",
38
+ "codemind",
39
+ "kollor"
40
+ ],
41
+ "devDependencies": {
42
+ "@medusajs/admin-sdk": "2.13.3",
43
+ "@medusajs/admin-shared": "2.13.3",
44
+ "@medusajs/cli": "2.13.3",
45
+ "@medusajs/framework": "2.13.3",
46
+ "@medusajs/icons": "^2.13.3",
47
+ "@medusajs/js-sdk": "^2.13.3",
48
+ "@medusajs/medusa": "2.13.3",
49
+ "@medusajs/test-utils": "2.13.3",
50
+ "@medusajs/ui": "^4.1.3",
51
+ "@swc/core": "^1.7.28",
52
+ "@tanstack/react-query": "^5.64.2",
53
+ "@types/node": "^20",
54
+ "@types/pdfmake": "^0.2.11",
55
+ "@types/react": "^18.3.3",
56
+ "@types/react-dom": "^18.3.0",
57
+ "handlebars": "^4.7.8",
58
+ "prop-types": "^15.8.1",
59
+ "react": "^18.3.1",
60
+ "react-dom": "^18.3.1",
61
+ "react-hook-form": "^7.54.2",
62
+ "ts-node": "^10.9.2",
63
+ "typescript": "^5",
64
+ "vite": "^5.4.14"
65
+ },
66
+ "dependencies": {
67
+ "@codemirror/lang-html": "^6.4.11",
68
+ "@codemirror/theme-one-dark": "^6.1.3",
69
+ "@uiw/react-codemirror": "^4.25.8",
70
+ "axios": "^1.7.7",
71
+ "pdfmake": "^0.2.20",
72
+ "puppeteer-core": "^24.0.0"
73
+ },
74
+ "peerDependencies": {
75
+ "@medusajs/admin-sdk": "2.13.3",
76
+ "@medusajs/cli": "2.13.3",
77
+ "@medusajs/framework": "2.13.3",
78
+ "@medusajs/icons": "^2.13.3",
79
+ "@medusajs/medusa": "2.13.3",
80
+ "@medusajs/test-utils": "2.13.3",
81
+ "@medusajs/ui": "^4.1.3"
82
+ },
83
+ "engines": {
84
+ "node": ">=20"
85
+ },
86
+ "scripts": {
87
+ "build": "medusa plugin:build",
88
+ "dev": "medusa plugin:develop"
89
+ }
90
+ }