上传的图像用于项目: 'CST技术支持'
  1. CST技术支持
  2. SLAL2-2308

【和黄药业】薪资函数设计

XMLWord打印

    • Icon: 技术问题 技术问题
    • 解决结果: 完成
    • Icon: High High
    • 202104
    • H-和黄药业-Y2019081
    • hryl-uat.shpl
    • 基础通用功能
    • 隐藏

      预计算函数(Pre_F_GetSocialSecurityFundRuleData):

      social_security_parameters = preFuncParameterDict.get('F_GetSocialSecurityFundRuleData', [])
      value_dict = {}
      if social_security_parameters:
          for parameter in social_security_parameters:
              parameters = eval(parameter['func_args'])
              for par in parameters:
                  if isinstance(par, tuple):
                      par = list(par)
                      value_dict.setdefault(tuple([eval(i) for i in par]), None)
                  else:
                      value_dict.setdefault((eval(par),), None)
      result = []
      res = {}
      pay_month = payslip_run_record.payroll_period.name
      current_period = datetime.datetime.strptime(str(pay_month), '%Y%m')
      
      for args in value_dict.keys():
          if len(args) == 0:
              continue
          else:
              rule_code = args[0] # 规则编码
              
          rule_ = env['fund.rule'].search([('code', '=', rule_code),('active', '=', True)])
          if rule_ and rule_.version_ids:
              version_ids = sorted(rule_.version_ids, key=lambda r: r.effective_period, reverse=True)
              for version in version_ids:
                  if current_period >= datetime.datetime.strptime(version.effective_period, '%Y-%m'):
                      if version.rule_ids:
                          for rule_id in version.rule_ids:
                              res[rule_id.insurance_code] = {
                                  "max_base":rule_id.max_base,
                                  "max_base_company": rule_id.max_base_company,
                                  "min_base": rule_id.min_base,
                                  "min_base_company": rule_id.min_base_company,
                                  "personal_ratio": rule_id.personal_ratio,
                                  "company_ratio": rule_id.company_ratio}
              
                              result.append(res)
                      break
                  
                  else:
                      continue
      

      普通函数(F_GetSocialSecurityFundRuleData):

      def F_GetSocialSecurityFundRuleData(rule_code, insurance, item):
          result = 0
          res_list = global_dict['Pre_F_GetSocialSecurityFundRuleData']
          for res_ in res_list:
              res_data = res_.get(insurance)
              if res_data:
                  result = res_data.get(item, 0)
          return result
      

      公式调用示例:
      result= F_GetSocialSecurityFundRuleData("规则编码", "险种编码","字段名")
      比如:result= F_GetSocialSecurityFundRuleData("SY001", "SB001","max_base");获取社保/公积金规则编码为SY001的算薪生效期间的养老金(SB001)险种的个人基数上限

      显示
      预计算函数(Pre_F_GetSocialSecurityFundRuleData): social_security_parameters = preFuncParameterDict.get( 'F_GetSocialSecurityFundRuleData' , []) value_dict = {} if social_security_parameters: for parameter in social_security_parameters: parameters = eval(parameter[ 'func_args' ]) for par in parameters: if isinstance(par, tuple): par = list(par) value_dict.setdefault(tuple([eval(i) for i in par]), None) else : value_dict.setdefault((eval(par),), None) result = [] res = {} pay_month = payslip_run_record.payroll_period.name current_period = datetime.datetime.strptime(str(pay_month), '%Y%m' ) for args in value_dict.keys(): if len(args) == 0: continue else : rule_code = args[0] # 规则编码 rule_ = env[ 'fund.rule' ].search([( 'code' , '=' , rule_code),( 'active' , '=' , True)]) if rule_ and rule_.version_ids: version_ids = sorted(rule_.version_ids, key=lambda r: r.effective_period, reverse=True) for version in version_ids: if current_period >= datetime.datetime.strptime(version.effective_period, '%Y-%m' ): if version.rule_ids: for rule_id in version.rule_ids: res[rule_id.insurance_code] = { "max_base" :rule_id.max_base, "max_base_company" : rule_id.max_base_company, "min_base" : rule_id.min_base, "min_base_company" : rule_id.min_base_company, "personal_ratio" : rule_id.personal_ratio, "company_ratio" : rule_id.company_ratio} result.append(res) break else : continue 普通函数(F_GetSocialSecurityFundRuleData): def F_GetSocialSecurityFundRuleData(rule_code, insurance, item): result = 0 res_list = global_dict[ 'Pre_F_GetSocialSecurityFundRuleData' ] for res_ in res_list: res_data = res_.get(insurance) if res_data: result = res_data.get(item, 0) return result 公式调用示例: result= F_GetSocialSecurityFundRuleData("规则编码", "险种编码","字段名") 比如:result= F_GetSocialSecurityFundRuleData("SY001", "SB001","max_base");获取社保/公积金规则编码为SY001的算薪生效期间的养老金(SB001)险种的个人基数上限

      设计函数获取指定社保/公积金规则中的参数
      因为社保规则时间轴,所以函数设计时首先要根据当前薪资月份,查找符合条件的规则,进而查找规则中各险种的参数。
      如上海社保规则 有2个版本的规则,生效日分别为2019-1 和2020-1,
      当前期间是2020-3 ,则函数查找时取的是 2020-1 这个版本中的数据

      建议函数参数如下:
      Function_name (‘rulecode’,'code',type,'item')
      rulecode:指的是 社保或公积金规则的编码
      code:指的险种的Code
      type:数字参数1 获取社保规则,2 获取公积金规则
      item:取对应参数,参数如下:
      max_base 个人基数上限
      max_base_company 企业基数上限
      min_base 个人基数下限
      min_base_company 企业基数下限
      personal_ratio 个人比例
      company_ratio 企业比例

      如未找到相应参数返回0

        1. image.png
          image.png
          32 kB
        2. image.png
          image.png
          24 kB
        3. image.png
          image.png
          30 kB

            chengdd 程丹丹
            jason.zhou 周子深
            表决:
            0 为这个问题表决

              创建日期:
              已更新:
              已解决: