<?xml version="1.0" encoding="UTF-8"?>
<bm:model xmlns:o="leaf.database.local.oracle" xmlns:e="leaf.service.exception" xmlns:s="leaf.plugin.script" xmlns:f="leaf.database.features" xmlns:bm="http://www.leaf-framework.org/schema/bm" alias="t1">
    <bm:fields/>
    <bm:primary-key/>
    <bm:features>
        <o:sequence-pk/>
        <f:standard-who/>
        <!-- make sure bm-script must be the LAST feature -->
        <s:bm-script><![CDATA[
            function new_bm_map(name) {
                return new CompositeMap("bm", 'http://www.leaf-framework.org/schema/bm', name);
            }
            
            function create_query_field(query_field, queryoperator) {
                if (query_field) {
                    var qf = new_bm_map('query-field');
                    qf.field = query_field;
                    qf.queryoperator = queryoperator; //attribute name must in lowercase
                    $this.addQueryField(qf.getData()); //get it's java type...
                }
            }
            
            function create_order_by_fields() {
                var robf = $ctx.model.getChild('rootpath_order_by_fields');
                var order_by_fields_path = ( !! robf) ? robf.getChildren() : [];
                var order_by_fields = '';
                if (order_by_fields_path.length) {
                    for (var i = 0;i < order_by_fields_path.length;i++) {
                        var order_by_field_result = order_by_fields_path[i];
                        var order_type = '';
                        if (order_by_field_result.grid_order_type == 'DESCENDING') {
                            order_type = 'desc';
                        } else {
                            order_type = 'asc';
                        }
                        var temp_field_name = '';
                        if (order_by_field_result.data_type == 'NUMBER') {
                            temp_field_name = 'to_number(' + order_by_field_result.column_name + ')';
                        } else {
                            temp_field_name = order_by_field_result.column_name;
                        }
                        if (order_by_fields) {
                            order_by_fields = order_by_fields + ',' + temp_field_name + ' ' + order_type;
                        } else {
                            order_by_fields = temp_field_name + ' ' + order_type;
                        }
                    }
                    $this.setDefaultOrderby(order_by_fields);
                }
            }
            
            function override() {
                var qf_root = $this.getObjectContext().getChild("query-fields");
                for (var i = 0;i < override_queryfields.length;i++) {
                    var override_queryfield = override_queryfields[i];
                    importClass(Packages.uncertain.composite.CompositeUtil);
                    var field_name = '';
                    var query_handle = '';
                    if (override_queryfield['name']) {
                        field_name = 'name';
                        query_handle = 'queryexpression';
                    } else if (override_queryfield['field']) {
                        field_name = 'field';
                        query_handle = 'queryoperator';
                    }
                    var query_field = CompositeUtil.findChild(qf_root, "query-field", "field", override_queryfield[field_name]);
                    if (query_field) {
                        query_field.remove('field');
                        query_field.remove('queryoperator');
                        query_field.put(field_name, override_queryfield[field_name]);
                        query_field.put(query_handle, override_queryfield[query_handle]);
                    } else {
                        var qf = new_bm_map('query-field');
                        qf[field_name] = override_queryfield[field_name];
                        qf[query_handle] = override_queryfield[query_handle];
                        $this.addQueryField(qf.getData());
                    }
                }
            }
            
            function add_datafilter() {
                if (add_datafilters.length) {
                    var model = new CompositeMap($this.getObjectContext());
                    var datafilters = model.getChild('data-filters');
                    if (!datafilters) {
                        datafilters = model.createChildNS('data-filters');
                    }
                    for (var i = 0;i < add_datafilters.length;i++) {
                        var add_datafilter = add_datafilters[i];
                        var dataf = datafilters.createChildNS('data-filter');
                        dataf.name = add_datafilter.name;
                        dataf.enforceoperations = 'query';
                        dataf.expression = add_datafilter.expression;
                    }
                }
            }
            
            function remove_datafilter(name) {
                var datafilters = $this.getObjectContext().getChild("data-filters");
                importClass(Packages.uncertain.composite.CompositeUtil);
                if (datafilters) {
                    var dataf = CompositeUtil.findChild(datafilters, "data-filter", "name", name);
                    if (dataf) {
                        datafilters.removeChild(dataf);
                    }
                    var dataf1 = CompositeUtil.findChild(datafilters, "data-filter");
                    if (!dataf1) {
                        $this.getObjectContext().removeChild(datafilters);
                    }
                }
            }

            function remove_query_field(name) {
                importClass(Packages.uncertain.composite.CompositeUtil);
                var qf_root = $this.getObjectContext().getChild("query-fields");
                var query_field = CompositeUtil.findChild(qf_root, "query-field", "field", name);
                if (query_field) {
                    qf_root.removeChild(query_field);
                }
            }

            function import_server_bm_tplt() {
                var cx = Packages.leaf.javascript.Context.getCurrentContext();
                try {
                    if ($ctx.tab_code) {
                        Packages.leaf.plugin.script.engine.ScriptImportor.defineExternScript(cx, this, $ctx.getData(), 'layoutconfig/' + $ctx.parameter.layout_code.toLowerCase() + '_' + $ctx.tab_code.toLowerCase() + '_queryfields.js');
                    }
                    if ($ctx.parameter.authority_flag == 'Y' && $ctx.query_tab_code) {
                        Packages.leaf.plugin.script.engine.ScriptImportor.defineExternScript(cx, this, $ctx.getData(), "aut_authority_bm_validate.js");
                    }
                } catch (e) {
            
                    var je = e.javaException;
                    while (je && je.getCause())
                    je = je.getCause();
                    if (je && je.getClass() == java.io.FileNotFoundException) {
                        if ($ctx.parameter.authority_flag == 'Y' && $ctx.query_tab_code) {
                            Packages.leaf.plugin.script.engine.ScriptImportor.defineExternScript(cx, this, $ctx.getData(), "aut_authority_bm_validate.js");
                        }
                    } else {
                        throw e;
                    }
            
                }
            }
            //去除数据空格
            function remove_space(table_name,field_name,aurora_bm_field){
               //租赁项目信息，客户类型，催收手机号，交货地址，租赁物安置地点，合同签订地
               if(table_name.toUpperCase()=='PRJ_PROJECT'){
                    if(field_name.toUpperCase()=='BP_CLASS' || field_name.toUpperCase()=='CELL_PHONE'
                    || field_name.toUpperCase()=='DELIVERY_ADDRESS' || field_name.toUpperCase()=='LEASE_ITEM_LOCATION'
                    || field_name.toUpperCase()=='SIGNING_CITY'){
                        f.setInsertExpression('hlc_remove_space(${@'+field_name+'})');
                        f.setUpdateExpression('hlc_remove_space(${@'+field_name+'})');
                    }
               }

              //项目报告_租赁物信息，序号，品牌名称，租赁物，机型，机号，使用小时，留购价，二手机评估价，台数
              if(table_name.toUpperCase()=='PRJ_PROJECT_LEASE_ITEM'){
                     if(field_name.toUpperCase()=='LEASE_ITEM_SEQ' || field_name.toUpperCase()=='BRAND_VALUE' ||
                     field_name.toUpperCase()=='LEASE_ITEM_ID' || field_name.toUpperCase()=='MODELCD' ||
                     field_name.toUpperCase()=='MACHINE_NUMBER' || field_name.toUpperCase()=='MACHINE_NUMBER_70' ||
                     field_name.toUpperCase()=='USING_HOUR' || field_name.toUpperCase()=='DETENTION_AMOUNT' ||
                     field_name.toUpperCase()=='DETENTION_AMOUNT' || field_name.toUpperCase()=='SET_NUMBER'){
                         f.setInsertExpression('hlc_remove_space(${@'+field_name+'})');
                         f.setUpdateExpression('hlc_remove_space(${@'+field_name+'})');
                    }
               }

               //承租人评分明细表，房产价值，家庭平均月收入，工程平均月收入，工程合同金额，第三方担保附件份数，年龄，铁甲评分
               if(table_name.toUpperCase()=='BP_TENANT_RATE_DETAIL'){
                 if(field_name.toUpperCase()=='HOUSE_VALUE' || field_name.toUpperCase()=='FAMILY_AVG_INCOME' ||
                 field_name.toUpperCase()=='WORK_AVG_MONTH_INCOME' || field_name.toUpperCase()=='E_CONTRACT_AMOUNT' ||
                 field_name.toUpperCase()=='THIRD_GUAR_SCORE' || field_name.toUpperCase()=='BP_AGE' ||
                 field_name.toUpperCase()=='TJ_SCORE'){
                     f.setInsertExpression('hlc_remove_space(${@'+field_name+'})');
                     f.setUpdateExpression('hlc_remove_space(${@'+field_name+'})');
                    }
                }

               //hls_bp_master和hls_bp_master_req,商业伙伴名称，简称，统一社会信用代码，中征码，注册资本，法人代表姓名，主营业务，法人代表身份证号，电话，手机，注册地址，邮政编码，证件号码，电话（住宅），电话
               //职业信息，入职年份，单位名称，单位详细地址，单位电话，单位邮编
               //配偶信息，配偶姓名，证件号码，联系电话，单位电话，工作单位，单位地址
               //开票信息，发票抬头，开票地址，电话，开户行，账号，纳税人识别号，备注，接收发票邮箱
               if(table_name.toUpperCase()=='HLS_BP_MASTER' || table_name.toUpperCase()=='HLS_BP_MASTER_REQ'){
                    if(field_name.toUpperCase()=='BP_NAME' || field_name.toUpperCase()=='EXTRA_NAM'
                    || field_name.toUpperCase()=='SOCIAL_CODE' || field_name.toUpperCase()=='CREDIT_CODE'
                    || field_name.toUpperCase()=='REGISTERED_CAPITAL' || field_name.toUpperCase()=='LEGAL_PERSON'
                    || field_name.toUpperCase()=='MAIN_BUSINESS' || field_name.toUpperCase()=='ID_CARD_NO_LEG'
                    || field_name.toUpperCase()=='PHONE' || field_name.toUpperCase()=='CELL_PHONE'
                    || field_name.toUpperCase()=='REGISTERED_PLACE' || field_name.toUpperCase()=='ZIPCODE'
                    || field_name.toUpperCase()=='ID_CARD_NO' || field_name.toUpperCase()=='HOME_PHONE'
                    || field_name.toUpperCase()=='EMAIL' || field_name.toUpperCase()=='FAX'
                    || field_name.toUpperCase()=='LIVING_ADDRESS' || field_name.toUpperCase()=='ENTRY_DATE'
                    || field_name.toUpperCase()=='WORK_UNIT' || field_name.toUpperCase()=='WORK_UNIT_ADDRESS'
                    || field_name.toUpperCase()=='WORK_UNIT_PHONE' || field_name.toUpperCase()=='WORK_UNIT_ZIP'
                    || field_name.toUpperCase()=='BP_NAME_SP' || field_name.toUpperCase()=='ID_NO_SP'
                    || field_name.toUpperCase()=='CELL_PHONE_SP' || field_name.toUpperCase()=='WORK_UNIT_PHONE_SP'
                    || field_name.toUpperCase()=='WORK_UNIT_NAME_SP' || field_name.toUpperCase()=='WORK_UNIT_ADDRESS_SP'
                    || field_name.toUpperCase()=='INVOICE_TITLE' || field_name.toUpperCase()=='INVOICE_BP_ADDRESS'
                    || field_name.toUpperCase()=='INVOICE_BP_PHONE_NUM' || field_name.toUpperCase()=='INVOICE_BP_BANK'
                    || field_name.toUpperCase()=='INVOICE_BP_BANK_ACCOUNT' || field_name.toUpperCase()=='TAX_REGISTRY_NUM'
                    || field_name.toUpperCase()=='REF_V07' || field_name.toUpperCase()=='RECEPTION_MAILE'
                    || field_name.toUpperCase()=='ID_CARD_NO_AG'){
                        f.setInsertExpression('hlc_remove_space(${@'+field_name+'})');
                        f.setUpdateExpression('hlc_remove_space(${@'+field_name+'})');
                    }
               }

              //经办人信息，姓名，身份证号，手机号
              if(table_name.toUpperCase()=='HLS_BP_MASTER_SIGNER' || table_name.toUpperCase()=='HLS_BP_MASTER_SIGNER_REQ'){
                    if(field_name.toUpperCase()=='NAME' || field_name.toUpperCase()=='ID_CARD'
                    || field_name.toUpperCase()=='CELL_PHONE'){
                        f.setInsertExpression('hlc_remove_space(${@'+field_name+'})');
                        f.setUpdateExpression('hlc_remove_space(${@'+field_name+'})');
                    }
               }

               //银行信息,账户名称，银行账号，银行全称，支行名称
               //hls_bp_master_bank_acc_req
               if(table_name.toUpperCase()=='HLS_BP_MASTER_BANK_ACCOUNT' || table_name.toUpperCase()=='HLS_BP_MASTER_BANK_ACC_REQ'){
                    if(field_name.toUpperCase()=='BANK_ACCOUNT_NAME' || field_name.toUpperCase()=='BANK_ACCOUNT_NUM'
                    || field_name.toUpperCase()=='BANK_FULL_NAME' || field_name.toUpperCase()=='BANK_BRANCH_NAME'){
                        f.setInsertExpression('hlc_remove_space(${@'+field_name+'})');
                        f.setUpdateExpression('hlc_remove_space(${@'+field_name+'})');
                    }
               }

               //地址信息,详细地址，邮政编码，电话
               if(table_name.toUpperCase()=='HLS_BP_MASTER_ADDRESS' || table_name.toUpperCase()=='HLS_BP_MASTER_ADDRESS_REQ'){
                    if(field_name.toUpperCase()=='ADDRESS' || field_name.toUpperCase()=='ZIPCODE'
                    || field_name.toUpperCase()=='PHONE'){
                        f.setInsertExpression('hlc_remove_space(${@'+field_name+'})');
                        f.setUpdateExpression('hlc_remove_space(${@'+field_name+'})');
                    }
               }

               //联系人信息,联系人名称，职位，电话，传真，E-mail，地址，邮政编码，支付负责人
               if(table_name.toUpperCase()=='HLS_BP_MASTER_CONTACT_INFO'){
                    if(field_name.toUpperCase()=='CONTACT_PERSON' || field_name.toUpperCase()=='POSITION'
                    || field_name.toUpperCase()=='PHONE' || field_name.toUpperCase()=='FAX'
                    || field_name.toUpperCase()=='EMAIL' || field_name.toUpperCase()=='CONTACT_INFO'
                    || field_name.toUpperCase()=='REF_V01' || field_name.toUpperCase()=='PAYMENT_OWNER'){
                        f.setInsertExpression('hlc_remove_space(${@'+field_name+'})');
                        f.setUpdateExpression('hlc_remove_space(${@'+field_name+'})');
                    }
               }

               //企业关联信息,身份类型，名称，证件号码，出资比例
               //hls_bp_master_com_req，法人
               if(table_name.toUpperCase()=='HLS_BP_MASTER_COMPANY_INFO' || table_name.toUpperCase()=='HLS_BP_MASTER_COM_REQ'){
                    if(field_name.toUpperCase()=='IDENTITY_TYPE' || field_name.toUpperCase()=='PERSON_NAME'
                    || field_name.toUpperCase()=='ASSOCIATE_ID_NO' || field_name.toUpperCase()=='CAPITAL_KEY'){
                        f.setInsertExpression('hlc_remove_space(${@'+field_name+'})');
                        f.setUpdateExpression('hlc_remove_space(${@'+field_name+'})');
                    }
               }
            }
            
            var table_name = $ctx.dynamic_base_table;
            // println("table_name:"+table_name);
            if (!table_name) raise_app_error("table name not found");
            $this.setBaseTable(table_name); //get base table from somewhere...
            var dsf = $instance('leaf.database.service.DatabaseServiceFactory');
            var it = new Packages.leaf.plugin.entity.OracleTableFields();
            var tableName = $this.getBaseTable();
            var fMap = new CompositeMap(it.getTableFields(dsf, tableName));
            // println(fMap.toXML());
            if (fMap.msg) raise_app_error('error while get table fields:' + fMap.msg + " :" + table_name);
            var flds = fMap.getChildren();
            var bp_seq_flag = 'N',
                bp_category = 'N';
            for (var i = 0;i < flds.length;i++) {
                var r = flds[i];
                if (r.name == 'BP_SEQ') {
                    bp_seq_flag = 'Y';
                } else if (r.name == 'BP_CATEGORY') {
                    bp_category = 'Y';
                }
                var f = Packages.leaf.bm.Field().createField(r.name.toLowerCase());
                f.setPhysicalName(r.name);
                if (r.dbtype == 'NUMBER') {
                    f.setDataType('java.lang.Double');
                } else if (r.dbtype == 'CLOB') {
                    f.setDataType('java.sql.Clob');
                } else {
                    if (!r.javatype) {
                        f.setDataType('java.lang.String');
                    } else {
                        f.setDataType(r.javatype);
                    }
                }
                f.setDatabaseType(r.dbtype);
                remove_space(tableName,r.name.toLowerCase(),f);
                f.setPrompt(r.prompt);
                $this.addField(f);
                if (r.ispk) {
                    //dynamic primary-key
                    if (!$ctx.pkmap) $ctx.pkmap = {};
                    $ctx.pkmap[table_name] = r.name.toLowerCase();
                    var pk = new_bm_map('pk-field');
                    // println("pk:" + r.toXML());
                    //f.setInsertExpression(table_name+'_s.nextval');
                    pk.name = r.name.toLowerCase();
                    if ($ctx.excelSaveFlag == 'Y') {
                        var model = new CompositeMap($this.getObjectContext());
                        var datafilters = model.getChild('data-filters');
                        if (!datafilters) {
                            datafilters = model.createChildNS('data-filters');
                        }
                        dataf = datafilters.createChildNS('data-filter');
                        dataf.name = pk.name;
                        dataf.enforceoperations = 'query';
                        dataf.expression = pk.name.toLowerCase() + '=${@' + pk.name.toLowerCase() + '}';
                    }
                    $this.getObjectContext().getChild('primary-key').addChild(pk.getData()); //get it's java type...
                }
                if ($ctx.query_tab_code) {
                    if (r.dbtype != 'DATE' && r.name.toLowerCase() != 'bp_seq' && r.name.toLowerCase() != 'bp_category' && r.name.toLowerCase() != 'copy_contract_id') {
                        create_query_field(r.name.toLowerCase(), 'like');
                    }
                }
            }
            if (!$ctx.query_tab_code) {
                var qf_root = $ctx.model.getChild('rootpath_query_field');
                // println("pk:" + qf_root.toXML());
                var qfs = ( !! qf_root) ? qf_root.getChildren() : [];
                var model = new CompositeMap($this.getObjectContext());
                var datafilters = model.getChild('data-filters');
                if (!datafilters) {
                    datafilters = model.createChildNS('data-filters');
                }
                // if (bp_seq_flag == 'Y' && $ctx.dynamic_parent_table == 'prj_project') {
                // qfs.push({
                // query_field1: '',
                // query_field2: 'BP_SEQ'
                // });
                // }
                if (bp_category == 'Y' && $ctx.dynamic_parent_table == 'prj_project') {
                    qfs.push({
                        query_field1: '',
                        query_field2: 'BP_CATEGORY'
                    });
                }
                for (var i = 0;i < qfs.length;i++) {
                    //dynamic query field
                    var temp_qf = qfs[i];
                    create_query_field(temp_qf.query_field1, '=');
                    create_query_field(temp_qf.query_field2, '=');
                    if (temp_qf.query_field2) {
                        var query_field2 = temp_qf.query_field2;
                        if (($ctx.parameter.tree_code || $ctx.dynamic_tab_type == 'GRIDBOX') && query_field2.toLowerCase() == 'bp_seq') {
                            continue;
                        }
                        var dataf = datafilters.createChildNS('data-filter');
                        dataf.name = query_field2.toLowerCase();
                        dataf.enforceoperations = 'query';
                        if ($ctx.query_bp_category) {
                            if (temp_qf.query_field2 == 'BP_CATEGORY') {
                                if ($ctx.parameter.bp_category == 'TENANT') {
                                    dataf.expression = query_field2.toLowerCase() + ' in (' + "'" + "TENANT" + "'," + "'" + "TENANT_SEC" + "'" + ')';
                                } else {
                                    dataf.expression = query_field2.toLowerCase() + '=${@' + query_field2.toLowerCase() + '}';
                                }
                            } else {
                                dataf.expression = query_field2.toLowerCase() + '=${@' + query_field2.toLowerCase() + '}';
                            }
                        } else if (!$ctx.query_bp_category && (temp_qf.query_field2 == 'BP_CATEGORY' || temp_qf.query_field2 == 'BP_SEQ')) {
                            dataf.expression = '1=1';
                        } else {
                            dataf.expression = query_field2.toLowerCase() + '=${@' + query_field2.toLowerCase() + '}';
                        }
                    }
                }
            }
            import_server_bm_tplt();
            create_order_by_fields();
            /*   println('===============================');
             println($ctx.parameter.authority_flag);
             println('===============================');
             println($this.getObjectContext().toXML()); */
        ]]></s:bm-script>
    </bm:features>
    <bm:relations/>
    <bm:query-fields/>
</bm:model>
