docs: @Nonnull
    public EChange deleteUserGroup (@Nullable final String sUserGroupID)
    {
      if (StringHelper.hasNoText (sUserGroupID))
        return EChange.UNCHANGED;
  
      final UserGroup aDeletedUserGroup = getOfID (sUserGroupID);
      if (aDeletedUserGroup == null)
      {
        AuditHelper.onAuditDeleteFailure (UserGroup.OT, "no-such-usergroup-id", sUserGroupID);
        return EChange.UNCHANGED;
      }
      if (aDeletedUserGroup.isDeleted ())
      {
        AuditHelper.onAuditDeleteFailure (UserGroup.OT, "already-deleted", sUserGroupID);
        return EChange.UNCHANGED;
      }
  
      m_aRWLock.writeLock ().lock ();
      try
      {
        if (BusinessObjectHelper.setDeletionNow (aDeletedUserGroup).isUnchanged ())
        {
          AuditHelper.onAuditDeleteFailure (UserGroup.OT, "already-deleted", sUserGroupID);
          return EChange.UNCHANGED;
        }
        internalMarkItemDeleted (aDeletedUserGroup);
      }
      finally
      {
        m_aRWLock.writeLock ().unlock ();
      }
      AuditHelper.onAuditDeleteSuccess (UserGroup.OT, sUserGroupID);
  
      // Execute callback as the very last action
      m_aCallbacks.forEach (aCB -> aCB.onUserGroupDeleted (aDeletedUserGroup));
  
      return EChange.CHANGED;
    }