F-RevoCRMの重複マージ処理について

エンジニアリングチームの杉本です。
F-RevoCRMの重複マージ処理についてご紹介します。

重複マージとは

F-RevoCRMには重複しているデータをマージする機能が備わっています。
重複マージの手順は以下となります。

一覧表示画面の操作メニューにて「重複の検出」をクリックするとマージ条件を設定する画面が表示されます。


「選択可能なフィールド」に任意の項目を設定することで、マージする条件を設定可能です。

設定した条件に従い、重複するデータの一覧が表示されます。
マージ選択にチェックを入れマージボタンを押下します。

マージするデータの中で、値を保持する方にチェックを入れ画面下にあるマージボタンを押下することでデータがマージされます。

関連情報をマージする際の処理について

関連情報をマージする際の処理はモジュール名.phpのtransferRelatedRecords関数内に記載されています。
※以下はAccounts.php内のコードです。

function transferRelatedRecords($module, $transferEntityIds, $entityId) {
	global $adb,$log;
	$log->debug("Entering function transferRelatedRecords ($module, $transferEntityIds, $entityId)");
	//モジュール名⇒テーブル名
	$rel_table_arr = Array(
		"Contacts"=>"vtiger_contactdetails",
		"Potentials"=>"vtiger_potential",
		"Quotes"=>"vtiger_quotes",
		"SalesOrder"=>"vtiger_salesorder",
		"Invoice"=>"vtiger_invoice",
		"Activities"=>"vtiger_seactivityrel",
		"Documents"=>"vtiger_senotesrel",
		"Attachments"=>"vtiger_seattachmentsrel",
		"HelpDesk"=>"vtiger_troubletickets",
		"Products"=>"vtiger_seproductsrel",
		"ServiceContracts"=>"vtiger_servicecontracts",
		"Campaigns"=>"vtiger_campaignaccountrel",
		"Assets"=>"vtiger_assets",
		"Project"=>"vtiger_project"
	);

	//テーブル名⇒table_index
	$tbl_field_arr = Array(
		"vtiger_contactdetails"=>"contactid",
		"vtiger_potential"=>"potentialid",
		"vtiger_quotes"=>"quoteid",
		"vtiger_salesorder"=>"salesorderid",
		"vtiger_invoice"=>"invoiceid",
		"vtiger_seactivityrel"=>"activityid",
		"vtiger_senotesrel"=>"notesid",
		"vtiger_seattachmentsrel"=>"attachmentsid",
		"vtiger_troubletickets"=>"ticketid",
		"vtiger_seproductsrel"=>"productid",
		"vtiger_servicecontracts"=>"servicecontractsid",
		"vtiger_campaignaccountrel"=>"campaignid",
		"vtiger_assets"=>"assetsid",
		"vtiger_project"=>"projectid",
		"vtiger_payments"=>"paymentsid"
	);

	//テーブル名⇒関連項目
	$entity_tbl_field_arr = Array(
		"vtiger_contactdetails"=>"accountid",
		"vtiger_potential"=>"related_to",
		"vtiger_quotes"=>"accountid",
		"vtiger_salesorder"=>"accountid",
		"vtiger_invoice"=>"accountid",
		"vtiger_seactivityrel"=>"crmid",
		"vtiger_senotesrel"=>"crmid",
		"vtiger_seattachmentsrel"=>"crmid",
		"vtiger_troubletickets"=>"parent_id",
		"vtiger_seproductsrel"=>"crmid",
		"vtiger_servicecontracts"=>"sc_related_to",
		"vtiger_campaignaccountrel"=>"accountid",
		"vtiger_assets"=>"account",
		"vtiger_project"=>"linktoaccountscontacts",
		"vtiger_payments"=>"relatedorganization"
	);

    foreach ($transferEntityIds as $transferId) {
        foreach ($rel_table_arr as $rel_module=>$rel_table) {
            $id_field = $tbl_field_arr[$rel_table];
            $entity_id_field = $entity_tbl_field_arr[$rel_table];
            // IN clause to avoid duplicate entries
            $sel_result =  $adb->pquery(
                "select $id_field from $rel_table where $entity_id_field=? " .
                    " and $id_field not in (select $id_field from $rel_table where $entity_id_field=?)",
                array($transferId,$entityId)
            );
            $res_cnt = $adb->num_rows($sel_result);
            if ($res_cnt > 0) {
                for ($i=0;$i<$res_cnt;$i++) {
                    $id_field_value = $adb->query_result($sel_result, $i, $id_field);
                    $adb->pquery(
                        "update $rel_table set $entity_id_field=? where $entity_id_field=? and $id_field=?",
                        array($entityId,$transferId,$id_field_value)
                    );
                }
            }
        }
    }

	parent::transferRelatedRecords($module, $transferEntityIds, $entityId);
	$log->debug("Exiting transferRelatedRecords...");
}

以下の変数にマージに必要な情報が記載されています。
$rel_table_arr・・・ モジュール名⇒テーブル名
$tbl_field_arr ・・・ テーブル名⇒table_index
$entity_tbl_field_arr ・・・ テーブル名⇒関連項目

こちらの変数をもとに重複マージ処理時に関連項目のマージを行います。

カスタマイズ時の注意点

カスタマイズにてモジュールを追加、又は関連項目を追加した場合は、transferRelatedRecords関数の実装・修正が必要となります。
こちらの関数を適切に実装していない場合は、重複マージ時に関連情報がマージされませんのでご注意ください。

重複マージは便利な機能ですので、是非活用してみてください。
それでは次回もまたThinkingReedエンジニアリングBlogをよろしくおねがいします!!

ご質問・お問い合わせはこちら

メールフォームへ