Merge branch 'develop'
This commit is contained in:
commit
8b2613b9f6
@ -18,7 +18,8 @@ export const makePassword = (): string => {
|
||||
let autoGeneratedPassword: string = "";
|
||||
|
||||
while (!valid) {
|
||||
// パスワードをランダムに決定
|
||||
autoGeneratedPassword = "";
|
||||
// パスワードをランダムに決定+
|
||||
while (autoGeneratedPassword.length < passLength) {
|
||||
// 上で決定したcharsの中からランダムに1文字ずつ追加
|
||||
const index = Math.floor(Math.random() * chars.length);
|
||||
@ -30,6 +31,11 @@ export const makePassword = (): string => {
|
||||
valid =
|
||||
autoGeneratedPassword.length == passLength &&
|
||||
charaTypePattern.test(autoGeneratedPassword);
|
||||
if (!valid) {
|
||||
// autoGeneratedPasswordをログに出す
|
||||
console.log("Password is not valid");
|
||||
console.log(autoGeneratedPassword);
|
||||
}
|
||||
}
|
||||
return autoGeneratedPassword;
|
||||
};
|
||||
|
||||
@ -79,6 +79,7 @@ export class AccountsService {
|
||||
HttpStatus.INTERNAL_SERVER_ERROR
|
||||
);
|
||||
}
|
||||
this.logger.log("idpにユーザーを作成成功");
|
||||
|
||||
// メールアドレス重複エラー
|
||||
if (isConflictError(externalUser)) {
|
||||
@ -90,6 +91,7 @@ export class AccountsService {
|
||||
HttpStatus.BAD_REQUEST
|
||||
);
|
||||
}
|
||||
this.logger.log("メールアドレスは重複していません");
|
||||
|
||||
let account: Account;
|
||||
let user: User;
|
||||
@ -138,6 +140,7 @@ export class AccountsService {
|
||||
account.id,
|
||||
country
|
||||
);
|
||||
this.logger.log("コンテナー作成成功");
|
||||
} catch (e) {
|
||||
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
|
||||
this.logger.error(
|
||||
|
||||
@ -106,8 +106,10 @@ export class RegisterController {
|
||||
}
|
||||
|
||||
for (const AccountsFile of accountsObject) {
|
||||
this.logger.log("ランダムパスワード生成開始");
|
||||
// ランダムなパスワードを生成する
|
||||
const ramdomPassword = makePassword();
|
||||
this.logger.log("ランダムパスワード生成完了");
|
||||
// roleの設定
|
||||
// roleの値がnullなら"none"、null以外ならroleの値、
|
||||
// また、roleの値が"author"なら"author"を設定
|
||||
@ -123,6 +125,7 @@ export class RegisterController {
|
||||
// ありえないが、roleの値が"none"または"author"の文字列以外の場合はエラーを返す
|
||||
throw new Error("Invalid role value");
|
||||
}
|
||||
this.logger.log("account生成開始");
|
||||
await this.accountsService.createAccount(
|
||||
context,
|
||||
AccountsFile.companyName,
|
||||
|
||||
@ -73,7 +73,8 @@ export class TransferController {
|
||||
const matchList = line.match(regExp);
|
||||
if (matchList) {
|
||||
matchList.forEach((match) => {
|
||||
const replaced = match.replace(/,/g, " ");
|
||||
// カンマを\に変換
|
||||
const replaced = match.replace(/,/g, "\\");
|
||||
line = line.replace(match, replaced);
|
||||
});
|
||||
}
|
||||
@ -95,49 +96,50 @@ export class TransferController {
|
||||
HttpStatus.BAD_REQUEST
|
||||
);
|
||||
}
|
||||
|
||||
csvInputFile.push({
|
||||
type: data[0],
|
||||
account_id: data[1],
|
||||
parent_id: data[2],
|
||||
email: data[3],
|
||||
company_name: data[4],
|
||||
first_name: data[5],
|
||||
last_name: data[6],
|
||||
country: data[7],
|
||||
state: data[8],
|
||||
start_date: data[9],
|
||||
expired_date: data[10],
|
||||
user_email: data[11],
|
||||
author_id: data[12],
|
||||
recording_mode: data[13],
|
||||
wt1: data[14],
|
||||
wt2: data[15],
|
||||
wt3: data[16],
|
||||
wt4: data[17],
|
||||
wt5: data[18],
|
||||
wt6: data[19],
|
||||
wt7: data[20],
|
||||
wt8: data[21],
|
||||
wt9: data[22],
|
||||
wt10: data[23],
|
||||
wt11: data[24],
|
||||
wt12: data[25],
|
||||
wt13: data[26],
|
||||
wt14: data[27],
|
||||
wt15: data[28],
|
||||
wt16: data[29],
|
||||
wt17: data[30],
|
||||
wt18: data[31],
|
||||
wt19: data[32],
|
||||
wt20: data[33],
|
||||
});
|
||||
// data[1]がundefinedの場合、配列には格納しない
|
||||
if (data[1] !== undefined) {
|
||||
// バックスラッシュをカンマに戻す
|
||||
data.forEach((value, index) => {
|
||||
data[index] = value.replace(/\\/g, ",");
|
||||
});
|
||||
csvInputFile.push({
|
||||
type: data[0],
|
||||
account_id: data[1],
|
||||
parent_id: data[2],
|
||||
email: data[3],
|
||||
company_name: data[4],
|
||||
first_name: data[5],
|
||||
last_name: data[6],
|
||||
country: data[7],
|
||||
state: data[8],
|
||||
start_date: data[9],
|
||||
expired_date: data[10],
|
||||
user_email: data[11],
|
||||
author_id: data[12],
|
||||
recording_mode: data[13],
|
||||
wt1: data[14],
|
||||
wt2: data[15],
|
||||
wt3: data[16],
|
||||
wt4: data[17],
|
||||
wt5: data[18],
|
||||
wt6: data[19],
|
||||
wt7: data[20],
|
||||
wt8: data[21],
|
||||
wt9: data[22],
|
||||
wt10: data[23],
|
||||
wt11: data[24],
|
||||
wt12: data[25],
|
||||
wt13: data[26],
|
||||
wt14: data[27],
|
||||
wt15: data[28],
|
||||
wt16: data[29],
|
||||
wt17: data[30],
|
||||
wt18: data[31],
|
||||
wt19: data[32],
|
||||
wt20: data[33],
|
||||
});
|
||||
}
|
||||
});
|
||||
// 最後の行がundefinedの場合はその行を削除
|
||||
if (csvInputFile[csvInputFile.length - 1].account_id === undefined) {
|
||||
csvInputFile.pop();
|
||||
}
|
||||
|
||||
// 各データのバリデーションチェック
|
||||
await this.transferService.validateInputData(context, csvInputFile);
|
||||
|
||||
@ -153,12 +155,12 @@ export class TransferController {
|
||||
// アカウントID numberとstring対応表の出力
|
||||
const accountsMappingFiles: AccountsMappingFile[] = [];
|
||||
accountIdMap.forEach((value, key) => {
|
||||
const accountsMappingFile = new AccountsMappingFile();
|
||||
const accountsMappingFile = new AccountsMappingFile();
|
||||
accountsMappingFile.accountIdNumber = value;
|
||||
accountsMappingFile.accountIdText = key
|
||||
accountsMappingFiles.push(accountsMappingFile)
|
||||
accountsMappingFile.accountIdText = key;
|
||||
accountsMappingFiles.push(accountsMappingFile);
|
||||
});
|
||||
|
||||
|
||||
fs.writeFileSync(
|
||||
`${inputFilePath}account_map.json`,
|
||||
JSON.stringify(accountsMappingFiles)
|
||||
@ -188,6 +190,14 @@ export class TransferController {
|
||||
LicensesFile
|
||||
);
|
||||
|
||||
// AuthorIDが重複している場合通番を付与する
|
||||
const transferDuplicateAuthorResultUsers =
|
||||
await this.transferService.transferDuplicateAuthor(
|
||||
context,
|
||||
resultDuplicateEmail.accountsFileLines,
|
||||
resultDuplicateEmail.usersFileLines
|
||||
);
|
||||
|
||||
// transferResponseCsvを4つのJSONファイルの出力する(出力先はinputと同じにする)
|
||||
const outputFilePath = body.inputFilePath;
|
||||
const WorktypesFile = transferResponseCsv.worktypesFileLines;
|
||||
@ -195,7 +205,7 @@ export class TransferController {
|
||||
context,
|
||||
outputFilePath,
|
||||
resultDuplicateEmail.accountsFileLines,
|
||||
resultDuplicateEmail.usersFileLines,
|
||||
transferDuplicateAuthorResultUsers,
|
||||
resultDuplicateEmail.licensesFileLines,
|
||||
WorktypesFile
|
||||
);
|
||||
|
||||
@ -54,6 +54,12 @@ export class TransferService {
|
||||
let userIdIndex = 0;
|
||||
// authorIdとuserIdの対応関係を保持するMapを定義
|
||||
const authorIdToUserIdMap: Map<string, number> = new Map();
|
||||
|
||||
// countryのリストを生成
|
||||
const countryAccounts = csvInputFile.filter(
|
||||
(item) => item.type === "Country"
|
||||
);
|
||||
|
||||
// csvInputFileを一行読み込みする
|
||||
csvInputFile.forEach((line) => {
|
||||
// typeが"USER"以外の場合、アカウントデータの作成を行う
|
||||
@ -63,8 +69,13 @@ export class TransferService {
|
||||
(country) => country.label === line.country
|
||||
)?.value;
|
||||
// adminNameの変換(last_name + " "+ first_name)
|
||||
const adminName = `${line.last_name} ${line.first_name}`;
|
||||
|
||||
// もしline.last_nameとline.first_nameが存在しない場合、line.admin_mailをnameにする
|
||||
let adminName = line.email;
|
||||
if (line.last_name && line.first_name) {
|
||||
adminName = `${line.last_name} ${line.first_name}`;
|
||||
// スペースが前後に入っている場合があるのでTrimする
|
||||
adminName = adminName.trim();
|
||||
}
|
||||
// ランダムパスワードの生成(データ登録ツール側で行うのでやらない)
|
||||
// common/password/password.tsのmakePasswordを使用
|
||||
// const autoGeneratedPassword = makePassword();
|
||||
@ -100,8 +111,13 @@ export class TransferService {
|
||||
authorId: null,
|
||||
});
|
||||
} else {
|
||||
// typeが"USER"の場合
|
||||
if (line.type == MIGRATION_TYPE.USER) {
|
||||
// typeが"USER"の場合、かつcountryのアカウントIDに所属していない場合
|
||||
if (
|
||||
line.type == MIGRATION_TYPE.USER &&
|
||||
!countryAccounts.some(
|
||||
(countryAccount) => countryAccount.account_id === line.account_id
|
||||
)
|
||||
) {
|
||||
// line.author_idが存在する場合のみユーザーデータを作成する
|
||||
if (line.author_id) {
|
||||
// userIdIndexをインクリメントする
|
||||
@ -224,46 +240,38 @@ export class TransferService {
|
||||
const relocatedAccounts: AccountsFile[] = [];
|
||||
const dealerRecords: Map<number, number> = new Map();
|
||||
|
||||
// accountsFileTypeをループ
|
||||
accountsFileType.forEach((account) => {
|
||||
// Distributorの場合はdealerを検索し、COUNTRYかチェックする
|
||||
if (account.type === MIGRATION_TYPE.DISTRIBUTOR) {
|
||||
const distributorParent = accountsFileType.find(
|
||||
(a) => a.accountId === account.dealerAccountId
|
||||
);
|
||||
if (distributorParent.type === MIGRATION_TYPE.COUNTRY) {
|
||||
dealerRecords.set(
|
||||
account.accountId,
|
||||
distributorParent.dealerAccountId // Countryの親、BCのIDを設定
|
||||
);
|
||||
const countryAccounts = accountsFileType.filter(
|
||||
(item) => item.type === MIGRATION_TYPE.COUNTRY
|
||||
);
|
||||
|
||||
const notCountryAccounts = accountsFileType.filter(
|
||||
(item) => item.type !== MIGRATION_TYPE.COUNTRY
|
||||
);
|
||||
|
||||
notCountryAccounts.forEach((notCountryAccount) => {
|
||||
let assignDealerAccountId = notCountryAccount.dealerAccountId;
|
||||
// 親アカウントIDがcountryの場合、countryの親アカウントIDを設定する
|
||||
for (const countryAccount of countryAccounts) {
|
||||
if (countryAccount.accountId === notCountryAccount.dealerAccountId) {
|
||||
assignDealerAccountId = countryAccount.dealerAccountId;
|
||||
}
|
||||
} else {
|
||||
dealerRecords.set(account.accountId, account.dealerAccountId);
|
||||
}
|
||||
});
|
||||
|
||||
// AccountsFileTypeのループを行い、階層情報の置換と新たな配列へのpushを行う
|
||||
accountsFileType.forEach((account) => {
|
||||
// Countryのレコードは除外する
|
||||
if (account.type !== MIGRATION_TYPE.COUNTRY) {
|
||||
const dealerAccountId =
|
||||
dealerRecords.get(account.accountId) ?? account.dealerAccountId;
|
||||
const type = this.getAccountType(account.type);
|
||||
const newAccount: AccountsFile = {
|
||||
accountId: account.accountId,
|
||||
type: type,
|
||||
companyName: account.companyName,
|
||||
country: account.country,
|
||||
dealerAccountId: dealerAccountId,
|
||||
adminName: account.adminName,
|
||||
adminMail: account.adminMail,
|
||||
userId: account.userId,
|
||||
role: account.role,
|
||||
authorId: account.authorId,
|
||||
};
|
||||
const assignType = this.getAccountType(notCountryAccount.type);
|
||||
|
||||
relocatedAccounts.push(newAccount);
|
||||
}
|
||||
const newAccount: AccountsFile = {
|
||||
accountId: notCountryAccount.accountId,
|
||||
type: assignType,
|
||||
companyName: notCountryAccount.companyName,
|
||||
country: notCountryAccount.country,
|
||||
dealerAccountId: assignDealerAccountId,
|
||||
adminName: notCountryAccount.adminName,
|
||||
adminMail: notCountryAccount.adminMail,
|
||||
userId: notCountryAccount.userId,
|
||||
role: notCountryAccount.role,
|
||||
authorId: notCountryAccount.authorId,
|
||||
};
|
||||
relocatedAccounts.push(newAccount);
|
||||
});
|
||||
|
||||
return relocatedAccounts;
|
||||
@ -359,6 +367,8 @@ export class TransferService {
|
||||
);
|
||||
|
||||
try {
|
||||
// エラー配列を定義
|
||||
let errorArray: string[] = [];
|
||||
// アカウントに対するworktypeのMap配列を作成する
|
||||
const accountWorktypeMap = new Map<string, string[]>();
|
||||
// csvInputFileのバリデーションチェックを行う
|
||||
@ -378,6 +388,13 @@ export class TransferService {
|
||||
HttpStatus.BAD_REQUEST
|
||||
);
|
||||
}
|
||||
// typeがUSER以外の場合で、countryがnullの場合エラー配列に格納する
|
||||
if (line.type !== MIGRATION_TYPE.USER) {
|
||||
if (!line.country) {
|
||||
// countryがnullの場合エラー配列に格納する
|
||||
errorArray.push(`country is null. index=${index}`);
|
||||
}
|
||||
}
|
||||
// countryのバリデーションチェック
|
||||
if (line.country) {
|
||||
if (!COUNTRY_LIST.find((country) => country.label === line.country)) {
|
||||
@ -446,6 +463,15 @@ export class TransferService {
|
||||
}
|
||||
}
|
||||
});
|
||||
// エラー配列に値が存在する場合はエラーファイルを出力する
|
||||
if (errorArray.length > 0) {
|
||||
const errorFileJson = JSON.stringify(errorArray);
|
||||
fs.writeFileSync(`error.json`, errorFileJson);
|
||||
throw new HttpException(
|
||||
`errorArray is invalid. errorArray=${errorArray}`,
|
||||
HttpStatus.BAD_REQUEST
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
|
||||
throw new HttpException(
|
||||
@ -598,4 +624,74 @@ export class TransferService {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* transferDuplicateAuthor
|
||||
* @param accountsFileLines: AccountsFile[]
|
||||
* @param usersFileLines: UsersFile[]
|
||||
* @returns UsersFile[]
|
||||
*/
|
||||
async transferDuplicateAuthor(
|
||||
context: Context,
|
||||
accountsFileLines: AccountsFile[],
|
||||
usersFileLines: UsersFile[]
|
||||
): Promise<UsersFile[]> {
|
||||
// パラメータ内容が長大なのでログには出さない
|
||||
this.logger.log(
|
||||
`[IN] [${context.getTrackingId()}] ${this.transferDuplicateAuthor.name}`
|
||||
);
|
||||
|
||||
try {
|
||||
const newUsersFileLines: UsersFile[] = [];
|
||||
|
||||
for (const accountsFileLine of accountsFileLines) {
|
||||
let duplicateSequence: number = 2;
|
||||
let authorIdList: String[] = [];
|
||||
|
||||
// メールアドレス重複時はアカウントにもAuthorIdが設定されるので重複チェック用のリストに追加しておく
|
||||
if (accountsFileLine.authorId) {
|
||||
authorIdList.push(accountsFileLine.authorId);
|
||||
}
|
||||
|
||||
const targetaccountUsers = usersFileLines.filter(
|
||||
(item) => item.accountId === accountsFileLine.accountId
|
||||
);
|
||||
|
||||
for (const targetaccountUser of targetaccountUsers) {
|
||||
let assignAuthorId = targetaccountUser.authorId;
|
||||
if (authorIdList.includes(targetaccountUser.authorId)) {
|
||||
// 同じauthorIdがいる場合、自分のauthorIdに連番を付与する
|
||||
assignAuthorId = assignAuthorId + duplicateSequence;
|
||||
duplicateSequence = duplicateSequence + 1;
|
||||
}
|
||||
authorIdList.push(targetaccountUser.authorId);
|
||||
|
||||
// 新しいAuthorIdのユーザに詰め替え
|
||||
const newUser: UsersFile = {
|
||||
accountId: targetaccountUser.accountId,
|
||||
userId: targetaccountUser.userId,
|
||||
name: targetaccountUser.name,
|
||||
role: targetaccountUser.role,
|
||||
authorId: assignAuthorId,
|
||||
email: targetaccountUser.email,
|
||||
};
|
||||
newUsersFileLines.push(newUser);
|
||||
}
|
||||
}
|
||||
|
||||
return newUsersFileLines;
|
||||
} catch (e) {
|
||||
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
|
||||
throw new HttpException(
|
||||
makeErrorResponse("E009999"),
|
||||
HttpStatus.INTERNAL_SERVER_ERROR
|
||||
);
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${
|
||||
this.transferDuplicateAuthor.name
|
||||
}`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,6 +74,9 @@ export class UsersService {
|
||||
accountId,
|
||||
authorId
|
||||
);
|
||||
this.logger.log(
|
||||
`[${context.getTrackingId()}] isAuthorIdDuplicated=${isAuthorIdDuplicated}`
|
||||
);
|
||||
} catch (e) {
|
||||
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
|
||||
throw new HttpException(
|
||||
@ -88,9 +91,10 @@ export class UsersService {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
this.logger.log("ランダムパスワード生成開始");
|
||||
// ランダムなパスワードを生成する
|
||||
const ramdomPassword = makePassword();
|
||||
this.logger.log("ランダムパスワード生成完了");
|
||||
|
||||
//Azure AD B2Cにユーザーを新規登録する
|
||||
let externalUser: { sub: string } | ConflictError;
|
||||
|
||||
@ -53,9 +53,11 @@ export class VerificationService {
|
||||
// 件数情報の取得
|
||||
this.logger.log(`入力ファイルから件数情報を取得する`);
|
||||
|
||||
const accountCountFromFile = csvInputFiles.filter(
|
||||
const accountFromFile = csvInputFiles.filter(
|
||||
(item) => item.type !== "USER" && item.type !== "Country"
|
||||
).length;
|
||||
);
|
||||
const accountCountFromFile = accountFromFile.length;
|
||||
|
||||
const cardLicensesCountFromFile = cardlicensesInputFiles.length;
|
||||
|
||||
const licensesCountFromFile =
|
||||
@ -66,18 +68,35 @@ export class VerificationService {
|
||||
|
||||
// 管理ユーザ数のカウント
|
||||
const administratorCountFromFile = accountCountFromFile;
|
||||
|
||||
// 一般ユーザ数のカウント
|
||||
const normaluserCountFromFile = csvInputFiles.filter(
|
||||
(item) => item.type === "USER" && item.user_email.length !== 0
|
||||
).length;
|
||||
// countryのアカウントに所属するユーザをカウント対象外とする
|
||||
const countryAccountFromFile = csvInputFiles.filter(
|
||||
(item) => item.type === "Country"
|
||||
);
|
||||
|
||||
// USER、かつuser_emailが設定なし、かつcountryのアカウントID以外をユーザとする
|
||||
const normaluserFromFile = csvInputFiles.filter(
|
||||
(item) =>
|
||||
item.type === "USER" &&
|
||||
item.user_email.length !== 0 &&
|
||||
!countryAccountFromFile.some(
|
||||
(countryItem) => countryItem.account_id === item.account_id
|
||||
)
|
||||
);
|
||||
|
||||
const normaluserCountFromFile = normaluserFromFile.length;
|
||||
|
||||
// ユーザ重複数のカウント
|
||||
let mailAdresses: string[] = [];
|
||||
csvInputFiles.forEach((item) => {
|
||||
// メールアドレスの要素を配列に追加(入力データとして管理者とユーザの両方に入ることはない)
|
||||
accountFromFile.forEach((item) => {
|
||||
// メールアドレスの要素を配列に追加
|
||||
if (item.email.length !== 0) {
|
||||
mailAdresses.push(item.email);
|
||||
}
|
||||
});
|
||||
normaluserFromFile.forEach((item) => {
|
||||
// メールアドレスの要素を配列に追加
|
||||
if (item.user_email.length !== 0) {
|
||||
mailAdresses.push(item.user_email);
|
||||
}
|
||||
@ -232,7 +251,11 @@ export class VerificationService {
|
||||
}
|
||||
|
||||
// dateを任意のフォーマットに変換する
|
||||
const getFormattedDate = (date: Date | null, format: string) => {
|
||||
const getFormattedDate = (
|
||||
date: Date | null,
|
||||
format: string,
|
||||
padHours: boolean = false // trueの場合、hhについてゼロパディングする(00→0、01→1、23→23)
|
||||
) => {
|
||||
if (!date) {
|
||||
return null;
|
||||
}
|
||||
@ -244,9 +267,13 @@ const getFormattedDate = (date: Date | null, format: string) => {
|
||||
s: date.getSeconds(),
|
||||
};
|
||||
|
||||
// hhの値をゼロパディングするかどうかのフラグを確認
|
||||
const hourSymbol = padHours ? "hh" : "h";
|
||||
|
||||
const formatted = format.replace(/(M+|d+|h+|m+|s+)/g, (v) =>
|
||||
(
|
||||
(v.length > 1 ? "0" : "") + symbol[v.slice(-1) as keyof typeof symbol]
|
||||
(v.length > 1 && v !== hourSymbol ? "0" : "") +
|
||||
symbol[v.slice(-1) as keyof typeof symbol]
|
||||
).slice(-2)
|
||||
);
|
||||
|
||||
@ -542,12 +569,15 @@ function compareLicenses(
|
||||
VerificationResultDetails.push(VerificationResultDetailsOne);
|
||||
isNoError = false;
|
||||
}
|
||||
|
||||
// expiry_dateについて、時はゼロパディングした値で比較する(×01~09 ○1~9)
|
||||
if (
|
||||
!licensesFromDatabase[i] ||
|
||||
licensesFromFile[i].expired_date !==
|
||||
getFormattedDate(
|
||||
licensesFromDatabase[i].expiry_date,
|
||||
`yyyy/MM/dd hh:mm:ss`
|
||||
`yyyy/MM/dd hh:mm:ss`,
|
||||
true
|
||||
)
|
||||
) {
|
||||
const VerificationResultDetailsOne: VerificationResultDetails = {
|
||||
@ -559,7 +589,8 @@ function compareLicenses(
|
||||
databaseData: licensesFromDatabase[i]
|
||||
? getFormattedDate(
|
||||
licensesFromDatabase[i].expiry_date,
|
||||
`yyyy/MM/dd hh:mm:ss`
|
||||
`yyyy/MM/dd hh:mm:ss`,
|
||||
true
|
||||
)
|
||||
: "undifined",
|
||||
reason: "内容不一致",
|
||||
|
||||
@ -64,41 +64,57 @@ export class AdB2cService {
|
||||
this.logger.log(
|
||||
`[IN] [${context.getTrackingId()}] ${this.createUser.name}`
|
||||
);
|
||||
try {
|
||||
// ユーザをADB2Cに登録
|
||||
const newUser = await this.graphClient.api("users/").post({
|
||||
accountEnabled: true,
|
||||
displayName: username,
|
||||
passwordPolicies: "DisableStrongPassword",
|
||||
passwordProfile: {
|
||||
forceChangePasswordNextSignIn: false,
|
||||
password: password,
|
||||
},
|
||||
identities: [
|
||||
{
|
||||
signinType: ADB2C_SIGN_IN_TYPE.EMAILADDRESS,
|
||||
issuer: `${this.tenantName}.onmicrosoft.com`,
|
||||
issuerAssignedId: email,
|
||||
|
||||
const retryCount: number = 3;
|
||||
let retry = 0;
|
||||
|
||||
while (retry < retryCount) {
|
||||
try {
|
||||
// ユーザをADB2Cに登録
|
||||
const newUser = await this.graphClient.api("users/").post({
|
||||
accountEnabled: true,
|
||||
displayName: username,
|
||||
passwordPolicies: "DisableStrongPassword",
|
||||
passwordProfile: {
|
||||
forceChangePasswordNextSignIn: false,
|
||||
password: password,
|
||||
},
|
||||
],
|
||||
});
|
||||
return { sub: newUser.id };
|
||||
} catch (e) {
|
||||
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
|
||||
if (e?.statusCode === 400 && e?.body) {
|
||||
const error = JSON.parse(e.body);
|
||||
identities: [
|
||||
{
|
||||
signinType: ADB2C_SIGN_IN_TYPE.EMAILADDRESS,
|
||||
issuer: `${this.tenantName}.onmicrosoft.com`,
|
||||
issuerAssignedId: email,
|
||||
},
|
||||
],
|
||||
});
|
||||
this.logger.log(
|
||||
`[${context.getTrackingId()}] [ADB2C CREATE] newUser: ${newUser}`
|
||||
);
|
||||
return { sub: newUser.id };
|
||||
} catch (e) {
|
||||
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
|
||||
|
||||
if (e?.statusCode === 400 && e?.body) {
|
||||
const error = JSON.parse(e.body);
|
||||
|
||||
// エラーが競合エラーである場合は、メールアドレス重複としてエラーを返す
|
||||
if (error?.details?.find((x) => x.code === "ObjectConflict")) {
|
||||
return { reason: "email", message: "ObjectConflict" };
|
||||
// エラーが競合エラーである場合は、メールアドレス重複としてエラーを返す
|
||||
if (error?.details?.find((x) => x.code === "ObjectConflict")) {
|
||||
return { reason: "email", message: "ObjectConflict" };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
throw e;
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.createUser.name}`
|
||||
);
|
||||
if (++retry < retryCount) {
|
||||
this.logger.log(`ADB2Cエラー発生。5秒sleepしてリトライします (${retry}/${retryCount})...`);
|
||||
await new Promise(resolve => setTimeout(resolve, 5000));
|
||||
} else {
|
||||
this.logger.log(`リトライ数が上限に達したのでエラーを返却します`);
|
||||
throw e;
|
||||
}
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.createUser.name}`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -17,7 +17,16 @@ const App = (): JSX.Element => {
|
||||
const { instance } = useMsal();
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const [t, i18n] = useTranslation();
|
||||
|
||||
useEffect(() => {
|
||||
// すべてのリクエストのヘッダーにX-Requested-Withを追加
|
||||
globalAxios.interceptors.request.use((config) => {
|
||||
// headersがあれば追加、なければ新規作成
|
||||
config.headers = config.headers || {};
|
||||
// X-Requested-Withを追加
|
||||
config.headers["X-Requested-With"] = "XMLHttpRequest";
|
||||
return config;
|
||||
});
|
||||
const id = globalAxios.interceptors.response.use(
|
||||
(response: AxiosResponse) => response,
|
||||
(e: AxiosError<{ code?: string }>) => {
|
||||
|
||||
@ -54,6 +54,7 @@ export const errorCodes = [
|
||||
"E010809", // ライセンス発行キャンセル不可エラー(ステータスが変えられている場合)
|
||||
"E010810", // ライセンス発行キャンセル不可エラー(発行から一定期間経過した場合)
|
||||
"E010811", // ライセンス発行キャンセル不可エラー(発行したライセンスが割り当てされている場合)
|
||||
"E010812", // ライセンス未割当エラー
|
||||
"E010908", // タイピストグループ不在エラー
|
||||
"E010909", // タイピストグループ名重複エラー
|
||||
"E011001", // ワークタイプ重複エラー
|
||||
|
||||
@ -343,6 +343,30 @@ export const playbackAsync = createAsyncThunk<
|
||||
);
|
||||
return thunkApi.rejectWithValue({ error });
|
||||
}
|
||||
// ライセンスの有効期限が切れている場合
|
||||
if (error.code === "E010805") {
|
||||
thunkApi.dispatch(
|
||||
openSnackbar({
|
||||
level: "error",
|
||||
message: getTranslationID(
|
||||
"dictationPage.message.licenseExpiredError"
|
||||
),
|
||||
})
|
||||
);
|
||||
return thunkApi.rejectWithValue({ error });
|
||||
}
|
||||
// ライセンスが未割当の場合
|
||||
if (error.code === "E010812") {
|
||||
thunkApi.dispatch(
|
||||
openSnackbar({
|
||||
level: "error",
|
||||
message: getTranslationID(
|
||||
"dictationPage.message.licenseNotAssignedError"
|
||||
),
|
||||
})
|
||||
);
|
||||
return thunkApi.rejectWithValue({ error });
|
||||
}
|
||||
|
||||
thunkApi.dispatch(
|
||||
openSnackbar({
|
||||
|
||||
@ -61,6 +61,9 @@ export const partnerLicenseSlice = createSlice({
|
||||
const { deleteCount } = action.payload;
|
||||
state.apps.hierarchicalElements.splice(-deleteCount);
|
||||
},
|
||||
clearHierarchicalElement: (state) => {
|
||||
state.apps.hierarchicalElements = [];
|
||||
},
|
||||
changeSelectedRow: (
|
||||
state,
|
||||
action: PayloadAction<{ value?: PartnerLicenseInfo }>
|
||||
@ -110,6 +113,7 @@ export const {
|
||||
pushHierarchicalElement,
|
||||
popHierarchicalElement,
|
||||
spliceHierarchicalElement,
|
||||
clearHierarchicalElement,
|
||||
changeSelectedRow,
|
||||
savePageInfo,
|
||||
} = partnerLicenseSlice.actions;
|
||||
|
||||
@ -1424,9 +1424,10 @@ const DictationPage: React.FC = (): JSX.Element => {
|
||||
<li className={styles.alignLeft}>
|
||||
<a
|
||||
// TODO: 将来的に正式なURLに変更する
|
||||
href="/dictations"
|
||||
href="https://download.omsystem.com/pages/odms_download/odms_cloud_desktop/en/"
|
||||
className={`${styles.menuLink} ${styles.isActive}`}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
{t(getTranslationID("dictationPage.label.applications"))}
|
||||
<img
|
||||
|
||||
@ -2,6 +2,10 @@ import React, { useState, useCallback, useEffect } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { AppDispatch } from "app/store";
|
||||
import { useDispatch, useSelector } from "react-redux";
|
||||
import {
|
||||
clearHierarchicalElement,
|
||||
getMyAccountAsync,
|
||||
} from "features/license/partnerLicense";
|
||||
import styles from "../../styles/app.module.scss";
|
||||
import { getTranslationID } from "../../translation";
|
||||
import close from "../../assets/images/close.svg";
|
||||
@ -92,6 +96,8 @@ export const CardLicenseIssuePopup: React.FC<CardLicenseIssuePopupProps> = (
|
||||
setIsPushCreateButton(false);
|
||||
|
||||
if (meta.requestStatus === "fulfilled") {
|
||||
dispatch(getMyAccountAsync());
|
||||
dispatch(clearHierarchicalElement());
|
||||
closePopup();
|
||||
}
|
||||
}, [
|
||||
|
||||
@ -14,6 +14,10 @@ import {
|
||||
cleanupApps,
|
||||
selectIsLoading,
|
||||
} from "features/license/licenseOrder";
|
||||
import {
|
||||
clearHierarchicalElement,
|
||||
getMyAccountAsync,
|
||||
} from "features/license/partnerLicense";
|
||||
import close from "../../assets/images/close.svg";
|
||||
import progress_activit from "../../assets/images/progress_activit.svg";
|
||||
|
||||
@ -90,6 +94,8 @@ export const LicenseOrderPopup: React.FC<LicenseOrderPopupProps> = (props) => {
|
||||
setIsPushOrderButton(false);
|
||||
|
||||
if (meta.requestStatus === "fulfilled") {
|
||||
dispatch(getMyAccountAsync());
|
||||
dispatch(clearHierarchicalElement());
|
||||
closePopup();
|
||||
}
|
||||
}, [
|
||||
|
||||
@ -216,13 +216,11 @@ const PartnerLicense: React.FC = (): JSX.Element => {
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* 表示確認用の仮画面 */}
|
||||
{/* isPopupOpenがfalseの場合はポップアップのhtmlを生成しないように対応。これによりポップアップは都度生成されて初期化の考慮が減る */}
|
||||
{isCardLicenseIssuePopupOpen && (
|
||||
<CardLicenseIssuePopup
|
||||
onClose={() => {
|
||||
setIsCardLicenseIssuePopupOpen(false);
|
||||
dispatch(getMyAccountAsync());
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
@ -230,7 +228,6 @@ const PartnerLicense: React.FC = (): JSX.Element => {
|
||||
<LicenseOrderPopup
|
||||
onClose={() => {
|
||||
setIslicenseOrderPopupOpen(false);
|
||||
dispatch(getMyAccountAsync());
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
|
||||
@ -371,12 +371,13 @@ const SignupInput: React.FC = (): JSX.Element => {
|
||||
</dd>
|
||||
<dd className={`${styles.full} ${styles.alignCenter}`}>
|
||||
<a
|
||||
href="/"
|
||||
href="https://download.omsystem.com/pages/odms_download/odms_cloud_eula/eula/en/"
|
||||
target="_blank"
|
||||
className={styles.linkTx}
|
||||
onClick={() => {
|
||||
setIsOpenPolicy(true);
|
||||
}}
|
||||
rel="noreferrer"
|
||||
>
|
||||
{t(getTranslationID("signupPage.label.linkOfEula"))}
|
||||
</a>
|
||||
@ -398,12 +399,13 @@ const SignupInput: React.FC = (): JSX.Element => {
|
||||
</dd>
|
||||
<dd className={`${styles.full} ${styles.alignCenter}`}>
|
||||
<a
|
||||
href="/"
|
||||
href="https://download.omsystem.com/pages/odms_download/odms_cloud_eula/privacy_notice/en/"
|
||||
target="_blank"
|
||||
className={styles.linkTx}
|
||||
onClick={() => {
|
||||
setIsOpenPrivacyNoyice(true);
|
||||
}}
|
||||
rel="noreferrer"
|
||||
>
|
||||
{t(
|
||||
getTranslationID("signupPage.label.linkOfPrivacyNotice")
|
||||
|
||||
@ -28,54 +28,15 @@ const SupportPage: React.FC = () => {
|
||||
<ul className={styles.listDocument}>
|
||||
<li>
|
||||
<a
|
||||
// TODO: 将来的に正式なURLに変更する
|
||||
href="/support"
|
||||
href="https://download.omsystem.com/pages/odms_download/manual/odms_cloud/"
|
||||
target="_blank"
|
||||
className={styles.linkTx}
|
||||
rel="noreferrer"
|
||||
>
|
||||
{t(
|
||||
getTranslationID("supportPage.label.supportPageEnglish")
|
||||
)}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
// TODO: 将来的に正式なURLに変更する
|
||||
href="/support"
|
||||
target="_blank"
|
||||
className={styles.linkTx}
|
||||
>
|
||||
{t(
|
||||
getTranslationID("supportPage.label.supportPageGerman")
|
||||
)}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
// TODO: 将来的に正式なURLに変更する
|
||||
href="/support"
|
||||
target="_blank"
|
||||
className={styles.linkTx}
|
||||
>
|
||||
{t(
|
||||
getTranslationID("supportPage.label.supportPageFrench")
|
||||
)}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
// TODO: 将来的に正式なURLに変更する
|
||||
href="/support"
|
||||
target="_blank"
|
||||
className={styles.linkTx}
|
||||
>
|
||||
{t(
|
||||
getTranslationID("supportPage.label.supportPageSpanish")
|
||||
)}
|
||||
{t(getTranslationID("supportPage.label.supportPageLink"))}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p className={styles.txNormal}>
|
||||
{t(getTranslationID("supportPage.text.notResolved"))}
|
||||
</p>
|
||||
|
||||
@ -155,11 +155,12 @@ const TermsPage: React.FC = (): JSX.Element => {
|
||||
<p>
|
||||
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}
|
||||
<a
|
||||
href="/" /* TODO Eula用の利用規約リンクが決定したら設定を行う */
|
||||
href="https://download.omsystem.com/pages/odms_download/odms_cloud_eula/eula/en/"
|
||||
target="_blank"
|
||||
className={styles.linkTx}
|
||||
onClick={() => setIsClickedEulaLink(true)}
|
||||
data-tag="open-eula"
|
||||
rel="noreferrer"
|
||||
>
|
||||
{t(getTranslationID("termsPage.label.linkOfEula"))}
|
||||
</a>
|
||||
@ -187,11 +188,12 @@ const TermsPage: React.FC = (): JSX.Element => {
|
||||
<p>
|
||||
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}
|
||||
<a
|
||||
href="/" /* TODO PrivacyNotice用の利用規約リンクが決定したら設定を行う */
|
||||
href="https://download.omsystem.com/pages/odms_download/odms_cloud_eula/privacy_notice/en/"
|
||||
target="_blank"
|
||||
className={styles.linkTx}
|
||||
onClick={() => setIsClickedPrivacyNoticeLink(true)}
|
||||
data-tag="open-pricacy-notice"
|
||||
rel="noreferrer"
|
||||
>
|
||||
{t(
|
||||
getTranslationID("termsPage.label.linkOfPrivacyNotice")
|
||||
@ -225,11 +227,12 @@ const TermsPage: React.FC = (): JSX.Element => {
|
||||
<p>
|
||||
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}
|
||||
<a
|
||||
href="/" /* TODO Dpa用の利用規約リンクが決定したら設定を行う */
|
||||
href="https://download.omsystem.com/pages/odms_download/odms_cloud_eula/dpa_partner/en/"
|
||||
target="_blank"
|
||||
className={styles.linkTx}
|
||||
onClick={() => setIsClickedDpaLink(true)}
|
||||
data-tag="open-dpa"
|
||||
rel="noreferrer"
|
||||
>
|
||||
{t(getTranslationID("termsPage.label.linkOfDpa"))}
|
||||
</a>
|
||||
|
||||
@ -64,7 +64,7 @@
|
||||
"countryExplanation": "Wählen Sie das Land aus, in dem Sie sich befinden. Wenn Ihr Land nicht aufgeführt ist, wählen Sie bitte das nächstgelegene Land aus.",
|
||||
"dealerExplanation": "Bitte wählen Sie den Händler aus, bei dem Sie die Lizenz erwerben möchten.",
|
||||
"adminInfoTitle": "Registrieren Sie die Informationen des primären Administrators",
|
||||
"passwordTerms": "Bitte legen Sie ein Passwort fest. Das Passwort muss 8–25 Zeichen lang sein und Buchstaben, Zahlen und Symbole enthalten. (Sollte ein kompatibles Symbol auflisten und angeben, ob ein Großbuchstabe erforderlich ist.)"
|
||||
"passwordTerms": "Bitte legen Sie ein Passwort fest. Das Passwort muss 8–64 Zeichen lang sein und Buchstaben, Zahlen und Symbole enthalten."
|
||||
},
|
||||
"label": {
|
||||
"company": "Name der Firma",
|
||||
@ -135,7 +135,12 @@
|
||||
"typistUserDeletionTranscriptionTaskError": "(de)ユーザーの削除に失敗しました。Dictation画面でタスクのルーティングから対象Transcriptionistを外してください。",
|
||||
"authorUserDeletionTranscriptionTaskError": "(de)ユーザーの削除に失敗しました。Dictation画面で対象AuthorのAuthorIDが設定されているタスクの中で、文字起こしが未完了のタスクを削除またはFinishedにしてください。",
|
||||
"typistUserDeletionTranscriptionistGroupError": "(de)ユーザーの削除に失敗しました。Workflow画面でTranscriptionistGroupから対象Transcriptionistを外してください。",
|
||||
"authorDeletionRoutingRuleError": "(de)ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象AuthorのAuthorIDを外してください。"
|
||||
"authorDeletionRoutingRuleError": "(de)ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象AuthorのAuthorIDを外してください。",
|
||||
"importSuccess": "(de)ユーザー一括追加を受け付けました。登録処理が完了次第メールが届きますのでご確認ください。",
|
||||
"duplicateEmailError": "(de)以下の行のメールアドレスがCSV中で重複しています。",
|
||||
"duplicateAuthorIdError": "(de)以下の行のAuthorIDがCSV中で重複しています。",
|
||||
"overMaxUserError": "(de)一度に追加できるユーザーは100件までです。",
|
||||
"invalidInputError": "(de)以下の行のユーザー情報が入力ルールに準拠していません。"
|
||||
},
|
||||
"label": {
|
||||
"title": "Benutzer",
|
||||
@ -168,7 +173,33 @@
|
||||
"deleteUser": "Benutzer löschen",
|
||||
"none": "Keiner",
|
||||
"encryptionPassword": "Passwort",
|
||||
"encryptionPasswordTerm": "Bitte legen Sie Ihr Passwort mit 4 bis 16 alphanumerischen Zeichen und Symbolen fest."
|
||||
"encryptionPasswordTerm": "Bitte legen Sie Ihr Passwort mit 4 bis 16 alphanumerischen Zeichen und Symbolen fest.",
|
||||
"bulkImport": "(de)Bulk import",
|
||||
"downloadCsv": "(de)Download CSV",
|
||||
"importCsv": "(de)Import CSV",
|
||||
"inputRules": "(de)Input rules",
|
||||
"nameLabel": "(de)Name",
|
||||
"emailAddressLabel": "(de)Email Address",
|
||||
"roleLabel": "(de)Role",
|
||||
"authorIdLabel": "(de)Author ID",
|
||||
"autoRenewLabel": "(de)Auto Renew",
|
||||
"notificationLabel": "(de)Notification",
|
||||
"encryptionLabel": "(de)Encryption",
|
||||
"encryptionPasswordLabel": "(de)Encryption Password",
|
||||
"promptLabel": "(de)Prompt",
|
||||
"addUsers": "(de)Add users"
|
||||
},
|
||||
"text": {
|
||||
"downloadExplain": "(de)Download the csv format and enter it according to the rules below.",
|
||||
"nameRule": "(de)Maximum 225 characters",
|
||||
"emailAddressRule": "(de)Maximum 225 characters\nCannot use an email address that is already in use.",
|
||||
"roleRule": "(de)None : 0\nAuthor : 1\nTranscriptionist : 2",
|
||||
"authorIdRule": "(de)Required only when Role=Author(1)\nMaximum 16 characters\nOnly uppercase alphanumeric characters and \"_\" can be entered.\nCannot use an Author ID that is already in use.",
|
||||
"autoRenewRule": "(de)0 or 1",
|
||||
"notificationRule": "(de)0 or 1",
|
||||
"encryptionRule": "(de)Required only when Role=Author(1)\n0 or 1",
|
||||
"encryptionPasswordRule": "(de)Required only when Role=Author(1) and Encryption=ON(1)\nOnly 4 to 16 letters, numbers, and symbols can be entered.",
|
||||
"promptRule": "(de)Required only when Role=Author(1)\n0 or 1"
|
||||
}
|
||||
},
|
||||
"LicenseSummaryPage": {
|
||||
@ -188,22 +219,26 @@
|
||||
"usedSize": "Gebrauchter Lagerung",
|
||||
"storageAvailable": "Speicher nicht verfügbar (Menge überschritten)",
|
||||
"licenseLabel": "Lizenz",
|
||||
"storageLabel": "Lagerung"
|
||||
"storageLabel": "Lagerung",
|
||||
"storageUnavailableCheckbox": "(de)Storage Unavailable"
|
||||
},
|
||||
"message": {
|
||||
"storageUnavalableSwitchingConfirm": "(de)対象アカウントのストレージ使用制限状態を変更します。よろしいですか?"
|
||||
}
|
||||
},
|
||||
"licenseOrderPage": {
|
||||
"message": {
|
||||
"inputEmptyError": "Pflichtfeld",
|
||||
"poNumberIncorrectError": "Das Format der Bestellnummer ist ungültig. Für die Bestellnummer können nur alphanumerische Zeichen eingegeben werden.",
|
||||
"poNumberIncorrectError": "Das Format der PO-Nummer ist ungültig. Für die PO-Nummer können nur alphanumerische Zeichen eingegeben werden.",
|
||||
"newOrderIncorrectError": "Bitte geben Sie für die neue Bestellung eine Zahl größer oder gleich 1 ein.",
|
||||
"confirmOrder": "Möchten Sie eine Bestellung aufgeben?",
|
||||
"poNumberConflictError": "Die eingegebene Bestellnummer existiert bereits. Bitte geben Sie eine andere Bestellnummer ein.",
|
||||
"dealerNotFoundError": "(de)ディーラーが設定されていないため、ライセンスを注文できません。アカウント画面でディーラーを指定してください。"
|
||||
"poNumberConflictError": "Die eingegebene PO-Nummer existiert bereits. Bitte geben Sie eine andere PO-Nummer ein.",
|
||||
"dealerNotFoundError": "Um eine Lizenz zu bestellen, müssen Sie den Händler angeben, bei dem Sie die Lizenz erwerben möchten. Melden Sie sich bei ODMS Cloud an und richten Sie „Händler“ auf der Registerkarte „Konto“ ein."
|
||||
},
|
||||
"label": {
|
||||
"title": "Lizenz bestellen",
|
||||
"licenses": "Lizenz-Typ",
|
||||
"poNumber": "Bestellnummer",
|
||||
"poNumber": "PO-Nummer",
|
||||
"newOrder": "Anzahl der Lizenzen",
|
||||
"orderButton": "Bestellen",
|
||||
"licenseTypeText": "Ein Jahr"
|
||||
@ -216,7 +251,9 @@
|
||||
"taskNotEditable": "Der Transkriptionist kann nicht geändert werden, da die Transkription bereits ausgeführt wird oder die Datei nicht vorhanden ist. Bitte aktualisieren Sie den Bildschirm und prüfen Sie den aktuellen Status.",
|
||||
"backupFailedError": "Der Prozess „Dateisicherung“ ist fehlgeschlagen. Bitte versuchen Sie es später noch einmal. Wenn der Fehler weiterhin besteht, wenden Sie sich an Ihren Systemadministrator.",
|
||||
"cancelFailedError": "Die Diktate konnten nicht gelöscht werden. Bitte aktualisieren Sie Ihren Bildschirm und versuchen Sie es erneut.",
|
||||
"deleteFailedError": "(de)タスクの削除に失敗しました。画面を更新し、再度ご確認ください。"
|
||||
"deleteFailedError": "(de)タスクの削除に失敗しました。画面を更新し、再度ご確認ください。",
|
||||
"licenseNotAssignedError": "Die Transkription ist nicht möglich, da keine gültige Lizenz zugewiesen ist.Bitten Sie Ihren Administrator, eine gültige Lizenz zuzuweisen.",
|
||||
"licenseExpiredError": "Die Transkription ist nicht möglich, da Ihre Lizenz abgelaufen ist. Bitte bitten Sie Ihren Administrator, Ihnen eine gültige Lizenz zuzuweisen."
|
||||
},
|
||||
"label": {
|
||||
"title": "Diktate",
|
||||
@ -258,7 +295,7 @@
|
||||
"changeTranscriptionist": "Transkriptionist ändern",
|
||||
"deleteDictation": "Diktat löschen",
|
||||
"selectedTranscriptionist": "Ausgewählter transkriptionist",
|
||||
"poolTranscriptionist": "Liste der Transkriptionisten",
|
||||
"poolTranscriptionist": "Transkriptionsliste",
|
||||
"fileBackup": "Dateisicherung",
|
||||
"downloadForBackup": "Zur Sicherung herunterladen",
|
||||
"applications": "Desktopanwendung",
|
||||
@ -341,7 +378,7 @@
|
||||
"orderDate": "Auftragsdatum",
|
||||
"issueDate": "Ausgabetag",
|
||||
"numberOfOrder": "Anzahl der bestellten Lizenzen",
|
||||
"poNumber": "Bestellnummer",
|
||||
"poNumber": "PO-Nummer",
|
||||
"status": "Status",
|
||||
"issueRequesting": "Lizenzen auf Bestellung",
|
||||
"issued": "Lizenz ausgestellt",
|
||||
@ -425,7 +462,7 @@
|
||||
"message": {
|
||||
"selectedTypistEmptyError": "Um eine Transkriptionsgruppe zu speichern, müssen ein oder mehrere Transkriptionisten ausgewählt werden.",
|
||||
"groupSaveFailedError": "Die Transkriptionistengruppe konnte nicht gespeichert werden. Die angezeigten Informationen sind möglicherweise veraltet. Aktualisieren Sie daher bitte den Bildschirm, um den neuesten Status anzuzeigen.",
|
||||
"GroupNameAlreadyExistError": "(de)このTranscriptionistGroup名は既に登録されています。他のTranscriptionistGroup名で登録してください。",
|
||||
"GroupNameAlreadyExistError": "Der Name dieser Transkriptionistengruppe ist bereits registriert. Bitte registrieren Sie sich mit einem anderen Namen der Transkriptionistengruppe.",
|
||||
"deleteFailedWorkflowAssigned": "(de)TranscriptionistGroupの削除に失敗しました。Workflow画面でルーティングルールから対象TranscriptionistGroupを外してください。",
|
||||
"deleteFailedCheckoutPermissionExisted": "(de)TranscriptionistGroupの削除に失敗しました。Dictation画面でタスクのルーティングから対象TranscriptionistGroupを外してください。"
|
||||
}
|
||||
@ -560,10 +597,7 @@
|
||||
"label": {
|
||||
"title": "Support",
|
||||
"howToUse": "So verwenden Sie das System",
|
||||
"supportPageEnglish": "OMDS Cloud User Guide",
|
||||
"supportPageGerman": "OMDS Cloud-Benutzerhandbuch",
|
||||
"supportPageFrench": "Guía del usuario de la nube OMDS",
|
||||
"supportPageSpanish": "Guide de l'utilisateur du cloud OMDS"
|
||||
"supportPageLink": "OMDS Cloud-Benutzerhandbuch"
|
||||
},
|
||||
"text": {
|
||||
"notResolved": "Informationen zu den Funktionen der ODMS Cloud finden Sie im Benutzerhandbuch. Wenn Sie zusätzlichen Support benötigen, wenden Sie sich bitte an Ihren Administrator oder zertifizierten ODMS Cloud-Händler."
|
||||
|
||||
@ -64,7 +64,7 @@
|
||||
"countryExplanation": "Select the country where you are located. If your country isn't listed, please select the nearest country.",
|
||||
"dealerExplanation": "Please select the dealer you would like to purchase the license from.",
|
||||
"adminInfoTitle": "Register primary administrator's information",
|
||||
"passwordTerms": "Please set a password. The password must be 8-25 characters must contain letters, numbers, and symbols. (Should list compatible symbol and state if capital letter is needed)."
|
||||
"passwordTerms": "Please set a password. The password must be 8-64 characters must contain letters, numbers, and symbols."
|
||||
},
|
||||
"label": {
|
||||
"company": "Company Name",
|
||||
@ -135,7 +135,12 @@
|
||||
"typistUserDeletionTranscriptionTaskError": "ユーザーの削除に失敗しました。Dictation画面でタスクのルーティングから対象Transcriptionistを外してください。",
|
||||
"authorUserDeletionTranscriptionTaskError": "ユーザーの削除に失敗しました。Dictation画面で対象AuthorのAuthorIDが設定されているタスクの中で、文字起こしが未完了のタスクを削除またはFinishedにしてください。",
|
||||
"typistUserDeletionTranscriptionistGroupError": "ユーザーの削除に失敗しました。Workflow画面でTranscriptionistGroupから対象Transcriptionistを外してください。",
|
||||
"authorDeletionRoutingRuleError": "ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象AuthorのAuthorIDを外してください。"
|
||||
"authorDeletionRoutingRuleError": "ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象AuthorのAuthorIDを外してください。",
|
||||
"importSuccess": "ユーザー一括追加を受け付けました。登録処理が完了次第メールが届きますのでご確認ください。",
|
||||
"duplicateEmailError": "以下の行のメールアドレスがCSV中で重複しています。",
|
||||
"duplicateAuthorIdError": "以下の行のAuthorIDがCSV中で重複しています。",
|
||||
"overMaxUserError": "一度に追加できるユーザーは100件までです。",
|
||||
"invalidInputError": "以下の行のユーザー情報が入力ルールに準拠していません。"
|
||||
},
|
||||
"label": {
|
||||
"title": "User",
|
||||
@ -168,7 +173,33 @@
|
||||
"deleteUser": "Delete User",
|
||||
"none": "None",
|
||||
"encryptionPassword": "Password",
|
||||
"encryptionPasswordTerm": "Please set your password using 4 to 16 alphanumeric and symbols."
|
||||
"encryptionPasswordTerm": "Please set your password using 4 to 16 alphanumeric and symbols.",
|
||||
"bulkImport": "Bulk import",
|
||||
"downloadCsv": "Download CSV",
|
||||
"importCsv": "Import CSV",
|
||||
"inputRules": "Input rules",
|
||||
"nameLabel": "Name",
|
||||
"emailAddressLabel": "Email Address",
|
||||
"roleLabel": "Role",
|
||||
"authorIdLabel": "Author ID",
|
||||
"autoRenewLabel": "Auto Renew",
|
||||
"notificationLabel": "Notification",
|
||||
"encryptionLabel": "Encryption",
|
||||
"encryptionPasswordLabel": "Encryption Password",
|
||||
"promptLabel": "Prompt",
|
||||
"addUsers": "Add users"
|
||||
},
|
||||
"text": {
|
||||
"downloadExplain": "Download the csv format and enter it according to the rules below.",
|
||||
"nameRule": "Maximum 225 characters",
|
||||
"emailAddressRule": "Maximum 225 characters\nCannot use an email address that is already in use.",
|
||||
"roleRule": "None : 0\nAuthor : 1\nTranscriptionist : 2",
|
||||
"authorIdRule": "Required only when Role=Author(1)\nMaximum 16 characters\nOnly uppercase alphanumeric characters and \"_\" can be entered.\nCannot use an Author ID that is already in use.",
|
||||
"autoRenewRule": "0 or 1",
|
||||
"notificationRule": "0 or 1",
|
||||
"encryptionRule": "Required only when Role=Author(1)\n0 or 1",
|
||||
"encryptionPasswordRule": "Required only when Role=Author(1) and Encryption=ON(1)\nOnly 4 to 16 letters, numbers, and symbols can be entered.",
|
||||
"promptRule": "Required only when Role=Author(1)\n0 or 1"
|
||||
}
|
||||
},
|
||||
"LicenseSummaryPage": {
|
||||
@ -188,7 +219,11 @@
|
||||
"usedSize": "Storage Used",
|
||||
"storageAvailable": "Storage Unavailable (Exceeded Amount)",
|
||||
"licenseLabel": "License",
|
||||
"storageLabel": "Storage"
|
||||
"storageLabel": "Storage",
|
||||
"storageUnavailableCheckbox": "Storage Unavailable"
|
||||
},
|
||||
"message": {
|
||||
"storageUnavalableSwitchingConfirm": "対象アカウントのストレージ使用制限状態を変更します。よろしいですか?"
|
||||
}
|
||||
},
|
||||
"licenseOrderPage": {
|
||||
@ -198,7 +233,7 @@
|
||||
"newOrderIncorrectError": "Please enter a number greater than or equal to 1 for the New Order.",
|
||||
"confirmOrder": "Would you like to place an order?",
|
||||
"poNumberConflictError": "PO Number entered already exists. Please enter a different PO Number.",
|
||||
"dealerNotFoundError": "ディーラーが設定されていないため、ライセンスを注文できません。アカウント画面でディーラーを指定してください。"
|
||||
"dealerNotFoundError": "In order to order a license, you need to set up the dealer where you want to purchase it. Sign in to ODMS Cloud and set up \"Dealer\" in the \"Account\" tab."
|
||||
},
|
||||
"label": {
|
||||
"title": "Order License",
|
||||
@ -216,7 +251,9 @@
|
||||
"taskNotEditable": "The transcriptionist cannot be changed because the transcription is already in progress or the file does not exist. Please refresh the screen and check the latest status.",
|
||||
"backupFailedError": "The \"File Backup\" process has failed. Please try again later. If the error continues, contact your system administrator.",
|
||||
"cancelFailedError": "Failed to delete the dictations. Please refresh your screen and try again.",
|
||||
"deleteFailedError": "タスクの削除に失敗しました。画面を更新し、再度ご確認ください。"
|
||||
"deleteFailedError": "タスクの削除に失敗しました。画面を更新し、再度ご確認ください。",
|
||||
"licenseNotAssignedError": "Transcription is not possible because a valid license is not assigned.Please ask your administrator to assign a valid license.",
|
||||
"licenseExpiredError": "Transcription is not possible because your license is expired. Please ask your administrator to assign a valid license."
|
||||
},
|
||||
"label": {
|
||||
"title": "Dictations",
|
||||
@ -258,7 +295,7 @@
|
||||
"changeTranscriptionist": "Change Transcriptionist",
|
||||
"deleteDictation": "Delete Dictation",
|
||||
"selectedTranscriptionist": "Selected Transcriptionist",
|
||||
"poolTranscriptionist": "Transcriptionist List",
|
||||
"poolTranscriptionist": "Transcription List",
|
||||
"fileBackup": "File Backup",
|
||||
"downloadForBackup": "Download for backup",
|
||||
"applications": "Desktop Application",
|
||||
@ -425,7 +462,7 @@
|
||||
"message": {
|
||||
"selectedTypistEmptyError": "One or more transcriptonist must be selected to save a transcrption group.",
|
||||
"groupSaveFailedError": "Transcriptionist Group could not be saved. The displayed information may be outdated, so please refresh the screen to see the latest status.",
|
||||
"GroupNameAlreadyExistError": "このTranscriptionistGroup名は既に登録されています。他のTranscriptionistGroup名で登録してください。",
|
||||
"GroupNameAlreadyExistError": "This Transcriptionist Group name is already registered. Please register with another Transcriptionist Group name.",
|
||||
"deleteFailedWorkflowAssigned": "TranscriptionistGroupの削除に失敗しました。Workflow画面でルーティングルールから対象TranscriptionistGroupを外してください。",
|
||||
"deleteFailedCheckoutPermissionExisted": "TranscriptionistGroupの削除に失敗しました。Dictation画面でタスクのルーティングから対象TranscriptionistGroupを外してください。"
|
||||
}
|
||||
@ -560,10 +597,7 @@
|
||||
"label": {
|
||||
"title": "Support",
|
||||
"howToUse": "How to use the system",
|
||||
"supportPageEnglish": "OMDS Cloud User Guide",
|
||||
"supportPageGerman": "OMDS Cloud-Benutzerhandbuch",
|
||||
"supportPageFrench": "Guía del usuario de la nube OMDS",
|
||||
"supportPageSpanish": "Guide de l'utilisateur du cloud OMDS"
|
||||
"supportPageLink": "OMDS Cloud User Guide"
|
||||
},
|
||||
"text": {
|
||||
"notResolved": "Please refer to the User Guide for information about the features of the ODMS Cloud. If you require additional support, please contact your administrator or certified ODMS Cloud reseller."
|
||||
|
||||
@ -64,7 +64,7 @@
|
||||
"countryExplanation": "Seleccione el país donde se encuentra. Si su país no aparece en la lista, seleccione el país más cercano.",
|
||||
"dealerExplanation": "Seleccione el distribuidor al que le gustaría comprar la licencia.",
|
||||
"adminInfoTitle": "Registre la información del administrador principal",
|
||||
"passwordTerms": "Establezca una contraseña. La contraseña debe tener entre 8 y 25 caracteres y debe contener letras, números y símbolos. (Debe enumerar el símbolo compatible e indicar si se necesita una letra mayúscula)."
|
||||
"passwordTerms": "Establezca una contraseña. La contraseña debe tener entre 8 y 64 caracteres y debe contener letras, números y símbolos."
|
||||
},
|
||||
"label": {
|
||||
"company": "Nombre de empresa",
|
||||
@ -135,7 +135,12 @@
|
||||
"typistUserDeletionTranscriptionTaskError": "(es)ユーザーの削除に失敗しました。Dictation画面でタスクのルーティングから対象Transcriptionistを外してください。",
|
||||
"authorUserDeletionTranscriptionTaskError": "(es)ユーザーの削除に失敗しました。Dictation画面で対象AuthorのAuthorIDが設定されているタスクの中で、文字起こしが未完了のタスクを削除またはFinishedにしてください。",
|
||||
"typistUserDeletionTranscriptionistGroupError": "(es)ユーザーの削除に失敗しました。Workflow画面でTranscriptionistGroupから対象Transcriptionistを外してください。",
|
||||
"authorDeletionRoutingRuleError": "(es)ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象AuthorのAuthorIDを外してください。"
|
||||
"authorDeletionRoutingRuleError": "(es)ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象AuthorのAuthorIDを外してください。",
|
||||
"importSuccess": "(es)ユーザー一括追加を受け付けました。登録処理が完了次第メールが届きますのでご確認ください。",
|
||||
"duplicateEmailError": "(es)以下の行のメールアドレスがCSV中で重複しています。",
|
||||
"duplicateAuthorIdError": "(es)以下の行のAuthorIDがCSV中で重複しています。",
|
||||
"overMaxUserError": "(es)一度に追加できるユーザーは100件までです。",
|
||||
"invalidInputError": "(es)以下の行のユーザー情報が入力ルールに準拠していません。"
|
||||
},
|
||||
"label": {
|
||||
"title": "Usuario",
|
||||
@ -168,7 +173,33 @@
|
||||
"deleteUser": "Borrar usuario",
|
||||
"none": "Ninguno",
|
||||
"encryptionPassword": "Contraseña",
|
||||
"encryptionPasswordTerm": "Configure su contraseña utilizando de 4 a 16 símbolos alfanuméricos y."
|
||||
"encryptionPasswordTerm": "Configure su contraseña utilizando de 4 a 16 símbolos alfanuméricos y.",
|
||||
"bulkImport": "(es)Bulk import",
|
||||
"downloadCsv": "(es)Download CSV",
|
||||
"importCsv": "(es)Import CSV",
|
||||
"inputRules": "(es)Input rules",
|
||||
"nameLabel": "(es)Name",
|
||||
"emailAddressLabel": "(es)Email Address",
|
||||
"roleLabel": "(es)Role",
|
||||
"authorIdLabel": "(es)Author ID",
|
||||
"autoRenewLabel": "(es)Auto Renew",
|
||||
"notificationLabel": "(es)Notification",
|
||||
"encryptionLabel": "(es)Encryption",
|
||||
"encryptionPasswordLabel": "(es)Encryption Password",
|
||||
"promptLabel": "(es)Prompt",
|
||||
"addUsers": "(es)Add users"
|
||||
},
|
||||
"text": {
|
||||
"downloadExplain": "(es)Download the csv format and enter it according to the rules below.",
|
||||
"nameRule": "(es)Maximum 225 characters",
|
||||
"emailAddressRule": "(es)Maximum 225 characters\nCannot use an email address that is already in use.",
|
||||
"roleRule": "(es)None : 0\nAuthor : 1\nTranscriptionist : 2",
|
||||
"authorIdRule": "(es)Required only when Role=Author(1)\nMaximum 16 characters\nOnly uppercase alphanumeric characters and \"_\" can be entered.\nCannot use an Author ID that is already in use.",
|
||||
"autoRenewRule": "(es)0 or 1",
|
||||
"notificationRule": "(es)0 or 1",
|
||||
"encryptionRule": "(es)Required only when Role=Author(1)\n0 or 1",
|
||||
"encryptionPasswordRule": "(es)Required only when Role=Author(1) and Encryption=ON(1)\nOnly 4 to 16 letters, numbers, and symbols can be entered.",
|
||||
"promptRule": "(es)Required only when Role=Author(1)\n0 or 1"
|
||||
}
|
||||
},
|
||||
"LicenseSummaryPage": {
|
||||
@ -188,7 +219,11 @@
|
||||
"usedSize": "Almacenamiento utilizado",
|
||||
"storageAvailable": "Almacenamiento no disponible (cantidad excedida)",
|
||||
"licenseLabel": "Licencia",
|
||||
"storageLabel": "Almacenamiento"
|
||||
"storageLabel": "Almacenamiento",
|
||||
"storageUnavailableCheckbox": "(es)Storage Unavailable"
|
||||
},
|
||||
"message": {
|
||||
"storageUnavalableSwitchingConfirm": "(es)対象アカウントのストレージ使用制限状態を変更します。よろしいですか?"
|
||||
}
|
||||
},
|
||||
"licenseOrderPage": {
|
||||
@ -198,7 +233,7 @@
|
||||
"newOrderIncorrectError": "Ingrese un número mayor o igual a 1 para el Nuevo Pedido.",
|
||||
"confirmOrder": "¿Quieres hacer un pedido?",
|
||||
"poNumberConflictError": "El número de orden de compra ingresado ya existe. Ingrese un número de orden de compra diferente.",
|
||||
"dealerNotFoundError": "(es)ディーラーが設定されていないため、ライセンスを注文できません。アカウント画面でディーラーを指定してください。"
|
||||
"dealerNotFoundError": "Para solicitar una licencia, debe configurar el distribuidor donde desea comprarla. Inicie sesión en ODMS Cloud y configure \"Distribuidor\" en la pestaña \"Cuenta\"."
|
||||
},
|
||||
"label": {
|
||||
"title": "Licencia de pedido",
|
||||
@ -216,7 +251,9 @@
|
||||
"taskNotEditable": "No se puede cambiar el transcriptor porque la transcripción ya está en curso o el archivo no existe. Actualice la pantalla y verifique el estado más reciente.",
|
||||
"backupFailedError": "El proceso de \"Copia de seguridad de archivos\" ha fallado. Por favor, inténtelo de nuevo más tarde. Si el error continúa, comuníquese con el administrador del sistema.",
|
||||
"cancelFailedError": "No se pudieron eliminar los dictados. Actualice su pantalla e inténtelo nuevamente.",
|
||||
"deleteFailedError": "(es)タスクの削除に失敗しました。画面を更新し、再度ご確認ください。"
|
||||
"deleteFailedError": "(es)タスクの削除に失敗しました。画面を更新し、再度ご確認ください。",
|
||||
"licenseNotAssignedError": "La transcripción no es posible porque no se ha asignado una licencia válida.Solicite a su administrador que le asigne una licencia válida.",
|
||||
"licenseExpiredError": "La transcripción no es posible porque su licencia ha caducado. Solicite a su administrador que le asigne una licencia válida."
|
||||
},
|
||||
"label": {
|
||||
"title": "Dictado",
|
||||
@ -258,7 +295,7 @@
|
||||
"changeTranscriptionist": "Cambiar transcriptor",
|
||||
"deleteDictation": "Borrar dictado",
|
||||
"selectedTranscriptionist": "Transcriptor seleccionado",
|
||||
"poolTranscriptionist": "Lista de transcriptores",
|
||||
"poolTranscriptionist": "Lista de transcriptor",
|
||||
"fileBackup": "Copia de seguridad de archivos",
|
||||
"downloadForBackup": "Descargar para respaldo",
|
||||
"applications": "Aplicación de escritorio",
|
||||
@ -425,7 +462,7 @@
|
||||
"message": {
|
||||
"selectedTypistEmptyError": "Se deben seleccionar uno o más transcriptores para guardar un grupo de transcripción.",
|
||||
"groupSaveFailedError": "El grupo transcriptor no se pudo salvar. La información mostrada puede estar desactualizada. Así que actualice la pantalla para ver el estado más reciente.",
|
||||
"GroupNameAlreadyExistError": "(es)このTranscriptionistGroup名は既に登録されています。他のTranscriptionistGroup名で登録してください。",
|
||||
"GroupNameAlreadyExistError": "El nombre de este grupo transcriptor ya está registrado. Regístrese con otro nombre de grupo transcriptor.",
|
||||
"deleteFailedWorkflowAssigned": "(es)TranscriptionistGroupの削除に失敗しました。Workflow画面でルーティングルールから対象TranscriptionistGroupを外してください。",
|
||||
"deleteFailedCheckoutPermissionExisted": "(es)TranscriptionistGroupの削除に失敗しました。Dictation画面でタスクのルーティングから対象TranscriptionistGroupを外してください。"
|
||||
}
|
||||
@ -560,10 +597,7 @@
|
||||
"label": {
|
||||
"title": "Soporte",
|
||||
"howToUse": "Cómo utilizar el sistema",
|
||||
"supportPageEnglish": "OMDS Cloud User Guide",
|
||||
"supportPageGerman": "OMDS Cloud-Benutzerhandbuch",
|
||||
"supportPageFrench": "Guía del usuario de la nube OMDS",
|
||||
"supportPageSpanish": "Guide de l'utilisateur du cloud OMDS"
|
||||
"supportPageLink": "Guía del usuario de la nube OMDS"
|
||||
},
|
||||
"text": {
|
||||
"notResolved": "Consulte la Guía del usuario para obtener información sobre las funciones de ODMS Cloud. Si necesita soporte adicional, comuníquese con su administrador o revendedor certificado de ODMS Cloud."
|
||||
|
||||
@ -64,7 +64,7 @@
|
||||
"countryExplanation": "Sélectionnez le pays où vous vous trouvez. Si votre pays ne figure pas dans la liste, veuillez sélectionner le pays le plus proche.",
|
||||
"dealerExplanation": "Veuillez sélectionner le revendeur auprès duquel vous souhaitez acheter la licence.",
|
||||
"adminInfoTitle": "Enregistrer les informations de l'administrateur principal",
|
||||
"passwordTerms": "Veuillez définir un mot de passe. Le mot de passe doit être composé de 8 à 25 caractères et doit contenir des lettres, des chiffres et des symboles. (Devrait lister les symboles compatibles et indiquer si une majuscule est nécessaire)."
|
||||
"passwordTerms": "Veuillez définir un mot de passe. Le mot de passe doit être composé de 8 à 64 caractères et doit contenir des lettres, des chiffres et des symboles."
|
||||
},
|
||||
"label": {
|
||||
"company": "Nom de l'entreprise",
|
||||
@ -135,7 +135,12 @@
|
||||
"typistUserDeletionTranscriptionTaskError": "(fr)ユーザーの削除に失敗しました。Dictation画面でタスクのルーティングから対象Transcriptionistを外してください。",
|
||||
"authorUserDeletionTranscriptionTaskError": "(fr)ユーザーの削除に失敗しました。Dictation画面で対象AuthorのAuthorIDが設定されているタスクの中で、文字起こしが未完了のタスクを削除またはFinishedにしてください。",
|
||||
"typistUserDeletionTranscriptionistGroupError": "(fr)ユーザーの削除に失敗しました。Workflow画面でTranscriptionistGroupから対象Transcriptionistを外してください。",
|
||||
"authorDeletionRoutingRuleError": "(fr)ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象AuthorのAuthorIDを外してください。"
|
||||
"authorDeletionRoutingRuleError": "(fr)ユーザーの削除に失敗しました。Workflow画面でルーティングルールから対象AuthorのAuthorIDを外してください。",
|
||||
"importSuccess": "(fr)ユーザー一括追加を受け付けました。登録処理が完了次第メールが届きますのでご確認ください。",
|
||||
"duplicateEmailError": "(fr)以下の行のメールアドレスがCSV中で重複しています。",
|
||||
"duplicateAuthorIdError": "(fr)以下の行のAuthorIDがCSV中で重複しています。",
|
||||
"overMaxUserError": "(fr)一度に追加できるユーザーは100件までです。",
|
||||
"invalidInputError": "(fr)以下の行のユーザー情報が入力ルールに準拠していません。"
|
||||
},
|
||||
"label": {
|
||||
"title": "Utilisateur",
|
||||
@ -168,7 +173,33 @@
|
||||
"deleteUser": "Supprimer l'utilisateur",
|
||||
"none": "Aucun",
|
||||
"encryptionPassword": "Mot de passe",
|
||||
"encryptionPasswordTerm": "Veuillez définir votre mot de passe en utilisant 4 à 16 caractères alphanumériques et symboles."
|
||||
"encryptionPasswordTerm": "Veuillez définir votre mot de passe en utilisant 4 à 16 caractères alphanumériques et symboles.",
|
||||
"bulkImport": "(fr)Bulk import",
|
||||
"downloadCsv": "(fr)Download CSV",
|
||||
"importCsv": "(fr)Import CSV",
|
||||
"inputRules": "(fr)Input rules",
|
||||
"nameLabel": "(fr)Name",
|
||||
"emailAddressLabel": "(fr)Email Address",
|
||||
"roleLabel": "(fr)Role",
|
||||
"authorIdLabel": "(fr)Author ID",
|
||||
"autoRenewLabel": "(fr)Auto Renew",
|
||||
"notificationLabel": "(fr)Notification",
|
||||
"encryptionLabel": "(fr)Encryption",
|
||||
"encryptionPasswordLabel": "(fr)Encryption Password",
|
||||
"promptLabel": "(fr)Prompt",
|
||||
"addUsers": "(fr)Add users"
|
||||
},
|
||||
"text": {
|
||||
"downloadExplain": "(fr)Download the csv format and enter it according to the rules below.",
|
||||
"nameRule": "(fr)Maximum 225 characters",
|
||||
"emailAddressRule": "(fr)Maximum 225 characters\nCannot use an email address that is already in use.",
|
||||
"roleRule": "(fr)None : 0\nAuthor : 1\nTranscriptionist : 2",
|
||||
"authorIdRule": "(fr)Required only when Role=Author(1)\nMaximum 16 characters\nOnly uppercase alphanumeric characters and \"_\" can be entered.\nCannot use an Author ID that is already in use.",
|
||||
"autoRenewRule": "(fr)0 or 1",
|
||||
"notificationRule": "(fr)0 or 1",
|
||||
"encryptionRule": "(fr)Required only when Role=Author(1)\n0 or 1",
|
||||
"encryptionPasswordRule": "(fr)Required only when Role=Author(1) and Encryption=ON(1)\nOnly 4 to 16 letters, numbers, and symbols can be entered.",
|
||||
"promptRule": "(fr)Required only when Role=Author(1)\n0 or 1"
|
||||
}
|
||||
},
|
||||
"LicenseSummaryPage": {
|
||||
@ -188,7 +219,11 @@
|
||||
"usedSize": "Stockage utilisé",
|
||||
"storageAvailable": "Stockage indisponible (montant dépassée)",
|
||||
"licenseLabel": "Licence",
|
||||
"storageLabel": "Stockage"
|
||||
"storageLabel": "Stockage",
|
||||
"storageUnavailableCheckbox": "(fr)Storage Unavailable"
|
||||
},
|
||||
"message": {
|
||||
"storageUnavalableSwitchingConfirm": "(fr)対象アカウントのストレージ使用制限状態を変更します。よろしいですか?"
|
||||
}
|
||||
},
|
||||
"licenseOrderPage": {
|
||||
@ -198,7 +233,7 @@
|
||||
"newOrderIncorrectError": "Veuillez saisir un nombre supérieur ou égal à 1 pour la nouvelle commande.",
|
||||
"confirmOrder": "Voulez-vous passer commande?",
|
||||
"poNumberConflictError": "Le numéro de bon de commande saisi existe déjà. Veuillez saisir un autre numéro de bon de commande.",
|
||||
"dealerNotFoundError": "(fr)ディーラーが設定されていないため、ライセンスを注文できません。アカウント画面でディーラーを指定してください。"
|
||||
"dealerNotFoundError": "Pour commander une licence, vous devez identifier le revendeur où vous souhaitez l'acheter. Connectez-vous à ODMS Cloud et configurez « Revendeur » dans l'onglet « Compte »."
|
||||
},
|
||||
"label": {
|
||||
"title": "Commander licence",
|
||||
@ -216,7 +251,9 @@
|
||||
"taskNotEditable": "Le transcripteur ne peut pas être changé car la transcription est déjà en cours ou le fichier n'existe pas. Veuillez actualiser l'écran et vérifier le dernier statut.",
|
||||
"backupFailedError": "Le processus de « Sauvegarde de fichier » a échoué. Veuillez réessayer plus tard. Si l'erreur persiste, contactez votre administrateur système.",
|
||||
"cancelFailedError": "Échec de la suppression des dictées. Veuillez actualiser votre écran et réessayer.",
|
||||
"deleteFailedError": "(fr)タスクの削除に失敗しました。画面を更新し、再度ご確認ください。"
|
||||
"deleteFailedError": "(fr)タスクの削除に失敗しました。画面を更新し、再度ご確認ください。",
|
||||
"licenseNotAssignedError": "La transcription n'est pas possible car aucune licence valide n'a été attribuée.Veuillez demander à votre administrateur d'attribuer une licence valide.",
|
||||
"licenseExpiredError": "La transcription n'est pas possible car votre licence est expirée. Veuillez demander à votre administrateur de vous attribuer une licence valide."
|
||||
},
|
||||
"label": {
|
||||
"title": "Dictées",
|
||||
@ -258,7 +295,7 @@
|
||||
"changeTranscriptionist": "Changer de transcriptionniste ",
|
||||
"deleteDictation": "Supprimer la dictée",
|
||||
"selectedTranscriptionist": "Transcriptionniste sélectionné",
|
||||
"poolTranscriptionist": "Liste des transcripteurs",
|
||||
"poolTranscriptionist": "Liste de transcriptionniste",
|
||||
"fileBackup": "Sauvegarde de fichiers",
|
||||
"downloadForBackup": "Télécharger pour sauvegarde",
|
||||
"applications": "Application de bureau",
|
||||
@ -425,7 +462,7 @@
|
||||
"message": {
|
||||
"selectedTypistEmptyError": "Un ou plusieurs transcripteurs doivent être sélectionnés pour enregistrer un groupe de transcription.",
|
||||
"groupSaveFailedError": "Le groupe de transcriptionniste n'a pas pu être enregistré. Les informations affichées peuvent être obsolètes, veuillez donc actualiser l'écran pour voir le dernier statut.",
|
||||
"GroupNameAlreadyExistError": "(fr)このTranscriptionistGroup名は既に登録されています。他のTranscriptionistGroup名で登録してください。",
|
||||
"GroupNameAlreadyExistError": "Ce nom de groupe transcripteur est déjà enregistré. Veuillez vous inscrire avec un autre nom de groupe transcripteur.",
|
||||
"deleteFailedWorkflowAssigned": "(fr)TranscriptionistGroupの削除に失敗しました。Workflow画面でルーティングルールから対象TranscriptionistGroupを外してください。",
|
||||
"deleteFailedCheckoutPermissionExisted": "(fr)TranscriptionistGroupの削除に失敗しました。Dictation画面でタスクのルーティングから対象TranscriptionistGroupを外してください。"
|
||||
}
|
||||
@ -560,10 +597,7 @@
|
||||
"label": {
|
||||
"title": "Support",
|
||||
"howToUse": "Comment utiliser le système",
|
||||
"supportPageEnglish": "OMDS Cloud User Guide",
|
||||
"supportPageGerman": "OMDS Cloud-Benutzerhandbuch",
|
||||
"supportPageFrench": "Guía del usuario de la nube OMDS",
|
||||
"supportPageSpanish": "Guide de l'utilisateur du cloud OMDS"
|
||||
"supportPageLink": "Guide de l'utilisateur du cloud OMDS"
|
||||
},
|
||||
"text": {
|
||||
"notResolved": "Veuillez vous référer au Guide de l'utilisateur pour plus d'informations sur les fonctionnalités d'ODMS Cloud. Si vous avez besoin d'une assistance supplémentaire, veuillez contacter votre administrateur ou votre revendeur certifié ODMS Cloud."
|
||||
|
||||
@ -100,11 +100,11 @@ This is an automatically generated e-mail and this mailbox is not monitored. Ple
|
||||
<h3><Deutsch></h3>
|
||||
<p>Sehr geehrte(r) ${companyName},</p>
|
||||
|
||||
<p>Eine oder mehrere Ihrer zugewiesenen ODMS Cloud-Lizenzen laufen innerhalb von 14 Tagen ab. In Ihrem Bestand ist nicht genügend Anzahl nicht zugewiesener Lizenzen Inventar, um diese an Benutzer mit ablaufenden Lizenzen auszugeben.</p>
|
||||
<p>Eine oder mehrere Ihrer zugewiesenen ODMS Cloud-Lizenzen laufen innerhalb von 14 Tagen ab. In Ihrem Bestand sind nicht ausreichend viele Lizenzen, um diese an Benutzer mit ablaufenden Lizenzen auszugeben.</p>
|
||||
|
||||
<p>Unzureichende Lizenzanzahl: ${shortage}</p>
|
||||
|
||||
<p>Bitte bestellen Sie zusätzliche Jahreslizenzen bei Ihrem ${dealer} um sicherzustellen, dass Sie über ausreichend Lagerbestände Inventar.</p>
|
||||
<p>Bitte bestellen Sie zusätzliche Jahreslizenzen bei Ihrem ${dealer} um sicherzustellen, dass Sie über eine ausreichende Anzahl an Lizenzen verfügen.</p>
|
||||
|
||||
<p>Sie können Benutzern entweder automatisch oder manuell Lizenzen zuweisen. Benutzern mit aktivierter Option „Automatische Zuweisung“ (Standard) wird die Lizenz am Ablaufdatum automatisch aus Ihrem Lizenzbestand zugewiesen. Wenn Sie die Option „Automatisch zuweisen“ deaktivieren, müssen Sie Lizenzen manuell zuweisen.</p>
|
||||
|
||||
@ -113,8 +113,8 @@ URL: <a href="https://odmscloud.omsystem.com/">https://odmscloud.omsystem.com/</
|
||||
|
||||
<p>Wenn Sie Unterstützung bezüglich ODMS benötigen, wenden Sie sich bitte an ${dealer}.</p>
|
||||
|
||||
<p>Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.<br>
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.</p>
|
||||
<p>Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.<br>
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.</p>
|
||||
|
||||
|
||||
<h3><Français></h3>
|
||||
|
||||
@ -98,8 +98,8 @@ URL: <a href="https://odmscloud.omsystem.com/">https://odmscloud.omsystem.com/</
|
||||
|
||||
<p>Wenn Sie Unterstützung bezüglich ODMS benötigen, wenden Sie sich bitte an ${dealer}.</p>
|
||||
|
||||
<p>Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.<br>
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.</p>
|
||||
<p>Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.<br>
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.</p>
|
||||
|
||||
|
||||
<h3><Français></h3>
|
||||
|
||||
@ -52,6 +52,7 @@ import { WorkflowsRepositoryModule } from './repositories/workflows/workflows.re
|
||||
import { TermsModule } from './features/terms/terms.module';
|
||||
import { RedisModule } from './gateways/redis/redis.module';
|
||||
import * as redisStore from 'cache-manager-redis-store';
|
||||
import { CheckHeaderMiddleware } from './common/check-header.middleware';
|
||||
@Module({
|
||||
imports: [
|
||||
ServeStaticModule.forRootAsync({
|
||||
@ -164,6 +165,13 @@ import * as redisStore from 'cache-manager-redis-store';
|
||||
})
|
||||
export class AppModule {
|
||||
configure(consumer: MiddlewareConsumer) {
|
||||
consumer.apply(LoggerMiddleware).forRoutes('');
|
||||
consumer
|
||||
.apply(LoggerMiddleware)
|
||||
.forRoutes('');
|
||||
// stage=localの場合はmiddlewareを適用しない
|
||||
// ローカル環境ではサーバーから静的ファイルも返すため、APIリクエスト以外のリクエストにもmiddlewareが適用されてしまう
|
||||
if (process.env.STAGE !== 'local') {
|
||||
consumer.apply(CheckHeaderMiddleware).forRoutes('');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
32
dictation_server/src/common/check-header.middleware.ts
Normal file
32
dictation_server/src/common/check-header.middleware.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import {
|
||||
HttpException,
|
||||
Injectable,
|
||||
Logger,
|
||||
NestMiddleware,
|
||||
} from '@nestjs/common';
|
||||
import { Request, Response, NextFunction } from 'express';
|
||||
|
||||
/**
|
||||
* CheckHeaderMiddleware
|
||||
* リクエストヘッダのチェックを行うミドルウェア
|
||||
*
|
||||
* ローカル環境ではヘッダチェックを行わない
|
||||
*/
|
||||
@Injectable()
|
||||
export class CheckHeaderMiddleware implements NestMiddleware {
|
||||
private readonly logger = new Logger(CheckHeaderMiddleware.name);
|
||||
use(req: Request, res: Response, next: NextFunction): void {
|
||||
// /healthcheckはheaderチェックを行わない
|
||||
if (req.url === '/health') {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
|
||||
if (req.headers['x-requested-with'] === 'XMLHttpRequest') {
|
||||
next();
|
||||
} else {
|
||||
this.logger.error('header check failed');
|
||||
throw new HttpException('header check failed', 400);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -15,9 +15,12 @@ export const makePassword = (): string => {
|
||||
|
||||
// autoGeneratedPasswordが以上の条件を満たせばvalidがtrueになる
|
||||
let valid = false;
|
||||
let autoGeneratedPassword: string = '';
|
||||
let autoGeneratedPassword = '';
|
||||
|
||||
while (!valid) {
|
||||
// 再生成用に変数を初期化する
|
||||
autoGeneratedPassword = '';
|
||||
|
||||
// パスワードをランダムに決定
|
||||
while (autoGeneratedPassword.length < passLength) {
|
||||
// 上で決定したcharsの中からランダムに1文字ずつ追加
|
||||
|
||||
@ -946,6 +946,72 @@ describe('TasksService', () => {
|
||||
expect(task.jobNumber).toEqual('00000001');
|
||||
}
|
||||
});
|
||||
it('[Admin] Taskが100件であっても取得できる', async () => {
|
||||
const notificationhubServiceMockValue =
|
||||
makeDefaultNotificationhubServiceMockValue();
|
||||
if (!source) fail();
|
||||
const module = await makeTaskTestingModuleWithNotificaiton(
|
||||
source,
|
||||
notificationhubServiceMockValue,
|
||||
);
|
||||
if (!module) fail();
|
||||
const { id: accountId } = await makeTestSimpleAccount(source);
|
||||
const { external_id } = await makeTestUser(source, {
|
||||
account_id: accountId,
|
||||
external_id: 'userId',
|
||||
role: 'none',
|
||||
});
|
||||
const { id: authorUserId, author_id } = await makeTestUser(source, {
|
||||
account_id: accountId,
|
||||
external_id: 'userId',
|
||||
author_id: 'MY_AUTHOR_ID',
|
||||
role: 'author',
|
||||
});
|
||||
|
||||
const service = module.get<TasksService>(TasksService);
|
||||
for (let i = 0; i < 100; i++) {
|
||||
await createTask(
|
||||
source,
|
||||
accountId,
|
||||
authorUserId,
|
||||
author_id ?? '',
|
||||
`WORKTYPE${i + 1}`,
|
||||
'01',
|
||||
// 00000001 ~ 00000100
|
||||
`000000${String(i + 1).padStart(2, '0')}`,
|
||||
'Uploaded',
|
||||
);
|
||||
}
|
||||
const offset = 0;
|
||||
const limit = 100;
|
||||
const status = ['Uploaded', 'Backup'];
|
||||
const paramName = 'WORK_TYPE';
|
||||
const direction = 'DESC';
|
||||
|
||||
const { tasks, total } = await service.getTasks(
|
||||
makeContext('trackingId', 'requestId'),
|
||||
external_id,
|
||||
[ADMIN_ROLES.ADMIN, USER_ROLES.NONE],
|
||||
offset,
|
||||
limit,
|
||||
status,
|
||||
paramName,
|
||||
direction,
|
||||
);
|
||||
expect(tasks.length).toEqual(100);
|
||||
expect(total).toEqual(100);
|
||||
// ソート条件がWORK_TYPEのため、WORK_TYPEが降順になっていることを確認
|
||||
expect(tasks[0].workType).toEqual('WORKTYPE99');
|
||||
expect(tasks[99].workType).toEqual('WORKTYPE1');
|
||||
expect(tasks[0].optionItemList).toEqual(
|
||||
Array.from({ length: 10 }).map((_, i) => {
|
||||
return {
|
||||
optionItemLabel: `label${i}:audio_file_id${tasks[0].audioFileId}`,
|
||||
optionItemValue: `value${i}:audio_file_id${tasks[0].audioFileId}`,
|
||||
};
|
||||
}),
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@ -435,12 +435,14 @@ export class TasksService {
|
||||
`author_id not found. audioFileId: ${audioFileId}. account_id: ${user.account_id}`,
|
||||
);
|
||||
}
|
||||
const { external_id: authorExternalId } =
|
||||
await this.usersRepository.findUserByAuthorId(
|
||||
context,
|
||||
task.file.author_id,
|
||||
user.account_id,
|
||||
);
|
||||
const {
|
||||
external_id: authorExternalId,
|
||||
notification: authorNotification,
|
||||
} = await this.usersRepository.findUserByAuthorId(
|
||||
context,
|
||||
task.file.author_id,
|
||||
user.account_id,
|
||||
);
|
||||
|
||||
// プライマリ管理者を取得
|
||||
const { external_id: primaryAdminExternalId } =
|
||||
@ -454,6 +456,7 @@ export class TasksService {
|
||||
]);
|
||||
|
||||
// メール送信に必要な情報を取得
|
||||
// Author通知ON/OFF関わらずAuthor名は必要なため、情報の取得は行う
|
||||
const author = usersInfo.find((x) => x.id === authorExternalId);
|
||||
if (!author) {
|
||||
throw new Error(`author not found. id=${authorExternalId}`);
|
||||
@ -488,7 +491,7 @@ export class TasksService {
|
||||
// メール送信
|
||||
this.sendgridService.sendMailWithU117(
|
||||
context,
|
||||
authorEmail,
|
||||
authorNotification ? authorEmail : null,
|
||||
typistEmail,
|
||||
authorName,
|
||||
task.file.file_name.replace('.zip', ''),
|
||||
|
||||
@ -875,7 +875,7 @@ export class SendGridService {
|
||||
*/
|
||||
async sendMailWithU117(
|
||||
context: Context,
|
||||
authorEmail: string,
|
||||
authorEmail: string | null,
|
||||
typistEmail: string,
|
||||
authorName: string,
|
||||
fileName: string,
|
||||
@ -903,7 +903,7 @@ export class SendGridService {
|
||||
// メールを送信する
|
||||
await this.sendMail(
|
||||
context,
|
||||
[authorEmail, typistEmail],
|
||||
[authorEmail, typistEmail].filter((x): x is string => x !== null), // authorEmailがnullの場合は除外する
|
||||
[],
|
||||
this.mailFrom,
|
||||
subject,
|
||||
|
||||
@ -50,7 +50,7 @@
|
||||
wurde erfolgreich registriert.
|
||||
</p>
|
||||
<p>
|
||||
Wir haben Ihrem Konto [100] Testlizenzen gewährt, die 30 Tage gültig
|
||||
Wir haben Ihrem Konto [100] Testlizenzen hinzugefügt, die 30 Tage gültig
|
||||
sind. Während der Testversion können Sie alle Funktionen von ODMS Cloud
|
||||
ausprobieren.
|
||||
</p>
|
||||
@ -77,10 +77,11 @@
|
||||
Ihren ausgewählten zugelassenen OM SYSTEM-Audiohändler.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie
|
||||
diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird
|
||||
nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -24,7 +24,7 @@ Sehr geehrte(r) $CUSTOMER_NAME$,
|
||||
|
||||
Vielen Dank, dass Sie sich für ODMS Cloud entschieden haben. Ihr Konto wurde erfolgreich registriert.
|
||||
|
||||
Wir haben Ihrem Konto [100] Testlizenzen gewährt, die 30 Tage gültig sind. Während der Testversion können Sie alle Funktionen von ODMS Cloud ausprobieren.
|
||||
Wir haben Ihrem Konto [100] Testlizenzen hinzugefügt, die 30 Tage gültig sind. Während der Testversion können Sie alle Funktionen von ODMS Cloud ausprobieren.
|
||||
|
||||
Wenn Sie ODMS Cloud nach Ablauf des Testzeitraums weiterhin nutzen möchten, wenden Sie sich bitte an einen autorisierten OM SYSTEM-Audiohändler, um Jahreslizenzen zu erwerben. Verschiedene Einstellungen, einschließlich der Händlerauswahl, können in der ODMS Cloud auf der Registerkarte „Konto“ konfiguriert werden.
|
||||
|
||||
@ -35,8 +35,8 @@ Nachdem Sie einen Händler ausgewählt haben, wählen Sie bitte die Registerkart
|
||||
|
||||
Wenn Sie Hilfe mit ODMS Cloud benötigen, wenden Sie sich bitte direkt an Ihren ausgewählten zugelassenen OM SYSTEM-Audiohändler.
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -32,10 +32,11 @@
|
||||
</p>
|
||||
<p>URL: <a href="$VERIFY_LINK$">$VERIFY_LINK$</a></p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie
|
||||
diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird
|
||||
nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -13,8 +13,8 @@ Ihre Benutzerinformationen wurden von Ihnen selbst in der ODMS Cloud registriert
|
||||
|
||||
URL: $VERIFY_LINK$
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -35,24 +35,29 @@
|
||||
<h3><Deutsch></h3>
|
||||
<p>Sehr geehrte(r) $CUSTOMER_NAME$,</p>
|
||||
<p>
|
||||
Wir haben Ihre gewünschte Lizenzbestellung erhalten.<br />
|
||||
wir habenn Ihre Lizenzbestellung erhalten.<br />
|
||||
- Anzahl der bestellten Lizenzen: $LICENSE_QUANTITY$<br />
|
||||
- Bestellnummer: $PO_NUMBER$
|
||||
- PO-Nummer: $PO_NUMBER$
|
||||
</p>
|
||||
<p>
|
||||
Die Lizenzen werden von Ihrem $DEALER_NAME$ ausgestellt, den Sie in den Einstellungen ausgewählt haben.
|
||||
Von Ihrem Händler ausgestellte Lizenzen werden in Ihrem Lizenzbestand gespeichert.
|
||||
Bitte melden Sie sich bei der ODMS Cloud an, um Lizenzen anzuzeigen und Ihren Benutzern zuzuweisen.
|
||||
Die Lizenzen werden von $DEALER_NAME$ ausgestellt, die Sie in den
|
||||
Einstellungen ausgewählt haben. Die von Ihrem Händler ausgestellten
|
||||
Lizenzen werden in Ihrem Lizenzbestand gespeichert. Bitte loggen Sie
|
||||
sich in die ODMS Cloud ein, um die Lizenzen einzusehen und sie Ihren
|
||||
Nutzern zuzuordnen.
|
||||
</p>
|
||||
<p>
|
||||
Lizenzen sind ab dem Datum, an dem sie einem Benutzer zugewiesen wurden, 12 Monate lang gültig.
|
||||
Die Lizenzen sind ab dem Datum, an dem sie einem Benutzer zugewiesen wurden, 12 Monate lang gültig.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie Unterstützung bezüglich ODMS Cloud benötigen, wenden Sie sich bitte an $DEALER_NAME$.
|
||||
Wenn Sie Unterstützung bezüglich ODMS Cloud benötigen, wenden Sie sich
|
||||
bitte an $DEALER_NAME$.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht
|
||||
überwacht. Bitte antworten Sie nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -19,18 +19,18 @@ This is an automatically generated e-mail and this mailbox is not monitored. P
|
||||
|
||||
Sehr geehrte(r) $CUSTOMER_NAME$,
|
||||
|
||||
Wir haben Ihre gewünschte Lizenzbestellung erhalten.
|
||||
wir habenn Ihre Lizenzbestellung erhalten.
|
||||
- Anzahl der bestellten Lizenzen: $LICENSE_QUANTITY$
|
||||
- Bestellnummer: $PO_NUMBER$
|
||||
- PO-Nummer: $PO_NUMBER$
|
||||
|
||||
Die Lizenzen werden von Ihrem $DEALER_NAME$ ausgestellt, den Sie in den Einstellungen ausgewählt haben. Von Ihrem Händler ausgestellte Lizenzen werden in Ihrem Lizenzbestand gespeichert. Bitte melden Sie sich bei der ODMS Cloud an, um Lizenzen anzuzeigen und Ihren Benutzern zuzuweisen.
|
||||
Die Lizenzen werden von $DEALER_NAME$ ausgestellt, die Sie in den Einstellungen ausgewählt haben. Die von Ihrem Händler ausgestellten Lizenzen werden in Ihrem Lizenzbestand gespeichert. Bitte loggen Sie sich in die ODMS Cloud ein, um die Lizenzen einzusehen und sie Ihren Nutzern zuzuordnen.
|
||||
|
||||
Lizenzen sind ab dem Datum, an dem sie einem Benutzer zugewiesen wurden, 12 Monate lang gültig.
|
||||
Die Lizenzen sind ab dem Datum, an dem sie einem Benutzer zugewiesen wurden, 12 Monate lang gültig.
|
||||
|
||||
Wenn Sie Unterstützung bezüglich ODMS Cloud benötigen, wenden Sie sich bitte an $DEALER_NAME$.
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -27,17 +27,18 @@
|
||||
<p>
|
||||
Wir haben die Stornierung Ihrer letzten Lizenzbestellung erhalten.<br />
|
||||
- Anzahl der gekündigten Lizenzen: $LICENSE_QUANTITY$<br />
|
||||
- Bestellnummer: $PO_NUMBER$
|
||||
- PO-Nummer: $PO_NUMBER$
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie Unterstützung bezüglich ODMS Cloud benötigen, wenden Sie sich
|
||||
bitte an $DEALER_NAME$.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie
|
||||
diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird
|
||||
nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -17,12 +17,12 @@ Sehr geehrte(r) $CUSTOMER_NAME$,
|
||||
|
||||
Wir haben die Stornierung Ihrer letzten Lizenzbestellung erhalten.
|
||||
- Anzahl der gekündigten Lizenzen: $LICENSE_QUANTITY$
|
||||
- Bestellnummer: $PO_NUMBER$
|
||||
- PO-Nummer: $PO_NUMBER$
|
||||
|
||||
Wenn Sie Unterstützung bezüglich ODMS Cloud benötigen, wenden Sie sich bitte an $DEALER_NAME$.
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -33,7 +33,7 @@
|
||||
<p>
|
||||
Die von Ihnen bestellten ODMS Cloud-Lizenzen wurden ausgestellt.<br />
|
||||
- Anzahl der ausgestellten Lizenzen: $LICENSE_QUANTITY$<br />
|
||||
- Bestellnummer: $PO_NUMBER$
|
||||
- PO-Nummer: $PO_NUMBER$
|
||||
</p>
|
||||
<p>
|
||||
Um ODMS Cloud nutzen zu können, müssen Sie Ihre Benutzer im System
|
||||
@ -46,10 +46,11 @@
|
||||
bitte an $DEALER_NAME$.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie
|
||||
diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird
|
||||
nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -19,14 +19,14 @@ Sehr geehrte(r) $CUSTOMER_NAME$,
|
||||
|
||||
Die von Ihnen bestellten ODMS Cloud-Lizenzen wurden ausgestellt.
|
||||
- Anzahl der ausgestellten Lizenzen: $LICENSE_QUANTITY$
|
||||
- Bestellnummer: $PO_NUMBER$
|
||||
- PO-Nummer: $PO_NUMBER$
|
||||
|
||||
Um ODMS Cloud nutzen zu können, müssen Sie Ihre Benutzer im System registrieren und diesen Benutzern Lizenzen zuweisen. Bitte melden Sie sich beim Starten der App mit der E-Mail-Adresse und dem Passwort Ihres registrierten Benutzers am System an.
|
||||
|
||||
Wenn Sie Unterstützung bezüglich ODMS Cloud benötigen, wenden Sie sich bitte an $DEALER_NAME$.
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -45,10 +45,11 @@
|
||||
bitte an $DEALER_NAME$.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie
|
||||
diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird
|
||||
nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -27,8 +27,8 @@ URL: $TOP_URL$
|
||||
|
||||
Wenn Sie Unterstützung bezüglich ODMS Cloud benötigen, wenden Sie sich bitte an $DEALER_NAME$.
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -38,10 +38,11 @@
|
||||
URL: $TOP_URL$
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie
|
||||
diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird
|
||||
nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -23,8 +23,8 @@ Bitte beachten Sie, dass dem folgenden Benutzer eine Lizenz zugewiesen wurde.
|
||||
Bitte melden Sie sich bei ODMS Cloud an, um das Ablaufdatum der Lizenz zu überprüfen.
|
||||
URL: $TOP_URL$
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -1,52 +1,62 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>License Returned Notification [U-109]</title>
|
||||
</head>
|
||||
|
||||
<head>
|
||||
<title>License Returned Notification [U-109]</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div>
|
||||
<h3><English></h3>
|
||||
<p>Dear $DEALER_NAME$,</p>
|
||||
<p>
|
||||
Please be informed that the licenses issued with the following contents has been returned from your customer and placed back into your License inventory.<br />
|
||||
- Company Name: $CUSTOMER_NAME$<br />
|
||||
- Number of canceled licenses: $LICENSE_QUANTITY$<br />
|
||||
- PO Number: $PO_NUMBER$
|
||||
</p>
|
||||
<p>
|
||||
If you have received this e-mail in error, please delete this e-mail from your system.<br />
|
||||
This is an automatically generated e-mail and this mailbox is not monitored. Please do not reply.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<h3><Deutsch></h3>
|
||||
<p>Sehr geehrte(r) $DEALER_NAME$,</p>
|
||||
<p>
|
||||
Bitte beachten Sie, dass die ausgestellten Lizenzen mit den folgenden Inhalten von Ihrem Kunden zurückgegeben und wieder in Ihren Lizenzbestand aufgenommen wurden.<br />
|
||||
- Name der Firma: $CUSTOMER_NAME$<br />
|
||||
- Anzahl der gekündigten Lizenzen: $LICENSE_QUANTITY$<br />
|
||||
- Bestellnummer: $PO_NUMBER$
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<h3><Français></h3>
|
||||
<p>Chère/Cher $DEALER_NAME$,</p>
|
||||
<p>
|
||||
Veuillez noter que les licences émises avec le contenu suivant ont été retournées par votre client et replacées dans votre inventaire de licences.<br />
|
||||
- Nom de l'entreprise: $CUSTOMER_NAME$<br />
|
||||
- Nombre de licences annulées: $LICENSE_QUANTITY$<br />
|
||||
- Numéro de bon de commande $PO_NUMBER$
|
||||
</p>
|
||||
<p>
|
||||
Si vous avez reçu cet e-mail par erreur, veuillez supprimer cet e-mail de votre système.<br />
|
||||
Il s'agit d'un e-mail généré automatiquement et cette boîte aux lettres n'est pas surveillée. Merci de ne pas répondre.
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
<body>
|
||||
<div>
|
||||
<h3><English></h3>
|
||||
<p>Dear $DEALER_NAME$,</p>
|
||||
<p>
|
||||
Please be informed that the licenses issued with the following contents
|
||||
has been returned from your customer and placed back into your License
|
||||
inventory.<br />
|
||||
- Company Name: $CUSTOMER_NAME$<br />
|
||||
- Number of canceled licenses: $LICENSE_QUANTITY$<br />
|
||||
- PO Number: $PO_NUMBER$
|
||||
</p>
|
||||
<p>
|
||||
If you have received this e-mail in error, please delete this e-mail
|
||||
from your system.<br />
|
||||
This is an automatically generated e-mail and this mailbox is not
|
||||
monitored. Please do not reply.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<h3><Deutsch></h3>
|
||||
<p>Sehr geehrte(r) $DEALER_NAME$,</p>
|
||||
<p>
|
||||
Bitte beachten Sie, dass die ausgestellten Lizenzen mit den folgenden
|
||||
Inhalten von Ihrem Kunden zurückgegeben und wieder in Ihren
|
||||
Lizenzbestand aufgenommen wurden.<br />
|
||||
- Name der Firma: $CUSTOMER_NAME$<br />
|
||||
- Anzahl der gekündigten Lizenzen: $LICENSE_QUANTITY$<br />
|
||||
- PO-Nummer: $PO_NUMBER$
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht
|
||||
überwacht. Bitte antworten Sie nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<h3><Français></h3>
|
||||
<p>Chère/Cher $DEALER_NAME$,</p>
|
||||
<p>
|
||||
Veuillez noter que les licences émises avec le contenu suivant ont été
|
||||
retournées par votre client et replacées dans votre inventaire de
|
||||
licences.<br />
|
||||
- Nom de l'entreprise: $CUSTOMER_NAME$<br />
|
||||
- Nombre de licences annulées: $LICENSE_QUANTITY$<br />
|
||||
- Numéro de bon de commande $PO_NUMBER$
|
||||
</p>
|
||||
<p>
|
||||
Si vous avez reçu cet e-mail par erreur, veuillez supprimer cet e-mail
|
||||
de votre système.<br />
|
||||
Il s'agit d'un e-mail généré automatiquement et cette boîte aux lettres
|
||||
n'est pas surveillée. Merci de ne pas répondre.
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -17,10 +17,10 @@ Sehr geehrte(r) $DEALER_NAME$,
|
||||
Bitte beachten Sie, dass die ausgestellten Lizenzen mit den folgenden Inhalten von Ihrem Kunden zurückgegeben und wieder in Ihren Lizenzbestand aufgenommen wurden.
|
||||
- Name der Firma: $CUSTOMER_NAME$
|
||||
- Anzahl der gekündigten Lizenzen: $LICENSE_QUANTITY$
|
||||
- Bestellnummer: $PO_NUMBER$
|
||||
- PO-Nummer: $PO_NUMBER$
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -37,10 +37,11 @@
|
||||
URL: $TOP_URL$
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie
|
||||
diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird
|
||||
nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
<p></p>
|
||||
</div>
|
||||
|
||||
@ -19,8 +19,8 @@ Vielen Dank, dass Sie ODMS Cloud nutzen. Ihr Konto, einschließlich aller Inform
|
||||
Wenn Sie ODMS Cloud erneut nutzen möchten, müssen Sie Ihre Kontoinformationen erneut registrieren und Jahreslizenzen bei einem autorisierten OM Digital Solutions-Händler bestellen.
|
||||
URL: $TOP_URL$
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -36,10 +36,11 @@
|
||||
bitte an $DEALER_NAME$.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie
|
||||
diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird
|
||||
nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -19,8 +19,8 @@ URL: $TOP_URL$
|
||||
|
||||
Wenn Sie Unterstützung bezüglich ODMS Cloud benötigen, wenden Sie sich bitte an $DEALER_NAME$.
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -29,10 +29,11 @@
|
||||
URL: $TOP_URL$
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie
|
||||
diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird
|
||||
nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -15,8 +15,8 @@ Sehr geehrte(r) $CUSTOMER_NAME$, -> $PRIMARY_ADMIN_NAME$
|
||||
Ihre Kontoinformationen wurden erfolgreich bearbeitet. Um die Kontoinformationen Ihres Unternehmens zu überprüfen oder zu ändern, melden Sie sich bitte bei ODMS Cloud an.
|
||||
URL: $TOP_URL$
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -40,10 +40,11 @@
|
||||
bitte an $PRIMARY_ADMIN_NAME$.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie
|
||||
diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird
|
||||
nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -17,8 +17,8 @@ Temporäres Passwort: $TEMPORARY_PASSWORD$
|
||||
|
||||
Wenn Sie Unterstützung bezüglich ODMS Cloud benötigen, wenden Sie sich bitte an $PRIMARY_ADMIN_NAME$.
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -40,10 +40,11 @@
|
||||
bitte an $PRIMARY_ADMIN_NAME$.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie
|
||||
diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird
|
||||
nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -17,8 +17,8 @@ URL: $VERIFY_LINK$
|
||||
|
||||
Wenn Sie Unterstützung bezüglich ODMS Cloud benötigen, wenden Sie sich bitte an $PRIMARY_ADMIN_NAME$.
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -28,10 +28,11 @@
|
||||
Benutzerinformationen haben.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie
|
||||
diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird
|
||||
nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -13,8 +13,8 @@ Sehr geehrte(r) $USER_NAME$,
|
||||
|
||||
Ihre Benutzerinformationen wurden bearbeitet. Bitte wenden Sie sich an $PRIMARY_ADMIN_NAME$ wenn Sie Fragen zu Ihren bearbeiteten Benutzerinformationen haben.
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
@ -33,8 +33,11 @@
|
||||
Wenn Sie Unterstützung bezüglich ODMS Cloud benötigen, wenden Sie sich bitte an $PRIMARY_ADMIN_NAME$.
|
||||
</p>
|
||||
<p>
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese
|
||||
E-Mail bitte aus Ihrem System.<br />
|
||||
Dies ist eine automatisch generierte
|
||||
E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie
|
||||
nicht.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@ -21,8 +21,8 @@ Die Transkription des Diktats, das Sie in die ODMS Cloud hochgeladen haben, ist
|
||||
|
||||
Wenn Sie Unterstützung bezüglich ODMS Cloud benötigen, wenden Sie sich bitte an $PRIMARY_ADMIN_NAME$.
|
||||
|
||||
Wenn Sie diese E-Mail fälschlicherweise erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und dieses Postfach wird nicht überwacht. Bitte nicht antworten.
|
||||
Wenn Sie diese E-Mail irrtümlich erhalten haben, löschen Sie diese E-Mail bitte aus Ihrem System.
|
||||
Dies ist eine automatisch generierte E-Mail und diese Mailbox wird nicht überwacht. Bitte antworten Sie nicht.
|
||||
|
||||
<Français>
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user