<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
/*********************************************************************************
 * SugarCRM is a customer relationship management program developed by
 * SugarCRM, Inc. Copyright (C) 2004-2010 SugarCRM Inc.
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by the
 * Free Software Foundation with the addition of the following permission added
 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
 * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Affero General Public License along with
 * this program; if not, see http://www.gnu.org/licenses or write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA.
 * 
 * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
 * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
 * 
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 * 
 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
 * these Appropriate Legal Notices must retain the display of the "Powered by
 * SugarCRM" logo. If the display of the logo is not reasonably feasible for
 * technical reasons, the Appropriate Legal Notices must display the words
 * "Powered by SugarCRM".
 ********************************************************************************/
require_once("include/EditView/EditView2.php");

class ViewConvertLead extends SugarView
{
    protected $fileName = "modules/Leads/metadata/convertdefs.php";
    
    public function __construct(
        $bean = null, 
        $view_object_map = array()
        )
    {
        parent::SugarView($bean, $view_object_map);
    	$this->medataDataFile = $this->fileName;
        if (file_exists("custom/$this->fileName"))
        {
            $this->medataDataFile = "custom/$this->fileName";
        }
    }
	
    /**
	 * @see SugarView::display()
	 */
	public function display()
    {
        if (!empty($_REQUEST['handle']) && $_REQUEST['handle'] == 'save')
        {
        	return $this->handleSave();
        }
        
    	global $beanList;
    	
        $this->medataDataFile = $this->fileName;
        if (file_exists("custom/$this->fileName"))
        {
            $this->medataDataFile = "custom/$this->fileName";
        }
    	$this->loadDefs();
        $this->getRecord();
        $this->checkForDuplicates($this->focus);
        $smarty = new Sugar_Smarty();
        $ev = new EditView();
        $ev->ss = $smarty;
        $ev->view = "ConvertLead";
        echo $this->getModuleTitle();
        
        require_once("include/QuickSearchDefaults.php");
        $qsd = new QuickSearchDefaults();
        $qsd->setFormName("ConvertLead");
        
        $this->contact = new Contact();
        $smarty->assign("contact_def", $this->contact->field_defs);
        $smarty->assign("form_name", "ConvertLead");
        $smarty->assign("form_id", "ConvertLead");
        $smarty->assign("module", "Leads");
        $smarty->assign("view", "convertlead");
        $smarty->assign("bean", $this->focus);
		$smarty->assign("record_id", $this->focus->id);
        $smarty->display("modules/Leads/tpls/ConvertLeadHeader.tpl");
        
        echo "<div class='edit view' style='width:auto;'>";
        
        foreach($this->defs as $module => $vdef)
        {
            $bean = $beanList[$module];
            $focus = new $bean();
            $focus->fill_in_additional_detail_fields();
            foreach($focus->field_defs as $field => $def)
            {
            	
            	if(isset($vdef[$ev->view]['copyData']) && $vdef[$ev->view]['copyData'])
                {
	                if ($module == "Accounts" && $field == 'name')
	                {
	                    $focus->name = $this->focus->account_name;
	                } 
	                else if ($module == "Opportunities" && $field == 'amount')
	                {
	                    $focus->amount = unformat_number($this->focus->opportunity_amount);
	                } 
	                else if ($field == "id")
                    {
						//If it is not a contact, don't copy the ID from the lead
                    	if ($module == "Contacts") {
                    	   $focus->$field = $this->focus->$field;
                        }
                    } else if (is_a($focus, "Company") && $field == 'phone_office')
	                {
	                	//Special case where company and person have the same field with a different name
	                	$focus->phone_office = $this->focus->phone_work;
	                }
                    else if (isset($this->focus->$field))
                    {
                        $focus->$field = $this->focus->$field;
                    }
                }
            }
            
            //Copy over email data
            $ev->setup($module, $focus, $this->medataDataFile, "modules/Leads/tpls/ConvertLead.tpl", false);
            $ev->process();
            echo($ev->display(false));
            echo($this->getValidationJS($module, $focus, $vdef[$ev->view]));
        }
        echo "</div>";
        echo ($qsd->getQSScriptsJSONAlreadyDefined());
        $smarty->display("modules/Leads/tpls/ConvertLeadFooter.tpl");
    }
    
    protected function getRecord() 
    {
    	$this->focus = new Lead();
    	if (isset($_REQUEST['record']))
    	{
    		$this->focus->retrieve($_REQUEST['record']); 
    	}
    }
    
    protected function loadDefs()
    {
    	$viewdefs = array();
    	include($this->medataDataFile);
    	$this->defs = $viewdefs;
    }
    
    /**
     * Returns the javascript to enable/disable validation of each module's sub-form
     * //TODO: This should probably be on the smarty template
     * @param $module String the target module name.
     * @param $focus SugarBean instance of the target module.
     * @param $focus EditView def for the module.
     * @return String, javascript to echo to page.
     */
    protected function getValidationJS(
        $module, 
        $focus, 
        $viewdef
        )
    {
        $validateSelect = isset($viewdef['required']) && $viewdef['required'] && !empty($viewdef['select']);
        $jsOut  = "
        <script type='text/javascript'>
            if (!SUGAR.convert)  SUGAR.convert = {requiredFields: {}};
            SUGAR.convert.toggle$module = function(){
                clear_all_errors();
                inputsWithErrors = [];
                if(!SUGAR.convert.{$module}Enabled)
                {
                    for(var i in SUGAR.convert.requiredFields.$module)
                    {
                        addToValidate('ConvertLead', '$module' + i, 'varchar', true, SUGAR.convert.requiredFields.{$module}[i]);
                    }
                    ";
        if ($validateSelect) {
        	$jsOut  .= "
                    removeFromValidate('ConvertLead', '{$viewdef['select']}');";
        }
        
        $jsOut .= "
                    SUGAR.convert.{$module}Enabled = true;
                } else {
                    for(var i in SUGAR.convert.requiredFields.$module)
                    {
                        removeFromValidate('ConvertLead', '$module' + i);
                    }";
        if ($validateSelect) {
            $jsOut  .= "
                addToValidate('ConvertLead', '{$viewdef['select']}', 'varchar', true, '" 
            . translate($this->contact->field_defs[$viewdef['select']]['vname']) . "');";
        }
        $jsOut .= "
                    SUGAR.convert.{$module}Enabled = false;
                }
                YAHOO.util.Dom.get('convert_create_{$module}').value = SUGAR.convert.{$module}Enabled;
            };\n";
        
        if (isset($viewdef['required']) && $viewdef['required'])
        {
            if (!empty($viewdef['select']) && (empty($viewdef['default_action']) || $viewdef['default_action'] != 'create'))
            {
                $jsOut .= "
            SUGAR.convert.{$module}Enabled = true;";
            }
            $jsOut .= "
            YAHOO.util.Event.onDOMReady(SUGAR.convert.toggle$module);";
        }
        $jsOut .= "
            YAHOO.util.Event.addListener('new$module', 'click', SUGAR.convert.toggle$module);
            SUGAR.convert.requiredFields.$module = {};";
        foreach($focus->field_defs as $field => $def)
        {
            if (isset($def['required']) && $def['required'])
            {
                $jsOut .= "
            SUGAR.convert.requiredFields.$module.$field = '". translate($def['vname'], $module) . "';\n";
            }
        }
        
        $jsOut .= "
        </script>";
        
        return $jsOut;
    }
    
    /**
     * Saves a new Contact as well as any related items passed in.
     * 
     * @return null
     */
    protected function handleSave()
    {	
        require_once("include/formbase.php");
    	$lead = false;
		if (!empty($_REQUEST['record']))
		{
			$lead = new Lead();
			$lead->retrieve($_REQUEST['record']);
		}
			
    	global $beanList;
    	$this->loadDefs();
        $beans = array();
        $selectedBeans = array();
        $selects = array();
        //Make sure the contact object is availible for relationships.
        $beans['Contacts'] = new Contact();
        $beans['Contacts']->id = create_guid();
        $beans['Contacts']->new_with_id = true;
        
        // Bug 39287 - Check for Duplicates on selected modules before save
        if ( !empty($_REQUEST['selectedContact']) ) {
            $beans['Contacts']->retrieve($_REQUEST['selectedContact']);
            if ( !empty($beans['Contacts']->id) ) {
                $beans['Contacts']->new_with_id = false;
                unset($_REQUEST["convert_create_Contacts"]);
                unset($_POST["convert_create_Contacts"]);
            }
        }
        elseif (!empty($_REQUEST["convert_create_Contacts"]) && $_REQUEST["convert_create_Contacts"] != "false" && !isset($_POST['ContinueContact'])) {
            require_once('modules/Contacts/ContactFormBase.php');
            $contactForm = new ContactFormBase();
            $duplicateContacts = $contactForm->checkForDuplicates('Contacts');
            if(isset($duplicateContacts)){
                echo $contactForm->buildTableForm($duplicateContacts,  'Contacts');
                return;
            }
        }
        if ( !empty($_REQUEST['selectedAccount']) ) {
            $_REQUEST['account_id'] = $_REQUEST['selectedAccount'];
                unset($_REQUEST["convert_create_Accounts"]);
                unset($_POST["convert_create_Accounts"]);
        }
        elseif (!empty($_REQUEST["convert_create_Accounts"]) && $_REQUEST["convert_create_Accounts"] != "false" && empty($_POST['ContinueAccount'])){
            require_once('modules/Accounts/AccountFormBase.php');
            $accountForm = new AccountFormBase();
            $duplicateAccounts = $accountForm->checkForDuplicates('Accounts');
            if(isset($duplicateAccounts)){
                echo $accountForm->buildTableForm($duplicateAccounts);
                return;
            }
        }
        
        foreach($this->defs as $module => $vdef)
        {
            //Create a new record if "create" was selected
        	if (!empty($_REQUEST["convert_create_$module"]) && $_REQUEST["convert_create_$module"] != "false")
            {
                //Save the new record
                $bean = $beanList[$module];
	            if (empty($beans[$module]))
	            	$beans[$module] = new $bean();
	            	
            	$this->populateNewBean($module, $beans[$module], $beans['Contacts'], $lead);
                
            } 
            //If an existing bean was selected, relate it to the contact
            else if (!empty($vdef['ConvertLead']['select'])) {
            	//Save the new record
                $select = $vdef['ConvertLead']['select'];
            	$fieldDef = $beans['Contacts']->field_defs[$select];
            	if (!empty($fieldDef['id_name']) && !empty($_REQUEST[$fieldDef['id_name']]))
            	{
            		$beans['Contacts']->$fieldDef['id_name'] = $_REQUEST[$fieldDef['id_name']];
            		$selects[$module] = $_REQUEST[$fieldDef['id_name']];
            		if (!empty($_REQUEST[$select]))
	                {
	                    $beans['Contacts']->$select = $_REQUEST[$select];
	                }
	                // Bug 39268 - Add the existing beans to a list of beans we'll potentially add the lead's activities to
	                $bean = loadBean($module);
                    $bean->retrieve($_REQUEST[$fieldDef['id_name']]);
                    $selectedBeans[$module] = $bean;
            	}
            }
        }
		
		$this->handleActivities($lead, $beans);
		// Bug 39268 - Add the lead's activities to the selected beans
		$this->handleActivities($lead, $selectedBeans);
		
        //Handle non-contacts relationships
	    foreach($beans as $bean)
        {
        	if (!empty($lead))
			{
	        	if (empty($bean->assigned_user_id))
				{
					$bean->assigned_user_id = $lead->assigned_user_id;
				}
				$leadsRel = $this->findRelationship($bean, $lead);
				if (!empty($leadsRel))
				{
					
					$bean->load_relationship ($leadsRel) ;
					$relObject = $bean->$leadsRel->getRelationshipObject();
					if ($relObject->relationship_type == "one-to-many" && $bean->$leadsRel->_get_bean_position())
					{
						$id_field = $relObject->rhs_key;
						$lead->$id_field = $bean->id;
					} else {
						$bean->$leadsRel->add($lead->id);
					}
				}
			}
			//Special case code for opportunities->Accounts
			if ($bean->object_name == "Opportunity" && empty($bean->account_id))
			{
				if( isset($beans['Accounts'])) {
					$bean->account_id = $beans['Accounts']->id;
					$bean->account_name = $beans['Accounts']->name;
				}
				else if (!empty($selects['Accounts'])){
					 $bean->account_id = $selects['Accounts'];
				}
			}
			
       	 	$this->copyAddressFields($bean, $beans['Contacts']);
       	 	
			$bean->save();
        }
        if (!empty($lead))
		{	//Mark the original Lead converted
		  $lead->status = "Converted";
		  $lead->converted = '1';
		  $lead->in_workflow = true;
		  $lead->save();
		}
		
        $this->displaySaveResults($beans);
    }
    
    protected function displaySaveResults(
        $beans
        )
    {
    	global $beanList;
    	echo "<div><ul>";
        foreach($beans as $bean)
        {
            $beanName = $bean->object_name;
            if ( $beanName == 'Contact' && !$bean->new_with_id ) {
                echo "<li>" . translate("LBL_EXISTING_CONTACT") . " - 
                    <a href='index.php?module={$bean->module_dir}&action=DetailView&record={$bean->id}'> 
                       {$bean->get_summary_text()} 
                    </a></li>";
            }
            else {
                echo "<li>" . translate("LBL_CREATED_NEW") . translate($beanName) . " - 
                    <a href='index.php?module={$bean->module_dir}&action=DetailView&record={$bean->id}'> 
                       {$bean->get_summary_text()} 
                    </a></li>";
            }
        }
    	
    	echo "</ul></div>";
    }
    
    protected function handleActivities(
        $lead, 
        $beans
        )
    {
    	global $app_list_strings;
    	$parent_types = $app_list_strings['record_type_display'];
    	
    	$activities = $this->getActivitiesFromLead($lead);
    	
    	foreach($beans as $module => $bean)
    	{
	    	if (isset($parent_types[$module]))
	    	{
                foreach($activities as $activity)
		    	{
		    		$this->copyActivityAndRelateToBean($activity, $bean);
		    	}
	    	}
    	}
    }
	
    /**
     * Gets the list of activities related to the lead
     * @param Lead $lead Lead to get activities from
     * @return Array of Activity SugarBeans .
     */
	protected function getActivitiesFromLead(
	    $lead
	    )
	{
		if (!$lead) return;
		
		global $beanList, $db;
		
		$activitesList = array("Calls", "Tasks", "Meetings", "Emails", "Notes");
		$activities = array();
		
		foreach($activitesList as $module)
		{
			$beanName = $beanList[$module];
			$activity = new $beanName();
			$query = "SELECT id FROM {$activity->table_name} WHERE parent_id = '{$lead->id}' AND parent_type = 'Leads'";
			$result = $db->query($query,true);
            while($row = $db->fetchByAssoc($result))
            {
            	$activity = new $beanName();
				$activity->retrieve($row['id']);
				$activity->fixUpFormatting();
				$activities[] = $activity;
            }
		}
		
		return $activities;
	}
	
	protected function copyActivityAndRelateToBean(
	    $activity, 
	    $bean
	    )
	{
		global $beanList;
		
		$newActivity = clone $activity;
		$newActivity->id = create_guid();
		$newActivity->new_with_id = true;
		
		//Special case to prevent duplicated tasks from appearing under Contacts multiple times
    	if ($newActivity->module_dir == "Tasks" && $bean->module_dir != "Contacts")
    	{
    		$newActivity->contact_id = $activity->contact_name = "";
    	}
        
		if ($rel = $this->findRelationship($newActivity, $bean))
        {
            $newActivity->load_relationship ($rel) ;
            $relObj = $newActivity->$rel->getRelationshipObject();
            if ( $relObj->relationship_type=='one-to-one' || $relObj->relationship_type == 'one-to-many' )
            {
                $key = $relObj->rhs_key;
                $newActivity->$key = $bean->id;
            }
            $newActivity->$rel->add($bean->id);
            $newActivity->parent_id = $bean->id;
	        $newActivity->parent_type = $bean->module_dir;
	        $newActivity->save();
         }
	}
    
    /**
     * Populates the passed in Bean fron the contact and the $_REQUEST
     * @param String $module Module of new bean
     * @param SugarBean $bean SugarBean to be populated.
     * @param Contact $contact Contact to relate the bean to.
     */
	protected function populateNewBean(
	    $module, 
	    $bean, 
	    $contact,
	    $lead
	    )
	{
		populateFromPost($module, $bean, true);
		
		//Copy data from the contact to new bean
		foreach($bean->field_defs as $field => $def)
		{
			if(!isset($_REQUEST[$module . $field]) && isset($lead->$field) && $field != 'id')
			{
				$bean->$field = $lead->$field;
			}
		}
		//Try to link to the new contact
		$contactRel = "";
		if (!empty($vdef['ConvertLead']['select']))
		{
			$select = $vdef['ConvertLead']['select'];
			$fieldDef = $contact->field_defs[$select];
			if (!empty($fieldDef['id_name']))
			{
				$bean->id = create_guid();
				$bean->new_with_id = true;
				$contact->$fieldDef['id_name'] = $bean->id ;
				if ($fieldDef['id_name'] != $select) {
					$rname = isset($fieldDef['rname']) ? $fieldDef['rname'] : "";
					if (!empty($rname) && isset($bean->$rname))
						$contact->$select = $bean->$rname;
					else 
						$contact->$select = $bean->name;
				}
			}
		} else if ($module != "Contacts"){
			$contactRel = $this->findRelationship($contact, $bean);
			if (!empty($contactRel))
			{
				$bean->id = create_guid();
				$bean->new_with_id = true;
				$contact->load_relationship ($contactRel) ;
				$relObject = $contact->$contactRel->getRelationshipObject();
				if ($relObject->relationship_type == "one-to-many" && $contact->$contactRel->_get_bean_position())
				{
					$id_field = $relObject->rhs_key;
					$bean->$id_field = $contact->id;
				} else {
					$contact->$contactRel->add($bean->id);
				}
				//Set the parent of activites to the new Contact
				if (isset($bean->field_defs['parent_id']) && isset($bean->field_defs['parent_type']))
				{
					$bean->parent_id = $contact->id;
					$bean->parent_type = "Contacts";
				}
			}
		}
	}
	
	protected function copyAddressFields($bean, $contact)
	{
	//Copy over address info from the contact to any beans with address not set
	        foreach($bean->field_defs as $field => $def)
			{
				if(!isset($_REQUEST[$bean->module_dir . $field]) && strpos($field, "_address_") !== false)
				{
					$set = "primary";
					if (strpos($field, "alt_") !== false || strpos($field, "shipping_") !== false)
						$set = "alt";
					$type = "";
						
					if(strpos($field, "_address_street_2") !== false)
						$type = "_address_street_2";
					else if(strpos($field, "_address_street_3") !== false)
						$type = "_address_street_3";
					else if(strpos($field, "_address_street_4") !== false)
						$type = "";
					else if(strpos($field, "_address_street") !== false)
						$type = "_address_street";
					else if(strpos($field, "_address_city") !== false)
						$type = "_address_city";
					else if(strpos($field, "_address_state") !== false)
						$type = "_address_state";
					else if(strpos($field, "_address_postalcode") !== false)
						$type = "_address_postalcode";
					else if(strpos($field, "_address_country") !== false)
						$type = "_address_country";
						
						$var = $set.$type;
					if (isset($contact->$var))
						$bean->$field = $contact->$var;
				}
			}
	}
    

    protected function findRelationship(
        $from, 
        $to
        ) 
    {
    	global $dictionary;
    	require_once("modules/TableDictionary.php");
    	foreach ($from->field_defs as $field=>$def)
        {
            if (isset($def['type']) && $def['type'] == "link" && isset($def['relationship'])) {
                $rel_name = $def['relationship'];
                $rel_def = "";
                if (isset($dictionary[$from->object_name]['relationships']) && isset($dictionary[$from->object_name]['relationships'][$rel_name]))
                {
                    $rel_def = $dictionary[$from->object_name]['relationships'][$rel_name];
                }
                else if (isset($dictionary[$to->object_name]['relationships']) && isset($dictionary[$to->object_name]['relationships'][$rel_name]))
                {
                    $rel_def = $dictionary[$to->object_name]['relationships'][$rel_name];
                }
                else if (isset($dictionary[$rel_name]) && isset($dictionary[$rel_name]['relationships']) 
                        && isset($dictionary[$rel_name]['relationships'][$rel_name])) 
                {
                	$rel_def = $dictionary[$rel_name]['relationships'][$rel_name];
                }
                if (!empty($rel_def)) {
                    if ($rel_def['lhs_module'] == $from->module_dir && $rel_def['rhs_module'] == $to->module_dir )
                    {
                    	return $field;
                    } 
                    else if ($rel_def['rhs_module'] == $from->module_dir && $rel_def['lhs_module'] == $to->module_dir )
                    {
                    	return $field;
                    }
                }
            }
        }
        return false;
    }
    
	/**
	 * @see SugarView::_getModuleTitleParams()
	 */
	protected function _getModuleTitleParams()
	{
	    global $mod_strings;
	    $params = parent::_getModuleTitleParams();
	    $params[] = "<a href='index.php?module=Leads&action=DetailView&record={$this->bean->id}'>{$this->bean->name}</a>";
	    $params[] = $mod_strings['LBL_CONVERTLEAD'];
    	return $params;
    }
    
    
    protected function checkForDuplicates(
        $lead
        ) 
    {
    	if ($lead->status == "Converted")
    	{
    		echo ("<span class='error'>" . translate('LBL_CONVERTLEAD_WARNING'));
    		$dupes = array();
    		$q = "SELECT id, first_name, last_name FROM contacts WHERE first_name LIKE '{$lead->first_name}' AND last_name LIKE '{$lead->last_name}'";
    		$result = $lead->db->query($q);
    		while($row = $lead->db->fetchByAssoc($result)) {
    			$contact = new Contact();
    			$contact->retrieve($row['id']);
    			$dupes[$row['id']] = $contact->name;
    		}
    		if (!empty($dupes))
    		{
    			foreach($dupes as $id => $name)
    			{
    				echo (translate('LBL_CONVERTLEAD_WARNING_INTO_RECORD') . "<a href='index.php?module=Contacts&action=DetailView&record=$id'>$name</a>");
    				break;
    			}
    		}
    		echo "</span>";
    	}
    	return false;
    } 
}
