#!/usr/bin/env bash # OMNL — Maker: write single JE payload + sha256 for checker (maker-checker). # Usage: OFFICE_ID=20 DEBIT_GL_ID=... CREDIT_GL_ID=... AMOUNT=... REF=... [COMMENTS=...] bash scripts/omnl/omnl-je-maker.sh # Aliases: REFERENCE_NUMBER=REF, TX_DATE=TRANSACTION_DATE. For ≥10M set REQUIRES_APPROVAL=1 and APPROVER=. # Output: reconciliation/je-.payload.json and .payload.sha256 set -euo pipefail REPO_ROOT="${REPO_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}" PAYLOAD_DIR="${PAYLOAD_DIR:-${REPO_ROOT}/reconciliation}" REF="${REF:-$REFERENCE_NUMBER}" TRANSACTION_DATE="${TRANSACTION_DATE:-$TX_DATE}" TRANSACTION_DATE="${TRANSACTION_DATE:-$(date +%Y-%m-%d)}" : "${OFFICE_ID:?Set OFFICE_ID}" : "${DEBIT_GL_ID:?Set DEBIT_GL_ID}" : "${CREDIT_GL_ID:?Set CREDIT_GL_ID}" : "${AMOUNT:?Set AMOUNT}" : "${REF:?Set REF or REFERENCE_NUMBER (referenceNumber)}" COMMENTS="${COMMENTS:-JE from maker}" MATERIAL_THRESHOLD_MAKER_CHECKER="${MATERIAL_THRESHOLD_MAKER_CHECKER:-10000000}" # Material policy: if amount >= threshold, require REQUIRES_APPROVAL=1 and APPROVER if [ "${AMOUNT:-0}" -ge "${MATERIAL_THRESHOLD_MAKER_CHECKER}" ] 2>/dev/null; then if [ "${REQUIRES_APPROVAL:-0}" != "1" ] || [ -z "${APPROVER:-}" ]; then echo "Maker: amount >= $MATERIAL_THRESHOLD_MAKER_CHECKER requires REQUIRES_APPROVAL=1 and APPROVER=" >&2 exit 1 fi fi mkdir -p "$PAYLOAD_DIR" safe_ref=$(echo "$REF" | tr -c 'A-Za-z0-9_-' '_') payload_file="${PAYLOAD_DIR}/je-${safe_ref}.payload.json" hash_file="${PAYLOAD_DIR}/je-${safe_ref}.payload.sha256" body=$(jq -n \ --argjson officeId "$OFFICE_ID" \ --arg transactionDate "$TRANSACTION_DATE" \ --arg dateFormat "yyyy-MM-dd" \ --arg locale "en" \ --arg currencyCode "USD" \ --arg comments "$COMMENTS" \ --arg referenceNumber "$REF" \ --argjson debitId "$DEBIT_GL_ID" \ --argjson creditId "$CREDIT_GL_ID" \ --argjson amount "$AMOUNT" \ '{ officeId: $officeId, transactionDate: $transactionDate, dateFormat: $dateFormat, locale: $locale, currencyCode: $currencyCode, comments: $comments, referenceNumber: $referenceNumber, debits: [ { glAccountId: $debitId, amount: $amount } ], credits: [ { glAccountId: $creditId, amount: $amount } ] }') # Append approvalMetadata for material postings (checker enforces; Fineract ignores unknown fields) if [ "${AMOUNT:-0}" -ge "${MATERIAL_THRESHOLD_MAKER_CHECKER}" ] 2>/dev/null && [ -n "${APPROVER:-}" ]; then body=$(echo "$body" | jq --arg approver "$APPROVER" --arg approvedAt "$(date -u -Iseconds)" \ '. + { approvalMetadata: { approver: $approver, approvedAt: $approvedAt } }') fi echo "$body" > "$payload_file" sha256sum "$payload_file" | awk '{print $1}' > "$hash_file" echo "Maker: wrote $payload_file and $hash_file" >&2