Artifact [59cddcb06b]

Artifact 59cddcb06b1a792f846b66b28340fd3ed2f99763:


/* 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;
    }
};