Payment

Payment's Database

UI Name
Database
Type
Remarks

Cancelled

Boolean

Pass true to void the Payment

Debtor

String

Debtor must match existing debtor code, and they must be active state. E.g.: 300-A001

Description

String

E.g.: PAID_ABC

Official Receipt No

String

Official Receipt No is required to be filled.

E.g.: OR-000001

2nd Receipt No

String

E.g.: Sample Text

Payment Date

String

E.g.: 2024-11-27T00:00:00+08:00

Payment Table Item

UI Name
Database
Type
Remarks

Payment Method

String

E.g.: BANK,CASH,CHEQUE

Cheque No

String

E.g.: MBB-001

Payment Amount

Decimal

E.g.: 100.00

Payment by

String

E.g.: Jason

Payment's Sample Code

circle-exclamation
circle-info

To find {fieldName}, you are required to have access to Alpha or use Network in Developer Tools [F12].

import clr
clr.AddReference("Newtonsoft.Json")
clr.AddReference("System.Net")
clr.AddReference("System.IO")

from System.Text import *
from Newtonsoft.Json import *
from Newtonsoft.Json.Linq import *
from System import *

clr.AddReference("System.Drawing")
from System.Drawing import Bitmap, Image
from System.Drawing.Imaging import ImageFormat
from System.IO import MemoryStream, StreamWriter
from System.Net import WebClient
import binascii
from System import BitConverter

# search
documentList = Module("{YOUR-MODULE-NAME}").findAll(
    {
        "Audit.UpdatedDate": {"$gt": Inputs["lastSync"]},
        "Audit.UpdatedBy": {"$ne": "External"},
        "Dynamic.Extension.{fieldName}": {"$ne": None},
    }
)
debug("documentList", documentList)
resultList = []

# KnockOff Payment Details
# Input: one record 'x' that contains {YOUR-INVOICES} 
# Output: a list with 0 or 1 JObject for payload["paymentDetails"]

def preparePaymentDetails(x):
    if x["{YOUR-INVOICES}"] is None or x["{YOUR-INVOICES}"] .Count == 0:
        return []
    payments = x["{YOUR-INVOICES}"] 
    total_payment = sum(p["{YOUR-PAYMENT-AMOUNT}"]  for p in payments)
    row = JObject()
    row["DocType"] = ["{YOUR-DOC-TYPE}"] 
    row["DocNo"] = payments[0]["{YOUR-DOC-NO}"] .ToString() if payments[0]["{YOUR-DOC-NO}"]  else None
    row["Amount"] = total_payment
    row["KnockOffDate"] = x["{YOUR-DATE}"] 
    return [row]
    
# Payment Details (grouped by payment method)
# Input: one record 'x'
# Output: list of JObjects, each representing a grouped payment row

def prepareDetails(x):
    result = []
    if x["{YOUR-INVOICES}"]  is None or x["{YOUR-INVOICES}"] .Count == 0:
        return result
    
    invoices = x["{YOUR-INVOICES}"] 
    
    payment_methods = ['CASH', 'CHEQUE', 'BANK']
    for method in payment_methods:
        payments = [invoices[i] for i in range(invoices.Count) 
                   if invoices[i]["{YOUR-PAYMENT-METHOD}"]  == method or (method == 'CASH' and invoices[i]["{YOUR-PAYMENT-METHOD}"]  == '')]
        if payments:
            row = JObject()
            row['paymentMethod'] = method
            row['chequeNo'] = payments[0]["{YOUR-CHEQUE-NO}"]  if payments and payments[0]["{YOUR-CHEQUE-NO}"]  else None
            row['paymentAmt'] = sum(p["{YOUR-PAYMENT-AMOUNT}"]  for p in payments)
            row['paymentBy'] = payments[0]["{YOUR-PAYMENT-BY}"] if payments and payments[0]["{YOUR-PAYMENT-BY}"]  else ''
            result.append(row)
    
    return result if result else [JObject()]

def preparePayload(data):
    payloadData = JObject()
    payloadData["type"] = "ARPayment"
    payloadData["payload"] = JObject()
    payloadData["cancelled"] = data["{IS-YOUR-DOC-CANCELLED}"]
    payloadData["payload"]["debtorCode"] = data["{YOUR-DEBTOR-CODE}"]
    payloadData["payload"]["description"] = data["{YOUR-DESCRIPTION}"]
    payloadData["payload"]["docNo"] = None if data['{YOUR-DOC-NO}'] == "" or data['{YOUR-DOC-NO}'] is None else data['{YOUR-DOC-NO}']
    payloadData["payload"]["docNo2"] = None if data['{YOUR-DOC-NO2}'] == "" or data['{YOUR-DOC-NO2}'] is None else data['{YOUR-DOC-NO2}']
    payloadData["payload"]["docDate"] = data["{YOUR-DOC-DATE}"]
    
    payloadData["payload"]["details"] = JArray.FromObject(
        prepareDetails(data)
    )
    payloadData["payload"]["paymentDetails"] = JArray(preparePaymentDetails(data))
  
    payloadData["LastModified"] = data.UpdatedDate
    return payloadData
    
# loop: build payloads for all documents
for entry in documentList:
    payloadData = preparePayload(entry)
    resultList.append(payloadData)


outputs["results"] = JArray.FromObject(resultList)
debug("results", resultList)

Last updated