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