Files
proxmox/scripts/omnl/omnl-operator-rail.sh
defiQUG b3a8fe4496
Some checks failed
Deploy to Phoenix / deploy (push) Has been cancelled
chore: sync all changes to Gitea
- Config, docs, scripts, and backup manifests
- Submodule refs unchanged (m = modified content in submodules)

Made-with: Cursor
2026-03-02 11:37:34 -08:00

120 lines
5.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# OMNL Fineract — Single operator rail: resolve IDs, post closures (if missing), verify, reconciliation snapshot, print safe A/B/C templates.
# Usage: from repo root. SKIP_CLOSURES=1 or SKIP_RECON=1 to skip those steps. See OPERATING_RAILS.md.
set -euo pipefail
REPO_ROOT="${REPO_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
SKIP_CLOSURES="${SKIP_CLOSURES:-0}"
SKIP_RECON="${SKIP_RECON:-0}"
CLOSING_DATE="${CLOSING_DATE:-2026-02-24}"
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
CURL_OPTS=(-s -S -H "Fineract-Platform-TenantId: ${TENANT}" -H "Content-Type: application/json" -u "${USER}:${PASS}")
echo "=== 1) Resolve IDs ===" >&2
bash "${REPO_ROOT}/scripts/omnl/resolve_ids.sh"
# ids.env is in current dir (repo root when run from there)
if [ -f "${REPO_ROOT}/ids.env" ]; then
set +u
source "${REPO_ROOT}/ids.env"
set -u
elif [ -f "ids.env" ]; then
set +u
source "ids.env"
set -u
else
echo "ids.env not found; run resolve_ids.sh from repo root" >&2
exit 1
fi
echo "=== 2) GL closures (Office 20 + HO) ===" >&2
if [ "$SKIP_CLOSURES" = "1" ]; then
echo "SKIP_CLOSURES=1: skipping" >&2
else
CLOSING_DATE="$CLOSING_DATE" bash "${REPO_ROOT}/scripts/omnl/omnl-gl-closures-post.sh" || true
fi
echo "=== 3) Verification ===" >&2
CURL_OPTS=(-s -S -H "Fineract-Platform-TenantId: ${TENANT}" -H "Content-Type: application/json" -u "${USER}:${PASS}")
offices=$(curl "${CURL_OPTS[@]}" "${BASE_URL}/offices" 2>/dev/null)
o20=$(echo "$offices" | jq -r '.[] | select(.id == 20) | .name' 2>/dev/null)
if [ -n "$o20" ]; then
echo " Office 20: $o20" >&2
else
echo " Office 20: not found (create via omnl-office-create-samama.sh)" >&2
fi
closures=$(curl "${CURL_OPTS[@]}" "${BASE_URL}/glclosures" 2>/dev/null)
c20=$(echo "$closures" | jq -r '(if type == "array" then . else (.pageItems // .) end) | map(select(.officeId == 20 or .office.id == 20)) | length' 2>/dev/null)
echo " Closures for office 20: $c20" >&2
echo "=== 4) Reconciliation snapshot (Office 20) ===" >&2
if [ "$SKIP_RECON" = "1" ]; then
echo "SKIP_RECON=1: skipping" >&2
else
bash "${REPO_ROOT}/scripts/omnl/omnl-reconciliation-office20.sh" || true
fi
echo "=== 5) A/B/C readiness ===" >&2
savings=$(curl "${CURL_OPTS[@]}" "${BASE_URL}/savingsproducts" 2>/dev/null)
savings_count=$(echo "$savings" | jq 'if type == "array" then length else (.pageItems // []) | length end' 2>/dev/null || echo "0")
loans=$(curl "${CURL_OPTS[@]}" "${BASE_URL}/loanproducts" 2>/dev/null)
loans_count=$(echo "$loans" | jq 'if type == "array" then length else (.pageItems // []) | length end' 2>/dev/null || echo "0")
echo " Savings products: $savings_count (Path B ready if > 0 and payment type set)" >&2
echo " Loan products: $loans_count (Path C ready if > 0)" >&2
path_b_ready=0
path_c_ready=0
[ -n "${PAYMENT_TYPE_ID:-}" ] && [ "${PAYMENT_TYPE_ID:-0}" -gt 0 ] 2>/dev/null && [ "${savings_count:-0}" -gt 0 ] 2>/dev/null && path_b_ready=1
[ "${loans_count:-0}" -gt 0 ] 2>/dev/null && path_c_ready=1
echo "=== 6) Safe templates (use after: source ids.env) ===" >&2
echo ""
echo "# --- Path A: Treasury transfer out from Office 20 (Dr 2100, Cr 1410) ---"
echo "# POST /journalentries (officeId=20, unique referenceNumber required)"
echo "curl -s -X POST -H \"Fineract-Platform-TenantId: \$TENANT\" -H \"Content-Type: application/json\" -u \"\$USER:\$PASS\" \\"
echo " -d '{ \"officeId\": 20, \"transactionDate\": \"$(date +%Y-%m-%d)\", \"dateFormat\": \"yyyy-MM-dd\", \"locale\": \"en\", \"currencyCode\": \"USD\", \"referenceNumber\": \"SAMAMA-20-$(date +%Y%m%d)-001\", \"comments\": \"Treasury transfer from Office 20\", \"debits\": [ { \"glAccountId\": '\$ID_2100', \"amount\": AMOUNT } ], \"credits\": [ { \"glAccountId\": '\$ID_1410', \"amount\": AMOUNT } ] }' \\"
echo " \"\$BASE_URL/journalentries\""
echo ""
if [ "$path_b_ready" = "1" ]; then
echo "# --- Path B: Deposit to savings (replace SAVINGS_ACCOUNT_ID) ---"
echo "# POST /savingsaccounts/<ID>/transactions?command=deposit"
echo "curl -s -X POST -H \"Fineract-Platform-TenantId: \$TENANT\" -H \"Content-Type: application/json\" -u \"\$USER:\$PASS\" \\"
echo " -d \"{ \\\"transactionDate\\\": \\\"$(date +%Y-%m-%d)\\\", \\\"transactionAmount\\\": AMOUNT, \\\"paymentTypeId\\\": \$PAYMENT_TYPE_ID, \\\"note\\\": \\\"Allocation from Samama Office\\\", \\\"dateFormat\\\": \\\"yyyy-MM-dd\\\", \\\"locale\\\": \\\"en\\\" }\" \\"
echo " \"\$BASE_URL/savingsaccounts/SAVINGS_ACCOUNT_ID/transactions?command=deposit\""
else
echo "# --- Path B: NOT READY — need payment type and at least one savings product with accounting enabled" >&2
fi
echo ""
if [ "$path_c_ready" = "1" ]; then
echo "# --- Path C: Loan disburse (replace LOAN_ID) ---"
echo "# POST /loans/<ID>?command=disburse"
echo "curl -s -X POST -H \"Fineract-Platform-TenantId: \$TENANT\" -H \"Content-Type: application/json\" -u \"\$USER:\$PASS\" \\"
echo " -d \"{ \\\"actualDisbursementDate\\\": \\\"$(date +%Y-%m-%d)\\\", \\\"transactionAmount\\\": AMOUNT, \\\"paymentTypeId\\\": \$PAYMENT_TYPE_ID, \\\"dateFormat\\\": \\\"yyyy-MM-dd\\\", \\\"locale\\\": \\\"en\\\" }\" \\"
echo " \"\$BASE_URL/loans/LOAN_ID?command=disburse\""
else
echo "# --- Path C: NOT READY — need at least one loan product with accounting enabled" >&2
fi
echo ""
echo "Resolved IDs: ID_1410=$ID_1410 ID_2100=$ID_2100 ID_2410=$ID_2410 PAYMENT_TYPE_ID=${PAYMENT_TYPE_ID:-n/a}"
echo ""
echo "Audit packet (recommended): bash scripts/omnl/omnl-audit-packet-office20.sh" >&2