@fullqueso/mcp-bc-gastos 1.33.0 → 1.35.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/CHANGELOG.md +25 -0
- package/README.md +22 -6
- package/config/bank-gl-map.json +302 -40
- package/config/company-config.js +22 -1
- package/config/income-accounts.js +3 -2
- package/package.json +1 -1
- package/server.js +5 -0
- package/tools/account-transactions.js +2 -2
- package/tools/anomaly-detection.js +2 -1
- package/tools/auditoria/bank-ledger-entries.js +2 -2
- package/tools/auditoria/bank-reconciliation-report.js +2 -2
- package/tools/auditoria/find-potential-matches.js +2 -2
- package/tools/auditoria/gl-account-entries.js +2 -2
- package/tools/auditoria/list-bank-accounts.js +2 -2
- package/tools/auditoria/pm-receipts.js +2 -2
- package/tools/auditoria/reconcile-pos-sales.js +2 -2
- package/tools/auditoria/reconciliation-status.js +2 -2
- package/tools/auditoria/suggest-journal-entries.js +2 -2
- package/tools/auditoria/unmatched-ledger-entries.js +2 -2
- package/tools/auditoria/unmatched-statement-lines.js +2 -2
- package/tools/cierre-mensual/generate-closing-journal.js +2 -1
- package/tools/cierre-mensual/get-match-results.js +2 -1
- package/tools/cierre-mensual/get-questionnaire.js +2 -1
- package/tools/cierre-mensual/reconcile-with-bc.js +2 -2
- package/tools/cierre-mensual/start-month-closing.js +2 -2
- package/tools/cierre-mensual/submit-answers.js +2 -1
- package/tools/cobranzas/collection-status.js +2 -2
- package/tools/cobranzas/customer-balances.js +2 -2
- package/tools/cobranzas/customer-ledger.js +2 -2
- package/tools/cobranzas/customer-list.js +2 -2
- package/tools/cobranzas/open-payables.js +2 -2
- package/tools/cobranzas/open-receivables.js +2 -2
- package/tools/cobranzas/vendor-ledger.js +2 -2
- package/tools/efficiency-ratios.js +2 -1
- package/tools/expense-analysis.js +2 -1
- package/tools/expense-details.js +2 -2
- package/tools/financials/cash-flow.js +2 -2
- package/tools/financials/income-statement.js +3 -3
- package/tools/financials/index.js +2 -1
- package/tools/get-exchange-rate.js +2 -2
- package/tools/inventario/inventory-by-location.js +2 -2
- package/tools/inventario/inventory-change.js +2 -2
- package/tools/inventario/inventory-levels.js +2 -2
- package/tools/inventario/item-card.js +2 -2
- package/tools/inventario/item-cost-trend.js +2 -2
- package/tools/inventario/item-ledger-entries.js +2 -2
- package/tools/inventario/item-value-entries.js +2 -2
- package/tools/list-vendors.js +2 -2
- package/tools/multi-payment/draft-payables.js +2 -2
- package/tools/multi-payment/draft-receivables.js +2 -2
- package/tools/multi-payment/draft-summary.js +2 -2
- package/tools/multi-payment/unposted-invoices.js +2 -2
- package/tools/payroll/employees.js +2 -2
- package/tools/payroll/index.js +1 -0
- package/tools/payroll/payroll-documents.js +2 -2
- package/tools/payroll/payroll-lines.js +2 -2
- package/tools/payroll/payroll-payments.js +133 -0
- package/tools/reports/manager-report.js +2 -2
- package/tools/store-comparison.js +1 -1
- package/tools/trends.js +2 -1
- package/tools/vendor-transactions.js +2 -2
- package/tools/ventas/item-sales-detail.js +2 -2
- package/tools/ventas/product-performance.js +2 -1
- package/tools/ventas/sales-analysis.js +2 -1
- package/tools/ventas/sales-store-comparison.js +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## [1.35.0] — 2026-09-03
|
|
4
|
+
|
|
5
|
+
Release de publicación: npm estaba en 1.33.0 mientras el repo ya tenía 1.34.0 + FQYK.
|
|
6
|
+
Esta versión sube a npm todo lo pendiente (incluye lo que 1.34.0 nunca documentó acá).
|
|
7
|
+
|
|
8
|
+
### Added — `get_payroll_payments` (venía de 1.34.0, sin entrada en el CHANGELOG)
|
|
9
|
+
Documentos y líneas de pago de nómina para diagnóstico de residuales. `tools/payroll/`.
|
|
10
|
+
|
|
11
|
+
### Added — FQYK City Market operativa en los 59 tools
|
|
12
|
+
- `config/company-config.js`: nueva compañía **FQYK** (City Market, Sabana Grande; alta en
|
|
13
|
+
producción 2026-08-29) y `ALL_STORE_CODES` como **fuente única** del universo de tiendas.
|
|
14
|
+
Los enum `store` de todos los tools la importan en vez de hardcodear la lista — agregar una
|
|
15
|
+
tienda ya no requiere tocar 50 archivos.
|
|
16
|
+
- `companyName` = `ALIMENTOS%20YELLOW%20KING%2C%20C.A`: al PATCHear `companyInformation`, BC
|
|
17
|
+
renombra la compañía a su `displayName`. Las URLs OData usan **ese** nombre; con el anterior
|
|
18
|
+
devuelven `company does not exist`.
|
|
19
|
+
- Si falta `BC_COMPANY_FQYK` en el entorno, `resolveStores()` avisa una vez por stderr: los
|
|
20
|
+
tools OData (por nombre) siguen funcionando, los REST (por GUID) fallan con 404.
|
|
21
|
+
|
|
22
|
+
### Changed — README
|
|
23
|
+
- El bloque de ejemplo de `claude_desktop_config.json` ahora incluye `BC_COMPANY_FQYK`.
|
|
24
|
+
- Notas de instalación en macOS: rutas absolutas de Node (Claude Desktop no hereda el `PATH`
|
|
25
|
+
del shell) y setup de `~/mcp-venv` con `openpyxl` para los tools que exportan Excel.
|
|
26
|
+
- Conteo de tools corregido: 59 en 10 dominios (decía 22 en 4) y sección de tools regenerada.
|
|
27
|
+
|
|
3
28
|
## [1.33.0] — 2026-07-11
|
|
4
29
|
|
|
5
30
|
### Added — `get_income_statement`: estado de resultados en formato Power BI (Level 1)
|
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @fullqueso/mcp-bc-gastos
|
|
2
2
|
|
|
3
|
-
MCP server for Microsoft Business Central — operational expenses, bank reconciliation, POS reconciliation, and accounts receivable/payable. Built for the Full Queso franchise (
|
|
3
|
+
MCP server for Microsoft Business Central — operational expenses, bank reconciliation, POS reconciliation, and accounts receivable/payable. Built for the Full Queso franchise (4 stores: FQ01 Chacao, FQ28 Marques, FQ88 Candelaria, FQYK City Market — plus FQFR, the franchisor).
|
|
4
4
|
|
|
5
|
-
**
|
|
5
|
+
**59 tools** across 10 domains, powered by 4 BC API integrations.
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
@@ -34,6 +34,7 @@ Add to your `claude_desktop_config.json`:
|
|
|
34
34
|
"BC_COMPANY_FQ01": "company-guid-fq01",
|
|
35
35
|
"BC_COMPANY_FQ28": "company-guid-fq28",
|
|
36
36
|
"BC_COMPANY_FQ88": "company-guid-fq88",
|
|
37
|
+
"BC_COMPANY_FQYK": "company-guid-fqyk",
|
|
37
38
|
"BC_COMPANY_FQFR": "company-guid-franquicias"
|
|
38
39
|
}
|
|
39
40
|
}
|
|
@@ -41,6 +42,17 @@ Add to your `claude_desktop_config.json`:
|
|
|
41
42
|
}
|
|
42
43
|
```
|
|
43
44
|
|
|
45
|
+
> **macOS — rutas absolutas.** Claude Desktop no hereda el `PATH` del shell: si Node vino de
|
|
46
|
+
> Homebrew o nvm, `"command": "npx"` falla con `spawn npx ENOENT`. Lo robusto es
|
|
47
|
+
> `npm install -g @fullqueso/mcp-bc-gastos` y luego apuntar el config al server con rutas
|
|
48
|
+
> absolutas — `"command"` = salida de `command -v node`, `"args"` = `["<npm root -g>/@fullqueso/mcp-bc-gastos/server.js"]`.
|
|
49
|
+
|
|
50
|
+
> **Exportación a Excel.** Los tools que generan `.xlsx` (`generate_cxp_report`,
|
|
51
|
+
> `get_bank_reconciliation_report` con `excel_output`, `get_cash_flow`, drafts, cierre mensual)
|
|
52
|
+
> usan `~/mcp-venv/bin/python3` con `openpyxl`. Setup:
|
|
53
|
+
> `python3 -m venv ~/mcp-venv && ~/mcp-venv/bin/pip install openpyxl`.
|
|
54
|
+
> El resto de los tools funciona sin esto.
|
|
55
|
+
|
|
44
56
|
### Local Development
|
|
45
57
|
|
|
46
58
|
```bash
|
|
@@ -52,7 +64,7 @@ cp .env.example .env
|
|
|
52
64
|
npm start
|
|
53
65
|
```
|
|
54
66
|
|
|
55
|
-
## Tools (
|
|
67
|
+
## Tools (59)
|
|
56
68
|
|
|
57
69
|
_Sección generada por `scripts/generate-tools-doc.mjs` — no editar a mano._
|
|
58
70
|
_Regenerar con: `node scripts/generate-tools-doc.mjs --write`_
|
|
@@ -60,7 +72,7 @@ _Regenerar con: `node scripts/generate-tools-doc.mjs --write`_
|
|
|
60
72
|
### Expense Analysis & Core (11 tools)
|
|
61
73
|
|
|
62
74
|
#### compare_stores
|
|
63
|
-
Compara la eficiencia de gastos entre las tiendas de Full Queso (FQ01 Chacao, FQ28 Marqués, FQ88 Candelaria).
|
|
75
|
+
Compara la eficiencia de gastos entre las tiendas de Full Queso (FQ01 Chacao, FQ28 Marqués, FQ88 Candelaria, FQYK City Market).
|
|
64
76
|
- Params: `period`, `month`, `start_date`, `end_date`
|
|
65
77
|
|
|
66
78
|
#### detect_anomalies
|
|
@@ -267,7 +279,7 @@ Resumen ejecutivo consolidado de todos los Multi-Payments en borrador (Open y Tr
|
|
|
267
279
|
Facturas de compra y/o venta SIN POSTEAR en Business Central (status Draft o In Review).
|
|
268
280
|
- Params: `store`*, `type`, `start_date`, `end_date`, `include_in_review`, `summary_only`
|
|
269
281
|
|
|
270
|
-
### Nómina (
|
|
282
|
+
### Nómina (4 tools)
|
|
271
283
|
|
|
272
284
|
#### get_employees
|
|
273
285
|
Lista empleados de una tienda con datos de nomina: tipo, status, salarios base, bonos predeterminados, fechas.
|
|
@@ -281,6 +293,10 @@ Lista documentos de nomina (headers) con filtros por periodo, tipo, status.
|
|
|
281
293
|
Detalle de nomina por empleado para un documento.
|
|
282
294
|
- Params: `store`*, `document_no`*, `employee_code`, `employee_search`
|
|
283
295
|
|
|
296
|
+
#### get_payroll_payments
|
|
297
|
+
Documentos de PAGO de nómina (tabla separada de la obligación) con sus líneas por empleado.
|
|
298
|
+
- Params: `store`*, `payroll_document_no`, `payment_no`, `status`, `include_lines`
|
|
299
|
+
|
|
284
300
|
### Reports (2 tools)
|
|
285
301
|
|
|
286
302
|
#### generate_cxp_report
|
|
@@ -294,7 +310,7 @@ Genera el Reporte Gerente HTML completo para una tienda FQ.
|
|
|
294
310
|
### Ventas (4 tools)
|
|
295
311
|
|
|
296
312
|
#### compare_sales_by_store
|
|
297
|
-
Comparación de rendimiento de VENTAS entre las tiendas de Full Queso (FQ01 Chacao, FQ28 Marqués, FQ88 Candelaria).
|
|
313
|
+
Comparación de rendimiento de VENTAS entre las tiendas de Full Queso (FQ01 Chacao, FQ28 Marqués, FQ88 Candelaria, FQYK City Market).
|
|
298
314
|
- Params: `period`, `month`, `start_date`, `end_date`, `metrics`
|
|
299
315
|
|
|
300
316
|
#### get_item_sales_detail
|
package/config/bank-gl-map.json
CHANGED
|
@@ -1,59 +1,319 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.
|
|
3
|
-
"last_updated": "2026-
|
|
2
|
+
"version": "1.1",
|
|
3
|
+
"last_updated": "2026-08-27",
|
|
4
4
|
"description": "Mapeo banco_code (BC Bank Account suffix) → cuenta GL (Chart of Accounts). Usado por POS reconciliation y journal entry suggestions. Cada tienda tiene su propio CoA con bancos distintos.",
|
|
5
5
|
"stores": {
|
|
6
6
|
"FQ01": {
|
|
7
7
|
"store_name": "FQ01 - Chacao Sambil",
|
|
8
8
|
"accounts": {
|
|
9
|
-
"MN0001": {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
9
|
+
"MN0001": {
|
|
10
|
+
"gl": "18210",
|
|
11
|
+
"name": "Banesco 4421 Bs.",
|
|
12
|
+
"currency": "VES",
|
|
13
|
+
"category": "bancos_nacionales"
|
|
14
|
+
},
|
|
15
|
+
"MN0002": {
|
|
16
|
+
"gl": "18220",
|
|
17
|
+
"name": "BDV 1925 Bs.",
|
|
18
|
+
"currency": "VES",
|
|
19
|
+
"category": "bancos_nacionales"
|
|
20
|
+
},
|
|
21
|
+
"MN0003": {
|
|
22
|
+
"gl": "18230",
|
|
23
|
+
"name": "Bancamiga 7015 Bs.",
|
|
24
|
+
"currency": "VES",
|
|
25
|
+
"category": "bancos_nacionales"
|
|
26
|
+
},
|
|
27
|
+
"MN0004": {
|
|
28
|
+
"gl": "18240",
|
|
29
|
+
"name": "BDV 5550 Bs.",
|
|
30
|
+
"currency": "VES",
|
|
31
|
+
"category": "bancos_nacionales"
|
|
32
|
+
},
|
|
33
|
+
"MN0005": {
|
|
34
|
+
"gl": "18250",
|
|
35
|
+
"name": "Bancamiga 4523 Bs.",
|
|
36
|
+
"currency": "VES",
|
|
37
|
+
"category": "bancos_nacionales"
|
|
38
|
+
},
|
|
39
|
+
"MN0006": {
|
|
40
|
+
"gl": "18260",
|
|
41
|
+
"name": "Bancrecer 2450 Bs.",
|
|
42
|
+
"currency": "VES",
|
|
43
|
+
"category": "bancos_nacionales"
|
|
44
|
+
},
|
|
45
|
+
"MN0007": {
|
|
46
|
+
"gl": "18270",
|
|
47
|
+
"name": "Bancrecer 2467 Bs.",
|
|
48
|
+
"currency": "VES",
|
|
49
|
+
"category": "bancos_nacionales"
|
|
50
|
+
},
|
|
51
|
+
"MN0008": {
|
|
52
|
+
"gl": "18280",
|
|
53
|
+
"name": "BDV 5187 Bs. (Pago Móvil)",
|
|
54
|
+
"currency": "VES",
|
|
55
|
+
"category": "bancos_nacionales"
|
|
56
|
+
},
|
|
57
|
+
"MN0012": {
|
|
58
|
+
"gl": "18290",
|
|
59
|
+
"name": "UBII",
|
|
60
|
+
"currency": "VES",
|
|
61
|
+
"category": "bancos_nacionales"
|
|
62
|
+
},
|
|
63
|
+
"MN0030": {
|
|
64
|
+
"gl": "18130",
|
|
65
|
+
"name": "Caja tienda ventas Bs.",
|
|
66
|
+
"currency": "VES",
|
|
67
|
+
"category": "caja"
|
|
68
|
+
},
|
|
69
|
+
"ME0030": {
|
|
70
|
+
"gl": "18140",
|
|
71
|
+
"name": "Caja tienda ventas $",
|
|
72
|
+
"currency": "USD",
|
|
73
|
+
"category": "caja"
|
|
74
|
+
},
|
|
75
|
+
"ME0006": {
|
|
76
|
+
"gl": null,
|
|
77
|
+
"name": "Zelle USD (Wells Fargo)",
|
|
78
|
+
"currency": "USD",
|
|
79
|
+
"category": "bancos_extranjeros",
|
|
80
|
+
"_nota": "GL pendiente de confirmar"
|
|
81
|
+
}
|
|
21
82
|
}
|
|
22
83
|
},
|
|
23
84
|
"FQ28": {
|
|
24
85
|
"store_name": "FQ28 - Marqués El Unicentro",
|
|
25
86
|
"accounts": {
|
|
26
|
-
"MN0001": {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"
|
|
39
|
-
|
|
87
|
+
"MN0001": {
|
|
88
|
+
"gl": "18210",
|
|
89
|
+
"name": "BDV 8139 Bs.",
|
|
90
|
+
"currency": "VES",
|
|
91
|
+
"category": "bancos_nacionales"
|
|
92
|
+
},
|
|
93
|
+
"MN0002": {
|
|
94
|
+
"gl": "18220",
|
|
95
|
+
"name": "Bancrecer 5474 Bs.",
|
|
96
|
+
"currency": "VES",
|
|
97
|
+
"category": "bancos_nacionales"
|
|
98
|
+
},
|
|
99
|
+
"MN0028": {
|
|
100
|
+
"gl": "18290",
|
|
101
|
+
"name": "UBII 6249 Bs",
|
|
102
|
+
"currency": "VES",
|
|
103
|
+
"category": "bancos_nacionales",
|
|
104
|
+
"_nota": "Punto 2 + Punto 3."
|
|
105
|
+
},
|
|
106
|
+
"MN0029": {
|
|
107
|
+
"gl": "18291",
|
|
108
|
+
"name": "UBII 6442 Bs",
|
|
109
|
+
"currency": "VES",
|
|
110
|
+
"category": "bancos_nacionales",
|
|
111
|
+
"_nota": "Punto 4 + Punto 7."
|
|
112
|
+
},
|
|
113
|
+
"MN0030": {
|
|
114
|
+
"gl": "18130",
|
|
115
|
+
"name": "Caja tienda ventas Bs.",
|
|
116
|
+
"currency": "VES",
|
|
117
|
+
"category": "caja"
|
|
118
|
+
},
|
|
119
|
+
"MN0031": {
|
|
120
|
+
"gl": "18160",
|
|
121
|
+
"name": "Caja transitoria tienda ventas Bs.",
|
|
122
|
+
"currency": "VES",
|
|
123
|
+
"category": "caja"
|
|
124
|
+
},
|
|
125
|
+
"MN0032": {
|
|
126
|
+
"gl": "18292",
|
|
127
|
+
"name": "UBII 4 y 7 (duplicada)",
|
|
128
|
+
"currency": "VES",
|
|
129
|
+
"category": "bancos_nacionales",
|
|
130
|
+
"_nota": "Cuenta duplicada creada por error — NO usar. Punto 4 y Punto 7 van a MN0029. Confirmado 2026-05-17."
|
|
131
|
+
},
|
|
132
|
+
"MN0033": {
|
|
133
|
+
"gl": "18295",
|
|
134
|
+
"name": "UBII 7 bloqueado (duplicada)",
|
|
135
|
+
"currency": "VES",
|
|
136
|
+
"category": "bancos_nacionales",
|
|
137
|
+
"_nota": "Cuenta duplicada creada por error — NO usar. Punto 7 va a MN0029. Confirmado 2026-05-17."
|
|
138
|
+
},
|
|
139
|
+
"MN0098": {
|
|
140
|
+
"gl": "18298",
|
|
141
|
+
"name": "Operaciones en Tránsito",
|
|
142
|
+
"currency": "VES",
|
|
143
|
+
"category": "bancos_nacionales"
|
|
144
|
+
},
|
|
145
|
+
"ME0002": {
|
|
146
|
+
"gl": "18310",
|
|
147
|
+
"name": "Bancrecer $",
|
|
148
|
+
"currency": "USD",
|
|
149
|
+
"category": "bancos_nacionales_divisas"
|
|
150
|
+
},
|
|
151
|
+
"ME0005": {
|
|
152
|
+
"gl": "18410",
|
|
153
|
+
"name": "Zelle Bofa $ *",
|
|
154
|
+
"currency": "USD",
|
|
155
|
+
"category": "bancos_extranjeros"
|
|
156
|
+
},
|
|
157
|
+
"ME0030": {
|
|
158
|
+
"gl": "18140",
|
|
159
|
+
"name": "Caja tienda ventas $",
|
|
160
|
+
"currency": "USD",
|
|
161
|
+
"category": "caja"
|
|
162
|
+
},
|
|
163
|
+
"ME0031": {
|
|
164
|
+
"gl": "18170",
|
|
165
|
+
"name": "Caja transitoria tienda ventas $",
|
|
166
|
+
"currency": "USD",
|
|
167
|
+
"category": "caja"
|
|
168
|
+
},
|
|
169
|
+
"ME0035": {
|
|
170
|
+
"gl": "18150",
|
|
171
|
+
"name": "Banco Bóveda $",
|
|
172
|
+
"currency": "USD",
|
|
173
|
+
"category": "caja"
|
|
174
|
+
}
|
|
40
175
|
}
|
|
41
176
|
},
|
|
42
177
|
"FQ88": {
|
|
43
178
|
"store_name": "FQ88 - La Candelaria",
|
|
44
179
|
"_nota": "GL confirmados 2026-06-05 desde fq-239-audit/data/fq_bancos_all.json (consolidacion_por_banco).",
|
|
45
180
|
"accounts": {
|
|
46
|
-
"MN0001": {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
181
|
+
"MN0001": {
|
|
182
|
+
"gl": "18210",
|
|
183
|
+
"name": "Bancamiga 0240 Bs.",
|
|
184
|
+
"currency": "VES",
|
|
185
|
+
"category": "bancos_nacionales"
|
|
186
|
+
},
|
|
187
|
+
"MN0002": {
|
|
188
|
+
"gl": "18220",
|
|
189
|
+
"name": "Bancamiga 9379 Bs. *",
|
|
190
|
+
"currency": "VES",
|
|
191
|
+
"category": "bancos_nacionales"
|
|
192
|
+
},
|
|
193
|
+
"MN0003": {
|
|
194
|
+
"gl": "18230",
|
|
195
|
+
"name": "BDV 9127 Bs.",
|
|
196
|
+
"currency": "VES",
|
|
197
|
+
"category": "bancos_nacionales"
|
|
198
|
+
},
|
|
199
|
+
"MN0004": {
|
|
200
|
+
"gl": "18240",
|
|
201
|
+
"name": "BDV 7191 Bs. *",
|
|
202
|
+
"currency": "VES",
|
|
203
|
+
"category": "bancos_nacionales"
|
|
204
|
+
},
|
|
205
|
+
"MN0005": {
|
|
206
|
+
"gl": "18250",
|
|
207
|
+
"name": "Bancrecer 2558 Bs.",
|
|
208
|
+
"currency": "VES",
|
|
209
|
+
"category": "bancos_nacionales"
|
|
210
|
+
},
|
|
211
|
+
"MN0007": {
|
|
212
|
+
"gl": "18270",
|
|
213
|
+
"name": "BDV Pago Movil 5145",
|
|
214
|
+
"currency": "VES",
|
|
215
|
+
"category": "bancos_nacionales"
|
|
216
|
+
},
|
|
217
|
+
"MN0008": {
|
|
218
|
+
"gl": "18275",
|
|
219
|
+
"name": "Banesco 9547 Bs.",
|
|
220
|
+
"currency": "VES",
|
|
221
|
+
"category": "bancos_nacionales",
|
|
222
|
+
"_nota": "Banco nuevo agregado 2026-07-10 (Puntos 20 y 21, BANESCO_9547_BS., banco 0134). gl 18275 removido de adjustment_accounts_ves el 2026-07-10 (FP): ahora es banco real, entra normal en revaluación/reconciliación."
|
|
223
|
+
},
|
|
224
|
+
"MN0028": {
|
|
225
|
+
"gl": "18290",
|
|
226
|
+
"name": "Ubii Bank",
|
|
227
|
+
"currency": "VES",
|
|
228
|
+
"category": "bancos_nacionales"
|
|
229
|
+
},
|
|
230
|
+
"MN0030": {
|
|
231
|
+
"gl": "18130",
|
|
232
|
+
"name": "Caja tienda ventas Bs.",
|
|
233
|
+
"currency": "VES",
|
|
234
|
+
"category": "caja"
|
|
235
|
+
},
|
|
236
|
+
"ME0030": {
|
|
237
|
+
"gl": "18140",
|
|
238
|
+
"name": "Caja tienda ventas $",
|
|
239
|
+
"currency": "USD",
|
|
240
|
+
"category": "caja"
|
|
241
|
+
},
|
|
242
|
+
"ME0005": {
|
|
243
|
+
"gl": "18410",
|
|
244
|
+
"name": "Zelle USD",
|
|
245
|
+
"currency": "USD",
|
|
246
|
+
"category": "bancos_extranjeros"
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
"FQYK": {
|
|
251
|
+
"store_name": "FQYK - City Market Sabana Grande",
|
|
252
|
+
"_nota": "Tienda nueva (provisionada 2026). Bancos del levantamiento \"CUENTAS FQYK.xlsx\" (FP 2026-08-26). Mercantil 9220 recibe Puntos 1 y 3 + Pago Móvil Tienda/Delivery — una sola cuenta real, un solo banco_code.",
|
|
253
|
+
"accounts": {
|
|
254
|
+
"MN0001": {
|
|
255
|
+
"gl": "18210",
|
|
256
|
+
"name": "Mercantil 9220 Bs.",
|
|
257
|
+
"currency": "VES",
|
|
258
|
+
"category": "bancos_nacionales",
|
|
259
|
+
"_nota": "Puntos 1 y 3 + Pago Móvil Tienda/Delivery. EMPRESARIAL. Cuenta 01050193891193639220."
|
|
260
|
+
},
|
|
261
|
+
"MN0002": {
|
|
262
|
+
"gl": "18220",
|
|
263
|
+
"name": "BNC 2988 Bs. *",
|
|
264
|
+
"currency": "VES",
|
|
265
|
+
"category": "bancos_nacionales",
|
|
266
|
+
"_nota": "Puntos 2 y 4. PERSONAL. Cuenta 01910259942100022988."
|
|
267
|
+
},
|
|
268
|
+
"MN0003": {
|
|
269
|
+
"gl": "18230",
|
|
270
|
+
"name": "Banesco 1055 Bs.",
|
|
271
|
+
"currency": "VES",
|
|
272
|
+
"category": "bancos_nacionales",
|
|
273
|
+
"_nota": "Punto 5. EMPRESARIAL. Cuenta 01340328733281081055."
|
|
274
|
+
},
|
|
275
|
+
"MN0030": {
|
|
276
|
+
"gl": "18130",
|
|
277
|
+
"name": "Caja tienda ventas Bs.",
|
|
278
|
+
"currency": "VES",
|
|
279
|
+
"category": "caja"
|
|
280
|
+
},
|
|
281
|
+
"MN0031": {
|
|
282
|
+
"gl": "18160",
|
|
283
|
+
"name": "Caja transitoria tienda ventas Bs.",
|
|
284
|
+
"currency": "VES",
|
|
285
|
+
"category": "caja"
|
|
286
|
+
},
|
|
287
|
+
"MN0097": {
|
|
288
|
+
"gl": "18297",
|
|
289
|
+
"name": "Diferencias de caja diaria",
|
|
290
|
+
"currency": "VES",
|
|
291
|
+
"category": "caja"
|
|
292
|
+
},
|
|
293
|
+
"ME0005": {
|
|
294
|
+
"gl": "18410",
|
|
295
|
+
"name": "Zelle $",
|
|
296
|
+
"currency": "USD",
|
|
297
|
+
"category": "bancos_extranjeros"
|
|
298
|
+
},
|
|
299
|
+
"ME0030": {
|
|
300
|
+
"gl": "18140",
|
|
301
|
+
"name": "Caja tienda ventas $",
|
|
302
|
+
"currency": "USD",
|
|
303
|
+
"category": "caja"
|
|
304
|
+
},
|
|
305
|
+
"ME0031": {
|
|
306
|
+
"gl": "18170",
|
|
307
|
+
"name": "Caja transitoria tienda ventas $",
|
|
308
|
+
"currency": "USD",
|
|
309
|
+
"category": "caja"
|
|
310
|
+
},
|
|
311
|
+
"ME0035": {
|
|
312
|
+
"gl": "18150",
|
|
313
|
+
"name": "Banco Bóveda $",
|
|
314
|
+
"currency": "USD",
|
|
315
|
+
"category": "caja"
|
|
316
|
+
}
|
|
57
317
|
}
|
|
58
318
|
}
|
|
59
319
|
},
|
|
@@ -93,5 +353,7 @@
|
|
|
93
353
|
"18999": "Total Caja y Bancos"
|
|
94
354
|
},
|
|
95
355
|
"_adjustment_accounts_nota": "Cuentas VES de ajuste/tránsito (NO son bancos reales, no tienen statement). Se tratan como informativas en la revaluación cambiaria (fuera del total de pérdida y del asiento sugerido). FP 2026-06-05. 18275 removido 2026-07-10: BC lo reasignó al banco real Banesco 9547 (FQ88-MN0008).",
|
|
96
|
-
"adjustment_accounts_ves": [
|
|
356
|
+
"adjustment_accounts_ves": [
|
|
357
|
+
"18297"
|
|
358
|
+
]
|
|
97
359
|
}
|
package/config/company-config.js
CHANGED
|
@@ -31,10 +31,23 @@ function getStores() {
|
|
|
31
31
|
shortName: 'Franquicias',
|
|
32
32
|
location: 'Franquicias',
|
|
33
33
|
},
|
|
34
|
+
// Tienda nueva (provisionada en producción el 2026-08-29 con fq-company-provisioning).
|
|
35
|
+
// ⚠️ companyName = el DISPLAY name: al PATCHear companyInformation, BC renombra la compañía
|
|
36
|
+
// al displayName ("Alimentos Yellow King" → "ALIMENTOS YELLOW KING, C.A"). Las URLs OData
|
|
37
|
+
// usan ese nombre; con el otro devuelven "company does not exist".
|
|
38
|
+
FQYK: {
|
|
39
|
+
companyId: process.env.BC_COMPANY_FQYK,
|
|
40
|
+
companyName: 'ALIMENTOS%20YELLOW%20KING%2C%20C.A',
|
|
41
|
+
name: 'FQYK City Market',
|
|
42
|
+
shortName: 'City Market',
|
|
43
|
+
location: 'Sabana Grande, Caracas',
|
|
44
|
+
},
|
|
34
45
|
};
|
|
35
46
|
}
|
|
36
47
|
|
|
37
|
-
|
|
48
|
+
const warnedMissingId = new Set();
|
|
49
|
+
|
|
50
|
+
export const ALL_STORE_CODES = ['FQ01', 'FQ28', 'FQ88', 'FQFR', 'FQYK'];
|
|
38
51
|
|
|
39
52
|
export function resolveStores(storeCodes) {
|
|
40
53
|
const stores = getStores();
|
|
@@ -44,6 +57,14 @@ export function resolveStores(storeCodes) {
|
|
|
44
57
|
return storeCodes.map((code) => {
|
|
45
58
|
const info = stores[code];
|
|
46
59
|
if (!info) throw new Error(`Tienda desconocida: ${code}. Opciones: ${ALL_STORE_CODES.join(', ')}`);
|
|
60
|
+
// Una tienda recién provisionada existe acá antes de que su GUID llegue al .env (lo
|
|
61
|
+
// escribe scan-ecosystem.js --apply --company-id). No se lanza error porque los tools
|
|
62
|
+
// que van por OData usan companyName y funcionan igual; solo se avisa una vez para que
|
|
63
|
+
// un 404 de la API REST no parezca otra cosa.
|
|
64
|
+
if (!info.companyId && !warnedMissingId.has(code)) {
|
|
65
|
+
warnedMissingId.add(code);
|
|
66
|
+
console.error(`[company-config] ⚠️ Falta BC_COMPANY_${code} en el .env: los tools que usan la API REST (por GUID) van a fallar para ${code}. Los de OData (por nombre) funcionan. Fix: node scripts/scan-ecosystem.js --store-code ${code} --company-id <GUID> --apply (repo fq-company-provisioning).`);
|
|
67
|
+
}
|
|
47
68
|
return { code, ...info };
|
|
48
69
|
});
|
|
49
70
|
}
|
|
@@ -43,8 +43,9 @@ export const NON_SALES_REVENUE_ACCOUNTS = ['40580', '40540', '40550'];
|
|
|
43
43
|
// venta salgan correctos si alguien consulta ventas de FQFR.
|
|
44
44
|
export const FQFR_INTERCOMPANY_REVENUE_ACCOUNTS = ['40420', '40430', '40660', '40930'];
|
|
45
45
|
|
|
46
|
-
// Tiendas a las que aplica el KPI nómina/ventas (FQFR excluido por completo
|
|
47
|
-
|
|
46
|
+
// Tiendas a las que aplica el KPI nómina/ventas (FQFR excluido por completo: es la
|
|
47
|
+
// franquiciadora, no una tienda). FQYK entra desde su alta en 2026-08.
|
|
48
|
+
export const KPI_PAYROLL_STORES = ['FQ01', 'FQ28', 'FQ88', 'FQYK'];
|
|
48
49
|
|
|
49
50
|
// Cuentas de clasificación de ingreso por tienda (interco/eventos/no-venta).
|
|
50
51
|
export function getRevenueClassification(storeCode) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fullqueso/mcp-bc-gastos",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.35.0",
|
|
4
4
|
"description": "MCP server for Business Central operational expense analysis, bank reconciliation, POS reconciliation, accounts receivable/payable, multi-payment draft visibility, payroll, inventory cost analysis, and manager reports - Full Queso franchise stores",
|
|
5
5
|
"main": "server.js",
|
|
6
6
|
"bin": {
|
package/server.js
CHANGED
|
@@ -69,6 +69,7 @@ import {
|
|
|
69
69
|
import {
|
|
70
70
|
payrollDocumentsTool, handlePayrollDocuments,
|
|
71
71
|
payrollLinesTool, handlePayrollLines,
|
|
72
|
+
payrollPaymentsTool, handlePayrollPayments,
|
|
72
73
|
employeesTool, handleEmployees,
|
|
73
74
|
} from './tools/payroll/index.js';
|
|
74
75
|
|
|
@@ -170,6 +171,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
170
171
|
// Payroll
|
|
171
172
|
payrollDocumentsTool,
|
|
172
173
|
payrollLinesTool,
|
|
174
|
+
payrollPaymentsTool,
|
|
173
175
|
employeesTool,
|
|
174
176
|
// Inventario (inventory cost analysis)
|
|
175
177
|
itemCardTool,
|
|
@@ -319,6 +321,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
319
321
|
case 'get_payroll_lines':
|
|
320
322
|
result = await handlePayrollLines(bcClient, args);
|
|
321
323
|
break;
|
|
324
|
+
case 'get_payroll_payments':
|
|
325
|
+
result = await handlePayrollPayments(bcClient, args);
|
|
326
|
+
break;
|
|
322
327
|
case 'get_employees':
|
|
323
328
|
result = await handleEmployees(bcClient, args);
|
|
324
329
|
break;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getExpenseCategory, getAccountName } from '../config/expense-accounts.js';
|
|
2
|
-
import { resolveStores } from '../config/company-config.js';
|
|
2
|
+
import { resolveStores, ALL_STORE_CODES } from '../config/company-config.js';
|
|
3
3
|
import { round2 } from '../utils/currency-converter.js';
|
|
4
4
|
|
|
5
5
|
export const accountTransactionsTool = {
|
|
@@ -15,7 +15,7 @@ export const accountTransactionsTool = {
|
|
|
15
15
|
},
|
|
16
16
|
store: {
|
|
17
17
|
type: 'string',
|
|
18
|
-
enum:
|
|
18
|
+
enum: ALL_STORE_CODES,
|
|
19
19
|
description: 'Tienda a consultar.',
|
|
20
20
|
},
|
|
21
21
|
start_date: {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ALL_STORE_CODES } from '../config/company-config.js';
|
|
1
2
|
import { getDateRange, getPreviousPeriodRange } from '../utils/date-helper.js';
|
|
2
3
|
import { detectAnomalies } from '../lib/anomaly-detector.js';
|
|
3
4
|
|
|
@@ -28,7 +29,7 @@ export const anomalyDetectionTool = {
|
|
|
28
29
|
},
|
|
29
30
|
stores: {
|
|
30
31
|
type: 'array',
|
|
31
|
-
items: { type: 'string', enum: [
|
|
32
|
+
items: { type: 'string', enum: [...ALL_STORE_CODES, 'all'] },
|
|
32
33
|
description: 'Tiendas a analizar.',
|
|
33
34
|
default: ['all'],
|
|
34
35
|
},
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveStores } from '../../config/company-config.js';
|
|
1
|
+
import { resolveStores, ALL_STORE_CODES } from '../../config/company-config.js';
|
|
2
2
|
|
|
3
3
|
export const bankLedgerEntriesTool = {
|
|
4
4
|
name: 'get_bank_ledger_entries',
|
|
@@ -9,7 +9,7 @@ export const bankLedgerEntriesTool = {
|
|
|
9
9
|
properties: {
|
|
10
10
|
store: {
|
|
11
11
|
type: 'string',
|
|
12
|
-
enum:
|
|
12
|
+
enum: ALL_STORE_CODES,
|
|
13
13
|
description: 'Tienda a consultar.',
|
|
14
14
|
},
|
|
15
15
|
bank_account: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DateTime } from 'luxon';
|
|
2
|
-
import { resolveStores } from '../../config/company-config.js';
|
|
2
|
+
import { resolveStores, ALL_STORE_CODES } from '../../config/company-config.js';
|
|
3
3
|
import { matchBankDescription } from '../../config/bank-keywords.js';
|
|
4
4
|
import { logger } from '../../utils/logger.js';
|
|
5
5
|
|
|
@@ -12,7 +12,7 @@ export const bankReconciliationReportTool = {
|
|
|
12
12
|
properties: {
|
|
13
13
|
store: {
|
|
14
14
|
type: 'string',
|
|
15
|
-
enum:
|
|
15
|
+
enum: ALL_STORE_CODES,
|
|
16
16
|
description: 'Tienda a consultar.',
|
|
17
17
|
},
|
|
18
18
|
bank_account: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DateTime } from 'luxon';
|
|
2
|
-
import { resolveStores } from '../../config/company-config.js';
|
|
2
|
+
import { resolveStores, ALL_STORE_CODES } from '../../config/company-config.js';
|
|
3
3
|
|
|
4
4
|
export const findPotentialMatchesTool = {
|
|
5
5
|
name: 'find_potential_matches',
|
|
@@ -10,7 +10,7 @@ export const findPotentialMatchesTool = {
|
|
|
10
10
|
properties: {
|
|
11
11
|
store: {
|
|
12
12
|
type: 'string',
|
|
13
|
-
enum:
|
|
13
|
+
enum: ALL_STORE_CODES,
|
|
14
14
|
description: 'Tienda a consultar.',
|
|
15
15
|
},
|
|
16
16
|
bank_account: {
|