Skip to content

SAP journal export

For campgrounds whose accounting lives in SAP, this adapter posts one consolidated journal entry per day — the day’s revenue grouped by GL account — directly to SAP. No CSV exports, no manual postings.

  • Daily journal posted at 02:00 (configurable) via Celery beat
  • Aggregates POS, payments, and invoices for the day into balanced debit / credit lines
  • Idempotent — (tenant, journal_date) is unique, so re-runs don’t double-post
  • Reverse a posted journal in one click (records the SAP reversal doc number)
  • Full log of every post / reverse with the SAP-side document number

Supports SAP Business One Service Layer and SAP S/4HANA OData in the same adapter — pick the flavor on the settings card.

SAP integrations are per-customer: each campground that uses SAP has their own SAP environment with their own users, GL accounts, and rules. CampOne can’t pre-provision a sandbox.

You’ll need:

  • For B1 (Service Layer): instance URL (typically https://<host>:50000/b1s/v1/), Company DB name, a service-layer integration user with permission to post JournalEntries and run the Cancel action.
  • For S/4HANA: the tenant base URL, a communication-arrangement user for SAP_COM_0002 / API_JOURNALENTRYBULKCREATE_REQUE_SRV, with S_DEVELOP and posting permission on the target ledger.
  • A GL account mapping — which CampOne revenue type maps to which SAP account.

If you don’t have an SAP partner yet, the standard path is:

  • Email partner@sap.com to enrol in SAP PartnerEdge as an ISV
  • Or contact a Swiss B1 partner directly: Versino Schweiz (+41 56 418 32 99 · sapsupport@versino.ch) or MTF B1 Consulting (+41 52 632 33 88)

Settings → Integrations → Vendor Adapters → SAP:

FieldDescription
FlavorBusiness One or S/4HANA
EnvironmentTest / Production
Instance URLThe SAP endpoint
Company DB(B1 only) — e.g. SBO_DEMO_CH
Username / PasswordThe integration user’s credentials
GL account mappingJSON: {"booking_revenue": "4001", "pos_revenue": "4002", "vat_collected": "2200", …}
Default cost centerOptional — applied to every line if set

Click Save, then Test connection. The probe calls the cheapest no-op (whoami / login) — green pill confirms.

Once a day (default 02:00 server time) for each enabled tenant:

  1. Aggregate the previous day’s POSTransaction, Payment, and Invoice rows by (revenue_type, vat_rate).
  2. Build a balanced journal: cash + receivables on the debit side; revenue + VAT on the credit side.
  3. Post to SAP. Save the returned document number on a SAPJournalDoc row.
  4. If the day had no closeable transactions, skip silently.

The settings card shows the Posted journals table — date, SAP doc number, total, status — with a per-row Reverse button.

Click Reverse on a posted journal, enter a reason, confirm. CampOne calls SAP’s Cancel (B1) or equivalent on S/4HANA, records the reversal doc number, and marks the original as reversed. The reversal reason appears on the audit trail.

  • Each SAP customer has their own service-layer URL and Company DB — there is no shared sandbox we can ship.
  • The S/4HANA OData payload shape is implemented from public documentation; before the first S/4HANA customer goes live, run a journal post against their sandbox to confirm it lines up with their comm-arrangement.
  • POS line items are bucketed under a single (pos_revenue, normal VAT) line. Adding richer per-item VAT breakdowns is a roadmap item.
  • TLS with private CAs is a follow-up — currently the adapter expects the SAP endpoint to use a CA already in the system trust store.