**As we all know. Currently we can't run territory assignment rule from apex. But We can use SOAP API for this requirement
You need to use SOAP API for firing the territory management rule. You can call pass the same org(which one you are using) credentials.
Use this class TerritoryMangRule.fireTerritoryManagementViaSoap(Pass list of Account here)
.
Follow the steps in link to generate WSDL https://developer.salesforce.com/page/Apex_Web_Services_and_Callouts
So Once trigger is fired call a future method from there execute the webservice and pass the All Account.
global class TerritoryMangRule
{
webService static void fireTerritoryManagementViaSoap(List<Account> lstAccountToUpdate)
{
partnerSoapSforceCom.Soap obj = new partnerSoapSforceCom.Soap();
partnerSoapSforceCom.LoginResult loginResult = obj.login('org@username.com', 'Password');
obj.SessionHeader = new partnerSoapSforceCom.SessionHeader_element();
obj.endpoint_x =loginResult.ServerUrl;
obj.Sessionheader.sessionid = loginResult.sessionid;
List<sobjectPartnerSoapSforceCom.sObject_x> lst = new List<sobjectPartnerSoapSforceCom.sObject_x>();
for(Account ac:lstAccountToUpdate)
{
sobjectPartnerSoapSforceCom.sObject_x tmpObj = new sobjectPartnerSoapSforceCom.sObject_x();
tmpObj.type_x = 'Account';
tmpObj.Id = ac.Id;
lst.add(tmpObj);
}
partnerSoapSforceCom.AssignmentRuleHeader_element obj1 = new partnerSoapSforceCom.AssignmentRuleHeader_element();
obj1.useDefaultRule = true;
obj.AssignmentRuleHeader = obj1;
partnerSoapSforceCom.SaveResult[] lst1 =obj.update_x(lst);
}
}
We need to just perform dummy update(Including set AssignmentRuleHeader) via SOAP API. It will run the Territory management rule.