@GET
  @Produces(JSON_UTF8)
  @Path("suppliers")
  public String suppliers(
      @QueryParam("userID") String userID, @QueryParam("access_token") String access_token) {
    checkToken(access_token);
    Set<Supplier> suppliers = Bennu.getInstance().getSuppliersSet();
    JsonArray toReturn = new JsonArray();
    for (Supplier supplier : suppliers) {
      if (supplier != null) {
        JsonObject obj = new JsonObject();

        obj.addProperty("supplierID", supplier.getExternalId());
        obj.addProperty("fiscalID", supplier.getFiscalIdentificationCode());
        obj.addProperty("name", supplier.getName());
        obj.addProperty("shortName", supplier.getAbbreviatedName());
        obj.addProperty("limit", supplier.getSupplierLimit().toFormatString());
        JsonArray contacts = new JsonArray();
        for (SupplierContact contact : supplier.getSupplierContactSet()) {
          JsonObject contactObj = new JsonObject();
          if (contact.getAddress() != null) {
            JsonObject addressObj = new JsonObject();
            addressObj.addProperty("line1", contact.getAddress().getLine1());
            addressObj.addProperty("line2", contact.getAddress().getLine2());
            addressObj.addProperty("country", contact.getAddress().getCountry());
            contactObj.add("address", addressObj);
          }
          contactObj.addProperty("phone", contact.getPhone());
          contactObj.addProperty("fax", contact.getFax());
          contactObj.addProperty("email", contact.getEmail());
          contacts.add(contactObj);
        }
        obj.add("contacts", contacts);
        obj.addProperty("totalAllocated", supplier.getTotalAllocated().toFormatString());
        JsonArray byCpv = new JsonArray();
        for (CPVReference cpv : supplier.getAllocationsByCPVReference().keySet()) {
          if (cpv != null) {
            JsonObject cpvObj = new JsonObject();
            cpvObj.addProperty("cpvCode", cpv.getCode());
            cpvObj.addProperty("cpvDescription", cpv.getDescription());
            cpvObj.addProperty("totalAllocated", supplier.getTotalAllocated(cpv).toFormatString());
            byCpv.add(cpvObj);
            ;
          }
        }
        obj.add("allocationsByCPV", byCpv);
        toReturn.add(obj);
      }
    }

    return gson.toJson(toReturn);
  }
  @POST
  @Produces(JSON_UTF8)
  @Path("allocateFunds")
  public Response allocateFunds(
      @QueryParam("supplierID") String supplierID,
      @QueryParam("value") String value,
      @QueryParam("valueVat") String valueVAT,
      @QueryParam("cpvCode") String cpvcode,
      @QueryParam("goodsOrService") String goodsOrServices,
      @QueryParam("description") String description,
      @QueryParam("userID") String userID,
      @QueryParam("access_token") String access_token) {

    checkToken(access_token);
    login(User.findByUsername(userID));
    try {

      AfterTheFactAcquisitionProcessBean bean = new AfterTheFactAcquisitionProcessBean();

      Set<Supplier> suppliers = Bennu.getInstance().getSuppliersSet();
      Supplier supplier = null;

      for (Supplier sup : suppliers) {
        if (sup.getExternalId().equals(supplierID)) {
          supplier = sup;
          break;
        }
      }
      if (supplier == null) {
        return respondWithError(Status.NOT_FOUND, "supplier.not.found");
      }

      bean.setSupplier(supplier);
      bean.setAfterTheFactAcquisitionType(AfterTheFactAcquisitionType.PURCHASE);

      Money itemValue = new Money(value);
      bean.setValue(itemValue);

      double VAT = Double.parseDouble(valueVAT);
      bean.setVatValue(new BigDecimal(VAT));

      bean.setYear(new LocalDate().getYear());
      bean.setDescription(description);
      bean.setClassification(AcquisitionItemClassification.valueOf(goodsOrServices.toUpperCase()));
      CPVReference cpvReference = CPVReference.getCPVCode(cpvcode);
      if (cpvReference == null) {
        return respondWithError(Status.NOT_FOUND, "cpv.reference.not.found");
      }
      bean.setCpvReference(cpvReference);

      AfterTheFactAcquisitionProcess process;

      try {
        process = AfterTheFactAcquisitionProcess.createNewAfterTheFactAcquisitionProcess(bean);
      } catch (DomainException e) {
        throw newApplicationError(Status.PRECONDITION_FAILED, "precondition_failed");
      }

      JsonObject obj = new JsonObject();
      obj.addProperty("processID", process.getProcessNumber());
      return Response.ok().entity(gson.toJson(obj)).build();
    } finally {
      logout();
    }
  }