001    /*
002     * Copyright 2011 The Kuali Foundation.
003     * 
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     * 
008     * http://www.opensource.org/licenses/ecl2.php
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.kfs.module.ar.document.service.impl;
017    
018    import org.kuali.kfs.module.ar.businessobject.SalesTaxCustomerInvoiceDetail;
019    import org.kuali.kfs.module.ar.document.service.CustomerInvoiceGLPEService;
020    import org.kuali.kfs.sys.KFSConstants;
021    import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry;
022    import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper;
023    import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail;
024    import org.kuali.kfs.sys.businessobject.TaxDetail;
025    import org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource;
026    import org.kuali.kfs.sys.service.GeneralLedgerPendingEntryService;
027    import org.kuali.rice.kns.util.KualiDecimal;
028    
029    public class CustomerInvoiceGLPEServiceImpl implements CustomerInvoiceGLPEService {
030    
031        private GeneralLedgerPendingEntryService generalLedgerPendingEntryService;
032        
033        /**
034         * This method creates and adds generic invoice related GLPE's
035         * @param glpeSource
036         * @param glpeSourceDetail
037         * @param sequenceHelper
038         * @param isDebit
039         * @param hasClaimOnCashOffset
040         * @param amount
041         */
042        public void createAndAddGenericInvoiceRelatedGLPEs(GeneralLedgerPendingEntrySource glpeSource, GeneralLedgerPendingEntrySourceDetail glpeSourceDetail, GeneralLedgerPendingEntrySequenceHelper sequenceHelper, boolean isDebit, boolean hasClaimOnCashOffset, KualiDecimal amount){
043            
044            GeneralLedgerPendingEntry explicitEntry = new GeneralLedgerPendingEntry();
045            generalLedgerPendingEntryService.populateExplicitGeneralLedgerPendingEntry(glpeSource, glpeSourceDetail, sequenceHelper, explicitEntry);
046            explicitEntry.setTransactionLedgerEntryAmount(amount.abs());
047            explicitEntry.setTransactionDebitCreditCode(isDebit? KFSConstants.GL_DEBIT_CODE : KFSConstants.GL_CREDIT_CODE);
048            
049            //add explicit entry
050            glpeSource.addPendingEntry(explicitEntry);
051            
052            //add claim on cash offset entry
053            if( hasClaimOnCashOffset ){
054                sequenceHelper.increment();
055                
056                GeneralLedgerPendingEntry offsetEntry = new GeneralLedgerPendingEntry(explicitEntry);
057                generalLedgerPendingEntryService.populateOffsetGeneralLedgerPendingEntry(glpeSource.getPostingYear(), explicitEntry, sequenceHelper, offsetEntry);
058                glpeSource.addPendingEntry(offsetEntry);
059            }
060        }
061        
062        /**
063         * This method creates and adds generic invoice related GLPE's
064         * @param glpeSource
065         * @param glpeSourceDetail
066         * @param sequenceHelper
067         * @param isDebit
068         * @param hasReceivableClaimOnCashOffset
069         * @param writeoffTaxGenerationMethodDisallowFlag
070         * @param amount
071         */
072        public void createAndAddGenericInvoiceRelatedGLPEs(GeneralLedgerPendingEntrySource glpeSource, GeneralLedgerPendingEntrySourceDetail glpeSourceDetail, GeneralLedgerPendingEntrySequenceHelper sequenceHelper, boolean isDebit, boolean hasReceivableClaimOnCashOffset, boolean writeoffTaxGenerationMethodDisallowFlag, KualiDecimal amount){
073            
074            GeneralLedgerPendingEntry explicitEntry = new GeneralLedgerPendingEntry();
075            generalLedgerPendingEntryService.populateExplicitGeneralLedgerPendingEntry(glpeSource, glpeSourceDetail, sequenceHelper, explicitEntry);
076            explicitEntry.setTransactionLedgerEntryAmount(amount.abs());
077            explicitEntry.setTransactionDebitCreditCode(isDebit? KFSConstants.GL_DEBIT_CODE : KFSConstants.GL_CREDIT_CODE);
078            
079            boolean overrideFinancialObjectCodeFlag = isDebit && writeoffTaxGenerationMethodDisallowFlag  && !hasReceivableClaimOnCashOffset;
080            
081            if (!overrideFinancialObjectCodeFlag)
082                //add explicit entry
083                glpeSource.addPendingEntry(explicitEntry);
084            
085            // do not add claim on cash offset entry if GLPLE_RECEIVABLE_OFFSET_METHOD = 3 && GLPLE_WRITEOFF_TAX_GENERATION_METHOD = D
086            if (hasReceivableClaimOnCashOffset && writeoffTaxGenerationMethodDisallowFlag )
087                return;
088            
089            //add claim on cash offset entry
090            if( hasReceivableClaimOnCashOffset || writeoffTaxGenerationMethodDisallowFlag ){
091                sequenceHelper.increment();
092                
093                GeneralLedgerPendingEntry offsetEntry = new GeneralLedgerPendingEntry(explicitEntry);
094                generalLedgerPendingEntryService.populateOffsetGeneralLedgerPendingEntry(glpeSource.getPostingYear(), explicitEntry, sequenceHelper, offsetEntry);
095                if (overrideFinancialObjectCodeFlag) {
096                    explicitEntry.setFinancialObjectCode(offsetEntry.getFinancialObjectCode());
097                    glpeSource.addPendingEntry(explicitEntry);
098                }
099                // TODO
100                // override (here or above???) account and object when hasReceivableClaimOnCashOffset = true and writeoffTaxGenerationMethodDisallowFlag = true
101                glpeSource.addPendingEntry(offsetEntry);
102            }
103        }
104           
105        public GeneralLedgerPendingEntryService getGeneralLedgerPendingEntryService() {
106            return generalLedgerPendingEntryService;
107        }
108    
109    
110        public void setGeneralLedgerPendingEntryService(GeneralLedgerPendingEntryService generalLedgerPendingEntryService) {
111            this.generalLedgerPendingEntryService = generalLedgerPendingEntryService;
112        }
113    
114    
115        
116    }