I recently had a request to allow multiple calls/meetings and emails to be linked to multiple Opportunities. The standard in SugarCRM is a 1 to many relationship between Opportunities and Emails/Meetings/Calls.
However, our Sales people might email the Account (a contact within the account) to discuss multiple Opportunities and want to report on this data. Maybe they only talk about 3 of the 5 opportunities etc. There is a myriad of reasons why this might be necessary.
Creating a many-to-many relationship for calls and meetings can be done in Studio, however this option isn’t there for Emails, so you have to define this relationship yourself. To do this you are going to need to create the following files:
custom/Extension/application/Ext/TableDictionary/opportunities_emails_1.php
custom/Extension/modules/Emails/Ext/Language/en_UK.customopportunities_emails_1.php
custom/Extension/modules/Emails/Ext/Layoutdefs/opportunities_emails_1_Emails.php
custom/Extension/modules/Emails/Ext/Vardefs/opportunities_emails_1_Emails.php
custom/Extension/modules/Emails/Ext/WirelessLayoutdefs/opportunities_emails_1_Emails.php
custom/Extension/modules/Opportunities/Ext/Vardefs/opportunities_emails_1_Opportunities.php
custom/Extension/modules/relationships/language/Emails.php
custom/Extension/modules/relationships/layoutdefs/opportunities_emails_1_Emails.php
custom/Extension/modules/relationships/relationships/opportunities_emails_1MetaData.php
custom/Extension/modules/relationships/vardefs/opportunities_emails_1_Emails.php
custom/Extension/modules/relationships/vardefs/opportunities_emails_1_Opportunities.php
custom/Extension/modules/relationships/wirelesslayoutdefs/opportunities_emails_1_Emails.php
custom/metadata/opportunities_emails_1MetaData.php
A changeset of what is required can be found below:
custom/Extension/application/Ext/TableDictionary/opportunities_emails_1.php
<?php
include 'custom/metadata/opportunities_emails_1MetaData.php';
custom/Extension/modules/Emails/Ext/Language/en_UK.customopportunities_emails_1.php
<?php
$mod_strings['LBL_OPPORTUNITIES_EMAILS_1_FROM_OPPORTUNITIES_TITLE'] = 'Emails';
custom/Extension/modules/Emails/Ext/Layoutdefs/opportunities_emails_1_Emails.php
<?php
$layout_defs["Emails"]["subpanel_setup"]['opportunities_emails_1'] = array (
'order' => 100,
'module' => 'Opportunities',
'subpanel_name' => 'default',
'sort_order' => 'asc',
'sort_by' => 'id',
'title_key' => 'LBL_OPPORTUNITIES_EMAILS_1_FROM_OPPORTUNITIES_TITLE',
'get_subpanel_data' => 'opportunities_emails_1',
'top_buttons' =>
array (
0 =>
array (
'widget_class' => 'SubPanelTopButtonQuickCreate',
),
1 =>
array (
'widget_class' => 'SubPanelTopSelectButton',
'mode' => 'MultiSelect',
),
),
);
custom/Extension/modules/Emails/Ext/Vardefs/opportunities_emails_1_Emails.php
<?php
$dictionary["Email"]["fields"]["opportunities_emails_1"] = array (
'name' => 'opportunities_emails_1',
'type' => 'link',
'relationship' => 'opportunities_emails_1',
'source' => 'non-db',
'vname' => 'LBL_OPPORTUNITIES_EMAILS_1_FROM_OPPORTUNITIES_TITLE',
);
custom/Extension/modules/Emails/Ext/WirelessLayoutdefs/opportunities_emails_1_Emails.php
<?php
$layout_defs["Emails"]["subpanel_setup"]['opportunities_emails_1'] = array (
'order' => 100,
'module' => 'Opportunities',
'subpanel_name' => 'default',
'title_key' => 'LBL_OPPORTUNITIES_EMAILS_1_FROM_OPPORTUNITIES_TITLE',
'get_subpanel_data' => 'opportunities_emails_1',
);
custom/Extension/modules/Opportunities/Ext/Vardefs/opportunities_emails_1_Opportunities.php
<?php
$dictionary["Opportunity"]["fields"]["opportunities_emails_1"] = array (
'name' => 'opportunities_emails_1',
'type' => 'link',
'relationship' => 'opportunities_emails_1',
'source' => 'non-db',
'vname' => 'LBL_OPPORTUNITIES_EMAILS_1_FROM_EMAILS_TITLE',
);
custom/Extension/modules/relationships/language/Emails.php
<?php
$mod_strings['LBL_OPPORTUNITIES_EMAILS_1_FROM_OPPORTUNITIES_TITLE'] = 'Emails';
custom/Extension/modules/relationships/layoutdefs/opportunities_emails_1_Emails.php
<?php
$layout_defs["Emails"]["subpanel_setup"]['opportunities_emails_1'] = array (
'order' => 100,
'module' => 'Opportunities',
'subpanel_name' => 'default',
'sort_order' => 'asc',
'sort_by' => 'id',
'title_key' => 'LBL_OPPORTUNITIES_EMAILS_1_FROM_OPPORTUNITIES_TITLE',
'get_subpanel_data' => 'opportunities_emails_1',
'top_buttons' =>
array (
0 =>
array (
'widget_class' => 'SubPanelTopButtonQuickCreate',
),
1 =>
array (
'widget_class' => 'SubPanelTopSelectButton',
'mode' => 'MultiSelect',
),
),
);
custom/Extension/modules/relationships/relationships/opportunities_emails_1MetaData.php
<?php
$dictionary["opportunities_emails_1"] = array (
'true_relationship_type' => 'many-to-many',
'from_studio' => true,
'relationships' =>
array (
'opportunities_emails_1' =>
array (
'lhs_module' => 'Opportunities',
'lhs_table' => 'opportunities',
'lhs_key' => 'id',
'rhs_module' => 'Emails',
'rhs_table' => 'emails',
'rhs_key' => 'id',
'relationship_type' => 'many-to-many',
'join_table' => 'opportunities_emails_1_c',
'join_key_lhs' => 'opportunities_emails_1opportunities_ida',
'join_key_rhs' => 'opportunities_emails_1emails_idb',
),
),
'table' => 'opportunities_emails_1_c',
'fields' =>
array (
0 =>
array (
'name' => 'id',
'type' => 'varchar',
'len' => 36,
),
1 =>
array (
'name' => 'date_modified',
'type' => 'datetime',
),
2 =>
array (
'name' => 'deleted',
'type' => 'bool',
'len' => '1',
'default' => '0',
'required' => true,
),
3 =>
array (
'name' => 'opportunities_emails_1opportunities_ida',
'type' => 'varchar',
'len' => 36,
),
4 =>
array (
'name' => 'opportunities_emails_1emails_idb',
'type' => 'varchar',
'len' => 36,
),
),
'indices' =>
array (
0 =>
array (
'name' => 'opportunities_emails_1spk',
'type' => 'primary',
'fields' =>
array (
0 => 'id',
),
),
1 =>
array (
'name' => 'opportunities_emails_1_alt',
'type' => 'alternate_key',
'fields' =>
array (
0 => 'opportunities_emails_1opportunities_ida',
1 => 'opportunities_emails_1emails_idb',
),
),
),
);
custom/Extension/modules/relationships/vardefs/opportunities_emails_1_Emails.php
<?php
$dictionary["Email"]["fields"]["opportunities_emails_1"] = array (
'name' => 'opportunities_emails_1',
'type' => 'link',
'relationship' => 'opportunities_emails_1',
'source' => 'non-db',
'vname' => 'LBL_OPPORTUNITIES_EMAILS_1_FROM_OPPORTUNITIES_TITLE',
);
custom/Extension/modules/relationships/vardefs/opportunities_emails_1_Opportunities.php
<?php
$dictionary["Opportunity"]["fields"]["opportunities_emails_1"] = array (
'name' => 'opportunities_emails_1',
'type' => 'link',
'relationship' => 'opportunities_emails_1',
'source' => 'non-db',
'vname' => 'LBL_OPPORTUNITIES_EMAILS_1_FROM_EMAILS_TITLE',
);
custom/Extension/modules/relationships/wirelesslayoutdefs/opportunities_emails_1_Emails.php
<?php
$layout_defs["Emails"]["subpanel_setup"]['opportunities_emails_1'] = array (
'order' => 100,
'module' => 'Opportunities',
'subpanel_name' => 'default',
'title_key' => 'LBL_OPPORTUNITIES_EMAILS_1_FROM_OPPORTUNITIES_TITLE',
'get_subpanel_data' => 'opportunities_emails_1',
);
custom/metadata/opportunities_emails_1MetaData.php
<?php
$dictionary["opportunities_emails_1"] = array (
'true_relationship_type' => 'many-to-many',
'from_studio' => true,
'relationships' =>
array (
'opportunities_emails_1' =>
array (
'lhs_module' => 'Opportunities',
'lhs_table' => 'opportunities',
'lhs_key' => 'id',
'rhs_module' => 'Emails',
'rhs_table' => 'emails',
'rhs_key' => 'id',
'relationship_type' => 'many-to-many',
'join_table' => 'opportunities_emails_1_c',
'join_key_lhs' => 'opportunities_emails_1opportunities_ida',
'join_key_rhs' => 'opportunities_emails_1emails_idb',
),
),
'table' => 'opportunities_emails_1_c',
'fields' =>
array (
0 =>
array (
'name' => 'id',
'type' => 'varchar',
'len' => 36,
),
1 =>
array (
'name' => 'date_modified',
'type' => 'datetime',
),
2 =>
array (
'name' => 'deleted',
'type' => 'bool',
'len' => '1',
'default' => '0',
'required' => true,
),
3 =>
array (
'name' => 'opportunities_emails_1opportunities_ida',
'type' => 'varchar',
'len' => 36,
),
4 =>
array (
'name' => 'opportunities_emails_1emails_idb',
'type' => 'varchar',
'len' => 36,
),
),
'indices' =>
array (
0 =>
array (
'name' => 'opportunities_emails_1spk',
'type' => 'primary',
'fields' =>
array (
0 => 'id',
),
),
1 =>
array (
'name' => 'opportunities_emails_1_alt',
'type' => 'alternate_key',
'fields' =>
array (
0 => 'opportunities_emails_1opportunities_ida',
1 => 'opportunities_emails_1emails_idb',
),
),
),
);
In the solution above I’ve removed the “Emails” Subpanel from the Opportunities screen, since I have created a function that can augment the Activities/History Subpanels with the many-to-many relationship data.