/**
 * Created by CSL on 2020/07/13.  湖南计算程序、基数 等覆盖。
 */

let isHN2020 = true;

// 一般计税取不含税市场价、不含税定额价。简易计税取含税市场价、含税定额价。打开项目时，4个价格根据计税类型只载入其二，所以这里可不作区分。
function overwriteRationCalcBases(taxType) {
    if (typeof rationCalcBases == 'undefined') return;
    for (let key in rationCalcBases) delete rationCalcBases[key];
    // let isJY = taxType == '2';

    rationCalcBases['人工费'] = function (node, isTender) {
        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptMarketPrice, isTender);
    };
    rationCalcBases['材料费'] = function (node, isTender) {
        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptMarketPrice, isTender);
    };
    rationCalcBases['施工机械使用费'] = function (node, isTender) {
        return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptMarketPrice, isTender);
    };
    rationCalcBases['施工机械人工费'] = function (node, isTender) {
        return calcTools.machineDetailFee(node, node.data.gljList, [], gljType.MACHINE_LABOUR, isTender);
    };
    rationCalcBases['设备购置费'] = function (node, isTender) {
        return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice, isTender);
    };
    rationCalcBases['定额人工费'] = function (node, isTender) {
        return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice, isTender);
    };
    rationCalcBases['定额材料费'] = function (node, isTender) {
        return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice, isTender);
    };
    rationCalcBases['定额施工机械使用费'] = function (node, isTender) {
        return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptBasePrice, isTender);
    };
    rationCalcBases['定额商品砼费'] = function (node, isTender) {
        return calcTools.rationBaseFee(node, [gljType.COMMERCIAL_CONCRETE, gljType.COMMERCIAL_MORTAR], priceTypes.ptBasePrice, isTender);
    };
    rationCalcBases['定额设备费'] = function (node, isTender) {
        return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptBasePrice, isTender);
    };
    rationCalcBases['定额外购砼构件费'] = function (node, isTender) {
        return calcTools.rationBaseFee(node, [gljType.PURCHASE_COMPONENT], priceTypes.ptBasePrice, isTender);
    };
    rationCalcBases['定额绿化苗木费'] = function (node, isTender) {
        return calcTools.rationBaseFee(node, [gljType.GREEN_SEEDLING], priceTypes.ptBasePrice, isTender);
    }
};

(function overwriteFeeTypes() {
    if (typeof cpFeeTypes == 'undefined') return;
    cpFeeTypes = [
        { type: 'marketLabour', name: '人工费' },
        { type: 'marketMaterial', name: '材料费' },
        { type: 'marketMachine', name: '施工机械使用费' },
        { type: 'marketMachineLabour', name: '施工机械人工费' },
        { type: 'marketEquipment', name: '设备购置费' },
        { type: 'marketDirect', name: '直接费' },

        { type: 'labour', name: '定额人工费' },
        { type: 'material', name: '定额材料费' },
        { type: 'machine', name: '定额施工机械使用费' },
        { type: 'equipment', name: '定额设备费' },
        { type: 'direct', name: '定额直接费' },

        { type: 'measure', name: '措施费' },
        { type: 'measure1', name: '措施费I' },
        { type: 'measure2', name: '措施费II' },
        { type: 'manage', name: '企业管理费' },
        { type: 'force', name: '规费' },
        { type: 'profit', name: '利润' },
        { type: 'tax', name: '税金' },
        { type: 'common', name: '建安费' },
        { type: 'rationCommon', name: '定额建安费' }
    ];
})();

// 清单基数
const progression = ['施工场地建设费', '养护单位项目管理费', '养护单位项目管理费(未单独设置项目部)', '工程监理费', '工程监理费(未实行社会监理)', '设计文件审查费', '工程设计费'];
const deficiency = {};
if (typeof baseFigureMap !== 'undefined') {
    const { fixedFlag } = commonConstants;
    const budgetMap = {
        // 显示：除清单固定类别是“建筑安装工程费”的以外部分可显示
        '养护工程费': {
            base: 'YHGCF',
            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
            filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
            pick: false,
        },
        // 显示：仅清单固定类别是“安全生产费”的可显示
        '养护工程费(不含安全生产费)': {
            base: 'YHGCFBHSC',
            fixedFlag: null,
            filter: [fixedFlag.SAFE_COST],
            pick: true
        },
        // 显示：仅清单固定类别是“养护工程其他费用”部分可显示
        '养护工程费(不含设备费)': {
            base: 'YHGCFBHSB',
            fixedFlag: null,
            filter: [fixedFlag.MAINTENANCE_EXPENSES],
            pick: true
        },
        // 显示：除清单固定类别是“建筑安装工程费”的以外部分可显示
        '定额养护工程费': {
            base: 'DEYHGCF',
            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
            filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
            pick: false
        },
        // 显示：仅清单固定类别是“养护工程其他费用”、“施工场地建设费”的可显示
        '定额养护工程费(不含专项费用)': {
            base: 'DEYHGCFBHZXFY',
            fixedFlag: null,
            filter: [fixedFlag.MAINTENANCE_EXPENSES, fixedFlag.CONSTRUCTION_PLANT_COST],
            pick: true,
        },
        // 显示：除清单固定类别是“建筑安装工程费”、“土地使用及拆迁补偿费”的以外部分可显示
        '土地使用及拆迁补偿费': {
            base: 'TDSYJCQBCF',
            fixedFlag: fixedFlag.LAND_USED_DEMOLITION,
            filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION],
            pick: false,
        },
        // 显示：除清单固定类别是“建筑安装工程费”、“土地使用及拆迁补偿费”、“工程建设其他费用”的以外部分可显示。
        '工程建设其他费用': {
            base: 'GCJSQTFY',
            fixedFlag: fixedFlag.MAINTENANCE_EXPENSES,
            filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.LAND_USED_DEMOLITION, fixedFlag.MAINTENANCE_EXPENSES],
            pick: false,
        },
        // 显示：仅清单固定类别是“施工场地建设费”的可显示。
        '施工场地建设费': {
            isProgressive: true,
            base: 'SGCDJSF',
            fixedFlag: null,
            filter: [fixedFlag.CONSTRUCTION_PLANT_COST],
            pick: true,
        },
        // 显示：仅清单固定类别是“养护工程其他费用”部分可显示。
        '养护单位项目管理费': {
            isProgressive: true,
            base: 'YHDWXMGLF',
            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
            filter: [fixedFlag.MAINTENANCE_EXPENSES],
            pick: true,
        },
        // 显示：仅清单固定类别是“养护工程其他费用”部分可显示。
        '养护单位项目管理费(未单独设置项目部)': {
            isProgressive: true,
            base: 'YHDWXMGLFWSXMB',
            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
            filter: [fixedFlag.MAINTENANCE_EXPENSES],
            pick: true,
        },
        // 显示：仅清单固定类别是“养护工程其他费用”部分可显示。
        '工程监理费': {
            isProgressive: true,
            base: 'GCJLF',
            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
            filter: [fixedFlag.MAINTENANCE_EXPENSES],
            pick: true,
        },
        // 显示：仅清单固定类别是“养护工程其他费用”部分可显示。
        '工程监理费(未实行社会监理)': {
            isProgressive: true,
            base: 'GCJLFWSXSHJL',
            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
            filter: [fixedFlag.MAINTENANCE_EXPENSES],
            pick: true,
        },
        // 显示：只有清单固定类别是“养护工程其他费用”部分可显示。
        '设计文件审查费': {
            isProgressive: true,
            base: 'SJWJSCF',
            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
            filter: [fixedFlag.MAINTENANCE_EXPENSES],
            pick: true,
        },
        // 显示：只有清单固定类别是“养护工程其他费用”部分可显示。
        '工程设计费': {
            isProgressive: true,
            base: 'GCSJF',
            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
            filter: [fixedFlag.MAINTENANCE_EXPENSES],
            pick: true,
        },
        // 显示：仅“价差预备费”可显示
        '价差预备费': {
            base: 'JCYBF',
            fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
            filter: [fixedFlag.SPREAD_BUDGET_FEE],
            pick: true,
        },
    };
    const boqMap = {
        //仅允许用于固定类别是“第100章至700章清单”以外的清单
        '各章清单合计': {
            base: 'GZQDHJ',
            fixedFlag: fixedFlag.ONE_SEVEN_BILLS,
            filter: [fixedFlag.ONE_SEVEN_BILLS],
            pick: false
        },
        //仅允许用于固定类别是“第100章至700章清单”以外的清单
        '专项暂定合计': {
            base: 'ZXZDHJ',
            fixedFlag: null,
            filter: [fixedFlag.ONE_SEVEN_BILLS],
            pick: false
        },
        /*
        *  清单固定行[第100章至700章清单]下的[第100章清单]需要允许清单可使用基数{100章以外合计}
        *  因此{100章以外合计}不设置关联的清单固定行
        * */
        //仅允许用于固定类别为“100章清单”引用
        '100章以外清单合计': {
            base: 'YBZYHQDHJ',
            fixedFlag: null,
            filter: [fixedFlag.ONE_HUNDRED_BILLS],
            pick: true
        }
    };
    baseFigureMap.budget = budgetMap;
    baseFigureMap.boq = boqMap;
}

if (typeof baseFigureTemplate !== 'undefined') {
    const { fixedFlag } = commonConstants;
    baseFigureTemplate.budget = {
        // 养护工程费 算法：取清单固定类别是“建筑安装工程费”的金额。
        YHGCF(tender) {
            return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'common');
        },
        // 养护工程费(不含安全生产费) 算法：取清单固定类别是“建筑安装工程费”的金额，扣除“安全生产费”的金额。
        YHGCFBHSC(tender) {
            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.SAFE_COST], tender, 'common');
        },
        // 养护工程费(不含设备费) 算法：取清单固定类别是“建筑安装工程费”的金额，扣除设备的金额（所有设备类型的人材机型定额）。
        YHGCFBHSB(tender) {
            let baseFee = this['YHGCF'](tender);
            const fixedNode = projectObj.project.mainTree.roots.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_INSTALL_FEE);
            const allSubNodes = [];
            projectObj.project.mainTree.getAllSubNode(fixedNode, allSubNodes);
            const equipmentNodes = allSubNodes.filter(node => node.data.type === rationType.gljRation && node.data.subType === gljType.EQUIPMENT);
            const feeField = 'common';
            const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
            for (const node of equipmentNodes) {
                const data = node.data;
                if (cbTools.isUnDef(data.feesIndex) || _.isEmpty(data.feesIndex) ||
                    cbTools.isUnDef(data.feesIndex[feeField]) || cbTools.isUnDef(data.feesIndex[feeField][subFeeField])) {
                    continue;
                }
                baseFee -= data.feesIndex[feeField][subFeeField];
            }
            return baseFee.toDecimal(decimalObj.bills.totalPrice);
        },
        // 定额养护工程费 取清单固定类别是“建筑安装工程费”的定额建安费。
        DEYHGCF(tender) {
            return cbTools.getBaseFee(fixedFlag.CONSTRUCTION_INSTALL_FEE, tender, 'rationCommon');
        },
        // 定额养护工程费(不含专项费用) 算法：取清单固定类别是“建筑安装工程费”的“定额建安费”，扣除“专项费用”的“定额建安费”。
        DEYHGCFBHZXFY(tender) {
            return cbTools.getFeeWithDeduction(fixedFlag.CONSTRUCTION_INSTALL_FEE, [fixedFlag.SPECIAL_COST], tender, 'rationCommon');
        },
        // 土地使用及拆迁补偿费 算法：取清单固定类别是“土地使用及拆迁补偿费”的金额。
        TDSYJCQBCF(tender) {
            return cbTools.getBaseFee(fixedFlag.LAND_USED_DEMOLITION, tender, 'common');
        },
        // 工程建设其他费用 算法：取清单固定类别是“养护工程其他费用”的金额。
        GCJSQTFY(tender) {
            return cbTools.getBaseFee(fixedFlag.MAINTENANCE_EXPENSES, tender, 'common');
        },
        // 施工场地建设费 算法：以{定额养护工程费(不含专项费用)}为基数，采用累进办法计算。
        SGCDJSF(tender) {
            const baseFee = this['DEYHGCFBHZXFY'](tender);
            if (!tender) {
                calcBase.baseProgressiveFee = baseFee;
            }
            return calculateUtil.getProgressiveFee(baseFee, '施工场地建设费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
        },
        // 养护单位项目管理费 算法：以{定额养护工程费}为基数，采用累进办法计算。
        YHDWXMGLF(tender) {
            const baseFee = this['DEYHGCF'](tender);
            if (!tender) {
                calcBase.baseProgressiveFee = baseFee;
            }
            return calculateUtil.getProgressiveFee(baseFee, '养护单位项目管理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
        },
        // 养护单位项目管理费(未单独设置项目部) 算法：以{定额养护工程费}为基数，采用累进办法计算。
        YHDWXMGLFWSXMB(tender) {
            const baseFee = this['DEYHGCF'](tender);
            if (!tender) {
                calcBase.baseProgressiveFee = baseFee;
            }
            return calculateUtil.getProgressiveFee(baseFee, '养护单位项目管理费(未单独设置项目部)', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
        },
        // 工程监理费 算法：以{定额养护工程费}为基数，采用累进办法计算。
        GCJLF(tender) {
            const baseFee = this['DEYHGCF'](tender);
            if (!tender) {
                calcBase.baseProgressiveFee = baseFee;
            }
            return calculateUtil.getProgressiveFee(baseFee, '工程监理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
        },
        // 工程监理费(未实行社会监理) 算法：以{定额养护工程费}为基数，采用累进办法计算。
        GCJLFWSXSHJL(tender) {
            const baseFee = this['DEYHGCF'](tender);
            if (!tender) {
                calcBase.baseProgressiveFee = baseFee;
            }
            return calculateUtil.getProgressiveFee(baseFee, '工程监理费(未实行社会监理)', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
        },
        // 设计文件审查费 算法：以{定额养护工程费}为基数，采用累进办法计算。
        SJWJSCF(tender) {
            const baseFee = this['DEYHGCF'](tender);
            if (!tender) {
                calcBase.baseProgressiveFee = baseFee;
            }
            return calculateUtil.getProgressiveFee(baseFee, '设计文件审查费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
        },
        // 工程设计费 算法：以{定额养护工程费}为基数，采用累进办法计算。
        GCSJF(tender) {
            const baseFee = this['DEYHGCF'](tender);
            if (!tender) {
                calcBase.baseProgressiveFee = baseFee;
            }
            return calculateUtil.getProgressiveFee(baseFee, '工程设计费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
        },
        /*  价差预备费 算法：以建筑安装工程费为基数，按设计文件编制年始至养护项目工程竣工年终的年数和年工程造价增涨率计算。
            价差预备费 P * [(1+i)^(n-1) -1]
            P——建筑安装工程费总额（元）；
            i——年工程造价增涨率（%）；
            n——设计文件编制年至养护项目开工年+养护项目建设期限（年）。
        */
        JCYBF(tender) {
            //建筑安装工程费作为基数
            const installFee = this['YHGCF'](tender);
            //年造价增涨
            const costGrowthRate = calcBase.project.property.costGrowthRate
                ? calcBase.project.property.costGrowthRate
                : 0;
            //增涨计费年限
            const growthPeriod = projectObj.project.property.growthPeriod
                ? calcBase.project.property.growthPeriod
                : 0;
            //= P * [(1+i)^(n-1) -1]
            return (installFee * (Math.pow(1 + costGrowthRate, growthPeriod - 1) - 1)).toDecimal(decimalObj.bills.totalPrice);
        }

    };

    baseFigureTemplate.boq = {
        //{各章清单合计}
        // 取清单固定类别是“第100章至700章清单”的金额
        'GZQDHJ': function (tender) {
            return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, 'common');
        },
        //{专项暂定合计}
        // 第100章至700章清单行的暂估合价
        'ZXZDHJ': function (tender) {
            return cbTools.getBaseFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, tender, 'estimate');
        },
        //{100章以外清单合计}
        // 取清单固定清单[第100章至700章清单]的金额，但扣除清单100章下的金额。
        // 如果是固定清单[第100章至700章清单]下100章以外清单引用此基数，要排除自身(目前只允许100章的清单使用，所以暂时不需要此判断)
        'YBZYHQDHJ': function (tender) {
            let oneToSeven = cbTools.findNodeByFlag(fixedFlag.ONE_SEVEN_BILLS);
            if (!oneToSeven) {
                return 0;
            }
            //100-700章固定节点的所有子节点
            let allChildren = [];
            function getChildren(nodes) {
                allChildren = allChildren.concat(nodes);
                for (let node of nodes) {
                    if (node.children.length > 0) {
                        getChildren(node.children);
                    }
                }
            }
            getChildren(oneToSeven.children);
            //扣除的节点：100章的节点[100-200)
            let deductNodes = allChildren.filter(cbTools.withingOneHundred);
            //计算金额
            let fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee';
            return projectObj.project.calcProgram.getTotalFee([oneToSeven], deductNodes, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
        }
    };
}

if (typeof projectObj !== 'undefined') {
    projectObj.isInsertEquipmentVisable = function (selected) {
        if (projectObj.project.property.valuationType !== 'ration') {//预算项目中，右键“插入设备”，仅在第一部分中显示。
            return projectObj.project.Bills.isConstructionInstall(selected);
        }
        return true;   //湖南不管是预算或者工程量清单，都显示   
    }
}

//湖南工地转移费率值修改特殊处理
if (typeof feeRateObject !== 'undefined') {
    feeRateObject.feeRateSpecialHandle = function (subRate, value) {
        let result = {};
        if (subRate.name == "工地转移(km)" && value && value < 50) {//工地转移50km以内按50km算
            result.valueKey = "50";
            result.value = scMathUtil.roundForObj(value, getDecimal("feeRate"));//设置显示的节点值
        }
        return result;
    }
}

if (typeof electrovalenceObj !== 'undefined') {
    electrovalenceObj.options = [
        { code: "3005003", name: "电网电", specs: "", unit: "kW·h", type: "201" },
        { code: "8017001", name: "15kW以内柴油发电机组", specs: "12GF1", unit: "台班", type: "301" },
        { code: "8017002", name: "30kW以内柴油发电机组", specs: "30GFY-2", unit: "台班", type: "301" },
        { code: "8017003", name: "50kW以内柴油发电机组", specs: "50GFY-2", unit: "台班", type: "301" }
    ]
}

// 在新建分段的时候需要隐藏养护类别和费用标准
if (typeof $ !== 'undefined') { // 后端也有引用这个文件，后端引用时$没有定义会报错
    $(document).ready(function () {
        $('#tender-engineering-group').hide();
        $('#tender-feeStandard-group').hide();
    });
}

// CommonJS module
if (typeof module !== 'undefined' && !module.nodeType) { // 防止module是前端的一个html标签
    module.exports = {
        progression,
        deficiency
    };
}


