# 캘린더 설정

## Content

간트 시트는 정확한 일정 계획과 리소스 할당을 위해 근무 시간과 비근무 시간을 결정하는 다양한 캘린더를 사용합니다. 각 캘린더는 근무 주, 근무일, 근무 시간으로 구성되며, 사용자가 이를 직접 커스터마이즈할 수 있습니다.
프로젝트를 생성하면 기본 기본 캘린더를 사용하여 작업을 스케줄링합니다. 프로젝트의 근무일 및 시간이 기본 캘린더의 시간 외에 있다면, 다른 기본 캘린더로 변경하거나 프로젝트 캘린더의 근무 시간을 조정할 수 있습니다.

## 내장 캘린더 적용하기

SpreadJS는 간트 시트 용으로 다음과 같은 내장 캘린더를 제공합니다.

* **표준** (월요일\~금요일, 오전 8시 \~ 오후 5시)
* **야간모드** (월요일\~금요일, 오후 11시 \~ 오전 4시 / 토요일, 오후 11시 \~ 오전 8시)
* **24시** (하루 24시간, 주 7일 근무)

다음 코드는 24시간 연속 근무일을 의미하는 `hours24` 캘린더를 프로젝트에 할당하는 예입니다:

```javascript
var calendar = GC.Spread.Sheets.GanttSheet.Calendar.hours24;
ganttSheet.project.calendar = calendar;
```

## 기본 캘린더 생성

SpreadJS는 프로젝트 캘린더, 근무 주, 근무 시간을 정의하고 커스터마이즈할 수 있습니다. `GC.Spread.Sheets.GanttSheet.Calendar` API를 사용해 기본 프로젝트 캘린더를 생성할 수 있습니다. 다음은 캘린더 이름을 지정하여 생성하는 코드 예시입니다:

```javascript
GC.Spread.Sheets.GanttSheet.Calendar("defaultCalendar") 
```

캘린더를 생성한 후에는 `GC.Spread.Sheets.GanttSheet.WorkWeek` API를 사용하여 기본 근무 주(WorkWeek)를 정의할 수 있습니다. 근무 주(WorkWeek)는 각 요일에 대한 **근무일(WorkDay)** 목록이며, 각 요일별 근무 시간을 지정할 수 있습니다. 반면, 근무일(WorkDay)은 근무 시간대들을 정의하는 배열로, 각 시간대의 시작 및 종료 시간을 설정할 수 있습니다.
`GC.Spread.Sheets.GanttSheet.WorkTime` 및 `GC.Spread.Sheets.GanttSheet.Time` API를 사용하여 근무 주 내에서 각 요일의 근무 시간을 설정할 수 있습니다. 추가로, SpreadJS는 `GC.Spread.Sheets.GanttSheet.CustomWorkWeek` API를 제공하여 일반 근무 주의 확장 형태인 커스텀 근무 주(Custom WorkWeek)를 생성할 수 있습니다. 커스텀 근무 주를 사용하면 **휴일**, **휴가** 등의 특별한 시간을 설정할 수 있으며, 특정 날짜에 대해 근무 시간을 조정할 수 있습니다.

## 캘린더 설정 커스터마이즈

캘린더 설정은 주로 작업 기간 계산에 필요한 속성을 정의합니다. 다음 설정을 구성할 수 있습니다:

| 설정 | 설명 | 기본값 | 샘플 코드 |
| --- | --- | --- | ----- |
| **week start** | 주의 시작 요일 | 일요일 | `ganttSheet.project.calendarSettings.weekStartOn = GC.Spread.Sheets.GanttSheet.DayOfWeek.Sunday;` |
| **default start/end time** | 하루의 기본 시작/종료 시간 | 시작: 08:00, 종료: 17:00 | `ganttSheet.project.calendarSettings.defaultStartTime = { hour: 8, minute: 0 };`<br>`ganttSheet.project.calendarSettings.defaultFinishTime = { hour: 17, minute: 0 };` |
| **hours per day** | 하루 근무 시간 | 8시간 | `ganttSheet.project.calendarSettings.hoursPerDay = 8;` |
| **hours per week** | 주간 근무 시간 | 40시간 | `ganttSheet.project.calendarSettings.hoursPerWeek = 40;` |
| **days per month** | 월간 근무 일수 | 20일 | `ganttSheet.project.calendarSettings.daysPerMonth = 20;` |
| **duration unit**<br>*[요약 작업에서만 변경 가능.* <br>*간트시트뷰에서 일반 작업은 항상 '일(day)' 사용]* | 근무 시간의 단위 | 일(day) | `ganttSheet.project.calendarSettings.defaultDurationUnit = "Day";` |
| **default duration decimal digits** | 시간 계산에 사용되는 정밀도 | 3 | `ganttSheet.project.calendarSettings.defaultDurationDecimalDigits = 3;` |

## 근무 시간 변경하기

프로젝트의 일반적인 근무 일정이 사용 가능한 기본 캘린더와 일치하지 않는 경우, 작업을 적절하게 일정에 맞추기 위해 **프로젝트의 근무 시간(Working Hours)**을 변경할 수도 있습니다. 근무 시간을 변경하려면, 먼저 **프로젝트의 현재 캘린더** 또는 기본 제공 네임스페이스(Built-in Namespace)에서 기본 근무 주(WorkWeek)를 가져와야 합니다.
그런 다음, 해당 캘린더를 수정하고 **수정된 캘린더를 프로젝트에 적용**하면 됩니다. 다음 코드 샘플은 캘린더에서 근무 시간을 변경하는 방법을 보여줍니다:

```javascript
// 프로젝트의 현재 캘린더에서 기본 근무 주 가져오기
var calendar = ganttSheet.project.calendar;
console.log(calendar.defaultWorkWeek);

// 또는 내장 캘린더에서 가져오기
console.log(GC.Spread.Sheets.GanttSheet.Calendar.standard);
console.log(GC.Spread.Sheets.GanttSheet.Calendar.hours24);
console.log(GC.Spread.Sheets.GanttSheet.Calendar.nightShift);

// 근무 시간 변경
var calendar = GC.Spread.Sheets.GanttSheet.Calendar.standard;
var defaultWorkWeek = calendar.defaultWorkWeek;
var workday = defaultWorkWeek.getWorkDay(GC.Spread.Sheets.GanttSheet.DayOfWeek.Monday);

// 근무일은 다음과 같은 시간대로 구성됨:
/*
[
    { start: { hour: 8, minute: 0 }, end: { hour: 12, minute: 0 } },
    { start: { hour: 13, minute: 0 }, end: { hour: 17, minute: 0 } }
]
// 즉, 8:00~12:00, 13:00~17:00
*/
workday[1].end.hour = 13;

// 수정된 캘린더 적용
ganttSheet.project.calendar = GC.Spread.Sheets.GanttSheet.Calendar.standard;
}
```

SpreadJS 디자이너에서 근무 시간을 변경하고 선택한 캘린더 정보를 설정할 수 있습니다.
이를 위해, 간트 시트를 추가한 후 **프로젝트(PROJECT) 탭**을 클릭하고 **속성(Properties)** 그룹에서 **근무시간 변경(Change Working Time)** 버튼을 선택합니다.
**근무시간 변경(Change Working Time)** 대화 상자에서 **일정 관리용(For Calendar)** 드롭다운을 통해 수정할 캘린더 정보를 선택하고, 다양한 날짜를 선택하여 해당 날짜의 특정 근무 시간을 확인할 수 있습니다. 이후, **근무 주(Work Weeks)** 탭을 클릭하여 기간을 선택하고 **자세히(Details)** 버튼을 눌러 기본 근무 시간을 변경합니다.
**일을 이 특정 작업 시간으로 설정(Set day(s) to these specific working times)** 옵션을 선택한 경우, **시작(From)** 및 **끝(To)** 열을 사용하여 선택한 날짜의 근무 시간을 설정할 수 있습니다.
![image](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/d37fbce1-6a37-43ce-b728-dd79fba68421/image.742a0c.png?width=800)

>type=warning
> **참고:**
>
> * **일을 이 특정 작업 시간으로 설정(Set day(s) to these specific working times)**를 선택해야만 근무 시간을 변경할 수 있습니다.
> * 변경된 날짜는 **Nondefault work week**로 표시됩니다.

또한, **근무시간 변경(Change Working Time)** 대화 상자의 오른쪽 상단에 있는 **새 일정관리 만들기...(Create New Calendar...)** 옵션을 선택하여, 사용자가 직접 기본 캘린더(Base Calendar)를 생성할 수도 있습니다.