2016-10-07 5 views
1

従業員の給料を生成しようとしました。従業員は、半日休暇(0.5)をとっているが、その自動モジュールhr_payroll.pyに既にあるコードから1Payslip odooで間違った休暇を取る

として満たされた給与明細を計算しながら、それは次のよう

def get_worked_day_lines(self, cr, uid, contract_ids, date_from, date_to, context=None): 
     """ 
     @param contract_ids: list of contract id 
     @return: returns a list of dict containing the input that should be applied for the given contract between date_from and date_to 
     """ 
     def was_on_leave(employee_id, datetime_day, context=None): 
      res = False 
      day = datetime_day.strftime("%Y-%m-%d") 
      holiday_ids = self.pool.get('hr.holidays').search(cr, uid, [('state','=','validate'),('employee_id','=',employee_id),('type','=','remove'),('date_from','<=',day),('date_to','>=',day)]) 
      if holiday_ids: 
       res = self.pool.get('hr.holidays').browse(cr, uid, holiday_ids, context=context)[0].holiday_status_id.name 
      return res 

     res = [] 
     for contract in self.pool.get('hr.contract').browse(cr, uid, contract_ids, context=context): 
      if not contract.working_hours: 
       #fill only if the contract as a working schedule linked 
       continue 
      attendances = { 
       'name': _("Normal Working Days paid at 100%"), 
       'sequence': 1, 
       'code': 'WORK100', 
       'number_of_days': 0.0, 
       'number_of_hours': 0.0, 
       'contract_id': contract.id, 
      } 
      leaves = {} 
      day_from = datetime.strptime(date_from,"%Y-%m-%d") 
      day_to = datetime.strptime(date_to,"%Y-%m-%d") 
      nb_of_days = (day_to - day_from).days + 1 
      for day in range(0, nb_of_days): 
       working_hours_on_day = self.pool.get('resource.calendar').working_hours_on_day(cr, uid, contract.working_hours, day_from + timedelta(days=day), context) 
       if working_hours_on_day: 
        #the employee had to work 
        leave_type = was_on_leave(contract.employee_id.id, day_from + timedelta(days=day), context=context) 
        if leave_type: 
         #if he was on leave, fill the leaves dict 
         if leave_type in leaves: 
          leaves[leave_type]['number_of_days'] += 1.0 
          leaves[leave_type]['number_of_hours'] += working_hours_on_day 
         else: 
          leaves[leave_type] = { 
           'name': leave_type, 
           'sequence': 5, 
           'code': leave_type, 
           'number_of_days': 1.0, 
           'number_of_hours': working_hours_on_day, 
           'contract_id': contract.id, 
          } 
        else: 
         #add the input vals to tmp (increment if existing) 
         attendances['number_of_days'] += 1.0 
         attendances['number_of_hours'] += working_hours_on_day 
      leaves = [value for key,value in leaves.items()] 
      res += [attendances] + leaves 
     return res 

Iのように見えます問題がどこにあるのか不明です。これに関する提案はありますか?

+1

問題は、あなたのコードが一日のうちに処理されることは絶対にありません。それは、可能な限り一日が可能であるというアイデアを基にして作られています。半日を処理するためには、深刻な再作業が必要になり、いずれの場合でも関数の署名が変更されます。 –

+0

Anthony Rossi、はい、私は、Leaveレコードにある配分日を取り出せることを理解しました。 –

答えて

2

序文:odooを使用していないため、テストする残りのコードがないため、これを確認していません。

あなたは間違いなく、ここで問題があります:あなたは葉や出席を参照してあるものは、彼らが唯一のあなたが合格の日のどのような割合に基づいて計算されていない、完全な日にインクリメントされているフロートしている間

if leave_type in leaves: 
    leaves[leave_type]['number_of_days'] += 1.0 
    leaves[leave_type]['number_of_hours'] += working_hours_on_day 
else: 
    leaves[leave_type] = { 
     'name': leave_type, 
     'sequence': 5, 
     'code': leave_type, 
     'number_of_days': 1.0, 
     'number_of_hours': working_hours_on_day, 
     'contract_id': contract.id, 
    } 
else: 
    #add the input vals to tmp (increment if existing) 
    attendances['number_of_days'] += 1.0 
    attendances['number_of_hours'] += working_hours_on_day 

は、参照してください。もちろん、私が挿入ダミー変数を定義し、どこかで計算する必要があるだろう

leaves[leave_type]['number_of_days'] += time_off/hours_per_workday # the 1.0 might make sense here depending on if you count time off as an attendance 
leaves[leave_type]['number_of_hours'] += time_off 

attendances['number_of_days'] += 1.0 - time_off/hours_per_workday 
attendances['number_of_hours'] += working_hours_on_day - time_off 

:あなたは次のようにこれを変更する必要があります。

また、Anthony Rossi氏のコメントによれば、一般的に数時間ではなく数日で作業します。例:

day_from = datetime.strptime(date_from,"%Y-%m-%d") 
day_to = datetime.strptime(date_to,"%Y-%m-%d") 

注意どのようにYY/MM/DDと時間がありませんか。

関連する問題