@joymerrevent/porters-connect 0.11.0 → 0.12.0

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/CHANGELOG.md CHANGED
@@ -5,6 +5,78 @@
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.12.0] - 2026-08-31
9
+
10
+ **PORTERS の全リソースに対応した版**です。データ系は 6/13 から **13/13** になり、
11
+ マスタ Read 4 種と合わせて**残らず触れる**ようになりました([ADR-0060][adr60])。
12
+ 破壊的変更はありません — 既存のアクセサと型はそのままで、増えたぶんだけ足されています。
13
+
14
+ ### Added
15
+
16
+ - **Recruiter リソース**(企業担当者)の Read / Write。他のデータ系リソースと同じアクセサです。
17
+ 次の主軸「全リソース網羅 + ドキュメント充実」([ADR-0060][adr60])の 1 本目で、
18
+ 未対応は Contact / Activity / Contract / Sales / Opportunity / Phase の 6 種になりました。
19
+
20
+ ```ts
21
+ const id = await t.recruiter.create({
22
+ P_Owner: 5,
23
+ P_Client: 20001, // 新規必須(所属する企業)
24
+ P_Name: "採用 太郎",
25
+ });
26
+ const r = await t.recruiter.get(id, { expand: { P_Client: ["P_Name"] } });
27
+ ```
28
+
29
+ - カスタム項目(`U_` / `A_`)も `defineFields({ recruiter: … })` で宣言できます。
30
+ - `P_MobileMail` の Data Type は **`Telephone`** です(Candidate は `Mail`)。
31
+ リソース間で食い違いますが、PORTERS の Field List 記事どおりに写しています。
32
+
33
+ - **Contact リソース**(コンタクト)の Read / Write。**Recruiter と項目構成が同一**ですが、
34
+ PORTERS が役割で分けている別リソースなので、テーブルもカタログも独立しています。
35
+ - **Contract リソース**(契約)の Read / Write。**このリソースだけ `P_Owner` がありません**(PORTERS が
36
+ 公表していないため)。`create` に必要なのは `P_Client` だけです。`Currency` の項目
37
+ (`P_AdvancePayment` / `P_ContingentFee` / `P_ContractorFee`)は **Data Type が `Number`** なので
38
+ 数値として読み書きします。
39
+ - **Activity リソース**(アクティビティ)の Read / Write。`P_Resource`(Resource List の数値 ID)と
40
+ `P_ResourceId` の組で**任意の上位リソースに紐づきます**。参照先が実行時に決まるため
41
+ `P_ResourceId` は `expand` の対象外で、**参照先の ID として読めます**(どのリソースを指していても同じ)。
42
+ - **Opportunity リソース**(商談管理)の Read / Write。`P_Client` / `P_Recruiter` の両方を
43
+ `expand` できます。**このリソースだけ `P_Deleted` がありません** — PORTERS が公表していないため、
44
+ こちらも持たせていません(無いものを足さない)。
45
+
46
+ - **Sales リソース**(成約・売上)の Read / Write。**参照 6 項目すべてを `expand` できます**
47
+ (Client / Recruiter / Job / Contract / Candidate / Resume)。
48
+ `create` の必須は **`P_Owner` のみ**です — 参照 6 項目はリファレンスで `※`(条件付き必須)とされ、
49
+ 実際は依存の連鎖(`P_Job` → `P_Recruiter` → `P_Client` ← `P_Contract`)なので、
50
+ **ライブラリは手前で弾かず PORTERS の判定に委ねます**(詳細は新しい[書き込みの制約ガイド][write-constraints])。
51
+ - **書き込みの制約ガイド**を追加しました。**ライブラリが送信前に弾くもの**と
52
+ **PORTERS に委ねるもの**の境界、リソースごとの新規必須項目の一覧をまとめています。
53
+
54
+ - **Phase リソース**(フェーズ履歴)の Read / Write。**これで PORTERS の全リソースに対応**しました
55
+ (マスタ Read 4 種 + データ系 13 種)。Phase だけは**対象リソースを束ねてから**使います
56
+ ([ADR-0061][adr61])。
57
+
58
+ ```ts
59
+ const phases = t.phase.of("client"); // 対象は名前で指定(`of(5)` ではない)
60
+ await phases.search({ condition: { ResourceId: { eq: 20001 } } });
61
+ await phases.create({ ResourceId: 20001, Memo: "初回接触" });
62
+ ```
63
+
64
+ - **どのリソースのフェーズ履歴かを PORTERS が必ず要求する**ので、`of(...)` で 1 度だけ指定します。
65
+ 以降は他のリソースと同じ書き方で、指定漏れは**型として起こりえません**。
66
+ - 名前はアクセサと同じ綴りです。綴り間違いや、PORTERS が ID を持たないリソース(`"phase"` など)は
67
+ **コンパイルエラー**になります。
68
+ - Phase の項目は**接頭辞も `P_` も付きません**(`Id` / `Resource` / `Date` / `Memo` …)。
69
+ 主キーも `Id` です。カスタム項目と削除フラグは持ちません。
70
+
71
+ - **データ型 `System[Department]`** に対応しました(`Phase.OwnerDepartment` ほか)。
72
+ `User` と同じ形の `DepartmentRef`(`P_Id` / `P_Name`)で読めます。
73
+ **書き込みは提供しません** — PORTERS が書ける形を公表していないため、推測した形を送りません。
74
+
75
+ ### Changed
76
+
77
+ - **`Job.P_Recruiter` / `Process.P_Recruiter` を `expand` できる**ようになりました。
78
+ 参照先の Recruiter カタログが揃ったためです。展開しなければ従来どおり ID が返ります(挙動は不変)。
79
+
8
80
  ## [0.11.0] - 2026-08-30
9
81
 
10
82
  **参照先の項目を 1 往復で読めるようにし、`field` の語彙をクエリ全体と揃えた版**です。
@@ -437,10 +509,14 @@
437
509
  [adr57]: docs/adr/0057-itemstate-existing-explicit.md
438
510
  [adr58]: docs/adr/0058-reference-expansion-read.md
439
511
  [adr59]: docs/adr/0059-read-field-bare-alias.md
512
+ [adr60]: docs/adr/0060-full-resource-coverage-direction.md
513
+ [adr61]: docs/adr/0061-phase-resource-surface.md
514
+ [write-constraints]: docs/guide/write-constraints.md
440
515
  [lv]: docs/live-verification.md
441
516
  [kac]: https://keepachangelog.com/en/1.1.0/
442
517
  [semver]: https://semver.org/
443
- [unreleased]: https://github.com/Joymerrevent/porters-connect/compare/v0.11.0...HEAD
518
+ [unreleased]: https://github.com/Joymerrevent/porters-connect/compare/v0.12.0...HEAD
519
+ [0.12.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.11.0...v0.12.0
444
520
  [0.11.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.10.0...v0.11.0
445
521
  [0.10.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.9.0...v0.10.0
446
522
  [0.9.0]: https://github.com/Joymerrevent/porters-connect/compare/v0.8.0...v0.9.0
package/README.md CHANGED
@@ -167,14 +167,40 @@ await porters.auth.exchangeAuthorizationCode(code);
167
167
 
168
168
  すべてのデータ系リソースは同じ形のアクセサを持ちます。
169
169
 
170
- | アクセサ | リソース | メソッド |
171
- | -------------- | ------------ | ---------------------------------------------------- |
172
- | `t.candidate` | 個人連絡先 | `search` / `searchAll` / `get` / `create` / `update` |
173
- | `t.job` | JOB | `search` / `searchAll` / `get` / `create` / `update` |
174
- | `t.client` | 企業 | `search` / `searchAll` / `get` / `create` / `update` |
175
- | `t.process` | 選考プロセス | `search` / `searchAll` / `get` / `create` / `update` |
176
- | `t.resume` | レジュメ | `search` / `searchAll` / `get` / `create` / `update` |
177
- | `t.attachment` | 添付ファイル | `search` / `get` / `create` / `update` |
170
+ | アクセサ | リソース | メソッド |
171
+ | --------------- | -------------- | ---------------------------------------------------- |
172
+ | `t.candidate` | 個人連絡先 | `search` / `searchAll` / `get` / `create` / `update` |
173
+ | `t.job` | JOB | `search` / `searchAll` / `get` / `create` / `update` |
174
+ | `t.client` | 企業 | `search` / `searchAll` / `get` / `create` / `update` |
175
+ | `t.recruiter` | 企業担当者 | `search` / `searchAll` / `get` / `create` / `update` |
176
+ | `t.contact` | コンタクト | `search` / `searchAll` / `get` / `create` / `update` |
177
+ | `t.opportunity` | 商談管理 | `search` / `searchAll` / `get` / `create` / `update` |
178
+ | `t.activity` | アクティビティ | `search` / `searchAll` / `get` / `create` / `update` |
179
+ | `t.contract` | 契約 | `search` / `searchAll` / `get` / `create` / `update` |
180
+ | `t.sales` | 成約・売上 | `search` / `searchAll` / `get` / `create` / `update` |
181
+ | `t.process` | 選考プロセス | `search` / `searchAll` / `get` / `create` / `update` |
182
+ | `t.resume` | レジュメ | `search` / `searchAll` / `get` / `create` / `update` |
183
+ | `t.attachment` | 添付ファイル | `search` / `get` / `create` / `update` |
184
+
185
+ **これで PORTERS の全リソースに対応しました**(マスタ Read 4 種 + データ系 13 種)。
186
+ 方針は [ADR-0060][adr-0060]、進捗は [ロードマップ][roadmap]。
187
+
188
+ **Phase だけは対象リソースを束ねてから**使います。どのリソースのフェーズ履歴かを PORTERS が必ず要求するので、
189
+ `of(...)` で 1 度だけ指定すると、以降は他のリソースと同じ書き方になります([ADR-0061][adr-0061])。
190
+
191
+ ```ts
192
+ const phases = t.phase.of("client"); // 対象は名前で指定(`of(5)` ではない)
193
+ await phases.search({ condition: { ResourceId: { eq: 20001 } } });
194
+ await phases.create({ ResourceId: 20001, Memo: "初回接触" });
195
+ ```
196
+
197
+ | アクセサ | リソース | メソッド |
198
+ | ------------------------ | ------------ | ---------------------------------------------------- |
199
+ | `t.phase.of(リソース名)` | フェーズ履歴 | `search` / `searchAll` / `get` / `create` / `update` |
200
+
201
+ 指定できる名前はアクセサと同じ綴りです(`"candidate"` / `"job"` / `"client"` / `"recruiter"` /
202
+ `"contact"` / `"opportunity"` / `"activity"` / `"contract"` / `"sales"` / `"process"` / `"resume"`)。
203
+ 綴り間違いや、PORTERS が ID を持たないリソース(`"phase"` など)は**コンパイルエラー**になります。
178
204
 
179
205
  - `search(query?)` → `{ items, total, count, start }`(オフセット式ページング)。
180
206
  - `searchAll(query?)` → `AsyncIterable`(200 件刻みで全件 yield)。
@@ -182,6 +208,9 @@ await porters.auth.exchangeAuthorizationCode(code);
182
208
  - `create(input)` → 採番された **id(number)**。
183
209
  - `update(id, input)` → その **id**。
184
210
 
211
+ > **書き込みの制約**(新規必須の項目・条件付き必須・Phase 更新の作法・送信前に弾かれるもの)は
212
+ > [書き込みの制約ガイド][write-constraints]にまとめています。
213
+
185
214
  **検索クエリ**(`query`)の主なキー(すべて型安全。**項目の Data Type が許す演算子だけ**を受けます):
186
215
 
187
216
  - `field`:取得する項目(**接頭辞なし**の alias の配列。例 `["P_Id", "P_Name"]`。接頭辞はライブラリが付けます)。
@@ -445,8 +474,12 @@ try {
445
474
  [read-query-guide]: ./docs/guide/read-query.md
446
475
  [multi-tenancy]: ./docs/guide/multi-tenancy.md
447
476
  [bulk-write]: ./docs/guide/bulk-write.md
477
+ [write-constraints]: ./docs/guide/write-constraints.md
448
478
  [sandbox]: ./examples/offline-sandbox.ts
449
479
  [adr]: ./docs/adr/README.md
480
+ [adr-0060]: ./docs/adr/0060-full-resource-coverage-direction.md
481
+ [adr-0061]: ./docs/adr/0061-phase-resource-surface.md
482
+ [roadmap]: ./docs/roadmap.md
450
483
  [adr44]: ./docs/adr/0044-http-status-handling.md
451
484
  [adr46]: ./docs/adr/0046-guard-error-contract.md
452
485
  [adr47]: ./docs/adr/0047-access-point-scheme.md