// tslint:disable:no-implicit-dependencies no-console import { chevre } from '../../../lib/index'; import * as csv from 'csvtojson'; import * as fs from 'fs'; import * as json2csv from 'json2csv'; import * as moment from 'moment'; import * as mongoose from 'mongoose'; const csvFilePath = `${__dirname}/test.csv`; const project = { id: String(process.env.PROJECT_ID) }; const now = moment('2021-05-31T15:00:00Z') .toDate(); export interface IReport { identifier: string; // transactionNumber: transaction.transactionNumber, // startDate: transaction.startDate, personId: string; username: string; givenName: string; familyName: string; accountNumber: string; sellerId: string; sellerName: string; } async function main() { await mongoose.connect(process.env.MONGOLAB_URI, { autoIndex: false, useUnifiedTopology: true }); const sellerRepo = new chevre.repository.Seller(mongoose.connection); const sellers = await sellerRepo.search({}); const personRepo = new chevre.repository.Person({ userPoolId: process.env.COGNITO_USER_POOL_ID }); const membershipOwnershipInfos = await csv() .fromFile(csvFilePath); console.log(membershipOwnershipInfos); // return; const reports: IReport[] = []; let i = 0; for (const membershipOwnershipInfo of membershipOwnershipInfos) { i += 1; console.log('searching person...', membershipOwnershipInfo.ownedById, i); const people = await personRepo.search({ id: membershipOwnershipInfo.ownedById }); let person: chevre.factory.person.IPerson = { typeOf: chevre.factory.personType.Person, id: 'unknown', memberOf: { membershipNumber: 'unknown', typeOf: chevre.factory.programMembership.ProgramMembershipType.ProgramMembership }, givenName: '', familyName: '' }; if (people.length > 0) { person = people[0]; console.log(people.length, person.memberOf?.membershipNumber, 'people found', membershipOwnershipInfo.ownedById, i); } else { console.log('people not found', membershipOwnershipInfo.ownedById, i); } const permitOwnershipInfo = await findAccount({ project: project, customer: { id: membershipOwnershipInfo.ownedById }, now: now })(); if (permitOwnershipInfo !== undefined) { console.log( 'permitOwnershipInfo found', permitOwnershipInfo.identifier, membershipOwnershipInfo.ownedById, i ); } else { console.log('permitOwnershipInfo not found', membershipOwnershipInfo.ownedById, i); } const seller = sellers.find((s) => s.id === membershipOwnershipInfo.sellerId); console.log('seller found', (seller?.name).ja); reports.push({ identifier: membershipOwnershipInfo.identifier, // transactionNumber: transaction.transactionNumber, // startDate: transaction.startDate, personId: membershipOwnershipInfo.ownedById, username: String(person.memberOf?.membershipNumber), givenName: String(person.givenName), familyName: String(person.familyName), accountNumber: (typeof permitOwnershipInfo?.identifier === 'string') ? permitOwnershipInfo.identifier : 'unknown', sellerId: membershipOwnershipInfo.sellerId, sellerName: String((seller?.name).ja) }); } // console.log(reports); console.log(reports.length); // const fields = ['id', 'transactionNumber', 'startDate', 'personId', 'username']; // const fields = ['identifier', 'personId', 'username', 'givenName', 'familyName', 'accountNumber', 'sellerId', 'sellerName']; const fields = [ { label: 'identifier', value: 'identifier' }, { label: '会員ID', value: 'personId' }, { label: 'username', value: 'username' }, { label: 'givenName', value: 'givenName' }, { label: 'familyName', value: 'familyName' }, { label: '口座番号', value: 'accountNumber' }, { label: '販売者ID', value: 'sellerId' }, { label: '販売者名称', value: 'sellerName' } ]; const opts = { fields }; try { const outputCsvStr = json2csv.parse(reports, opts); // tslint:disable-next-line:non-literal-fs-path fs.writeFileSync(`${__dirname}/ownershipInfosWithPersonDetails.csv`, outputCsvStr); } catch (err) { console.error(err); } } function findAccount(params: { project: { id: string }; customer: { id: string }; now: Date; }) { return async (): Promise => { const ownershipInfoRepo = new chevre.repository.OwnershipInfo(mongoose.connection); // let accountOwnershipInfos = await search({ // project: { typeOf: factory.organizationType.Project, id: params.project.id }, // conditions: { // // 最も古い所有口座をデフォルト口座として扱う使用なので、ソート条件はこの通り // sort: { ownedFrom: factory.sortType.Ascending }, // limit: 1, // typeOfGood: { typeOf: { $eq: 'Account' }, // ownedBy: { id: params.customer.id }, // ownedFrom: params.now, // ownedThrough: params.now // } // })({ // ownershipInfo: repos.ownershipInfo // }); // 口座所有権を検索 const ownershipInfos = await ownershipInfoRepo.search({ // 最も古い所有口座をデフォルト口座として扱う使用なので、ソート条件はこの通り sort: { ownedFrom: chevre.factory.sortType.Ascending }, limit: 1, page: 1, // ...params.conditions, project: { id: { $eq: params.project.id } }, typeOfGood: { typeOf: { $eq: 'Account' } }, ownedBy: { id: params.customer.id }, ownedFrom: params.now, ownedThrough: params.now }); if (ownershipInfos.length === 0) { return; // throw new domain.factory.errors.NotFound('accountOwnershipInfos'); } return ownershipInfos[0].typeOfGood; }; } main() .then(() => { console.log('success!'); }) .catch(console.error);