@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/.medusa/server/src/admin/index.js +737 -306
- package/.medusa/server/src/admin/index.mjs +740 -309
- package/.medusa/server/src/api/admin/invoice-config/[id]/route.js +31 -0
- package/.medusa/server/src/api/admin/invoice-config/[id]/set-default/route.js +19 -0
- package/.medusa/server/src/api/admin/invoice-config/route.js +6 -8
- package/.medusa/server/src/api/admin/invoice-templates/route.js +2 -2
- package/.medusa/server/src/api/admin/invoice-templates/validators.js +3 -1
- package/.medusa/server/src/modules/invoice-generator/migrations/Migration20260321120000.js +29 -0
- package/.medusa/server/src/modules/invoice-generator/models/invoice-config.js +2 -1
- package/.medusa/server/src/modules/invoice-generator/models/invoice-template.js +2 -1
- package/.medusa/server/src/modules/invoice-generator/service.js +14 -2
- package/.medusa/server/src/modules/invoice-generator/templates/order-invoice.js +3 -10
- package/.medusa/server/src/modules/invoice-generator/templates/quote-proforma.js +3 -2
- package/.medusa/server/src/modules/invoice-generator/templates/strategy.js +19 -1
- package/README.md +91 -25
- package/package.json +86 -87
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
|
-
- **
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
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** —
|
|
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/
|
|
84
|
-
│ │ ├── widgets/order-invoice.tsx
|
|
85
|
-
│ │ └── routes/
|
|
86
|
-
│ ├──
|
|
87
|
-
│ │
|
|
88
|
-
│ │ ├──
|
|
89
|
-
│ │
|
|
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/
|
|
104
|
+
│ ├── models/ # Invoice, InvoiceConfig, InvoiceTemplate
|
|
93
105
|
│ ├── templates/
|
|
94
|
-
│ │ ├── strategy.ts
|
|
95
|
-
│ │ ├── order-invoice.ts
|
|
96
|
-
│ │ ├── quote-proforma.ts
|
|
97
|
-
│ │ └── defaults/index.ts
|
|
98
|
-
│ ├── loaders/
|
|
99
|
-
│ ├── migrations/
|
|
100
|
-
│ ├── service.ts
|
|
101
|
-
│ └── index.ts
|
|
102
|
-
└── index.d.ts
|
|
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` |
|
|
128
|
-
| `POST` | `/admin/invoice-config` |
|
|
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
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
+
}
|