public static Map performFindParty()

in applications/party/src/main/java/org/apache/ofbiz/party/party/PartyServices.java [1521:1940]


    public static Map<String, Object> performFindParty(DispatchContext dctx, Map<String, ? extends Object> context) {
        Map<String, Object> result = ServiceUtil.returnSuccess();
        Delegator delegator = dctx.getDelegator();
        GenericValue userLogin = (GenericValue) context.get("userLogin");
        Locale locale = (Locale) context.get("locale");
        String extInfo = (String) context.get("extInfo");
        EntityCondition extCond = (EntityCondition) context.get("extCond");
        EntityListIterator listIt = null;

        // get the lookup flag
        String noConditionFind = (String) context.get("noConditionFind");

        // create the dynamic view entity
        DynamicViewEntity dynamicView = new DynamicViewEntity();

        // default view settings
        dynamicView.addMemberEntity("PT", "Party");
        dynamicView.addAlias("PT", "partyId");
        dynamicView.addAlias("PT", "statusId");
        dynamicView.addAlias("PT", "partyTypeId");
        dynamicView.addAlias("PT", "externalId");
        dynamicView.addAlias("PT", "createdDate");
        dynamicView.addAlias("PT", "lastModifiedDate");
        dynamicView.addRelation("one-nofk", "", "PartyType", ModelKeyMap.makeKeyMapList("partyTypeId"));
        dynamicView.addRelation("many", "", "UserLogin", ModelKeyMap.makeKeyMapList("partyId"));

        // define the main condition & expression list
        List<EntityCondition> andExprs = new ArrayList<>();
        EntityCondition mainCond = null;

        List<String> orderBy = new ArrayList<>();
        String sortField = (String) context.get("sortField");
        if (UtilValidate.isNotEmpty(sortField)) {
            orderBy.add(sortField);
        }
        List<String> fieldsToSelect = new ArrayList<>();
        // fields we need to select; will be used to set distinct
        fieldsToSelect.add("partyId");
        fieldsToSelect.add("statusId");
        fieldsToSelect.add("partyTypeId");
        fieldsToSelect.add("externalId");
        fieldsToSelect.add("createdDate");
        fieldsToSelect.add("lastModifiedDate");

        // filter on parties that have relationship with logged in user
        String partyRelationshipTypeId = (String) context.get("partyRelationshipTypeId");
        if (UtilValidate.isNotEmpty(partyRelationshipTypeId)) {
            // add relation to view
            dynamicView.addMemberEntity("PRSHP", "PartyRelationship");
            dynamicView.addAlias("PRSHP", "partyIdTo");
            dynamicView.addAlias("PRSHP", "partyRelationshipTypeId");
            dynamicView.addViewLink("PT", "PRSHP", Boolean.FALSE, ModelKeyMap.makeKeyMapList("partyId", "partyIdTo"));
            List<String> ownerPartyIds = UtilGenerics.cast(context.get("ownerPartyIds"));
            EntityCondition relationshipCond = null;
            if (UtilValidate.isEmpty(ownerPartyIds)) {
                String partyIdFrom = userLogin.getString("partyId");
                relationshipCond = EntityCondition.makeCondition(EntityFunction.upperField("partyIdFrom"),
                        EntityOperator.EQUALS, EntityFunction.upper(partyIdFrom));
            } else {
                relationshipCond = EntityCondition.makeCondition("partyIdFrom", EntityOperator.IN, ownerPartyIds);
            }
            dynamicView.addAlias("PRSHP", "partyIdFrom");
            // add the expr
            andExprs.add(EntityCondition.makeCondition(
                    relationshipCond, EntityOperator.AND,
                    EntityCondition.makeCondition(EntityFunction.upperField("partyRelationshipTypeId"), EntityOperator.EQUALS,
                            EntityFunction.upper(partyRelationshipTypeId))));
            fieldsToSelect.add("partyIdTo");
        }

        // get the params
        String partyId = (String) context.get("partyId");
        String partyTypeId = (String) context.get("partyTypeId");
        String roleTypeId = (String) context.get("roleTypeId");
        String statusId = (String) context.get("statusId");
        String userLoginId = (String) context.get("userLoginId");
        String externalId = (String) context.get("externalId");
        String firstName = (String) context.get("firstName");
        String lastName = (String) context.get("lastName");
        String groupName = (String) context.get("groupName");

        // check for a partyId
        if (UtilValidate.isNotEmpty(partyId)) {
            andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("partyId"), EntityOperator.LIKE,
                    EntityFunction.upper("%" + partyId + "%")));
        }

        // now the statusId - send ANY for all statuses; leave null for just enabled; or pass a specific status
        if (UtilValidate.isNotEmpty(statusId)) {
            andExprs.add(EntityCondition.makeCondition("statusId", statusId));
        } else {
            // NOTE: _must_ explicitly allow null as it is not included in a not equal in many databases... odd but true
            andExprs.add(EntityCondition.makeCondition(EntityCondition.makeCondition("statusId", GenericEntity.NULL_FIELD),
                    EntityOperator.OR, EntityCondition.makeCondition("statusId", EntityOperator.NOT_EQUAL, "PARTY_DISABLED")));
        }
        // check for partyTypeId
        if (UtilValidate.isNotEmpty(partyTypeId)) {
            andExprs.add(EntityCondition.makeCondition("partyTypeId", partyTypeId));
        }

        if (UtilValidate.isNotEmpty(externalId)) {
            andExprs.add(EntityCondition.makeCondition("externalId", externalId));
        }
        // ----
        // UserLogin Fields
        // ----

        // filter on user login
        if (UtilValidate.isNotEmpty(userLoginId)) {

            // modify the dynamic view
            dynamicView.addMemberEntity("UL", "UserLogin");
            dynamicView.addAlias("UL", "userLoginId");
            dynamicView.addViewLink("PT", "UL", Boolean.FALSE, ModelKeyMap.makeKeyMapList("partyId"));

            // add the expr
            andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("userLoginId"), EntityOperator.LIKE,
                    EntityFunction.upper("%" + userLoginId + "%")));
            fieldsToSelect.add("userLoginId");
        }

        // ----
        // PartyGroup Fields
        // ----

        // filter on groupName
        if (UtilValidate.isNotEmpty(groupName)) {

            // modify the dynamic view
            dynamicView.addMemberEntity("PG", "PartyGroup");
            dynamicView.addAlias("PG", "groupName");
            dynamicView.addViewLink("PT", "PG", Boolean.FALSE, ModelKeyMap.makeKeyMapList("partyId"));

            // add the expr
            andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("groupName"), EntityOperator.LIKE,
                    EntityFunction.upper("%" + groupName + "%")));
            fieldsToSelect.add("groupName");
        }

        // ----
        // Person Fields
        // ----

        // modify the dynamic view
        if (UtilValidate.isNotEmpty(firstName) || UtilValidate.isNotEmpty(lastName)) {
            dynamicView.addMemberEntity("PE", "Person");
            dynamicView.addAlias("PE", "firstName");
            dynamicView.addAlias("PE", "lastName");
            dynamicView.addViewLink("PT", "PE", Boolean.FALSE, ModelKeyMap.makeKeyMapList("partyId"));

            fieldsToSelect.add("firstName");
            fieldsToSelect.add("lastName");
            orderBy.add("lastName");
            orderBy.add("firstName");
        }

        // filter on firstName
        if (UtilValidate.isNotEmpty(firstName)) {
            andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("firstName"), EntityOperator.LIKE,
                    EntityFunction.upper("%" + firstName + "%")));
        }

        // filter on lastName
        if (UtilValidate.isNotEmpty(lastName)) {
            andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("lastName"), EntityOperator.LIKE,
                    EntityFunction.upper("%" + lastName + "%")));
        }

        // ----
        // RoleType Fields
        // ----

        // filter on role member
        if (UtilValidate.isNotEmpty(roleTypeId)) {

            // add role to view
            dynamicView.addMemberEntity("PR", "PartyRole");
            dynamicView.addAlias("PR", "roleTypeId");
            dynamicView.addViewLink("PT", "PR", Boolean.FALSE, ModelKeyMap.makeKeyMapList("partyId"));

            // add the expr
            andExprs.add(EntityCondition.makeCondition("roleTypeId", roleTypeId));
            fieldsToSelect.add("roleTypeId");
        }

        // ----
        // PartyClassificationGroup Fields
        // ----

        List<String> partyClassificationGroupIds = UtilGenerics.cast(context.get("partyClassificationGroupId"));
        if (UtilValidate.isNotEmpty(partyClassificationGroupIds)) {
            // add PartyClassification to view
            dynamicView.addMemberEntity("PC", "PartyClassification");
            dynamicView.addAlias("PC", "partyClassificationGroupId");
            dynamicView.addViewLink("PT", "PC", Boolean.FALSE, ModelKeyMap.makeKeyMapList("partyId"));

            // add the expr
            andExprs.add(EntityCondition.makeCondition("partyClassificationGroupId", EntityOperator.IN, partyClassificationGroupIds));
            fieldsToSelect.add("partyClassificationGroupId");
        }

        // ----
        // PartyIdentification Fields
        // ----

        String idValue = (String) context.get("idValue");
        String partyIdentificationTypeId = (String) context.get("partyIdentificationTypeId");
        if ("I".equals(extInfo) || UtilValidate.isNotEmpty(idValue) || UtilValidate.isNotEmpty(partyIdentificationTypeId)) {
            // add role to view
            dynamicView.addMemberEntity("PAI", "PartyIdentification");
            dynamicView.addAlias("PAI", "idValue");
            dynamicView.addAlias("PAI", "partyIdentificationTypeId");
            dynamicView.addViewLink("PT", "PAI", Boolean.FALSE, ModelKeyMap.makeKeyMapList("partyId"));
            fieldsToSelect.add("idValue");
            fieldsToSelect.add("partyIdentificationTypeId");
            if (UtilValidate.isNotEmpty(idValue)) {
                andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("idValue"), EntityOperator.LIKE,
                        EntityFunction.upper("%".concat(idValue).concat("%"))));
            }
            if (UtilValidate.isNotEmpty(partyIdentificationTypeId)) {
                andExprs.add(EntityCondition.makeCondition("partyIdentificationTypeId", partyIdentificationTypeId));
            }
        }

        // ----
        // InventoryItem Fields
        // ----

        // filter on inventory item's fields
        String inventoryItemId = (String) context.get("inventoryItemId");
        String serialNumber = (String) context.get("serialNumber");
        String softIdentifier = (String) context.get("softIdentifier");
        if (UtilValidate.isNotEmpty(inventoryItemId)
                || UtilValidate.isNotEmpty(serialNumber)
                || UtilValidate.isNotEmpty(softIdentifier)) {

            // add role to view
            dynamicView.addMemberEntity("II", "InventoryItem");
            dynamicView.addAlias("II", "ownerPartyId");
            dynamicView.addViewLink("PT", "II", Boolean.FALSE, ModelKeyMap.makeKeyMapList("partyId", "ownerPartyId"));
        }
        if (UtilValidate.isNotEmpty(inventoryItemId)) {
            dynamicView.addAlias("II", "inventoryItemId");
            // add the expr
            andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("inventoryItemId"), EntityOperator.LIKE,
                    EntityFunction.upper("%" + inventoryItemId + "%")));
            fieldsToSelect.add("inventoryItemId");
        }
        if (UtilValidate.isNotEmpty(serialNumber)) {
            dynamicView.addAlias("II", "serialNumber");
            // add the expr
            andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("serialNumber"), EntityOperator.LIKE,
                    EntityFunction.upper("%" + serialNumber + "%")));
            fieldsToSelect.add("serialNumber");
        }
        if (UtilValidate.isNotEmpty(softIdentifier)) {
            dynamicView.addAlias("II", "softIdentifier");
            // add the expr
            andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("softIdentifier"), EntityOperator.LIKE,
                    EntityFunction.upper("%" + softIdentifier + "%")));
            fieldsToSelect.add("softIdentifier");
        }

        // ----
        // PostalAddress fields
        // ----
        String stateProvinceGeoId = (String) context.get("stateProvinceGeoId");
        if ("P".equals(extInfo)
                || UtilValidate.isNotEmpty(context.get("address1")) || UtilValidate.isNotEmpty(context.get("address2"))
                || UtilValidate.isNotEmpty(context.get("city")) || UtilValidate.isNotEmpty(context.get("postalCode"))
                || UtilValidate.isNotEmpty(context.get("countryGeoId")) || (UtilValidate.isNotEmpty(stateProvinceGeoId))) {
            // add address to dynamic view
            dynamicView.addMemberEntity("PC", "PartyContactMech");
            dynamicView.addMemberEntity("PA", "PostalAddress");
            dynamicView.addAlias("PC", "contactMechId");
            dynamicView.addAlias("PA", "address1");
            dynamicView.addAlias("PA", "address2");
            dynamicView.addAlias("PA", "city");
            dynamicView.addAlias("PA", "stateProvinceGeoId");
            dynamicView.addAlias("PA", "countryGeoId");
            dynamicView.addAlias("PA", "postalCode");
            dynamicView.addViewLink("PT", "PC", Boolean.FALSE, ModelKeyMap.makeKeyMapList("partyId"));
            dynamicView.addViewLink("PC", "PA", Boolean.FALSE, ModelKeyMap.makeKeyMapList("contactMechId"));

            // filter on address1
            String address1 = (String) context.get("address1");
            if (UtilValidate.isNotEmpty(address1)) {
                andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("address1"), EntityOperator.LIKE,
                        EntityFunction.upper("%" + address1 + "%")));
            }

            // filter on address2
            String address2 = (String) context.get("address2");
            if (UtilValidate.isNotEmpty(address2)) {
                andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("address2"), EntityOperator.LIKE,
                        EntityFunction.upper("%" + address2 + "%")));
            }

            // filter on city
            String city = (String) context.get("city");
            if (UtilValidate.isNotEmpty(city)) {
                andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("city"), EntityOperator.LIKE,
                        EntityFunction.upper("%" + city + "%")));
            }

            // filter on state geo
            if (UtilValidate.isNotEmpty(stateProvinceGeoId)) {
                andExprs.add(EntityCondition.makeCondition("stateProvinceGeoId", stateProvinceGeoId));
            }

            // filter on postal code
            String postalCode = (String) context.get("postalCode");
            if (UtilValidate.isNotEmpty(postalCode)) {
                andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("postalCode"), EntityOperator.LIKE,
                        EntityFunction.upper("%" + postalCode + "%")));
            }

            fieldsToSelect.add("postalCode");
            fieldsToSelect.add("city");
            fieldsToSelect.add("stateProvinceGeoId");
        }

        // ----
        // Generic CM Fields
        // ----
        if ("O".equals(extInfo) || UtilValidate.isNotEmpty(context.get("infoString"))) {
            // add info to dynamic view
            dynamicView.addMemberEntity("PC", "PartyContactMech");
            dynamicView.addMemberEntity("CM", "ContactMech");
            dynamicView.addAlias("PC", "contactMechId");
            dynamicView.addAlias("CM", "infoString");
            dynamicView.addViewLink("PT", "PC", Boolean.FALSE, ModelKeyMap.makeKeyMapList("partyId"));
            dynamicView.addViewLink("PC", "CM", Boolean.FALSE, ModelKeyMap.makeKeyMapList("contactMechId"));

            // filter on infoString
            String infoString = (String) context.get("infoString");
            if (UtilValidate.isNotEmpty(infoString)) {
                andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("infoString"), EntityOperator.LIKE,
                        EntityFunction.upper("%" + infoString + "%")));
                fieldsToSelect.add("infoString");
            }
        }

        // ----
        // TelecomNumber Fields
        // ----
        if ("T".equals(extInfo)
                || UtilValidate.isNotEmpty(context.get("countryCode"))
                || UtilValidate.isNotEmpty(context.get("areaCode"))
                || UtilValidate.isNotEmpty(context.get("contactNumber"))) {
            // add telecom to dynamic view
            dynamicView.addMemberEntity("PC", "PartyContactMech");
            dynamicView.addMemberEntity("TM", "TelecomNumber");
            dynamicView.addAlias("PC", "contactMechId");
            dynamicView.addAlias("TM", "countryCode");
            dynamicView.addAlias("TM", "areaCode");
            dynamicView.addAlias("TM", "contactNumber");
            dynamicView.addViewLink("PT", "PC", Boolean.FALSE, ModelKeyMap.makeKeyMapList("partyId"));
            dynamicView.addViewLink("PC", "TM", Boolean.FALSE, ModelKeyMap.makeKeyMapList("contactMechId"));

            // filter on countryCode
            String countryCode = (String) context.get("countryCode");
            if (UtilValidate.isNotEmpty(countryCode)) {
                andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("countryCode"),
                        EntityOperator.EQUALS, EntityFunction.upper(countryCode)));
            }

            // filter on areaCode
            String areaCode = (String) context.get("areaCode");
            if (UtilValidate.isNotEmpty(areaCode)) {
                andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("areaCode"),
                        EntityOperator.EQUALS, EntityFunction.upper(areaCode)));
            }

            // filter on contact number
            String contactNumber = (String) context.get("contactNumber");
            if (UtilValidate.isNotEmpty(contactNumber)) {
                andExprs.add(EntityCondition.makeCondition(EntityFunction.upperField("contactNumber"),
                        EntityOperator.EQUALS, EntityFunction.upper(contactNumber)));
            }
            fieldsToSelect.add("contactNumber");
            fieldsToSelect.add("areaCode");
        }
        // ---- End of Dynamic View Creation

        // build the main condition, add the extend condition is it present
        if (UtilValidate.isNotEmpty(extCond)) {
            andExprs.add(extCond);
        }
        if (UtilValidate.isNotEmpty(andExprs)) {
            mainCond = EntityCondition.makeCondition(andExprs, EntityOperator.AND);
        }
        if (Debug.infoOn()) {
            Debug.logInfo("In findParty mainCond=" + mainCond, MODULE);
        }

        // do the lookup
        if (UtilValidate.isNotEmpty(noConditionFind) && ("Y".equals(noConditionFind) || andExprs.size() > 1)) {
            //exclude on condition the status expr
            try {
                // set distinct on so we only get one row per party
                // using list iterator
                listIt = EntityQuery.use(delegator).select(UtilMisc.toSet(fieldsToSelect))
                        .from(dynamicView)
                        .where(mainCond)
                        .orderBy(orderBy)
                        .cursorScrollInsensitive()
                        .distinct()
                        .queryIterator();
            } catch (GenericEntityException e) {
                String errMsg = "Failure in party find operation, rolling back transaction: " + e.toString();
                Debug.logError(e, errMsg, MODULE);
                return ServiceUtil.returnError(UtilProperties.getMessage(RESOURCE,
                        "PartyLookupPartyError",
                        UtilMisc.toMap("errMessage", e.toString()), locale));
            }
        }
        result.put("listIt", listIt);
        return result;
    }