package com.openseedbox.models;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import siena.Column;
import siena.DateTime;
import siena.Index;
import siena.Table;
@Table("invoice")
public class Invoice extends ModelBase {
@Column("user_id")
@Index("invoice_user_IDX")
private User user;
@DateTime
@Column("invoice_date")
private Date invoiceDate;
@DateTime
@Column("payment_date")
private Date paymentDate;
@Column("bitpay_url")
private String bitpayUrl;
@Column("bitpay_id")
private String bitpayId;
public static Invoice createInvoice(User u, Plan p) {
Invoice i = new Invoice();
i.setUser(u);
i.setInvoiceDate(new Date());
i.insert();
InvoiceLine line = new InvoiceLine();
line.setName(p.getInvoiceLineName());
line.setDescription(p.getInvoiceLineDescription());
line.setQuantity(1);
line.setPrice(p.getMonthlyCost());
line.setParentInvoice(i);
line.insert();
return i;
}
public static List<Invoice> getUnpaidForUser(User u) {
return Invoice.all()
.filter("user", u)
.filter("paymentDate", null).fetch();
}
public static List<Invoice> getPaidForUser(User u) {
return Invoice.all()
.filter("user", u)
.filter("paymentDate !=", null)
.order("-paymentDate").fetch();
}
public boolean hasBeenPaid() {
return paymentDate != null;
}
public List<InvoiceLine> getInvoiceLines() {
return InvoiceLine.all().filter("parentInvoice", this).fetch();
}
public BigDecimal getTotalAmount() {
BigDecimal total = BigDecimal.ZERO;
for (InvoiceLine line : getInvoiceLines()) {
total = total.add(line.getPrice());
}
return total;
}
public String getPaymentUrl() {
if (this.bitpayUrl == null) {
//BitPayResponse bpr = BitPay.createInvoice(this);
//this.bitpayId = bpr.getId();
//this.bitpayUrl = bpr.getUrl();
this.save();
}
return this.bitpayUrl;
}
/* Getters and Setters */
public User getUser() {
return User.findById(user.id);
}
public void setUser(User user) {
this.user = user;
}
public Date getInvoiceDate() {
return invoiceDate;
}
public void setInvoiceDate(Date invoiceDate) {
this.invoiceDate = invoiceDate;
}
public Date getPaymentDate() {
return paymentDate;
}
public void setPaymentDate(Date paymentDate) {
this.paymentDate = paymentDate;
}
}