Subversion Repositories SmartDukaan

Rev

Rev 37166 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
37166 amit 1
package com.spice.profitmandi.service;
2
 
3
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
4
import com.spice.profitmandi.dao.entity.user.AgendaInstance;
5
import com.spice.profitmandi.dao.entity.user.AgendaVisitLog;
6
import com.spice.profitmandi.dao.enumuration.dtr.AgendaSource;
7
import com.spice.profitmandi.dao.enumuration.dtr.AgendaStatus;
8
import com.spice.profitmandi.dao.repository.dtr.AgendaInstanceRepository;
9
import com.spice.profitmandi.dao.repository.dtr.AgendaVisitLogRepository;
10
import org.apache.logging.log4j.LogManager;
11
import org.apache.logging.log4j.Logger;
12
import org.springframework.beans.factory.annotation.Autowired;
13
import org.springframework.stereotype.Service;
14
import org.springframework.transaction.annotation.Transactional;
15
 
16
import java.time.LocalDate;
17
import java.time.LocalDateTime;
18
 
19
@Service
20
@Transactional
21
public class AgendaInstanceServiceImpl implements AgendaInstanceService {
22
 
23
    private static final Logger LOGGER = LogManager.getLogger(AgendaInstanceServiceImpl.class);
24
 
25
    @Autowired
26
    AgendaInstanceRepository agendaInstanceRepository;
27
 
28
    @Autowired
29
    AgendaVisitLogRepository agendaVisitLogRepository;
30
 
31
    @Override
32
    public AgendaInstance open(int fofoId, String agendaType, AgendaSource source, Integer openedBy,
33
                               String openMetricJson) throws ProfitMandiBusinessException {
34
        AgendaInstance existing = agendaInstanceRepository.selectOpenByFofoIdAndType(fofoId, agendaType);
35
        if (existing != null) return existing;
36
 
37
        AgendaInstance instance = new AgendaInstance();
38
        instance.setFofoId(fofoId);
39
        instance.setAgendaType(agendaType);
40
        instance.setSource(source.name());
41
        instance.setStatus(AgendaStatus.OPEN.name());
42
        instance.setOpenedOn(LocalDateTime.now());
43
        instance.setOpenedBy(openedBy);
44
        instance.setOpenMetric(openMetricJson);
45
        try {
46
            agendaInstanceRepository.persist(instance);
47
            return instance;
48
        } catch (Exception e) {
49
            // uq_one_open race: someone opened it between select and insert.
50
            AgendaInstance winner = agendaInstanceRepository.selectOpenByFofoIdAndType(fofoId, agendaType);
51
            if (winner != null) {
52
                LOGGER.info("Agenda open race for fofoId={} type={} — using existing instance {}",
53
                        fofoId, agendaType, winner.getId());
54
                return winner;
55
            }
56
            throw new ProfitMandiBusinessException("agendaType", agendaType,
57
                    "Could not open agenda instance for fofoId " + fofoId + ": " + e.getMessage());
58
        }
59
    }
60
 
61
    @Override
62
    public void closeByMetric(AgendaInstance instance, String closeMetricJson) {
63
        instance.setStatus(AgendaStatus.CLOSED.name());
64
        instance.setClosedOn(LocalDateTime.now());
65
        instance.setClosedBy(null);
66
        instance.setCloseMetric(closeMetricJson);
67
        agendaInstanceRepository.persist(instance);
68
    }
69
 
70
    @Override
71
    public void closeManual(AgendaInstance instance, int closedBy, String remark)
72
            throws ProfitMandiBusinessException {
73
        if (AgendaSource.AUTO.name().equals(instance.getSource())) {
74
            throw new ProfitMandiBusinessException("instanceId", instance.getId(),
75
                    "Auto agendas close only when the metric normalizes");
76
        }
77
        if (!AgendaStatus.OPEN.name().equals(instance.getStatus())) {
78
            throw new ProfitMandiBusinessException("instanceId", instance.getId(),
79
                    "Agenda instance is already closed");
80
        }
81
        instance.setStatus(AgendaStatus.CLOSED.name());
82
        instance.setClosedOn(LocalDateTime.now());
83
        instance.setClosedBy(closedBy);
84
        instance.setCloseRemark(remark);
85
        agendaInstanceRepository.persist(instance);
86
    }
87
 
88
    @Override
37181 amit 89
    public java.util.List<AgendaInstance> filterVisibleForVisit(java.util.List<AgendaInstance> openInstances) {
90
        return filterVisibleForVisitStatic(openInstances);
91
    }
92
 
93
    // Static + pure for unit tests. Input must be one store's OPEN instances.
94
    static java.util.List<AgendaInstance> filterVisibleForVisitStatic(java.util.List<AgendaInstance> openInstances) {
95
        if (openInstances == null || openInstances.isEmpty()) return openInstances;
96
        boolean revivalOpen = false;
97
        for (AgendaInstance ai : openInstances) {
98
            if (com.spice.profitmandi.dao.enumuration.dtr.AgendaType.REVIVAL.name().equals(ai.getAgendaType())) {
99
                revivalOpen = true;
100
                break;
101
            }
102
        }
103
        if (!revivalOpen) return openInstances;
104
        java.util.List<AgendaInstance> visible = new java.util.ArrayList<>();
105
        for (AgendaInstance ai : openInstances) {
106
            boolean keep = AgendaSource.MANUAL.name().equals(ai.getSource())
107
                    || com.spice.profitmandi.dao.enumuration.dtr.AgendaType.REVIVAL.name().equals(ai.getAgendaType())
108
                    || com.spice.profitmandi.dao.enumuration.dtr.AgendaType.CREDIT_DUES.name().equals(ai.getAgendaType());
109
            if (keep) visible.add(ai);
110
        }
111
        return visible;
112
    }
113
 
114
    @Override
37166 amit 115
    public void logVisit(int instanceId, Integer locationTrackingId, int visitorUserId,
116
                         LocalDate visitDate, String discussion) throws ProfitMandiBusinessException {
117
        AgendaInstance instance = agendaInstanceRepository.selectById(instanceId);
118
        if (instance == null) {
119
            throw new ProfitMandiBusinessException("instanceId", instanceId, "Agenda instance not found");
120
        }
121
        if (!AgendaStatus.OPEN.name().equals(instance.getStatus())) {
122
            throw new ProfitMandiBusinessException("instanceId", instanceId,
123
                    "Agenda instance is closed — discussions attach to open agendas only");
124
        }
125
        AgendaVisitLog log = new AgendaVisitLog();
126
        log.setAgendaInstanceId(instanceId);
127
        log.setLocationTrackingId(locationTrackingId);
128
        log.setVisitorUserId(visitorUserId);
129
        log.setVisitDate(visitDate != null ? visitDate : LocalDate.now());
130
        log.setDiscussion(discussion);
131
        agendaVisitLogRepository.persist(log);
132
    }
133
}