@chevre/domain
Version:
Chevre Domain Library for Node.js
128 lines (127 loc) • 5.04 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.open = open;
exports.transferMoney = transferMoney;
exports.cancelMoneyTransfer = cancelMoneyTransfer;
/**
* 口座サービス
* 開設、閉鎖等、口座アクション実行など
*/
const factory = require("../factory");
/**
* 口座を開設する
*/
function open(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const openDate = new Date();
return repos.account.open(params.map((p) => {
return {
project: { typeOf: factory.organizationType.Project, id: p.project.id },
typeOf: p.typeOf,
name: p.name,
accountType: p.accountType,
accountNumber: p.accountNumber,
initialBalance: p.initialBalance,
openDate: openDate
};
}));
});
}
/**
* 口座を解約する
*/
// export function close(params: {
// /**
// * 口座番号
// */
// accountNumber: string;
// }) {
// return async (repos: {
// account: AccountRepo;
// }) => {
// await repos.account.close({
// accountNumber: params.accountNumber,
// closeDate: new Date()
// });
// };
// }
/**
* 転送する
* 確定取引結果から、実際の転送アクションを実行します。
*/
function transferMoney(actionAttributes) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
const action = actionAttributes;
let fromAccountNumber;
let toAccountNumber;
try {
fromAccountNumber = (typeof action.fromLocation.accountNumber === 'string')
? action.fromLocation.accountNumber
// tslint:disable-next-line:no-single-line-block-comment
/* istanbul ignore next */
: undefined;
toAccountNumber = (typeof action.toLocation.accountNumber === 'string')
? action.toLocation.accountNumber
// tslint:disable-next-line:no-single-line-block-comment
/* istanbul ignore next */
: undefined;
yield repos.account.settleTransaction({
fromAccountNumber: fromAccountNumber,
toAccountNumber: toAccountNumber,
amount: (typeof action.amount === 'number') ? action.amount : Number(action.amount.value),
transactionId: action.purpose.id
});
}
catch (error) {
throw error;
}
});
}
/**
* 転送取消
* 期限切れ、あるいは、中止された取引から、転送をアクションを取り消します。
*/
function cancelMoneyTransfer(params) {
return (repos) => __awaiter(this, void 0, void 0, function* () {
let fromAccountNumber;
let toAccountNumber;
// 取引存在確認
const transaction = yield repos.accountTransaction.findById({ typeOf: params.transaction.typeOf, id: params.transaction.id });
switch (params.transaction.typeOf) {
case factory.account.transactionType.Deposit:
toAccountNumber =
transaction.object.toLocation.accountNumber;
break;
case factory.account.transactionType.Withdraw:
fromAccountNumber =
transaction.object.fromLocation.accountNumber;
break;
case factory.account.transactionType.Transfer:
fromAccountNumber =
transaction.object.fromLocation.accountNumber;
toAccountNumber =
// tslint:disable-next-line:max-line-length
transaction.object.toLocation.accountNumber;
break;
default:
throw new factory.errors.Argument('typeOf', `transaction type ${params.transaction.typeOf} unknown`);
}
yield repos.account.voidTransaction({
fromAccountNumber: fromAccountNumber,
toAccountNumber: toAccountNumber,
amount: (typeof transaction.object.amount === 'number')
? transaction.object.amount
: transaction.object.amount.value,
transactionId: transaction.id
});
});
}
;