private OrgPart addOrUpdate(
      ServiceContext context, ScopeDO scopeDO, Long orgId, Map<String, String> exts) {

    OrgDO orgDO = orgDAO.getById(orgId);

    if (!scopeDO.getScopeType().isAllowOrgPart()) {
      throw new ServiceException(
          messageSource.getMessage("validation.scope.orgPartNotAllowed", null, null));
    }

    if (orgDO == null) {
      throw new ServiceException(messageSource.getMessage("validation.org.required", null, null));
    }

    OrgPartDO orgPartDO = null;
    try {
      orgPartDO = orgPartDAO.findOrgPart(orgId, scopeDO.getScopeId());
      if (orgPartDO != null) {
        orgPartDO.setExtAttributes(exts);
      }
    } catch (EmptyResultDataAccessException e) {
      orgPartDO = null;
    }

    if (orgPartDO == null) {
      orgPartDO = new OrgPartDO();
      orgPartDO.setOrg(orgDO);
      orgPartDO.setScope(scopeDO);
      orgPartDO.setExtAttributes(exts);
      orgPartDAO.persist(orgPartDO);
    }

    storeExtFields(
        context,
        orgPartDO,
        orgPartExtDAO,
        EntityTypeCode.ORG_PART,
        orgPartDO.getScope().getScopeId());

    if (configService.isBooleanActive(
        context, scopeDO.getScopeId(), ConfigService.ORG_PART_DESCENDANT_CASCADE_ADD)) {
      orgPartDAO.createOrgPartsForDescendants(scopeDO.getScopeId(), orgDO.getOrgId());
    }

    return getMappingService().map(orgPartDO);
  }
  @Override
  @CoreDataModificationStatus(
      modificationType = ModificationType.UPDATE,
      entityClass = OrgPartDO.class)
  public void deleteIfExists(ServiceContext context, Long orgId) {

    OrgPartDO orgPartDO = null;
    ScopeDO scopeDO = null;

    try {
      orgPartDO = orgPartDAO.findOrgPart(orgId, context.getScopeId());
      scopeDO = scopeDAO.getById(context.getScopeId());

      if (orgPartDO != null) {
        List<OrgPartDO> descendants =
            orgPartDAO.findParticipatingDescendantOrgParts(
                orgPartDO.getScope().getScopeId(), orgPartDO.getOrg().getOrgId());
        if (descendants != null && descendants.size() > 0) {
          if (!configService.isBooleanActive(
              context, scopeDO.getScopeId(), ConfigService.ORG_PART_DESCENDANT_CASCADE_DELETE)) {
            FaultInfo faultInfo = new FaultInfo();
            String errorMessage =
                messageSource.getMessage("validation.orgPart.childOrgsParticipating", null, null);
            faultInfo.setMessage(errorMessage);
            faultInfo.setAttributeErrors(Lists.<ValidationError>newArrayList());
            throw new ValidationServiceException(errorMessage, faultInfo);
          }
          List<Long> orgPartIds = Lists.newArrayList();
          for (OrgPartDO descendantDO : descendants) {
            orgPartIds.add(descendantDO.getOrgPartId());
          }
          try {
            orgPartDAO.deleteOrgParts(orgPartIds);
          } catch (Exception e) { // safe to catch all exceptions
            // here because any failure is
            // treated the same.
            FaultInfo faultInfo = new FaultInfo();
            String errorMessage =
                messageSource.getMessage("validation.orgPart.childOrgsParticipating", null, null);
            faultInfo.setMessage(errorMessage);
            faultInfo.setAttributeErrors(Lists.<ValidationError>newArrayList());
            throw new ValidationServiceException(errorMessage, faultInfo);
          }
        }
      }
    } catch (EmptyResultDataAccessException e) {
      // no action to take.
    }
  }