Subversion Repositories SmartDukaan

Rev

Rev 3373 | Rev 3398 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3339 mandeep.dh 1
/**
2
 * 
3
 */
4
package in.shop2020.util;
5
 
6
import in.shop2020.crm.Activity;
7
import in.shop2020.crm.ActivityType;
8
import in.shop2020.crm.CRMService.Client;
3390 mandeep.dh 9
import in.shop2020.crm.SearchFilter;
3339 mandeep.dh 10
import in.shop2020.crm.Ticket;
11
import in.shop2020.crm.TicketCategory;
12
import in.shop2020.crm.TicketPriority;
13
import in.shop2020.crm.TicketStatus;
14
import in.shop2020.model.v1.user.User;
15
import in.shop2020.model.v1.user.UserContextException;
16
import in.shop2020.thrift.clients.CRMClient;
17
import in.shop2020.thrift.clients.UserClient;
18
 
19
import java.io.IOException;
20
import java.text.ParseException;
21
import java.util.Date;
22
import java.util.regex.Matcher;
23
import java.util.regex.Pattern;
24
 
25
import javax.mail.Message;
26
import javax.mail.MessagingException;
3368 mandeep.dh 27
import javax.mail.Multipart;
28
import javax.mail.Part;
3339 mandeep.dh 29
 
30
import org.apache.commons.logging.Log;
31
import org.apache.commons.logging.LogFactory;
32
import org.apache.thrift.TException;
33
import org.apache.thrift.transport.TTransportException;
34
 
35
/**
36
 * @author mandeep
37
 * 
38
 */
39
public class CRMEmailProcessor {
3368 mandeep.dh 40
    private static final int DESCRIPTION_MAX_WIDTH = 1900;
3369 mandeep.dh 41
    private static final String MAILOR_DAEMON_EMAIL_ID = "mailer-daemon@googlemail.com";
3339 mandeep.dh 42
    private static final Log log                   = LogFactory
43
                                                           .getLog(CRMEmailProcessor.class);
44
    private Client           client;
45
 
46
    public void processEmail(Message message) throws MessagingException,
47
            IOException, TException, UserContextException {
3369 mandeep.dh 48
        // Ignoring mails from Mailor daemon
49
        if (MAILOR_DAEMON_EMAIL_ID.equals(parseEmailId(message.getFrom()[0].toString()))) {
50
            return;
51
        }
52
 
3339 mandeep.dh 53
        Long ticketId = parseTicketId(message);
54
 
55
        if (ticketId != null) {
56
            log.info("Response for Ticket: " + ticketId + ": " + message);
57
            updateTicket(ticketId, message);
58
        } else {
59
            log.info("Mail not recognized as CRM ticket response with subject: "
60
                    + message.getSubject());
61
            log.info("Creating ticket for the same");
62
            createTicket(message);
63
        }
64
    }
65
 
66
    private Long parseTicketId(Message message) throws MessagingException {
67
        Long ticketId = null;
68
        String subject = message.getSubject();
69
        if (subject != null) {
70
            Pattern p = Pattern.compile("^.*"
71
                    + CRMConstants.CRM_SUBJECT_PREFIX_FOR_TICKET_ID
72
                    + "(\\d+).*$");
73
            Matcher m = p.matcher(subject);
74
            if (m.matches()) {
75
                ticketId = Long.parseLong(m.group(1));
76
            }
77
        }
78
 
79
        return ticketId;
80
    }
81
 
82
    public Date getLastProcessedTimestamp() throws ParseException, TException {
3373 mandeep.dh 83
        client = new CRMClient().getClient();
3339 mandeep.dh 84
        return new Date(client.getLastEmailProcessedTimestamp());
85
    }
86
 
87
    public void updateLastProcessedTimestamp(Date date) throws TException {
3340 mandeep.dh 88
        client = new CRMClient().getClient();
3339 mandeep.dh 89
        client.updateLastEmailProcessedTimestamp(date.getTime());
90
    }
91
 
92
    private void updateTicket(Long ticketId, Message message) {
93
        try {
3390 mandeep.dh 94
            SearchFilter searchFilter = new SearchFilter();
95
            searchFilter.setTicketId(ticketId);
3373 mandeep.dh 96
            client = new CRMClient().getClient();
3390 mandeep.dh 97
            Ticket ticket = client.getTickets(searchFilter).get(0);
3339 mandeep.dh 98
            Activity activity = new Activity();
99
            activity.setTicketId(ticketId);
100
            activity.setTicketAssigneeId(ticket.getAssigneeId());
101
            activity.setTicketCategory(ticket.getCategory());
102
            activity.setTicketDescription(ticket.getDescription());
103
            activity.setTicketPriority(ticket.getPriority());
104
            activity.setTicketStatus(ticket.getStatus());
105
            activity.setType(ActivityType.RECEIVED_EMAIL_FROM_CUSTOMER);
106
            activity.setCreatorId(CRMConstants.ADMIN_AGENT_ID);
107
 
108
            if (ticket.isSetCustomerId()) {
109
                activity.setCustomerId(ticket.getCustomerId());
110
            }
111
 
112
            activity.setDescription(convertMessageToText(message));
3368 mandeep.dh 113
 
114
            if (TicketStatus.CLOSED.equals(ticket.getStatus())) {
115
                ticket.setStatus(TicketStatus.REOPEN);
116
            }
117
 
3373 mandeep.dh 118
            client = new CRMClient().getClient();
3339 mandeep.dh 119
            client.updateTicket(ticket, activity);
120
        } catch (TTransportException e) {
121
            log.error("Could not update ticket " + ticketId + " with mail "
122
                    + message, e);
123
        } catch (TException e) {
124
            log.error("Could not update ticket " + ticketId + " with mail "
125
                    + message, e);
126
        } catch (MessagingException e) {
127
            log.error("Could not update ticket " + ticketId + " with mail "
128
                    + message, e);
129
        } catch (IOException e) {
130
            log.error("Could not update ticket " + ticketId + " with mail "
131
                    + message, e);
132
        }
133
    }
134
 
135
    private void createTicket(Message message) throws MessagingException,
136
            IOException, TException, UserContextException {
137
        String description = convertMessageToText(message);
138
        Ticket ticket = new Ticket();
139
        ticket.setCreatorId(CRMConstants.ADMIN_AGENT_ID);
140
        ticket.setCategory(TicketCategory.OTHER);
141
        String customerEmailId = parseEmailId(message.getFrom()[0].toString());
142
 
143
        in.shop2020.model.v1.user.UserContextService.Client userClient = new UserClient()
144
                .getClient();
145
        User user = userClient.getUserByEmail(customerEmailId);
146
 
147
        if (user == null || user.getUserId() == -1) {
148
            ticket.setCustomerEmailId(customerEmailId);
149
        } else {
150
            ticket.setCustomerId(user.getUserId());
151
        }
152
 
153
        ticket.setDescription(description);
154
        ticket.setPriority(TicketPriority.MEDIUM);
155
        ticket.setStatus(TicketStatus.OPEN);
156
 
157
        log.info("Creating activity!");
158
        Activity activity = new Activity();
159
        activity.setDescription(description);
160
        activity.setTicketCategory(ticket.getCategory());
161
        activity.setTicketDescription(ticket.getDescription());
162
        activity.setTicketPriority(ticket.getPriority());
163
        activity.setTicketStatus(ticket.getStatus());
164
        activity.setType(ActivityType.RECEIVED_EMAIL_FROM_CUSTOMER);
165
        activity.setCreatorId(CRMConstants.ADMIN_AGENT_ID);
166
 
3373 mandeep.dh 167
        client = new CRMClient().getClient();
3339 mandeep.dh 168
        client.insertTicket(ticket, activity);
169
    }
170
 
171
    // parsing email Id from strings like
3368 mandeep.dh 172
    // "Pankaj Jain <ponkoj@hotmail.com>"
3339 mandeep.dh 173
    private String parseEmailId(String address) {
174
        Pattern p = Pattern.compile("^.*<(.+)>.*$");
175
        Matcher m = p.matcher(address);
176
        if (m.matches()) {
177
            address = m.group(1);
178
        }
179
 
180
        return address;
181
    }
182
 
183
    private String convertMessageToText(Message message)
184
            throws MessagingException, IOException {
3368 mandeep.dh 185
        String messageContent = getText(message);
3339 mandeep.dh 186
 
3368 mandeep.dh 187
        String content = "From: " + message.getFrom()[0].toString()
188
                + "\n\nSubject: " + message.getSubject() + "\n\nBody: "
189
                + messageContent;
3339 mandeep.dh 190
 
191
        if (content.length() > DESCRIPTION_MAX_WIDTH) {
192
            content = content.substring(0, DESCRIPTION_MAX_WIDTH);
3368 mandeep.dh 193
            content += "\n\nTHIS TEXT IS TRUNCATED. PLEASE VISIT INBOX TO SEE COMPLETE DETAILS.";
3339 mandeep.dh 194
        }
195
 
196
        return content;
197
    }
3368 mandeep.dh 198
 
199
    /**
200
     * Return the primary text content of the message.
201
     */
202
    private String getText(Part p) throws MessagingException, IOException {
203
        if (p.isMimeType("text/*")) {
204
            String s = (String) p.getContent();
205
            return s;
206
        }
207
 
208
        if (p.isMimeType("multipart/alternative")) {
209
            // prefer plain text over html text
210
            Multipart mp = (Multipart) p.getContent();
211
            String text = null;
212
            for (int i = 0; i < mp.getCount(); i++) {
213
                Part bp = mp.getBodyPart(i);
214
                if (bp.isMimeType("text/html")) {
215
                    if (text == null)
216
                        text = getText(bp);
217
                    continue;
218
                } else if (bp.isMimeType("text/plain")) {
219
                    String s = getText(bp);
220
                    if (s != null)
221
                        return s;
222
                } else {
223
                    return getText(bp);
224
                }
225
            }
226
            return text;
227
        } else if (p.isMimeType("multipart/*")) {
228
            Multipart mp = (Multipart) p.getContent();
229
            for (int i = 0; i < mp.getCount(); i++) {
230
                String s = getText(mp.getBodyPart(i));
231
                if (s != null)
232
                    return s;
233
            }
234
        }
235
 
236
        return null;
237
    }
3339 mandeep.dh 238
}