Repository: incubator-fineract
Updated Branches:
  refs/heads/develop 8baf9f4cd -> 755d4d2f9


teller cashier issues #334 #432 #433 #434 #435


Project: http://git-wip-us.apache.org/repos/asf/incubator-fineract/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-fineract/commit/755d4d2f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-fineract/tree/755d4d2f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-fineract/diff/755d4d2f

Branch: refs/heads/develop
Commit: 755d4d2f92ee7c7e5cebbca921a70c2ae4e71078
Parents: 8baf9f4
Author: nazeer1100126 <[email protected]>
Authored: Thu Apr 20 19:26:49 2017 +0530
Committer: nazeer1100126 <[email protected]>
Committed: Thu Apr 20 19:26:49 2017 +0530

----------------------------------------------------------------------
 .../data/CashierTransactionDataValidator.java   | 153 +++++++++++++++++++
 .../exception/CashierAlreadyAlloacated.java     |  32 ++++
 ...rDateRangeOutOfTellerDateRangeException.java |  32 ++++
 .../CashierInsufficientAmountException.java     |  32 ++++
 ...TellerManagementReadPlatformServiceImpl.java |  23 ++-
 .../service/TellerWritePlatformService.java     |   1 -
 .../TellerWritePlatformServiceJpaImpl.java      |  19 ++-
 ...anWritePlatformServiceJpaRepositoryImpl.java |  16 +-
 .../paymenttype/domain/PaymentType.java         |   5 +
 9 files changed, 297 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/755d4d2f/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/data/CashierTransactionDataValidator.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/data/CashierTransactionDataValidator.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/data/CashierTransactionDataValidator.java
new file mode 100644
index 0000000..a0b897e
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/data/CashierTransactionDataValidator.java
@@ -0,0 +1,153 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.organisation.teller.data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import org.apache.fineract.infrastructure.core.api.JsonCommand;
+import org.apache.fineract.infrastructure.core.service.DateUtils;
+import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
+import org.apache.fineract.infrastructure.core.service.SearchParameters;
+import org.apache.fineract.organisation.teller.domain.Cashier;
+import org.apache.fineract.organisation.teller.domain.Teller;
+import 
org.apache.fineract.organisation.teller.exception.CashierAlreadyAlloacated;
+import 
org.apache.fineract.organisation.teller.exception.CashierDateRangeOutOfTellerDateRangeException;
+import 
org.apache.fineract.organisation.teller.exception.CashierInsufficientAmountException;
+import 
org.apache.fineract.organisation.teller.service.TellerManagementReadPlatformService;
+import org.apache.fineract.useradministration.domain.AppUser;
+import org.joda.time.LocalDate;
+import org.joda.time.LocalDateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+
+@Component
+public class CashierTransactionDataValidator {
+
+       private final TellerManagementReadPlatformService 
tellerManagementReadPlatformService;
+       private final JdbcTemplate jdbcTemplate;
+
+       @Autowired
+       public CashierTransactionDataValidator(
+                       final TellerManagementReadPlatformService 
tellerManagementReadPlatformService,
+                       final RoutingDataSource dataSource) {
+               this.tellerManagementReadPlatformService = 
tellerManagementReadPlatformService;
+               this.jdbcTemplate = new JdbcTemplate(dataSource);
+       }
+
+       public void validateSettleCashAndCashOutTransactions(final Long 
cashierId,
+                       String currencyCode, final BigDecimal 
transactionAmount) {
+
+               final Integer offset = null;
+               final Integer limit = null;
+               final String orderBy = null;
+               final String sortOrder = null;
+               final Date fromDate = null;
+               final Date toDate = null;
+               final SearchParameters searchParameters = SearchParameters
+                               .forPagination(offset, limit, orderBy, 
sortOrder);
+               final CashierTransactionsWithSummaryData cashierTxnWithSummary 
= this.tellerManagementReadPlatformService
+                               
.retrieveCashierTransactionsWithSummary(cashierId, false,
+                                               fromDate, toDate, currencyCode, 
searchParameters);
+               if 
(cashierTxnWithSummary.getNetCash().subtract(transactionAmount)
+                               .compareTo(BigDecimal.ZERO) < 0) {
+                       throw new CashierInsufficientAmountException();
+               }
+       }
+
+       public void validateSettleCashAndCashOutTransactions(final Long 
cashierId,
+                       JsonCommand command) {
+               String currencyCode = command
+                               .stringValueOfParameterNamed("currencyCode");
+               BigDecimal transactionAmount = command
+                               .bigDecimalValueOfParameterNamed("txnAmount");
+               validateSettleCashAndCashOutTransactions(cashierId, 
currencyCode,
+                               transactionAmount);
+       }
+
+       public void validateCashierAllowedDateAndTime(final Cashier cashier,
+                       final Teller teller) {
+               Long staffId = cashier.getStaff().getId();
+               final LocalDate fromDate = new 
LocalDate(cashier.getStartDate());
+               final LocalDate endDate = new LocalDate(cashier.getEndDate());
+               final LocalDate tellerFromDate = teller.getStartLocalDate();
+               final LocalDate tellerEndDate = teller.getEndLocalDate();
+               /**
+                * to validate cashier date range in range of teller date range
+                */
+               if (fromDate.isBefore(tellerFromDate)
+                               || endDate.isBefore(tellerFromDate)
+                               || (tellerEndDate != null && 
fromDate.isAfter(tellerEndDate) || endDate
+                                               .isAfter(tellerEndDate))) {
+                       throw new 
CashierDateRangeOutOfTellerDateRangeException();
+               }
+               /**
+                * to validate cashier has not been assigned for same duration
+                */
+               String sql = "select count(*) from m_cashiers c where 
c.staff_id = "
+                               + staffId + " AND " + "(('" + fromDate
+                               + "' BETWEEN c.start_date AND c.end_date OR '" 
+ endDate
+                               + "' BETWEEN c.start_date AND c.end_date )"
+                               + " OR ( c.start_date BETWEEN '" + fromDate + 
"' AND '"
+                               + endDate + "' OR c.end_date BETWEEN '" + 
fromDate + "' AND '"
+                               + endDate + "'))";
+               if (!cashier.isFullDay()) {
+                       String startTime = cashier.getStartTime();
+                       String endTime = cashier.getEndTime();
+                       sql = sql + " AND ( Time(c.start_time) BETWEEN TIME('" 
+ startTime
+                                       + "') and TIME('" + endTime
+                                       + "') or Time(c.end_time) BETWEEN 
TIME('" + startTime
+                                       + "') and TIME('" + endTime + "')) ";
+               }
+               int count = this.jdbcTemplate.queryForObject(sql, 
Integer.class);
+               if (count > 0) {
+                       throw new CashierAlreadyAlloacated();
+               }
+       }
+
+       public void validateOnLoanDisbursal(AppUser user, String currencyCode,
+                       BigDecimal transactionAmount) {
+               LocalDateTime localDateTime = 
DateUtils.getLocalDateTimeOfTenant();
+               if (user.getStaff() != null) {
+                       String sql = "select c.id from m_cashiers c where 
c.staff_id = "
+                                       + user.getStaff().getId()
+                                       + " AND "
+                                       + " (case when c.full_day then '"
+                                       + localDateTime.toLocalDate()
+                                       + "' BETWEEN c.start_date AND 
c.end_date "
+                                       + " else ('"
+                                       + localDateTime.toLocalDate()
+                                       + "' BETWEEN c.start_date AND 
c.end_date and "
+                                       + " TIME('"
+                                       + localDateTime.toDateTime()
+                                       + "') BETWEEN TIME(c.start_time) AND 
TIME(c.end_time)  ) end)";
+                       try {
+                               Long cashierId = 
this.jdbcTemplate.queryForObject(sql,
+                                               Long.class);
+                               
validateSettleCashAndCashOutTransactions(cashierId,
+                                               currencyCode, 
transactionAmount);
+                       } catch (EmptyResultDataAccessException e) {
+
+                       }
+               }
+
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/755d4d2f/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/exception/CashierAlreadyAlloacated.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/exception/CashierAlreadyAlloacated.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/exception/CashierAlreadyAlloacated.java
new file mode 100644
index 0000000..183f131
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/exception/CashierAlreadyAlloacated.java
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.organisation.teller.exception;
+
+import 
org.apache.fineract.infrastructure.core.exception.AbstractPlatformDomainRuleException;
+
+@SuppressWarnings("serial")
+public class CashierAlreadyAlloacated extends
+               AbstractPlatformDomainRuleException {
+
+       public CashierAlreadyAlloacated() {
+               
super("cashier.already.allocated.for.given.data.and.time.exception",
+                               "Cashier already allocated for given date and 
time range.");
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/755d4d2f/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/exception/CashierDateRangeOutOfTellerDateRangeException.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/exception/CashierDateRangeOutOfTellerDateRangeException.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/exception/CashierDateRangeOutOfTellerDateRangeException.java
new file mode 100644
index 0000000..71ea0ab
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/exception/CashierDateRangeOutOfTellerDateRangeException.java
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.organisation.teller.exception;
+
+import 
org.apache.fineract.infrastructure.core.exception.AbstractPlatformDomainRuleException;
+
+@SuppressWarnings("serial")
+public class CashierDateRangeOutOfTellerDateRangeException extends
+               AbstractPlatformDomainRuleException {
+
+       public CashierDateRangeOutOfTellerDateRangeException() {
+               super("cashier.date.range.out.of.teller.date.range.exception",
+                               "Cashier date range should be in teller date 
range.");
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/755d4d2f/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/exception/CashierInsufficientAmountException.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/exception/CashierInsufficientAmountException.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/exception/CashierInsufficientAmountException.java
new file mode 100644
index 0000000..f9e1681
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/exception/CashierInsufficientAmountException.java
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.organisation.teller.exception;
+
+import 
org.apache.fineract.infrastructure.core.exception.AbstractPlatformDomainRuleException;
+
+@SuppressWarnings("serial")
+public class CashierInsufficientAmountException extends
+               AbstractPlatformDomainRuleException {
+
+       public CashierInsufficientAmountException() {
+               super("cashier.insufficient.amount.exception",
+                               "Cashier do not have sufficient amount for this 
transaction.");
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/755d4d2f/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerManagementReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerManagementReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerManagementReadPlatformServiceImpl.java
index 75488a3..03fc11c 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerManagementReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerManagementReadPlatformServiceImpl.java
@@ -98,7 +98,7 @@ public class TellerManagementReadPlatformServiceImpl 
implements TellerManagement
         }
 
         @Override
-        public TellerData mapRow(final ResultSet rs, 
@SuppressWarnings("unused") final int rowNum) throws SQLException {
+        public TellerData mapRow(final ResultSet rs, final int rowNum) throws 
SQLException {
 
             final Long id = rs.getLong("id");
             final Long officeId = rs.getLong("office_id");
@@ -140,7 +140,7 @@ public class TellerManagementReadPlatformServiceImpl 
implements TellerManagement
         }
 
         @Override
-        public TellerData mapRow(final ResultSet rs, 
@SuppressWarnings("unused") final int rowNum) throws SQLException {
+        public TellerData mapRow(final ResultSet rs, final int rowNum) throws 
SQLException {
 
             final Long id = rs.getLong("id");
             final String tellerName = rs.getString("teller_name");
@@ -182,7 +182,7 @@ public class TellerManagementReadPlatformServiceImpl 
implements TellerManagement
         }
 
         @Override
-        public TellerData mapRow(final ResultSet rs, 
@SuppressWarnings("unused") final int rowNum) throws SQLException {
+        public TellerData mapRow(final ResultSet rs, final int rowNum) throws 
SQLException {
 
             final Long id = rs.getLong("id");
             final String tellerName = rs.getString("teller_name");
@@ -510,9 +510,14 @@ public class TellerManagementReadPlatformServiceImpl 
implements TellerManagement
         }
 
         final CashierTransactionMapper ctm = new CashierTransactionMapper();
+        
+        
 
         String sql = "select * from (select " + ctm.cashierTxnSchema()
-                + " where txn.cashier_id = ? and txn.currency_code = ? and 
o.hierarchy like ? ) cashier_txns " + " union (select "
+                + " where txn.cashier_id = ? and txn.currency_code = ? and 
o.hierarchy like ? "
+                               + "AND ((case when c.full_day then 
Date(txn.created_date) between c.start_date AND c.end_date else ( 
Date(txn.created_date) between c.start_date AND c.end_date"
+                               + " ) and ( TIME(txn.created_date) between 
TIME(c.start_time) AND TIME(c.end_time)) end) or txn.txn_type = 101))  
cashier_txns "
+                               + " union (select "
                 + ctm.savingsTxnSchema()
                 + " where sav_txn.is_reversed = 0 and c.id = ? and 
sav.currency_code = ? and o.hierarchy like ? and "
                 + " sav_txn.transaction_date between c.start_date and 
date_add(c.end_date, interval 1 day) "
@@ -566,7 +571,7 @@ public class TellerManagementReadPlatformServiceImpl 
implements TellerManagement
         }
 
         @Override
-        public CashierData mapRow(final ResultSet rs, 
@SuppressWarnings("unused") final int rowNum) throws SQLException {
+        public CashierData mapRow(final ResultSet rs, final int rowNum) throws 
SQLException {
 
             final Long id = rs.getLong("id");
             final Long tellerId = rs.getLong("teller_id");
@@ -719,7 +724,7 @@ public class TellerManagementReadPlatformServiceImpl 
implements TellerManagement
         }
 
         @Override
-        public CashierTransactionData mapRow(final ResultSet rs, 
@SuppressWarnings("unused") final int rowNum) throws SQLException {
+        public CashierTransactionData mapRow(final ResultSet rs, final int 
rowNum) throws SQLException {
 
             final Long id = rs.getLong("txn_id");
             final Long cashierId = rs.getLong("cashier_id");
@@ -772,6 +777,10 @@ public class TellerManagementReadPlatformServiceImpl 
implements TellerManagement
             sqlBuilder.append("        left join m_office o on o.id = 
t.office_id ");
             sqlBuilder.append("        left join m_staff s on s.id = 
c.staff_id ");
             sqlBuilder.append("        where txn.cashier_id = ? ");
+                       sqlBuilder
+                                       .append(" AND (( case when c.full_day 
then Date(txn.created_date) between c.start_date AND c.end_date ");
+                       sqlBuilder
+                                       .append(" else ( Date(txn.created_date) 
between c.start_date AND c.end_date) and  ( TIME(txn.created_date) between 
TIME(c.start_time) AND TIME(c.end_time))  end) or txn.txn_type = 101) ");
             sqlBuilder.append(" and   txn.currency_code = ? ");
             sqlBuilder.append("        and o.hierarchy like ?  ) cashier_txns 
");
             sqlBuilder.append("        UNION ");
@@ -889,7 +898,7 @@ public class TellerManagementReadPlatformServiceImpl 
implements TellerManagement
         }
 
         @Override
-        public CashierTransactionTypeTotalsData mapRow(final ResultSet rs, 
@SuppressWarnings("unused") final int rowNum)
+        public CashierTransactionTypeTotalsData mapRow(final ResultSet rs, 
final int rowNum)
                 throws SQLException {
 
             final Integer cashierTxnType = rs.getInt("cash_txn_type");

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/755d4d2f/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformService.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformService.java
index bc04ce2..8a08bdb 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformService.java
@@ -20,7 +20,6 @@ package org.apache.fineract.organisation.teller.service;
 
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import org.apache.fineract.useradministration.domain.AppUser;
 
 /**
  * Provides the local service for adding, modifying and deleting tellers.

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/755d4d2f/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
index 925fa11..bc1bbcd 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.fineract.organisation.teller.service;
 
+import java.util.Date;
 import java.util.Map;
 import java.util.Set;
 
@@ -42,6 +43,7 @@ import 
org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
 import org.apache.fineract.organisation.staff.domain.Staff;
 import org.apache.fineract.organisation.staff.domain.StaffRepository;
 import org.apache.fineract.organisation.staff.exception.StaffNotFoundException;
+import 
org.apache.fineract.organisation.teller.data.CashierTransactionDataValidator;
 import org.apache.fineract.organisation.teller.domain.Cashier;
 import org.apache.fineract.organisation.teller.domain.CashierRepository;
 import org.apache.fineract.organisation.teller.domain.CashierTransaction;
@@ -54,6 +56,7 @@ import 
org.apache.fineract.organisation.teller.exception.CashierNotFoundExceptio
 import 
org.apache.fineract.organisation.teller.serialization.TellerCommandFromApiJsonDeserializer;
 import org.apache.fineract.portfolio.client.domain.ClientTransaction;
 import org.apache.fineract.useradministration.domain.AppUser;
+import org.joda.time.LocalDate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -75,6 +78,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
     private final CashierTransactionRepository cashierTxnRepository;
     private final JournalEntryRepository glJournalEntryRepository;
     private final FinancialActivityAccountRepositoryWrapper 
financialActivityAccountRepositoryWrapper;
+    private final CashierTransactionDataValidator 
cashierTransactionDataValidator;
 
     @Autowired
     public TellerWritePlatformServiceJpaImpl(final PlatformSecurityContext 
context,
@@ -82,7 +86,8 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
             final TellerRepositoryWrapper tellerRepositoryWrapper, final 
OfficeRepositoryWrapper officeRepositoryWrapper,
             final StaffRepository staffRepository, CashierRepository 
cashierRepository, CashierTransactionRepository cashierTxnRepository,
             JournalEntryRepository glJournalEntryRepository,
-            FinancialActivityAccountRepositoryWrapper 
financialActivityAccountRepositoryWrapper) {
+            FinancialActivityAccountRepositoryWrapper 
financialActivityAccountRepositoryWrapper,
+            final CashierTransactionDataValidator 
cashierTransactionDataValidator) {
         this.context = context;
         this.fromApiJsonDeserializer = fromApiJsonDeserializer;
         this.tellerRepositoryWrapper = tellerRepositoryWrapper;
@@ -92,6 +97,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
         this.cashierTxnRepository = cashierTxnRepository;
         this.glJournalEntryRepository = glJournalEntryRepository;
         this.financialActivityAccountRepositoryWrapper = 
financialActivityAccountRepositoryWrapper;
+        this.cashierTransactionDataValidator = cashierTransactionDataValidator;
     }
 
     @Override
@@ -251,9 +257,9 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
                     endTime = hourEndTime.toString() + ":" + 
minEndTime.toString();
 
             }
-
             final Cashier cashier = Cashier.fromJson(tellerOffice, teller, 
staff, startTime, endTime, command);
-
+            
this.cashierTransactionDataValidator.validateCashierAllowedDateAndTime(cashier, 
teller);
+            
             this.cashierRepository.save(cashier);
 
             return new CommandProcessingResultBuilder() //
@@ -351,7 +357,7 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
 
     @Override
     public CommandProcessingResult allocateCashToCashier(final Long cashierId, 
JsonCommand command) {
-        return doTransactionForCashier(cashierId, CashierTxnType.ALLOCATE, 
command); // For
+       return doTransactionForCashier(cashierId, CashierTxnType.ALLOCATE, 
command); // For
                                                                                
      // fund
                                                                                
      // allocation
                                                                                
      // to
@@ -360,7 +366,10 @@ public class TellerWritePlatformServiceJpaImpl implements 
TellerWritePlatformSer
 
     @Override
     public CommandProcessingResult settleCashFromCashier(final Long cashierId, 
JsonCommand command) {
-        return doTransactionForCashier(cashierId, CashierTxnType.SETTLE, 
command); // For
+       
+       
this.cashierTransactionDataValidator.validateSettleCashAndCashOutTransactions(cashierId,
 command);
+       
+       return doTransactionForCashier(cashierId, CashierTxnType.SETTLE, 
command); // For
                                                                                
    // fund
                                                                                
    // settlement
                                                                                
    // from

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/755d4d2f/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
index abb6353..4696f0e 100755
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java
@@ -51,6 +51,7 @@ import 
org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
 import org.apache.fineract.organisation.monetary.domain.Money;
 import org.apache.fineract.organisation.office.domain.Office;
 import org.apache.fineract.organisation.staff.domain.Staff;
+import 
org.apache.fineract.organisation.teller.data.CashierTransactionDataValidator;
 import org.apache.fineract.organisation.workingdays.domain.WorkingDays;
 import 
org.apache.fineract.organisation.workingdays.domain.WorkingDaysRepositoryWrapper;
 import org.apache.fineract.portfolio.account.PortfolioAccountType;
@@ -170,6 +171,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
     private final EntityDatatableChecksWritePlatformService 
entityDatatableChecksWritePlatformService;
     private final LoanRepaymentScheduleTransactionProcessorFactory 
transactionProcessingStrategy;
     private final CodeValueRepositoryWrapper codeValueRepository;
+    private final CashierTransactionDataValidator 
cashierTransactionDataValidator;
 
     @Autowired
     public LoanWritePlatformServiceJpaRepositoryImpl(final 
PlatformSecurityContext context,
@@ -200,7 +202,8 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
             final EntityDatatableChecksWritePlatformService 
entityDatatableChecksWritePlatformService,
             final LoanRepaymentScheduleTransactionProcessorFactory 
transactionProcessingStrategy,
             final CodeValueRepositoryWrapper codeValueRepository,
-            final LoanRepositoryWrapper loanRepositoryWrapper) {
+            final LoanRepositoryWrapper loanRepositoryWrapper,
+            final CashierTransactionDataValidator 
cashierTransactionDataValidator) {
         this.context = context;
         this.loanEventApiJsonValidator = loanEventApiJsonValidator;
         this.loanAssembler = loanAssembler;
@@ -239,6 +242,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
         this.transactionProcessingStrategy = transactionProcessingStrategy;
         this.entityDatatableChecksWritePlatformService = 
entityDatatableChecksWritePlatformService;
         this.codeValueRepository = codeValueRepository;
+        this.cashierTransactionDataValidator = cashierTransactionDataValidator;
     }
 
     private LoanLifecycleStateMachine defaultLoanLifecycleStateMachine() {
@@ -293,7 +297,13 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
         final Map<String, Object> changes = new LinkedHashMap<>();
 
         final PaymentDetail paymentDetail = 
this.paymentDetailWritePlatformService.createAndPersistPaymentDetail(command, 
changes);
-
+               if (paymentDetail != null && paymentDetail.getPaymentType() != 
null
+                               && 
paymentDetail.getPaymentType().isCashPayment()) {
+                       BigDecimal transactionAmount = command
+                                       
.bigDecimalValueOfParameterNamed("transactionAmount");
+                       
this.cashierTransactionDataValidator.validateOnLoanDisbursal(
+                                       currentUser, loan.getCurrencyCode(), 
transactionAmount);
+               }     
         final Boolean isPaymnetypeApplicableforDisbursementCharge = 
configurationDomainService
                 .isPaymnetypeApplicableforDisbursementCharge();
 
@@ -406,7 +416,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl 
implements LoanWritePlatf
                     isExceptionForBalanceCheck);
             
this.accountTransfersWritePlatformService.transferFunds(accountTransferDTO);
         }
-
+        
         updateRecurringCalendarDatesForInterestRecalculation(loan);
         this.loanAccountDomainService.recalculateAccruals(loan);
         
this.businessEventNotifierService.notifyBusinessEventWasExecuted(BUSINESS_EVENTS.LOAN_DISBURSAL,

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/755d4d2f/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java
index 0cdf6bc..1e910aa 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java
@@ -94,4 +94,9 @@ public class PaymentType extends 
AbstractPersistableCustom<Long> {
     public PaymentTypeData toData() {
         return PaymentTypeData.instance(getId(), this.name, this.description, 
this.isCashPayment, this.position);
     }
+
+       public Boolean isCashPayment() {
+               return isCashPayment;
+       }
+       
 }

Reply via email to