@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.
Files changed (65) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +22 -6
  3. package/config/bank-gl-map.json +302 -40
  4. package/config/company-config.js +22 -1
  5. package/config/income-accounts.js +3 -2
  6. package/package.json +1 -1
  7. package/server.js +5 -0
  8. package/tools/account-transactions.js +2 -2
  9. package/tools/anomaly-detection.js +2 -1
  10. package/tools/auditoria/bank-ledger-entries.js +2 -2
  11. package/tools/auditoria/bank-reconciliation-report.js +2 -2
  12. package/tools/auditoria/find-potential-matches.js +2 -2
  13. package/tools/auditoria/gl-account-entries.js +2 -2
  14. package/tools/auditoria/list-bank-accounts.js +2 -2
  15. package/tools/auditoria/pm-receipts.js +2 -2
  16. package/tools/auditoria/reconcile-pos-sales.js +2 -2
  17. package/tools/auditoria/reconciliation-status.js +2 -2
  18. package/tools/auditoria/suggest-journal-entries.js +2 -2
  19. package/tools/auditoria/unmatched-ledger-entries.js +2 -2
  20. package/tools/auditoria/unmatched-statement-lines.js +2 -2
  21. package/tools/cierre-mensual/generate-closing-journal.js +2 -1
  22. package/tools/cierre-mensual/get-match-results.js +2 -1
  23. package/tools/cierre-mensual/get-questionnaire.js +2 -1
  24. package/tools/cierre-mensual/reconcile-with-bc.js +2 -2
  25. package/tools/cierre-mensual/start-month-closing.js +2 -2
  26. package/tools/cierre-mensual/submit-answers.js +2 -1
  27. package/tools/cobranzas/collection-status.js +2 -2
  28. package/tools/cobranzas/customer-balances.js +2 -2
  29. package/tools/cobranzas/customer-ledger.js +2 -2
  30. package/tools/cobranzas/customer-list.js +2 -2
  31. package/tools/cobranzas/open-payables.js +2 -2
  32. package/tools/cobranzas/open-receivables.js +2 -2
  33. package/tools/cobranzas/vendor-ledger.js +2 -2
  34. package/tools/efficiency-ratios.js +2 -1
  35. package/tools/expense-analysis.js +2 -1
  36. package/tools/expense-details.js +2 -2
  37. package/tools/financials/cash-flow.js +2 -2
  38. package/tools/financials/income-statement.js +3 -3
  39. package/tools/financials/index.js +2 -1
  40. package/tools/get-exchange-rate.js +2 -2
  41. package/tools/inventario/inventory-by-location.js +2 -2
  42. package/tools/inventario/inventory-change.js +2 -2
  43. package/tools/inventario/inventory-levels.js +2 -2
  44. package/tools/inventario/item-card.js +2 -2
  45. package/tools/inventario/item-cost-trend.js +2 -2
  46. package/tools/inventario/item-ledger-entries.js +2 -2
  47. package/tools/inventario/item-value-entries.js +2 -2
  48. package/tools/list-vendors.js +2 -2
  49. package/tools/multi-payment/draft-payables.js +2 -2
  50. package/tools/multi-payment/draft-receivables.js +2 -2
  51. package/tools/multi-payment/draft-summary.js +2 -2
  52. package/tools/multi-payment/unposted-invoices.js +2 -2
  53. package/tools/payroll/employees.js +2 -2
  54. package/tools/payroll/index.js +1 -0
  55. package/tools/payroll/payroll-documents.js +2 -2
  56. package/tools/payroll/payroll-lines.js +2 -2
  57. package/tools/payroll/payroll-payments.js +133 -0
  58. package/tools/reports/manager-report.js +2 -2
  59. package/tools/store-comparison.js +1 -1
  60. package/tools/trends.js +2 -1
  61. package/tools/vendor-transactions.js +2 -2
  62. package/tools/ventas/item-sales-detail.js +2 -2
  63. package/tools/ventas/product-performance.js +2 -1
  64. package/tools/ventas/sales-analysis.js +2 -1
  65. 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 stores: FQ01 Chacao, FQ28 Marques, FQ88 Candelaria).
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
- **22 tools** across 4 domains, powered by 3 BC API integrations.
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 (58)
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 (3 tools)
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
@@ -1,59 +1,319 @@
1
1
  {
2
- "version": "1.0",
3
- "last_updated": "2026-05-17",
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": { "gl": "18210", "name": "Banesco 4421 Bs.", "currency": "VES", "category": "bancos_nacionales" },
10
- "MN0002": { "gl": "18220", "name": "BDV 1925 Bs.", "currency": "VES", "category": "bancos_nacionales" },
11
- "MN0003": { "gl": "18230", "name": "Bancamiga 7015 Bs.", "currency": "VES", "category": "bancos_nacionales" },
12
- "MN0004": { "gl": "18240", "name": "BDV 5550 Bs.", "currency": "VES", "category": "bancos_nacionales" },
13
- "MN0005": { "gl": "18250", "name": "Bancamiga 4523 Bs.", "currency": "VES", "category": "bancos_nacionales" },
14
- "MN0006": { "gl": "18260", "name": "Bancrecer 2450 Bs.", "currency": "VES", "category": "bancos_nacionales" },
15
- "MN0007": { "gl": "18270", "name": "Bancrecer 2467 Bs.", "currency": "VES", "category": "bancos_nacionales" },
16
- "MN0008": { "gl": "18280", "name": "BDV 5187 Bs. (Pago Móvil)", "currency": "VES", "category": "bancos_nacionales" },
17
- "MN0012": { "gl": "18290", "name": "UBII", "currency": "VES", "category": "bancos_nacionales" },
18
- "MN0030": { "gl": "18130", "name": "Caja tienda ventas Bs.", "currency": "VES", "category": "caja" },
19
- "ME0030": { "gl": "18140", "name": "Caja tienda ventas $", "currency": "USD", "category": "caja" },
20
- "ME0006": { "gl": null, "name": "Zelle USD (Wells Fargo)", "currency": "USD", "category": "bancos_extranjeros", "_nota": "GL pendiente de confirmar" }
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": { "gl": "18210", "name": "BDV 8139 Bs.", "currency": "VES", "category": "bancos_nacionales" },
27
- "MN0002": { "gl": "18220", "name": "Bancrecer 5474 Bs.", "currency": "VES", "category": "bancos_nacionales" },
28
- "MN0028": { "gl": "18290", "name": "UBII 6249 Bs", "currency": "VES", "category": "bancos_nacionales", "_nota": "Punto 2 + Punto 3." },
29
- "MN0029": { "gl": "18291", "name": "UBII 6442 Bs", "currency": "VES", "category": "bancos_nacionales", "_nota": "Punto 4 + Punto 7." },
30
- "MN0030": { "gl": "18130", "name": "Caja tienda ventas Bs.", "currency": "VES", "category": "caja" },
31
- "MN0031": { "gl": "18160", "name": "Caja transitoria tienda ventas Bs.", "currency": "VES", "category": "caja" },
32
- "MN0032": { "gl": "18292", "name": "UBII 4 y 7 (duplicada)", "currency": "VES", "category": "bancos_nacionales", "_nota": "Cuenta duplicada creada por error — NO usar. Punto 4 y Punto 7 van a MN0029. Confirmado 2026-05-17." },
33
- "MN0033": { "gl": "18295", "name": "UBII 7 bloqueado (duplicada)", "currency": "VES", "category": "bancos_nacionales", "_nota": "Cuenta duplicada creada por error — NO usar. Punto 7 va a MN0029. Confirmado 2026-05-17." },
34
- "MN0098": { "gl": "18298", "name": "Operaciones en Tránsito", "currency": "VES", "category": "bancos_nacionales" },
35
- "ME0002": { "gl": "18310", "name": "Bancrecer $", "currency": "USD", "category": "bancos_nacionales_divisas" },
36
- "ME0005": { "gl": "18410", "name": "Zelle Bofa $ *", "currency": "USD", "category": "bancos_extranjeros" },
37
- "ME0030": { "gl": "18140", "name": "Caja tienda ventas $", "currency": "USD", "category": "caja" },
38
- "ME0031": { "gl": "18170", "name": "Caja transitoria tienda ventas $", "currency": "USD", "category": "caja" },
39
- "ME0035": { "gl": "18150", "name": "Banco Bóveda $", "currency": "USD", "category": "caja" }
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": { "gl": "18210", "name": "Bancamiga 0240 Bs.", "currency": "VES", "category": "bancos_nacionales" },
47
- "MN0002": { "gl": "18220", "name": "Bancamiga 9379 Bs. *", "currency": "VES", "category": "bancos_nacionales" },
48
- "MN0003": { "gl": "18230", "name": "BDV 9127 Bs.", "currency": "VES", "category": "bancos_nacionales" },
49
- "MN0004": { "gl": "18240", "name": "BDV 7191 Bs. *", "currency": "VES", "category": "bancos_nacionales" },
50
- "MN0005": { "gl": "18250", "name": "Bancrecer 2558 Bs.", "currency": "VES", "category": "bancos_nacionales" },
51
- "MN0007": { "gl": "18270", "name": "BDV Pago Movil 5145", "currency": "VES", "category": "bancos_nacionales" },
52
- "MN0008": { "gl": "18275", "name": "Banesco 9547 Bs.", "currency": "VES", "category": "bancos_nacionales", "_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." },
53
- "MN0028": { "gl": "18290", "name": "Ubii Bank", "currency": "VES", "category": "bancos_nacionales" },
54
- "MN0030": { "gl": "18130", "name": "Caja tienda ventas Bs.", "currency": "VES", "category": "caja" },
55
- "ME0030": { "gl": "18140", "name": "Caja tienda ventas $", "currency": "USD", "category": "caja" },
56
- "ME0005": { "gl": "18410", "name": "Zelle USD", "currency": "USD", "category": "bancos_extranjeros" }
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": ["18297"]
356
+ "adjustment_accounts_ves": [
357
+ "18297"
358
+ ]
97
359
  }
@@ -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
- export const ALL_STORE_CODES = ['FQ01', 'FQ28', 'FQ88', 'FQFR'];
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
- export const KPI_PAYROLL_STORES = ['FQ01', 'FQ28', 'FQ88'];
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.33.0",
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: ['FQ01', 'FQ28', 'FQ88', 'FQFR'],
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: ['FQ01', 'FQ28', 'FQ88', 'FQFR', 'all'] },
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: ['FQ01', 'FQ28', 'FQ88', 'FQFR'],
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: ['FQ01', 'FQ28', 'FQ88', 'FQFR'],
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: ['FQ01', 'FQ28', 'FQ88', 'FQFR'],
13
+ enum: ALL_STORE_CODES,
14
14
  description: 'Tienda a consultar.',
15
15
  },
16
16
  bank_account: {