package com.topsun.posclient.sales.core;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import com.topsun.posclient.common.AppConstants;
import com.topsun.posclient.datamodel.Item;
import com.topsun.posclient.datamodel.PartSales;
/**
* 数据处理助手
*
* @author TanDong
*
*/
public class SalesDataUtilHelper {
/**
* 获取打印总页数(含拆票处理)
* @param partSales
* @return
*/
public static int getPrintPageCount(PartSales partSales){
List<Item> newList = new ArrayList<Item>();
List<Item> items = partSales.getItemList();
//如果销售类型为换货,被换购的单品就不需要打印发票所以直接continue遍历下一个单品
if(partSales.getSalesType() == AppConstants.SALES_TYPE_EXECHANGE){
for(int i=0; i<items.size(); i++){
if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_RETURNED)){
continue;
}else{
newList.add(items.get(i));
}
}
}else{
for(int i=0; i<items.size(); i++){
if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){
continue;
}else{
newList.add(items.get(i));
}
}
}
int ret = 0;
for(Item item : newList){
if(item.getFactAmount().compareTo(new BigDecimal(100000)) == 1){
int size = item.getFactAmount().divide(new BigDecimal(100000), 0, BigDecimal.ROUND_UP).intValue();
ret = ret+size;
}else{
ret = ret + 1;
}
}
return ret;
}
/**
* 获取最后一个拆票item的旧金抵扣金额
* @param itemCode 用单品编码作为参数,是因为传过来的是被拆之后的item,
* 而在partSales中的是没有拆的,所以根据itemCode去获取没有拆之前的item从而计算权重,得到抵扣金额
* @param partSales
* @return
*/
public static BigDecimal getOldAmountForLastCPItem(String itemCode, PartSales partSales){
BigDecimal ret = new BigDecimal(0);
List<Item> items = partSales.getItemList();
if(null == items || items.size() == 0){
return ret;
}
List<Item> newList = new ArrayList<Item>();
//如果销售类型为换货,被换购的单品就不需要打印发票所以直接continue遍历下一个单品
if(partSales.getSalesType() == AppConstants.SALES_TYPE_EXECHANGE){
for(int i=0; i<items.size(); i++){
if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_RETURNED)){
continue;
}else{
newList.add(items.get(i));
}
}
}else{
for(int i=0; i<items.size(); i++){
if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){
continue;
}else{
newList.add(items.get(i));
}
}
}
//零售数据中的所有旧金金额合计
BigDecimal oldAmountCount = new BigDecimal(0);
for(Item iii : partSales.getItemList()){
if(iii.getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){
oldAmountCount = oldAmountCount.add(iii.getFactAmount());//旧金抵扣金额合计
}
}
BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales);
//如果在计算旧金抵扣之前整单有抹零金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的抹零金额来保证后面权重的正确性
if(partSales.getDiscountToZero().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountToZero());
}
//如果在计算旧金抵扣之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的折扣金额来保证后面权重的正确性
if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountAmount());
}
BigDecimal oldGoldAmountAdd = new BigDecimal(0);
for(Item item : newList){
if(item.getItemCode().equals(itemCode)){
ret = oldAmountCount.subtract(oldGoldAmountAdd);
}else{
//多个被拆票的单品,只用最后一个做为旧金抵扣累加
if(!(item.getFactAmount().compareTo(new BigDecimal(100000)) == 0)){
BigDecimal amount = oldAmountCount.multiply(item.getFactAmount()).divide(totalAmount,2,BigDecimal.ROUND_HALF_UP);
oldAmountCount = oldAmountCount.add(amount);
}
}
}
return ret;
}
/**
* 获取拆票item的旧金抵扣金额
* @param itemCode
* @param partSales
* @return
*/
public static BigDecimal getOldAmountForCPItem(String itemCode, PartSales partSales){
BigDecimal ret = new BigDecimal(0);
List<Item> items = partSales.getItemList();
if(null == items || items.size() == 0){
return ret;
}
//零售数据中的所有旧金金额合计
BigDecimal oldAmountCount = new BigDecimal(0);
for(Item iii : partSales.getItemList()){
if(iii.getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){
oldAmountCount = oldAmountCount.add(iii.getFactAmount());//旧金抵扣金额合计
}
}
BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales);
//如果在计算旧金抵扣之前整单有抹零金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的抹零金额来保证后面权重的正确性
if(partSales.getDiscountToZero().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountToZero());
}
//如果在计算旧金抵扣之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的折扣金额来保证后面权重的正确性
if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountAmount());
}
for(Item item : items){
if(item.getItemCode().equals(itemCode)){
ret = oldAmountCount.multiply(item.getFactAmount()).divide(totalAmount,4,BigDecimal.ROUND_HALF_UP);
}
}
ret = ret.setScale(2, BigDecimal.ROUND_HALF_UP);
return ret;
}
/**
* 获取拆票Item的不开票金额
* @param itemCode 单品的编码
* @param partSales 零售数据
* @param noInvoiceAmountCount 不开票金额合计
* @return 拆票Item的不开票金额
*/
public static BigDecimal getNoInvoiceAmountForCPItem(String itemCode, PartSales partSales, BigDecimal noInvoiceAmountCount){
BigDecimal ret = new BigDecimal(0);
List<Item> items = partSales.getItemList();
if(null == items || items.size() == 0){
return ret;
}
BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales);
//如果在计算开票金额之前整单有抹零金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的抹零金额来保证后面权重的正确性
if(partSales.getDiscountToZero().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountToZero());
}
//如果在计算开票金额之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的折扣金额来保证后面权重的正确性
if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountAmount());
}
for(Item item : items){
if(item.getItemCode().equals(itemCode)){
ret = noInvoiceAmountCount.multiply(item.getFactAmount()).divide(totalAmount,2,BigDecimal.ROUND_HALF_UP);
}
}
return ret;
}
/**
* 获取最后一个拆票Item的不开票金额
* @param itemCode 最后一个单品的编码
* @param partSales 零售数据
* @param noInvoiceAmountCount 不开票金额合计
* @return 最后一个拆票Item的不开票金额
*/
public static BigDecimal getNoInvoiceAmountForLastCPItem(String itemCode, PartSales partSales, BigDecimal noInvoiceAmountCount){
BigDecimal ret = new BigDecimal(0);
List<Item> items = partSales.getItemList();
if(null == items || items.size() == 0){
return ret;
}
List<Item> newList = new ArrayList<Item>();
//如果销售类型为换货,被换购的单品就不需要打印发票所以直接continue遍历下一个单品
if(partSales.getSalesType() == AppConstants.SALES_TYPE_EXECHANGE){
for(int i=0; i<items.size(); i++){
if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_RETURNED)){
continue;
}else{
newList.add(items.get(i));
}
}
}else{
for(int i=0; i<items.size(); i++){
if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){
continue;
}else{
newList.add(items.get(i));
}
}
}
BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales);
//如果在计算开票金额之前整单有抹零金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的抹零金额来保证后面权重的正确性
if(partSales.getDiscountToZero().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountToZero());
}
//如果在计算开票金额之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的折扣金额来保证后面权重的正确性
if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountAmount());
}
BigDecimal itemNoInvoiceAmountAdd = new BigDecimal(0);
for(Item item : newList){
if(item.getItemCode().equals(itemCode)){
ret = noInvoiceAmountCount.subtract(itemNoInvoiceAmountAdd);
}else{
//多个被拆票的单品,只用最后一个做为不开票金额累加
if(!(item.getFactAmount().compareTo(new BigDecimal(100000)) == 0)){
BigDecimal amount = noInvoiceAmountCount.multiply(item.getFactAmount()).divide(totalAmount,2,BigDecimal.ROUND_HALF_UP);
itemNoInvoiceAmountAdd = itemNoInvoiceAmountAdd.add(amount);
}
}
}
return ret;
}
/**
* 获取最后一个单品的不开票金额
* @param itemCode 最后一个单品的单品编码
* @param partSales 零售数据
* @param noInvoiceAmountCount 不开票金额合计
* @return 最后一个单品的不开票金额
*/
public static BigDecimal getNoInvoiceAmountForLastItem(String itemCode, PartSales partSales, BigDecimal noInvoiceAmountCount){
BigDecimal ret = new BigDecimal(0);
List<Item> items = partSales.getItemList();
if(null == items || items.size() == 0){
return ret;
}
List<Item> newList = new ArrayList<Item>();
//如果销售类型为换货,被换购的单品就不需要打印发票所以直接continue遍历下一个单品
if(partSales.getSalesType() == AppConstants.SALES_TYPE_EXECHANGE){
for(int i=0; i<items.size(); i++){
if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_RETURNED)){
continue;
}else{
newList.add(items.get(i));
}
}
}else{
for(int i=0; i<items.size(); i++){
if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){
continue;
}else{
newList.add(items.get(i));
}
}
}
BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales);
//如果在计算开票金额之前整单有抹零金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的抹零金额来保证后面权重的正确性
if(partSales.getDiscountToZero().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountToZero());
}
//如果在计算开票金额之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的折扣金额来保证后面权重的正确性
if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountAmount());
}
BigDecimal itemNoInvoiceAmountAdd = new BigDecimal(0);
for(Item item : newList){
if(item.getItemCode().equals(itemCode)){
ret = noInvoiceAmountCount.subtract(itemNoInvoiceAmountAdd);
}else{
BigDecimal amount = noInvoiceAmountCount.multiply(item.getFactAmount()).divide(totalAmount,2,BigDecimal.ROUND_HALF_UP);
itemNoInvoiceAmountAdd = itemNoInvoiceAmountAdd.add(amount);
}
}
return ret;
}
/**
* 获取单品的不开票金额
* @param item 最后一个单品
* @param partSales 零售数据
* @param noInvoiceAmountCount 不开票金额合计
* @return 最后一个单品的不开票金额
*/
public static BigDecimal getNoInvoiceAmountForItem(Item item, PartSales partSales, BigDecimal noInvoiceAmountCount){
BigDecimal ret = new BigDecimal(0);
List<Item> items = partSales.getItemList();
if(null == items || items.size() == 0){
return ret;
}
List<Item> newList = new ArrayList<Item>();
//如果销售类型为换货,被换购的单品就不需要打印发票所以直接continue遍历下一个单品
if(partSales.getSalesType() == AppConstants.SALES_TYPE_EXECHANGE){
for(int i=0; i<items.size(); i++){
if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_RETURNED)){
continue;
}else{
newList.add(items.get(i));
}
}
}else{
for(int i=0; i<items.size(); i++){
if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){
continue;
}else{
newList.add(items.get(i));
}
}
}
BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales);
//如果在计算开票金额之前整单有抹零金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的抹零金额来保证后面权重的正确性
if(partSales.getDiscountToZero().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountToZero());
}
//如果在计算开票金额之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的折扣金额来保证后面权重的正确性
if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountAmount());
}
ret = noInvoiceAmountCount.multiply(item.getFactAmount()).divide(totalAmount,2,BigDecimal.ROUND_HALF_UP);
return ret;
}
}