#!/usr/bin/env bash # Create the five migration GL accounts (1000, 1050, 2000, 2100, 3000) in OMNL Fineract via API. # Idempotent: skips if glCode already exists. Run from repo root. Requires: curl, jq. set -euo pipefail REPO_ROOT="${REPO_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}" if [ -f "${REPO_ROOT}/omnl-fineract/.env" ]; then set +u source "${REPO_ROOT}/omnl-fineract/.env" 2>/dev/null || true set -u elif [ -f "${REPO_ROOT}/.env" ]; then set +u source "${REPO_ROOT}/.env" 2>/dev/null || true set -u fi BASE_URL="${OMNL_FINERACT_BASE_URL:-}" TENANT="${OMNL_FINERACT_TENANT:-omnl}" USER="${OMNL_FINERACT_USER:-app.omnl}" PASS="${OMNL_FINERACT_PASSWORD:-}" if [ -z "$BASE_URL" ] || [ -z "$PASS" ]; then echo "Set OMNL_FINERACT_BASE_URL and OMNL_FINERACT_PASSWORD (e.g. omnl-fineract/.env)" >&2 exit 1 fi AUTH="${USER}:${PASS}" CURL_OPTS=(-s -S -w "\n%{http_code}" -H "Fineract-Platform-TenantId: ${TENANT}" -H "Content-Type: application/json" -u "$AUTH") api_get() { curl "${CURL_OPTS[@]}" "${BASE_URL}/${1}" } api_post() { local path="$1" local body="$2" local out out=$(curl "${CURL_OPTS[@]}" -X POST -d "$body" "${BASE_URL}/${path}") HTTP_CODE=$(echo "$out" | tail -n1) echo "$out" | sed '$d' } # type: 1=ASSET, 2=LIABILITY, 3=EQUITY. usage: 1=DETAIL create_gl() { local gl_code="$1" local name="$2" local type_id="$3" local description="$4" local list list=$(api_get "glaccounts" 2>/dev/null | sed '$d') if echo "$list" | jq -e --arg c "$gl_code" '.[] | select(.glCode == $c) | .id' >/dev/null 2>&1; then echo " [skip] $gl_code — $name (exists)" return 0 fi # Handle both array and object response if echo "$list" | grep -q "\"glCode\":\"${gl_code}\""; then echo " [skip] $gl_code — $name (exists)" return 0 fi local body body=$(jq -n \ --arg code "$gl_code" \ --arg name "$name" \ --argjson type "$type_id" \ --arg desc "$description" \ '{glCode: $code, name: $name, type: $type, usage: 1, manualEntriesAllowed: true, description: $desc}') api_post "glaccounts" "$body" >/dev/null if [ "${HTTP_CODE:-0}" = "200" ] || [ "${HTTP_CODE:0:1}" = "2" ]; then echo " [created] $gl_code — $name" else echo " [fail] $gl_code HTTP ${HTTP_CODE}" >&2 return 1 fi } echo "=== OMNL Fineract — Create migration GL accounts ===" echo "Base URL: $BASE_URL" echo "" create_gl "1000" "USD Settlement Reserves" 1 "USD Settlement & Reserve Assets" create_gl "1050" "USD Treasury Conversion Reserve (M0)" 1 "Treasury Conversion Reserve (M0); backs M1 capacity at 1:5" create_gl "2000" "USD Central Deposits" 2 "Central bank customer deposits; M1-denominated claims backed by 1050 where applicable" create_gl "2100" "USD Restricted Liabilities" 2 "Restricted / held deposits" create_gl "3000" "Opening Balance Control" 3 "Migration control account" create_gl "1410" "Due From Head Office (Interoffice Receivable)" 1 "Interoffice receivable at branch" create_gl "2410" "Due To Offices (Interoffice Payable)" 2 "Interoffice payable at Head Office" echo "" echo "Done. Run scripts/omnl/omnl-ledger-post.sh to post T-001–T-008."