Skip to content

Purchase Payments (مدفوعات المشتريات)

Purchase payments record supplier payments against posted purchase bills. Payments track the paying GL account and support partial payments, check details, and payment schedules.

Entity Attributes

PurchasePayment

FieldTypeRequiredDescription
idintegerautoPrimary key
company_idFKautoCompany
branch_idFKautoInherited from bill
payment_numberstringautoAuto-generated PPAY-YYYY-NNNNN
datedateyesPayment date
bill_idFKyesSource purchase bill (must be posted)
supplier_idFKautoInherited from bill
amountdecimal(15,3)yesPayment amount
currency_idFKnoOptional foreign currency
exchange_ratedecimal(15,6)autoDefault 1.000000
payment_methodenumyescash, bank_transfer, check, credit_card
bank_account_idFKnoBank account for bank/check payments
check_numberstring(50)noCheck reference number
check_datedatenoCheck clearing date
check_bankstringnoIssuing bank name
referencestringnoExternal reference
notestextnoNotes (EN)
notes_artextnoNotes (AR)
paying_account_idFKyesGL account paying from (Cash/Bank)
journal_entry_idFKautoLinked JE (after posting)
statusenumautoCurrent workflow status

PurchasePaymentSchedule

FieldTypeRequiredDescription
idintegerautoPrimary key
bill_idFKautoParent bill
installment_numberintegeryesSequential position
due_datedateyesInstallment due date
amountdecimal(15,3)yesInstallment amount
amount_paiddecimal(15,3)autoPaid to date
statusenumautopending, partially_paid, paid, overdue

ER Diagram

Workflow / Status Diagram

API Endpoints

MethodEndpointPermissionDescription
GET/api/purchases/paymentspurchases.payments.viewList payments
POST/api/purchases/paymentspurchases.payments.createCreate payment
GET/api/purchases/payments/{id}purchases.payments.viewShow payment
PUT/api/purchases/payments/{id}purchases.payments.updateUpdate draft
DELETE/api/purchases/payments/{id}purchases.payments.deleteDelete draft
POST/api/purchases/payments/{id}/postpurchases.payments.postPost payment
POST/api/purchases/payments/{id}/cancelpurchases.payments.cancelCancel payment
GET/api/purchases/bills/{id}/paymentspurchases.payments.viewList bill payments
GET/api/purchases/bills/{id}/payment-schedulepurchases.payments.viewBill schedule

Query Parameters (Index)

ParameterTypeDescription
statusstringFilter by status: draft, posted, cancelled
supplier_idintegerFilter by supplier
bill_idintegerFilter by source bill
payment_methodstringFilter by method: cash, bank_transfer, check, credit_card
branch_idintegerFilter by branch
date_fromdateStart date filter
date_todateEnd date filter
searchstringSearch payment_number, reference, check_number

Create Request

bash
curl -X POST /api/purchases/payments \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "bill_id": 1,
    "date": "2026-02-25",
    "amount": 500.000,
    "payment_method": "bank_transfer",
    "paying_account_id": 5,
    "bank_account_id": 2,
    "reference": "TRF-2026-001"
  }'
dart
final response = await dio.post(
  '/api/purchases/payments',
  data: {
    'bill_id': 1,
    'date': '2026-02-25',
    'amount': 500.000,
    'payment_method': 'bank_transfer',
    'paying_account_id': 5,
    'bank_account_id': 2,
    'reference': 'TRF-2026-001',
  },
);

Business Rules

  1. Source Bill: Payments can only be created against posted bills (status = posted or later)
  2. Amount Validation: Payment amount must not exceed the bill's balance_due
  3. Posting creates AP JE:
    • DR: Accounts Payable (reduces AP balance, with partner_id)
    • CR: Paying Account (Cash/Bank — the account paying from)
  4. Bill Update on Post: Increments amount_paid, recalculates balance_due, updates payment_status (pending → partial → paid) and bill status (Posted → PartiallyPaid → Paid)
  5. Schedule Allocation: On posting, allocates payment to oldest unpaid installments first; updates each schedule's amount_paid and status
  6. Cancellation: Reverses the JE, decrements bill amount_paid, recalculates payment status, and deallocates from schedules (newest paid first)

Sequence

Payments use auto-generated numbers with prefix PPAY (Purchase Payment):

  • Format: PPAY-{YYYY}-{NNNNN} (e.g., PPAY-2026-00001)
  • Reset frequency: Yearly

Moon ERP API Documentation