package pt.ist.internalBilling.domain;
import org.fenixedu.bennu.core.domain.User;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import module.finance.util.Money;
import pt.ist.expenditureTrackingSystem.domain.organization.Unit;
import pt.ist.fenixframework.Atomic;
import pt.ist.fenixframework.DomainObject;
public class BillableService extends BillableService_Base {
public BillableService() {
setInternalBillingService(InternalBillingService.getInstance());
}
public JsonObject toJson() {
final JsonObject j = new JsonObject();
j.addProperty("id", getExternalId());
j.addProperty("type", getClass().getName());
j.addProperty("title", getTitle());
j.addProperty("description", getDescription());
return j;
}
@Atomic
public static void create(final String type, final String title, final String description,
final Money costPerBlackAndWhiteCopy, final Money costPerColourCopy) {
switch (type) {
case "pt.ist.internalBilling.domain.PhoneService":
new PhoneService(title, description);
break;
case "pt.ist.internalBilling.domain.PrintService":
new PrintService(title, description);
break;
case "pt.ist.internalBilling.domain.VirtualHostingService":
new VirtualHostingService(title, description);
break;
default:
throw new Error("Unknown billing service type: " + type);
}
}
@Atomic
public void delete() {
setInternalBillingService(null);
deleteDomainObject();
}
@Atomic
public void edit(final String title, final String description) {
setTitle(title);
setDescription(description);
}
@Atomic
public void request(final Unit financer, final JsonElement beneficiaryConfig) {
if (financer != null && beneficiaryConfig != null) {
createServiceRequest(financer, beneficiaryConfig);
}
}
protected void createServiceRequest(final Unit financer, final JsonElement beneficiaryConfig) {
}
protected static Beneficiary beneficiaryFor(final DomainObject object) {
return object instanceof User ? UserBeneficiary.beneficiaryFor((User) object)
: object instanceof Unit ? UnitBeneficiary.beneficiaryFor((Unit) object) : null;
}
}