public boolean changePassword(int id, AccountPasswordViewModel pswdViewModel) {
   boolean result = false;
   try {
     Accounts account = super.find(id);
     if (account.getPassword().equals(pswdViewModel.getOldPassword())
         && pswdViewModel.getNewPassword() != null
         && pswdViewModel.getNewPassword().length() > 0) {
       account.setPassword(pswdViewModel.getNewPassword());
       super.edit(account);
       result = true;
     }
   } catch (Exception e) {
     logger.warn(e.getMessage());
   }
   return result;
 }
  public Optional<AuthenticationResponseViewModel> authenticate(
      AccountAuthenticateViewModel authViewModel) {
    Optional<AuthenticationResponseViewModel> result = Optional.empty();
    if (authViewModel.credentialsAreValid()) {
      Accounts account = null;
      try {
        if (authViewModel.userNameIsSet()) {
          account =
              em.createNamedQuery("Accounts.findByUserName", Accounts.class)
                  .setParameter("userName", authViewModel.getUserName())
                  .getSingleResult();
        } else if (authViewModel.emailIsSet()) {
          account =
              em.createNamedQuery("Accounts.findByEmail", Accounts.class)
                  .setParameter("email", authViewModel.getEmail())
                  .getSingleResult();
        }

        if (account.getPassword().equals(authViewModel.getPassword())) {
          logger.info(
              "authentication for user '"
                  + account.getUserName()
                  + "' ("
                  + account.getId()
                  + ") succeeded");
          AuthenticationResponseViewModel authenticationResponseViewModel =
              new AuthenticationResponseViewModel();
          authenticationResponseViewModel.setId(account.getId());
          authenticationResponseViewModel.setRole(account.getRole());
          result = Optional.of(authenticationResponseViewModel);
        }
      } catch (Exception e) {
        logger.warn(e.getMessage());
      }
    }
    return result;
  }
  public boolean edit(int id, AccountEditViewModel accountEditViewModel) {
    boolean result = false;
    try {
      Accounts account = super.find(id);
      if (!accountEditViewModel.getRole().equals(Accounts.AccountRole.NOTSET)) {
        account.setRole(accountEditViewModel.getRole());
      }
      account.setUpdated(new Timestamp((new Date()).getTime()));
      account.setFirstName(accountEditViewModel.getFirstName());
      account.setLastName(accountEditViewModel.getLastName());
      if (accountEditViewModel.getEmail() != null && accountEditViewModel.getEmail().length() > 0) {
        account.setEmail(accountEditViewModel.getEmail());
      }
      account.setPhoneNumber(accountEditViewModel.getPhoneNumber());
      account.setStreetName(accountEditViewModel.getStreetName());
      account.setStreetNumber(accountEditViewModel.getStreetNumber());
      account.setCity(accountEditViewModel.getCity());
      account.setTags(accountEditViewModel.getTags());

      super.edit(account);
      result = true;
    } catch (Exception e) {
      logger.warn(e.getMessage());
    }
    return result;
  }
  public int add(AccountAddViewModel accountAddViewModel) {
    int result = 0;
    try {
      Accounts account = new Accounts();
      account.setRole(Accounts.AccountRole.CUSTOMER);
      Timestamp current = new Timestamp((new Date()).getTime());
      account.setCreated(current);
      account.setUpdated(current);
      account.setDeleted(false);
      account.setUserName(accountAddViewModel.getUserName());
      account.setFirstName(accountAddViewModel.getFirstName());
      account.setLastName(accountAddViewModel.getLastName());
      account.setEmail(accountAddViewModel.getEmail());
      account.setPassword(accountAddViewModel.getPassword()); // todo: hash
      account.setPhoneNumber(accountAddViewModel.getPhoneNumber());
      account.setStreetName(accountAddViewModel.getStreetName());
      account.setStreetNumber(accountAddViewModel.getStreetNumber());
      account.setCity(accountAddViewModel.getCity());
      account.setTags(accountAddViewModel.getTags());

      em.persist(account);
      em.flush();
      result = account.getId();
    } catch (Exception e) {
      logger.warn(e.getMessage());
    }
    return result;
  }