> ## Documentation Index
> Fetch the complete documentation index at: https://help.dingtalk.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Pra-hitung durasi

> Panggil API DingTalk untuk memprakirakan durasi lembur, perjalanan dinas, dan cuti karyawan berdasarkan penjadwalan shift absensi, per hari kalender atau hari kerja.

Panggil API ini untuk menghitung di awal durasi lembur, perjalanan dinas, dan cuti karyawan berdasarkan penjadwalan shift di sistem absensi.

## Deskripsi panggilan API

Contoh: seorang karyawan dijadwalkan bekerja pada 2 November (jam masuk 09:00, jam pulang 18:00) dan libur pada 3 November.

Karyawan tersebut berencana mengambil cuti dari pukul 09:00:00 pada 2 November hingga pukul 18:00:00 pada 3 November. Panggil API ini untuk mendapatkan perkiraan durasi cuti dalam rentang tersebut. Hasilnya hanya satu hari.

* Jika karyawan tidak termasuk dalam grup absensi atau tidak memiliki jadwal shift pada tanggal cuti, durasi cuti dihitung berdasarkan waktu absensi default.
* Konfigurasikan waktu absensi default di **DingTalk seluler > Workbench > Absensi > Pengaturan > Pengaturan Lainnya > Persetujuan cuti dan absensi > Waktu Absensi Default**. Contoh:

  Seorang karyawan dijadwalkan bekerja pada 2 November (jam masuk 09:00, jam pulang 18:00) dan tidak memiliki jadwal shift pada 3 November. Shift default adalah 08:30–17:30. Karyawan tersebut berencana mengambil cuti dari pukul 09:00:00 pada 2 November hingga pukul 18:00:00 pada 3 November. Panggil API ini untuk mendapatkan perkiraan durasi cuti dalam rentang tersebut. Hasilnya 2 hari.

## Permintaan

### Informasi dasar

| Bidang | Nilai |
| - | - |
| URL HTTP | [https://api.dingtalk.io/v1.0/attendance/approvals/durations/calculate](https://api.dingtalk.io/v1.0/attendance/approvals/durations/calculate) |
| Metode HTTP | POST |
| Tipe aplikasi yang didukung | appType-Aplikasi internal　appType-Aplikasi perusahaan pihak ketiga |
| Izin yang diperlukan | permission-qyapi\_attendance\_group\_read-Izin kueri grup absensi |

### Header permintaan

| Nama | Tipe | Wajib | Deskripsi |
| - | - | - | - |
| x-acs-dingtalk-access-token | String | Ya | Kredensial akses untuk memanggil API ini. Dapatkan dengan cara berikut:   - Aplikasi internal: panggil API [Mendapatkan access token aplikasi internal](https://help.dingtalk.io/id/open/development/obtain-the-access-token-of-an-internal-app.md). - Aplikasi perusahaan pihak ketiga: panggil API untuk mendapatkan access token organisasi yang telah memberikan otorisasi kepada Aplikasi pihak ketiga. |

### Parameter kueri

| Nama | Tipe | Wajib | Deskripsi |
| - | - | - | - |
| userId | String | Tidak | userId pengguna. |

### Isi permintaan

| Nama | Tipe | Wajib | Deskripsi |
| - | - | - | - |
| bizType | Long | Tidak | Tipe formulir persetujuan:   - 1: Lembur - 2: Perjalanan dinas - 3: Cuti |
| fromTime | String | Tidak | Waktu mulai. Waktu mulai tidak boleh lebih dari 31 hari sebelum waktu saat ini. Format yang didukung:   - 2019-08-15 - 2019-08-15 AM - 2019-08-15 12:43 |
| toTime | String | Tidak | Waktu selesai.   - Jika biz\_type bernilai 1, selisih waktu selesai dengan waktu mulai tidak boleh lebih dari 1 hari. - Jika biz\_type bernilai 2 atau 3, jumlah hari antara waktu mulai dan waktu selesai tidak boleh lebih dari 31.   Format yang didukung:   - 2019-08-15 - 2019-08-15 AM - 2019-08-15 12:43 |
| durationUnit | String | Tidak | Satuan durasi. Nilai yang didukung:   - day - halfDay - hour: Jika biz\_type bernilai 1, hanya hour yang didukung.   Format waktu harus sesuai dengan satuan durasi:   - 2019-08-15 sesuai dengan day - 2019-08-15 AM sesuai dengan halfDay - 2019-08-15 12:43 sesuai dengan hour |
| calculateModel | Long | Tidak | Metode perhitungan:   - 0: Berdasarkan hari kalender - 1: Berdasarkan hari kerja |
| leaveCode | String | Tidak | Pengidentifikasi unik aturan cuti. Opsional. Hanya berlaku jika bizType=3 (cuti). Jika diisi, durasi dibulatkan sesuai aturan pembulatan yang dikonfigurasi untuk jenis cuti tersebut. |

### Contoh permintaan

HTTP

```http theme={"theme":{"light":"github-light","dark":"github-dark"}}
POST /v1.0/attendance/approvals/durations/calculate?userId=manager123 HTTP/1.1
Host:api.dingtalk.io
x-acs-dingtalk-access-token:234sad32qr4q32xxx
Content-Type:application/json

{
  "bizType" : 3,
  "fromTime" : "2019-08-15",
  "toTime" : "2019-08-15",
  "durationUnit" : "day",
  "calculateModel" : 1,
  "leaveCode" : "e2dsad-34dfa-2vas23da"
}
```

Java

```java theme={"theme":{"light":"github-light","dark":"github-dark"}}
// File ini dibuat secara otomatis, jangan diedit. Terima kasih.
package com.aliyun.sample;

import com.aliyun.tea.*;

public class Sample {

    /**
     * Inisialisasi Client akun dengan Token
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.dingtalkattendance_1_0.Client createClient() throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.protocol = "https";
        config.regionId = "central";
        return new com.aliyun.dingtalkattendance_1_0.Client(config);
    }

    public static void main(String[] args_) throws Exception {
        java.util.List<String> args = java.util.Arrays.asList(args_);
        com.aliyun.dingtalkattendance_1_0.Client client = Sample.createClient();
        com.aliyun.dingtalkattendance_1_0.models.CalculateDurationHeaders calculateDurationHeaders = new com.aliyun.dingtalkattendance_1_0.models.CalculateDurationHeaders();
        calculateDurationHeaders.xAcsDingtalkAccessToken = "<access token Anda>";
        com.aliyun.dingtalkattendance_1_0.models.CalculateDurationRequest calculateDurationRequest = new com.aliyun.dingtalkattendance_1_0.models.CalculateDurationRequest()
                .setUserId("manager123")
                .setBizType(3L)
                .setFromTime("2019-08-15")
                .setToTime("2019-08-15")
                .setDurationUnit("day")
                .setCalculateModel(1L)
                .setLeaveCode("e2dsad-34dfa-2vas23da");
        try {
            client.calculateDurationWithOptions(calculateDurationRequest, calculateDurationHeaders, new com.aliyun.teautil.models.RuntimeOptions());
        } catch (TeaException err) {
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err berisi atribut code dan message yang membantu menemukan sumber masalah
            }

        } catch (Exception _err) {
            TeaException err = new TeaException(_err.getMessage(), _err);
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err berisi atribut code dan message yang membantu menemukan sumber masalah
            }

        }        
    }
}
```

Python

```python theme={"theme":{"light":"github-light","dark":"github-dark"}}
# -*- coding: utf-8 -*-
# File ini dibuat secara otomatis, jangan diedit. Terima kasih.
import os
import sys

from typing import List

from alibabacloud_dingtalk.attendance_1_0.client import Client as dingtalkattendance_1_0Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dingtalk.attendance_1_0 import models as dingtalkattendance__1__0_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient

class Sample:
    def __init__(self):
        pass

    @staticmethod
    def create_client() -> dingtalkattendance_1_0Client:
        """
        Inisialisasi Client akun dengan Token
        @return: Client
        @throws Exception
        """
        config = open_api_models.Config()
        config.protocol = 'https'
        config.region_id = 'central'
        return dingtalkattendance_1_0Client(config)

    @staticmethod
    def main(
        args: List[str],
    ) -> None:
        client = Sample.create_client()
        calculate_duration_headers = dingtalkattendance__1__0_models.CalculateDurationHeaders()
        calculate_duration_headers.x_acs_dingtalk_access_token = '<access token Anda>'
        calculate_duration_request = dingtalkattendance__1__0_models.CalculateDurationRequest(
            user_id='manager123',
            biz_type=3,
            from_time='2019-08-15',
            to_time='2019-08-15',
            duration_unit='day',
            calculate_model=1,
            leave_code='e2dsad-34dfa-2vas23da'
        )
        try:
            client.calculate_duration_with_options(calculate_duration_request, calculate_duration_headers, util_models.RuntimeOptions())
        except Exception as err:
            if not UtilClient.empty(err.code) and not UtilClient.empty(err.message):
                # err berisi atribut code dan message yang membantu menemukan sumber masalah
                pass

    @staticmethod
    async def main_async(
        args: List[str],
    ) -> None:
        client = Sample.create_client()
        calculate_duration_headers = dingtalkattendance__1__0_models.CalculateDurationHeaders()
        calculate_duration_headers.x_acs_dingtalk_access_token = '<access token Anda>'
        calculate_duration_request = dingtalkattendance__1__0_models.CalculateDurationRequest(
            user_id='manager123',
            biz_type=3,
            from_time='2019-08-15',
            to_time='2019-08-15',
            duration_unit='day',
            calculate_model=1,
            leave_code='e2dsad-34dfa-2vas23da'
        )
        try:
            await client.calculate_duration_with_options_async(calculate_duration_request, calculate_duration_headers, util_models.RuntimeOptions())
        except Exception as err:
            if not UtilClient.empty(err.code) and not UtilClient.empty(err.message):
                # err berisi atribut code dan message yang membantu menemukan sumber masalah
                pass

if __name__ == '__main__':
    Sample.main(sys.argv[1:])
```

PHP

```php theme={"theme":{"light":"github-light","dark":"github-dark"}}
<?php

// File ini dibuat secara otomatis, jangan diedit. Terima kasih.
namespace AlibabaCloud\SDK\Sample;

use AlibabaCloud\SDK\Dingtalk\Vattendance_1_0\Dingtalk;
use \Exception;
use AlibabaCloud\Tea\Exception\TeaError;
use AlibabaCloud\Tea\Utils\Utils;

use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Dingtalk\Vattendance_1_0\Models\CalculateDurationHeaders;
use AlibabaCloud\SDK\Dingtalk\Vattendance_1_0\Models\CalculateDurationRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;

class Sample {

    /**
     * Inisialisasi Client akun dengan Token
     * @return Dingtalk Client
     */
    public static function createClient(){
        $config = new Config([]);
        $config->protocol = "https";
        $config->regionId = "central";
        return new Dingtalk($config);
    }

    /**
     * @param string[] $args
     * @return void
     */
    public static function main($args){
        $client = self::createClient();
        $calculateDurationHeaders = new CalculateDurationHeaders([]);
        $calculateDurationHeaders->xAcsDingtalkAccessToken = "<access token Anda>";
        $calculateDurationRequest = new CalculateDurationRequest([
            "userId" => "manager123",
            "bizType" => 3,
            "fromTime" => "2019-08-15",
            "toTime" => "2019-08-15",
            "durationUnit" => "day",
            "calculateModel" => 1,
            "leaveCode" => "e2dsad-34dfa-2vas23da"
        ]);
        try {
            $client->calculateDurationWithOptions($calculateDurationRequest, $calculateDurationHeaders, new RuntimeOptions([]));
        }
        catch (Exception $err) {
            if (!($err instanceof TeaError)) {
                $err = new TeaError([], $err->getMessage(), $err->getCode(), $err);
            }
            if (!Utils::empty_($err->code) && !Utils::empty_($err->message)) {
                // err berisi atribut code dan message yang membantu menemukan sumber masalah
            }
        }
    }
}
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
    require_once $path;
}
Sample::main(array_slice($argv, 1));
```

Go

```go theme={"theme":{"light":"github-light","dark":"github-dark"}}
// File ini dibuat secara otomatis, jangan diedit. Terima kasih.
package main

import (
  "os"
  util  "github.com/alibabacloud-go/tea-utils/v2/service"
  dingtalkattendance_1_0  "github.com/alibabacloud-go/dingtalk/attendance_1_0"
  openapi  "github.com/alibabacloud-go/darabonba-openapi/v2/client"
  "github.com/alibabacloud-go/tea/tea"
)

/**
 * Inisialisasi Client akun dengan Token
 * @return Client
 * @throws Exception
 */
func CreateClient () (_result *dingtalkattendance_1_0.Client, _err error) {
  config := &openapi.Config{}
  config.Protocol = tea.String("https")
  config.RegionId = tea.String("central")
  _result = &dingtalkattendance_1_0.Client{}
  _result, _err = dingtalkattendance_1_0.NewClient(config)
  return _result, _err
}

func _main (args []*string) (_err error) {
  client, _err := CreateClient()
  if _err != nil {
    return _err
  }

  calculateDurationHeaders := &dingtalkattendance_1_0.CalculateDurationHeaders{}
  calculateDurationHeaders.XAcsDingtalkAccessToken = tea.String("<access token Anda>")
  calculateDurationRequest := &dingtalkattendance_1_0.CalculateDurationRequest{
    UserId: tea.String("manager123"),
    BizType: tea.Int64(3),
    FromTime: tea.String("2019-08-15"),
    ToTime: tea.String("2019-08-15"),
    DurationUnit: tea.String("day"),
    CalculateModel: tea.Int64(1),
    LeaveCode: tea.String("e2dsad-34dfa-2vas23da"),
  }
  tryErr := func()(_e error) {
    defer func() {
      if r := tea.Recover(recover()); r != nil {
        _e = r
      }
    }()
    _, _err = client.CalculateDurationWithOptions(calculateDurationRequest, calculateDurationHeaders, &util.RuntimeOptions{})
    if _err != nil {
      return _err
    }

    return nil
  }()

  if tryErr != nil {
    var err = &tea.SDKError{}
    if _t, ok := tryErr.(*tea.SDKError); ok {
      err = _t
    } else {
      err.Message = tea.String(tryErr.Error())
    }
    if !tea.BoolValue(util.Empty(err.Code)) && !tea.BoolValue(util.Empty(err.Message)) {
      // err berisi atribut code dan message yang membantu menemukan sumber masalah
    }

  }
  return _err
}

func main() {
  err := _main(tea.StringSlice(os.Args[1:]))
  if err != nil {
    panic(err)
  }
}
```

Node.js

```typescript theme={"theme":{"light":"github-light","dark":"github-dark"}}
// File ini dibuat secara otomatis, jangan diedit
import Util, * as $Util from '@alicloud/tea-util';
import dingtalkattendance_1_0, * as $dingtalkattendance_1_0 from '@alicloud/dingtalk/attendance_1_0';
import OpenApi, * as $OpenApi from '@alicloud/openapi-client';
import * as $tea from '@alicloud/tea-typescript';

export default class Client {

  /**
   * Inisialisasi Client akun dengan Token
   * @return Client
   * @throws Exception
   */
  static createClient(): dingtalkattendance_1_0 {
    let config = new $OpenApi.Config({ });
    config.protocol = "https";
    config.regionId = "central";
    return new dingtalkattendance_1_0(config);
  }

  static async main(args: string[]): Promise<void> {
    let client = Client.createClient();
    let calculateDurationHeaders = new $dingtalkattendance_1_0.CalculateDurationHeaders({ });
    calculateDurationHeaders.xAcsDingtalkAccessToken = "<access token Anda>";
    let calculateDurationRequest = new $dingtalkattendance_1_0.CalculateDurationRequest({
      userId: "manager123",
      bizType: 3,
      fromTime: "2019-08-15",
      toTime: "2019-08-15",
      durationUnit: "day",
      calculateModel: 1,
      leaveCode: "e2dsad-34dfa-2vas23da",
    });
    try {
      await client.calculateDurationWithOptions(calculateDurationRequest, calculateDurationHeaders, new $Util.RuntimeOptions({ }));
    } catch (err) {
      if (!Util.empty(err.code) && !Util.empty(err.message)) {
        // err berisi atribut code dan message yang membantu menemukan sumber masalah
      }

    }    
  }

}

Client.main(process.argv.slice(2));
```

C#

```csharp theme={"theme":{"light":"github-light","dark":"github-dark"}}
// File ini dibuat secara otomatis, jangan diedit. Terima kasih.

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

using Tea;
using Tea.Utils;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample 
    {

        /**
         * Inisialisasi Client akun dengan Token
         * @return Client
         * @throws Exception
         */
        public static AlibabaCloud.SDK.Dingtalkattendance_1_0.Client CreateClient()
        {
            AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();
            config.Protocol = "https";
            config.RegionId = "central";
            return new AlibabaCloud.SDK.Dingtalkattendance_1_0.Client(config);
        }

        public static void Main(string[] args)
        {
            AlibabaCloud.SDK.Dingtalkattendance_1_0.Client client = CreateClient();
            AlibabaCloud.SDK.Dingtalkattendance_1_0.Models.CalculateDurationHeaders calculateDurationHeaders = new AlibabaCloud.SDK.Dingtalkattendance_1_0.Models.CalculateDurationHeaders();
            calculateDurationHeaders.XAcsDingtalkAccessToken = "<access token Anda>";
            AlibabaCloud.SDK.Dingtalkattendance_1_0.Models.CalculateDurationRequest calculateDurationRequest = new AlibabaCloud.SDK.Dingtalkattendance_1_0.Models.CalculateDurationRequest
            {
                UserId = "manager123",
                BizType = 3,
                FromTime = "2019-08-15",
                ToTime = "2019-08-15",
                DurationUnit = "day",
                CalculateModel = 1,
                LeaveCode = "e2dsad-34dfa-2vas23da",
            };
            try
            {
                client.CalculateDurationWithOptions(calculateDurationRequest, calculateDurationHeaders, new AlibabaCloud.TeaUtil.Models.RuntimeOptions());
            }
            catch (TeaException err)
            {
                if (!AlibabaCloud.TeaUtil.Common.Empty(err.Code) && !AlibabaCloud.TeaUtil.Common.Empty(err.Message))
                {
                    // err berisi atribut code dan message yang membantu menemukan sumber masalah
                }
            }
            catch (Exception _err)
            {
                TeaException err = new TeaException(new Dictionary<string, object>
                {
                    { "message", _err.Message }
                });
                if (!AlibabaCloud.TeaUtil.Common.Empty(err.Code) && !AlibabaCloud.TeaUtil.Common.Empty(err.Message))
                {
                    // err berisi atribut code dan message yang membantu menemukan sumber masalah
                }
            }
        }

    }
}
```

## Respons

### Isi respons

| Nama | Tipe | Deskripsi |
| - | - | - |
| result | Object | Hasil yang dikembalikan. |
| duration | double | Total durasi. Satuan bidang ini sama dengan satuan yang dikonfigurasi untuk formulir persetujuan terkait di organisasi Anda. |
| durationDetail | Array | Detail. |
| date | String | Tanggal. |
| duration | double | Durasi harian. Satuan bidang ini sama dengan satuan yang dikonfigurasi untuk formulir persetujuan terkait di organisasi Anda. |
| success | Boolean | Menunjukkan apakah panggilan API berhasil. |

### Contoh isi respons

```text theme={"theme":{"light":"github-light","dark":"github-dark"}}
HTTP/1.1 200 OK
Content-Type:application/json

{
  "result" : {
    "duration" : 2,
    "durationDetail" : [ {
      "date" : "2019-08-15",
      "duration" : 1.6
    } ]
  },
  "success" : true
}
```

### Kode error

Jika panggilan API mengembalikan error, cari solusinya di dokumen [Kode error global](https://help.dingtalk.io/id/open/development/server-api-error-codes-1.md) berdasarkan pesan error.

| HttpCode | Kode error | Pesan error | Deskripsi |
| - | - | - | - |
| 400 | illegalCalculateType | Mode perhitungan durasi tidak valid | Mode perhitungan durasi tidak valid |
| 400 | illegalDurationUnit | Satuan durasi tidak valid | Satuan durasi tidak valid |
| 400 | illegalApproveType | Tipe persetujuan tidak valid | Tipe persetujuan tidak valid |
| 400 | invalidRequestParams | Error parameter (periksa parameter sesuai dokumentasi) | Error parameter (periksa parameter sesuai dokumentasi) |
| 400 | illegalOvertimeDurationUnit | Satuan durasi lembur tidak valid (lembur hanya mendukung satuan jam) | Satuan durasi lembur tidak valid (lembur hanya mendukung satuan jam) |
| 400 | illegalDateTypeForHalfDay | Format waktu mulai/selesai tidak valid saat DURATION\_UNIT bernilai setengah hari | Format waktu mulai/selesai tidak valid saat DURATION\_UNIT bernilai setengah hari |
| 400 | beginDateCannotAfterEndDate | Waktu mulai tidak boleh lebih lambat dari waktu selesai | Waktu mulai tidak boleh lebih lambat dari waktu selesai |
| 400 | durationTooLong | Rentang waktu antara waktu mulai dan waktu selesai terlalu panjang | Rentang waktu antara waktu mulai dan waktu selesai terlalu panjang |
| 400 | dateTooEarly | Waktu tidak boleh lebih awal dari jumlah hari yang ditentukan | Waktu tidak boleh lebih awal dari jumlah hari yang ditentukan |
| 400 | overtimeDurationTooLong | Durasi lembur terlalu panjang | Durasi lembur terlalu panjang |
| 400 | systemError | Error sistem | Error sistem |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.