Merged PR 303: PBI1224_dev動作確認指摘対応

## 概要
[Task2325: PBI1224_dev動作確認指摘対応](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/2325)

前PBIで指摘のあった箇所を修正しました。
・IssueDateが空白の場合「-」とするように修正
・ページ上部の「EFGI Legal」に会社名を入れるように修正
・上記に伴い、アカウント情報取得API(accounts/me)で会社名を取得できるように修正
・ページネーションの位置を修正
・ページネーション部分に表示されている「xxx licenses」を「xxx histories」に修正
・ページネーション周りの挙動を修正

## レビューポイント
なし

## UIの変更
https://ndstokyo.sharepoint.com/:f:/r/sites/Piranha/Shared%20Documents/General/OMDS/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88/Task2325?csf=1&web=1&e=g6hYEy

## 動作確認状況
ローカルで動作確認済み

## 補足
なし
This commit is contained in:
oura.a 2023-08-07 01:52:03 +00:00
parent a1a91207e4
commit b59a5df44c
18 changed files with 248 additions and 86 deletions

View File

@ -48,6 +48,12 @@ export interface Account {
* @memberof Account
*/
'accountId': number;
/**
*
* @type {string}
* @memberof Account
*/
'companyName': string;
}
/**
*
@ -513,19 +519,19 @@ export interface GetOrderHistoriesRequest {
/**
*
* @export
* @interface GetOrderHistoriesResponce
* @interface GetOrderHistoriesResponse
*/
export interface GetOrderHistoriesResponce {
export interface GetOrderHistoriesResponse {
/**
*
* @type {number}
* @memberof GetOrderHistoriesResponce
* @memberof GetOrderHistoriesResponse
*/
'total': number;
/**
*
* @type {Array<LicenseOrder>}
* @memberof GetOrderHistoriesResponce
* @memberof GetOrderHistoriesResponse
*/
'orderHistories': Array<LicenseOrder>;
}
@ -718,6 +724,25 @@ export interface IssueCardLicensesResponse {
*/
'cardLicenseKeys': Array<string>;
}
/**
*
* @export
* @interface IssueLicenseRequest
*/
export interface IssueLicenseRequest {
/**
* ID
* @type {number}
* @memberof IssueLicenseRequest
*/
'orderedAccountId': number;
/**
* POナンバー
* @type {string}
* @memberof IssueLicenseRequest
*/
'poNumber': string;
}
/**
*
* @export
@ -1696,6 +1721,46 @@ export const AccountsApiAxiosParamCreator = function (configuration?: Configurat
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
*
* @summary
* @param {IssueLicenseRequest} issueLicenseRequest
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
issueLicense: async (issueLicenseRequest: IssueLicenseRequest, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'issueLicenseRequest' is not null or undefined
assertParamExists('issueLicense', 'issueLicenseRequest', issueLicenseRequest)
const localVarPath = `/accounts/licenses/issue`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication bearer required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
localVarHeaderParameter['Content-Type'] = 'application/json';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
localVarRequestOptions.data = serializeDataIfNeeded(issueLicenseRequest, localVarRequestOptions, configuration)
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
@ -1761,7 +1826,7 @@ export const AccountsApiFp = function(configuration?: Configuration) {
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async getOrderHistories(getOrderHistoriesRequest: GetOrderHistoriesRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<GetOrderHistoriesResponce>> {
async getOrderHistories(getOrderHistoriesRequest: GetOrderHistoriesRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<GetOrderHistoriesResponse>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.getOrderHistories(getOrderHistoriesRequest, options);
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
},
@ -1796,6 +1861,17 @@ export const AccountsApiFp = function(configuration?: Configuration) {
const localVarAxiosArgs = await localVarAxiosParamCreator.getTypists(options);
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
},
/**
*
* @summary
* @param {IssueLicenseRequest} issueLicenseRequest
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async issueLicense(issueLicenseRequest: IssueLicenseRequest, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<object>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.issueLicense(issueLicenseRequest, options);
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
},
}
};
@ -1852,7 +1928,7 @@ export const AccountsApiFactory = function (configuration?: Configuration, baseP
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getOrderHistories(getOrderHistoriesRequest: GetOrderHistoriesRequest, options?: any): AxiosPromise<GetOrderHistoriesResponce> {
getOrderHistories(getOrderHistoriesRequest: GetOrderHistoriesRequest, options?: any): AxiosPromise<GetOrderHistoriesResponse> {
return localVarFp.getOrderHistories(getOrderHistoriesRequest, options).then((request) => request(axios, basePath));
},
/**
@ -1883,6 +1959,16 @@ export const AccountsApiFactory = function (configuration?: Configuration, baseP
getTypists(options?: any): AxiosPromise<GetTypistsResponse> {
return localVarFp.getTypists(options).then((request) => request(axios, basePath));
},
/**
*
* @summary
* @param {IssueLicenseRequest} issueLicenseRequest
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
issueLicense(issueLicenseRequest: IssueLicenseRequest, options?: any): AxiosPromise<object> {
return localVarFp.issueLicense(issueLicenseRequest, options).then((request) => request(axios, basePath));
},
};
};
@ -1985,6 +2071,18 @@ export class AccountsApi extends BaseAPI {
public getTypists(options?: AxiosRequestConfig) {
return AccountsApiFp(this.configuration).getTypists(options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @summary
* @param {IssueLicenseRequest} issueLicenseRequest
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof AccountsApi
*/
public issueLicense(issueLicenseRequest: IssueLicenseRequest, options?: AxiosRequestConfig) {
return AccountsApiFp(this.configuration).issueLicense(issueLicenseRequest, options).then((request) => request(this.axios, this.basePath));
}
}

View File

@ -1,4 +1,4 @@
import { createSlice } from "@reduxjs/toolkit";
import { PayloadAction, createSlice } from "@reduxjs/toolkit";
import { LicenseOrderHistoryState } from "./state";
import { getLicenseOrderHistoriesAsync } from "./operations";
import { LIMIT_ORDER_HISORY_NUM } from "./constants";
@ -7,6 +7,7 @@ const initialState: LicenseOrderHistoryState = {
domain: {
total: 0,
orderHistories: [],
companyName: "",
},
apps: {
limit: LIMIT_ORDER_HISORY_NUM,
@ -23,6 +24,17 @@ export const licenseOrderHistorySlice = createSlice({
cleanupApps: (state) => {
state.domain = initialState.domain;
},
savePageInfo: (
state,
action: PayloadAction<{
limit: number;
offset: number;
}>
) => {
const { limit, offset } = action.payload;
state.apps.limit = limit;
state.apps.offset = offset;
},
},
extraReducers: (builder) => {
builder.addCase(getLicenseOrderHistoriesAsync.pending, (state) => {
@ -31,8 +43,9 @@ export const licenseOrderHistorySlice = createSlice({
builder.addCase(
getLicenseOrderHistoriesAsync.fulfilled,
(state, action) => {
state.domain.total = action.payload.total;
state.domain.orderHistories = action.payload.orderHistories;
state.domain.total = action.payload.histories.total;
state.domain.orderHistories = action.payload.histories.orderHistories;
state.domain.companyName = action.payload.companyName;
state.apps.isLoading = false;
}
);
@ -42,6 +55,6 @@ export const licenseOrderHistorySlice = createSlice({
},
});
export const { cleanupApps } = licenseOrderHistorySlice.actions;
export const { cleanupApps, savePageInfo } = licenseOrderHistorySlice.actions;
export default licenseOrderHistorySlice.reducer;

View File

@ -2,13 +2,14 @@ import { createAsyncThunk } from "@reduxjs/toolkit";
import type { RootState } from "app/store";
import { getTranslationID } from "translation";
import { openSnackbar } from "features/ui/uiSlice";
import { AccountsApi, GetOrderHistoriesResponce } from "../../../api/api";
import { AccountsApi } from "../../../api/api";
import { Configuration } from "../../../api/configuration";
import { ErrorObject, createErrorObject } from "../../../common/errors";
import { OrderHistoryView } from "./types";
export const getLicenseOrderHistoriesAsync = createAsyncThunk<
// 正常時の戻り値の型
GetOrderHistoriesResponce,
OrderHistoryView,
{
// パラメータ
limit: number;
@ -32,15 +33,18 @@ export const getLicenseOrderHistoriesAsync = createAsyncThunk<
try {
const { selectedRow } = state.partnerLicense.apps;
let accountId = 0;
let companyName = "";
// 他の画面から指定されていない場合はログインアカウントのidを取得する
if (!selectedRow) {
const getMyAccountResponse = await accountsApi.getMyAccount({
headers: { authorization: `Bearer ${accessToken}` },
});
// accountIDを返す
// アカウントID,アカウント名を返す
accountId = getMyAccountResponse.data.account.accountId;
companyName = getMyAccountResponse.data.account.companyName;
} else {
accountId = selectedRow.accountId;
companyName = selectedRow.companyName;
}
const res = await accountsApi.getOrderHistories(
@ -53,7 +57,11 @@ export const getLicenseOrderHistoriesAsync = createAsyncThunk<
headers: { authorization: `Bearer ${accessToken}` },
}
);
return res.data;
const ret = {
histories: res.data,
companyName,
};
return ret;
} catch (e) {
// e ⇒ errorObjectに変換"
const error = createErrorObject(e);

View File

@ -4,6 +4,9 @@ import { ceil, floor } from "lodash";
export const selectOrderHisory = (state: RootState) =>
state.licenseOrderHistory.domain.orderHistories;
export const selectCompanyName = (state: RootState) =>
state.licenseOrderHistory.domain.companyName;
export const selectTotal = (state: RootState) =>
state.licenseOrderHistory.domain.total;

View File

@ -8,6 +8,7 @@ export interface LicenseOrderHistoryState {
export interface Domain {
total: number;
orderHistories: LicenseOrder[];
companyName: string;
}
export interface Apps {

View File

@ -0,0 +1,6 @@
import { GetOrderHistoriesResponse } from "../../../api/api";
export interface OrderHistoryView {
histories: GetOrderHistoriesResponse;
companyName: string;
}

View File

@ -6,7 +6,7 @@ import { ACCOUNTS_VIEW_LIMIT } from "./constants";
const initialState: PartnerLicensesState = {
domain: {
myAccountInfo: { accountId: 0 },
myAccountInfo: { accountId: 0, companyName: "" },
total: 0,
ownPartnerLicense: {
accountId: 0,

View File

@ -17,6 +17,9 @@ import {
selectOrderHisory,
selectTotal,
selectTotalPage,
selectOffset,
savePageInfo,
selectCompanyName,
} from "features/license/licenseOrderHistory";
import { selectSelectedRow } from "features/license/partnerLicense";
import undo from "../../assets/images/undo.svg";
@ -34,6 +37,7 @@ export const LicenseOrderHistory: React.FC<LicenseOrderHistoryProps> = (
const [t] = useTranslation();
const total = useSelector(selectTotal);
const totalPage = useSelector(selectTotalPage);
const offset = useSelector(selectOffset);
const currentPage = useSelector(selectCurrentPage);
const isLoading = useSelector(selectIsLoading);
const selectedRow = useSelector(selectSelectedRow);
@ -47,56 +51,25 @@ export const LicenseOrderHistory: React.FC<LicenseOrderHistoryProps> = (
}, [isLoading, onReturn]);
// ページネーションのボタンクリック時のアクション
const getFirstPage = useCallback(() => {
const movePage = (targetOffset: number) => {
dispatch(
getLicenseOrderHistoriesAsync({
limit: LIMIT_ORDER_HISORY_NUM,
offset: 0,
})
savePageInfo({ limit: LIMIT_ORDER_HISORY_NUM, offset: targetOffset })
);
}, [dispatch]);
const getLastPage = useCallback(() => {
const lastPageOffset = (totalPage - 1) * LIMIT_ORDER_HISORY_NUM;
dispatch(
getLicenseOrderHistoriesAsync({
limit: LIMIT_ORDER_HISORY_NUM,
offset: lastPageOffset,
})
);
}, [dispatch, totalPage]);
const getPrevPage = useCallback(() => {
const prevPageOffset = (currentPage - 2) * LIMIT_ORDER_HISORY_NUM;
dispatch(
getLicenseOrderHistoriesAsync({
limit: LIMIT_ORDER_HISORY_NUM,
offset: prevPageOffset,
})
);
}, [dispatch, currentPage]);
const getNextPage = useCallback(() => {
const nextPageOffset = currentPage * LIMIT_ORDER_HISORY_NUM;
dispatch(
getLicenseOrderHistoriesAsync({
limit: LIMIT_ORDER_HISORY_NUM,
offset: nextPageOffset,
})
);
}, [dispatch, currentPage]);
};
// apiからの値取得関係
const licenseOrderHistory = useSelector(selectOrderHisory);
const companyName = useSelector(selectCompanyName);
useEffect(() => {
dispatch(
getLicenseOrderHistoriesAsync({
limit: LIMIT_ORDER_HISORY_NUM,
offset: 0,
offset,
})
);
}, [dispatch]);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [dispatch, currentPage]);
return (
<div className={styles.wrap}>
@ -104,7 +77,7 @@ export const LicenseOrderHistory: React.FC<LicenseOrderHistoryProps> = (
<UpdateTokenTimer />
<main className={styles.main}>
<div className="">
<div>
<div className={styles.pageHeader}>
<h1 className={styles.pageTitle}>
{t(getTranslationID("orderHistoriesPage.label.title"))}
@ -112,13 +85,12 @@ export const LicenseOrderHistory: React.FC<LicenseOrderHistoryProps> = (
</div>
<section className={styles.license}>
<div>
<h2 className="">
{t(getTranslationID("orderHistoriesPage.label.subTitle"))}
<p className={styles.brCrumb}>
<img src={history} alt="" className={styles.tlIcon} />
{t(getTranslationID("orderHistoriesPage.label.orderHistory"))}
</p>
</h2>
<h2>{companyName}</h2>
<p className={styles.brCrumb}>
<img src={history} alt="" className={styles.tlIcon} />
{t(getTranslationID("orderHistoriesPage.label.orderHistory"))}
</p>
<ul className={styles.menuAction}>
<li>
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */}
@ -166,7 +138,7 @@ export const LicenseOrderHistory: React.FC<LicenseOrderHistoryProps> = (
// eslint-disable-next-line react/jsx-key
<tr>
<td>{x.orderDate}</td>
<td>{x.issueDate}</td>
<td>{x.issueDate ? x.issueDate : "-"}</td>
<td>{x.numberOfOrder}</td>
<td>{x.poNumber}</td>
<td>
@ -267,17 +239,19 @@ export const LicenseOrderHistory: React.FC<LicenseOrderHistoryProps> = (
/>
)}
{/** pagenation */}
<div className={styles.pagenation}>
<div className={`${styles.pagenation} ${styles.widthMid}`}>
<nav className={styles.pagenationNav}>
<span className={styles.pagenationTotal}>{`${total} ${t(
getTranslationID("orderHistoriesPage.label.title")
getTranslationID("orderHistoriesPage.label.histories")
)}`}</span>
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */}
<a
className={`${
!isLoading && currentPage !== 1 ? styles.isActive : ""
}`}
onClick={getFirstPage}
onClick={() => {
movePage(0);
}}
>
«
</a>
@ -286,11 +260,15 @@ export const LicenseOrderHistory: React.FC<LicenseOrderHistoryProps> = (
className={`${
!isLoading && currentPage !== 1 ? styles.isActive : ""
}`}
onClick={getPrevPage}
onClick={() => {
movePage((currentPage - 2) * LIMIT_ORDER_HISORY_NUM);
}}
>
</a>
{`${currentPage} of ${totalPage}`}
{` ${total !== 0 ? currentPage : 0} of ${
total !== 0 ? totalPage : 0
} `}
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions */}
<a
className={`${
@ -298,7 +276,9 @@ export const LicenseOrderHistory: React.FC<LicenseOrderHistoryProps> = (
? styles.isActive
: ""
}`}
onClick={getNextPage}
onClick={() => {
movePage(currentPage * LIMIT_ORDER_HISORY_NUM);
}}
>
</a>
@ -309,7 +289,9 @@ export const LicenseOrderHistory: React.FC<LicenseOrderHistoryProps> = (
? styles.isActive
: ""
}`}
onClick={getLastPage}
onClick={() => {
movePage((totalPage - 1) * LIMIT_ORDER_HISORY_NUM);
}}
>
»
</a>

View File

@ -331,8 +331,19 @@ _:-ms-lang(x)::-ms-backdrop,
color: #999999;
}
h2,
h3 {
display: inline-block;
max-width: 72%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
vertical-align: bottom;
}
h2 .brCrumb,
h3 .brCrumb {
h2 + .brCrumb,
h3 .brCrumb,
h3 + .brCrumb {
display: inline;
margin-left: 1rem;
font-size: 1.5rem;
@ -341,11 +352,15 @@ h3 .brCrumb {
font-weight: normal;
}
h2 .brCrumb::before,
h3 .brCrumb::before {
h2 + .brCrumb::before,
h3 .brCrumb::before,
h3 + .brCrumb::before {
content: "-";
}
h2 .brCrumb .tlIcon,
h3 .brCrumb .tlIcon {
h2 + .brCrumb .tlIcon,
h3 .brCrumb .tlIcon,
h3 + .brCrumb .tlIcon {
width: 1.6rem;
margin: 0 0.2rem 0 0.5rem;
vertical-align: text-top;
@ -1550,6 +1565,9 @@ _:-ms-lang(x)::-ms-backdrop,
padding: 0.3rem 0.5rem 0.3rem 0.5rem;
opacity: 0;
}
.menuAction.inTable .menuLink .menuIcon {
width: 1.2rem;
}
.menuAction.inTable .menuLink.isActive {
opacity: 1;
}

View File

@ -203,5 +203,6 @@ declare const classNames: {
readonly txNormal: "txNormal";
readonly txIcon: "txIcon";
readonly txWswrap: "txWswrap";
readonly widthMid: "widthMid";
};
export = classNames;

View File

@ -322,7 +322,8 @@
"orderCanceled": "(de)Order Canceled",
"issue": "(de)Issue",
"issueCancel": "(de)Issue Cancel",
"orderCancel": "(de)Order Cancel"
"orderCancel": "(de)Order Cancel",
"histories": "(de)histories"
}
}
}

View File

@ -322,7 +322,8 @@
"orderCanceled": "Order Canceled",
"issue": "Issue",
"issueCancel": "Issue Cancel",
"orderCancel": "Order Cancel"
"orderCancel": "Order Cancel",
"histories": "histories"
}
}
}

View File

@ -322,7 +322,8 @@
"orderCanceled": "(es)Order Canceled",
"issue": "(es)Issue",
"issueCancel": "(es)Issue Cancel",
"orderCancel": "(es)Order Cancel"
"orderCancel": "(es)Order Cancel",
"histories": "(es)histories"
}
}
}

View File

@ -322,7 +322,8 @@
"orderCanceled": "(fr)Order Canceled",
"issue": "(fr)Issue",
"issueCancel": "(fr)Issue Cancel",
"orderCancel": "(fr)Order Cancel"
"orderCancel": "(fr)Order Cancel",
"histories": "(fr)histories"
}
}
}

View File

@ -1981,8 +1981,11 @@
},
"Account": {
"type": "object",
"properties": { "accountId": { "type": "number" } },
"required": ["accountId"]
"properties": {
"accountId": { "type": "number" },
"companyName": { "type": "string" }
},
"required": ["accountId", "companyName"]
},
"GetMyAccountResponse": {
"type": "object",

View File

@ -165,12 +165,8 @@ export class AccountsController {
const accessToken = retrieveAuthorizationToken(req);
const payload = jwt.decode(accessToken, { json: true }) as AccessToken;
//アカウントID取得処理
const accountId = await this.accountService.getMyAccountInfo(payload);
return {
account: {
accountId: accountId,
},
};
const accountInfo = await this.accountService.getMyAccountInfo(payload);
return accountInfo;
}
@ApiResponse({

View File

@ -22,6 +22,7 @@ import {
PartnerLicenseInfo,
GetOrderHistoriesResponse,
LicenseOrder,
GetMyAccountResponse,
} from './types/types';
import { DateWithZeroTime } from '../licenses/types/types';
import { GetLicenseSummaryResponse, Typist } from './types/types';
@ -30,6 +31,7 @@ import { UserNotFoundError } from '../../repositories/users/errors/types';
import { UserGroupsRepositoryService } from '../../repositories/user_groups/user_groups.repository.service';
import { makePassword } from '../../common/password';
import { LicensesRepositoryService } from '../../repositories/licenses/licenses.repository.service';
import { AccountNotFoundError } from '../../repositories/accounts/errors/types';
@Injectable()
export class AccountsService {
constructor(
@ -215,7 +217,7 @@ export class AccountsService {
* @param token
* @returns accountId
*/
async getMyAccountInfo(token: AccessToken): Promise<number> {
async getMyAccountInfo(token: AccessToken): Promise<GetMyAccountResponse> {
this.logger.log(`[IN] ${this.getMyAccountInfo.name}`);
let userInfo: User;
@ -236,8 +238,33 @@ export class AccountsService {
}
}
let accountInfo: Account;
try {
accountInfo = await this.accountRepository.findAccountById(
userInfo.account_id,
);
} catch (e) {
switch (e.constructor) {
case AccountNotFoundError:
throw new HttpException(
makeErrorResponse('E010501'),
HttpStatus.BAD_REQUEST,
);
default:
throw new HttpException(
makeErrorResponse('E009999'),
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
this.logger.log(`[OUT] ${this.getMyAccountInfo.name}`);
return userInfo.account_id;
return {
account: {
accountId: userInfo.account_id,
companyName: accountInfo.company_name,
}
};
}
async getTypistGroups(externalId: string): Promise<TypistGroup[]> {

View File

@ -81,6 +81,8 @@ export class GetLicenseSummaryResponse {
export class Account {
@ApiProperty()
accountId: number;
@ApiProperty()
companyName: string;
}
export class GetMyAccountResponse {