> For the complete documentation index, see [llms.txt](https://inistate.gitbook.io/home/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://inistate.gitbook.io/home/advanced/integration/accounting-1/payment.md).

# Payment

## Payment's Database

<table><thead><tr><th>UI Name</th><th>Database</th><th>Type</th><th>Remarks</th></tr></thead><tbody><tr><td>Cancelled</td><td><pre><code>cancelled
</code></pre></td><td><strong><code>Boolean</code></strong></td><td>Pass <code>true</code> to <strong>void the Payment</strong></td></tr><tr><td>Debtor</td><td><pre><code>debtorCode
</code></pre></td><td><strong><code>String</code></strong></td><td><strong><code>Debtor</code></strong> must match existing <strong>debtor code</strong>, and they must be <strong>active</strong> state.<br><br>E.g.: <code>300-A001</code></td></tr><tr><td>Description</td><td><pre><code>description
</code></pre></td><td><strong><code>String</code></strong></td><td>E.g.: <code>PAID_ABC</code></td></tr><tr><td>Official Receipt No</td><td><pre><code>docNo
</code></pre></td><td><strong><code>String</code></strong></td><td><p><strong>Official Receipt No</strong> is <strong>required</strong> to be filled.</p><p><br><br>E.g.: <code>OR-000001</code></p></td></tr><tr><td>2nd Receipt No</td><td><pre><code>docNo2
</code></pre></td><td><strong><code>String</code></strong></td><td>E.g.: <code>Sample Text</code></td></tr><tr><td>Payment Date</td><td><pre><code>docDate
</code></pre></td><td><strong><code>String</code></strong></td><td>E.g.: <code>2024-11-27T00:00:00+08:00</code></td></tr></tbody></table>

## Payment Table Item

<table><thead><tr><th>UI Name</th><th>Database</th><th>Type</th><th>Remarks</th></tr></thead><tbody><tr><td>Payment Method</td><td><pre><code>paymentMethod
</code></pre></td><td><strong><code>String</code></strong></td><td>E.g.: <code>BANK,CASH,CHEQUE</code></td></tr><tr><td>Cheque No</td><td><pre><code>chequeNo
</code></pre></td><td><strong><code>String</code></strong></td><td>E.g.: <code>MBB-001</code></td></tr><tr><td>Payment Amount</td><td><pre><code>paymentAmt
</code></pre></td><td><strong><code>Decimal</code></strong></td><td>E.g.: <code>100.00</code></td></tr><tr><td>Payment by</td><td><pre><code>paymentBy
</code></pre></td><td><strong><code>String</code></strong></td><td>E.g.: <code>Jason</code></td></tr></tbody></table>

## Payment's Sample Code

{% hint style="warning" %}
Remember to change to the **correct field** before proceeding to run **ANY** script.
{% endhint %}

{% tabs %}
{% tab title="Logic Script" %}
{% hint style="info" %}
To find `{fieldName}`, you are required to have access to **Alpha** or use **Network** in Developer Tools `[F12]`.
{% endhint %}

{% code fullWidth="true" %}

```python
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)
```

{% endcode %}
{% endtab %}
{% endtabs %}
