package sample.model; import java.math.BigDecimal; import java.time.*; import java.util.*; import java.util.stream.Collectors; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.*; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.support.TransactionTemplate; import lombok.Setter; import sample.ActionStatusType; import sample.context.*; import sample.context.orm.*; import sample.model.account.*; import sample.model.account.type.AccountStatusType; import sample.model.asset.*; import sample.model.asset.Cashflow.RegCashflow; import sample.model.asset.type.CashflowType; import sample.model.master.*; import sample.util.*; /** * データ生成用のサポートコンポーネント。 * <p>テストや開発時の簡易マスタデータ生成を目的としているため本番での利用は想定していません。 */ @Component @ConditionalOnProperty(prefix = "extension.datafixture", name = "enabled", matchIfMissing = false) @Setter public class DataFixtures { @Autowired private Timestamper time; @Autowired private BusinessDayHandler businessDay; @Autowired private PasswordEncoder encoder; @Autowired private DefaultRepository rep; @Autowired @Qualifier(DefaultRepository.BeanNameTx) private PlatformTransactionManager tx; @Autowired private SystemRepository repSystem; @Autowired @Qualifier(SystemRepository.BeanNameTx) private PlatformTransactionManager txSystem; @PostConstruct public void initialize() { new TransactionTemplate(txSystem).execute((status) -> { initializeInTxSystem(); return true; }); new TransactionTemplate(tx).execute((status) -> { initializeInTx(); return true; }); } public void initializeInTxSystem() { String day = DateUtils.dayFormat(LocalDate.now()); new AppSetting(Timestamper.KeyDay, "system", "営業日", day).save(repSystem); } public void initializeInTx() { String ccy = "JPY"; LocalDate baseDay = businessDay.day(); // 社員: admin (passも同様) staff("admin").save(rep); // 自社金融機関 selfFiAcc(Remarks.CashOut, ccy).save(rep); // 口座: sample (passも同様) String idSample = "sample"; acc(idSample).save(rep); login(idSample).save(rep); fiAcc(idSample, Remarks.CashOut, ccy).save(rep); cb(idSample, baseDay, ccy, "1000000").save(rep); } // account /** 口座の簡易生成 */ public Account acc(String id) { Account m = new Account(); m.setId(id); m.setName(id); m.setMail("hoge@example.com"); m.setStatusType(AccountStatusType.Normal); return m; } public Login login(String id) { Login m = new Login(); m.setId(id); m.setLoginId(id); m.setPassword(encoder.encode(id)); return m; } /** 口座に紐付く金融機関口座の簡易生成 */ public FiAccount fiAcc(String accountId, String category, String currency) { FiAccount m = new FiAccount(); m.setAccountId(accountId); m.setCategory(category); m.setCurrency(currency); m.setFiCode(category + "-" + currency); m.setFiAccountId("FI" + accountId); return m; } // asset /** 口座残高の簡易生成 */ public CashBalance cb(String accountId, LocalDate baseDay, String currency, String amount) { return new CashBalance(null, accountId, baseDay, currency, new BigDecimal(amount), LocalDateTime.now()); } /** キャッシュフローの簡易生成 */ public Cashflow cf(String accountId, String amount, LocalDate eventDay, LocalDate valueDay) { return cfReg(accountId, amount, valueDay).create(TimePoint.of(eventDay)); } /** キャッシュフロー登録パラメタの簡易生成 */ public RegCashflow cfReg(String accountId, String amount, LocalDate valueDay) { return new RegCashflow(accountId, "JPY", new BigDecimal(amount), CashflowType.CashIn, "cashIn", null, valueDay); } /** 振込入出金依頼の簡易生成 [発生日(T+1)/受渡日(T+3)] */ public CashInOut cio(String accountId, String absAmount, boolean withdrawal) { TimePoint now = time.tp(); CashInOut m = new CashInOut(); m.setAccountId(accountId); m.setCurrency("JPY"); m.setAbsAmount(new BigDecimal(absAmount)); m.setWithdrawal(withdrawal); m.setRequestDay(now.getDay()); m.setRequestDate(now.getDate()); m.setEventDay(businessDay.day(1)); m.setValueDay(businessDay.day(3)); m.setTargetFiCode("tFiCode"); m.setTargetFiAccountId("tFiAccId"); m.setSelfFiCode("sFiCode"); m.setSelfFiAccountId("sFiAccId"); m.setStatusType(ActionStatusType.Unprocessed); return m; } // master /** 社員の簡易生成 */ public Staff staff(String id) { Staff m = new Staff(); m.setId(id); m.setName(id); m.setPassword(encoder.encode(id)); return m; } /** 社員権限の簡易生成 */ public List<StaffAuthority> staffAuth(String id, String... authority) { return Arrays.stream(authority).map((auth) -> new StaffAuthority(null, id, auth)).collect(Collectors.toList()); } /** 自社金融機関口座の簡易生成 */ public SelfFiAccount selfFiAcc(String category, String currency) { SelfFiAccount m = new SelfFiAccount(); m.setCategory(category); m.setCurrency(currency); m.setFiCode(category + "-" + currency); m.setFiAccountId("xxxxxx"); return m; } /** 祝日の簡易生成 */ public Holiday holiday(String dayStr) { Holiday m = new Holiday(); m.setCategory(Holiday.CategoryDefault); m.setName("休日サンプル"); m.setDay(DateUtils.day(dayStr)); return m; } }