1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.kuali.kfs.module.ar.document.validation.impl;
20  
21  import static org.kuali.kfs.sys.fixture.UserNameFixture.khuntley;
22  
23  import java.math.BigDecimal;
24  import java.util.List;
25  
26  import org.kuali.kfs.module.ar.ArConstants;
27  import org.kuali.kfs.module.ar.businessobject.CustomerCreditMemoDetail;
28  import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceDetail;
29  import org.kuali.kfs.module.ar.document.CustomerCreditMemoDocument;
30  import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
31  import org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentTestUtil;
32  import org.kuali.kfs.module.ar.fixture.CustomerInvoiceDetailFixture;
33  import org.kuali.kfs.module.ar.fixture.CustomerInvoiceDocumentFixture;
34  import org.kuali.kfs.sys.ConfigureContext;
35  import org.kuali.kfs.sys.DocumentTestUtils;
36  import org.kuali.kfs.sys.context.KualiTestBase;
37  import org.kuali.kfs.sys.context.SpringContext;
38  import org.kuali.rice.core.api.util.type.KualiDecimal;
39  import org.kuali.rice.kew.api.exception.WorkflowException;
40  import org.kuali.rice.krad.document.Document;
41  import org.kuali.rice.krad.service.DocumentService;
42  
43  @ConfigureContext(session = khuntley, shouldCommitTransactions = true)
44  public class CustomerCreditMemoDocumentRuleTest extends KualiTestBase {
45  
46      public static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CustomerCreditMemoDocumentRuleTest.class);
47  
48      private CustomerCreditMemoDocumentRule rule;
49      private CustomerCreditMemoDocument document;
50  
51      @Override
52      protected  void setUp() throws Exception {
53          super.setUp();
54          rule = new CustomerCreditMemoDocumentRule();
55          document = new CustomerCreditMemoDocument();
56      }
57  
58      @Override
59      protected void tearDown() throws Exception {
60          rule = null;
61          document = null;
62          super.tearDown();
63      }
64  
65      
66  
67  
68      public void testIsQtyOrItemAmountEntered_EmptyString_True() {
69         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
70  
71         assertTrue(rule.isQtyOrItemAmountEntered(detail).equals(""));
72      }
73  
74      
75  
76  
77     public void testIsQtyOrItemAmountEntered_Qty_True() {
78         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
79         detail.setCreditMemoItemQuantity(new BigDecimal(1));
80  
81         assertTrue(rule.isQtyOrItemAmountEntered(detail).equals(ArConstants.CustomerCreditMemoConstants.CUSTOMER_CREDIT_MEMO_ITEM_QUANTITY));
82      }
83  
84      
85  
86  
87      public void testIsQtyOrItemAmountEntered_Amount_True() {
88         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
89         detail.setCreditMemoItemTotalAmount(new KualiDecimal(1));
90  
91         assertTrue(rule.isQtyOrItemAmountEntered(detail).equals(ArConstants.CustomerCreditMemoConstants.CUSTOMER_CREDIT_MEMO_ITEM_TOTAL_AMOUNT));
92      }
93  
94      
95  
96  
97      public void testIsQtyOrItemAmountEntered_Both_True() {
98         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
99  
100        detail.setCreditMemoItemTotalAmount(new KualiDecimal(1));
101        detail.setCreditMemoItemQuantity(new BigDecimal(1));
102 
103        assertTrue(rule.isQtyOrItemAmountEntered(detail).equals(ArConstants.CustomerCreditMemoConstants.BOTH_QUANTITY_AND_ITEM_TOTAL_AMOUNT_ENTERED));
104     }
105 
106     
107 
108 
109    public void testIsValueGreaterThanZero_True() {
110         assertTrue(rule.isValueGreaterThanZero(BigDecimal.ONE));
111     }
112 
113     
114 
115 
116     public void testIsValueGreaterThanZero_False() {
117         assertFalse(rule.isValueGreaterThanZero(BigDecimal.ZERO));
118     }
119 
120     
121 
122 
123     public void testIsValueGreaterThanZero_KualiDecimal_True() {
124         assertTrue(rule.isValueGreaterThanZero(new KualiDecimal(1)));
125     }
126 
127     
128 
129 
130     public void testIsValueGreaterThanZero_KualiDecimal_False() {
131         assertFalse(rule.isValueGreaterThanZero(KualiDecimal.ZERO));
132     }
133 
134     
135 
136 
137    public void testIsCustomerCreditMemoItemAmountGreaterThanInvoiceOpenItemAmount_Equal_True() {
138         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
139         detail.setInvoiceOpenItemAmount(new KualiDecimal(2));
140         detail.setCreditMemoItemTotalAmount(new KualiDecimal(2));
141 
142         assertTrue(rule.isCustomerCreditMemoItemAmountLessThanEqualToInvoiceOpenItemAmount(document, detail));
143     }
144 
145     
146 
147 
148    public void testIsCustomerCreditMemoItemAmountGreaterThanInvoiceOpenItemAmount_Less_True() {
149         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
150         detail.setInvoiceOpenItemAmount(new KualiDecimal(2));
151         detail.setCreditMemoItemTotalAmount(new KualiDecimal(1));
152 
153         assertTrue(rule.isCustomerCreditMemoItemAmountLessThanEqualToInvoiceOpenItemAmount(document, detail));
154     }
155 
156     
157 
158 
159     public void testIsCustomerCreditMemoItemAmountGreaterThanInvoiceOpenItemAmount_False() {
160         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
161         detail.setInvoiceOpenItemAmount(new KualiDecimal(1));
162         detail.setCreditMemoItemTotalAmount(new KualiDecimal(2));
163 
164         assertFalse(rule.isCustomerCreditMemoItemAmountLessThanEqualToInvoiceOpenItemAmount(document, detail));
165     }
166 
167     
168 
169 
170     public void testIsCustomerCreditMemoQtyGreaterThanInvoiceQty_Equal_True() {
171         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
172 
173         detail.setInvoiceOpenItemQuantity(new BigDecimal(2));
174         detail.setCreditMemoItemQuantity(new BigDecimal(2));
175 
176         assertTrue(rule.isCustomerCreditMemoQtyLessThanEqualToInvoiceOpenQty(detail));
177     }
178 
179     
180 
181 
182     public void testIsCustomerCreditMemoQtyGreaterThanInvoiceQty_Less_True() {
183         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
184 
185         detail.setInvoiceOpenItemQuantity(new BigDecimal(2));
186         detail.setCreditMemoItemQuantity(new BigDecimal(1));
187 
188         assertTrue(rule.isCustomerCreditMemoQtyLessThanEqualToInvoiceOpenQty(detail));
189     }
190 
191     
192 
193 
194     public void testIsCustomerCreditMemoQtyGreaterThanInvoiceQty_False() {
195         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
196 
197         detail.setInvoiceOpenItemQuantity(new BigDecimal(1));
198         detail.setCreditMemoItemQuantity(new BigDecimal(2));
199 
200         assertFalse(rule.isCustomerCreditMemoQtyLessThanEqualToInvoiceOpenQty(detail));
201     }
202 
203     
204 
205 
206     public void testCheckIfCustomerCreditMemoQtyAndCustomerCreditMemoItemAmountValid_ExactMatch() {
207         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
208         detail.setCreditMemoItemTotalAmount(new KualiDecimal(4));
209         detail.setCreditMemoItemQuantity(new BigDecimal(2));
210 
211         assertTrue(rule.checkIfCustomerCreditMemoQtyAndCustomerCreditMemoItemAmountValid(detail,new BigDecimal(2)));
212     }
213 
214     
215 
216 
217     public void testCheckIfCustomerCreditMemoQtyAndCustomerCreditMemoItemAmountValid_FarOff() {
218         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
219         detail.setCreditMemoItemTotalAmount(new KualiDecimal(50));
220         detail.setCreditMemoItemQuantity(new BigDecimal(10)); 
221 
222         assertFalse(rule.checkIfCustomerCreditMemoQtyAndCustomerCreditMemoItemAmountValid(detail,new BigDecimal(10)));
223     }
224 
225     public void testCheckIfCustomerCreditMemoQtyAndCustomerCreditMemoItemAmountValid_JustAboveAllowedDeviation() {
226         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
227         detail.setCreditMemoItemTotalAmount(new KualiDecimal(50));
228         detail.setCreditMemoItemQuantity(new BigDecimal(5.6)); 
229 
230         assertFalse(rule.checkIfCustomerCreditMemoQtyAndCustomerCreditMemoItemAmountValid(detail,new BigDecimal(10)));
231     }
232 
233     public void testCheckIfCustomerCreditMemoQtyAndCustomerCreditMemoItemAmountValid_ExactlyAllowedDeviation() {
234         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
235         detail.setCreditMemoItemTotalAmount(new KualiDecimal(50));
236         detail.setCreditMemoItemQuantity(new BigDecimal(5.5)); 
237 
238         assertTrue(rule.checkIfCustomerCreditMemoQtyAndCustomerCreditMemoItemAmountValid(detail,new BigDecimal(10)));
239     }
240 
241     public void testCheckIfCustomerCreditMemoQtyAndCustomerCreditMemoItemAmountValid_JustBelowAllowedDeviation() {
242         CustomerCreditMemoDetail detail = new CustomerCreditMemoDetail();
243         detail.setCreditMemoItemTotalAmount(new KualiDecimal(50));
244         detail.setCreditMemoItemQuantity(new BigDecimal(5.4)); 
245 
246         assertTrue(rule.checkIfCustomerCreditMemoQtyAndCustomerCreditMemoItemAmountValid(detail,new BigDecimal(10)));
247     }
248 
249     
250 
251 
252     public void testCheckIfInvoiceNumberIsValid_False() {
253         assertFalse(rule.checkIfInvoiceNumberIsFinal("KLM0456"));
254     }
255 
256     
257 
258 
259     public void testCheckIfInvoiceNumberIsValid_True() throws WorkflowException {
260 
261         String documentNumber = CustomerInvoiceDocumentTestUtil.submitNewCustomerInvoiceDocument(CustomerInvoiceDocumentFixture.BASE_CIDOC_WITH_CUSTOMER,
262             new CustomerInvoiceDetailFixture[]
263             {CustomerInvoiceDetailFixture.CUSTOMER_INVOICE_DETAIL_CHART_RECEIVABLE},
264             null);
265 
266         assertTrue(rule.checkIfInvoiceNumberIsFinal(documentNumber));
267     }
268 
269     
270 
271 
272     public void testCheckIfThereIsNoAnotherCRMInRouteForTheInvoice_True() throws WorkflowException {
273         String documentNumber = CustomerInvoiceDocumentTestUtil.submitNewCustomerInvoiceDocument(CustomerInvoiceDocumentFixture.BASE_CIDOC_WITH_CUSTOMER,
274             new CustomerInvoiceDetailFixture[]
275             {CustomerInvoiceDetailFixture.CUSTOMER_INVOICE_DETAIL_CHART_RECEIVABLE},
276             null);
277         assertTrue(rule.checkIfThereIsNoAnotherCRMInRouteForTheInvoice(documentNumber));
278     }
279 
280     
281 
282 
283 
284     public void testCheckIfThereIsNoAnotherCRMInRouteForTheInvoice_False() throws WorkflowException {
285         String invoiceNumber = "";
286 
287         
288         CustomerInvoiceDocument invoice = CustomerInvoiceDocumentTestUtil.submitNewCustomerInvoiceDocumentAndReturnIt(CustomerInvoiceDocumentFixture.BASE_CIDOC_WITH_CUSTOMER,
289             new CustomerInvoiceDetailFixture[]
290             {CustomerInvoiceDetailFixture.CUSTOMER_INVOICE_DETAIL_CHART_RECEIVABLE},
291             null);
292 
293         
294         invoiceNumber = invoice.getDocumentNumber();
295         document = createCustomerCreditMemoDocument(invoice);
296         document.getDocumentHeader().setDocumentDescription("CREATING TEST CRM DOCUMENT");
297 
298         try {
299             Document savedDocument = SpringContext.getBean(DocumentService.class).routeDocument(document, "Routing from Unit Test", null);
300         } catch (Exception e){
301             LOG.error(e.getMessage());
302         }
303         assertFalse(rule.checkIfThereIsNoAnotherCRMInRouteForTheInvoice(invoiceNumber));
304     }
305 
306     
307 
308 
309 
310 
311 
312     public CustomerCreditMemoDocument createCustomerCreditMemoDocument(CustomerInvoiceDocument invoice){
313 
314         CustomerCreditMemoDetail customerCreditMemoDetail;
315         CustomerCreditMemoDocument customerCreditMemoDocument = null;
316         KualiDecimal invItemTaxAmount, itemAmount;
317         Integer itemLineNumber;
318         BigDecimal itemQuantity;
319         String documentNumber;
320 
321         try {
322             
323             customerCreditMemoDocument = DocumentTestUtils.createDocument(SpringContext.getBean(DocumentService.class), CustomerCreditMemoDocument.class);
324         }
325         catch (WorkflowException e) {
326             throw new RuntimeException("Document creation failed.");
327         }
328 
329         customerCreditMemoDocument.setInvoice(invoice); 
330         customerCreditMemoDocument.setFinancialDocumentReferenceInvoiceNumber(invoice.getDocumentNumber());
331 
332         List<CustomerInvoiceDetail> customerInvoiceDetails = invoice.getCustomerInvoiceDetailsWithoutDiscounts();
333         if (customerInvoiceDetails == null) {
334             return customerCreditMemoDocument;
335         }
336 
337         for (CustomerInvoiceDetail customerInvoiceDetail : customerInvoiceDetails) {
338                 customerCreditMemoDetail = new CustomerCreditMemoDetail();
339                 customerCreditMemoDetail.setDocumentNumber(customerCreditMemoDocument.getDocumentNumber());
340 
341                 invItemTaxAmount = customerInvoiceDetail.getInvoiceItemTaxAmount();
342                 if (invItemTaxAmount == null) {
343                     invItemTaxAmount = KualiDecimal.ZERO;
344                 }
345                 customerCreditMemoDetail.setCreditMemoItemTaxAmount(invItemTaxAmount.divide(new KualiDecimal(2)));
346 
347                 customerCreditMemoDetail.setReferenceInvoiceItemNumber(customerInvoiceDetail.getSequenceNumber());
348                 itemQuantity = customerInvoiceDetail.getInvoiceItemQuantity().divide(new BigDecimal(2));
349                 customerCreditMemoDetail.setCreditMemoItemQuantity(itemQuantity);
350 
351                 itemAmount = customerInvoiceDetail.getAmount().divide(new KualiDecimal(2));
352                 customerCreditMemoDetail.setCreditMemoItemTotalAmount(itemAmount);
353                 customerCreditMemoDetail.setFinancialDocumentReferenceInvoiceNumber(invoice.getDocumentNumber());
354                 customerCreditMemoDetail.setCustomerInvoiceDetail(customerInvoiceDetail);
355                 customerCreditMemoDocument.getCreditMemoDetails().add(customerCreditMemoDetail);
356         }
357         return customerCreditMemoDocument;
358     }
359 
360 }
361