A/P Invoice

A/P Invoice's Database

UI Name
Database
Type
Remarks

Debtor

creditorCode

String

E.g.: 400-X001

Invoice No

docNo

String

E.g.: INV24121436

Date

docDate

String

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

Description

description

String

E.g.: PURCHASE - SI0000001

Journal Type

journalType

String

E.g.: PURCHASE

Inclusive

inclusiveTax

Boolean

E.g.: true

Credit Term

displayTerm

String

E.g.: NET 30

Table Item

details

Array

A/P Invoice's Table Item

UI Name
Database
Type
Remarks

Item Code

accNo

String

E.g.: 600-0005

Description

description

String

E.g.: OFFICE SUPPLIES

Qty

qty

Number

E.g.: 20

UOM

uom

String

E.g.: PKG

Unit Price

unitPrice

Number

E.g.: 150

SubTotal

subtotal

Number

E.g.: 3000

Tax Adjustment

taxAdjustment

Number

E.g.: 75

A/P Invoice's Sample Code

Remember to change to the correct field before proceeding to run ANY script.

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' } })
debug('documentList', documentList)

resultList = []

def image_to_hex(image_url):
    web_client = WebClient()
    image_data = web_client.DownloadData(image_url)
    
    with MemoryStream(image_data) as image_stream:
        bitmap = Bitmap(image_stream)
        # Resize the image
        original_width = bitmap.Width
        original_height = bitmap.Height
        max_width = 240.0
        max_height = 240.0
        # Calculate new dimensions preserving the aspect ratio
        ratio = min(max_width / original_width, max_height / original_height)
        new_width = int(original_width * ratio)
        new_height = int(original_height * ratio)
        debug('new_width', new_width)
        
        resized_bitmap = bitmap.GetThumbnailImage(new_width, new_height, None, IntPtr.Zero)
        
        # Convert the image to PNG (or other supported formats)
        png_stream = MemoryStream()
        #resized_bitmap.Save(png_stream, ImageFormat.Png)
        png_bytes = png_stream.ToArray()
        
        # Convert PNG byte array to hexadecimal string
        png_hex = ''.join('{:02x}'.format(b) for b in png_bytes)

        # Create RTF content with the embedded PNG image
        rtf = []
        rtf.append(r"{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Arial;}}")
        rtf.append(r"\viewkind4\uc1")
        
        #image start
        stream = MemoryStream()
        resized_bitmap.Save(stream, ImageFormat.Bmp)  # Save as BMP
        stream.Position = 0  # Reset stream position

        # Read bytes and convert to hex
        img_bytes = stream.ToArray()
        #debug('img_bytes', img_bytes)
        #debug('here', 'here1')
        #hex_string = binascii.hexlify(img_bytes).decode('ascii')
        hex_string = BitConverter.ToString(img_bytes).Replace("-", "").ToLower()

        # Write the RTF content to a file
        return hex_string

def prepareRow(x):
    row = JObject()
    row["accNo"] = x['{YOUR-ITEM-CODE}']
    row["description"] = x['{YOUR-DESCRIPTION}']
    row["qty"] =  x['{YOUR-QUANTITY}']
    row["uom"] = "N/A"
    row["unitPrice"] = x['{YOUR-UNIT-PRICE}'] 
    row["subtotal"] = x['{YOUR-TOTAL}']
    if x["{YOUR-TAX-CODE}"].Id != 0:
        row["taxCode"] = x['{YOUR-TAX-CODE}']['{YOUR-TAX-CODE}']
        # row["taxRate"] = x['{YOUR-TAX-CODE}']['{YOUR-PERCENTAGE}'].ToString()
    row["taxAdjustment"] = None
    return row
    
def preparePayload(data):
    payloadData = JObject()
    payloadData["type"] = "APInvoice"
    payloadData["cancelled"] = data['{YOUR-CANCELLED}']
    payloadData["payload"] = JObject()
    if data['{YOUR-CODE}'] != None and data['{YOUR-CODE}'] != 0:
        payloadData["payload"]["docKey"] = data['{YOUR-CODE}'] 
    payloadData["payload"]["creditorCode"] = data['{YOUR-COMPANY-CODE}']
    payloadData["payload"]["docNo"] = data['{YOUR-SUPPLIER-INVOICE-NO}']
    payloadData["payload"]["docDate"] = data['{YOUR-SUPPLIER-INVOICE-DATE}']
    payloadData["payload"]["description"] = data['{YOUR-TRANSACTION-DESCRIPTION}']
    payloadData["payload"]["inclusiveTax"] = True 
    payloadData["payload"]["displayTerm"] = data['{YOUR-TERM}']
    payloadData["payload"]["details"] = JArray.FromObject(data['{YOUR-DETAILS}'].Select(lambda x: prepareRow(x)))
    
    payloadData["LastModified"] = data.UpdatedDate
    return payloadData

#end of added
for entry in documentList:
    payloadData = preparePayload(entry)
    if payloadData["payload"]["creditorCode"] != None and payloadData["payload"]["creditorCode"] != "":
        resultList.append(payloadData)
    #debug('payloadData', payloadData)
    
#debug('done', resultList)

outputs['results'] = JArray.FromObject(resultList)

Last updated