1. Нет существующего аккаунта, нет существующего контакта
1.1. Смотрим какой выбран аккаунт тайп, добавляем его к новому аккаунту
1.1.1. Инсертим аккаунт
1.2. Добавляем новый аккаунт к новому контакту
1.2.1. Если выбран чекбокс Residential_Address_different__c, то делаем определенные манипулямии с филдами Residential
1.2.1.1. Инсертим контакт
1.2.2. newContact.MailingCountry = newContact.Country__c
1.3. Если дополнительные контакты выбраны (contact2display, contact3display etc)
1.3.1. Если выбран чекбокс Residential_Address_different__c, то делаем определенные манипулямии с филдами Residential
1.3.1.1. Инсертим контакты
1.3.2. newContact.MailingCountry = newContact.Country__c
1.3.3. Добавляем аккаунт к контакту
1.4. Добавляем новый аккаунт к оппотьюнити
1.4.1. newOpp.CloseDate = Date.today() + 30;
1.4.1.1. Инсертим оппотьюнити
2. Есть существующий аккаунт, нет существующего контакта
2.1. Найден ли дубликат по поиску
2.1.1. Да
2.1.1.1. Все делаем исходя из ситуации: Есть существующий аккаунт, есть существующий контакт
2.1.2. Нет
2.1.2.1. Добавляем текущий аккаунт к новому контакту
2.1.2.1.1. Если выбран чекбокс Residential_Address_different__c, то делаем определенные манипулямии с филдами Residential
2.1.2.1.2. newContact.MailingCountry = newContact.Country__c
2.1.2.2. Если дополнительные контакты выбраны (contact2display, contact3display etc)
2.1.2.2.1. Если выбран чекбокс Residential_Address_different__c, то делаем определенные манипулямии с филдами Residential
2.1.2.2.2. newContact.MailingCountry = newContact.Country__c
2.1.2.2.3. Добавляем аккаунт к контакту
2.1.2.3. Добавляем текущий аккаунт к оппотьюнити
2.1.2.3.1. newOpp.CloseDate = Date.today() + 30;
3. Есть существующий аккаунт, есть существующий контакт
3.1. Новый аккаунт создан
3.1.1. Инсертим новый аккаунт
3.1.2. Создаем аккаунт контакт рол в старом аккаунте с текущим контактом
3.1.2.1. Инсертим роль
3.1.3. Добавляем новый аккаунт к контакту
3.1.3.1. Апсертим контакт
3.1.4. Добавляем аккаунт и контакт к оппотьюнити
3.1.4.1. Инсертим оппотьюнити
3.1.4.2. Создаем оппотьюнити контакт роль с текущим контактом для новой оппотьюнити, делаем его праймари
3.1.4.2.1. Инсертим роль
3.1.5. Если дополнительные контакты выбраны (contact2display, contact3display etc)
3.1.5.1. Если выбран чекбокс Residential_Address_different__c, то делаем определенные манипулямии с филдами Residential
3.1.5.1.1. Инсертим контакты
3.1.5.2. newContact.MailingCountry = newContact.Country__c
3.1.5.3. Добавляем аккаунт к контакту
3.1.5.4. Создаем оппотьюнити контакт роль с контактами для новой оппотьюнити
3.1.5.4.1. Инсертим роль/роли
3.2. Новый аккаунт не создан, выбран какой-то аккаунт из списка
3.2.1. Выбран ли тот же аккаунт, который привязан к контакту
3.2.1.1. Да
3.2.1.1.1. Добавляем аккаунт и контакт к оппотьюнити
3.2.1.2. Нет
3.2.1.2.1. Добавляем выбранный аккаунт к контакту, а в старом аккаунте делаем этот контакт как аккаунт контакт рол.
3.2.2. Если дополнительные контакты выбраны (contact2display, contact3display etc)
3.2.2.1. Если выбран чекбокс Residential_Address_different__c, то делаем определенные манипулямии с филдами Residential
3.2.2.1.1. Инсертим контакты
3.2.2.2. newContact.MailingCountry = newContact.Country__c
3.2.2.3. Добавляем аккаунт к контакту