EN · DE · RU · FR · ES

#415: KundeDao.java

projectforge-business/src/main/java/org/projectforge/business/fibu/KundeDao.java Type: Java · Role: Data Access Object · Source: projectforge-business/src/main/java/org/projectforge/business/fibu/KundeDao.java 129 lines · 89 code · 26 comments · 14 blank
Data Access Object for Kunde entities. Extends BaseDao to provide CRUD operations, Hibernate Search queries, and business-logic-level data access.

Code Structure

Package: org.projectforge.business.fibu

Classes: KundeDao

Extends: BaseDao

Methods (9): select, hasUserSelectAccess, hasUserSelectAccess, hasAccess, hasHistoryAccess, newInstance, isNew, onInsert, doesNumberAlreadyExist

Imports: 11 packages

Source Code (abridged)

package org.projectforge.business.fibu;

import org.jetbrains.annotations.NotNull;
import org.projectforge.business.user.ProjectForgeGroup;
import org.projectforge.common.i18n.UserException;
import org.projectforge.framework.access.OperationType;
import org.projectforge.framework.persistence.api.BaseDao;
import org.projectforge.framework.persistence.api.BaseSearchFilter;
import org.projectforge.framework.persistence.api.QueryFilter;
import org.projectforge.framework.persistence.api.SortProperty;
import org.projectforge.framework.persistence.user.entities.PFUserDO;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class KundeDao extends BaseDao<KundeDO> {
    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(KundeDao.class);

    public KundeDao() {
        super(KundeDO.class);
        avoidNullIdCheckBeforeSave = true;
        this.idProperty = "nummer";
    }

    @Override
    public List<KundeDO> select(final BaseSearchFilter filter) {
        final QueryFilter queryFilter = new QueryFilter(filter);
        queryFilter.addOrder(SortProperty.asc("nummer"));
        return select(queryFilter);
    }

    /**
     * return Always true, no generic select access needed for address objects.
     */
    @Override
    public boolean hasUserSelectAccess(final PFUserDO user, final boolean throwException) {
        return accessChecker.isUserMemberOfGroup(user, throwException, ProjectForgeGroup.FINANCE_GROUP,
                ProjectForgeGroup.CONTROLLING_GROUP,
                ProjectForgeGroup.PROJECT_MANAGER, ProjectForgeGroup.PROJECT_ASSISTANT);
    }

    @Override
    public boolean hasUserSelectAccess(final PFUserDO user, final KundeDO obj, final boolean throwException) {
        if (obj == null) {
            return true;
        }
        if (accessChecker.isUserMemberOfGroup(user, ProjectForgeGroup.FINANCE_GROUP,
                ProjectForgeGroup.CONTROLLING_GROUP)) {
            return true;
        }
        if (accessChecker.isUserMemberOfGroup(user, ProjectForgeGroup.PROJECT_MANAGER,
                ProjectForgeGroup.PROJECT_ASSISTANT)) {
            if (obj.getStatus() != null
                    && !obj.getStatus().isIn(KundeStatus.ENDED, KundeStatus.NONACTIVE, KundeStatus.NONEXISTENT)
                    && !obj.getDeleted()) {
                // Ein Projektleiter sieht keine nicht mehr aktiven oder gelöschten Kunden.
                return true;
            }
        }
        if (throwException) {
            accessChecker.checkIsUserMemberOfGroup(user, ProjectForgeGroup.FINANCE_GROUP);
            log.error("Should not occur! An exception should be thrown.");
        }
        return false;
    }

    @Override
    public boolean hasAccess(final PFUserDO user, final KundeDO obj, final KundeDO oldObj,
                             final OperationType operationType,
                             final boolean throwException) {
        return accessChecker.isUserMemberOfGroup(user, throwException, ProjectForgeGroup.FINANCE_GROUP);
    }

    @Override
    public boolean hasHistoryAccess(final PFUserDO user, final boolean throwException) {
        return accessChecker.isUserMemberOfGroup(user, throwException, ProjectForgeGroup.FINANCE_GROUP,
                ProjectForgeGroup.CONTROLLING_GROUP);
    }

    @Override
    public KundeDO newInstance() {
        return new KundeDO();
    }

    @Override
    public boolean isNew(@NotNull KundeDO obj) {
        return obj.getCreated() == null; // id isn't null while inserting new customers
    }

    @Override
    public void onInsert(KundeDO obj) {
        if (doesNumberAlreadyExist(obj)) {
            obj.setCreated(null);
            throw new UserException("fibu.kunde.validation.existingCustomerNr");
        }
    }

    public boolean doesNumberAlreadyExist(final KundeDO customer) {
        if (customer == null || customer.getNummer() == null) {
            return false;
        }
        KundeDO existingCustomer = find(customer.getNummer(), false);
        return existingCustomer != null;
    }
}

Git History

868d6abb7 2025 -> 2026
88be16404 BaseDao/KundeDao.isNew(data)
63081666f Source file headers: 2024-> 2025.
3785f8347 Migration stuff in progress...
1b50060c3 BaseDao: renamed: get -> find, save -> insert, getList -> select, load -> select