/* functionalities of sales.html and sale.html */
fx.sales = {};
// args.container:<HTMLElement>
fx.sales.init = function(args) {
if( args===undefined ) return;
const kxWrap = args.page;
const kxTableSales = $(kxWrap).find("[name=sales]").get(0);
kx.ui.table.init({
elem: kxTableSales,
headers: [
{ id:"icon", label:"", width:"0%" },
{ id:"trans", label:"销售单号/日期时间" },
{ id:"customer", label:"VIP会员" },
{ id:"employee", label:"销售人员" },
{ id:"TYPE", label:"类型" },
{ id:"TOTAL_QTY", label:"总数量", align:"right" },
{ id:"TOTAL_AMT", label:"总金额", align:"right" },
{ id:"AMT_DISCOUNTABLE", label:"可促销金额", align:"right" },
{ id:"DISCOUNT", label:"打折优惠%", align:"right" },
{ id:"DEDUCTION", label:"折后减免", align:"right" },
{ id:"AMT_DUE", label:"应付金额", align:"right" },
{ id:"PAID_AMT", label:"已支付额", align:"right" },
{ id:"info", label:"说明", width:"100%", wrap:true }
]
});
fx.sales.getList(args);
};
fx.sales.page = function(args) {
if( args===undefined ) args = {};
kxie.ui.page.show({
container: args.container,
url: "html/sale/sales.html",
onLoad: fx.sales.init
});
};
// args.page:<kxWrap>
fx.sales.getList = function(args) {
const kxWrap = args.page;
const kxTableSales = $(kxWrap).find("[name=sales]").get(0);
const divSpinner = $(kxWrap).find("[name=spinner]").get(0);
const cbOnSuccess = function(argsOnSuccess) {
const jsonResp = argsOnSuccess.jsonResp;
const jsonSales = jsonResp.data;
kx.ui.table.clear({
elem: kxTableSales
});
var sale, rowObj, view, trans, transTs, id, customer, employee, amtPaid;
var saleType;
for( var i=0; i<jsonSales.length; i++) {
sale = jsonSales[i];
saleType = fx.sale.type.get(sale.TYPE);
if( saleType===fx.sale.type.SALE ) {
amtPaid = sale.PAID_AMT.toFixed(2) +
(sale.DEPOSIT===0? "" : "<br/>含预付: " + sale.DEPOSIT.toFixed(2));
}else{
amtPaid = sale.PAID_AMT.toFixed(2);
}
transTs = sale.TRANS_TS? sale.TRANS_TS.split(".",1)[0] : "";
id = "<button class=\"kxLink\" onclick=\"fx.sales.onOpen(event,'" + sale.ID + "')\">"
+ sale.ID + "</button>";
trans = id + "<br/>" + transTs;
customer = (sale.CUSTOMER_ID? sale.CUSTOMER_ID : "")
+ (sale.CUSTOMER_NAME? "<br/>" + sale.CUSTOMER_NAME : "");
employee = (sale.EMPLOYEE_ID? sale.EMPLOYEE_ID : "")
+ (sale.EMPLOYEE_NAME? "<br/>" + sale.EMPLOYEE_NAME : "");
view = {
icon: "",
trans: trans,
TRANS_TS: transTs,
TYPE: saleType,
customer: customer,
employee: employee,
TOTAL_QTY: sale.TOTAL_QTY,
TOTAL_AMT: sale.TOTAL_AMT.toFixed(2),
AMT_DISCOUNTABLE: sale.AMT_DISCOUNTABLE.toFixed(2),
DISCOUNT: sale.DISCOUNT,
DEDUCTION: sale.DEDUCTION.toFixed(2),
AMT_DUE: sale.AMT_DUE.toFixed(2),
PAID_AMT: amtPaid,
info: (sale.DESCRIPTION? sale.DESCRIPTION : "")
};
rowObj = {
value: sale,
label: view
};
kx.ui.table.addRow({
elem: kxTableSales,
row: rowObj
});
}
};
const jsonReq = {
req: "SALE_LIST",
pageNum: kx.number(kx.ui.get(kxWrap, "pageNum"), 1),
pageSize: kx.number(kx.ui.get(kxWrap, "pageSize"), 10)
};
kx.ajax.api({
data: jsonReq,
onSuccess: cbOnSuccess,
spinner: new kx.ui.Spinner(divSpinner, "请稍候...")
});
};
fx.sales.onOpen = function(event, saleId) {
const kxWrap = $(event.target).closest(".kxWrap").get(0);
const cbOnData = function(argsOnData) {
const sale = argsOnData.data;
};
fx.sale.page({
data: { ID: saleId },
onData: cbOnData
});
};
fx.sales.onPrev = function(event) {
const kxWrap = $(event.target).closest(".kxWrap").get(0);
var pageNum = kx.number(kx.ui.get(kxWrap, "pageNum"), 1);
if( pageNum>1 ) {
kx.ui.set(kxWrap, "pageNum", pageNum - 1);
fx.sales.getList({
page: kxWrap
});
}else{
kx.ui.msg.info({
ttl:1, message: "已经是第一页了"
});
}
};
fx.sales.onNext = function(event) {
const kxWrap = $(event.target).closest(".kxWrap").get(0);
const kxTableSales = $(kxWrap).find("[name=sales]").get(0);
const pageSize = kx.number(kx.ui.get(kxWrap, "pageSize"), 10);
const curSize = kxie.ui.table.rowCount({elem:kxTableSales});
var pageNum = kx.number(kx.ui.get(kxWrap, "pageNum"), 1);
if( curSize>=pageSize ) {
kx.ui.set(kxWrap, "pageNum", pageNum + 1);
fx.sales.getList({
page: kxWrap
});
}else{
kx.ui.msg.info({
ttl:1, message: "已经是最后一页了"
});
}
};
/* end of sales.html */
/* saleEntry.html */
fx.saleEntry = {};
// args.page:<kxWrap>
// args.data:<sale record>
fx.saleEntry.init = function(args) {
const kxWrap = args.page;
const sale = args.data;
const divSale = $(kxWrap).find("[name=sale]").get(0);
kx.ui.set(divSale, "STORE_ID", fx.handshake.data.bootstrap_storeId);
kx.ui.set(divSale, "EMPLOYEE_ID", fx.session.user.ID);
kx.ui.set(divSale, "EMPLOYEE_NAME", fx.session.user.NAME);
kx.ui.set(divSale, "employee", fx.session.user.NAME + " [" + fx.session.user.ID + "]");
if( sale===undefined || sale.ID===undefined ) {
kx.ui.set(kxWrap, "siud", "I");
}else{
kx.ui.set(kxWrap, "siud", "U");
const cbOnResp = function(argsResp) {
const jsonResp = argsResp.jsonResp;
if( jsonResp.count>0 || jsonResp.data ) {
kx.ui.set(kxWrap, "siud", "U");
fx.saleEntry.onData({
page: kxWrap,
data: argsResp.data
});
}
};
fx.sale.siud({
data: sale,
siud: "S",
onResp: cbOnResp,
spinner: new kx.ui.Spinner(divSale)
});
}
$(kxWrap).find("[name=venderSearchKey]").focus();
};
// args.container:<HTMLElement> - the container of the page
// args.onData:<function> - called when the sale object is saved,
// argsCb.page and args.data will be passed in
// args.data:<sale object> - the sale record to be displayed in this page
fx.saleEntry.page = function(args) {
if( args===undefined ) args = {};
const sale = args.data;
const cbOnSuccess = function(argsSuccess) {
const kxWrap = argsSuccess.page;
fx.saleEntry.init({
page: kxWrap,
data: sale
});
};
kxie.ui.page.show({
container: args.container,
url: "html/sale/saleEntry.html",
onData: args.onData,
onLoad: cbOnSuccess,
width: "40rem",
height: "34rem"
});
};
fx.saleEntry.onNewVender = function(event) {
const kxWrap = $(event.target).closest(".kxWrap").get(0);
const cbOnData = function(cbArgs) {
const vender = cbArgs.data; // the saved entity
fx.saleEntry.onData({
page: kxWrap,
data: vender
});
};
fx.vender.page({
onData: cbOnData
});
};
fx.saleEntry.onCleanVender = function(event) {
const kxWrap = $(event.target).closest(".kxWrap").get(0);
kx.ui.set(kxWrap, "vender", "");
kx.ui.set(kxWrap, "VENDER_ID", "");
kx.ui.set(kxWrap, "VENDER_NAME", "");
kx.ui.set(kxWrap, "venderSearchKey", "");
};
// args.page:<div.kxWrap>
// args.data:<vender entity data>
fx.saleEntry.onData = function(args) {
if( args===undefined ) return;
const kxWrap = args.page;
const vender = args.data;
kx.ui.set(kxWrap, "vender", vender.NAME + "\n供应商代码: " + vender.ID);
kx.ui.set(kxWrap, "VENDER_ID", vender.ID);
kx.ui.set(kxWrap, "VENDER_NAME", vender.NAME);
};
fx.saleEntry.onSearchVender = function(event) {
const kxWrap = $(event.target).closest(".kxWrap").get(0);
const divSpinner = $(kxWrap).find("[name=venderSpinner]").get(0);
const searchKey = kx.ui.get(kxWrap, "venderSearchKey", "").trim();
if(searchKey.length===0) return;
const cbOnData = function(argsOnData) {
const venderData = argsOnData.data;
fx.saleEntry.onData({
page: kxWrap,
data: venderData
});
};
fx.venders.search({
keyword: searchKey,
onData: cbOnData,
spinner: new kx.ui.Spinner(divSpinner)
});
};
fx.saleEntry.onCancel = function(event) {
const kxWrap = $(event.target).closest(".kxWrap").get(0);
kxWrap.close();
};
fx.saleEntry.onEnter = function(event) {
const kxWrap = $(event.target).closest(".kxWrap").get(0);
const formSale = $(kxWrap).find("[name=sale]").get(0);
const sale = {};
const siud = kx.ui.get(formSale, "siud", "I");
// read form data
sale.ID = kx.ui.get(formSale, "ID");
sale.STORE_ID = kx.ui.get(formSale, "STORE_ID");
sale.EMPLOYEE_ID = kx.ui.get(formSale, "EMPLOYEE_ID");
sale.EMPLOYEE_NAME = kx.ui.get(formSale, "EMPLOYEE_NAME");
sale.VENDER_ID = kx.ui.get(formSale, "VENDER_ID");
sale.VENDER_NAME = kx.ui.get(formSale, "VENDER_NAME");
sale.FILE_ID = kx.ui.get(formSale, "FILE_ID");
sale.DESCRIPTION = kx.ui.get(formSale, "DESCRIPTION");
var cbOnResp = function(cbArgs) {
const jsonResp = cbArgs.jsonResp;
if(kxWrap.onData instanceof Function) {
kxWrap.onData({
page: kxWrap,
data: jsonResp.data
});
kxWrap.close();
}
};
fx.sale.siud({
data: sale,
siud: siud,
onResp: cbOnResp,
spinner: new kx.ui.Spinner(formSale)
});
};
/* end of saleEntry.html */
/* end of sale.html */
fx.sale = {};
// args.page:<kxWrap>
// args.data:<sale record> - the record to display
fx.sale.init = function(args) {
if( args===undefined ) return;
const kxWrap = args.page;
const sale = args.data;
const divRECV_LINE = $(kxWrap).find("[name=RECV_LINE]").get(0);
const kxSelectUom = $(divRECV_LINE).find(".kxSelect[name=UOM]").get(0);
kx.ui.controls.select.init({
elem: kxSelectUom,
selected:'件',
options: fx.uoms,
readonly: true
});
// adding headers of LINES table
const kxTableLINES = $(kxWrap).find("[name=LINES]").get(0);
kx.ui.table.init({
elem: kxTableLINES,
headers: [
{ id:"icon", label:"", width:"0%" },
{ id:"description", label:"商品描述", width:"100%", wrap:true },
{ id:"DISCOUNT", label:"折扣", width:"2rem", align:"right"},
{ id:"DEDUCTION", label:"减免", width:"2rem", align:"right"},
{ id:"AMT_SAVED", label:"优惠额", width:"2rem", align:"right"},
{ id:"SOLD_PRICE", label:"售价", width:"2rem", align:"right"},
{ id:"QTY_SALE", label:"数量", width:"2rem", align:"right"},
{ id:"AMT_SALE", label:"金额", width:"4rem", align:"right" }
]
});
};
// args.page:kxWrap
// args.data:<sale record, including LINES>
fx.sale.onDataSale = function(args) {
if( args===undefined || args.page===undefined ) return;
if( args.data===undefined ) return;
const kxWrap = args.page;
const divORDER = $(kxWrap).find("[name=ORDER]").get(0);
const tblLINES = $(kxWrap).find("[name=LINES]").get(0);
const sale = args.data;
const lines = sale.LINES;
var transTs = sale.TRANS_TS? sale.TRANS_TS.split(".",1)[0] : "";
kx.ui.set(divORDER, "ID", sale.ID);
kx.ui.set(divORDER, "TRANS_TS", transTs);
kx.ui.set(divORDER, "TYPE", fx.sale.type.get(sale.TYPE));
kx.ui.set(divORDER, "EMPLOYEE_ID", sale.EMPLOYEE_ID);
kx.ui.set(divORDER, "EMPLOYEE_NAME", sale.EMPLOYEE_NAME);
kx.ui.set(divORDER, "CUSTOMER_ID", sale.CUSTOMER_ID);
kx.ui.set(divORDER, "CUSTOMER_NAME", sale.CUSTOMER_NAME);
kx.ui.set(divORDER, "TOTAL_AMT", sale.TOTAL_AMT.toFixed(2));
kx.ui.set(divORDER, "TOTAL_QTY", sale.TOTAL_QTY);
kx.ui.set(divORDER, "AMT_DISCOUNTABLE", sale.AMT_DISCOUNTABLE.toFixed(2));
kx.ui.set(divORDER, "DISCOUNT", sale.DISCOUNT.toFixed(2));
kx.ui.set(divORDER, "DEDUCTION", sale.DEDUCTION.toFixed(2));
kx.ui.set(divORDER, "AMT_SAVED", sale.AMT_SAVED.toFixed(2));
kx.ui.set(divORDER, "AMT_SAVED_LINES", sale.AMT_SAVED_LINES.toFixed(2));
kx.ui.set(divORDER, "DEPOSIT", sale.DEPOSIT.toFixed(2));
kx.ui.set(divORDER, "AMT_DUE", sale.AMT_DUE.toFixed(2));
kx.ui.set(divORDER, "PAID_AMT", sale.PAID_AMT.toFixed(2));
var line, transTs;
for(var i=0; i<lines.length; i++) {
line = lines[i];
desc = line.PRODUCT_ID + (line.NAME? " - " + line.NAME : "")
+ (line.NON_INV===true? "" :
"<span style='float:right'>定价: " + line.UNIT_PRICE + "</span>")
+ (line.DESCRIPTION? "<br/>" + line.DESCRIPTION : "");
kx.ui.table.addRow({
elem: tblLINES,
row: {
value: line,
label: {
description: desc,
AMT_SAVED: (line.AMT_SAVED===0? "" : line.AMT_SAVED.toFixed(2)),
QTY_SALE: line.QTY_SALE.toFixed(2),
SOLD_PRICE: line.SOLD_PRICE.toFixed(2),
AMT_SALE: line.AMT_SALE.toFixed(2) + (line.DISCOUNTABLE? "*" : ""),
DISCOUNT: (line.DISCOUNT===0? "" : line.DISCOUNT + "%"),
DEDUCTION: (line.DEDUCTION===0? "" : line.DEDUCTION.toFixed(2))
}
}
});
};
};
// args.container:<HTMLElement> - the container of the page
// args.data:<sale record> - the RECV to be displayed in the page
// args.onData - called when the data is saved
fx.sale.page = function(args) {
if( args===undefined || args.data===undefined ) return;
const sale = args.data;
if( sale.ID===undefined ) return;
const cbOnLoad = function(argsOnLoad) {
const kxWrap = argsOnLoad.page;
fx.sale.init({
page: kxWrap,
data: sale
});
// load sale record
kx.ajax.api({
data: {
req: "sale",
data: {
SALE: {
ID: sale.ID,
siud: "S"
}
}
},
onSuccess: function(argsSuccess) {
const jsonResp = argsSuccess.jsonResp;
if( jsonResp.data===undefined ) {
kx.ui.msg.critical({
message: "入库单号[" + sale.ID + "]在系统中不存在!"
});
kxWrap.close();
}else{
fx.sale.onDataSale({
page:kxWrap,
data: jsonResp.data
});
}
}
});
};
kx.ui.page.show({
container: args.container,
url: "html/sale/sale.html",
onLoad: cbOnLoad,
onData: args.onData,
width:'60rem',
height:'calc(90%)'
});
};
fx.sale.onPrintReceipt = function(event) {
const kxWrap = $(event.target).closest(".kxWrap").get(0);
const order = {};
order.ID = kx.ui.get(kxWrap, "ID");
fx.sale.printReceipt({
ORDER: order
});
};
// ORDER:<sale object> - the sale object, may include LINES, or may just has ORDER.ID
// onSuccess:<function> - when receipt is printed successfully
// onError:<function> - when printing receipt failed, the args to it is {error,message,data}
fx.sale.printReceipt = function(args) {
if( args===undefined || args.ORDER===undefined ) return;
var cb = function(argsOnSuccess) {
kxie.ui.msg.info({
message:"收据打印完成了", ttl:1
});
if( args.onSuccess instanceof Function ) {
args.onSuccess(argsOnSuccess);
}
};
const reqData = {
req: "print_receipt",
data: {
SALE: args.ORDER
}
};
kx.ajax.api({
data: reqData,
onSuccess: cb,
onError: args.onError
});
};
fx.sale.type = {
SALE: "销售",
DEPOSIT: "预付",
RETURN: "退货",
get: function(type) {
if( typeof type === "string" ) type = type.toUpperCase();
var v = fx.sale.type[type];
if( v===undefined ) {
v = "未知";
}
return v;
}
};