Advertisement
Guest User

Untitled

a guest
Jul 12th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 52.99 KB | None | 0 0
  1. global with sharing class ProjectCustomCreateController {
  2.  
  3. public Opportunity project {get;set;} // project - account
  4. public Account projectOrg {get;set;} // object for project - organization
  5. public String language {get;set;} // language of address
  6. public Boolean isSearchResult {get;set;} // found matching projects
  7. public Boolean isNothingFound {get;set;} // found nothing
  8. public Boolean isCreateButtonVisible {get;set;} // create button visible
  9. public Boolean isReadyToCreateAccObj {get;set;} // ready to create object Account
  10. transient List<Opportunity> allOpportunitiesList; // all opportunities from db
  11. transient List<Account> allAccountObjectsList; // all accounts with recordtype 'object'
  12. public String currentUserDivision {get;set;} // current user division
  13. public String currentUserId {get;set;} // current User Id
  14. public matchingOpp mostMatchingProject {get;set;} // most matching project in search
  15. public Boolean areShownMiniTables {get;set;} // mini tables are shown
  16. public Boolean isShowAllResultsButtonVisible {get;set;} // all results button visible
  17. public Boolean isShowMiniResultsButtonVisible {get;set;} // mini results button visible
  18. public Id russiaCountryTerritoryRecordId {get;set;} // russia Territory__c Id
  19. public map<Id, Double> addressMatchingPercentMapForProject {get;set;} // map helper for address matching percent if result for address < 50 but bigger than 0
  20. public map<Id, Double> addressMatchingPercentMapForObject {get;set;} // map helper for address matching percent if result for address < 50 but bigger than 0
  21.  
  22. ////////////////DEBUG GISMO////////////////
  23. public String serializedForDebug {get;set;}
  24. ///////////////////////////////////////////
  25.  
  26. // object Account search vars
  27. public map<Id, matchingAcc> matchingAccs {get;set;}
  28. public Boolean areMatchingAccsFound {get;set;}
  29. public Boolean isHighLevelOfMatchingPercentAccs {get;set;}
  30. public List<matchingAcc> matchingAccsSorted {get;set;}
  31. public List<matchingAcc> matchingAccsSortedMini {get;set;}
  32. public List<matchingOpp> highMatchingOppsWithAccObjIdKeys {get;set;}
  33. public set<Id> highMatchingOppsWithAccObjIdKeysSet {get;set;}
  34.  
  35. // project Opportunity search vars
  36. public map<Id, matchingOpp> matchingOpps {get;set;}
  37. public Boolean areMatchingOppsFound {get;set;}
  38. public Boolean isHighLevelOfMatchingPercentOpps {get;set;}
  39. public List<matchingOpp> matchingOppsSorted {get;set;}
  40. public List<matchingOpp> matchingOppsSortedMini {get;set;}
  41.  
  42. private static final String CITY_PARAMETER = 'City';
  43. private static final String COUNTRY_PARAMETER = 'Country';
  44. private static final String DISTRICT_PARAMETER = 'District';
  45. private static final String LIVEPLACE_PARAMETER = 'LivePlace';
  46. private static final String OKRUG_PARAMETER = 'Okrug';
  47. private static final String REGION_PARAMETER = 'Region';
  48. private static final String JSON_EMPTY_STRING = '-1';
  49. private static final String JSON_MANUAL_STRING = '-2';
  50. private static final String DEV_NAME_RT_OBJECT_ACCOUNT = 'Object';
  51. private static final Integer MAX_LEVENSHTEIN_DISTANCE = 100;
  52. private static final Integer MAX_ROWS_IN_MINI_TABLES = 30;
  53. public static String LANG_TEXT_VALUE_RUSSIAN {get {return String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN);}}
  54. private Id OBJECT_TYPE_ACCOUNT_RT {get {return getObjectTypeAccountRT();}}
  55.  
  56. private String selectedCountryID;
  57. private String selectedDistrictID;
  58. private String selectedCommunityID;
  59. private String selectedOkrugID;
  60. private String selectedRegionID;
  61. private String selectedCityID;
  62.  
  63. //LEADMATCHINGPROJECTSANDOBJECTS page parameters
  64. private final Lead entryLead;
  65. public Lead pageLead {get;set;}
  66. public string URLForPage{get;set;}
  67. public Boolean isNotNecessaryToSearch {get;set;}
  68.  
  69. // constructor
  70. public ProjectCustomCreateController(){
  71.  
  72. getRussiaTerritoryRecordId();
  73. project = new Opportunity();
  74. projectOrg = new Account();
  75. projectOrg.RecordTypeId = getObjectTypeAccountRT();
  76. projectOrg.IsCreatedFromSearchPage__c = true;
  77. isSearchResult = false;
  78. isNothingFound = false;
  79. areMatchingOppsFound = false;
  80. areMatchingAccsFound = false;
  81. isCreateButtonVisible = false;
  82. isReadyToCreateAccObj = false;
  83. areShownMiniTables = true;
  84. isShowAllResultsButtonVisible = true;
  85. getCurrentUserInfo();
  86.  
  87. }
  88.  
  89. //LEADMATCHINGPROJECTSANDOBJECTS page controller
  90. public ProjectCustomCreateController(ApexPages.StandardController stdController) {
  91.  
  92. URLForPage = ApexPages.currentPage().getHeaders().get('Host');
  93. entryLead = (Lead)stdController.getRecord();
  94. getFullInfoPageLead();
  95. getRussiaTerritoryRecordId();
  96. isSearchResult = false;
  97. isNothingFound = false;
  98. areMatchingOppsFound = false;
  99. areMatchingAccsFound = false;
  100. areShownMiniTables = true;
  101. isShowAllResultsButtonVisible = true;
  102. isNotNecessaryToSearch = false;
  103. runFuzzySearchForLead();
  104. defineFurtherActionLogicForLead();
  105.  
  106. }
  107.  
  108. global class matchingOpp implements Comparable{
  109. public Id oppId {get;set;}
  110. public String oppName {get;set;}
  111. public Double matchingPercent {get;set;}
  112. public Double matchingPercentAddress {get;set;}
  113. public String createButtonUrl {get;set;}
  114. public String addressValue {get;set;}
  115. public Id oppOwnerId {get;set;}
  116. public String oppOwnerName {get;set;}
  117. public String oppOwnerDivision {get;set;}
  118. public Boolean isHighPercentOfMatch {get;set;}
  119. public String accObjectName {get;set;}
  120. public Id accObjectId {get;set;}
  121. public Boolean isSendingEmailRequired {get;set;}
  122. global Integer compareTo(Object compareTo){
  123. matchingOpp compareToOpp = (matchingOpp)compareTo;
  124. if((matchingPercent + matchingPercentAddress) == (compareToOpp.matchingPercent + compareToOpp.matchingPercentAddress)){
  125. return 0;
  126. }
  127. if((matchingPercent + matchingPercentAddress) > (compareToOpp.matchingPercent + compareToOpp.matchingPercentAddress)){
  128. return -1;
  129. }
  130. return 1;
  131. }
  132. public matchingOpp(Opportunity opp, String lang){
  133. oppId = opp.Id;
  134. oppName = opp.Name;
  135. if(lang == String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN)){
  136. addressValue = opp.Account.AddressValueRUS__c;
  137. } else {
  138. addressValue = opp.Account.AddressValueENG__c;
  139. }
  140. matchingPercent = 0;
  141. matchingPercentAddress = 0;
  142. oppOwnerId = opp.OwnerId;
  143. isHighPercentOfMatch = false;
  144. accObjectName = opp.Account.Name;
  145. accObjectId = opp.AccountId;
  146. }
  147. }
  148.  
  149. global class matchingAcc implements Comparable{
  150. public Id accId {get;set;}
  151. public String accName {get;set;}
  152. public Double matchingPercent {get;set;}
  153. public Double matchingPercentAddress {get;set;}
  154. public String createButtonUrl {get;set;}
  155. public String addressValue {get;set;}
  156. global Integer compareTo(Object compareTo){
  157. matchingAcc compareToAcc = (matchingAcc)compareTo;
  158. if((matchingPercent + matchingPercentAddress) == (compareToAcc.matchingPercent + compareToAcc.matchingPercentAddress)){
  159. return 0;
  160. }
  161. if((matchingPercent + matchingPercentAddress) > (compareToAcc.matchingPercent + compareToAcc.matchingPercentAddress)){
  162. return -1;
  163. }
  164. return 1;
  165. }
  166. public matchingAcc(Account acc, String lang){
  167. accId = acc.Id;
  168. accName = acc.Name;
  169. if(lang == String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN)){
  170. addressValue = acc.AddressValueRUS__c;
  171. } else {
  172. addressValue = acc.AddressValueENG__c;
  173. }
  174. matchingPercent = 0;
  175. matchingPercentAddress = 0;
  176. }
  177.  
  178. }
  179.  
  180. public void performSearch(){
  181.  
  182. recieveAddressFieldValues();
  183. runFuzzySearch();
  184. defineFurtherActionLogic();
  185.  
  186. }
  187.  
  188. public void fillSelectedIDs(){
  189.  
  190. for(String param : Apexpages.currentPage().getParameters().keySet()){
  191.  
  192. String paramValue = Apexpages.currentPage().getParameters().get(param);
  193.  
  194. if(param == COUNTRY_PARAMETER){
  195. this.selectedCountryID = paramValue;
  196. }else if(param == OKRUG_PARAMETER){
  197. this.selectedOkrugID = paramValue;
  198. }else if(param == REGION_PARAMETER){
  199. this.selectedRegionID = paramValue;
  200. }else if(param == DISTRICT_PARAMETER){
  201. this.selectedDistrictID = paramValue;
  202. }else if(param == CITY_PARAMETER){
  203. this.selectedCityID = paramValue;
  204. }else if(param == LIVEPLACE_PARAMETER){
  205. this.selectedCommunityID = paramValue;
  206. }
  207. }
  208. }
  209.  
  210. public void recieveAddressFieldValues(){
  211.  
  212. fillSelectedIDs();
  213.  
  214. Object emptyValue = String.valueOf('');
  215.  
  216. projectOrg.put('okrugRUS__c', emptyValue);
  217. projectOrg.put('okrugENG__c', emptyValue);
  218. projectOrg.put('regionRUS__c', emptyValue);
  219. projectOrg.put('regionENG__c', emptyValue);
  220. projectOrg.put('districtRUS__c', emptyValue);
  221. projectOrg.put('districtENG__c', emptyValue);
  222. projectOrg.put('cityRUS__c', emptyValue);
  223. projectOrg.put('cityENG__c', emptyValue);
  224. projectOrg.put('livePlaceRUS__c', emptyValue);
  225. projectOrg.put('livePlaceENG__c', emptyValue);
  226.  
  227. language = Apexpages.currentPage().getParameters().get('langVal');
  228.  
  229. projectOrg.put('countryTerritory__c', prepareIDFromParamString(this.selectedCountryID));
  230.  
  231. if((CommonTools.isStringEmpty(this.selectedOkrugID)) || (JSON_MANUAL_STRING == this.selectedOkrugID)){
  232.  
  233. String okrugText = Apexpages.currentPage().getParameters().get('okrugTextVal');
  234. Object okrugValue=String.valueOf(okrugText);
  235. if(language == String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN)){
  236. projectOrg.put('okrugRUS__c', okrugValue);
  237. } else {
  238. projectOrg.put('okrugENG__c', okrugValue);
  239. }
  240.  
  241. } else {
  242. projectOrg.put('areaTerritory__c', prepareIDFromParamString(this.selectedOkrugID));
  243. }
  244.  
  245. if((CommonTools.isStringEmpty(this.selectedRegionID)) || (JSON_MANUAL_STRING == this.selectedRegionID)){
  246. String regionText = Apexpages.currentPage().getParameters().get('regionTextVal');
  247. Object regionValue=String.valueOf(regionText);
  248. if(language == String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN)){
  249. projectOrg.put('regionRUS__c', regionValue);
  250. } else {
  251. projectOrg.put('regionENG__c', regionValue);
  252. }
  253.  
  254. } else {
  255. projectOrg.put('regionTerritory__c', prepareIDFromParamString(this.selectedRegionID));
  256. }
  257.  
  258. if((CommonTools.isStringEmpty(this.selectedDistrictID)) || (JSON_MANUAL_STRING == this.selectedDistrictID)){
  259. String districtText = Apexpages.currentPage().getParameters().get('districtTextVal');
  260. Object districtValue=String.valueOf(districtText);
  261. if(language == String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN)){
  262. projectOrg.put('districtRUS__c', districtValue);
  263. } else {
  264. projectOrg.put('districtENG__c', districtValue);
  265. }
  266.  
  267. } else {
  268. projectOrg.put('districtTerritory__c', prepareIDFromParamString(this.selectedDistrictID));
  269. }
  270.  
  271. if((CommonTools.isStringEmpty(this.selectedCityID)) || (JSON_MANUAL_STRING == this.selectedCityID)){
  272. String cityText = Apexpages.currentPage().getParameters().get('cityTextVal');
  273. Object cityValue=String.valueOf(cityText);
  274. if(language == String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN)){
  275. projectOrg.put('cityRUS__c', cityValue);
  276. } else {
  277. projectOrg.put('cityENG__c', cityValue);
  278. }
  279. } else {
  280. projectOrg.put('cityTerritory__c', prepareIDFromParamString(this.selectedCityID));
  281. }
  282.  
  283. if((CommonTools.isStringEmpty(this.selectedCommunityID)) || (JSON_MANUAL_STRING ==this.selectedCommunityID)){
  284. String liveplaceText = Apexpages.currentPage().getParameters().get('liveplaceTextVal');
  285. Object liveplaceValue=String.valueOf(liveplaceText);
  286. if(language == String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN)){
  287. projectOrg.put('livePlaceRUS__c', liveplaceValue);
  288. } else {
  289. projectOrg.put('livePlaceENG__c', liveplaceValue);
  290. }
  291. } else {
  292. projectOrg.put('localityTerritory__c', prepareIDFromParamString(this.selectedCommunityID));
  293. }
  294.  
  295. String streetValue = Apexpages.currentPage().getParameters().get('streetVal');
  296. String dwellingTypeValue = Apexpages.currentPage().getParameters().get('dwellingTypeVal');
  297. String dwellingValue = Apexpages.currentPage().getParameters().get('dwellingVal');
  298. String buildingTypeValue = Apexpages.currentPage().getParameters().get('buildingTypeVal');
  299. String buildingValue = Apexpages.currentPage().getParameters().get('buildingVal');
  300. String apartmentTypeValue = Apexpages.currentPage().getParameters().get('apartmentTypeVal');
  301. String apartmentValue = Apexpages.currentPage().getParameters().get('apartmentVal');
  302. String postcodeValue = Apexpages.currentPage().getParameters().get('postcodeVal');
  303. String commentValue = Apexpages.currentPage().getParameters().get('commentVal');
  304.  
  305. if(language == String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN)){
  306.  
  307. projectOrg.put('street__c', streetValue);
  308. projectOrg.put('houseOwnership__c', dwellingTypeValue);
  309. projectOrg.put('houseBuildingLiter__c', buildingTypeValue);
  310. projectOrg.put('build__c', dwellingValue);
  311. projectOrg.put('housing__c', buildingValue);
  312. projectOrg.put('flatOffice__c', apartmentTypeValue);
  313. projectOrg.put('flat__c', apartmentValue);
  314.  
  315. } else {
  316.  
  317. projectOrg.put('streetENG__c', streetValue);
  318. projectOrg.put('houseOwnership__c', dwellingTypeValue);
  319. projectOrg.put('houseBuildingLiter__c', buildingTypeValue);
  320. projectOrg.put('buildENG__c', dwellingValue);
  321. projectOrg.put('housingENG__c', buildingValue);
  322. projectOrg.put('flatOffice__c', apartmentTypeValue);
  323. projectOrg.put('flatENG__c', apartmentValue);
  324.  
  325. }
  326.  
  327. projectOrg.put('index__c', postcodeValue);
  328.  
  329. projectOrg.put('adressComment__c', commentValue);
  330.  
  331. system.debug('project organization >> '+projectOrg);
  332.  
  333. }
  334.  
  335. public void runFuzzySearch(){
  336. // take some info from DB for further fuzzy search logic
  337. bringRequiredInfo();
  338. //creating helper maps
  339. addressMatchingPercentMapForProject = new map<Id, Double>();
  340. addressMatchingPercentMapForObject = new map<Id, Double>();
  341. //search project Opportinities
  342. if(!CommonTools.isListEmpty(allOpportunitiesList)){
  343.  
  344. matchingOpps = new map<Id, matchingOpp>();
  345.  
  346. for(Opportunity o : allOpportunitiesList){
  347.  
  348. compareSingleAddress(projectOrg, null, null, o, matchingOpps, language);
  349. compareNames(project.Name, o, matchingOpps, null, null, 'OPP_COMPARE');
  350.  
  351. }
  352.  
  353. if(!matchingOpps.isEmpty()){
  354. areMatchingOppsFound = true;
  355. } else {
  356. areMatchingOppsFound = false;
  357. }
  358.  
  359. } else {
  360. areMatchingOppsFound = false;
  361. }
  362.  
  363. //search object Accounts
  364. if(!CommonTools.isListEmpty(allAccountObjectsList)){
  365.  
  366. matchingAccs = new map<Id, matchingAcc>();
  367.  
  368. for(Account a : allAccountObjectsList){
  369.  
  370. compareSingleAddress(projectOrg, a, matchingAccs, null, null, language);
  371. compareNames(projectOrg.Name, null, null, a, matchingAccs, 'ACC_COMPARE');
  372.  
  373. }
  374.  
  375. if(!matchingAccs.isEmpty()){
  376. areMatchingAccsFound = true;
  377. } else {
  378. areMatchingAccsFound = false;
  379. }
  380.  
  381. } else {
  382. areMatchingAccsFound = false;
  383. }
  384.  
  385. if(!areMatchingOppsFound && !areMatchingAccsFound){
  386. isSearchResult = false;
  387. isNothingFound = true;
  388. } else {
  389. isSearchResult = true;
  390. isNothingFound = false;
  391. }
  392. }
  393.  
  394. private void runFuzzySearchForLead(){
  395. // also take some info from DB for further fuzzy search logic
  396. bringRequiredInfo();
  397. //creating helper maps
  398. addressMatchingPercentMapForProject = new map<Id, Double>();
  399. addressMatchingPercentMapForObject = new map<Id, Double>();
  400.  
  401. //search project Opportinities
  402. if(!CommonTools.isListEmpty(allOpportunitiesList)){
  403.  
  404. matchingOpps = new map<Id, matchingOpp>();
  405.  
  406. if(pageLead.OpportunityId__c == null){
  407. for(Opportunity o : allOpportunitiesList){
  408.  
  409. compareSingleAddressForLead(pageLead, null, null, o, matchingOpps);
  410. compareNames(pageLead.ProjectName__c, o, matchingOpps, null, null, 'OPP_COMPARE');
  411.  
  412. }
  413. }
  414.  
  415. if(!matchingOpps.isEmpty()){
  416. areMatchingOppsFound = true;
  417. } else {
  418. areMatchingOppsFound = false;
  419. }
  420.  
  421. } else {
  422. areMatchingOppsFound = false;
  423. }
  424.  
  425. //search object Accounts
  426. if(!CommonTools.isListEmpty(allAccountObjectsList)){
  427.  
  428. matchingAccs = new map<Id, matchingAcc>();
  429.  
  430. if(pageLead.AccountId__c == null){
  431. for(Account a : allAccountObjectsList){
  432.  
  433. compareSingleAddressForLead(pageLead, a, matchingAccs, null, null);
  434. compareNames(pageLead.Company_name__c, null, null, a, matchingAccs, 'ACC_COMPARE');
  435.  
  436. }
  437. }
  438.  
  439. if(!matchingAccs.isEmpty()){
  440. areMatchingAccsFound = true;
  441. } else {
  442. areMatchingAccsFound = false;
  443. }
  444.  
  445. } else {
  446. areMatchingAccsFound = false;
  447. }
  448.  
  449. if((pageLead.OpportunityId__c == null || pageLead.AccountId__c == null) && !areMatchingOppsFound && !areMatchingAccsFound){
  450. isSearchResult = false;
  451. isNothingFound = true;
  452. } else if(pageLead.OpportunityId__c != null && pageLead.AccountId__c != null) {
  453. isNothingFound = false;
  454. isNotNecessaryToSearch = true;
  455. } else {
  456. isSearchResult = true;
  457. isNothingFound = false;
  458. }
  459.  
  460. }
  461.  
  462. private void compareNames(String nameString, Opportunity dbOpp, map<Id, matchingOpp> inputMatchingOpps, Account dbAcc, map<Id, matchingAcc> inputMatchingAccs, String compareType){
  463.  
  464. String nameLowerCase = nameString.toLowerCase();
  465. String dbNameLowerCase;
  466. if(compareType == 'OPP_COMPARE'){
  467. dbNameLowerCase = dbOpp.Name.toLowerCase();
  468. } else if (compareType == 'ACC_COMPARE') {
  469. dbNameLowerCase = dbAcc.Name.toLowerCase();
  470. }
  471.  
  472. List<String> nameLowerCaseArray = nameLowerCase.split('\\s*(=>|,|\\s)\\s*');
  473. List<String> dbNameLowerCaseArray = dbNameLowerCase.split('\\s*(=>|,|\\s)\\s*');
  474.  
  475. Double compareResult;
  476. if(nameLowerCaseArray.size() > 1){
  477.  
  478. List<String> shuffledWords = new List<String>();
  479. doShuffleStringInList(nameLowerCaseArray, shuffledWords);
  480.  
  481. List<Double> tempCompareResultList = new List<Double>();
  482. for(String shuffled : shuffledWords){
  483. Double tempCompareResult = getStringsMatchPercent(shuffled, dbNameLowerCase);
  484. tempCompareResultList.add(tempCompareResult);
  485. }
  486. tempCompareResultList.sort();
  487. compareResult = tempCompareResultList.get(tempCompareResultList.size()-1);
  488.  
  489. } else {
  490.  
  491. if(dbNameLowerCaseArray.size() > 1){
  492.  
  493. Double wordToPhraseCompareResult = 0.0;
  494. String dbOppNameToCompare = dbNameLowerCase.replaceAll('\\s*(=>|,|\\s)\\s*', '');
  495. for(String s : dbNameLowerCaseArray){
  496. Double tempCompareResult = getStringsMatchPercent(nameLowerCase, s);
  497. wordToPhraseCompareResult += tempCompareResult * (s.length()/Double.valueOf(String.valueOf(dbOppNameToCompare.length())));
  498. }
  499.  
  500. compareResult = wordToPhraseCompareResult;
  501.  
  502. } else {
  503. compareResult = getStringsMatchPercent(nameLowerCase, dbNameLowerCase);
  504. }
  505.  
  506. }
  507.  
  508. if(compareType == 'OPP_COMPARE'){
  509. if(inputMatchingOpps.containsKey(dbOpp.Id) && inputMatchingOpps.get(dbOpp.Id).matchingPercentAddress >= 50){
  510. inputMatchingOpps.get(dbOpp.Id).matchingPercent = compareResult;
  511. } else if (compareResult >= 50){
  512. matchingOpp mOpp = new matchingOpp(dbOpp, language);
  513. mOpp.matchingPercent = compareResult;
  514. mOpp.oppOwnerName = dbOpp.Owner.Name;
  515. mOpp.oppOwnerDivision = dbOpp.Owner.UserDivision__c;
  516. mOpp.oppOwnerId = dbOpp.OwnerId;
  517. if(addressMatchingPercentMapForProject.containsKey(dbOpp.Id)){
  518. mOpp.matchingPercentAddress = addressMatchingPercentMapForProject.get(dbOpp.Id);
  519. }
  520. inputMatchingOpps.put(mOpp.oppId, mOpp);
  521. }
  522. } else if(compareType == 'ACC_COMPARE') {
  523. if(inputMatchingAccs.containsKey(dbAcc.Id) && inputMatchingAccs.get(dbAcc.Id).matchingPercentAddress >= 50){
  524. inputMatchingAccs.get(dbAcc.Id).matchingPercent = compareResult;
  525. } else if(compareResult >= 50) {
  526. matchingAcc mAcc = new matchingAcc(dbAcc, language);
  527. mAcc.matchingPercent = compareResult;
  528. if(addressMatchingPercentMapForObject.containsKey(dbAcc.Id)){
  529. mAcc.matchingPercentAddress = addressMatchingPercentMapForObject.get(dbAcc.Id);
  530. }
  531. inputMatchingAccs.put(mAcc.accId, mAcc);
  532. }
  533.  
  534. }
  535.  
  536. }
  537.  
  538. private Double getStringsMatchPercent(String s1, String s2){
  539.  
  540. if(CommonTools.isStringEmpty(s1) || CommonTools.isStringEmpty(s2)) return 0.0;
  541.  
  542. Integer matchI = s1.getLevenshteinDistance(s2, MAX_LEVENSHTEIN_DISTANCE);
  543. if(matchI < MAX_LEVENSHTEIN_DISTANCE && matchI != -1){
  544. Double biggestWordLength = Double.valueOf(String.valueOf(Math.max(s1.length(), s2.length())));
  545. return ((biggestWordLength - matchI) / biggestWordLength)*100;
  546. } else {
  547. /* BIRD */
  548.  
  549. ////
  550. return 0.0;
  551. //
  552. }
  553.  
  554. }
  555.  
  556. public void defineFurtherActionLogic(){
  557.  
  558. // define url for buttons for matching objects table
  559. if(areMatchingAccsFound){
  560. isHighLevelOfMatchingPercentOpps = isHighLevelOfMatchingPercentOpps(matchingOpps);
  561. Boolean isCurrentUserOwnerOfHighMatchingOpps = isCurrentUserOwnerOfHighMatchingOpps(highMatchingOppsWithAccObjIdKeys);
  562. Boolean isCurrentUserDivisionSameAsOwner = isCurrentUserDivisionSameAsOwner(highMatchingOppsWithAccObjIdKeys);
  563. for(matchingAcc mAcc : matchingAccs.values()){
  564. if(highMatchingOppsWithAccObjIdKeysSet.contains(mAcc.accId)){
  565. if(isCurrentUserOwnerOfHighMatchingOpps){
  566. String opportunitySObjectPrefix = Schema.getGlobalDescribe().get('Opportunity').getDescribe().getKeyPrefix();
  567. mAcc.createButtonUrl = '/'+opportunitySObjectPrefix+'/e?opp3='+project.Name+'&'+'opp4_lkid'+'='+mAcc.accId+'&'+'opp4'+'='+mAcc.accName;
  568. } else if(isCurrentUserDivisionSameAsOwner) {
  569. //
  570. // Create sysObj for ids
  571. //
  572. String opportunitySObjectPrefix = Schema.getGlobalDescribe().get('Opportunity').getDescribe().getKeyPrefix();
  573. mAcc.createButtonUrl = '/'+opportunitySObjectPrefix+'/e?opp3='+project.Name+'&'+'opp4_lkid'+'='+mAcc.accId+'&'+'opp4'+'='+mAcc.accName+'&'+'00N110000010n1C'+'='+'1';
  574. } else {
  575. List<matchingOpp> highMatchingOppsSorted = highMatchingOppsWithAccObjIdKeys;
  576. highMatchingOppsSorted.sort();
  577. String leadSObjectPrefix = Schema.getGlobalDescribe().get('Lead').getDescribe().getKeyPrefix();
  578. String additionalParamsToPass = '&name_lastlea2=(-)&lea3=(-)&00N11000000dWMF=(-)&00N11000000m5O4=(-)&lea4=(-)';
  579. mAcc.createButtonUrl = '/'+leadSObjectPrefix+'/e?00N11000000m5O4='+project.Name+'&'+'CF00N11000000d8Jv_lkid'+'='+mAcc.accId+'&'+'CF00N11000000d8Jv'+'='+mAcc.accName+'&'+'00N110000010rZc'+'='+'1'+'&'+'CF00N110000010wA8_lkid'+'='+highMatchingOppsSorted[0].oppOwnerId+'&'+'CF00N110000010wA8'+'='+highMatchingOppsSorted[0].oppOwnerName+additionalParamsToPass;
  580. }
  581.  
  582. } else {
  583. String opportunitySObjectPrefix = Schema.getGlobalDescribe().get('Opportunity').getDescribe().getKeyPrefix();
  584. mAcc.createButtonUrl = '/'+opportunitySObjectPrefix+'/e?opp3='+project.Name+'&'+'opp4_lkid'+'='+mAcc.accId+'&'+'opp4'+'='+mAcc.accName;
  585. }
  586.  
  587. }
  588. }
  589.  
  590. if((!isHighLevelOfMatchingPercentAccs(matchingAccs) && !isHighLevelOfMatchingPercentOpps(matchingOpps)) || !isHighLevelOfMatchingPercentOpps(matchingOpps)){
  591. isReadyToCreateAccObj = true;
  592. } else {
  593. isReadyToCreateAccObj = false;
  594. }
  595.  
  596. if(isHighLevelOfMatchingPercentAccs(matchingAccs) && !isHighLevelOfMatchingPercentOpps(matchingOpps)){
  597. isCreateButtonVisible = false;
  598. } else {
  599. isCreateButtonVisible = true;
  600. }
  601.  
  602. matchingAccsSorted = matchingAccs.values();
  603. matchingAccsSorted.sort();
  604.  
  605. matchingOppsSorted = matchingOpps.values();
  606. matchingOppsSorted.sort();
  607.  
  608. matchingAccsSortedMini = new List<matchingAcc>();
  609. matchingOppsSortedMini = new List<matchingOpp>();
  610.  
  611. if(matchingAccsSorted != null && matchingAccsSorted.size() > 0){
  612. if(matchingAccsSorted.size() <= MAX_ROWS_IN_MINI_TABLES){
  613. matchingAccsSortedMini = matchingAccsSorted;
  614. } else {
  615. for(Integer i=0; i<MAX_ROWS_IN_MINI_TABLES; i++){
  616. matchingAccsSortedMini.add(matchingAccsSorted[i]);
  617. }
  618. }
  619. }
  620. if(matchingOppsSorted != null && matchingOppsSorted.size() > 0){
  621. if(matchingOppsSorted.size() <= MAX_ROWS_IN_MINI_TABLES){
  622. matchingOppsSortedMini = matchingOppsSorted;
  623. } else {
  624. for(Integer i=0; i<MAX_ROWS_IN_MINI_TABLES; i++){
  625. matchingOppsSortedMini.add(matchingOppsSorted[i]);
  626. }
  627. }
  628. }
  629.  
  630. }
  631.  
  632. public void defineFurtherActionLogicForLead(){
  633.  
  634. matchingAccsSorted = matchingAccs.values();
  635. matchingAccsSorted.sort();
  636.  
  637. matchingOppsSorted = matchingOpps.values();
  638. matchingOppsSorted.sort();
  639.  
  640. matchingAccsSortedMini = new List<matchingAcc>();
  641. matchingOppsSortedMini = new List<matchingOpp>();
  642.  
  643. if(matchingAccsSorted != null && matchingAccsSorted.size() > 0){
  644. if(matchingAccsSorted.size() <= MAX_ROWS_IN_MINI_TABLES){
  645. matchingAccsSortedMini = matchingAccsSorted;
  646. } else {
  647. for(Integer i=0; i<MAX_ROWS_IN_MINI_TABLES; i++){
  648. matchingAccsSortedMini.add(matchingAccsSorted[i]);
  649. }
  650. }
  651. }
  652. if(matchingOppsSorted != null && matchingOppsSorted.size() > 0){
  653. if(matchingOppsSorted.size() <= MAX_ROWS_IN_MINI_TABLES){
  654. matchingOppsSortedMini = matchingOppsSorted;
  655. } else {
  656. for(Integer i=0; i<MAX_ROWS_IN_MINI_TABLES; i++){
  657. matchingOppsSortedMini.add(matchingOppsSorted[i]);
  658. }
  659. }
  660. }
  661.  
  662. }
  663.  
  664. private Boolean isHighLevelOfMatchingPercentOpps(map<Id, matchingOpp> opps){
  665. Boolean res = false;
  666. highMatchingOppsWithAccObjIdKeys = new List<matchingOpp>();
  667. highMatchingOppsWithAccObjIdKeysSet = new set<Id>();
  668. if(opps != null && !opps.isEmpty()){
  669. for(matchingOpp mo : opps.values()){
  670. if(mo.matchingPercentAddress >= 75 || (mo.matchingPercentAddress + mo.matchingPercent) >= 150){
  671. mo.isHighPercentOfMatch = true;
  672. res = true;
  673. if(mo.accObjectId != null){
  674. highMatchingOppsWithAccObjIdKeys.add(mo);
  675. highMatchingOppsWithAccObjIdKeysSet.add(mo.accObjectId);
  676. }
  677. }
  678. }
  679. }
  680. return res;
  681. }
  682.  
  683. private Boolean isHighLevelOfMatchingPercentAccs(map<Id, matchingAcc> accs){
  684. Boolean res = false;
  685. if(accs != null && !accs.isEmpty()){
  686. for(matchingAcc ma : accs.values()){
  687. if(ma.matchingPercentAddress >= 75 || (ma.matchingPercentAddress + ma.matchingPercent) >= 150){
  688. res = true;
  689. }
  690. }
  691. }
  692. return res;
  693. }
  694.  
  695. private Account createNewObjectAccount(){
  696.  
  697. try{
  698. insert projectOrg;
  699.  
  700. SystemObject__c so = new SystemObject__c();
  701. so.Name = projectOrg.Id;
  702. so.ObjectAccountToCheck__c = projectOrg.Id;
  703. so.Type__c = 'ObjectAccountToCheck';
  704. insert so;
  705.  
  706. return projectOrg;
  707. } catch(Exception ex) {
  708. system.debug('Exception occured while creating Account object and creating system object: ' + ex.getMessage() + ' > ' + ex.getStackTraceString());
  709. return null;
  710. }
  711.  
  712. }
  713.  
  714. public PageReference createNewObjAccAndNewProjOpp(){
  715.  
  716. String urlToRedirectTo = '';
  717. PageReference pageRef;
  718.  
  719.  
  720. if((isHighLevelOfMatchingPercentAccs(matchingAccs) && isHighLevelOfMatchingPercentOpps(matchingOpps)) || isHighLevelOfMatchingPercentOpps(matchingOpps)){
  721.  
  722. if(isCurrentUserOwnerOfHighMatchingOpps(highMatchingOppsWithAccObjIdKeys)){
  723. Account objAcc = createNewObjectAccount();
  724. String opportunitySObjectPrefix = Schema.getGlobalDescribe().get('Opportunity').getDescribe().getKeyPrefix();
  725. urlToRedirectTo = '/'+opportunitySObjectPrefix+'/e?';
  726. pageRef = new PageReference(urlToRedirectTo);
  727. pageRef.getParameters().put('opp3', project.Name);
  728. pageRef.getParameters().put('opp4_lkid', objAcc.Id);
  729. pageRef.getParameters().put('opp4', objAcc.Name);
  730. } else if(isCurrentUserDivisionSameAsOwner(highMatchingOppsWithAccObjIdKeys)){
  731. Account objAcc = createNewObjectAccount();
  732. String opportunitySObjectPrefix = Schema.getGlobalDescribe().get('Opportunity').getDescribe().getKeyPrefix();
  733. urlToRedirectTo = '/'+opportunitySObjectPrefix+'/e?';
  734. pageRef = new PageReference(urlToRedirectTo);
  735. pageRef.getParameters().put('opp3', project.Name);
  736. pageRef.getParameters().put('opp4_lkid', objAcc.Id);
  737. pageRef.getParameters().put('opp4', objAcc.Name);
  738. String idsForEmails = getUserIdsToSendEmails(highMatchingOppsWithAccObjIdKeys);
  739. if(idsForEmails != ''){
  740. Id soId = getCreatedSystemObjectId(idsForEmails);
  741. pageRef.getParameters().put('CF00N110000010zhM', soId);
  742. }
  743. pageRef.getParameters().put('00N110000010n1C', '1');
  744. } else {
  745. String leadSObjectPrefix = Schema.getGlobalDescribe().get('Lead').getDescribe().getKeyPrefix();
  746. urlToRedirectTo = '/'+leadSObjectPrefix+'/e?';
  747. pageRef = new PageReference(urlToRedirectTo);
  748. pageRef.getParameters().put('00N11000000m5O4', project.Name);
  749. pageRef.getParameters().put('00N11000000dWMF', projectOrg.Name);
  750. pageRef.getParameters().put('00N110000010rZc', '1'); // approval process logic
  751.  
  752. List<matchingOpp> highMatchingOppsSorted = highMatchingOppsWithAccObjIdKeys;
  753. highMatchingOppsSorted.sort();
  754. pageRef.getParameters().put('CF00N110000010wA8_lkid', highMatchingOppsSorted[0].oppOwnerId);
  755. pageRef.getParameters().put('CF00N110000010wA8', highMatchingOppsSorted[0].oppOwnerName);
  756. // additional parameters to pass
  757. pageRef.getParameters().put('name_lastlea2', '(-)');
  758. pageRef.getParameters().put('lea3', '(-)');
  759. pageRef.getParameters().put('00N11000000dWMF', '(-)');
  760. pageRef.getParameters().put('00N11000000m5O4', '(-)');
  761. pageRef.getParameters().put('lea4', '(-)');
  762. }
  763.  
  764. } else {
  765. Account objAcc = createNewObjectAccount();
  766. String opportunitySObjectPrefix = Schema.getGlobalDescribe().get('Opportunity').getDescribe().getKeyPrefix();
  767. urlToRedirectTo = '/'+opportunitySObjectPrefix+'/e?';
  768. pageRef = new PageReference(urlToRedirectTo);
  769. pageRef.getParameters().put('opp3', project.Name);
  770. pageRef.getParameters().put('opp4_lkid', objAcc.Id);
  771. pageRef.getParameters().put('opp4', objAcc.Name);
  772. }
  773. pageRef.setRedirect(true);
  774. return pageRef;
  775.  
  776. }
  777.  
  778. private Id getObjectTypeAccountRT(){
  779. List<RecordType> RTIdList = [SELECT Id FROM RecordType WHERE DeveloperName = :DEV_NAME_RT_OBJECT_ACCOUNT];
  780. if(RTIdList != null && RTIdList.size() > 0){
  781. return RTIdList[0].Id;
  782. } else {
  783. return null;
  784. }
  785. }
  786.  
  787. private void bringRequiredInfo(){
  788.  
  789. allOpportunitiesList = [SELECT Id, Name, AccountId, Account.Name,
  790. Account.countryTerritory__c, Account.areaTerritory__c,
  791. Account.regionTerritory__c, Account.districtTerritory__c,
  792. Account.cityTerritory__c, Account.localityTerritory__c, Account.street__c,
  793. Address__c, Account.AddressValueRUS__c,
  794. Account.okrugENG__c, Account.regionENG__c,
  795. Account.districtENG__c, Account.cityENG__c, Account.livePlaceENG__c,
  796. Account.AddressValueENG__c, OwnerId, Owner.UserDivision__c, Owner.Name
  797. FROM Opportunity
  798. LIMIT 49999];
  799.  
  800. allAccountObjectsList = [SELECT Id, Name, AddressValueRUS__c, AddressValueENG__c,
  801. countryTerritory__c, areaTerritory__c,
  802. regionTerritory__c, districtTerritory__c,
  803. cityTerritory__c, localityTerritory__c, street__c,
  804. okrugENG__c, regionENG__c, districtENG__c,
  805. cityENG__c, livePlaceENG__c
  806. FROM Account
  807. WHERE RecordTypeId = :OBJECT_TYPE_ACCOUNT_RT
  808. LIMIT 49999];
  809. }
  810.  
  811. private Integer checkMatchForLongString(String s1, String s2){
  812. Integer p, q, l, sum;
  813. Integer pos1 = 0;
  814. Integer pos2 = 0;
  815. Integer max = 0;
  816. List<String> arr1 = cutStringForCharsList(s1);
  817. List<String> arr2 = cutStringForCharsList(s2);
  818. Integer firstLength = arr1.size();
  819. Integer secondLength = arr2.size();
  820.  
  821. for(p = 0; p < firstLength; p++){
  822. for(q = 0; q < secondLength; q++){
  823. for (l = 0; (p + l < firstLength) && (q + l < secondLength) && (arr1[p+l] == arr2[q+l]); l++);
  824. if (l > max) {
  825. max = l;
  826. pos1 = p;
  827. pos2 = q;
  828. }
  829. }
  830. }
  831. sum = max;
  832. if (sum > 0){
  833. if (pos1 > 0 && pos2 > 0) {
  834. sum += checkMatchForLongString(s1.substring(0, pos1>firstLength ? firstLength : pos1), s2.substring(0, pos2>secondLength ? secondLength : pos2));
  835. }
  836.  
  837. if ((pos1 + max < firstLength) && (pos2 + max < secondLength)) {
  838. sum += checkMatchForLongString(s1.substring(pos1 + max, firstLength), s2.substring(pos2 + max, secondLength));
  839. }
  840. }
  841. return sum;
  842. }
  843.  
  844. private static List<String> cutStringForCharsList(String s){
  845. Integer i = 0;
  846. List<String> charsList = new List<String>();
  847. do{
  848. if(i<s.length()){
  849. charsList.add(s.substring(i, i+1));
  850. }
  851. i++;
  852. } while(i < s.length());
  853. return charsList;
  854. }
  855.  
  856. private Double testCompareMethod(String s1, String s2){
  857. Integer res = s1.getLevenshteinDistance(s2, 15);
  858. if(res < 15 && res != -1){
  859. Double biggestWordLength = Double.valueOf(String.valueOf(Math.max(s1.length(), s2.length())));
  860. return ((biggestWordLength - res) / biggestWordLength)*100;
  861. } else {
  862. return 0;
  863. }
  864.  
  865. }
  866.  
  867. private Double similarText(String s1, String s2) {
  868. s1 = s1.toLowerCase();
  869. s2 = s2.toLowerCase();
  870. return (Double)(checkMatchForLongString(s1, s2)*200)/(s1.length()+s2.length());
  871. }
  872.  
  873. private Id prepareIDFromParamString(String StringValue){
  874.  
  875. if(CommonTools.isStringEmpty(StringValue)) return null;
  876. if(StringValue == '-1') return null;
  877.  
  878. try{
  879. Id idValue = Id.valueOf(StringValue);
  880. return idValue;
  881. }catch(Exception e){
  882. return null;
  883. }
  884. return null;
  885. }
  886.  
  887. private String getTerritoryName(Id terrId, String lang){
  888. Territory__c terr = [SELECT Id, NameRUS__c, NameENG__c
  889. FROM Territory__c
  890. WHERE Id = :terrId];
  891. if(lang == String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN)){
  892. return terr.NameRUS__c;
  893. } else {
  894. return terr.NameENG__c;
  895. }
  896. }
  897.  
  898. private void compareSingleAddress(Account searchProjOrg, Account dbAcc, map<Id, matchingAcc> inputMatchingAccs, Opportunity dbOpp, map<Id, matchingOpp> inputMatchingOpps, String lang){
  899.  
  900. Integer comparableValuesNumber = 0;
  901. Double compareResult = 0.0;
  902.  
  903. if(lang != String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN)){
  904.  
  905. if(!CommonTools.isStringEmpty(searchProjOrg.countryTerritory__c)){
  906. comparableValuesNumber++;
  907. if(dbAcc != null){
  908. if(searchProjOrg.countryTerritory__c == dbAcc.countryTerritory__c){
  909. compareResult += 100;
  910. }
  911. } else if(dbOpp != null) {
  912. if(searchProjOrg.countryTerritory__c == dbOpp.Account.countryTerritory__c){
  913. compareResult += 100;
  914. }
  915. }
  916. }
  917.  
  918. if(!CommonTools.isStringEmpty(searchProjOrg.areaTerritory__c)){
  919. comparableValuesNumber++;
  920. if(dbAcc != null){
  921. if(searchProjOrg.areaTerritory__c == dbAcc.areaTerritory__c){
  922. compareResult += 100;
  923. }
  924. } else if(dbOpp != null) {
  925. if(searchProjOrg.areaTerritory__c == dbOpp.Account.areaTerritory__c){
  926. compareResult += 100;
  927. }
  928. }
  929. } else if(!CommonTools.isStringEmpty(searchProjOrg.okrugENG__c)) {
  930. comparableValuesNumber++;
  931. if(dbAcc != null){
  932. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.okrugENG__c), convertToLowerCase(dbAcc.okrugENG__c));
  933. } else if(dbOpp != null) {
  934. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.okrugENG__c), convertToLowerCase(dbOpp.Account.okrugENG__c));
  935. }
  936. }
  937.  
  938. }
  939.  
  940. if(!CommonTools.isStringEmpty(searchProjOrg.regionTerritory__c)){
  941. comparableValuesNumber++;
  942. if(dbAcc != null){
  943. if(searchProjOrg.regionTerritory__c == dbAcc.regionTerritory__c){
  944. compareResult += 100;
  945. }
  946. } else if(dbOpp != null) {
  947. if(searchProjOrg.regionTerritory__c == dbOpp.Account.regionTerritory__c){
  948. compareResult += 100;
  949. }
  950. }
  951. } else if(!CommonTools.isStringEmpty(searchProjOrg.regionENG__c)) {
  952. comparableValuesNumber++;
  953. if(dbAcc != null){
  954. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.regionENG__c), convertToLowerCase(dbAcc.regionENG__c));
  955. } else if(dbOpp != null) {
  956. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.regionENG__c), convertToLowerCase(dbOpp.Account.regionENG__c));
  957. }
  958. }
  959.  
  960. if(!CommonTools.isStringEmpty(searchProjOrg.districtTerritory__c)){
  961. comparableValuesNumber++;
  962. if(dbAcc != null){
  963. if(searchProjOrg.districtTerritory__c == dbAcc.districtTerritory__c){
  964. compareResult += 100;
  965. }
  966. } else if(dbOpp != null) {
  967. if(searchProjOrg.districtTerritory__c == dbOpp.Account.districtTerritory__c){
  968. compareResult += 100;
  969. }
  970. }
  971. } else if(!CommonTools.isStringEmpty(searchProjOrg.districtENG__c)) {
  972. comparableValuesNumber++;
  973. if(dbAcc != null){
  974. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.districtENG__c), convertToLowerCase(dbAcc.districtENG__c));
  975. } else if(dbOpp != null) {
  976. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.districtENG__c), convertToLowerCase(dbOpp.Account.districtENG__c));
  977. }
  978. }
  979.  
  980. if(!CommonTools.isStringEmpty(searchProjOrg.cityTerritory__c)){
  981. comparableValuesNumber++;
  982. if(dbAcc != null){
  983. if(searchProjOrg.cityTerritory__c == dbAcc.cityTerritory__c){
  984. compareResult += 100;
  985. }
  986. } else if(dbOpp != null) {
  987. if(searchProjOrg.cityTerritory__c == dbOpp.Account.cityTerritory__c){
  988. compareResult += 100;
  989. }
  990. }
  991. } else if(!CommonTools.isStringEmpty(searchProjOrg.cityENG__c)) {
  992. comparableValuesNumber++;
  993. if(dbAcc != null){
  994. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.cityENG__c), convertToLowerCase(dbAcc.cityENG__c));
  995. } else if(dbOpp != null) {
  996. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.cityENG__c), convertToLowerCase(dbOpp.Account.cityENG__c));
  997. }
  998. }
  999.  
  1000. if(!CommonTools.isStringEmpty(searchProjOrg.localityTerritory__c)){
  1001. comparableValuesNumber++;
  1002. if(dbAcc != null){
  1003. if(searchProjOrg.localityTerritory__c == dbAcc.localityTerritory__c){
  1004. compareResult += 100;
  1005. }
  1006. } else if(dbOpp != null) {
  1007. if(searchProjOrg.localityTerritory__c == dbOpp.Account.localityTerritory__c){
  1008. compareResult += 100;
  1009. }
  1010. }
  1011. } else if(!CommonTools.isStringEmpty(searchProjOrg.livePlaceENG__c)) {
  1012. comparableValuesNumber++;
  1013. if(dbAcc != null){
  1014. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.livePlaceENG__c), convertToLowerCase(dbAcc.livePlaceENG__c));
  1015. } else if(dbOpp != null) {
  1016. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.livePlaceENG__c), convertToLowerCase(dbOpp.Account.livePlaceENG__c));
  1017. }
  1018. }
  1019.  
  1020. if(!CommonTools.isStringEmpty(searchProjOrg.street__c)){
  1021. comparableValuesNumber++;
  1022. if(dbAcc != null){
  1023. if(lang == String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN)){
  1024. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.street__c), convertToLowerCase(dbAcc.street__c));
  1025. } else {
  1026. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.street__c), convertToLowerCase(dbAcc.streetENG__c));
  1027. }
  1028. } else if(dbOpp != null) {
  1029. if(lang == String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN)){
  1030. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.street__c), convertToLowerCase(dbOpp.Account.street__c));
  1031. } else {
  1032. compareResult += getStringsMatchPercent(convertToLowerCase(searchProjOrg.street__c), convertToLowerCase(dbOpp.Account.streetENG__c));
  1033. }
  1034. }
  1035. }
  1036.  
  1037. if(comparableValuesNumber == 0){
  1038. compareResult = 0;
  1039. } else {
  1040. compareResult = compareResult / comparableValuesNumber;
  1041. }
  1042.  
  1043. if(compareResult >= 50){
  1044. if(dbOpp != null){
  1045. matchingOpp mOpp = new matchingOpp(dbOpp, language);
  1046. mOpp.oppOwnerName = dbOpp.Owner.Name;
  1047. mOpp.oppOwnerDivision = dbOpp.Owner.UserDivision__c;
  1048. mOpp.matchingPercentAddress = compareResult;
  1049. inputMatchingOpps.put(mOpp.oppId, mOpp);
  1050. } else if(dbAcc != null) {
  1051. matchingAcc mAcc = new matchingAcc(dbAcc, lang);
  1052. mAcc.matchingPercentAddress = compareResult;
  1053. inputMatchingAccs.put(mAcc.accId, mAcc);
  1054. }
  1055. } else if(compareResult > 0) {
  1056. if(dbOpp != null){
  1057. addressMatchingPercentMapForProject.put(dbOpp.Id, compareResult);
  1058. } else if(dbAcc != null) {
  1059. addressMatchingPercentMapForObject.put(dbAcc.Id, compareResult);
  1060. }
  1061. }
  1062.  
  1063. }
  1064.  
  1065. private void compareSingleAddressForLead(Lead inputLead, Account dbAcc, map<Id, matchingAcc> inputMatchingAccs, Opportunity dbOpp, map<Id, matchingOpp> inputMatchingOpps){
  1066.  
  1067. Integer comparableValuesNumber = 0;
  1068. Double compareResult = 0.0;
  1069.  
  1070. String lng = String.valueOf(LanguageProcessor.LANGUAGE.RUSSIAN);
  1071.  
  1072. if(inputLead.countryTerritory__c != russiaCountryTerritoryRecordId){
  1073.  
  1074. lng = String.valueOf(LanguageProcessor.LANGUAGE.ENGLISH);
  1075.  
  1076. if(!CommonTools.isStringEmpty(inputLead.countryTerritory__c)){
  1077. comparableValuesNumber++;
  1078. if(dbAcc != null){
  1079. if(inputLead.countryTerritory__c == dbAcc.countryTerritory__c){
  1080. compareResult += 100;
  1081. }
  1082. } else if(dbOpp != null) {
  1083. if(inputLead.countryTerritory__c == dbOpp.Account.countryTerritory__c){
  1084. compareResult += 100;
  1085. }
  1086. }
  1087. }
  1088.  
  1089. if(!CommonTools.isStringEmpty(inputLead.areaTerritory__c)){
  1090. comparableValuesNumber++;
  1091. if(dbAcc != null){
  1092. if(inputLead.areaTerritory__c == dbAcc.areaTerritory__c){
  1093. compareResult += 100;
  1094. }
  1095. } else if(dbOpp != null) {
  1096. if(inputLead.areaTerritory__c == dbOpp.Account.areaTerritory__c){
  1097. compareResult += 100;
  1098. }
  1099. }
  1100. } else if(!CommonTools.isStringEmpty(inputLead.okrugENG__c)) {
  1101. comparableValuesNumber++;
  1102. if(dbAcc != null){
  1103. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.okrugENG__c), convertToLowerCase(dbAcc.okrugENG__c));
  1104. } else if(dbOpp != null) {
  1105. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.okrugENG__c), convertToLowerCase(dbOpp.Account.okrugENG__c));
  1106. }
  1107. }
  1108. }
  1109.  
  1110. if(!CommonTools.isStringEmpty(inputLead.regionTerritory__c)){
  1111. comparableValuesNumber++;
  1112. if(dbAcc != null){
  1113. if(inputLead.regionTerritory__c == dbAcc.regionTerritory__c){
  1114. compareResult += 100;
  1115. }
  1116. } else if(dbOpp != null) {
  1117. if(inputLead.regionTerritory__c == dbOpp.Account.regionTerritory__c){
  1118. compareResult += 100;
  1119. }
  1120. }
  1121. } else if(!CommonTools.isStringEmpty(inputLead.regionENG__c)) {
  1122. comparableValuesNumber++;
  1123. if(dbAcc != null){
  1124. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.regionENG__c), convertToLowerCase(dbAcc.regionENG__c));
  1125. } else if(dbOpp != null) {
  1126. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.regionENG__c), convertToLowerCase(dbOpp.Account.regionENG__c));
  1127. }
  1128. }
  1129.  
  1130. if(!CommonTools.isStringEmpty(inputLead.districtTerritory__c)){
  1131. comparableValuesNumber++;
  1132. if(dbAcc != null){
  1133. if(inputLead.districtTerritory__c == dbAcc.districtTerritory__c){
  1134. compareResult += 100;
  1135. }
  1136. } else if(dbOpp != null) {
  1137. if(inputLead.districtTerritory__c == dbOpp.Account.districtTerritory__c){
  1138. compareResult += 100;
  1139. }
  1140. }
  1141. } else if(!CommonTools.isStringEmpty(inputLead.districtENG__c)) {
  1142. comparableValuesNumber++;
  1143. if(dbAcc != null){
  1144. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.districtENG__c), convertToLowerCase(dbAcc.districtENG__c));
  1145. } else if(dbOpp != null) {
  1146. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.districtENG__c), convertToLowerCase(dbOpp.Account.districtENG__c));
  1147. }
  1148. }
  1149.  
  1150. if(!CommonTools.isStringEmpty(inputLead.cityTerritory__c)){
  1151. comparableValuesNumber++;
  1152. if(dbAcc != null){
  1153. if(inputLead.cityTerritory__c == dbAcc.cityTerritory__c){
  1154. compareResult += 100;
  1155. }
  1156. } else if(dbOpp != null) {
  1157. if(inputLead.cityTerritory__c == dbOpp.Account.cityTerritory__c){
  1158. compareResult += 100;
  1159. }
  1160. }
  1161. } else if(!CommonTools.isStringEmpty(inputLead.cityENG__c)) {
  1162. comparableValuesNumber++;
  1163. if(dbAcc != null){
  1164. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.cityENG__c), convertToLowerCase(dbAcc.cityENG__c));
  1165. } else if(dbOpp != null) {
  1166. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.cityENG__c), convertToLowerCase(dbOpp.Account.cityENG__c));
  1167. }
  1168. }
  1169.  
  1170. if(!CommonTools.isStringEmpty(inputLead.localityTerritory__c)){
  1171. comparableValuesNumber++;
  1172. if(dbAcc != null){
  1173. if(inputLead.localityTerritory__c == dbAcc.localityTerritory__c){
  1174. compareResult += 100;
  1175. }
  1176. } else if(dbOpp != null) {
  1177. if(inputLead.localityTerritory__c == dbOpp.Account.localityTerritory__c){
  1178. compareResult += 100;
  1179. }
  1180. }
  1181. } else if(!CommonTools.isStringEmpty(inputLead.livePlaceENG__c)) {
  1182. comparableValuesNumber++;
  1183. if(dbAcc != null){
  1184. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.livePlaceENG__c), convertToLowerCase(dbAcc.livePlaceENG__c));
  1185. } else if(dbOpp != null) {
  1186. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.livePlaceENG__c), convertToLowerCase(dbOpp.Account.livePlaceENG__c));
  1187. }
  1188. }
  1189.  
  1190. if(!CommonTools.isStringEmpty(inputLead.street__c)){
  1191. comparableValuesNumber++;
  1192. if(dbAcc != null){
  1193. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.street__c), convertToLowerCase(dbAcc.street__c));
  1194. } else if(dbOpp != null) {
  1195. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.street__c), convertToLowerCase(dbOpp.Account.street__c));
  1196. }
  1197. } else if(!CommonTools.isStringEmpty(inputLead.streetENG__c)) {
  1198. comparableValuesNumber++;
  1199. if(dbAcc != null){
  1200. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.streetENG__c), convertToLowerCase(dbAcc.streetENG__c));
  1201. } else if(dbOpp != null) {
  1202. compareResult += getStringsMatchPercent(convertToLowerCase(inputLead.streetENG__c), convertToLowerCase(dbOpp.Account.streetENG__c));
  1203. }
  1204. }
  1205.  
  1206. if(comparableValuesNumber == 0){
  1207. compareResult = 0;
  1208. } else {
  1209. compareResult = compareResult / comparableValuesNumber;
  1210. }
  1211.  
  1212. if(compareResult >= 50){
  1213. if(dbOpp != null){
  1214. matchingOpp mOpp = new matchingOpp(dbOpp, lng);
  1215. mOpp.oppOwnerName = dbOpp.Owner.Name;
  1216. mOpp.oppOwnerDivision = dbOpp.Owner.UserDivision__c;
  1217. mOpp.matchingPercentAddress = compareResult;
  1218. inputMatchingOpps.put(mOpp.oppId, mOpp);
  1219. } else if(dbAcc != null) {
  1220. matchingAcc mAcc = new matchingAcc(dbAcc, lng);
  1221. mAcc.matchingPercentAddress = compareResult;
  1222. inputMatchingAccs.put(mAcc.accId, mAcc);
  1223. }
  1224. } else if(compareResult > 0) {
  1225. if(dbOpp != null){
  1226. addressMatchingPercentMapForProject.put(dbOpp.Id, compareResult);
  1227. } else if(dbAcc != null) {
  1228. addressMatchingPercentMapForObject.put(dbAcc.Id, compareResult);
  1229. }
  1230. }
  1231.  
  1232. }
  1233.  
  1234. public static List<String> getWordsInListTillPosition(List<String> sList, Integer index){
  1235. List<String> newSList = new List<String>();
  1236. for(Integer i=0; i<index; i++){
  1237. newSList.add(sList[i]);
  1238. }
  1239. return newSList;
  1240. }
  1241.  
  1242. public static List<String> getWordsInListUntilPosition(List<String> sList, Integer index){
  1243. List<String> newSList = new List<String>();
  1244. for(Integer i=index; i<sList.size(); i++){
  1245. newSList.add(sList[i]);
  1246. }
  1247. return newSList;
  1248. }
  1249.  
  1250. public static void shuffleWordsInString(String prefix, List<String> inputList, List<String> finalList){
  1251. Integer n = inputList.size();
  1252.  
  1253. if(n == 0){
  1254. system.debug(prefix);
  1255. finalList.add(prefix.substring(0, prefix.length()-1));
  1256. } else {
  1257. for(Integer i=0; i<n; i++){
  1258. List<String> sList = getWordsInListTillPosition(inputList, i);
  1259. List<String> sList2 = getWordsInListUntilPosition(inputList, i+1);
  1260. sList.addAll(sList2);
  1261. shuffleWordsInString(prefix + inputList[i] + ' ', sList, finalList);
  1262.  
  1263. }
  1264. }
  1265. }
  1266.  
  1267. public static void doShuffleStringInList(List<String> strInputList, List<String> strResultList){
  1268. shuffleWordsInString('', strInputList, strResultList);
  1269. }
  1270.  
  1271. public void getCurrentUserInfo(){
  1272. currentUserId = UserInfo.getUserId();
  1273. User currUser = [SELECT Id, UserDivision__c FROM User WHERE Id = :currentUserId];
  1274. currentUserDivision = currUser.UserDivision__c;
  1275. }
  1276.  
  1277. private Boolean isCurrentUserOwnerOfHighMatchingOpps(List<matchingOpp> opps){
  1278. Boolean res = true;
  1279. if(opps != null && opps.size() > 0){
  1280. for(matchingOpp mo : opps){
  1281. if(mo.isHighPercentOfMatch == true){
  1282. if(mo.oppOwnerId != currentUserId){
  1283. res = false;
  1284. }
  1285. }
  1286. }
  1287. }
  1288. return res;
  1289. }
  1290.  
  1291. private Boolean isCurrentUserDivisionSameAsOwner(List<matchingOpp> opps){
  1292. Boolean res = true;
  1293. if(opps != null && opps.size() > 0){
  1294. for(matchingOpp mo : opps){
  1295. if(mo.isHighPercentOfMatch == true){
  1296. if(mo.oppOwnerDivision != currentUserDivision){
  1297. res = false;
  1298. }
  1299. }
  1300. }
  1301. }
  1302. return res;
  1303. }
  1304.  
  1305. private String getUserIdsToSendEmails(List<matchingOpp> opps){
  1306. String result = '';
  1307. if(opps != null && opps.size() > 0){
  1308. for(matchingOpp mo : opps){
  1309. if(mo.isHighPercentOfMatch == true){
  1310. if(mo.oppOwnerDivision == currentUserDivision){
  1311. if(mo.oppOwnerId != currentUserId){
  1312. result += mo.oppOwnerId + ', ';
  1313. }
  1314. }
  1315. }
  1316. }
  1317. }
  1318. if(result != ''){
  1319. result = result.substring(0, result.length()-2);
  1320. }
  1321. return result;
  1322. }
  1323.  
  1324. private Id getCreatedSystemObjectId(String multipleIdString){
  1325. SystemObject__c so = new SystemObject__c();
  1326. so.Text__c = multipleIdString;
  1327. insert so;
  1328. return so.Id;
  1329. }
  1330.  
  1331. public PageReference showAllSearchResults(){
  1332. areShownMiniTables = false;
  1333. isShowAllResultsButtonVisible = false;
  1334. isShowMiniResultsButtonVisible = true;
  1335. return null;
  1336. }
  1337.  
  1338. public PageReference showMiniSearchResults(){
  1339. areShownMiniTables = true;
  1340. isShowAllResultsButtonVisible = true;
  1341. isShowMiniResultsButtonVisible = false;
  1342. return null;
  1343. }
  1344.  
  1345. private void getRussiaTerritoryRecordId(){
  1346. List<Territory__c> terrList = [SELECT Id FROM Territory__c WHERE Name = 'Россия'];
  1347. russiaCountryTerritoryRecordId = terrList[0].Id;
  1348. }
  1349.  
  1350. private String convertToLowerCase(String s1){
  1351. if(s1 != null && s1.length() > 0){
  1352. return s1.toLowerCase();
  1353. } else {
  1354. return null;
  1355. }
  1356. }
  1357.  
  1358. private void getFullInfoPageLead(){
  1359. pageLead = [SELECT Id, Name, countryTerritory__c, areaTerritory__c, Company_name__c,
  1360. regionTerritory__c, districtTerritory__c, cityTerritory__c,
  1361. localityTerritory__c, street__c, streetENG__c, okrugENG__c,
  1362. regionENG__c, districtENG__c, cityENG__c, livePlaceENG__c,
  1363. OpportunityId__c, AccountId__c, ProjectName__c
  1364. FROM Lead
  1365. WHERE Id = :entryLead.Id];
  1366. }
  1367.  
  1368. webservice static void allyMatchingOpportunity(Id mOppId, Id pLeadId) {
  1369. Lead leadToUpdate = [SELECT Id FROM Lead WHERE Id = :pLeadId];
  1370. leadToUpdate.OpportunityId__c = mOppId;
  1371. update leadToUpdate;
  1372. }
  1373.  
  1374. webservice static void allyMatchingAccount(Id mAccId, Id pLeadId) {
  1375. Lead leadToUpdate = [SELECT Id FROM Lead WHERE Id = :pLeadId];
  1376. leadToUpdate.AccountId__c = mAccId;
  1377. update leadToUpdate;
  1378. }
  1379.  
  1380. public void checkIfHighMatchingOppsForLeadFound(){
  1381. if(!matchingOpps.isEmpty()){
  1382. isHighLevelOfMatchingPercentOpps = isHighLevelOfMatchingPercentOpps(matchingOpps);
  1383. } else {
  1384. isHighLevelOfMatchingPercentOpps = false;
  1385. }
  1386. pageLead.isHighMatchingProjectFound__c = isHighLevelOfMatchingPercentOpps;
  1387. update pageLead;
  1388. }
  1389.  
  1390. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement