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
Remember to change to the correct field before proceeding to run ANY script.
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