京都のkintone用javascript
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

280 lines
9.5KB

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