Untitled

mail@pastecode.io avatarunknown
plain_text
a month ago
3.8 kB
5
Indexable
Never
Map<Id,String> mapCaseIdToEmailSend = new Map<String,Id>();
Set<Id> casesIds = new Set<Id>();
Map<String,String> mapEmailSendAndEmailQueue = new Map<String,String>();

for (VippIntegrationSOAP.SituacaoPostagemResponseNew_element currentObject : objectsStatusResponse.SituacaoPostagemRetorno.SituacaoPostagem.SituacaoPostagem) {

    Case caseWithTag = casesWithTagMap.get(currentObject.Etiqueta);

    if (caseWithTag == null || caseWithTag.StatusObjetoVipp__c == currentObject.DescricaoStatusAtual)

        continue;

    caseWithTag.StatusObjetoVipp__c = currentObject.DescricaoStatusAtual;

    String emailToSend = caseWithTag.Account.RecordType.Name.equals('Conta CPF')
            && !String.isBlank(caseWithTag.Account.PersonEmail)
                ? caseWithTag.Account.PersonEmail
                : !String.isBlank(caseWithTag.Account.BusinessEmail__c)
                    ? caseWithTag.Account.BusinessEmail__c
                    : '';

    if (currentObject.DescricaoStatusAtual.equals('Objeto postado')
        || currentObject.DescricaoStatusAtual.equals('Objeto postado após o horário limite da unidade')
        && String.isNotBlank(emailToSend)) {

        CaseSelector.selectByFieldOwner(caseHistory)  

        Messaging.SingleEmailMessage emailSend =  sendObjectPostedEmail(emailToSend, caseWithTag.NumeroEtiqueta__c);
        createEmailMessage(emailSend, new List<Case> {caseWithTag});
    }

    Boolean vippStatusDeliveryProblem =
        currentObject.DescricaoStatusAtual.equals('Objeto não localizado no fluxo postal') ||
        currentObject.DescricaoStatusAtual.equals('Endereço incorreto - Entrega não realizada') ||
        currentObject.DescricaoStatusAtual.equals('Objeto entregue ao remetente');

    if (vippStatusDeliveryProblem)
        caseWithTag.Status = 'Respondido';

    if (currentObject.DescricaoStatusAtual.equals('Objeto entregue ao destinatário') && String.isNotBlank(emailToSend)) {
        caseWithTag.Status = 'Closed';
        if (!String.isBlank(emailToSend)){
            objectDeliveredEmails.add(emailToSend);
            if(!mapCaseIdToEmailSend.containsKey(caseWithTag.Id))
                mapCaseIdToEmailSend.put(caseWithTag.Id,emailToSend);
            casesIds.add(caseWithTag);
        }
    }

    if (!casesToUpdate.contains(caseWithTag))
        casesToUpdate.add(caseWithTag);
}

Set<String> oldValueCaseHistory = new Set<String>();
List<CaseHistory> cases = [
    SELECT 
        NewValue,
        OldValue,
        CreatedDate,
        Case.Subject,
        Case.Owner.Type
    FROM CaseHistory 
    WHERE Field = 'Owner' AND 
    Case.Id IN: casesIds
    ORDER BY CreatedDate
];

for(CaseHistory currentCase: cases)
    oldValueCaseHistory.add((String) currentCase.OldValue);

List<Group> queues = [SELECT Id,Email FROM Group Where Type = 'Queue'];
Map<Id,String> mapIdQueueAndEmail = new Map<Id,String>();

Map<String,List<Id>> mapEmailQueueAndCaseId = new Map<String,List<Id>>();

for(Group queue: queues)
    mapIdQueueAndEmail.put(queue.Id,queue.String);

for(String idOldValue: oldValueCaseHistory)
    if(mapIdQueueAndEmail.containsKey(idOldValue))
        if(!mapEmailQueueAndCaseId.containsKey(mapIdQueueAndEmail.get(idOldValue)))
            mapEmailQueueAndCaseId.put(mapIdQueueAndEmail.get(idOldValue), new List<Id>());
        mapEmailQueueAndCaseId.get(mapIdQueueAndEmail.get(idOldValue)).add(idOldValue);


for(Id caseId: mapCaseIdToEmailSend.keySet()){
    String emailSend = mapCaseIdToEmailSend.get(caseId);
    for(String emailQueue : mapEmailQueueAndCaseId.keySet())
        List<Id> ids = mapEmailQueueAndCaseId.get(emailQueue);
        for(Id id: ids)
            if(caseId == id)
                mapEmailSendAndEmailQueue.put(emailSend,emailQueue);

}

if(!objectDeliveredEmails.isEmpty())
    sendObjectDeliveredEmail(mapEmailSendAndEmailQueue);