@shisyamo4131/air-guard-v2-schemas 2.4.2-dev.71 → 2.4.2-dev.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shisyamo4131/air-guard-v2-schemas",
3
- "version": "2.4.2-dev.71",
3
+ "version": "2.4.2-dev.73",
4
4
  "description": "Schemas for AirGuard V2",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -0,0 +1,39 @@
1
+ /*****************************************************************************
2
+ * @file ./src/FcmTokens.js
3
+ * @description FCM トークンを管理するための配列クラス
4
+ * - 配列クラスに add と remove メソッドを追加して、トークンの管理を容易にしています。
5
+ *****************************************************************************/
6
+
7
+ /*****************************************************************************
8
+ * @class FcmTokens
9
+ *
10
+ * @method add - FCM トークンを新たに追加します。但し重複は無視されます。
11
+ * @method remove - FCM トークンを削除します。
12
+ *****************************************************************************/
13
+ export class FcmTokens extends Array {
14
+ /**
15
+ * トークンを追加
16
+ */
17
+ add(token) {
18
+ if (!token || typeof token !== "string") {
19
+ throw new Error("Invalid FCM token");
20
+ }
21
+ if (this.includes(token)) {
22
+ return false; // 既に存在
23
+ }
24
+ this.push(token);
25
+ return true;
26
+ }
27
+
28
+ /**
29
+ * トークンを削除
30
+ */
31
+ remove(token) {
32
+ const index = this.indexOf(token);
33
+ if (index === -1) {
34
+ return false; // 存在しない
35
+ }
36
+ this.splice(index, 1);
37
+ return true;
38
+ }
39
+ }
package/src/Insurance.js CHANGED
@@ -5,6 +5,7 @@
5
5
  import { BaseClass } from "@shisyamo4131/air-firebase-v2";
6
6
  import { VALUES as INSURANCE_STATUS } from "./constants/insurance-status.js";
7
7
  import { defField } from "./parts/fieldDefinitions.js";
8
+ import { formatJstDate } from "./utils/index.js";
8
9
 
9
10
  export const ERROR_MESSAGES = Object.freeze({
10
11
  INVALID_TRANSITION: (allowedStates) =>
package/src/User.js CHANGED
@@ -1,61 +1,52 @@
1
- /**
2
- * User Model
3
- * @version 1.1.0
4
- * @author shisyamo4131
5
- * @update 2025-12-25 Added `tagSize` property.
6
- * Added `updateProperties` method for updating multiple properties.
7
- * @update 2025-11-24 Added `companyId`, `isAdmin`, `isTemporary` property.
8
- * Changed to prevent deletion of admin users.
9
- *
10
- * @prop {string} email - User's email address.
11
- * @prop {string} displayName - User's display name.
12
- * @prop {string} [employeeId] - Employee ID (not required as some users may not be employees).
13
- * @prop {Array<string>} roles - User roles/permissions.
14
- * @prop {boolean} disabled - Indicates if the user is disabled.
15
- * @prop {string} companyId - ID of the associated company.
16
- * @prop {boolean} isAdmin - Indicates if the user is an administrator.
17
- * @prop {boolean} isTemporary - Indicates if the user is temporary.
18
- * @prop {string} tagSize - Size of the tag associated with the user.
19
- */
1
+ /*****************************************************************************
2
+ * @file src/User.js
3
+ *****************************************************************************/
20
4
  import FireModel from "@shisyamo4131/air-firebase-v2";
21
5
  import { defField } from "./parts/fieldDefinitions.js";
22
6
  import { TAG_SIZE_VALUES, TAG_SIZE_OPTIONS } from "./constants/index.js";
7
+ import { FcmTokens } from "./FcmTokens.js";
23
8
 
24
- const classProps = {
25
- email: defField("email", { required: true }),
26
- displayName: defField("displayName", { required: true }),
27
- employeeId: defField("oneLine", { label: "従業員ID", hidden: true }),
28
- roles: {
29
- type: Array,
30
- default: () => [],
31
- label: "権限",
32
- required: false,
33
- hidden: false,
34
- },
35
- disabled: defField("check", {
36
- label: "使用不可",
37
- default: false,
38
- required: false,
39
- hidden: true,
40
- }),
41
- companyId: defField("oneLine", { hidden: true, required: true }),
42
- isAdmin: defField("check", { hidden: true, default: false }),
43
- isTemporary: defField("check", { hidden: true, default: true }),
44
- tagSize: defField("select", {
45
- label: "タグサイズ",
46
- default: TAG_SIZE_VALUES.MEDIUM.value,
47
- component: {
48
- attrs: {
49
- items: TAG_SIZE_OPTIONS,
50
- },
51
- },
52
- }),
53
- };
54
-
9
+ /*****************************************************************************
10
+ * @class User
11
+ * @extends FireModel
12
+ *
13
+ * @property {string} email - メールアドレス
14
+ * @property {string} displayName - 表示名
15
+ * @property {string} [employeeId] - 従業員ID(非従業員を許容するために必須とはしない)
16
+ * @property {Array<string>} roles - アプリケーション利用権限
17
+ * @property {boolean} disabled - 有効/無効
18
+ * @property {string} companyId - 会社ID
19
+ * @property {boolean} isAdmin - 管理者であるかどうか
20
+ * @property {boolean} isTemporary - 仮登録状態であるかどうか
21
+ * @property {string} tagSize - 配置管理機能におけるタグコンポーネントの表示サイズ
22
+ * @property {Array<string>} fcmTokens - Firebase Cloud Messaging (FCM) のトークンの配列
23
+ *****************************************************************************/
55
24
  export default class User extends FireModel {
56
25
  static className = "ユーザー";
57
26
  static collectionPath = "Users";
58
- static classProps = classProps;
27
+ static classProps = {
28
+ email: defField("email", { required: true }),
29
+ displayName: defField("displayName", { required: true }),
30
+ employeeId: defField("oneLine", { label: "従業員ID", hidden: true }),
31
+ roles: defField("roles"),
32
+ disabled: defField("disabled", { hidden: true }),
33
+ companyId: defField("companyId", { hidden: true, required: true }),
34
+ isAdmin: defField("isAdmin", { hidden: true }),
35
+ isTemporary: defField("isTemporary", { hidden: true, default: true }),
36
+ tagSize: defField("tagSize", { required: true }),
37
+ fcmTokens: defField("fcmTokens"),
38
+ };
39
+
40
+ /**
41
+ * `afterInitialize` をオーバーライド
42
+ * - `fcmTokens` を `FcmTokens` クラスのインスタンスとして扱う
43
+ * @param {*} item
44
+ */
45
+ afterInitialize(item = {}) {
46
+ super.afterInitialize(item);
47
+ // fcmTokens を FcmTokens クラスのインスタンスとして扱う
48
+ this.fcmTokens = new FcmTokens(...this.fcmTokens);
49
+ }
59
50
 
60
51
  /**
61
52
  * Deletes the user document.
@@ -86,6 +77,9 @@ export default class User extends FireModel {
86
77
  * @returns {Promise<DocumentReference>} Reference to the updated document.
87
78
  * @throws {Error} If `updateData` is not a valid object.
88
79
  * @throws {Error} If `docId` is not set, or if `updateOptions.callback` is not a function.
80
+ *
81
+ * Note: このメソッドは複数のプロパティを一括更新するためのヘルパーメソッド。BaseClass に移設しても良いかもしれない。
82
+ * なお、`useAuthStore` で使用中のようだ。
89
83
  */
90
84
  async updateProperties(updateData = null, updateOptions = {}) {
91
85
  if (!updateData || typeof updateData !== "object") {
@@ -2,7 +2,38 @@ import { generalDefinitions } from "./defaultDefinition.js";
2
2
 
3
3
  /**
4
4
  * ARRAY型のフィールド定義
5
+ * {
6
+ * type: Array,
7
+ * default: () => [],
8
+ * label: undefined,
9
+ * length: undefined,
10
+ * required: undefined,
11
+ * hidden: undefined,
12
+ * validator: undefined,
13
+ * component: { name: "air-select", attrs: { multiple: true } },
14
+ * }
5
15
  */
6
16
  export const arrayFields = {
7
17
  array: generalDefinitions.array,
18
+
19
+ /**
20
+ * FCM トークン
21
+ * Firebase Cloud Messaging (FCM) のトークンを格納するフィールド定義
22
+ */
23
+ fcmTokens: {
24
+ ...generalDefinitions.array,
25
+ label: "FCMトークン",
26
+ required: false,
27
+ hidden: true,
28
+ },
29
+
30
+ /**
31
+ * アプリケーション利用権限用配列フィールド定義
32
+ */
33
+ roles: {
34
+ ...generalDefinitions.array,
35
+ label: "権限",
36
+ required: false,
37
+ hidden: false,
38
+ },
8
39
  };
@@ -2,9 +2,29 @@ import { generalDefinitions } from "./defaultDefinition.js";
2
2
 
3
3
  /**
4
4
  * CHECK型のフィールド定義
5
+ * {
6
+ * type: Boolean,
7
+ * default: false,
8
+ * label: undefined,
9
+ * length: undefined,
10
+ * required: undefined,
11
+ * hidden: undefined,
12
+ * validator: undefined,
13
+ * component: { name: "air-checkbox", attrs: {} },
14
+ * }
5
15
  */
6
16
  export const checkFields = {
7
17
  check: generalDefinitions.check,
18
+
19
+ /**
20
+ * 使用不可を表すフィールド定義
21
+ * - `label` や他の定義は利用先において定義変更すること。
22
+ */
23
+ disabled: {
24
+ ...generalDefinitions.check,
25
+ label: "使用不可",
26
+ },
27
+
8
28
  hasPeriodOfStayLimit: {
9
29
  ...generalDefinitions.check,
10
30
  label: "在留期間制限",
@@ -13,8 +33,21 @@ export const checkFields = {
13
33
  ...generalDefinitions.check,
14
34
  label: "就労制限",
15
35
  },
36
+
37
+ /** 管理者かどうか */
38
+ isAdmin: {
39
+ ...generalDefinitions.check,
40
+ label: "管理者",
41
+ },
42
+
16
43
  isForeigner: {
17
44
  ...generalDefinitions.check,
18
45
  label: "外国籍",
19
46
  },
47
+
48
+ /** 仮登録 */
49
+ isTemporary: {
50
+ ...generalDefinitions.check,
51
+ label: "仮登録",
52
+ },
20
53
  };
@@ -2,39 +2,69 @@ import { generalDefinitions } from "./defaultDefinition.js";
2
2
 
3
3
  /**
4
4
  * ONE LINE型のフィールド定義
5
+ * {
6
+ * type: String,
7
+ * default: null,
8
+ * label: undefined,
9
+ * length: undefined,
10
+ * required: undefined,
11
+ * hidden: undefined,
12
+ * validator: undefined,
13
+ * component: { name: "air-text-field", attrs: {} },
14
+ * }
5
15
  */
6
16
  export const oneLineFields = {
7
17
  oneLine: generalDefinitions.oneLine,
18
+
19
+ /** 略称 */
8
20
  abbreviation: {
9
21
  ...generalDefinitions.oneLine,
10
22
  label: "略称",
11
23
  length: 20,
12
24
  },
25
+
26
+ /** 町域名・番地 */
13
27
  address: {
14
28
  ...generalDefinitions.oneLine,
15
29
  label: "町域名・番地",
16
30
  length: 30,
17
31
  },
32
+
33
+ /** 支店名など */
18
34
  branchName: {
19
35
  ...generalDefinitions.oneLine,
20
36
  label: "支店名など",
21
37
  length: 20,
22
38
  },
39
+
40
+ /** 建物名・階数 */
23
41
  building: {
24
42
  ...generalDefinitions.oneLine,
25
43
  label: "建物名・階数",
26
44
  length: 30,
27
45
  },
46
+
47
+ /** 市区町村 */
28
48
  city: {
29
49
  ...generalDefinitions.oneLine,
30
50
  label: "市区町村",
31
51
  length: 20,
32
52
  },
53
+
54
+ /** 会社ID */
55
+ companyId: {
56
+ ...generalDefinitions.oneLine,
57
+ label: "会社ID",
58
+ },
59
+
60
+ /** 会社名 */
33
61
  companyName: {
34
62
  ...generalDefinitions.oneLine,
35
63
  label: "会社名",
36
64
  length: 20,
37
65
  },
66
+
67
+ /** 会社名(カナ) */
38
68
  companyNameKana: {
39
69
  ...generalDefinitions.oneLine,
40
70
  label: "会社名(カナ)",
@@ -46,6 +76,12 @@ export const oneLineFields = {
46
76
  },
47
77
  },
48
78
  },
79
+
80
+ /**
81
+ * 取引先
82
+ * - アプリ側で `useFetchXxxx` コンポーザブルを使用するため
83
+ * 使用するクラス側で api 関連の設定は不要。
84
+ */
49
85
  customerId: {
50
86
  ...generalDefinitions.oneLine,
51
87
  label: "取引先",
@@ -60,6 +96,7 @@ export const oneLineFields = {
60
96
  },
61
97
  },
62
98
  },
99
+
63
100
  /**
64
101
  * 取引先名
65
102
  * - 2文字以上最大20文字
@@ -73,16 +110,22 @@ export const oneLineFields = {
73
110
  attrs: { minLength: 2 },
74
111
  },
75
112
  },
113
+
114
+ /** 表示名 */
76
115
  displayName: {
77
116
  ...generalDefinitions.oneLine,
78
117
  label: "表示名",
79
118
  length: 6,
80
119
  },
120
+
121
+ /** 本籍地 */
81
122
  domicile: {
82
123
  ...generalDefinitions.oneLine,
83
124
  label: "本籍地",
84
125
  length: 50,
85
126
  },
127
+
128
+ /** email */
86
129
  email: {
87
130
  ...generalDefinitions.oneLine,
88
131
  label: "email",
@@ -95,21 +138,29 @@ export const oneLineFields = {
95
138
  },
96
139
  },
97
140
  },
141
+
142
+ /** 緊急連絡先住所 */
98
143
  emergencyContactAddress: {
99
144
  ...generalDefinitions.oneLine,
100
145
  label: "緊急連絡先住所",
101
146
  length: 50,
102
147
  },
148
+
149
+ /** 緊急連絡先氏名 */
103
150
  emergencyContactName: {
104
151
  ...generalDefinitions.oneLine,
105
152
  label: "緊急連絡先氏名",
106
153
  length: 20,
107
154
  },
155
+
156
+ /** 緊急連絡先続柄詳細 */
108
157
  emergencyContactRelationDetail: {
109
158
  ...generalDefinitions.oneLine,
110
159
  label: "緊急連絡先続柄詳細",
111
160
  length: 20,
112
161
  },
162
+
163
+ /** 緊急連絡先電話番号 */
113
164
  emergencyContactPhone: {
114
165
  ...generalDefinitions.oneLine,
115
166
  label: "緊急連絡先電話番号",
@@ -123,6 +174,8 @@ export const oneLineFields = {
123
174
  },
124
175
  },
125
176
  },
177
+
178
+ /** FAX番号 */
126
179
  fax: {
127
180
  ...generalDefinitions.oneLine,
128
181
  label: "FAX番号",
@@ -136,11 +189,15 @@ export const oneLineFields = {
136
189
  },
137
190
  },
138
191
  },
192
+
193
+ /** 名 */
139
194
  firstName: {
140
195
  ...generalDefinitions.oneLine,
141
196
  label: "名",
142
197
  length: 20,
143
198
  },
199
+
200
+ /** メイ */
144
201
  firstNameKana: {
145
202
  ...generalDefinitions.oneLine,
146
203
  label: "メイ",
@@ -152,6 +209,8 @@ export const oneLineFields = {
152
209
  },
153
210
  },
154
211
  },
212
+
213
+ /** 本名 */
155
214
  foreignName: {
156
215
  ...generalDefinitions.oneLine,
157
216
  label: "本名",
@@ -164,22 +223,29 @@ export const oneLineFields = {
164
223
  },
165
224
  },
166
225
  },
226
+
227
+ /** 被保険者番号(整理記号) */
167
228
  insuranceNumber: {
168
229
  ...generalDefinitions.oneLine,
169
230
  label: "被保険者番号(整理記号)",
170
231
  length: 20,
171
232
  },
172
- // 2025-12-26 Added
233
+
234
+ /** 発行元 */
173
235
  issuedBy: {
174
236
  ...generalDefinitions.oneLine,
175
237
  label: "発行元",
176
238
  length: 20,
177
239
  },
240
+
241
+ /** 姓 */
178
242
  lastName: {
179
243
  ...generalDefinitions.oneLine,
180
244
  label: "姓",
181
245
  length: 20,
182
246
  },
247
+
248
+ /** セイ */
183
249
  lastNameKana: {
184
250
  ...generalDefinitions.oneLine,
185
251
  label: "セイ",
@@ -191,11 +257,15 @@ export const oneLineFields = {
191
257
  },
192
258
  },
193
259
  },
260
+
261
+ /** 喪失理由 */
194
262
  lossReason: {
195
263
  ...generalDefinitions.oneLine,
196
264
  label: "喪失理由",
197
265
  length: 40,
198
266
  },
267
+
268
+ /** 携帯電話 */
199
269
  mobile: {
200
270
  ...generalDefinitions.oneLine,
201
271
  label: "携帯電話",
@@ -209,11 +279,15 @@ export const oneLineFields = {
209
279
  },
210
280
  },
211
281
  },
282
+
283
+ /** 名前 */
212
284
  name: {
213
285
  ...generalDefinitions.oneLine,
214
286
  label: "名前",
215
287
  length: 20,
216
288
  },
289
+
290
+ /** 名前(カナ) */
217
291
  nameKana: {
218
292
  ...generalDefinitions.oneLine,
219
293
  label: "名前(カナ)",
@@ -225,27 +299,36 @@ export const oneLineFields = {
225
299
  },
226
300
  },
227
301
  },
302
+
303
+ /** 国籍 */
228
304
  nationality: {
229
305
  ...generalDefinitions.oneLine,
230
306
  label: "国籍",
231
307
  length: 50,
232
308
  },
309
+
310
+ /** 在留資格 */
233
311
  residenceStatus: {
234
312
  ...generalDefinitions.oneLine,
235
313
  label: "在留資格",
236
314
  length: 10,
237
315
  },
316
+
317
+ /** 退職理由 */
238
318
  reasonOfTermination: {
239
319
  ...generalDefinitions.oneLine,
240
320
  label: "退職理由",
241
321
  length: 20,
242
322
  },
243
- // 2025-12-26 Added
323
+
324
+ /** 証明書番号 */
244
325
  serialNumber: {
245
326
  ...generalDefinitions.oneLine,
246
327
  label: "証明書番号",
247
328
  length: 20,
248
329
  },
330
+
331
+ /** 現場ID */
249
332
  siteId: {
250
333
  ...generalDefinitions.oneLine,
251
334
  label: "現場",
@@ -258,6 +341,8 @@ export const oneLineFields = {
258
341
  },
259
342
  },
260
343
  },
344
+
345
+ /** 電話番号 */
261
346
  tel: {
262
347
  ...generalDefinitions.oneLine,
263
348
  label: "電話番号",
@@ -271,16 +356,22 @@ export const oneLineFields = {
271
356
  },
272
357
  },
273
358
  },
359
+
360
+ /** 肩書 */
274
361
  title: {
275
362
  ...generalDefinitions.oneLine,
276
363
  label: "肩書",
277
364
  length: 20,
278
365
  },
366
+
367
+ /** 作業内容 */
279
368
  workDescription: {
280
369
  ...generalDefinitions.oneLine,
281
370
  label: "作業内容",
282
371
  length: 20,
283
372
  },
373
+
374
+ /** 郵便番号 */
284
375
  zipcode: {
285
376
  ...generalDefinitions.oneLine,
286
377
  default: null,
@@ -52,10 +52,24 @@ import {
52
52
  VALUES as SITE_STATUS_VALUES,
53
53
  OPTIONS as SITE_STATUS_OPTIONS,
54
54
  } from "../../constants/site-status.js";
55
+ import {
56
+ VALUES as TAG_SIZE_VALUES,
57
+ OPTIONS as TAG_SIZE_OPTIONS,
58
+ } from "../../constants/tag-size.js";
55
59
  import CutoffDate from "../../utils/CutoffDate.js";
56
60
 
57
61
  /**
58
62
  * SELECT型のフィールド定義
63
+ * {
64
+ * type: String,
65
+ * default: null,
66
+ * label: undefined,
67
+ * length: undefined,
68
+ * required: undefined,
69
+ * hidden: undefined,
70
+ * validator: undefined,
71
+ * component: { name: "air-select", attrs: {} },
72
+ * }
59
73
  */
60
74
  export const selectFields = {
61
75
  select: generalDefinitions.select,
@@ -237,4 +251,17 @@ export const selectFields = {
237
251
  },
238
252
  },
239
253
  },
254
+
255
+ /** タグサイズ */
256
+ tagSize: {
257
+ ...generalDefinitions.select,
258
+ label: "タグサイズ",
259
+ default: TAG_SIZE_VALUES.MEDIUM.value,
260
+ component: {
261
+ name: generalDefinitions.select.component.name,
262
+ attrs: {
263
+ items: TAG_SIZE_OPTIONS,
264
+ },
265
+ },
266
+ },
240
267
  };