java.util.List itemRows = ((VOListResponse)rowsResponse).getRows();
// for each item, calculate item discounts...
GridSaleDocRowVO itemVO = null;
Response rowResponse = null;
DetailSaleDocRowVO detailItemVO = null;
Response itemTotDiscResponse = null;
ArrayList detailItemRows = new ArrayList();
double vatPerc;
for(int i=0;i<itemRows.size();i++) {
itemVO = (GridSaleDocRowVO)itemRows.get(i);
// retrieve item detail...
rowResponse = bean.loadSaleDocRow(
variant1Descriptions,variant2Descriptions,variant3Descriptions,variant4Descriptions,variant5Descriptions,
new SaleDocRowPK(
pk.getCompanyCodeSys01DOC01(),
pk.getDocTypeDOC01(),
pk.getDocYearDOC01(),
pk.getDocNumberDOC01(),
itemVO.getItemCodeItm01DOC02(),
itemVO.getVariantTypeItm06DOC02(),
itemVO.getVariantCodeItm11DOC02(),
itemVO.getVariantTypeItm07DOC02(),
itemVO.getVariantCodeItm12DOC02(),
itemVO.getVariantTypeItm08DOC02(),
itemVO.getVariantCodeItm13DOC02(),
itemVO.getVariantTypeItm09DOC02(),
itemVO.getVariantCodeItm14DOC02(),
itemVO.getVariantTypeItm10DOC02(),
itemVO.getVariantCodeItm15DOC02()
),
serverLanguageId,
username
);
if (rowResponse.isError())
throw new Exception(rowsResponse.getErrorMessage());
detailItemVO = (DetailSaleDocRowVO)((VOResponse)rowResponse).getVo();
detailItemRows.add(detailItemVO);
// calculate item discount...
detailItemVO.setTaxableIncomeDOC02(detailItemVO.getQtyDOC02().multiply(detailItemVO.getValueSal02DOC02()).setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP));
itemTotDiscResponse = itemDiscountBean.getSaleItemTotalDiscount(detailItemVO,serverLanguageId,username);
if (itemTotDiscResponse.isError())
throw new Exception(itemTotDiscResponse.getErrorMessage());
// apply total discount to item detail...
detailItemVO.setTotalDiscountDOC02( detailItemVO.getTotalDiscountDOC02().setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP) );
// apply total discount to taxable income...
detailItemVO.setTaxableIncomeDOC02(detailItemVO.getTaxableIncomeDOC02().subtract(detailItemVO.getTotalDiscountDOC02()).setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP));
// calculate row vat...
vatPerc = detailItemVO.getValueReg01DOC02().doubleValue()*(1d-detailItemVO.getDeductibleReg01DOC02().doubleValue()/100d)/100;
detailItemVO.setVatValueDOC02(detailItemVO.getTaxableIncomeDOC02().multiply(new BigDecimal(vatPerc)).setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP));
// calculate row total...
detailItemVO.setValueDOC02(detailItemVO.getTaxableIncomeDOC02().add(detailItemVO.getVatValueDOC02()));
// apply taxable income to total taxable income...
totalTaxableIncome = totalTaxableIncome.add(detailItemVO.getTaxableIncomeDOC02());
}
// retrieve all activities rows...
rowsResponse = rowsBean.loadSaleDocActivities(pars,serverLanguageId,username);
if (rowsResponse.isError())
throw new Exception(rowsResponse.getErrorMessage());
java.util.List actsRows = ((VOListResponse)rowsResponse).getRows();
SaleDocActivityVO actVO = null;
for(int i=0;i<actsRows.size();i++) {
actVO = (SaleDocActivityVO)actsRows.get(i);
actVO.setTaxableIncomeDOC13(
actVO.getValueDOC13().setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
// apply taxable income to total taxable income...
totalTaxableIncome = totalTaxableIncome.add(actVO.getTaxableIncomeDOC13());
}
// retrieve all charges rows...
rowsResponse = rowsBean.loadSaleDocCharges(pars,serverLanguageId,username);
if (rowsResponse.isError())
throw new Exception(rowsResponse.getErrorMessage());
java.util.List chargesRows = ((VOListResponse)rowsResponse).getRows();
SaleDocChargeVO chargeVO = null;
for(int i=0;i<chargesRows.size();i++) {
chargeVO = (SaleDocChargeVO)chargesRows.get(i);
if (chargeVO.getValueDOC03()!=null) {
chargeVO.setTaxableIncomeDOC03(
chargeVO.getValueDOC03().setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
// apply taxable income to total taxable income...
totalTaxableIncome = totalTaxableIncome.add(chargeVO.getTaxableIncomeDOC03());
}
}
// fill in coeff...
Hashtable coeff = new Hashtable(); // collection of <item/act/valuecharge,taxableincome/totaltaxableincome>
for(int i=0;i<detailItemRows.size();i++) {
detailItemVO = (DetailSaleDocRowVO)detailItemRows.get(i);
coeff.put(detailItemVO,detailItemVO.getTaxableIncomeDOC02().divide(totalTaxableIncome,BigDecimal.ROUND_HALF_UP));
}
for(int i=0;i<actsRows.size();i++) {
actVO = (SaleDocActivityVO)actsRows.get(i);
coeff.put(actVO,actVO.getTaxableIncomeDOC13().divide(totalTaxableIncome,BigDecimal.ROUND_HALF_UP));
}
for(int i=0;i<chargesRows.size();i++) {
chargeVO = (SaleDocChargeVO)chargesRows.get(i);
if (chargeVO.getValueDOC03()!=null) {
coeff.put(chargeVO,chargeVO.getTaxableIncomeDOC03().divide(totalTaxableIncome,BigDecimal.ROUND_HALF_UP));
}
}
// apply % charges to all taxable incomes...
SaleDocChargeVO percVO = null;
for(int k=0;k<chargesRows.size();k++) {
percVO = (SaleDocChargeVO)chargesRows.get(k);
if (percVO.getPercDOC03()!=null) {
for(int i=0;i<detailItemRows.size();i++) {
detailItemVO = (DetailSaleDocRowVO)detailItemRows.get(i);
detailItemVO.setTaxableIncomeDOC02(
detailItemVO.getTaxableIncomeDOC02().add(detailItemVO.getTaxableIncomeDOC02().multiply(percVO.getPercDOC03().divide(new BigDecimal(100),BigDecimal.ROUND_HALF_UP))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
for(int i=0;i<actsRows.size();i++) {
actVO = (SaleDocActivityVO)actsRows.get(i);
actVO.setTaxableIncomeDOC13(
actVO.getTaxableIncomeDOC13().add(actVO.getTaxableIncomeDOC13().multiply(percVO.getPercDOC03().divide(new BigDecimal(100),BigDecimal.ROUND_HALF_UP))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
for(int i=0;i<chargesRows.size();i++) {
chargeVO = (SaleDocChargeVO)chargesRows.get(i);
if (chargeVO.getValueDOC03()!=null) {
chargeVO.setTaxableIncomeDOC03(
chargeVO.getTaxableIncomeDOC03().add(chargeVO.getTaxableIncomeDOC03().multiply(percVO.getPercDOC03().divide(new BigDecimal(100),BigDecimal.ROUND_HALF_UP))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
}
}
}
// +MC 7/1/2011 (as in SaleDocTotalsBean.getSaleDocTotals)
// apply discount (eventually) defined at row level...
if (vo.getDiscountValueDOC01()!=null) {
for(int i=0;i<detailItemRows.size();i++) {
detailItemVO = (DetailSaleDocRowVO)detailItemRows.get(i);
detailItemVO.setTaxableIncomeDOC02(
detailItemVO.getTaxableIncomeDOC02().subtract(vo.getDiscountValueDOC01().multiply((BigDecimal)coeff.get(detailItemVO))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
for(int i=0;i<actsRows.size();i++) {
actVO = (SaleDocActivityVO)actsRows.get(i);
actVO.setTaxableIncomeDOC13(
actVO.getTaxableIncomeDOC13().subtract(vo.getDiscountValueDOC01().multiply((BigDecimal)coeff.get(actVO))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
for(int i=0;i<chargesRows.size();i++) {
chargeVO = (SaleDocChargeVO)chargesRows.get(i);
if (chargeVO.getValueDOC03()!=null) {
chargeVO.setTaxableIncomeDOC03(
chargeVO.getTaxableIncomeDOC03().subtract(vo.getDiscountValueDOC01().multiply((BigDecimal)coeff.get(chargeVO))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
}
}
else if (vo.getDiscountPercDOC01()!=null) {
for(int i=0;i<detailItemRows.size();i++) {
detailItemVO = (DetailSaleDocRowVO)detailItemRows.get(i);
detailItemVO.setTaxableIncomeDOC02(
detailItemVO.getTaxableIncomeDOC02().subtract(detailItemVO.getTaxableIncomeDOC02().multiply(vo.getDiscountPercDOC01().divide(new BigDecimal(100),BigDecimal.ROUND_HALF_UP))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
for(int i=0;i<actsRows.size();i++) {
actVO = (SaleDocActivityVO)actsRows.get(i);
actVO.setTaxableIncomeDOC13(
actVO.getTaxableIncomeDOC13().subtract(actVO.getTaxableIncomeDOC13().multiply(vo.getDiscountPercDOC01().divide(new BigDecimal(100),BigDecimal.ROUND_HALF_UP))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
for(int i=0;i<chargesRows.size();i++) {
chargeVO = (SaleDocChargeVO)chargesRows.get(i);
if (chargeVO.getValueDOC03()!=null) {
chargeVO.setTaxableIncomeDOC03(
chargeVO.getTaxableIncomeDOC03().subtract(chargeVO.getTaxableIncomeDOC03().multiply(vo.getDiscountPercDOC01().divide(new BigDecimal(100),BigDecimal.ROUND_HALF_UP))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
}
}
// retrieve header discounts..
rowsResponse = rowsBean.loadSaleDocDiscounts(pars,serverLanguageId,username);
if (rowsResponse.isError())
throw new Exception(rowsResponse.getErrorMessage());
java.util.List discounts = ((VOListResponse)rowsResponse).getRows();
// apply header discounts to all taxable incomes...
SaleDocDiscountVO discVO = null;
for(int k=0;k<discounts.size();k++) {
discVO = (SaleDocDiscountVO)discounts.get(k);
if (discVO.getPercDOC05()!=null) {
// the current discount is % discount...
for(int i=0;i<detailItemRows.size();i++) {
detailItemVO = (DetailSaleDocRowVO)detailItemRows.get(i);
detailItemVO.setTaxableIncomeDOC02(
detailItemVO.getTaxableIncomeDOC02().subtract(detailItemVO.getTaxableIncomeDOC02().multiply(discVO.getPercDOC05().divide(new BigDecimal(100),BigDecimal.ROUND_HALF_UP))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
for(int i=0;i<actsRows.size();i++) {
actVO = (SaleDocActivityVO)actsRows.get(i);
actVO.setTaxableIncomeDOC13(
actVO.getTaxableIncomeDOC13().subtract(actVO.getTaxableIncomeDOC13().multiply(discVO.getPercDOC05().divide(new BigDecimal(100),BigDecimal.ROUND_HALF_UP))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
for(int i=0;i<chargesRows.size();i++) {
chargeVO = (SaleDocChargeVO)chargesRows.get(i);
if (chargeVO.getValueDOC03()!=null) {
chargeVO.setTaxableIncomeDOC03(
chargeVO.getTaxableIncomeDOC03().subtract(chargeVO.getTaxableIncomeDOC03().multiply(discVO.getPercDOC05().divide(new BigDecimal(100),BigDecimal.ROUND_HALF_UP))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
}
}
else if (discVO.getValueDOC05()!=null) {
// the current discount is a value discount...
for(int i=0;i<detailItemRows.size();i++) {
detailItemVO = (DetailSaleDocRowVO)detailItemRows.get(i);
detailItemVO.setTaxableIncomeDOC02(
detailItemVO.getTaxableIncomeDOC02().subtract(discVO.getValueDOC05().multiply((BigDecimal)coeff.get(detailItemVO))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
for(int i=0;i<actsRows.size();i++) {
actVO = (SaleDocActivityVO)actsRows.get(i);
actVO.setTaxableIncomeDOC13(
actVO.getTaxableIncomeDOC13().subtract(discVO.getValueDOC05().multiply((BigDecimal)coeff.get(actVO))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
for(int i=0;i<chargesRows.size();i++) {
chargeVO = (SaleDocChargeVO)chargesRows.get(i);
if (chargeVO.getValueDOC03()!=null) {
chargeVO.setTaxableIncomeDOC03(
chargeVO.getTaxableIncomeDOC03().subtract(discVO.getValueDOC05().multiply((BigDecimal)coeff.get(chargeVO))).
setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP)
);
}
}
}
}
// update vat values, item rows and calculate totals...
Hashtable itemsTaxableIncomeRows = new Hashtable(); // collection of pairs <vatcode,TaxableIncomeVO>
totalTaxableIncome = new BigDecimal(0);
BigDecimal totalVat = new BigDecimal(0);
String vatCode = null;
String vatDescr = null;
TaxableIncomeVO tVO = null;
pstmt = conn.prepareStatement(
"update DOC02_SELLING_ITEMS set TAXABLE_INCOME=?,VAT_VALUE=?,VALUE=?,TOTAL_DISCOUNT=?,LAST_UPDATE_USER=?,LAST_UPDATE_DATE=? "+
"where COMPANY_CODE_SYS01=? and DOC_TYPE=? and DOC_YEAR=? and DOC_NUMBER=? and ITEM_CODE_ITM01=? and "+
"VARIANT_TYPE_ITM06=? and VARIANT_CODE_ITM11=? and "+
"VARIANT_TYPE_ITM07=? and VARIANT_CODE_ITM12=? and "+
"VARIANT_TYPE_ITM08=? and VARIANT_CODE_ITM13=? and "+
"VARIANT_TYPE_ITM09=? and VARIANT_CODE_ITM14=? and "+
"VARIANT_TYPE_ITM10=? and VARIANT_CODE_ITM15=? "
);
for(int i=0;i<detailItemRows.size();i++) {
detailItemVO = (DetailSaleDocRowVO)detailItemRows.get(i);
if (customerVatValue==null) {
vatCode = detailItemVO.getVatCodeItm01DOC02();
vatDescr = detailItemVO.getVatDescriptionDOC02();
vatPerc = detailItemVO.getValueReg01DOC02().doubleValue()*(1d-detailItemVO.getDeductibleReg01DOC02().doubleValue()/100d)/100;
}
else {
vatCode = customerVatCode;
vatDescr = customerVatDescription;
vatPerc = customerVatValue.doubleValue()/100d;
}
detailItemVO.setVatValueDOC02(detailItemVO.getTaxableIncomeDOC02().multiply(new BigDecimal(vatPerc)).setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP));
detailItemVO.setValueDOC02(detailItemVO.getTaxableIncomeDOC02().add(detailItemVO.getVatValueDOC02()));
totalTaxableIncome = totalTaxableIncome.add(detailItemVO.getTaxableIncomeDOC02());
totalVat = totalVat.add(detailItemVO.getVatValueDOC02());
tVO = (TaxableIncomeVO)itemsTaxableIncomeRows.get(vatCode);
if (tVO==null) {
tVO = new TaxableIncomeVO();
tVO.setRowType(tVO.ITEM_ROW_TYPE);
tVO.setVatCode(vatCode);
tVO.setVatDescription(vatDescr);
tVO.setVatValue(new BigDecimal(0));
tVO.setTaxableIncome(new BigDecimal(0));
itemsTaxableIncomeRows.put(vatCode,tVO);
}
tVO.setTaxableIncome(tVO.getTaxableIncome().add(detailItemVO.getTaxableIncomeDOC02()).setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP));
tVO.setVatValue(tVO.getVatValue().add(detailItemVO.getVatValueDOC02()).setScale(vo.getDecimalsREG03().intValue(),BigDecimal.ROUND_HALF_UP));
pstmt.setBigDecimal(1,detailItemVO.getTaxableIncomeDOC02());
pstmt.setBigDecimal(2,detailItemVO.getVatValueDOC02());
pstmt.setBigDecimal(3,detailItemVO.getValueDOC02());
pstmt.setBigDecimal(4,detailItemVO.getTotalDiscountDOC02());
pstmt.setString(5,username);
pstmt.setTimestamp(6,new java.sql.Timestamp(System.currentTimeMillis()));
pstmt.setString(7,detailItemVO.getCompanyCodeSys01DOC02());
pstmt.setString(8,detailItemVO.getDocTypeDOC02());
pstmt.setBigDecimal(9,detailItemVO.getDocYearDOC02());
pstmt.setBigDecimal(10,detailItemVO.getDocNumberDOC02());
pstmt.setString(11,detailItemVO.getItemCodeItm01DOC02());
pstmt.setString(12,detailItemVO.getVariantTypeItm06DOC02());
pstmt.setString(13,detailItemVO.getVariantCodeItm11DOC02());
pstmt.setString(14,detailItemVO.getVariantTypeItm07DOC02());
pstmt.setString(15,detailItemVO.getVariantCodeItm12DOC02());
pstmt.setString(16,detailItemVO.getVariantTypeItm08DOC02());
pstmt.setString(17,detailItemVO.getVariantCodeItm13DOC02());
pstmt.setString(18,detailItemVO.getVariantTypeItm09DOC02());
pstmt.setString(19,detailItemVO.getVariantCodeItm14DOC02());
pstmt.setString(20,detailItemVO.getVariantTypeItm10DOC02());
pstmt.setString(21,detailItemVO.getVariantCodeItm15DOC02());
pstmt.execute();
}
pstmt.close();