Here is what I use when adding a job material through my web app.
You can remove changeJobHeadJobReleased and JobEngineered if thats not need for your company.
const epicorURL = "Your URL"
const jobEntryURL = epicorURL + "Erp.BO.JobEntrySvc/"
const encode = (str: string): string => Buffer.from(str, 'binary').toString('base64'); //Encode string to base64
export interface UserData {
UserID: string
Pass: string
Name: string
Privileges: string
Loaded: boolean
}
export function jobAddMaterialCall(jobNumber: string, partNum: string, attributeSetID: string | null, qty: string, uom: string, byPieces: boolean, userData: UserData, setter: (success: boolean) => void) {
const headers: Headers = new Headers()
headers.set('Content-Type', 'application/json')
headers.set('Accept', 'application/json')
headers.set('Authorization', "Basic " + encode(userData.UserID + ":" + userData.Pass))
// GetByID
const getByID = (body: any) => {
return (new Promise((resolve, reject) => {
const getByID_Request: RequestInfo = new Request((jobEntryURL + "GetByID?jobNum=" + jobNumber), {
method: 'Get',
headers: headers,
})
console.log("GetByID")
fetch(getByID_Request)
.then((res) => {
if (res.status == 200) {
return res.json()
} else {
return res.json().then(text => { throw new Error(text["ErrorMessage"]) })
}
})
.then((data) => {
console.log(data)
var body = data["returnObj"]
resolve(body)
})
.catch((error) => {
console.log(error)
reject(error)
})
}))
}
// GetNewJobMtl
const getNewJobMtl = (body: any) => {
return (new Promise((resolve, reject) => {
var obj = {
"ds": body,
"jobNum": jobNumber,
"assemblySeq": "0",
}
const getnewJobMtlRequest: RequestInfo = new Request((jobEntryURL + "GetNewJobMtl"), {
method: 'POST',
headers: headers,
body: JSON.stringify(obj),
})
console.log("GetNewJobMtl")
fetch(getnewJobMtlRequest)
.then((res) => {
if (res.status == 200) {
return res.json()
} else {
return res.json().then(text => { throw new Error(text["ErrorMessage"]) })
}
})
.then((data) => {
console.log(data)
var body = data["parameters"]["ds"]
resolve(body)
})
.catch((error) => {
console.log(error)
reject(error)
})
}))
}
// ChangeJobHeadJobReleased
const changeJobHeadJobReleased = (body: any, released: boolean) => {
return (new Promise((resolve, reject) => {
var obj = {
"ds": body,
}
obj["ds"]["JobHead"][0]["JobReleased"] = released
obj["ds"]["JobHead"][0]["RowMod"] = "U"
const changeJobHeadJobReleasedRequest: RequestInfo = new Request((jobEntryURL + "ChangeJobHeadJobReleased"), {
method: 'POST',
headers: headers,
body: JSON.stringify(obj),
})
console.log("ChangeJobHeadJobReleased")
fetch(changeJobHeadJobReleasedRequest)
.then((res) => {
if (res.status == 200) {
return res.json()
} else {
return res.json().then(text => { throw new Error(text["ErrorMessage"]) })
}
})
.then((data) => {
console.log(data)
var body = data["parameters"]["ds"]
resolve(body)
})
.catch((error) => {
console.log(error)
reject(error)
})
}))
}
// ChangeJobHeadJobEngineered
const changeJobHeadJobEngineered = (body: any, engineered: boolean) => {
return (new Promise((resolve, reject) => {
var obj = {
"ds": body,
"jobNum": jobNumber,
"assemblySeq": "0",
}
obj["ds"]["JobHead"][0]["JobEngineered"] = engineered
obj["ds"]["JobHead"][0]["RowMod"] = "U"
const changeJobHeadJobEngineeredRequest: RequestInfo = new Request((jobEntryURL + "ChangeJobHeadJobEngineered"), {
method: 'POST',
headers: headers,
body: JSON.stringify(obj),
})
console.log("ChangeJobHeadJobEngineered")
fetch(changeJobHeadJobEngineeredRequest)
.then((res) => {
if (res.status == 200) {
return res.json()
} else {
return res.json().then(text => { throw new Error(text["ErrorMessage"]) })
}
})
.then((data) => {
console.log(data)
var body = data["parameters"]["ds"]
resolve(body)
})
.catch((error) => {
console.log(error)
reject(error)
})
}))
}
// ChangeJobMtlPartNum
const changeJobMtlPartNum = (body: any) => {
return (new Promise((resolve, reject) => {
var obj = {
"ds": body,
"ipValidatePart": true,
"ipPartNum": partNum,
"SysRowID": "00000000-0000-0000-0000-000000000000",
"xrefPartNum": "",
"xrefPartType": ""
}
const ChangeJobMtlPartNumRequest: RequestInfo = new Request((jobEntryURL + "ChangeJobMtlPartNum"), {
method: 'POST',
headers: headers,
body: JSON.stringify(obj),
})
console.log("ChangeJobMtlPartNum")
fetch(ChangeJobMtlPartNumRequest)
.then((res) => {
if (res.status == 200) {
return res.json()
} else {
return res.json().then(text => { throw new Error(text["ErrorMessage"]) })
}
})
.then((data) => {
console.log(data)
var body = data["parameters"]["ds"]
resolve(body)
})
.catch((error) => {
console.log(error)
reject(error)
})
}))
}
// ChangeJobMtlAttributeSetID
const changeJobMtlAttributeSetID = (body: any) => {
return (new Promise((resolve, reject) => {
var obj = {
"attributeSetID": attributeSetID,
"ds": body,
}
var ind = 0;
for (var i = 0; i < obj["ds"]["JobMtl"].length; i++) {
if (obj["ds"]["JobMtl"][i]["PartNum"] == partNum) {
ind = i
}
}
obj["ds"]["JobMtl"][ind]["AttributeSetID"] = attributeSetID
obj["ds"]["JobMtl"][ind]["RowMod"] = "A"
const ChangeJobMtlAttributeSetIDRequest: RequestInfo = new Request((jobEntryURL + "ChangeJobMtlAttributeSetID"), {
method: 'POST',
headers: headers,
body: JSON.stringify(obj),
})
console.log("ChangeJobMtlAttributeSetID")
fetch(ChangeJobMtlAttributeSetIDRequest)
.then((res) => {
if (res.status == 200) {
return res.json()
} else {
return res.json().then(text => { throw new Error(text["ErrorMessage"]) })
}
})
.then((data) => {
console.log(data)
var body = data["parameters"]["ds"]
resolve(body)
})
.catch((error) => {
console.log(error)
reject(error)
})
}))
}
// ChangeJobMtlQtyPer
const changeJobMtlQtyPer = (body: any) => {
return (new Promise((resolve, reject) => {
var obj = {
"ds": body
}
var ind = 0;
for (var i = 0; i < obj["ds"]["JobMtl"].length; i++) {
if (obj["ds"]["JobMtl"][i]["PartNum"] == partNum) {
ind = i
}
}
obj["ds"]["JobMtl"][ind]["QtyPer"] = qty
const ChangeJobMtlQtyPerRequest: RequestInfo = new Request((jobEntryURL + "ChangeJobMtlQtyPer"), {
method: 'POST',
headers: headers,
body: JSON.stringify(obj),
})
console.log("ChangeJobMtlQtyPer")
fetch(ChangeJobMtlQtyPerRequest)
.then((res) => {
if (res.status == 200) {
return res.json()
} else {
return res.json().then(text => { throw new Error(text["ErrorMessage"]) })
}
})
.then((data) => {
console.log(data)
var body = data["parameters"]["ds"]
resolve(body)
})
.catch((error) => {
console.log(error)
reject(error)
})
}))
}
//onChangingNumberOfPieces
const onChangingNumberOfPieces = (body: any) => {
return (new Promise((resolve, reject) => {
console.log("onChangingNumberOfPieces -> " + qty)
var obj = {
"numberOfPieces": qty,
"ds": body
}
var ind = 0;
for (var i = 0; i < obj["ds"]["JobMtl"].length; i++) {
if (obj["ds"]["JobMtl"][i]["PartNum"] == partNum) {
ind = i
}
}
obj["ds"]["JobMtl"][ind]["NumberOfPieces"] = qty
obj["ds"]["JobMtl"][ind]["RowMod"] = "A"
const request: RequestInfo = new Request(jobEntryURL + "OnChangingNumberOfPieces", {
method: 'POST',
headers: headers,
body: JSON.stringify(obj)
})
fetch(request)
.then((res) => {
if (res.status == 200) {
return res.json()
} else {
return res.json().then(text => { throw new Error(text["ErrorMessage"]) })
}
})
.then((data) => {
console.log(data)
var body = data["parameters"]["ds"]
console.log(body)
resolve(body)
})
.catch((error) => {
console.log(error)
reject(error)
})
}))
}
// ChangeJobMtlEstSplitCosts
const changeJobMtlEstSplitCosts = (body: any) => {
return (new Promise((resolve, reject) => {
var obj = {
"ds": body
}
const ChangeJobMtlEstSplitCostsRequest: RequestInfo = new Request((jobEntryURL + "ChangeJobMtlEstSplitCosts"), {
method: 'POST',
headers: headers,
body: JSON.stringify(obj),
})
console.log("ChangeJobMtlEstSplitCosts")
fetch(ChangeJobMtlEstSplitCostsRequest)
.then((res) => {
if (res.status == 200) {
return res.json()
} else {
return res.json().then(text => { throw new Error(text["ErrorMessage"]) })
}
})
.then((data) => {
console.log(data)
var body = data["parameters"]["ds"]
console.log(body)
resolve(body)
})
.catch((error) => {
console.log(error)
reject(error)
})
}))
}
// ChangeJobMtlFixedQty
const changeJobMtlFixedQty = (body: any) => {
return (new Promise((resolve, reject) => {
var obj = {
"ds": body
}
var ind = 0;
for (var i = 0; i < obj["ds"]["JobMtl"].length; i++) {
if (obj["ds"]["JobMtl"][i]["PartNum"] == partNum) {
ind = i
}
}
console.log("ChangeJobMtlFixedQty")
obj["ds"]["JobMtl"][ind]["FixedQty"] = true;
const ChangeJobMtlFixedQtyRequest: RequestInfo = new Request((jobEntryURL + "ChangeJobMtlFixedQty"), {
method: 'POST',
headers: headers,
body: JSON.stringify(obj),
})
fetch(ChangeJobMtlFixedQtyRequest)
.then((res) => {
if (res.status == 200) {
return res.json()
} else {
return res.json().then(text => { throw new Error(text["ErrorMessage"]) })
}
})
.then((data) => {
console.log(data)
var body = data["parameters"]["ds"]
console.log(body)
resolve(body)
})
.catch((error) => {
console.log(error)
reject(error)
})
}))
}
// Update
const update = (body: any) => {
return (new Promise((resolve, reject) => {
var obj = {
"ds": body
}
const updateRequest: RequestInfo = new Request((jobEntryURL + "Update"), {
method: 'POST',
headers: headers,
body: JSON.stringify(obj),
})
console.log("Update")
fetch(updateRequest)
.then((res) => {
if (res.status == 200) {
return res.json()
} else {
return res.json().then(text => { throw new Error(text["ErrorMessage"]) })
}
})
.then((data) => {
console.log(data)
var body = data["parameters"]["ds"]
console.log(body)
resolve(body)
})
.catch((error) => {
console.log(error)
reject(error)
})
}))
}
const finishingBits = (body: any) => {
changeJobMtlEstSplitCosts(body)
.then((body) => changeJobMtlFixedQty(body))
.then((body) => update(body))
.then((body) => changeJobHeadJobEngineered(body, true))
.then((body) => {
changeJobHeadJobReleased(body, true)
})
.then((body) => { setter(true) })
}
getByID(jobNumber)
.then((body) => changeJobHeadJobReleased(body, false))
.then((body) => changeJobHeadJobEngineered(body, false))
.then((body) => getNewJobMtl(body))
.then((body) => changeJobMtlPartNum(body))
.then((body) => {
if (attributeSetID?.toString() != "0") {
changeJobMtlAttributeSetID(body)
.then((body) => {
if (byPieces) {
onChangingNumberOfPieces(body)
.then((body) => { finishingBits(body) })
} else {
finishingBits(body)
}
})
} else {
changeJobMtlQtyPer(body)
.then((body) => { finishingBits(body) })
}
})
.catch(() => {
setter(false)
})
}