package com.lanyotech.pps.domain;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import com.easyjf.beans.BeanUtils;
import com.easyjf.container.annonation.POLoad;
import com.easyjf.util.CommUtil;
import com.easyjf.web.ajax.IJsonObject;
@Entity
@Table(name = "purchasebill")
public class PurchaseBill implements IJsonObject{
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
@Column(unique = true)
private String sn;
private Integer types;
@ManyToOne(fetch = FetchType.LAZY)
@POLoad
private Supplier supplier;
@ManyToOne(fetch = FetchType.LAZY)
@POLoad
private Employee buyer;
private Date vdate;
private Date inputTime=new Date();
@ManyToOne(fetch = FetchType.LAZY)
private Employee inputUser;
private String remark;
private BigDecimal amount;
private Boolean auditing;
@ManyToOne(fetch = FetchType.LAZY)
@POLoad
private Employee auditor;
private Date auditTime;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "bill")
private List<PurchaseBillItem> items = new java.util.ArrayList<PurchaseBillItem>();
private Integer status;
public Object toJSonObject() {
Map map=CommUtil.obj2mapExcept(this, new String[]{"supplier","buyer","auditor","inputUser","items"});
if(supplier!=null){
map.put("supplier", CommUtil.obj2map(supplier, new String[]{"id","name"}));
}
if(buyer!=null){
map.put("buyer", CommUtil.obj2map(buyer, new String[]{"id","name","trueName"}));
}
if(auditor!=null){
map.put("auditor", CommUtil.obj2map(auditor, new String[]{"id","name","trueName"}));
}
if(inputUser!=null){
map.put("inputUser", CommUtil.obj2map(inputUser, new String[]{"id","name","trueName"}));
}
return map;
}
public Object toJSonObjectWithItems() {
Map map=(Map)this.toJSonObject();
if(items!=null && !items.isEmpty()){
List list=new ArrayList();
for(PurchaseBillItem item:items){
list.add(item.toJSonObject());
}
map.put("items", list);
}
return map;
}
public Long getId() {
return id;
}
public String getSn() {
return sn;
}
public Supplier getSupplier() {
return supplier;
}
public Date getVdate() {
return vdate;
}
public String getRemark() {
return remark;
}
public Boolean getAuditing() {
return auditing;
}
public Employee getAuditor() {
return auditor;
}
public Date getAuditTime() {
return auditTime;
}
public List<PurchaseBillItem> getItems() {
return items;
}
public Integer getStatus() {
return status;
}
public void setId(Long id) {
this.id = id;
}
public void setSn(String sn) {
this.sn = sn;
}
public void setSupplier(Supplier supplier) {
this.supplier = supplier;
}
public void setVdate(Date vdate) {
this.vdate = vdate;
}
public void setRemark(String remark) {
this.remark = remark;
}
public void setAuditing(Boolean auditing) {
this.auditing = auditing;
}
public void setAuditor(Employee auditor) {
this.auditor = auditor;
}
public void setAuditTime(Date auditTime) {
this.auditTime = auditTime;
}
public void setItems(List<PurchaseBillItem> items) {
this.items = items;
}
public void setStatus(Integer status) {
this.status = status;
}
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
public Integer getTypes() {
return types;
}
public Employee getBuyer() {
return buyer;
}
public Date getInputTime() {
return inputTime;
}
public void setTypes(Integer types) {
this.types = types;
}
public void setBuyer(Employee buyer) {
this.buyer = buyer;
}
public void setInputTime(Date inputTime) {
this.inputTime = inputTime;
}
public Employee getInputUser() {
return inputUser;
}
public void setInputUser(Employee inputUser) {
this.inputUser = inputUser;
}
public void countAmount(){
java.math.BigDecimal s=new BigDecimal(0);
if(items!=null&&items.size()>0){
for(PurchaseBillItem it:this.getItems()){
if(it.getAmount()!=null)s=s.add(it.getAmount());
}
}
this.amount=s;
}
public List<Long> updateItems(List<PurchaseBillItem> newItems) {
List<Long> deletes = new java.util.ArrayList<Long>();
for (PurchaseBillItem flow : this.items) {
boolean exist = false;
for (PurchaseBillItem f : newItems) {
if (f.getId() != null) {
if (f.getId().equals(flow.getId())) {
exist = true;
break;
}
}
}
if (!exist)
deletes.add(flow.getId());
}
for (int i = 0; i < deletes.size(); i++) {
this.removeItem((Long) deletes.get(i));
}
for (PurchaseBillItem flow : newItems) {
PurchaseBillItem item = null;
if (flow.getId() != null) {
item = getItem(flow.getId());
}
if (item != null) {
Long id = item.getId();
BeanUtils.copyProperties(flow, item);
item.setId(id);
item.setBill(this);
} else
addItem(flow);
}
return deletes;
}
public PurchaseBillItem getItem(Long itemId) {
PurchaseBillItem item = null;
for (PurchaseBillItem i : items) {
if (i != null && itemId.equals(i.getId())) {
item = i;
break;
}
}
return item;
}
public void addItem(PurchaseBillItem item) {
item.setBill(this);
this.items.add(item);
}
public void removeItem(Long itemId) {
PurchaseBillItem p = getItem(itemId);
if (p != null) {
p.setBill(null);
this.items.remove(p);
}
}
}