#!/usr/bin/env bash
# =====================================================================
# add-purchase-prices.sh — purchase price list version (Einkauf, PLV_PURCHASE 1000004) for every
# article of a merchant org that has a gross sales price (PLV_GROSS 1000003) but no purchase price yet:
# net = gross / (1 + VAT) × MARGIN (default 0.55 = the merchant buys at ~55 % of its net sales price),
# via the iDempiere REST API. Idempotent (only missing rows are created).
#
#   ADMIN_USER=demo ORG_ID=1000018 WH_ID=1000018 ./add-purchase-prices.sh
#
# Env: REST, ADMIN_USER/ADMIN_PASS (see set-parent-ids.sh), CLIENT_ID/ROLE_ID, ORG_ID/WH_ID, PLV_GROSS,
# PLV_PURCHASE, VAT [1.19], MARGIN [0.55 — use 1 for "purchase = net sales", as done for Kazaar].
# =====================================================================
set -euo pipefail; export LANG=C.UTF-8
REST="${REST:-https://127.0.0.1:8443/api/v1}"; ADMIN_USER="${ADMIN_USER:-demo}"
ADMIN_PASS="${ADMIN_PASS:-$(sed -n 's/^password: //p' /root/demo-credentials.txt | head -1)}"
CLIENT_ID="${CLIENT_ID:-1000000}"; ROLE_ID="${ROLE_ID:-1000000}"; ORG_ID="${ORG_ID:?}"; WH_ID="${WH_ID:?}"
PLV_GROSS="${PLV_GROSS:-1000003}"; PLV_PURCHASE="${PLV_PURCHASE:-1000004}"; VAT="${VAT:-1.19}"; MARGIN="${MARGIN:-0.55}"
T="$(curl -sk -X POST "$REST/auth/tokens" -H 'Content-Type: application/json' -d "$(jq -n --arg u "$ADMIN_USER" --arg p "$ADMIN_PASS" --argjson c "$CLIENT_ID" --argjson r "$ROLE_ID" --argjson o "$ORG_ID" --argjson w "$WH_ID" \
  '{userName:$u,password:$p,parameters:{clientId:$c,roleId:$r,organizationId:$o,warehouseId:$w}}')" | jq -r .token)"
[ -n "$T" ] && [ "$T" != null ] || { echo "REST login failed" >&2; exit 1; }
n=0; ok=0
while IFS='|' read -r pid gross; do
  n=$((n+1)); net="$(python3 -c "print(round($gross/$VAT*$MARGIN,2))")"
  res="$(curl -sk -X POST "$REST/models/m_productprice" -H "Authorization: Bearer $T" -H 'Content-Type: application/json' -d "$(jq -n --argjson o "$ORG_ID" --argjson v "$PLV_PURCHASE" --argjson p "$pid" --argjson n "$net" \
    '{AD_Org_ID:{id:$o,tableName:"AD_Org"}, M_PriceList_Version_ID:{id:$v,tableName:"M_PriceList_Version"}, M_Product_ID:{id:$p,tableName:"M_Product"}, priceList:$n, priceStd:$n, priceLimit:$n, isActive:true, tableName:"M_ProductPrice"}')")"
  if echo "$res" | jq -e .id >/dev/null 2>&1; then ok=$((ok+1)); else echo "FAILED $pid: $(echo "$res" | cut -c1-150)"; fi
  [ $((n % 200)) = 0 ] && echo "  $n done"
done < <(sudo -u postgres psql -d idempiere -At -F'|' -c "select p.m_product_id, pp.pricestd from adempiere.m_productprice pp join adempiere.m_product p using (m_product_id) where p.ad_org_id=$ORG_ID and pp.m_pricelist_version_id=$PLV_GROSS and pp.pricestd>0 and not exists (select 1 from adempiere.m_productprice x where x.m_product_id=p.m_product_id and x.m_pricelist_version_id=$PLV_PURCHASE) order by 1" 2>/dev/null)
echo "DONE: $ok of $n purchase prices created (margin $MARGIN)"
