Arsitektur Clean Core & Side-by-Side Extensibility
Simulasi Gateway OData REST Resmi SAP
Gateway ini mensimulasikan lingkungan backend SAP S/4HANA 2023 On-Premise. Sistem ini siap menerima tembakan integrasi pembuatan Sales Order (Shopee Sync), Goods Movement (MIGO Penerimaan Gudang), dan Presensi Lapangan (Z_HR_ATTENDANCE) menggunakan standar resmi OData REST JSON v2 dengan dukungan handshake CSRF Token.
A_SalesOrder (SO)
2
API_SALES_ORDER_SRV
Goods Movement (MIGO)
1
API_MATERIAL_DOCUMENT_SRV
Business Partners (BP)
5
API_BUSINESS_PARTNER
Z_HR_ATTENDANCE
2
Mobile TWI App Stream
📦 Sales Orders Terkini Shopee / B2B
Endpoint: /sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder
| SO SAP # | Ref Eksternal | Mitra (BP) | Total Net | Status |
|---|---|---|---|---|
| 0000100002 | SHOPEE-261006-777 | BP_SHOPEE_01 | Rp 2,400,000 | POSTED |
| 0000100001 | SHOPEE-261001-998 | BP_SHOPEE_01 | Rp 1,250,000 | POSTED |
📍 Log Presensi Lapangan (Z-Modul) TWI Mobile
Endpoint: /sap/opu/odata/sap/Z_HR_ATTENDANCE_SRV/CheckInSet
| ID Karyawan | Nama Lengkap | Waktu WIB | Lokasi | Status |
|---|---|---|---|---|
| EMP-ARUL-01 | Fakhrul Rosyid (Solutions Architect) | 2026-10-06 08:45:09 | Kantor Pusat Tanjung Duren (Jakarta Barat) | APPROVED |
| EMP-TASIK-08 | Ahmad Junaedi (Mandor Pabrik) | 2026-10-06 06:55:00 | Pabrik Tasikmalaya | APPROVED |
💻 Cara Memanggil API SAP Ini Menggunakan Python Ready to Run
Protokol: OData REST JSON v2# Skrip Python: Menembak Sales Order Shopee ke SAP S/4HANA Mock Gateway import requests BASE_URL = "https://sap.fakhrulr.my.id" # 1. Handshake CSRF Token resmi SAP session = requests.Session() head_res = session.head(f"{BASE_URL}/sap/opu/odata/sap/API_SALES_ORDER_SRV", headers={"X-CSRF-Token": "Fetch"}) csrf_token = head_res.headers.get("X-CSRF-Token", "sap-mock-csrf-master-token") # 2. Kirim Pesanan Shopee sebagai Sales Order SAP resmi payload = { "SalesOrderType": "OR", "SalesOrganization": "1000", "SoldToParty": "BP_SHOPEE_01", "PurchaseOrderByCustomer": "SHOPEE-261006-888", "to_Item": { "results": [ { "Material": "MAT-TEH-MELATI-01", "RequestedQuantity": 20.0, "NetPriceAmount": 25000.0, "Plant": "PL01" } ] } } post_res = session.post( f"{BASE_URL}/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder", json=payload, headers={"X-CSRF-Token": csrf_token, "Content-Type": "application/json"} ) print("Status Code:", post_res.status_code) # 201 Created print("SAP SO Number:", post_res.json()['d']['SalesOrder']) # e.g. 0000100002