Skip to content

Commit d6fcd23

Browse files
cristotodevclaude
andcommitted
feat(analytics): add lost customers recovery tool for client retention analysis
- Add get_clientes_perdidos tool to identify customers who had previous purchase history but haven't bought since a specified date - Implement comprehensive client analysis with historical statistics (total invoices, revenue, last purchase date) - Add smart date handling between FacturaScripts DD-MM-YYYY and ISO YYYY-MM-DD formats - Include robust pagination and chronological sorting by last purchase date - Provide client contact information for targeted retention campaigns - Add 19 comprehensive tests (14 unit + 5 integration) with full scenario coverage - Update tool registration in main server and module exports - Enhance documentation with usage examples and business use cases 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent f2bfc65 commit d6fcd23

6 files changed

Lines changed: 1099 additions & 35 deletions

File tree

CLAUDE.md

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -553,15 +553,15 @@ All 28 resources return consistent pagination format:
553553

554554
### Current Project Status (v1.0.2)
555555
-**59 MCP Resources** - Complete FacturaScripts API coverage including OpenAPI part16 implementation
556-
-**65 Interactive Tools** - Full Claude Desktop integration with advanced filtering including specialized business analytics
557-
-**566 Tests Passing** - Comprehensive unit & integration testing with modular organization including specialized business tools
556+
-**66 Interactive Tools** - Full Claude Desktop integration with advanced filtering including specialized business analytics and customer retention tools
557+
-**567+ Tests Passing** - Comprehensive unit & integration testing with modular organization including specialized business tools and customer retention analytics
558558
-**Live API Integration** - Working with real FacturaScripts instances
559559
-**Advanced API Support** - Full FacturaScripts filtering, sorting, and pagination
560560
-**TypeScript Strict Mode** - Full type safety and IntelliSense
561561
-**Production Ready** - Error handling, documentation, and monitoring
562562
-**Automated Changelog** - Conventional commits and automated release management with Keep a Changelog format
563563
-**Enhanced Documentation** - Comprehensive guides and best practices
564-
-**Specialized Business Tools** - Advanced invoice search by CIF/NIF and best-selling products analytics with comprehensive error handling
564+
-**Specialized Business Tools** - Advanced customer analytics including lost client recovery, invoice search by CIF/NIF, best-selling products, and customer retention analytics with comprehensive error handling
565565
-**MCP TypeScript SDK Examples** - Comprehensive SDK documentation with business-focused examples
566566
-**OpenAPI Part16 Implementation** - Product variants, work events, analytics models, and PDF export functionality
567567
-**Binary Data Support** - PDF generation and download capabilities
@@ -697,6 +697,75 @@ All 28 resources return consistent pagination format:
697697
}
698698
```
699699

700+
### Latest Implementation: `get_clientes_perdidos`
701+
702+
**Implementation Details:**
703+
- **Purpose**: Identify customers who had previous purchase history but haven't bought since a specified date until now
704+
- **Location**: `src/modules/sales-orders/facturaclientes/tool.ts`
705+
- **Multi-step Process**: Historical invoice analysis → Client grouping and statistics calculation → Lost client filtering → Client details lookup → Chronological ranking
706+
- **Key Features**:
707+
- **Smart Date Handling**: Automatic conversion between FacturaScripts DD-MM-YYYY and ISO YYYY-MM-DD formats
708+
- **Historical Analysis**: Only considers clients with previous purchase history (excludes never-purchased clients)
709+
- **Comprehensive Data**: Includes client contact info and historical statistics (total invoices, revenue, last purchase date)
710+
- **Intelligent Sorting**: Orders by `fecha_ultima_factura` descending (most recent lost clients first)
711+
- **Robust Pagination**: Full pagination support (limit: 1-1000, default: 100)
712+
- **Business Intelligence**: Provides actionable data for customer retention campaigns
713+
- **Testing**: 14 comprehensive unit tests + 5 integration tests covering all scenarios
714+
- **Date Logic Fix**: Corrected DD-MM-YYYY to YYYY-MM-DD conversion for accurate comparisons
715+
- **Status**: ✅ Complete and production-ready with date format fix
716+
717+
**Response Structure:**
718+
```json
719+
{
720+
"fecha_corte": "2025-08-01",
721+
"meta": { "total": 25, "limit": 100, "offset": 0, "hasMore": false },
722+
"data": [
723+
{
724+
"codcliente": "CLI001",
725+
"nombre": "Cliente Perdido S.L.",
726+
"email": "contacto@clienteperdido.com",
727+
"telefono1": "600123456",
728+
"fecha_ultima_factura": "15-12-2024",
729+
"total_facturas_historicas": 8,
730+
"total_facturado_historico": 15750.50
731+
}
732+
]
733+
}
734+
```
735+
736+
**Usage Examples:**
737+
```typescript
738+
// Basic usage - find clients lost since August 1st, 2025
739+
get_clientes_perdidos({
740+
fecha_desde: "2025-08-01"
741+
})
742+
743+
// With pagination for large datasets
744+
get_clientes_perdidos({
745+
fecha_desde: "2024-06-01",
746+
limit: 50,
747+
offset: 0
748+
})
749+
750+
// Find clients lost in the last 6 months
751+
get_clientes_perdidos({
752+
fecha_desde: "2024-08-01",
753+
limit: 25
754+
})
755+
```
756+
757+
**Business Use Cases:**
758+
- **Customer Retention Campaigns**: Target clients who haven't purchased recently but have historical value
759+
- **Sales Recovery**: Prioritize follow-up based on `total_facturado_historico` and `fecha_ultima_factura`
760+
- **Performance Analysis**: Identify patterns in customer attrition by analyzing lost client timelines
761+
- **Marketing Segmentation**: Create targeted campaigns for different customer segments based on purchase history
762+
763+
**Date Format Handling:**
764+
The tool automatically handles FacturaScripts' DD-MM-YYYY date format:
765+
- Invoice date `"17-08-2025"` with `fecha_desde: "2025-08-01"` → Client NOT lost (recent purchase)
766+
- Invoice date `"10-07-2025"` with `fecha_desde: "2025-08-01"` → Client IS lost (old purchase)
767+
- Sorting works correctly with mixed date formats in the database
768+
700769
### Previous Implementation: `get_facturas_cliente_por_cifnif`
701770

702771
**Implementation Details:**

src/index.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ import { SeriesResource } from './modules/configuration/series/resource.js';
8787
import { SubcuentasResource } from './modules/accounting/subcuentas/resource.js';
8888
import { TarifasResource } from './modules/configuration/tarifas/resource.js';
8989
// Import new tool functions
90-
import { toolByCifnifImplementation, toolClientesMorososImplementation, toolClientesTopFacturacionImplementation, toolClientesSinComprasImplementation, toolExportarFacturaImplementation, toolClientesFrecuenciaComprasImplementation, toolFacturasConErroresImplementation } from './modules/sales-orders/facturaclientes/tool.js';
90+
import { toolByCifnifImplementation, toolClientesMorososImplementation, toolClientesTopFacturacionImplementation, toolClientesSinComprasImplementation, toolExportarFacturaImplementation, toolClientesFrecuenciaComprasImplementation, toolFacturasConErroresImplementation, toolClientesPerdidosImplementation } from './modules/sales-orders/facturaclientes/tool.js';
9191
import { lowStockToolImplementation } from './modules/core-business/stocks/tool.js';
9292
import { toolProductosMasVendidosImplementation } from './modules/sales-orders/line-items/lineafacturaclientes/tool.js';
9393
import { productosNoVendidosToolDefinition, productosNoVendidosToolImplementation } from './modules/core-business/productos/index.js';
@@ -435,6 +435,19 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
435435
required: ['fecha_desde', 'fecha_hasta']
436436
}
437437
},
438+
{
439+
name: 'get_clientes_perdidos',
440+
description: 'Obtiene una lista de clientes que tenían facturas anteriormente pero no han comprado desde una fecha específica hasta ahora. Excluye clientes que nunca han comprado (sin historial de facturas). Realiza análisis en tres pasos: 1) Obtiene todos los clientes con historial de facturas, 2) Identifica clientes con facturas anteriores a la fecha límite, 3) Filtra aquellos sin facturas desde la fecha hasta hoy. Útil para campañas de recuperación de clientes perdidos, análisis de retención y estrategias de reactivación.',
441+
inputSchema: {
442+
type: 'object',
443+
properties: {
444+
fecha_desde: { type: 'string', description: 'Fecha límite desde la cual considerar clientes como perdidos (formato: YYYY-MM-DD). Clientes sin facturas desde esta fecha hasta hoy se consideran perdidos.' },
445+
limit: { type: 'number', description: 'Número máximo de clientes perdidos a devolver (1-1000)', minimum: 1, maximum: 1000, default: 100 },
446+
offset: { type: 'number', description: 'Número de clientes a omitir para paginación', minimum: 0, default: 0 }
447+
},
448+
required: ['fecha_desde']
449+
}
450+
},
438451
{
439452
name: 'get_clientes_sin_compras',
440453
description: 'Obtiene una lista de clientes que no han realizado compras (no aparecen en facturas de clientes) en un rango de fechas específico. Realiza búsqueda en dos pasos: 1) Obtiene todos los clientes activos, 2) Filtra aquellos sin facturas en el período. Útil para campañas de reactivación, análisis de clientes inactivos y estrategias de retención.',
@@ -3038,6 +3051,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
30383051
return await toolClientesTopFacturacionImplementation(request.params.arguments as any, fsClient);
30393052
}
30403053

3054+
case 'get_clientes_perdidos': {
3055+
return await toolClientesPerdidosImplementation(request.params.arguments as any, fsClient);
3056+
}
3057+
30413058
case 'get_clientes_sin_compras': {
30423059
return await toolClientesSinComprasImplementation(request.params.arguments as any, fsClient);
30433060
}

src/modules/sales-orders/facturaclientes/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ export {
77
toolClientesMorososDefinition as facturaclientesMorososToolDefinition,
88
toolClientesMorososImplementation as facturaclientesMorososToolImplementation,
99
toolClientesTopFacturacionDefinition as facturaclientesTopFacturacionToolDefinition,
10-
toolClientesTopFacturacionImplementation as facturaclientesTopFacturacionToolImplementation
10+
toolClientesTopFacturacionImplementation as facturaclientesTopFacturacionToolImplementation,
11+
toolClientesPerdidosDefinition as facturaclientesPerdidosToolDefinition,
12+
toolClientesPerdidosImplementation as facturaclientesPerdidosToolImplementation
1113
} from './tool.js';

0 commit comments

Comments
 (0)