Invoice
Invoice's Database
Debtor
debtorCodeString
Debtor must match existing debtor code, and they must be active state.
E.g.: 400-A001
Invoice No
docNoString
Avoid using the same Invoice No to prevent overwrite.
E.g.: INV00001
Date
docDateString
E.g.: 2024-11-27T00:00:00+08:00
Sales Location
salesLocationString
Must have existing Sales Location in the accounting system.
E.g.: HQ
Credit Term
displayTermString
Credit Term must match the same in the accounting system
E.g.: C.O.D.
Description
descriptionString
E.g.: INVOICE
Inclusive?
inclusiveTaxBoolean
E.g.: False
Rate
currencyRateDecimal
E.g.: 1.234
Invoice's Table Item
Item Code
itemCodeString
E.g.: A001
Acc. No.
accNoString
E.g.: 500-0123
Description
descriptionString
E.g.: PRODUCT - CL14
D/O Number
ourDONoString
E.g.: DO-123-456
UOM
uomString
E.g.: UNIT
Location
locationString
Must have existing Location in the accounting system.
E.g.: HQ
Qty
qtyDecimal
Value must be number, and value cannot be negative.
E.g.: 10.0
Unit Price
unitPriceDecimal
Value must be number, and value cannot be negative.
E.g.: 10.0
Additional
Cancelled
cancelledBoolean
Pass true to void the Invoice
Draft
draftBoolean
Pass true to allow Invoice Save as Draft . (invoice will not be finalized).
Submit E-Invoice
submitEInvoiceBoolean
Pass true to check on the Submit e-Invoice?
Invoice'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 = []
def prepareRow(x):
row = JObject()
row["itemCode"] = x["{YOUR-ITEM-CODE}"]
row["accNo"] = x["{YOUR-ACC-NO}"]
row["description"] = x["{YOUR-DESCRIPTION}"].ToString()
row["ourDONo"] = x["{YOUR-DO-NO}"]
row["uom"] = x["{YOUR-UOM}"]
row["location"] = x["{YOUR-LOCATION}"]
row["qty"] = x["{YOUR-QTY}"]
row["unitPrice"] = x["{YOUR-UNIT-PRICE}"] * x["{YOUR-EXCHANGE-RATE}"]
return row
def preparePayload(data):
payloadData = JObject()
payloadData["type"] = "ARInvoice"
payloadData["payload"] = JObject()
payloadData["cancelled"] = data["{IS-YOUR-DOC-CANCELLED}"]
payloadData["draft"] = True
payloadData["payload"]["submitEInvoice"] = True
payloadData["payload"]["debtorCode"] = data["{YOUR-DEBTOR-CODE}"]
# payloadData["payload"]["docNo"] = None if data['{YOUR-DOC-NO}'] == "" or data['{YOUR-DOC-NO}'] is None else data['{YOUR-DOC-NO}']
payloadData["payload"]["docNo"] = data.DocumentId
payloadData["payload"]["docDate"] = data["{YOUR-DOC-DATE}"]
payloadData["payload"]["salesLocation"] = data["{YOUR-SALES-LOCATION}"]
payloadData["payload"]["displayTerm"] = data["{YOUR-CREDIT-TERM}"]
payloadData["payload"]["description"] = "INVOICE"
payloadData["payload"]["details"] = JArray.FromObject(
data["{YOUR-TABLE}"].Select(lambda x: prepareRow(x))
)
payloadData["LastModified"] = data.UpdatedDate
return payloadData
# end of added
for entry in documentList:
payloadData = preparePayload(entry)
if (
payloadData["payload"]["debtorCode"] != None
and payloadData["payload"]["debtorCode"] != ""
):
resultList.append(payloadData)
# debug('payloadData', payloadData)
# debug('done', resultList)
outputs["results"] = JArray.FromObject(resultList)
debug("result", 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
Last updated