- Institutional / JVMTM / reserve-provenance / GRU transport + standards JSON - Validation and verify scripts (Blockscout labels, x402, GRU preflight, P1 local path) - Wormhole wiring in AGENTS, MCP_SETUP, MASTER_INDEX, 04-configuration README - Meta docs, integration gaps, live verification log, architecture updates - CI validate-config workflow updates Operator/LAN items, submodule working trees, and public token-aggregation edge routes remain follow-up (see TODOS_CONSOLIDATED P1). Made-with: Cursor
117 lines
5.3 KiB
Bash
Executable File
117 lines
5.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# OMNL Fineract — Corporate Client for PT. CAKRA INVESTAMA INTERNATIONAL (office CAKRA).
|
|
# Idempotent by client externalId. Adds contact (director), NPWP as "Any Other Id Type" if not present.
|
|
#
|
|
# Usage (repo root):
|
|
# DRY_RUN=1 bash scripts/omnl/omnl-client-create-pt-cakra-investama.sh
|
|
# bash scripts/omnl/omnl-client-create-pt-cakra-investama.sh
|
|
#
|
|
# Optional env:
|
|
# CAKRA_OFFICE_EXTERNAL_ID default OMNL-ID-JKT-CAKRA-001
|
|
# CAKRA_CLIENT_EXTERNAL_ID default OMNL-ID-JKT-CAKRA-CLIENT
|
|
# CAKRA_CLIENT_NAME default PT. CAKRA INVESTAMA INTERNATIONAL
|
|
# CAKRA_CONTACT_EMAIL default bambangpram04@gmail.com
|
|
# CAKRA_CONTACT_MOBILE default +62811400001
|
|
# CAKRA_NPWP default 08.540.442.4-603.000
|
|
# SKIP_NPWP_IDENTIFIER=1 skip NPWP POST (e.g. if using another id type in tenant)
|
|
#
|
|
# Settlement / bank / AHU metadata: scripts/omnl/data/pt-cakra-investama-sidecar.json (not Fineract-native).
|
|
|
|
set -euo pipefail
|
|
REPO_ROOT="${REPO_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
|
|
DRY_RUN="${DRY_RUN:-0}"
|
|
CAKRA_OFFICE_EXTERNAL_ID="${CAKRA_OFFICE_EXTERNAL_ID:-OMNL-ID-JKT-CAKRA-001}"
|
|
CAKRA_CLIENT_EXTERNAL_ID="${CAKRA_CLIENT_EXTERNAL_ID:-OMNL-ID-JKT-CAKRA-CLIENT}"
|
|
CAKRA_CLIENT_NAME="${CAKRA_CLIENT_NAME:-PT. CAKRA INVESTAMA INTERNATIONAL}"
|
|
CAKRA_CONTACT_EMAIL="${CAKRA_CONTACT_EMAIL:-bambangpram04@gmail.com}"
|
|
CAKRA_CONTACT_MOBILE="${CAKRA_CONTACT_MOBILE:-+62811400001}"
|
|
CAKRA_NPWP="${CAKRA_NPWP:-08.540.442.4-603.000}"
|
|
SKIP_NPWP_IDENTIFIER="${SKIP_NPWP_IDENTIFIER:-0}"
|
|
SUBMITTED_DATE="${SUBMITTED_DATE:-$(date +%Y-%m-%d)}"
|
|
LEGAL_FORM_ID="${LEGAL_FORM_ID:-2}"
|
|
|
|
# shellcheck source=lib/omnl-fineract-common.sh
|
|
source "${REPO_ROOT}/scripts/omnl/lib/omnl-fineract-common.sh"
|
|
omnl_fineract_load_env
|
|
omnl_fineract_init_curl || exit 1
|
|
|
|
offices_json=$(curl "${CURL_OPTS[@]}" "${BASE_URL}/offices" 2>/dev/null)
|
|
OFFICE_ID=$(echo "$offices_json" | jq -r --arg e "$CAKRA_OFFICE_EXTERNAL_ID" '.[] | select(.externalId == $e) | .id' 2>/dev/null | head -1)
|
|
if [ -z "$OFFICE_ID" ] || [ "$OFFICE_ID" = "null" ]; then
|
|
echo "Office not found for externalId=$CAKRA_OFFICE_EXTERNAL_ID — run omnl-office-create-pt-cakra-investama.sh first." >&2
|
|
exit 1
|
|
fi
|
|
|
|
clients_wrap=$(omnl_fineract_fetch_all_clients_pageitems)
|
|
existing_id=$(echo "$clients_wrap" | jq -r --arg e "$CAKRA_CLIENT_EXTERNAL_ID" '.pageItems[] | select(.externalId == $e) | .id' 2>/dev/null | head -1)
|
|
|
|
if [ -n "$existing_id" ] && [ "$existing_id" != "null" ]; then
|
|
CLIENT_ID="$existing_id"
|
|
echo "Client already exists: clientId=$CLIENT_ID (externalId=$CAKRA_CLIENT_EXTERNAL_ID)" >&2
|
|
else
|
|
payload=$(jq -n \
|
|
--argjson officeId "$OFFICE_ID" \
|
|
--argjson legalFormId "$LEGAL_FORM_ID" \
|
|
--arg firstname "$CAKRA_CLIENT_NAME" \
|
|
--arg externalId "$CAKRA_CLIENT_EXTERNAL_ID" \
|
|
--arg submittedOnDate "$SUBMITTED_DATE" \
|
|
'{
|
|
officeId: $officeId,
|
|
legalFormId: $legalFormId,
|
|
firstname: $firstname,
|
|
lastname: ".",
|
|
externalId: $externalId,
|
|
dateFormat: "yyyy-MM-dd",
|
|
locale: "en",
|
|
active: false,
|
|
submittedOnDate: $submittedOnDate
|
|
}')
|
|
if [ "$DRY_RUN" = "1" ]; then
|
|
echo "DRY_RUN: would POST /clients $payload" >&2
|
|
exit 0
|
|
fi
|
|
res=$(curl "${CURL_OPTS[@]}" -X POST -d "$payload" "${BASE_URL}/clients" 2>/dev/null) || true
|
|
if echo "$res" | jq -e '.resourceId // .clientId' >/dev/null 2>&1; then
|
|
CLIENT_ID=$(echo "$res" | jq -r '.resourceId // .clientId')
|
|
echo "Created client clientId=$CLIENT_ID" >&2
|
|
else
|
|
echo "Failed to create client: $res" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ "$DRY_RUN" = "1" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
# Contact (director channel)
|
|
payload_contact=$(jq -n --arg m "$CAKRA_CONTACT_MOBILE" --arg e "$CAKRA_CONTACT_EMAIL" '{ mobileNo: $m, emailAddress: $e }')
|
|
curl "${CURL_OPTS[@]}" -X PUT -d "$payload_contact" "${BASE_URL}/clients/${CLIENT_ID}" >/dev/null 2>&1 || true
|
|
|
|
# NPWP — tenant allows one active "Any Other Id Type" (id 4) per client
|
|
if [ "$SKIP_NPWP_IDENTIFIER" != "1" ] && [ -n "$CAKRA_NPWP" ]; then
|
|
if omnl_fineract_client_has_document_key "$CLIENT_ID" "$CAKRA_NPWP"; then
|
|
echo "NPWP identifier already present on client $CLIENT_ID" >&2
|
|
else
|
|
has_other=$(curl "${CURL_OPTS[@]}" "${BASE_URL}/clients/${CLIENT_ID}/identifiers" 2>/dev/null | jq -e '
|
|
(if type == "array" then . else (.pageItems // []) end)
|
|
| map(select((.documentType?.name // "") == "Any Other Id Type" and (.status == "Active" or .status == null)))
|
|
| length > 0
|
|
' >/dev/null 2>&1 && echo yes || echo no)
|
|
if [ "$has_other" = "yes" ]; then
|
|
echo "Skip NPWP POST: client already has an active Any Other Id Type (store AHU/NPWP detail in sidecar or deactivate old id)." >&2
|
|
else
|
|
payload_npwp=$(jq -n --arg key "$CAKRA_NPWP" --argjson typeId 4 '{ documentKey: $key, documentTypeId: $typeId, description: "NPWP (Indonesia tax ID)", status: "Active" }')
|
|
res=$(curl "${CURL_OPTS[@]}" -X POST -d "$payload_npwp" "${BASE_URL}/clients/${CLIENT_ID}/identifiers" 2>/dev/null) || true
|
|
if echo "$res" | jq -e '.resourceId' >/dev/null 2>&1; then
|
|
echo "Posted NPWP identifier for client $CLIENT_ID" >&2
|
|
else
|
|
echo "NPWP POST skipped or failed: $res" >&2
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
echo "CLIENT_ID_CAKRA=$CLIENT_ID"
|
|
echo "Sidecar (banking, AHU, compliance placeholders): ${REPO_ROOT}/scripts/omnl/data/pt-cakra-investama-sidecar.json" >&2
|