# TypeScript BUGYO Cloud Client

# Usage

```js
const bcc = require("bugyo-cloud-client");

// Implement LoggerFactory
const loggerFactory = {
  getLogger(name) {
    // (snip)
  },
};
// Settings
const tenantCode = "Bugyo cloud tenant code";
const loginId = "Your login id";
const password = "Your password";

// Create service
const service = new bcc.BugyoCloudClientService(loggerFactory);

// Create tasks
const loginTask = service.createLoginTask({ loginId, password });
const punchTask = service.createPunchTask({ clockType: "ClockIn" });
const logoutTask = service.createLogoutTask();

// Create a client
const client = service.createClient(tenantCode);

// Do tasks
await client.doA(loginTask); // At first, must do login
await client.doA(punchTask);
await client.doA(logoutTask);
```

See a samples.

- [login and logout](./samples/login-logout.js)
- [clock in](./samples/clock-in.js)
- [clock out](./samples//clock-out.js)

# Testing

```bash
npm test
```

# Running a sample

```bash
npm run sample TenantCode LoginId Password
```

# 画面あるいは API

**2025-9-1 更新**

**2026-1-9 更新**

## 認証画面

- URL: https://id.obc.jp/{{テナント?}}/
- METHOD: GET
- Response:
  - Headers:
    - Content-Type: text/html; charset=utf-8

## 認証方法チェック

- URL: https://id.obc.jp/{{テナント?}}/login/CheckAuthenticationMethod
- METHOD: POST
- Headers:
  - \_\_RequestVerificationToken: 認証画面のフォームにある hidden value
  - Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  - X-Requested-With: XMLHttpRequest
- Content:
  - "OBCiD" : "ログイン ID"
  - "isBugyoCloud" : "false"
- Response:
  - Status: 200
  - Headers:
    - Content-Type: application/json; charset=utf-8
  - Content:
    - AuthenticationMethod: number
    - SAMLButtonText: string
    - PasswordButtonText: string
    - SSOMethod: number

## 認証

- URL: https://id.obc.jp/{{テナント?}}/login/login/
- METHOD: POST
- Headers:
  - Content-Type: application/x-www-form-urlencoded; charset=UTF-8
- Content:
  - "btnLogin" : ""
  - "OBCID" : "ログイン ID"
  - "Password_d1" : ""
  - "Password_d2" : ""
  - "Password_d3" : ""
  - "Password" : "パスワード"
  - "\_\_RequestVerificationToken" : 認証画面のフォームにある input hidden value
  - "X-Requested-With" : "XMLHttpRequest"
- Response:
  - Status: 200
  - Headers:
    - Content-Type: application/json; charset=utf-8
  - Content:
    - "RedirectURL": "新規セッション開始リダイレクト URL"
    - "LoginOBCiD": "ログイン ID"

**2025-9-1 以前は、ここでリダイレクト先 URL を取得できました。**
**2026-1-9 以降、ここで新規セッション開始 URL が返ってきます。**

## 新規セッション開始（？） **2026-1-9 より**

- URL: （上記「認証」で返ってきた RedirectURL）
- METHOD: GET
- Response:
  - Status: 302
  - Headers:
    - Location: ワンタイムトークン URL 取得 URL

## ワンタイムトークン URL 取得

- URL: https://id.obc.jp/{{テナント?}}/omredirect/redirect/
- METHOD: GET
- Headers:
  - Referer: https://id.obc.jp/{{テナント?}}/
- Response:
  - Status: 302
  - Headers
    - Location: ワンタイムトークン URL

リダイレクト先 URL にはワンタイムトークンが含まれています。

## リダイレクト先 URL 取得

- URL: (先に取得したワンタイムトークン URL)
- METHOD: GET
- Headers:
  - Referer: https://id.obc.jp/{{テナント?}}/
- Response:
  - Status: 302
  - Headers:
    - Location: リダイレクト先 URL

302 に従うとユーザ初期画面へ遷移します。URL は、https://hromssp.obc.jp/{{テナント？}}/{{ユニーク文字列？}}/ のようになります。

## ユーザ初期画面

- URL: https://hromssp.obc.jp/{{テナント？}}/{{ユニーク文字列？}}/
- METHOD: GET

認証後の 302 応答に従うとたどり着きます。

ユニーク文字列の部分を、このあとの処理で使います。

## 打刻画面

- URL: https://hromssp.obc.jp/{{テナント？}}/{{ユニーク文字列？}}/timeclock/punchmark/
- METHOD: GET
- Response:
  - Headers:
    - Content-Type: text/html; charset=utf-8

## 打刻

- URL: https://hromssp.obc.jp/{{テナント？}}/{{ユニーク文字列？}}}/TimeClock/InsertReadDateTime/
- METHOD: POST
- Headers:
  - "\_\_RequestVerificationToken": 打刻画面にある input hidden value
  - "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
  - "X-Requested-With" : "XMLHttpRequest"
  - "Referer" : 打刻画面の URL

### form 内容

| Form name           | Form value |
| :------------------ | :--------- |
| "ClockType"         | 打刻種類   |
| "LaborSystemID"     | "0"        |
| "LaborSystemCode"   | ""         |
| "LaborSystemName"   | ""         |
| "PositionLatitude"  | 緯度       |
| "PositionLongitude" | 経度       |
| "PositionAccuracy"  | "0"        |

### 打刻種類

- 出勤 = "ClockIn"
- 退出 = "ClockOut"

## ログアウト

- URL: https://hromssp.obc.jp/{{テナント？}}/{{ユニーク文字列}}/calllogout/logout/?manuallogin=True
- METHOD: GET

## 申請

- URL: https://hromssp.obc.jp/{{テナント？}}/{{ユニーク文字列}}/Workflow/Apply/
- METHOD: POST
- Headers:
  - Content-Type: multipart/form-data

### form-data 内容

| Form data name                                | Form data value                   | Sample value                           |
| :-------------------------------------------- | :-------------------------------- | :------------------------------------- |
| "\_\_RequestVerificationToken"                | 入力画面にある input hidden value | （略）                                 |
| "applyReasonRadios"                           | 事由ラジオボタンの値(?)           | "0"                                    |
| "applyUnitRadios"                             | (?)                               | "0"                                    |
| "js-application\_\_basicDate"                 | 開始日付                          | "2024/3/21 10:37:39"                   |
| "js-application\_\_endDate"                   | 終了日付                          | "2024/3/22 10:37:39"                   |
| "js-application\_\_startTime.TimeBoxDateType" | 開始時刻が n 日目か(?)            | "1"                                    |
| "js-application\_\_startTime.Hour"            | 開始時刻（時間）                  | "18"                                   |
| "js-application\_\_startTime.Minute"          | 開始時刻（分）                    | "00"                                   |
| "TimeBoxInfo.IsBorder"                        | (?)                               | "value"                                |
| "TimeBoxInfo.HourViewType"                    | (?)                               | "View_24hour"                          |
| TimeBoxInfo.NavigationType"                   | (?)                               | "Separation"                           |
| "js-application\_\_endTime.TimeBoxDateType"   | 終了時刻が n 日目か(?)            | "1"                                    |
| "js-application\_\_endTime.Hour"              | 終了時刻（時間）                  | "22"                                   |
| "js-application\_\_endTime.Minute"            | 終了時刻（分）                    | "00"                                   |
| "TimeBoxInfo.IsBorder"                        | (?)                               | "value"                                |
| "TimeBoxInfo.HourViewType"                    | (?)                               | "View_24hour"                          |
| "TimeBoxInfo.NavigationType"                  | (?)                               | "Separation"                           |
| "js-application\_\_punchMarkStartDate"        | (?)                               | "2024/3/21 0:0:0"                      |
| "js-application\_\_startTimeWith.Hour"        | (?)                               | （空）                                 |
| "js-application\_\_startTimeWith.Minute"      | (?)                               | （空）                                 |
| "TimeBoxInfo.IsBorder"                        | (?)                               | "value"                                |
| "TimeBoxInfo.HourViewType"                    | (?)                               | "Normal"                               |
| "TimeBoxInfo.NavigationType"                  | (?)                               | "Separation"                           |
| "js-application\_\_punchMarkEndDate"          | (?)                               | "2024/3/21 0:0:0"                      |
| "js-application\_\_endTimeWith.Hour"          | (?)                               | （空）                                 |
| "js-application\_\_endTimeWith.Minute"        | (?)                               | （空）                                 |
| "TimeBoxInfo.IsBorder"                        | (?)                               | "value"                                |
| "TimeBoxInfo.HourViewType"                    | (?)                               | "Normal"                               |
| "TimeBoxInfo.NavigationType"                  | (?)                               | "Separation"                           |
| "js-application\_\_startTimeFor.Hour"         | (?)                               | （空）                                 |
| "js-application\_\_startTimeFor.Minute"       | (?)                               | （空）                                 |
| "TimeBoxInfo.IsBorder"                        | (?)                               | "value"                                |
| "TimeBoxInfo.HourViewType"                    | (?)                               | "Normal"                               |
| "TimeBoxInfo.NavigationType"                  | (?)                               | "Separation"                           |
| "js-application\_\_endTimeFor.Hour"           | (?)                               | （空）                                 |
| "js-application\_\_endTimeFor.Minute"         | (?)                               | （空）                                 |
| "TimeBoxInfo.IsBorder"                        | (?)                               | "value"                                |
| "TimeBoxInfo.HourViewType"                    | (?)                               | "Normal"                               |
| "TimeBoxInfo.NavigationType"                  | (?)                               | "Separation"                           |
| "js-application\_\_calcSpanDate"              | (?)                               | ":"                                    |
| "js-application\_\_calcSpanDateHour"          | (?)                               | "0"                                    |
| "js-application\_\_calcSpanPeriod"            | 計算した経過時間                  | "4:00"                                 |
| "js-application\_\_calcSpanPeriodHour"        | (?)                               | "0"                                    |
| "attachedFile"                                | 添付ファイル(?)                   | Content-Type: application/octet-stream |
| "Details[0].ReasonIndex"                      | 詳細 1: 事由ラジオボタンの値(?)   | "0"                                    |
| "Details[0].ApplyUnit"                        | (?)                               | "0"                                    |
| "Details[0].BasicDate"                        | 詳細 1: 日付                      | "2024/3/21"                            |
| "Details[0].StartDate"                        | (?)                               | （空）                                 |
| "Details[0].EndDate"                          | (?)                               | （空）                                 |
| "Details[0].StartTime"                        | 詳細 1: 開始時刻                  | "18:00"                                |
| "Details[0].EndTime"                          | 詳細 1: 終了時刻                  | "22:00"                                |
| "Details[0].SpanDay"                          | (?)                               | （空）                                 |
| "Details[0].ClockType"                        | (?)                               | （空）                                 |
| "Details[0].MultiLaborTime"                   | (?)                               | （空）                                 |
| "Details[0].PunchMarkTime"                    | (?)                               | （空）                                 |
| "Details[0].CalcSpan"                         | 詳細 1: 計算した経過時間          | "4 時間 00 分"                         |
| "Details[0].AttendanceHoliday1"               | (?)                               | （空）                                 |
| "Details[0].AttendanceHoliday2"               | (?)                               | （空）                                 |
| "Details[0].AttendanceHoliday3"               | (?)                               | （空）                                 |
| "Details[0].AttendanceHoliday4"               | (?)                               | （空）                                 |
| "Details[0].AttendanceHoliday5"               | (?)                               | （空）                                 |
| "Details[0].ByteDoCompDay"                    | (?)                               | "0"                                    |
| "Details[0].CompDayBasicDate"                 | (?)                               | （空）                                 |
| "Details[0].CompDayStartDate"                 | (?)                               | （空）                                 |
| "Details[0].CompDayStartTime"                 | (?)                               | （空）                                 |
| "Details[0].CompDayEndDate"                   | (?)                               | （空）                                 |
| "Details[0].CompDayEndTime"                   | (?)                               | （空）                                 |
| "Details[0].CompDaySpanDay"                   | (?)                               | （空）                                 |
| "Details[0].CompDayCalcSpan"                  | (?)                               | （空）                                 |
| "Details[0].InitialApplylNo"                  | (?)                               | （空）                                 |
| "Details[0].InitialApplyNo"                   | (?)                               | （空）                                 |
| "CommuteRoute"                                | (?)                               | （空）                                 |
| "Cause"                                       | 事由                              | "作業のため"                           |
| "Address"                                     | (?)                               | （空）                                 |
| "Memo"                                        | (?)                               | （空）                                 |
| "AttachedFileCount"                           | 添付ファイル数(?)                 | "0"                                    |
| "WorkflowName"                                | (?)                               | （空）                                 |
| "WorkflowID"                                  | (?)                               | （空）                                 |
| "ApplicationPositionCount"                    | (?)                               | （空）                                 |
| "ApplicationPositionName"                     | (?)                               | （空）                                 |
| "RestDaysNameList1"                           | (?)                               | （空）                                 |
| "RestDaysNameList2"                           | (?)                               | （空）                                 |
| "RestDaysNameList3"                           | (?)                               | （空）                                 |
| "RestDaysNameList4"                           | (?)                               | （空）                                 |
| "RestDaysNameList5"                           | (?)                               | （空）                                 |
| "RestDaysNameList6"                           | (?)                               | （空）                                 |
| "RestDaysNameList7"                           | (?)                               | （空）                                 |
| "RestDaysNameList8"                           | (?)                               | （空）                                 |
| "RestDaysNameList9"                           | (?)                               | （空）                                 |
| "RestDaysNameList10"                          | (?)                               | （空）                                 |
| "RestDaysNameList11"                          | (?)                               | （空）                                 |
| "RestDaysNameList12"                          | (?)                               | （空）                                 |
| "RestDaysList1"                               | (?)                               | （空）                                 |
| "RestDaysList2"                               | (?)                               | （空）                                 |
| "RestDaysList3"                               | (?)                               | （空）                                 |
| "RestDaysList4"                               | (?)                               | （空）                                 |
| "RestDaysList5"                               | (?)                               | （空）                                 |
| "RestDaysList6"                               | (?)                               | （空）                                 |
| "RestDaysList7"                               | (?)                               | （空）                                 |
| "RestDaysList8"                               | (?)                               | （空）                                 |
| "RestDaysList9"                               | (?)                               | （空）                                 |
| "RestDaysList10"                              | (?)                               | （空）                                 |
| "RestDaysList11"                              | (?)                               | （空）                                 |
| "RestDaysList12"                              | (?)                               | （空）                                 |
| "RestTimeList1"                               | (?)                               | （空）                                 |
| "RestTimeList2"                               | (?)                               | （空）                                 |
| "RestTimeList3"                               | (?)                               | （空）                                 |
| "RestTimeList4"                               | (?)                               | （空）                                 |
| "RestTimeList5"                               | (?)                               | （空）                                 |
| "RestTimeList6"                               | (?)                               | （空）                                 |
| "RestTimeList7"                               | (?)                               | （空）                                 |
| "RestTimeList8"                               | (?)                               | （空）                                 |
| "RestTimeList9"                               | (?)                               | （空）                                 |
| "RestTimeList10"                              | (?)                               | （空）                                 |
| "RestTimeList11"                              | (?)                               | （空）                                 |
| "RestTimeList12"                              | (?)                               | （空）                                 |
| "TotalOverTimeItemNameList1"                  | (?)                               | （空）                                 |
| "TotalOverTimeItemNameList2"                  | (?)                               | （空）                                 |
| "TotalOverTimeItemList1"                      | (?)                               | （空）                                 |
| "TotalOverTimeItemList2"                      | (?)                               | （空）                                 |
| "Val"                                         | (?)                               | "true"                                 |
| "WorkerTaskModelList_Stamp"                   | (?)                               | （空）                                 |
| "AppliedDivision"                             | (?)                               | "Overtime"                             |
| "TaskID"                                      | (?)                               | "00000000-0000-0000-0000-000000000000" |
| "Comment"                                     | (?)                               | （空）                                 |
| "IsAlreadyIncorrectApplyChecked"              | (?)                               | "false"                                |
| "ByIncorrectApply"                            | (?)                               | "False"                                |
| "ByTemporarySavedApplicationForm"             | (?)                               | "False"                                |
| "CtrlId"                                      | (?)                               | "--"                                   |
