diff --git a/dictation_function/src/constants/index.ts b/dictation_function/src/constants/index.ts index 6c8c0e8..7c09425 100644 --- a/dictation_function/src/constants/index.ts +++ b/dictation_function/src/constants/index.ts @@ -106,6 +106,7 @@ export const LICENSE_TYPE = { TRIAL: "TRIAL", NORMAL: "NORMAL", CARD: "CARD", + NONE: "NONE", } as const; /** * ライセンス状態 @@ -385,6 +386,7 @@ export const LICENSE_COUNT_ANALYSIS_LICENSE_TYPE = { CARD: "Card", SWITCH_FROM_TRIAL: "トライアルから切り替え", SWITCH_FROM_CARD: "カードから切り替え", + NONE: "移行ライセンス", }; /** * ライセンス数推移出力機能のCSV項目で使用する日本語(役割) diff --git a/dictation_function/src/functions/analysisLicenses.ts b/dictation_function/src/functions/analysisLicenses.ts index 22f4709..ffc4309 100644 --- a/dictation_function/src/functions/analysisLicenses.ts +++ b/dictation_function/src/functions/analysisLicenses.ts @@ -486,6 +486,7 @@ export async function transferData( (license) => license.account_id === account.id ); // 抽出したライセンスを種別ごとに分ける。(typeカラムで判別)(トライアル・通常・カード) + // 種別にNoneを追加⇒旧システムからの移行分の状況も確認したい 2024年7月9日 const trialLicenses = accountLicenses.filter( (license) => license.type === LICENSE_TYPE.TRIAL ); @@ -495,6 +496,9 @@ export async function transferData( const cardLicenses = accountLicenses.filter( (license) => license.type === LICENSE_TYPE.CARD ); + const noneLicense = accountLicenses.filter( + (license) => license.type === LICENSE_TYPE.NONE + ); // 種別ごとのライセンスから使用中のライセンスを抽出statusカラムがAllocated const usedTrialLicenses = trialLicenses.filter( (license) => license.status === LICENSE_ALLOCATED_STATUS.ALLOCATED @@ -505,6 +509,9 @@ export async function transferData( const usedCardLicenses = cardLicenses.filter( (license) => license.status === LICENSE_ALLOCATED_STATUS.ALLOCATED ); + const usedNoneLicense = noneLicense.filter( + (license) => license.status === LICENSE_ALLOCATED_STATUS.ALLOCATED + ); // どのロールのユーザーが使用しているライセンスかを判別し、ロールごとに分ける。 // (allcated_user_idからユーザーを特定) // (Author・Typist・None) @@ -584,6 +591,7 @@ export async function transferData( const usedCardLicensesAuthorCount = usedCardLicensesAuthor.length; const usedCardLicensesTypistCount = usedCardLicensesTypist.length; const usedCardLicensesNoneCount = usedCardLicensesNone.length; + const usedNoneLicenseCount = usedNoneLicense.length; // アカウントに紐づく当月発行ライセンスを取得 const accountCurrentMonthIssuedLicenses = @@ -817,6 +825,7 @@ export async function transferData( trialLicensesCount, normalLicensesCount, cardLicensesCount, + usedNoneLicenseCount, usedTrialLicensesAuthorCount, usedTrialLicensesTypistCount, usedTrialLicensesNoneCount, @@ -858,6 +867,7 @@ export async function transferData( trialLicensesCount, normalLicensesCount, cardLicensesCount, + usedNoneLicenseCount, usedTrialLicensesAuthorCount, usedTrialLicensesTypistCount, usedTrialLicensesNoneCount, @@ -899,6 +909,7 @@ export async function transferData( trialLicensesCount, normalLicensesCount, cardLicensesCount, + usedNoneLicenseCount, usedTrialLicensesAuthorCount, usedTrialLicensesTypistCount, usedTrialLicensesNoneCount, @@ -959,6 +970,7 @@ export async function transferData( (license) => license.account_id === account.id ); // 抽出したライセンスを種別ごとに分ける。(typeカラムで判別)(トライアル・通常・カード) + // 種別にNoneを追加⇒旧システムからの移行分の状況も確認したい 2024年7月9日 const trialLicenses = accountLicenses.filter( (license) => license.type === LICENSE_TYPE.TRIAL ); @@ -968,6 +980,9 @@ export async function transferData( const cardLicenses = accountLicenses.filter( (license) => license.type === LICENSE_TYPE.CARD ); + const noneLicense = accountLicenses.filter( + (license) => license.type === LICENSE_TYPE.NONE + ); // 種別ごとのライセンスから使用中のライセンスを抽出statusカラムがAllocated const usedTrialLicenses = trialLicenses.filter( (license) => license.status === LICENSE_ALLOCATED_STATUS.ALLOCATED @@ -978,6 +993,9 @@ export async function transferData( const usedCardLicenses = cardLicenses.filter( (license) => license.status === LICENSE_ALLOCATED_STATUS.ALLOCATED ); + const usedNoneLicense = noneLicense.filter( + (license) => (license.status === LICENSE_ALLOCATED_STATUS.ALLOCATED) + ); // どのロールのユーザーが使用しているライセンスかを判別し、ロールごとに分ける。 // (allcated_user_idからユーザーを特定) // (Author・Typist・None) @@ -1048,6 +1066,7 @@ export async function transferData( const usedCardLicensesAuthorCount = usedCardLicensesAuthor.length; const usedCardLicensesTypistCount = usedCardLicensesTypist.length; const usedCardLicensesNoneCount = usedCardLicensesNone.length; + const usedNoneLicenseCount = usedNoneLicense.length; // アカウントに紐づく当月発行ライセンスを取得 const accountCurrentMonthIssuedLicenses = @@ -1256,6 +1275,7 @@ export async function transferData( trialLicensesCount, normalLicensesCount, cardLicensesCount, + usedNoneLicenseCount, usedTrialLicensesAuthorCount, usedTrialLicensesTypistCount, usedTrialLicensesNoneCount, @@ -1297,6 +1317,7 @@ export async function transferData( trialLicensesCount, normalLicensesCount, cardLicensesCount, + usedNoneLicenseCount, usedTrialLicensesAuthorCount, usedTrialLicensesTypistCount, usedTrialLicensesNoneCount, @@ -1338,6 +1359,7 @@ export async function transferData( trialLicensesCount, normalLicensesCount, cardLicensesCount, + usedNoneLicenseCount, usedTrialLicensesAuthorCount, usedTrialLicensesTypistCount, usedTrialLicensesNoneCount, @@ -1433,6 +1455,7 @@ async function createOutputData( trialLicensesCount: number, normalLicensesCount: number, cardLicensesCount: number, + usedNoneLicenseCount: number, usedTrialLicensesAuthorCount: number, usedTrialLicensesTypistCount: number, usedTrialLicensesNoneCount: number, @@ -1505,6 +1528,16 @@ async function createOutputData( '"' + "" + '",', '"' + cardLicensesCount.toString() + '"\r\n' ); + // ユーザーが使用中の移行ライセンス + resultOutputData.push( + '"' + company_name + '",', + '"' + targetMonthYYYYMM + '",', + '"' + LICENSE_COUNT_ANALYSIS_CATEGORY_1.VALID_LICENSES + '",', + '"' + LICENSE_COUNT_ANALYSIS_CATEGORY_2.IN_USE_LICENSES + '",', + '"' + LICENSE_COUNT_ANALYSIS_LICENSE_TYPE.NONE + '",', + '"' + "" + '",', + '"' + usedNoneLicenseCount.toString() + '"\r\n' + ); // Authorが使用中のトライアルライセンス[] resultOutputData.push( '"' + company_name + '",', diff --git a/dictation_function/src/test/analysisLicenses.spec.ts b/dictation_function/src/test/analysisLicenses.spec.ts index 56e2bea..f719201 100644 --- a/dictation_function/src/test/analysisLicenses.spec.ts +++ b/dictation_function/src/test/analysisLicenses.spec.ts @@ -305,6 +305,35 @@ describe("analysisLicenses", () => { last2Month ); + // 有効な移行ライセンスの作成 + await createLicense( + source, + 26, + expiringSoonDate, + account5_1.id, + "NONE", + LICENSE_ALLOCATED_STATUS.ALLOCATED, + null, + null, + null, + null, + last2Month + ); + // 期限切れの移行ライセンスの作成 + await createLicense( + source, + 27, + lastMonth, + account5_1.id, + "NONE", + LICENSE_ALLOCATED_STATUS.ALLOCATED, + null, + null, + null, + null, + last2Month + ); + // 第五階層がその月におこなったライセンス切り替え情報を作成 // 条件: // ・第五アカウント @@ -379,23 +408,25 @@ describe("analysisLicenses", () => { throw new Error("ユーザー取得できていないので失敗"); } - expect(result.avairableLicenses).toHaveLength(6); + expect(result.avairableLicenses).toHaveLength(7); expect(result.avairableLicenses[0].id).toBe(1); expect(result.avairableLicenses[1].id).toBe(2); expect(result.avairableLicenses[2].id).toBe(3); expect(result.avairableLicenses[3].id).toBe(11); expect(result.avairableLicenses[4].id).toBe(12); expect(result.avairableLicenses[5].id).toBe(13); + expect(result.avairableLicenses[6].id).toBe(26); expect(result.licensesIssuedInTargetMonth).toHaveLength(3); expect(result.licensesIssuedInTargetMonth[0].id).toBe(11); expect(result.licensesIssuedInTargetMonth[1].id).toBe(12); expect(result.licensesIssuedInTargetMonth[2].id).toBe(13); - expect(result.licensesExpiredInTargetMonth).toHaveLength(3); + expect(result.licensesExpiredInTargetMonth).toHaveLength(4); expect(result.licensesExpiredInTargetMonth[0].id).toBe(21); expect(result.licensesExpiredInTargetMonth[1].id).toBe(22); expect(result.licensesExpiredInTargetMonth[2].id).toBe(23); + expect(result.licensesExpiredInTargetMonth[3].id).toBe(27); expect(result.switchedlicensesInTargetMonth).toHaveLength(2); expect(result.switchedlicensesInTargetMonth[0].id).toBe(1); @@ -647,6 +678,35 @@ describe("analysisLicenses", () => { last2Month ); + // 有効な移行ライセンスの作成 + await createLicenseArchive( + source, + 26, + null, + account5_1.id, + "NONE", + LICENSE_ALLOCATED_STATUS.UNALLOCATED, + null, + null, + null, + null, + last2Month + ); + // 期限切れの移行ライセンスの作成 + await createLicenseArchive( + source, + 27, + lastMonth, + account5_1.id, + "NONE", + LICENSE_ALLOCATED_STATUS.UNALLOCATED, + null, + null, + null, + null, + last2Month + ); + // 第五階層がその月におこなったライセンス切り替え情報を作成 // 条件: // ・第五アカウント @@ -722,23 +782,25 @@ describe("analysisLicenses", () => { ); } - expect(result.deletedAvairableLicenses).toHaveLength(6); + expect(result.deletedAvairableLicenses).toHaveLength(7); expect(result.deletedAvairableLicenses[0].id).toBe(1); expect(result.deletedAvairableLicenses[1].id).toBe(2); expect(result.deletedAvairableLicenses[2].id).toBe(3); expect(result.deletedAvairableLicenses[3].id).toBe(11); expect(result.deletedAvairableLicenses[4].id).toBe(12); expect(result.deletedAvairableLicenses[5].id).toBe(13); + expect(result.deletedAvairableLicenses[6].id).toBe(26); expect(result.deletedLicensesIssuedInTargetMonth).toHaveLength(3); expect(result.deletedLicensesIssuedInTargetMonth[0].id).toBe(11); expect(result.deletedLicensesIssuedInTargetMonth[1].id).toBe(12); expect(result.deletedLicensesIssuedInTargetMonth[2].id).toBe(13); - expect(result.deletedLicensesExpiredInTargetMonth).toHaveLength(3); + expect(result.deletedLicensesExpiredInTargetMonth).toHaveLength(4); expect(result.deletedLicensesExpiredInTargetMonth[0].id).toBe(21); expect(result.deletedLicensesExpiredInTargetMonth[1].id).toBe(22); expect(result.deletedLicensesExpiredInTargetMonth[2].id).toBe(23); + expect(result.deletedLicensesExpiredInTargetMonth[3].id).toBe(27); expect(result.deletedSwitchedlicensesInTargetMonth).toHaveLength(2); expect(result.deletedSwitchedlicensesInTargetMonth[0].id).toBe(1); @@ -1682,6 +1744,62 @@ describe("analysisLicenses", () => { SWITCH_FROM_TYPE.CARD ); + // 移行ライセンス用のデータを作成 + // 移行ライセンスを持つ生きているアカウントのユーザーの情報を作成する + const activeUserForTransitionData1 = await makeTestUser(source, { + account_id: account5_1.id, + role: "author", + }); + const activeUserForTransitionData2 = await makeTestUser(source, { + account_id: account5_1.id, + role: "author", + }); + // ユーザーに紐づく有効な移行ライセンスを作成 + await createLicense( + source, + 56, + expiringSoonDate, + account5_1.id, + "NONE", + LICENSE_ALLOCATED_STATUS.ALLOCATED, + activeUserForTransitionData1.id, + null, + null, + null, + last2Month + ); + // ユーザーに紐づく期限切れの移行ライセンスを作成 + // これは集計しないのでCSVには出力されない + await createLicense( + source, + 57, + lastMonth, + account5_1.id, + "NONE", + LICENSE_ALLOCATED_STATUS.ALLOCATED, + activeUserForTransitionData2.id, + null, + null, + null, + last2Month + ); + + // 誰にも紐づかない移行ライセンスを作成 + // これは集計しないのでCSVには出力されない + await createLicense( + source, + 58, + expiringSoonDate, + account5_1.id, + "NONE", + LICENSE_ALLOCATED_STATUS.UNALLOCATED, + null, + null, + null, + null, + last2Month + ); + const result = await getBaseData(context, lastMonthYYYYMM, source); // 削除されたアカウントとユーザーの情報を作成する @@ -2585,6 +2703,62 @@ describe("analysisLicenses", () => { lastMonth, SWITCH_FROM_TYPE.CARD ); + + // 移行ライセンス用のデータを作成 + // 移行ライセンスを持つ削除アカウントのユーザーの情報を作成する + const DeletedUserForTransitionData1 = await makeTestUserArchive(source, { + account_id: account5_1_D.id, + role: "author", + }); + const DeletedUserForTransitionData2 = await makeTestUserArchive(source, { + account_id: account5_1_D.id, + role: "author", + }); + // 移行ライセンスを生きているアカウントに作成 + await createLicenseArchive( + source, + 56, + expiringSoonDate, + account5_1_D.id, + "NONE", + LICENSE_ALLOCATED_STATUS.ALLOCATED, + DeletedUserForTransitionData1.id, + null, + null, + null, + last2Month + ); + // ユーザーに紐づく期限切れの移行ライセンスを作成 + // これは集計しないのでCSVには出力されない + await createLicenseArchive( + source, + 57, + lastMonth, + account5_1_D.id, + "NONE", + LICENSE_ALLOCATED_STATUS.ALLOCATED, + DeletedUserForTransitionData2.id, + null, + null, + null, + last2Month + ); + // 誰にも紐づかない移行ライセンスを作成 + // これは集計しないのでCSVには出力されない + await createLicenseArchive( + source, + 58, + expiringSoonDate, + account5_1_D.id, + "NONE", + LICENSE_ALLOCATED_STATUS.UNALLOCATED, + null, + null, + null, + null, + last2Month + ); + const result_D = await getBaseDataFromDeletedAccounts( context, lastMonthYYYYMM, @@ -2609,6 +2783,8 @@ describe("analysisLicenses", () => { `"test inc.","${lastMonthYYYYMM}","有効ライセンス数","所有ライセンス数","Standard","","9"` + "\r\n" + `"test inc.","${lastMonthYYYYMM}","有効ライセンス数","所有ライセンス数","Card","","7"` + + `\r\n` + + `"test inc.","${lastMonthYYYYMM}","有効ライセンス数","使用中ライセンス数","移行ライセンス","","1"` + "\r\n" + `"test inc.","${lastMonthYYYYMM}","有効ライセンス数","使用中ライセンス数","Trial","Author","1"` + "\r\n" + @@ -2676,6 +2852,8 @@ describe("analysisLicenses", () => { "\r\n" + `"1","${lastMonthYYYYMM}","有効ライセンス数","所有ライセンス数","Card","","7"` + "\r\n" + + `"1","${lastMonthYYYYMM}","有効ライセンス数","使用中ライセンス数","移行ライセンス","","1"` + + "\r\n" + `"1","${lastMonthYYYYMM}","有効ライセンス数","使用中ライセンス数","Trial","Author","1"` + "\r\n" + `"1","${lastMonthYYYYMM}","有効ライセンス数","使用中ライセンス数","Trial","Typist","2"` +