PowerGridБаримт бичиг
Платформ

Төлбөрийн гэрээ

6 мин уншихdocs/data-contracts/billing-v1.mdGitHub дээр засах

Хувилбар 1 · 2026-10-14 · Төлөв: sandbox (PGX-20–25) · Код: modules/powergrid/payment.go

Үе 1B-ийн payment hub (GS §18.3). Компанийн одоогийн billing систем нэхэмжлэх үүргээ хэвээр хадгална. PowerGrid нь дансны үлдэгдлийг ledger-ээр хөтөлж, хэрэглэгчийн гар утсаар хийсэн төлбөрийг хүлээн авна. Дараа нь billing систем тэр төлбөрийг PowerGrid-ээс татаж авна.

text
billing ──(данс, нэхэмжлэл)──▶ PowerGrid ledger ◀──(төлбөр)── хэрэглэгч ─▶ банк/QPaybilling ◀──(төлсөн төлбөр, ack)── PowerGrid ◀──(settlement файл)── үйлчилгээ үзүүлэгч

01API (/api/v1/powergrid)

АргаЗамЭрхУтга
POST/billing/importsmanageДанс ба нэхэмжлэл илгээх (≤ 100,000 тус бүр)
GET/accounts/{account_no}readҮлдэгдэл, сүүлийн 12 нэхэмжлэл, сүүлийн 50 бичилт
POST/accounts/{account_no}/paymentsmanageТөлбөр үүсгэж QR авах: {"amount": "50000", "idempotency_key": "…"}
POST/payments/{id}/callbackнэвтрэлтгүйҮйлчилгээ үзүүлэгчийн мэдэгдэл (rate limit 600/мин)
GET/billing/paymentsreadТөлөгдсөн боловч billing хүлээж аваагүй төлбөрүүд (хуучнаас нь, ≤ 1000)
POST/billing/payments/ackmanage{"payment_ids": [...]}: billing хүлээж авснаа баталгаажуулна
POST/settlementsmanageҮйлчилгээ үзүүлэгчийн өдрийн settlement-ийг хадгалж тулгалт буцаана
GET/reconciliation?provider=&date=readНэг өдрийн тулгалт

02Импорт

json
{  "contract": "powergrid.billing/v1",  "accounts": [{"account_no": "0101234567", "name": "Бат", "metering_point": "0101234567", "holder_reg_no": "УБ99010101"}],  "invoices": [{"external_id": "INV-2026-10-0001", "account_no": "0101234567",                "issued_on": "2026-10-01", "due_on": "2026-10-25", "amount": "125000.50"}]}
  • account_no ≤ 32, external_id ≤ 64 тэмдэгт. Хоёуланд нь урд, хойно хоосон зай байж болохгүй. Нэг импортод давтагдахгүй.
  • holder_reg_no нь сонголттой: дансны эзэмшигчийн регистр (иргэн УБ99010101, ААН 7 оронтой). PowerGrid App-д иргэн eID-ээр дансаа холбох нөхцөл нь энэ. Өөр утгаар дахин илгээвэл хуучин эзэмшигч тэр даруй харахаа болино. Талбаргүй илгээвэл хадгалсан утга хэвээр үлдэнэ.
  • holder_since нь сонголттой (YYYY-MM-DD): энэ эзэмшигчийн гэрээ эхэлсэн өдөр. Эзэмшигч үүнээс өмнөх заалт, нэхэмжлэл, төлбөрийг харахгүй. Өгөхгүй бол шинэ эзэмшигч нь импортын мөчөөс, PowerGrid-д анх бүртгэгдсэн эзэмшигч нь бүх түүхийг харна. Эзэмшигч солигдоход өмнөх эзэмшигчийн өгсөн бүх зөвшөөрөл автоматаар цуцлагдана.
  • tariff нь сонголттой: PowerGrid-ийн тарифын код (GET /tariffs). Зөвхөн PowerGrid-ээр нэхэмжилдэг компанид хэрэгтэй (доорх «PowerGrid-ийн өөрийн billing»). Талбаргүй илгээвэл хадгалсан утга хэвээр үлдэнэ.
  • metering_point нь сонголттой. Утга өгвөл бүртгэлд байгаа цэгийн код байна (prepaid-д хэрэгтэй).
  • amount нь 0 эсвэл эерэг тоо, хамгийн ихдээ 2 аравтын оронтой. Мөнгөн дүнг хөвөгч таслалтай тоо (float) болгож хувиргахгүй, хариунд string-ээр буцаана.
  • Дахин илгээх аюулгүй. Ижил агуулгаар дахин илгээхэд юу ч өөрчлөгдөхгүй. Нэхэмжлэлийн дүн өөрчлөгдвөл шинэ хувилбар үүсэж, ledger-т зөвхөн зөрүүг нь INVOICE_ADJUSTMENT болгон бичнэ.
  • Нэхэмжлэлийг өөр данс руу шилжүүлбэл 422 буцаана, учир нь өрийг өөр хүн рүү шилжүүлсэн хэрэг болно.
  • Байхгүй данс, цэг заасан бол 422, эхний 20 кодыг нэрлэнэ. Импорт бүхлээрээ орох эсвэл бүхлээрээ татгалзагдана.

03Ledger

ledger_entry нь зөвхөн нэмэгддэг: DB-ийн эрхэнд UPDATE, DELETE байхгүй. Нэхэмжлэл дансны үлдэгдлийг нэмж (+), төлбөр хасна (−). Дансны үлдэгдэл бол бичилтүүдийн нийлбэр. Бичилт бүр idempotency_key-тэй (invoice:<external_id>:<version>, payment:<id>), тиймээс давтан бичигдэх боломжгүй.

04Төлбөр

  1. Апп эсвэл кассчин POST /accounts/{no}/payments дуудна. Сүлжээ тасарсан бол ижил idempotency_key-ээр дахин илгээхэд ижил төлбөр буцаана. Тэр түлхүүрийг өөр дүн эсвэл дансанд ашиглавал 409.
  2. PowerGrid үйлчилгээ үзүүлэгчээс QR авна (Provider.CreateInvoice). Хариу ирэхгүй бол 502 буцаана, ижил түлхүүрээр дахин оролдоно.
  3. Үйлчилгээ үзүүлэгч /payments/{id}/callback-ийг дуудна. Callback нь нотолгоо биш: PowerGrid тухайн үйлчилгээ үзүүлэгчээс Check(ref)-ээр өөрөө асууна. Төлсөн дүн таарвал нэг transaction-д PENDING → PAID болгож, ledger-т PAYMENT бичнэ. Callback олон удаа, зэрэг ирсэн ч бичилт нэг л удаа хийгдэнэ (тестэд 8 зэрэг callback). Дүн зөрвөл төлбөр PENDING хэвээр үлдэж, лог болон тулгалтад гарна.
  4. Billing GET /billing/payments-ээр татаж, өөрийн системдээ бичээд ack хийнэ (PGX-25-ийн pull хэлбэр). Ack-гүй үлдсэн төлбөрийг дахин татахад дахин гарч ирнэ.

05Тулгалт (PGX-24)

POST /settlements {"provider", "settled_on", "lines": [{"provider_ref", "amount"}]} нь Улаанбаатарын цагаар нэг өдрийг тулгана:

ТалбарУтга
matchedТухайн өдрийн settlement мөрөөс төлбөртэй тохирсон нь (төлбөр өмнөх өдөр хийгдсэн байж болно)
paid_not_settledТухайн өдөр төлөгдсөн боловч аль ч өдрийн settlement-д ороогүй
settled_not_paidҮйлчилгээ үзүүлэгч шилжүүлсэн гэж мэдээлсэн боловч PowerGrid-д төлөгдсөн төлбөр байхгүй
amount_differsХоёр талд байгаа боловч дүн нь өөр
billing_unposted1 цагаас өмнө төлөгдсөн боловч billing хүлээж аваагүй

Жагсаалт бүр нь хүн шалгаж тайлбарлах ёстой зөрүүнүүд. Гол үзүүлэлт: өдөр бүр 100% тулгагдсан байх.

06Үйлчилгээ үзүүлэгч

POWERGRID_PAYMENT_PROVIDER орчны хувьсагчаар сонгоно. Утга өгөөгүй бол төлбөр хаалттай байж, 503 буцаана. Одоогоор зөвхөн sandbox байгаа: нэхэмжлэл бүрийг шууд төлөгдсөн гэж үзнэ, санах ойд хадгална. Production-д ашиглахгүй. Жинхэнэ үйлчилгээ үзүүлэгчийг (QPay, банк) захиалагч сонгосны дараа (ADR-010) Provider интерфэйсийн шинэ хэрэгжүүлэлт болгон нэмнэ.

07PowerGrid-ийн өөрийн billing

Өөрийн billing системгүй түгээх компани (жишээ нь Gerege) нэхэмжлэлээ PowerGrid-ээр тооцуулна. Код: rating.go, billing.go.

АргаЗамЭрхУтга
GET/tariffsreadТариф ба бүх хувилбар
PUT/tariffs/{code}manage{"name"}
POST/tariffs/{code}/versionsmanage{"valid_from", "fixed_monthly", "vat_pct", "blocks": [{"up_to_kwh": "150", "price": "140.50"}, {"up_to_kwh": null, "price": "190"}], "approved_ref"}
POST/billing/runsmanage{"period": "2026-10", "issued_on", "due_on"} → {invoiced, unchanged, skipped: [{account_no, reason}]}
GET/invoices/{external_id}/basisreadНэхэмжлэлийн одоогийн хувилбар юунаас бүрдсэн бэ
  • Тарифын хувилбар засагдахгүй. Шинэ шийдвэр гарвал шинэ огнооноос эхлэх шинэ хувилбар болно. Тухайн сарыг эхний өдөрт хүчинтэй байсан хувилбараар тооцно.
  • Тооцоо: шатлал бүрийн кВт·ц × үнэ + суурь хураамж + НӨАТ. big.Rat-аар тооцож, зөвхөн нийт дүнг half-up дүрмээр 2 орон хүртэл тоймлоно.
  • Сарын 15 минутын бүх интервал (A+, одоогийн хувилбар; тооцоолсон, орлуулсан нь орно) ирсэн данс л нэхэмжлэгдэнэ. Дутуу бол INCOMPLETE, тоолуургүй бол NO_METER, тарифын хувилбаргүй бол NO_TARIFF_VERSION гэж алгасна. Хувь бүр бүрэн дуусаагүй (Ховдын шөнө дунд хүртэл) сарыг 409-оор татгалзана.
  • Нэхэмжлэлийн id: PG-<сар>-<данс>. Дахин ажиллуулахад өөрчлөгдөөгүй бол юу ч болохгүй. Хожуу засвар ирж дүн өөрчлөгдвөл шинэ хувилбар үүсэж, ledger-т зөвхөн зөрүү INVOICE_ADJUSTMENT болж бичигдэнэ (импортын дүрмээр).
  • invoice_basis: нэхэмжлэлийн хувилбар бүрд тарифын хувилбар, хугацаа, интервалын тоо (байгаа/хүлээгдэж буй/бодит), хамгийн сүүлийн заалт, тооцооны мөрүүд хадгалагдана. Иргэн үүнийг PowerGrid App-аас харна.
  • Хойшлуулсан: өдөр/шөнийн тариф (TOU), реактив энерги, нэмэгдэл хураамж.

Production-д оруулсан тариф (Гэрэгэ системс, 2026-10-15):

КодХувилбарМөрдөхШатлал (₮/кВт·ц, НӨАТ-гүй)СуурьНӨАТШийдвэр
DORNOD-AHUI12026-06-010–150: 159 · 151–300: 244 · 300<: 2743 360 ₮/сар10%ЭХЗХ-ны 2026.05.29-ний №351, 2-р хавсралт (хүснэгт, ДБЭХС)

Дорнодын айл өрхийн энгийн тоолуурт. Жишээ: 220 кВт·ц → 150×159 + 70×244 + 3 360 = 44 290, НӨАТ-тэй 48 719 ₮. 2 ба 3 тарифт тоолуурын үнэ ЭХЗХ-ны хүснэгтэд байгаа ч TOU хойшлогдсон тул оруулаагүй. Нийгмийн халамжийн өрхийн хөнгөлөлт (ЭХЗХ №356) ч оруулаагүй.

08Дараа нь

  • Буцаалт (refund): ledger-т эсрэг бичилт хийнэ, Provider-т Refund нэмнэ.
  • PGX-26: иргэн eID-ээр дансаа холбож өөрөө төлөх нь PowerGrid App-д хийгдсэн (цөмийн person gate — backend/v1.34.0).
  • PGX-28: мэдэгдэл.
  • Billing руу push хийх (webhook, outbox): billing-ийн интерфэйс тодорхой болсны дараа.
Энэ хуудас тус болсон уу?Таны хариу баримтыг сайжруулахад тусална.