public static function updateMap(EntityConversionMap $map)
 {
     //Synchonize dynamic bindings only
     $srcEntitTypeID = $map->getSourceEntityTypeID();
     $dstEntitTypeID = $map->getDestinationEntityTypeID();
     $outdatedItems = array();
     foreach ($map->getItems() as $item) {
         $srcFieldID = $item->getSourceField();
         $dstFieldID = $item->getDestinationField();
         if ($dstFieldID === '') {
             $dstFieldID = $srcFieldID;
         }
         $isDynamicSrc = EntityConversionMapItem::isDynamicField($srcFieldID);
         $isDynamicDst = EntityConversionMapItem::isDynamicField($dstFieldID);
         $srcField = $isDynamicSrc ? self::getUserField($srcEntitTypeID, $srcFieldID) : null;
         $dstField = $isDynamicDst ? self::getUserField($dstEntitTypeID, $dstFieldID) : null;
         if ($isDynamicSrc && $srcField === null || $isDynamicDst && $dstField === null) {
             $outdatedItems[] = $item;
             continue;
         } elseif ($isDynamicSrc && $srcField !== null && $isDynamicDst && $dstField !== null && !$item->isLocked()) {
             $srcCode = UserFieldSynchronizer::getFieldComplianceCode($srcField);
             $dstCode = UserFieldSynchronizer::getFieldComplianceCode($dstField);
             if ($srcCode !== $dstCode) {
                 $outdatedItems[] = $item;
                 continue;
             }
         }
     }
     if (!empty($outdatedItems)) {
         foreach ($outdatedItems as $item) {
             $map->removeItem($item);
         }
     }
     $intersections = UserFieldSynchronizer::getIntersection($srcEntitTypeID, $dstEntitTypeID);
     foreach ($intersections as $intersection) {
         $srcFieldID = $intersection['SRC_FIELD_NAME'];
         $dstFieldID = $intersection['DST_FIELD_NAME'];
         if ($map->findItemBySourceID($srcFieldID) === null) {
             $map->createItem($srcFieldID, $dstFieldID);
         }
     }
 }
 /**
  * Create conversion map for destination entity type
  * @static
  * @param int $entityTypeID Destination Entity Type ID
  * @return EntityConversionMap
  */
 public static function createMap($entityTypeID)
 {
     if (!is_int($entityTypeID)) {
         $entityTypeID = (int) $entityTypeID;
     }
     if (!\CCrmOwnerType::IsDefined($entityTypeID)) {
         throw new Main\ArgumentOutOfRangeException('dstEntityTypeID', \CCrmOwnerType::FirstOwnerType, \CCrmOwnerType::LastOwnerType);
     }
     if ($entityTypeID !== \CCrmOwnerType::Invoice && $entityTypeID !== \CCrmOwnerType::Quote) {
         $dstEntityTypeName = \CCrmOwnerType::ResolveName($entityTypeID);
         throw new Main\NotSupportedException("Entity type: '{$dstEntityTypeName}' is not supported in current context");
     }
     $map = new EntityConversionMap(\CCrmOwnerType::Deal, $entityTypeID);
     if ($entityTypeID === \CCrmOwnerType::Invoice) {
         //region Invoice Map Static Field Bindings
         $map->createItem('TITLE', 'ORDER_TOPIC');
         $map->createItem('COMPANY_ID', 'UF_COMPANY_ID');
         $map->createItem('CONTACT_ID', 'UF_CONTACT_ID');
         $map->createItem('ASSIGNED_BY_ID', 'RESPONSIBLE_ID');
         $map->createItem('COMMENTS');
         $map->createItem('PRODUCT_ROWS');
         //endregion
         //region Invoice Map User Field Bindings
         $intersections = UserFieldSynchronizer::getIntersection(\CCrmOwnerType::Deal, \CCrmOwnerType::Invoice);
         foreach ($intersections as $intersection) {
             $map->createItem($intersection['SRC_FIELD_NAME'], $intersection['DST_FIELD_NAME']);
         }
         //endregion
     } elseif ($entityTypeID === \CCrmOwnerType::Quote) {
         //region Quote Map Static Field Bindings
         $map->createItem('TITLE');
         $map->createItem('COMMENTS');
         $map->createItem('ASSIGNED_BY_ID');
         $map->createItem('OPENED');
         $map->createItem('OPPORTUNITY');
         $map->createItem('CURRENCY_ID');
         $map->createItem('TAX_VALUE');
         $map->createItem('EXCH_RATE');
         $map->createItem('LOCATION_ID');
         $map->createItem('LEAD_ID');
         $map->createItem('COMPANY_ID');
         $map->createItem('CONTACT_ID');
         $map->createItem('PRODUCT_ROWS');
         //endregion
         //region Invoice Map User Field Bindings
         $intersections = UserFieldSynchronizer::getIntersection(\CCrmOwnerType::Deal, \CCrmOwnerType::Quote);
         foreach ($intersections as $intersection) {
             $map->createItem($intersection['SRC_FIELD_NAME'], $intersection['DST_FIELD_NAME']);
         }
         //endregion
     }
     return $map;
 }
 /**
  * Create conversion map for destination entity type
  * @static
  * @param int $entityTypeID Destination Entity Type ID
  * @return EntityConversionMap
  */
 public static function createMap($entityTypeID)
 {
     if (!is_int($entityTypeID)) {
         $entityTypeID = (int) $entityTypeID;
     }
     if (!\CCrmOwnerType::IsDefined($entityTypeID)) {
         throw new Main\ArgumentOutOfRangeException('dstEntityTypeID', \CCrmOwnerType::FirstOwnerType, \CCrmOwnerType::LastOwnerType);
     }
     if ($entityTypeID !== \CCrmOwnerType::Contact && $entityTypeID !== \CCrmOwnerType::Company && $entityTypeID !== \CCrmOwnerType::Deal) {
         $dstEntityTypeName = \CCrmOwnerType::ResolveName($entityTypeID);
         throw new Main\NotSupportedException("Entity type: '{$dstEntityTypeName}' is not supported in current context");
     }
     $map = new EntityConversionMap(\CCrmOwnerType::Lead, $entityTypeID);
     if ($entityTypeID === \CCrmOwnerType::Contact) {
         //region Contact Map Static Field Bindings
         $map->createItem('HONORIFIC');
         $map->createItem('NAME');
         $map->createItem('SECOND_NAME');
         $map->createItem('LAST_NAME');
         $map->createItem('BIRTHDATE');
         $map->createItem('POST');
         $map->createItem('COMMENTS');
         $map->createItem('OPENED');
         $map->createItem('SOURCE_ID');
         $map->createItem('SOURCE_DESCRIPTION');
         $map->createItem('ADDRESS');
         $map->createItem('ADDRESS_2');
         $map->createItem('ADDRESS_CITY');
         $map->createItem('ADDRESS_POSTAL_CODE');
         $map->createItem('ADDRESS_REGION');
         $map->createItem('ADDRESS_PROVINCE');
         $map->createItem('ADDRESS_COUNTRY');
         $map->createItem('ADDRESS_COUNTRY_CODE');
         $map->createItem('PHONE');
         $map->createItem('EMAIL');
         $map->createItem('WEB');
         $map->createItem('IM');
         $map->createItem('ASSIGNED_BY_ID');
         $map->createItem('ORIGINATOR_ID');
         $map->createItem('ORIGIN_ID');
         //endregion
         //region Contact Map User Field Bindings
         $intersections = UserFieldSynchronizer::getIntersection(\CCrmOwnerType::Lead, \CCrmOwnerType::Contact);
         foreach ($intersections as $intersection) {
             $map->createItem($intersection['SRC_FIELD_NAME'], $intersection['DST_FIELD_NAME']);
         }
         //endregion
     } elseif ($entityTypeID === \CCrmOwnerType::Company) {
         //region Company Map Static Field Bindings
         //$map->createItem('COMPANY_TITLE', 'TITLE', array('ALT_SRC_FIELD_IDS' => array('TITLE')));
         $map->createItem('TITLE');
         $map->createItem('COMMENTS');
         $map->createItem('OPENED');
         $map->createItem('ADDRESS');
         $map->createItem('ADDRESS_2');
         $map->createItem('ADDRESS_CITY');
         $map->createItem('ADDRESS_POSTAL_CODE');
         $map->createItem('ADDRESS_REGION');
         $map->createItem('ADDRESS_PROVINCE');
         $map->createItem('ADDRESS_COUNTRY');
         $map->createItem('ADDRESS_COUNTRY_CODE');
         $map->createItem('PHONE');
         $map->createItem('EMAIL');
         $map->createItem('WEB');
         $map->createItem('IM');
         $map->createItem('ASSIGNED_BY_ID');
         $map->createItem('ORIGINATOR_ID');
         $map->createItem('ORIGIN_ID');
         //endregion
         //region Company Map User Field Bindings
         $intersections = UserFieldSynchronizer::getIntersection(\CCrmOwnerType::Lead, \CCrmOwnerType::Company);
         foreach ($intersections as $intersection) {
             $map->createItem($intersection['SRC_FIELD_NAME'], $intersection['DST_FIELD_NAME']);
         }
         //endregion
     } elseif ($entityTypeID === \CCrmOwnerType::Deal) {
         //region Deal Map Static Field Bindings
         $map->createItem('TITLE');
         $map->createItem('OPPORTUNITY');
         $map->createItem('CURRENCY_ID');
         $map->createItem('COMMENTS');
         $map->createItem('OPENED');
         $map->createItem('ADDRESS');
         $map->createItem('ADDRESS_2');
         $map->createItem('ADDRESS_CITY');
         $map->createItem('ADDRESS_POSTAL_CODE');
         $map->createItem('ADDRESS_REGION');
         $map->createItem('ADDRESS_PROVINCE');
         $map->createItem('ADDRESS_COUNTRY');
         $map->createItem('ADDRESS_COUNTRY_CODE');
         $map->createItem('PRODUCT_ROWS');
         $map->createItem('ASSIGNED_BY_ID');
         $map->createItem('ORIGINATOR_ID');
         $map->createItem('ORIGIN_ID');
         //endregion
         //region Deal Map User Field Bindings
         $intersections = UserFieldSynchronizer::getIntersection(\CCrmOwnerType::Lead, \CCrmOwnerType::Deal);
         foreach ($intersections as $intersection) {
             $map->createItem($intersection['SRC_FIELD_NAME'], $intersection['DST_FIELD_NAME']);
         }
         //endregion
     }
     return $map;
 }