Skip to content

Integracion con SAP Business One

Por que SAP

SAP Business One es el ERP de referencia para empresas medianas del sector logistico en Europa. Su estandar en facturacion electronica (S/4HANA) y su integracion con aduanas lo hacen ideal para transporte internacional.

Lo que puedes integrar

ProcesoAPI CargofferAPI SAP B1
Facturas ventacontract.signedInvoices (POST)
Clientescompany/contractsBusinessPartners
Proveedores (transportistas)truckers/Suppliers
Pagospayment.receivedIncomingPayments

Conexion via Service Layer

SAP Business One expone una API REST llamada Service Layer. Necesitas:

  • Servidor SAP con Service Layer habilitado
  • Credenciales de empresa (CompanyDB, UserName, Password)
  • Licencia para integraciones API

Autenticacion

bash
curl -X POST "https://tu-sap-server:50000/b1s/v1/Login" \
  -H "Content-Type: application/json" \
  -d '{
    "CompanyDB": "TuEmpresa",
    "UserName": "manager",
    "Password": "tu_password"
  }'

La respuesta incluye un cookie de sesion (B1SESSION) que usaras en las siguientes llamadas.


Guia paso a paso: Factura desde contrato

Paso 1: Configurar webhook en Cargoffer

bash
curl -X POST "https://api.pro.cargoffer.com/api/webhook" \
  -H "Authorization: Bearer *** \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://tu-sap-server:50000/webhook/cargoffer",
    "events": ["contract.signed"]
  }'

Paso 2: Buscar cliente en SAP por CIF

bash
curl -X GET "https://tu-sap-server:50000/b1s/v1/BusinessPartners?\$filter=CardCode eq 'A12345678'" \
  -H "Cookie: B1SESSION=tu_session_id"

Si no existe, lo creas:

bash
curl -X POST "https://tu-sap-server:50000/b1s/v1/BusinessPartners" \
  -H "Cookie: B1SESSION=tu_session_id" \
  -H "Content-Type: application/json" \
  -d '{
    "CardCode": "A12345678",
    "CardName": "Cliente SA",
    "CardType": "C",
    "FederalTaxID": "A12345678",
    "Currency": "EUR"
  }'

Paso 3: Crear factura

bash
curl -X POST "https://tu-sap-server:50000/b1s/v1/Invoices" \
  -H "Cookie: B1SESSION=tu_session_id" \
  -H "Content-Type: application/json" \
  -d '{
    "CardCode": "A12345678",
    "DocDate": "2026-06-17",
    "DocDueDate": "2026-07-17",
    "DocumentLines": [{
      "ItemCode": "TRANSPORTE",
      "Quantity": 1,
      "UnitPrice": 1250.00,
      "WarehouseCode": "01",
      "AccountCode": "70500001"
    }],
    "Comments": "Transporte SRV-2026-001 Madrid-Barcelona"
  }'

Paso 4: Python con requests

python
import requests

class SAPConnector:
    def __init__(self, server, company, user, password):
        self.base = f"{server}/b1s/v1"
        self.session = requests.Session()
        
        # Login
        r = self.session.post(f"{self.base}/Login", json={
            "CompanyDB": company,
            "UserName": user,
            "Password": password
        })
        self.session_id = r.cookies.get("B1SESSION")
    
    def crear_factura(self, contrato):
        """Crea una factura en SAP desde un contrato de Cargoffer."""
        factura = {
            "CardCode": contrato["client"]["cif"],
            "CardName": contrato["client"]["name"],
            "DocDate": contrato["date"],
            "DocumentLines": [{
                "ItemCode": "TRANSPORTE",
                "Quantity": 1,
                "UnitPrice": contrato["amount"]
            }],
            "Comments": f"Transporte {contrato['serviceCode']}"
        }
        
        r = self.session.post(f"{self.base}/Invoices", json=factura)
        return r.status_code, r.json()

Caso de uso: Importacion masiva de contratos

Al cierre del mes, puedes exportar todos los contratos de Cargoffer y crear las facturas en SAP Business One de forma masiva:

python
TOKEN=*** = SAPConnector("https://tu-sap-server:50000", "Empresa", "admin", "pass")

# Obtener todos los contratos del mes
r = requests.get(
    "https://api.pro.cargoffer.com/api/company/contracts/",
    headers={"Authorization": f"Bearer {TOKEN}"}
)

for contrato in r.json():
    status, result = sap.crear_factura(contrato)
    print(f"{contrato['serviceCode']}: HTTP {status} - {'OK' if status == 201 else 'ERROR'}")

Documentacion relacionada

Documentación de Cargoffer