package com.topsun.posclient.sales.dialog;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import com.topsun.posclient.common.AppConstants;
import com.topsun.posclient.common.ProjectUtil;
import com.topsun.posclient.common.ui.style.CommonCss;
import com.topsun.posclient.common.ui.utils.FormatUtils;
import com.topsun.posclient.datamodel.CashierModel;
import com.topsun.posclient.datamodel.Item;
import com.topsun.posclient.datamodel.PartSales;
import com.topsun.posclient.datamodel.User;
import com.topsun.posclient.sales.MessageResources;
import com.topsun.posclient.sales.core.SalesDataUtil;
import com.topsun.posclient.sales.ui.gold.PartSalesManager;
/**
* 折扣/抹零确认对话框,输入折扣/抹零值
*
* @author Dong
*
*/
public class MAuthConfirmDialog extends Dialog {
private int opFlag = 0;//0 折扣 1抹零
private Text inputMauth;//输入折扣和抹零值
public Text salesOffPoint;//折扣
public Text delZero;//抹零
public Text factTotalAmount;//实收金额
private User authUser;//进行折扣/抹零的用户的权限
protected MAuthConfirmDialog(Shell parentShell) {
super(parentShell);
}
protected void configureShell(Shell newShell) {
if(this.getOpFlag() == 0){
newShell.setText("请输入折扣值");
}else{
newShell.setText("请输入抹零值");
}
super.configureShell(newShell);
}
protected void okPressed() {
String inputMauthStr = inputMauth.getText();
boolean flag = true;
if(this.getOpFlag() == 0){
flag = FormatUtils.checkNeatnessFormat(this.getShell(), inputMauthStr,"【折扣值】格式不正确,取值范围【0-1】");
if(!flag){
inputMauth.forceFocus();
inputMauth.setText("");
return;
}
}
if(null == inputMauthStr || "".equals(inputMauthStr)){
if(this.getOpFlag() == 0){
MessageDialog.openError(this.getShell(), MessageResources.message_ui_tips, "请输入【折扣值】");
inputMauth.forceFocus();
return;
}
MessageDialog.openError(this.getShell(), MessageResources.message_ui_tips, "请输入【抹零金额】");
inputMauth.forceFocus();
return;
}else{
BigDecimal oldTotalAmount = ProjectUtil.formatString(PartSalesManager.getInstance().getTotalAmount().getText());//原合计金额
oldTotalAmount = oldTotalAmount.subtract(ProjectUtil.formatString(getSalesOffPoint().getText()));//总金额-折扣金额
oldTotalAmount = oldTotalAmount.subtract(ProjectUtil.formatString(getDelZero().getText()));//总金额-抹零金额
BigDecimal mlimit = this.getAuthUser().getMauth().getMlimit();
BigDecimal rate = this.getAuthUser().getMauth().getRate();
if(this.getOpFlag() == 0){
FormatUtils.chenckNumFormat(inputMauth, inputMauth.getText(),"【折扣值】格式不正确");
if(ProjectUtil.formatString(inputMauthStr).compareTo(rate) == -1){
MessageDialog.openError(this.getShell(), MessageResources.message_ui_tips, "折扣值不能超过权限设定值");
inputMauth.setText("");
inputMauth.forceFocus();
return;
}
BigDecimal inputMauthVal = ProjectUtil.formatString(inputMauth.getText());//输入的折扣/抹零值
BigDecimal discountAmount = oldTotalAmount.subtract(oldTotalAmount.multiply(inputMauthVal));//被折掉的金额
//分摊到每个单品
PartSales partSales = doAfterMAuth(PartSalesManager.getInstance().getPartSales(),inputMauthVal, oldTotalAmount, opFlag);
PartSalesManager.getInstance().setPartSales(partSales);
PartSalesManager.getInstance().getPartSales().setDiscountRate(inputMauthVal);
PartSalesManager.getInstance().getPartSales().setDiscountAmount(discountAmount);
PartSalesManager.getInstance().getPartSales().setMratio(true);//设置是否折扣
}else{
FormatUtils.chenckNumFormat(inputMauth, inputMauth.getText(),"【抹零】格式不正确");
BigDecimal amountZero = new BigDecimal(inputMauth.getText());// 抹零金额
if(ProjectUtil.formatString(inputMauthStr).compareTo(mlimit) == 1){
MessageDialog.openError(this.getShell(), MessageResources.message_ui_tips, "抹零金额不能超过权限设定值");
inputMauth.setText("");
inputMauth.forceFocus();
return;
}
BigDecimal factTotalAmountVal = ProjectUtil.formatString(factTotalAmount.getText());
BigDecimal mrateAmount = factTotalAmountVal.multiply(this.getAuthUser().getMauth().getMratio());
if(ProjectUtil.formatString(inputMauthStr).compareTo(mrateAmount) == 1){
MessageDialog.openError(this.getShell(), MessageResources.message_ui_tips, "抹零金额不能超过本单抹零上限值【"+ProjectUtil.formatAmount(null, mrateAmount)+"】");
inputMauth.setText("");
inputMauth.forceFocus();
return;
}
PartSalesManager.getInstance().getCashierModelTableViewer().refresh();
//分摊到每个单品
PartSales partSales = doAfterMAuth(PartSalesManager.getInstance().getPartSales(),amountZero, oldTotalAmount, opFlag);
PartSalesManager.getInstance().setPartSales(partSales);
PartSalesManager.getInstance().getPartSales().setMlimit(true);//设置是否抹零
}
BigDecimal discountAmount = oldTotalAmount.subtract(oldTotalAmount.multiply(ProjectUtil.formatString(inputMauth.getText())));//被折掉的金额
BigDecimal amountZero = new BigDecimal(inputMauth.getText());// 抹零金额
//折扣抹零之后的合计金额
String totalAmount = PartSalesManager.getInstance().getTotalAmount().getText();
List<CashierModel> cms = (List<CashierModel>)PartSalesManager.getInstance().getCashierModelTableViewer().getInput();
BigDecimal cmAmountCount = new BigDecimal(0);
for(CashierModel cm : cms){
cmAmountCount = cmAmountCount.add(cm.getAmount());
}
if(cmAmountCount.compareTo(new BigDecimal(0)) == -1){
cmAmountCount = new BigDecimal(0);
}
BigDecimal cashBackAmount = cmAmountCount.subtract(ProjectUtil.formatString(totalAmount));
cashBackAmount = cashBackAmount.subtract(discountAmount);
discountAmount = discountAmount.subtract(amountZero);
if(cashBackAmount.compareTo(new BigDecimal(0)) == -1){
cashBackAmount = new BigDecimal(0);
}
//折扣和抹零之后,重新设置现金找补
// PartSalesManager.getInstance().getCashBack().setText(ProjectUtil.formatAmount(null, cashBackAmount).toString());
super.okPressed();
}
}
/**
* 折扣/抹零之后分摊到单品信息
* @param partSales 零售信息
* @param inputMAuthVal 折扣/抹零值
* @param oldTotalAmount 原合计金额
* @param opFlag 折扣/抹零标识 0 折扣 1抹零
* @return
*/
private PartSales doAfterMAuth(PartSales partSales, BigDecimal inputMAuthVal, BigDecimal oldTotalAmount, int opFlag){
List<Item> itemList = partSales.getItemList();
partSales.setDiscountAccount(this.getAuthUser().getId());
if(opFlag == 0){//折扣
BigDecimal allDis = oldTotalAmount.subtract(oldTotalAmount.multiply(inputMAuthVal));
allDis = allDis.setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal discountAmount = oldTotalAmount.subtract(allDis);//折扣金额
partSales.setDiscountAmount(discountAmount);
partSales.setDiscountRate(inputMAuthVal);
BigDecimal disAdd = new BigDecimal(0);
for(int i=0; i<itemList.size(); i++){
Item item = itemList.get(i);
if(item.getItemType() == AppConstants.ITEM_TYPE_OLDGOLD){
continue;
}
if(i == itemList.size() - 1){
item.setFactAmount(item.getFactAmount().subtract(allDis.subtract(disAdd)));//更新单品实售金额
}else{
BigDecimal factAmount = item.getFactAmount().multiply(inputMAuthVal);
factAmount = factAmount.setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal itemDis = item.getFactAmount().subtract(factAmount);
item.setFactAmount(factAmount);//更新单品实售金额
disAdd = disAdd.add(itemDis);
}
}
}else{//抹零
partSales.setDiscountToZero(inputMAuthVal);
BigDecimal zeroAdd = new BigDecimal(0);
List<Item> newList = new ArrayList<Item>();
for(Item ii : itemList){
if(ii.getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){
continue;
}else{
newList.add(ii);
}
}
for(int i=0; i<newList.size(); i++){
Item iii = newList.get(i);
//如果是最后一个单品
if(i == newList.size() - 1){
System.out.println("");
System.out.println("单品抹零金额为:"+inputMAuthVal.subtract(zeroAdd));
iii.setFactAmount(iii.getFactAmount().subtract(inputMAuthVal.subtract(zeroAdd)));//更新单品实售金额
}else{
//总金额,用于计算权重时作为单品的被除数基数,重新计算整单中没有旧金的合计金额
BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales);
//如果在计算之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去
//整单的折扣金额来保证后面权重的正确性
if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){
totalAmount = totalAmount.subtract(partSales.getDiscountAmount());
}
BigDecimal subAmount = inputMAuthVal.multiply(iii.getFactAmount()).divide(totalAmount, 4, BigDecimal.ROUND_HALF_UP);//单品抹零
subAmount = subAmount.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("");
System.out.println("单品抹零金额为:"+subAmount);
iii.setFactAmount(iii.getFactAmount().subtract(subAmount));//更新单品实售金额
zeroAdd = zeroAdd.add(subAmount);
}
}
}
partSales.setItemList(itemList);//更新partSales
return partSales;
}
protected Control createContents(Composite parent) {
Composite compsite = new Composite(parent, SWT.BORDER);
compsite.setLayout(new GridLayout(2, false));
GridData layoutData = new GridData(GridData.FILL_BOTH);
compsite.setLayoutData(layoutData);
{
Label label = new Label(compsite, SWT.NONE);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
label.setLayoutData(data);
if(this.getOpFlag() == 0){
label.setText("您的最大折扣权限为【"+this.getAuthUser().getMauth().getRate()+"】,请输入本次折扣值");
}else{
BigDecimal factTotalAmountVal = ProjectUtil.formatString(factTotalAmount.getText());
BigDecimal mrateAmount = factTotalAmountVal.multiply(this.getAuthUser().getMauth().getMratio());
label.setText("您的最大抹零权限为【"+this.getAuthUser().getMauth().getMlimit()+"】,本单抹零上限为【"+ProjectUtil.formatAmount(null, mrateAmount)+"】请输入本次抹零金额");
}
label.setFont(CommonCss.getDefaultFont(parent.getDisplay()));
}
{
inputMauth = new Text(compsite, SWT.BORDER);
GridData data = CommonCss.getTextData(100);
inputMauth.setFont(CommonCss.getDefaultFont(parent.getDisplay()));
inputMauth.setLayoutData(data);
}
return super.createContents(parent);
}
protected void createButtonsForButtonBar(Composite parent) {
int buttonWidth = 80;
int buttonHight = 45;
parent.setLayout(new GridLayout(5,false));
Button okbtn = createButton(parent, IDialogConstants.OK_ID, "确定",true);
GridData btnLayout = new GridData();
btnLayout.widthHint = buttonWidth;
btnLayout.heightHint = buttonHight;
okbtn.setLayoutData(btnLayout);
Button cancelBtn = createButton(parent, IDialogConstants.CANCEL_ID, "取消", false);
cancelBtn.setLayoutData(btnLayout);
}
protected Button createButton(Composite parent, int id, String label,
boolean defaultButton) {
return super.createButton(parent, id, label, defaultButton);
}
public Text getSalesOffPoint() {
return salesOffPoint;
}
public void setSalesOffPoint(Text salesOffPoint) {
this.salesOffPoint = salesOffPoint;
}
public Text getDelZero() {
return delZero;
}
public void setDelZero(Text delZero) {
this.delZero = delZero;
}
public final Text getInputMauth() {
return inputMauth;
}
public final void setInputMauth(Text inputMauth) {
this.inputMauth = inputMauth;
}
public final int getOpFlag() {
return opFlag;
}
public final void setOpFlag(int opFlag) {
this.opFlag = opFlag;
}
public Text getFactTotalAmount() {
return factTotalAmount;
}
public void setFactTotalAmount(Text factTotalAmount) {
this.factTotalAmount = factTotalAmount;
}
public User getAuthUser() {
return authUser;
}
public void setAuthUser(User authUser) {
this.authUser = authUser;
}
}