/** * @param string $parentName - parent identifier * @param string $translationSource * @param array $data - GROUP => () * @return bool - true on success or false on failure * @throws SystemException */ static function install($parentName, $translationSource, array $data) { $error = false; // load person types $persons = array(); $result = PersonTypeTable::getList(array('select' => array('ID'))); while ($row = $result->fetch()) { $persons[$row['ID']] = true; } // load person domains $personsDomains = array(); $result = BusinessValuePersonDomainTable::getList(array('select' => array('PERSON_TYPE_ID', 'DOMAIN'))); while ($row = $result->fetch()) { $personsDomains[$row['PERSON_TYPE_ID']] = $row['DOMAIN']; } // install person domains if (is_array($data['PERSON_DOMAIN'])) { foreach ($data['PERSON_DOMAIN'] as $personId => $domain) { if (!$persons[$personId]) { throw new SystemException("invalid person type `{$personId}`", 0, __FILE__, __LINE__); } switch ($domain) { case self::COMMON_DOMAIN: case self::INDIVIDUAL_DOMAIN: case self::ENTITY_DOMAIN: break; default: throw new SystemException("invalid domain: {$domain}", 0, __FILE__, __LINE__); } if (!$personsDomains[$personId]) { if (BusinessValuePersonDomainTable::add(array('PERSON_TYPE_ID' => $personId, 'DOMAIN' => $domain))->isSuccess()) { $personsDomains[$personId] = $domain; } else { $error = true; } } } } $personsDomainsWithCommon = array(self::COMMON_PERSON_ID => self::COMMON_DOMAIN) + $personsDomains; // load groups $groups = array(); $result = BusinessValueGroupTable::getList(array('select' => array('NAME', 'ID'))); while ($row = $result->fetch()) { $groups[$row['NAME']] = $row['ID']; } // install new groups if (is_array($data['GROUPS'])) { foreach ($data['GROUPS'] as $groupName => $group) { if (!$groups[$groupName]) { if (!is_string($groupName)) { throw new SystemException("invalid group name", 0, __FILE__, __LINE__); } if (!is_array($group)) { throw new SystemException("invalid group", 0, __FILE__, __LINE__); } $result = BusinessValueGroupTable::add(array('NAME' => $groupName, 'SORT' => $group['SORT'])); if ($result->isSuccess()) { $groups[$groupName] = $result->getId(); } else { $error = true; } } } } // install codes if (is_array($data['CODES'])) { // get parent id, install parent if not exists if ($row = BusinessValueParentTable::getList(array('select' => array('ID'), 'filter' => array('=NAME' => $parentName)))->fetch()) { $parentId = $row['ID']; } else { $result = BusinessValueParentTable::add(array('NAME' => $parentName, 'LANG_SRC' => $translationSource)); if ($result->isSuccess()) { $parentId = $result->getId(); } else { return false; } } // load codes $codes = array(); $result = BusinessValueCodeTable::getList(array('select' => array('ID', 'NAME'))); while ($row = $result->fetch()) { $codes[$row['NAME']] = $row['ID']; } // load value maps $valueMaps = array(); $result = BusinessValueTable::getList(array('select' => array('CODE_ID', 'PERSON_TYPE_ID'))); while ($row = $result->fetch()) { $valueMaps[$row['CODE_ID']][$row['PERSON_TYPE_ID']] = true; } // load parent codes $parentCodes = array(); $result = BusinessValueCodeParentTable::getList(array('select' => array('CODE_ID'), 'filter' => array('=PARENT_ID' => $parentId))); while ($row = $result->fetch()) { $parentCodes[$row['CODE_ID']] = true; } // install: groups, codes, parent codes foreach ($data['CODES'] as $codeName => $code) { if (!is_string($codeName)) { throw new SystemException("invalid code name", 0, __FILE__, __LINE__); } if (!is_array($code)) { throw new SystemException("invalid code", 0, __FILE__, __LINE__); } // get group id, install group if not exists $groupId = null; if (($groupName = $code['GROUP']) && !($groupId = $groups[$groupName])) { $result = BusinessValueGroupTable::add(array('NAME' => $groupName)); if ($result->isSuccess()) { $groups[$groupName] = $groupId = $result->getId(); } else { $error = true; } } // get code domain switch ($domain = $code['DOMAIN']) { case self::COMMON_DOMAIN: case self::INDIVIDUAL_DOMAIN: case self::ENTITY_DOMAIN: break; default: throw new SystemException("invalid domain: {$domain}", 0, __FILE__, __LINE__); } // get code id, install code if not exists if (!($codeId = $codes[$codeName])) { $result = BusinessValueCodeTable::add(array('NAME' => $codeName, 'DOMAIN' => $domain, 'GROUP_ID' => $groupId, 'SORT' => $code['SORT'])); if ($result->isSuccess()) { $codeId = $result->getId(); $codes[$codeName] = $codeId; } else { $error = true; continue; } } // install value maps if not exist if (is_array($code['MAP'])) { foreach ($code['MAP'] as $personId => $map) { if (!is_array($map) || count($map) != 2) { throw new SystemException("invalid map: " . print_r($map, true), 0, __FILE__, __LINE__); } if ($domain === self::COMMON_DOMAIN) { if (!$personsDomainsWithCommon[$personId]) { throw new SystemException("invalid person type id `{$personId}`", 0, __FILE__, __LINE__); } } else { if ($domain !== $personsDomains[$personId]) { throw new SystemException("invalid person type id `{$personId}`", 0, __FILE__, __LINE__); } } if (!isset($valueMaps[$codeId][$personId])) { if (BusinessValueTable::add(array('PERSON_TYPE_ID' => $personId, 'CODE_ID' => $codeId, 'ENTITY' => $map[0], 'ITEM' => $map[1]))->isSuccess()) { $valueMaps[$codeId][$personId] = true; } else { $error = true; } } } } // install code parent if not exists if (!$parentCodes[$codeId]) { if (BusinessValueCodeParentTable::add(array('CODE_ID' => $codeId, 'PARENT_ID' => $parentId))->isSuccess()) { $parentCodes[$codeId] = true; } else { $error = true; } } } } return !$error; }
} } unset($code, $codeParent, $codeMap); // LOAD ORDER PROPERTIES /////////////////////////////////////////////////////////////////////////////////////////////// $propertyOptions = array(); $result = OrderPropsTable::getList(array('select' => array('ID', 'NAME', 'PERSON_TYPE_ID'), 'filter' => array('=PERSON_TYPE_ID' => array_keys($personsDomains)), 'order' => array('PERSON_TYPE_ID', 'SORT'))); while ($row = $result->fetch()) { $propertyOptions[$row['PERSON_TYPE_ID']][$row['ID']] = $row['NAME']; } $propertyOptionsByName = array(); foreach ($propertyOptions as $personId => $options) { $propertyOptionsByName[$persons[$personId]] = $options; } // INPUTS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// $codeInputOptions = array('' => Loc::getMessage('BIZVAL_PAGE_FILTER_ALL'), Loc::getMessage('BIZVAL_DOMAIN_COMMON') => array(), Loc::getMessage('BIZVAL_DOMAIN_INDIVIDUAL') => array(), Loc::getMessage('BIZVAL_DOMAIN_ENTITY') => array()); $result = BusinessValueCodeTable::getList(array('select' => array('ID', 'NAME', 'DOMAIN'))); while ($row = $result->fetch()) { $codeName = $row['NAME']; if ($message = Loc::getMessage("BIZVAL_CODE_{$codeName}")) { $codeName = $message; } $codeInputOptions[$domains[$row['DOMAIN']]][$row['ID']] = $codeName; } $codeInput = array('TYPE' => 'ENUM', 'OPTIONS' => $codeInputOptions); // other $parentInput = array('TYPE' => 'ENUM', 'OPTIONS' => array('' => Loc::getMessage('BIZVAL_PAGE_FILTER_ALL')) + $parents); $personEntityInput = array('TYPE' => 'ENUM', 'OPTIONS' => array('VALUE' => Loc::getMessage('BIZVAL_ENTITY_OTHER'), 'USER' => Loc::getMessage('BIZVAL_ENTITY_USER'), 'ORDER' => Loc::getMessage('BIZVAL_ENTITY_ORDER'), 'PROPERTY' => Loc::getMessage('BIZVAL_ENTITY_PROPERTY'), 'PAYMENT' => Loc::getMessage('BIZVAL_ENTITY_PAYMENT'), 'SHIPMENT' => Loc::getMessage('BIZVAL_ENTITY_SHIPMENT'), 'COMPANY' => Loc::getMessage('BIZVAL_ENTITY_COMPANY'))); $commonEntityInput = $personEntityInput; unset($commonEntityInput['OPTIONS']['PROPERTY']); $itemInputs = array('' => array('TYPE' => 'STRING', 'DISABLED' => 'Y', 'VALUE' => Loc::getMessage('BIZVAL_PAGE_FILTER_ALL')), 'VALUE' => array('TYPE' => 'STRING', 'MAXLENGTH' => 255), 'USER' => array('TYPE' => 'ENUM', 'OPTIONS' => array(Loc::getMessage('BIZVAL_GROUP_CLIENT') => array('ID' => Loc::getMessage('BIZVAL_CODE_CLIENT_USER_ID'), 'LOGIN' => Loc::getMessage('BIZVAL_CODE_CLIENT_USER_LOGIN'), 'NAME' => Loc::getMessage('BIZVAL_CODE_CLIENT_FIRST_NAME'), 'SECOND_NAME' => Loc::getMessage('BIZVAL_CODE_CLIENT_SECOND_NAME'), 'LAST_NAME' => Loc::getMessage('BIZVAL_CODE_CLIENT_LAST_NAME'), 'EMAIL' => Loc::getMessage('BIZVAL_CODE_CLIENT_EMAIL'), 'LID' => Loc::getMessage('BIZVAL_CODE_CLIENT_USER_SITE_ID'), 'PERSONAL_PROFESSION' => Loc::getMessage('BIZVAL_CODE_CLIENT_PROFESSION'), 'PERSONAL_WWW' => Loc::getMessage('BIZVAL_CODE_CLIENT_WEBSITE'), 'PERSONAL_ICQ' => Loc::getMessage('BIZVAL_CODE_CLIENT_ICQ'), 'PERSONAL_GENDER' => Loc::getMessage('BIZVAL_CODE_CLIENT_SEX'), 'PERSONAL_FAX' => Loc::getMessage('BIZVAL_CODE_CLIENT_FAX'), 'PERSONAL_MOBILE' => Loc::getMessage('BIZVAL_CODE_CLIENT_PHONE'), 'PERSONAL_STREET' => Loc::getMessage('BIZVAL_CODE_CLIENT_ADDRESS'), 'PERSONAL_MAILBOX' => Loc::getMessage('BIZVAL_CODE_CLIENT_POSTAL_ADDRESS'), 'PERSONAL_CITY' => Loc::getMessage('BIZVAL_CODE_CLIENT_CITY'), 'PERSONAL_STATE' => Loc::getMessage('BIZVAL_CODE_CLIENT_REGION'), 'PERSONAL_ZIP' => Loc::getMessage('BIZVAL_CODE_CLIENT_ZIP'), 'PERSONAL_COUNTRY' => Loc::getMessage('BIZVAL_CODE_CLIENT_COUNTRY')), Loc::getMessage('BIZVAL_GROUP_CLIENT_COMPANY') => array('WORK_COMPANY' => Loc::getMessage('BIZVAL_CODE_CLIENT_COMPANY_NAME'), 'WORK_DEPARTMENT' => Loc::getMessage('BIZVAL_CODE_CLIENT_COMPANY_DEPARTMENT'), 'WORK_POSITION' => Loc::getMessage('BIZVAL_CODE_CLIENT_COMPANY_POSITION'), 'WORK_WWW' => Loc::getMessage('BIZVAL_CODE_CLIENT_COMPANY_WEBSITE'), 'WORK_PHONE' => Loc::getMessage('BIZVAL_CODE_CLIENT_COMPANY_PHONE'), 'WORK_FAX' => Loc::getMessage('BIZVAL_CODE_CLIENT_COMPANY_FAX'), 'WORK_STREET' => Loc::getMessage('BIZVAL_CODE_CLIENT_COMPANY_ADDRESS'), 'WORK_MAILBOX' => Loc::getMessage('BIZVAL_CODE_CLIENT_COMPANY_POSTAL_ADDRESS'), 'WORK_CITY' => Loc::getMessage('BIZVAL_CODE_CLIENT_COMPANY_CITY'), 'WORK_STATE' => Loc::getMessage('BIZVAL_CODE_CLIENT_COMPANY_REGION'), 'WORK_ZIP' => Loc::getMessage('BIZVAL_CODE_CLIENT_COMPANY_ZIP'), 'WORK_COUNTRY' => Loc::getMessage('BIZVAL_CODE_CLIENT_COMPANY_COUNTRY')))), 'ORDER' => array('TYPE' => 'ENUM', 'OPTIONS' => array('ID' => Loc::getMessage('BIZVAL_CODE_ORDER_ID'), 'ACCOUNT_NUMBER' => Loc::getMessage('BIZVAL_CODE_ORDER_NUMBER'), 'DATE_INSERT' => Loc::getMessage('BIZVAL_CODE_ORDER_DATETIME'), 'DATE_INSERT_DATE' => Loc::getMessage('BIZVAL_CODE_ORDER_DATE'), 'DATE_PAY_BEFORE' => Loc::getMessage('BIZVAL_CODE_ORDER_PAY_BEFORE'), 'SHOULD_PAY' => Loc::getMessage('BIZVAL_CODE_ORDER_PRICE'), 'CURRENCY' => Loc::getMessage('BIZVAL_CODE_ORDER_CURRENCY'), 'PRICE' => Loc::getMessage('BIZVAL_CODE_ORDER_SUM'), 'LID' => Loc::getMessage('BIZVAL_CODE_ORDER_SITE_ID'), 'PRICE_DELIVERY' => Loc::getMessage('BIZVAL_CODE_ORDER_PRICE_DELIV'), 'DISCOUNT_VALUE' => Loc::getMessage('BIZVAL_CODE_ORDER_DESCOUNT'), 'USER_ID' => Loc::getMessage('BIZVAL_CODE_ORDER_USER_ID'), 'PAY_SYSTEM_ID' => Loc::getMessage('BIZVAL_CODE_ORDER_PAY_SYSTEM_ID'), 'DELIVERY_ID' => Loc::getMessage('BIZVAL_CODE_ORDER_DELIVERY_ID'), 'TAX_VALUE' => Loc::getMessage('BIZVAL_CODE_ORDER_TAX'))), 'PROPERTY' => array('TYPE' => 'ENUM'), 'PAYMENT' => array('TYPE' => 'ENUM', 'OPTIONS' => array('ID' => Loc::getMessage('BIZVAL_CODE_PAYMENT_ID'), 'PAID' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAID'), 'DATE_PAID' => Loc::getMessage('BIZVAL_CODE_PAYMENT_DATE_PAID'), 'EMP_PAID_ID' => Loc::getMessage('BIZVAL_CODE_PAYMENT_EMP_PAID_ID'), 'PAY_SYSTEM_ID' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_SYSTEM_ID'), 'PS_STATUS' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PS_STATUS'), 'PS_STATUS_CODE' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PS_STATUS_CODE'), 'PS_STATUS_DESCRIPTION' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PS_STATUS_DESCRIPTION'), 'PS_STATUS_MESSAGE' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PS_STATUS_MESSAGE'), 'PS_SUM' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PS_SUM'), 'PS_CURRENCY' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PS_CURRENCY'), 'PS_RESPONSE_DATE' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PS_RESPONSE_DATE'), 'PAY_VOUCHER_NUM' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_VOUCHER_NUM'), 'PAY_VOUCHER_DATE' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_VOUCHER_DATE'), 'DATE_PAY_BEFORE' => Loc::getMessage('BIZVAL_CODE_PAYMENT_DATE_PAY_BEFORE'), 'DATE_BILL' => Loc::getMessage('BIZVAL_CODE_PAYMENT_DATE_BILL'), 'XML_ID' => Loc::getMessage('BIZVAL_CODE_PAYMENT_XML_ID'), 'SUM' => Loc::getMessage('BIZVAL_CODE_PAYMENT_SUM'), 'CURRENCY' => Loc::getMessage('BIZVAL_CODE_PAYMENT_CURRENCY'), 'PAY_SYSTEM_NAME' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_SYSTEM_NAME'), 'COMPANY_ID' => Loc::getMessage('BIZVAL_CODE_PAYMENT_COMPANY_ID'), 'PAY_RETURN_NUM' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_RETURN_NUM'), 'PAY_RETURN_DATE' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_RETURN_DATE'), 'PAY_RETURN_COMMENT' => Loc::getMessage('BIZVAL_CODE_PAYMENT_PAY_RETURN_COMMENT'), 'RESPONSIBLE_ID' => Loc::getMessage('BIZVAL_CODE_PAYMENT_RESPONSIBLE_ID'), 'EMP_RESPONSIBLE_ID' => Loc::getMessage('BIZVAL_CODE_PAYMENT_EMP_RESPONSIBLE_ID'), 'DATE_RESPONSIBLE_ID' => Loc::getMessage('BIZVAL_CODE_PAYMENT_DATE_RESPONSIBLE_ID'), 'COMPANY_BY' => Loc::getMessage('BIZVAL_CODE_PAYMENT_COMPANY_BY'))), 'SHIPMENT' => array('TYPE' => 'ENUM', 'OPTIONS' => array('STATUS_ID' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_STATUS_ID'), 'PRICE_DELIVERY' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_PRICE_DELIVERY'), 'ALLOW_DELIVERY' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_ALLOW_DELIVERY'), 'DATE_ALLOW_DELIVERY' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DATE_ALLOW_DELIVERY'), 'EMP_ALLOW_DELIVERY_ID' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_EMP_ALLOW_DELIVERY_ID'), 'DEDUCTED' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DEDUCTED'), 'DATE_DEDUCTED' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DATE_DEDUCTED'), 'EMP_DEDUCTED_ID' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_EMP_DEDUCTED_ID'), 'REASON_UNDO_DEDUCTED' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_REASON_UNDO_DEDUCTED'), 'DELIVERY_ID' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DELIVERY_ID'), 'DELIVERY_DOC_NUM' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DELIVERY_DOC_NUM'), 'DELIVERY_DOC_DATE' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DELIVERY_DOC_DATE'), 'TRACKING_NUMBER' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_TRACKING_NUMBER'), 'XML_ID' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_XML_ID'), 'PARAMETERS' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_PARAMETERS'), 'DELIVERY_NAME' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DELIVERY_NAME'), 'COMPANY_ID' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_COMPANY_ID'), 'MARKED' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_MARKED'), 'DATE_MARKED' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DATE_MARKED'), 'EMP_MARKED_ID' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_EMP_MARKED_ID'), 'REASON_MARKED' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_REASON_MARKED'), 'CANCELED' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_CANCELED'), 'DATE_CANCELED' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_DATE_CANCELED'), 'EMP_CANCELED_ID' => Loc::getMessage('BIZVAL_CODE_SHIPMENT_EMP_CANCELED_ID'))), 'COMPANY' => array('TYPE' => 'ENUM')); $companyOptions = array(Loc::getMessage('BIZVAL_GROUP_COMPANY_ENTITY') => array('ID' => Loc::getMessage('BIZVAL_CODE_COMPANY_ID'), 'NAME' => Loc::getMessage('BIZVAL_CODE_COMPANY_NAME'), 'LOCATION_ID' => Loc::getMessage('BIZVAL_CODE_COMPANY_LOCATION'), 'CODE' => 'CODE', 'XML_ID' => 'XML_ID', 'ACTIVE' => 'ACTIVE', 'DATE_CREATE' => 'DATE_CREATE', 'DATE_MODIFY' => 'DATE_MODIFY', 'CREATED_BY' => 'CREATED_BY', 'MODIFIED_BY' => 'MODIFIED_BY'));