Brightmarket Sync Guide

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étodoUsoCampos lógicos (configurar en constants)
get_clients_createdClientes nuevosexternal_id, name, campos opcionales de contacto/ubicación
get_clients_modifiedClientes modificadosIgual que created
get_skusArtículos/SKUsarticle_external_id, sku_external_id, campos de catálogo opcionales
get_ticketsTickets (una fila por línea)ticket_id, client_external_id, sku, quantity, price, …
get_payment_methodsMétodos de pagoexternal_id, name
get_promotionsPromocionesFilas vía PROMOTION_FIELD_MAP o dicts promotion_data listos
get_rewardsRewards (opcional)client_external_id, segment, message, incentive, expiration
get_points_movementsMovimientos de puntos (opcional)client_external_id, movement_type, points, …
get_stock_adjustmentsAjustes de stock (opcional)sku_external_id, branch_office_external_id, stock; opcionales reason, date

Patrón recomendado

  1. Implementá un método del adapter a la vez
  2. Agregá el *_FIELD_MAP correspondiente en constants.py
  3. Agregá value maps (SEXO_MAPPING, POINTS_MOVEMENT_TYPE_MAPPING, …) cuando haya códigos a traducir
  4. 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"""

On this page