Клонировать возможность и ее элементы программно в отделе продаж - PullRequest
1 голос
/ 15 февраля 2012

У меня есть сценарий, в котором мне нужно клонировать возможность и ее элементы, когда датой окончания контракта является сегодня. У позиции opp есть поле с именем Product_Family_ c. Я должен был бы клонировать только тех оппонентов, чьи линейные элементы имеют тип обновления _c ежемесячно. Я застрял в том, как я могу клонировать олигареты и назначать новые оппоненты олигопаратам.

   todays=date.today();
    system.debug('todays'+todays);      
    for(opportunity o:[select Auto_Renew__c,Contract_lenght_in_months__c,Contract_End_Date__c,id from opportunity where Auto_Renew__c='Yes' and Contract_End_Date__c =:todays ])
    {
        SetOppId.add(o.id);
        MapOpp.put(o.id,o);
    }
    system.debug('SetOppId'+SetOppId);
    system.debug('MapOpp'+MapOpp);
    for(OpportunityLineItem oli:[select OpportunityId from OpportunityLineItem where Product_Family__c='Monthly' and OpportunityId in :SetOppId])
    {
        SetOppIdtoRenew.add(oli.OpportunityId);
        Mapoli.put(oli.id,oli);

    }
    system.debug('SetOppIdtoRenew'+SetOppIdtoRenew);
    for(id a:SetOppIdtoRenew)
    {
        //MapOpp.get(a).Contract_End_Date__c=MapOpp.get(a).Contract_End_Date__c.addDays(1);
        //MapOpp.get(a).Contract_End_Date__c=MapOpp.get(a).Contract_End_Date__c.addMonths(integer.valueof(MapOpp.get(a).Contract_lenght_in_months__c));
        Lstopp.add(new opportunity(name=MapOpp.get(a).name+' renewal '+string.valueof(date.today()),
                                 Contract_lenght_in_months__c=MapOpp.get(a).Contract_lenght_in_months__c,
                                 Contract_End_Date__c=MapOpp.get(a).Contract_End_Date__c.addMonths(integer.valueof(MapOpp.get(a).Contract_lenght_in_months__c))+1,
                                 StageName=MapOpp.get(a).StageName,
                                 CloseDate=MapOpp.get(a).CloseDate
                            //   ,<fieldname>=MapOpp.get(a).<fieldname>... for all the fields you ned to copy over
                                 ));

    }
    system.debug('Lstopp'+Lstopp);
    insert Lstopp;

1 Ответ

1 голос
/ 15 февраля 2012

Вы думали в правильном направлении.Однако, прежде чем назначить OppID для позиции, вы должны вставить эту возможность.Я полагаю, что этот вид нарушает ваш транзакционный контроль, но вы всегда можете использовать точки сохранения базы данных, чтобы сделать всю операцию атомарной.

Например:

    SavePoint sp = Database.setSavepoint();
    try {
        upsert newOpportunities;
        // now create line items and assign IDs
    }   
    catch (Exception ex) {
        Database.rollback(sp);      
        // cleanup
    }

Чтобы отобразить старые возможности нановые, вам нужно Map<ID, Opportunity> и список и заполнить их теми же новыми возможностями, чтобы eb мог повторно использовать новые идентификаторы в сопоставлении (я использовал псевдокод, если у вас возникли проблемы с его интерпретацией, дайте мне знать)

foreach(oldopp) {
   newopp = clone oldopp;
   list.add(newopp);
   map.put(oldopp.id, newopp);
}
upsert list;
// now we have new oppids for cloned items, use them to map

foreach(oldlineitem) {
   newlineitem = clone oldlineitem;
   newlineitem.OpportunityId = map.get(oldlineitem.OpportunityId).Id;
   ...
}
upsert listofnewlineitems;

}

...