adapter.py
Implementación del protocolo BrightmarketAdapter — lectura desde tu fuente.
src/adapter.py define ClientAdapter, que lee datos de tu fuente y devuelve filas crudas (dicts u objetos con tus nombres de columna).
Debe implementar todos los métodos de BrightmarketAdapter.
Field maps en constants.py
El SDK no asume tus nombres de columna. Configurá la relación en src/constants.py:
CLIENT_FIELD_MAP = {
"external_id": "tu_columna_id_cliente",
"name": "tu_columna_nombre",
"sex": "tu_columna_sexo",
# ...
}Guía de field maps: Field maps.
Métodos requeridos
| Método | Uso | Campos lógicos (configurar en constants) |
|---|---|---|
get_clients_created | Clientes nuevos | external_id, name, campos opcionales de contacto/ubicación |
get_clients_modified | Clientes modificados | Igual que created |
get_skus | Artículos/SKUs | article_external_id, sku_external_id, campos de catálogo opcionales |
get_tickets | Tickets (una fila por línea) | ticket_id, client_external_id, sku, quantity, price, … |
get_payment_methods | Métodos de pago | external_id, name |
get_promotions | Promociones | Filas vía PROMOTION_FIELD_MAP o dicts promotion_data listos |
get_rewards | Rewards (opcional) | client_external_id, segment, message, incentive, expiration |
get_points_movements | Movimientos de puntos (opcional) | client_external_id, movement_type, points, … |
get_stock_adjustments | Ajustes de stock (opcional) | sku_external_id, branch_office_external_id, stock; opcionales reason, date |
Patrón recomendado
- Implementá un método del adapter a la vez
- Agregá el
*_FIELD_MAPcorrespondiente enconstants.py - Agregá value maps (
SEXO_MAPPING,POINTS_MOVEMENT_TYPE_MAPPING, …) cuando haya códigos a traducir - Probá con el flag de sync correspondiente antes de pasar al siguiente
El mapeo a payloads y escritura en la API lo hace el SDK (brightmarket_data_sync.sync), no tu repo.
Si necesitás enrichment propio del cliente (sufijos de fechas en nombres, normalización de IDs, etc.), poné helpers en src/transforms/ y usalos acá en el adapter antes de devolver las filas. Mantené la raíz de src/ limpia para el cableado del SDK. Ver estructura del proyecto.
Helpers opcionales
def get_pagos_by_ticket(self, from_date=None, to_date=None) -> dict:
"""ticket id → lista de externalId de medios de pago"""
def get_points_expiration_adjustments(self, from_date=None, to_date=None) -> list:
"""Filas mapeadas con POINTS_EXPIRATION_FIELD_MAP para ajustes post-sync"""