京都の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.

297 lines
10KB

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