京都のkintone用javascript
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

252 行
8.3KB

  1. import { AppID } from "@/common/appids";
  2. import { makeRecordData } from "@/common/rest-api-client";
  3. import { 契約状況同期 } from "@/logic/契約状況同期";
  4. import {
  5. ConfirmDialog,
  6. ShowConfirmDialog,
  7. showLoadingDialog,
  8. } from "@/middleware/swal";
  9. import { EmailID, sendEmail } from "@/mypage/メール";
  10. import { BulkRequest } from "@/rest-api/bulk";
  11. import { getDetailUrl } from "@/rest-api/url";
  12. import { get自動承認グループ } from "@/rest-api/自動承認グループ";
  13. import { get車室契約情報, get車室契約情報一覧 } from "@/rest-api/車室契約情報";
  14. import { get車室情報一覧 } from "@/rest-api/車室情報2";
  15. import {
  16. getNextSMBC番号,
  17. getNext顧客コード,
  18. get顧客マスタ,
  19. } from "@/rest-api/顧客マスタ";
  20. import {
  21. 定期申込予約,
  22. 定期申込予約フィールド名,
  23. 状態Dropdown,
  24. 自動承認ステータスDropdown,
  25. } from "@/types/定期申込予約";
  26. import { 自動承認グループ } from "@/types/自動承認グループ";
  27. import { 車室契約情報, 車室契約情報フィールド名 } from "@/types/車室契約情報";
  28. import { 車室情報2 } from "@/types/車室情報2";
  29. import { 顧客マスタフィールド名 } from "@/types/顧客マスタ";
  30. import { sprintf } from "sprintf";
  31. import { CancelError, Message } from "../../exception";
  32. import { 入金予定結果フィールド名 } from "@/types/入金予定結果";
  33. import { dateParse, now } from "@/common/datetime";
  34. export class 申込 {
  35. private 定期申込予約: 定期申込予約;
  36. private 初期化済み: boolean = false;
  37. private 顧客情報: {
  38. 顧客コード: number;
  39. } | null = null;
  40. private 車室一覧: 車室情報2[] = [];
  41. private 契約一覧: 車室契約情報[] = [];
  42. private 自動承認グループ: 自動承認グループ | null = null;
  43. private 作成後契約: 車室契約情報 | null = null;
  44. private requests: BulkRequest = new BulkRequest();
  45. constructor(定期申込予約: 定期申込予約) {
  46. this.定期申込予約 = 定期申込予約;
  47. }
  48. async 初期化() {
  49. // 車室情報の取得
  50. await this.契約対象車室取得();
  51. // 対象のプランデータ取得
  52. await this.契約情報取得();
  53. // 自動承認データの取得
  54. await this.自動承認グループ取得();
  55. this.初期化済み = true;
  56. return this;
  57. }
  58. async 選定() {
  59. // 空き車室の特定
  60. const target = this.選定情報取得();
  61. // 顧客マスタの作成/取得
  62. await this.顧客マスタ取得();
  63. // 契約の作成
  64. await this.契約情報作成(target);
  65. // 申込データの更新
  66. await this.申込情報完了();
  67. // データ保存
  68. await this.save();
  69. await 契約状況同期(
  70. this.定期申込予約.駐車場.value,
  71. Number(target.車室番号.value)
  72. );
  73. }
  74. 選定情報取得() {
  75. return this.対象車室取得();
  76. }
  77. 作成後契約取得() {
  78. return this.作成後契約;
  79. }
  80. private async 契約対象車室取得() {
  81. if (!this.定期申込予約.駐車場.value) {
  82. throw new Message("駐車場名の設定をしてください");
  83. }
  84. this.車室一覧 = await get車室情報一覧({
  85. 駐車場名: this.定期申込予約.駐車場.value,
  86. });
  87. }
  88. private async 契約情報取得() {
  89. if (!this.定期申込予約.駐車場.value) {
  90. throw new Message("駐車場名の設定をしてください");
  91. }
  92. this.契約一覧 = await get車室契約情報一覧({
  93. 駐車場名: this.定期申込予約.駐車場.value,
  94. 契約中のみ: true,
  95. });
  96. }
  97. private async 自動承認グループ取得() {
  98. if (!this.定期申込予約.定期駐車場プラン.value) {
  99. throw new Message("プラン名の設定をしてください");
  100. }
  101. this.自動承認グループ = await get自動承認グループ(
  102. this.定期申込予約.定期駐車場プラン.value
  103. );
  104. }
  105. private 対象車室取得() {
  106. if (!this.初期化済み) {
  107. throw new Error("実装エラー 未初期化");
  108. }
  109. const target = this.自動承認グループ?.対象車室番号.value
  110. .filter(({ value: 定義 }) => {
  111. // 自動承認車室でない場合は対象外とする
  112. if (定義.自動承認スキップ.value.length !== 0) return false;
  113. // 契約中の車室は対象外とする
  114. const 同一車室の契約中情報: 車室契約情報 | undefined =
  115. this.契約一覧.find((契約) => {
  116. return 契約.車室番号.value === 定義.車室番号.value;
  117. });
  118. if (!!同一車室の契約中情報) return false;
  119. return true;
  120. })
  121. .sort((a, b) => {
  122. return Number(a.value.割当順.value) < Number(b.value.割当順.value)
  123. ? -1
  124. : 1;
  125. })
  126. .find(() => true);
  127. if (!target) {
  128. throw new Message("空き車室がありません");
  129. }
  130. const 車室番号 = Number(target.value.車室番号.value);
  131. const 車室 = this.車室一覧.find((room) => {
  132. return Number(room.車室番号.value) === 車室番号;
  133. });
  134. if (!車室) {
  135. throw new Message("車室がありません");
  136. }
  137. return 車室;
  138. }
  139. private async 顧客マスタ取得() {
  140. const customer = await get顧客マスタ({
  141. メールアドレス: this.定期申込予約.メールアドレス.value,
  142. 必須: false,
  143. });
  144. if (customer) {
  145. const confirm = await ShowConfirmDialog({
  146. html: sprintf(
  147. "<p>既存顧客<a href='%s' target='_blank'>[%s]</a>様へ契約を追加しますか</p>",
  148. getDetailUrl(AppID.顧客マスタ, customer.$id.value),
  149. customer.CustomerName.value
  150. ),
  151. });
  152. if (!confirm.isConfirmed) throw new CancelError();
  153. this.顧客情報 = {
  154. 顧客コード: Number(customer[顧客マスタフィールド名.顧客コード].value),
  155. };
  156. } else {
  157. this.顧客マスタ作成();
  158. }
  159. }
  160. private async 顧客マスタ作成() {
  161. const F = 顧客マスタフィールド名;
  162. const 顧客コード = await getNext顧客コード();
  163. this.requests.create({
  164. app: AppID.顧客マスタ,
  165. record: makeRecordData({
  166. [F.顧客コード]: String(顧客コード),
  167. [F.顧客名]: this.定期申込予約.氏名.value,
  168. [F.顧客名カナ]: this.定期申込予約.フリガナ.value,
  169. [F.電話番号]: this.定期申込予約.電話番号.value,
  170. [F.メールアドレス]: this.定期申込予約.メールアドレス.value,
  171. [F.SMBC契約番号]: String(await getNextSMBC番号()),
  172. [F.支払方法]: "その他",
  173. }),
  174. });
  175. this.顧客情報 = {
  176. 顧客コード,
  177. };
  178. }
  179. private async 契約情報作成(対象車室: 車室情報2) {
  180. if (!this.顧客情報) throw new Error("顧客情報不正");
  181. if (!this.定期申込予約) throw new Error("定期申込予約不正");
  182. const F = 車室契約情報フィールド名;
  183. this.requests.create(
  184. {
  185. app: AppID.車室契約情報,
  186. record: makeRecordData({
  187. [F.顧客コード]: String(this.顧客情報.顧客コード),
  188. [F.契約日]: this.get契約開始日(),
  189. [F.車両番号]: this.定期申込予約.車両番号.value,
  190. [F.車室番号]: 対象車室.車室番号.value,
  191. [F.プラン名]: this.定期申込予約.定期駐車場プラン.value,
  192. }),
  193. },
  194. async ({ id }) => {
  195. if (!id) throw new Error();
  196. this.作成後契約 = await get車室契約情報(Number(id));
  197. }
  198. );
  199. }
  200. private async 申込情報完了() {
  201. const F = 定期申込予約フィールド名;
  202. this.requests.update({
  203. app: AppID.定期申込予約,
  204. id: this.定期申込予約.$id.value,
  205. record: makeRecordData({
  206. [F.状態]: 状態Dropdown.承認_自動承認,
  207. [F.自動承認ステータス]: 自動承認ステータスDropdown.承認済,
  208. }),
  209. });
  210. }
  211. private get契約開始日() {
  212. const 利用開始希望日 = this.定期申込予約.利用開始希望日.value;
  213. if (!利用開始希望日) throw new Message("利用開始希望日不正");
  214. return 利用開始希望日;
  215. }
  216. private async save() {
  217. this.requests.debug();
  218. await this.requests.save();
  219. }
  220. }