package de.asideas.crowdsource.presentation;
import com.fasterxml.jackson.annotation.JsonView;
import de.asideas.crowdsource.domain.model.FinancingRoundEntity;
import de.asideas.crowdsource.domain.model.PledgeEntity;
import de.asideas.crowdsource.presentation.project.PublicFinancingRoundInformationView;
import de.asideas.crowdsource.util.validation.financinground.FinancingRoundNotColliding;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.joda.time.DateTime;
import javax.validation.constraints.Future;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.util.List;
@FinancingRoundNotColliding
public class FinancingRound {
@JsonView(PublicFinancingRoundInformationView.class)
private String id;
@JsonView(PublicFinancingRoundInformationView.class)
private DateTime startDate = new DateTime();
@NotNull
@Future(message = "end-date-in-future")
@JsonView(PublicFinancingRoundInformationView.class)
private DateTime endDate;
@NotNull
@Min(value = 1l, message = "at-least-one-dollar")
private Integer budget;
@JsonView(PublicFinancingRoundInformationView.class)
private Integer postRoundBudget;
@JsonView(PublicFinancingRoundInformationView.class)
private Integer postRoundBudgetRemaining;
@JsonView(PublicFinancingRoundInformationView.class)
private boolean active;
@JsonView(PublicFinancingRoundInformationView.class)
private boolean postRoundBudgetDistributable;
public FinancingRound(FinancingRoundEntity financingRoundEntity, List<PledgeEntity> postRoundPledges) {
this.id = financingRoundEntity.getId();
this.startDate = financingRoundEntity.getStartDate();
this.endDate = financingRoundEntity.getEndDate();
this.budget = financingRoundEntity.getBudget();
this.postRoundBudget = financingRoundEntity.getPostRoundBudget();
this.active = financingRoundEntity.active();
this.postRoundBudgetRemaining = financingRoundEntity.postRoundPledgableBudgetRemaining(postRoundPledges);
this.postRoundBudgetDistributable = financingRoundEntity.terminated() && financingRoundEntity.getTerminationPostProcessingDone();
}
public FinancingRound() {
}
public String getId() {
return this.id;
}
public DateTime getStartDate() {
return this.startDate;
}
public DateTime getEndDate() {
return this.endDate;
}
public Integer getBudget() {
return this.budget;
}
public boolean isActive() {
return this.active;
}
public Integer getPostRoundBudget() {
return postRoundBudget;
}
public Integer getPostRoundBudgetRemaining() {
return postRoundBudgetRemaining;
}
public boolean isPostRoundBudgetDistributable() {
return postRoundBudgetDistributable;
}
public void setId(String id) {
this.id = id;
}
public void setStartDate(DateTime startDate) {
this.startDate = startDate;
}
public void setEndDate(DateTime endDate) {
this.endDate = endDate;
}
public void setBudget(Integer budget) {
this.budget = budget;
}
public void setActive(boolean active) {
this.active = active;
}
public void setPostRoundBudget(Integer postRoundBudget) {
this.postRoundBudget = postRoundBudget;
}
public void setPostRoundBudgetRemaining(Integer postRoundBudgetRemaining) {
this.postRoundBudgetRemaining = postRoundBudgetRemaining;
}
public void setPostRoundBudgetDistributable(boolean postRoundBudgetDistributable) {
this.postRoundBudgetDistributable = postRoundBudgetDistributable;
}
@Override
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, o);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}