// Path: micro-core/src/main/java/sample/context/lock/IdLockHandler.java
// public class IdLockHandler {
// 
//     private ConcurrentMap<Serializable, ReentrantReadWriteLock> lockMap = new ConcurrentHashMap<>();
// 
//     /** IDロック上で処理を実行します。 */
//     public void call(Serializable id, LockType lockType, final Runnable command) {
//         call(id, lockType, () -> {
//             command.run();
//             return true;
//         });
//     }
// 
//     public <T> T call(Serializable id, LockType lockType, final Supplier<T> callable) {
//         if (lockType.isWrite()) {
//             writeLock(id);
//         } else {
//             readLock(id);
//         }
//         try {
//             return callable.get();
//         } catch (RuntimeException e) {
//             throw e;
//         } catch (Exception e) {
//             throw new InvocationException("error.Exception", e);
//         } finally {
//             unlock(id);
//         }
//     }
// 
//     public void writeLock(final Serializable id) {
//         Optional.of(id).ifPresent((v) -> {
//             idLock(v).writeLock().lock();
//         });
//     }
// 
//     private ReentrantReadWriteLock idLock(final Serializable id) {
//         return lockMap.computeIfAbsent(id, v -> new ReentrantReadWriteLock());
//     }
// 
//     public void readLock(final Serializable id) {
//         Optional.of(id).ifPresent((v) -> {
//             idLock(v).readLock().lock();
//         });
//     }
// 
//     public void unlock(final Serializable id) {
//         Optional.of(id).ifPresent((v) -> {
//             ReentrantReadWriteLock idLock = idLock(v);
//             if (idLock.isWriteLockedByCurrentThread()) {
//                 idLock.writeLock().unlock();
//             } else {
//                 idLock.readLock().unlock();
//             }
//         });
//     }
// 
//     /**
//      * ロック種別を表現するEnum。
//      */
//     public static enum LockType {
//         /** 読み取り専用ロック */
//         Read,
//         /** 読み書き専用ロック */
//         Write;
// 
//         public boolean isRead() {
//             return !isWrite();
//         }
// 
//         public boolean isWrite() {
//             return this == Write;
//         }
//     }
// 
//     /** IdLock の対象と種別のペアを表現します。 */
//     @Value
//     public static class IdLockPair {
//         private Serializable id;
//         private LockType lockType;
//     }
//     
// }
// 
// Path: micro-core/src/main/java/sample/context/lock/IdLockHandler.java
// public static enum LockType {
//     /** 読み取り専用ロック */
//     Read,
//     /** 読み書き専用ロック */
//     Write;
// 
//     public boolean isRead() {
//         return !isWrite();
//     }
// 
//     public boolean isWrite() {
//         return this == Write;
//     }
// }
// 
// Path: micro-asset/src/main/java/sample/microasset/context/orm/AssetRepository.java
// @Setter
// public class AssetRepository extends OrmRepository {
//     public static final String BeanNameDs = "assetDataSource";
//     public static final String BeanNameEmf = "assetEntityManagerFactory";
//     public static final String BeanNameTx = "assetTransactionManager";
// 
//     @PersistenceContext(unitName = BeanNameEmf)
//     private EntityManager em;
// 
//     @Override
//     public EntityManager em() {
//         return em;
//     }
// 
//     /** 資産スキーマのHibernateコンポーネントを生成します。 */
//     @ConfigurationProperties(prefix = "extension.datasource.asset")
//     @Data
//     @EqualsAndHashCode(callSuper = false)
//     public static class AssetDataSourceProperties extends OrmDataSourceProperties {
//         private OrmRepositoryProperties jpa = new OrmRepositoryProperties();
//         
//         public DataSource dataSource() {
//             return super.dataSource();
//         }
//         
//         public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(
//                 final DataSource dataSource) {
//             return jpa.entityManagerFactoryBean(BeanNameEmf, dataSource);
//         }
// 
//         public JpaTransactionManager transactionManager(final EntityManagerFactory emf) {
//             return jpa.transactionManager(emf);
//         }
//     }
// 
// }
// 
// Path: micro-asset/src/main/java/sample/microasset/model/asset/CashInOut.java
// @Data
// @NoArgsConstructor
// @AllArgsConstructor
// public static class FindCashInOut implements Dto {
//     private static final long serialVersionUID = 1L;
//     @CurrencyEmpty
//     private String currency;
//     private ActionStatusType[] statusTypes;
//     @ISODate
//     private LocalDate updFromDay;
//     @ISODate
//     private LocalDate updToDay;
// }


import java.time.LocalDate;
import java.util.List;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import lombok.extern.slf4j.Slf4j;
import sample.context.audit.AuditHandler;
import sample.context.lock.IdLockHandler;
import sample.context.lock.IdLockHandler.LockType;
import sample.context.orm.TxTemplate;
import sample.microasset.context.orm.AssetRepository;
import sample.microasset.model.asset.*;
import sample.microasset.model.asset.CashInOut.FindCashInOut;
package sample.microasset.usecase;




/**
 * 資産ドメインに対する社内ユースケース処理。
 */
@Service
@Slf4j
public class AssetAdminService {

// Path: micro-core/src/main/java/sample/context/lock/IdLockHandler.java
// public class IdLockHandler {
// 
//     private ConcurrentMap<Serializable, ReentrantReadWriteLock> lockMap = new ConcurrentHashMap<>();
// 
//     /** IDロック上で処理を実行します。 */
//     public void call(Serializable id, LockType lockType, final Runnable command) {
//         call(id, lockType, () -> {
//             command.run();
//             return true;
//         });
//     }
// 
//     public <T> T call(Serializable id, LockType lockType, final Supplier<T> callable) {
//         if (lockType.isWrite()) {
//             writeLock(id);
//         } else {
//             readLock(id);
//         }
//         try {
//             return callable.get();
//         } catch (RuntimeException e) {
//             throw e;
//         } catch (Exception e) {
//             throw new InvocationException("error.Exception", e);
//         } finally {
//             unlock(id);
//         }
//     }
// 
//     public void writeLock(final Serializable id) {
//         Optional.of(id).ifPresent((v) -> {
//             idLock(v).writeLock().lock();
//         });
//     }
// 
//     private ReentrantReadWriteLock idLock(final Serializable id) {
//         return lockMap.computeIfAbsent(id, v -> new ReentrantReadWriteLock());
//     }
// 
//     public void readLock(final Serializable id) {
//         Optional.of(id).ifPresent((v) -> {
//             idLock(v).readLock().lock();
//         });
//     }
// 
//     public void unlock(final Serializable id) {
//         Optional.of(id).ifPresent((v) -> {
//             ReentrantReadWriteLock idLock = idLock(v);
//             if (idLock.isWriteLockedByCurrentThread()) {
//                 idLock.writeLock().unlock();
//             } else {
//                 idLock.readLock().unlock();
//             }
//         });
//     }
// 
//     /**
//      * ロック種別を表現するEnum。
//      */
//     public static enum LockType {
//         /** 読み取り専用ロック */
//         Read,
//         /** 読み書き専用ロック */
//         Write;
// 
//         public boolean isRead() {
//             return !isWrite();
//         }
// 
//         public boolean isWrite() {
//             return this == Write;
//         }
//     }
// 
//     /** IdLock の対象と種別のペアを表現します。 */
//     @Value
//     public static class IdLockPair {
//         private Serializable id;
//         private LockType lockType;
//     }
//     
// }
// 
// Path: micro-core/src/main/java/sample/context/lock/IdLockHandler.java
// public static enum LockType {
//     /** 読み取り専用ロック */
//     Read,
//     /** 読み書き専用ロック */
//     Write;
// 
//     public boolean isRead() {
//         return !isWrite();
//     }
// 
//     public boolean isWrite() {
//         return this == Write;
//     }
// }
// 
// Path: micro-asset/src/main/java/sample/microasset/context/orm/AssetRepository.java
// @Setter
// public class AssetRepository extends OrmRepository {
//     public static final String BeanNameDs = "assetDataSource";
//     public static final String BeanNameEmf = "assetEntityManagerFactory";
//     public static final String BeanNameTx = "assetTransactionManager";
// 
//     @PersistenceContext(unitName = BeanNameEmf)
//     private EntityManager em;
// 
//     @Override
//     public EntityManager em() {
//         return em;
//     }
// 
//     /** 資産スキーマのHibernateコンポーネントを生成します。 */
//     @ConfigurationProperties(prefix = "extension.datasource.asset")
//     @Data
//     @EqualsAndHashCode(callSuper = false)
//     public static class AssetDataSourceProperties extends OrmDataSourceProperties {
//         private OrmRepositoryProperties jpa = new OrmRepositoryProperties();
//         
//         public DataSource dataSource() {
//             return super.dataSource();
//         }
//         
//         public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(
//                 final DataSource dataSource) {
//             return jpa.entityManagerFactoryBean(BeanNameEmf, dataSource);
//         }
// 
//         public JpaTransactionManager transactionManager(final EntityManagerFactory emf) {
//             return jpa.transactionManager(emf);
//         }
//     }
// 
// }
// 
// Path: micro-asset/src/main/java/sample/microasset/model/asset/CashInOut.java
// @Data
// @NoArgsConstructor
// @AllArgsConstructor
// public static class FindCashInOut implements Dto {
//     private static final long serialVersionUID = 1L;
//     @CurrencyEmpty
//     private String currency;
//     private ActionStatusType[] statusTypes;
//     @ISODate
//     private LocalDate updFromDay;
//     @ISODate
//     private LocalDate updToDay;
// }


// Path: micro-asset/src/main/java/sample/microasset/usecase/AssetAdminService.java
import java.time.LocalDate;
import java.util.List;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import lombok.extern.slf4j.Slf4j;
import sample.context.audit.AuditHandler;
import sample.context.lock.IdLockHandler;
import sample.context.lock.IdLockHandler.LockType;
import sample.context.orm.TxTemplate;
import sample.microasset.context.orm.AssetRepository;
import sample.microasset.model.asset.*;
import sample.microasset.model.asset.CashInOut.FindCashInOut;

package sample.microasset.usecase;




/**
 * 資産ドメインに対する社内ユースケース処理。
 */
@Service
@Slf4j
public class AssetAdminService {

    private final AssetRepository rep;