Package in.partake.model.daofacade

Source Code of in.partake.model.daofacade.EnrollmentDAOFacade

package in.partake.model.daofacade;

import in.partake.base.PartakeRuntimeException;
import in.partake.base.TimeUtil;
import in.partake.model.EventTicketHolderList;
import in.partake.model.IPartakeDAOs;
import in.partake.model.UserEx;
import in.partake.model.UserTicketEx;
import in.partake.model.dao.DAOException;
import in.partake.model.dao.PartakeConnection;
import in.partake.model.dao.access.IEventActivityAccess;
import in.partake.model.dto.Event;
import in.partake.model.dto.EventActivity;
import in.partake.model.dto.EventTicket;
import in.partake.model.dto.UserTicket;
import in.partake.model.dto.auxiliary.AttendanceStatus;
import in.partake.model.dto.auxiliary.CalculatedEnrollmentStatus;
import in.partake.model.dto.auxiliary.ModificationStatus;
import in.partake.model.dto.auxiliary.ParticipationStatus;
import in.partake.resource.ServerErrorCode;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class EnrollmentDAOFacade {

    // TODO: Maybe we should create EventTikcetEx, which has an Event.
    public static List<UserTicketEx> getEnrollmentExs(PartakeConnection con, IPartakeDAOs daos, EventTicket ticket, Event event) throws DAOException {
        // priority のあるイベントに参加している場合、priority に 1 を付加する。

        // --- まず、EnrollmentEx を作成
        List<UserTicketEx> ps = new ArrayList<UserTicketEx>();
        for (UserTicket p : daos.getEnrollmentAccess().findByTicketId(con, ticket.getId(), 0, Integer.MAX_VALUE)) {
            if (p == null) { continue; }
            UserEx user = UserDAOFacade.getUserEx(con, daos, p.getUserId());
            if (user == null) { continue; }
            UserTicketEx pe = new UserTicketEx(p, user);
            pe.freeze();
            ps.add(pe);
        }

        Collections.sort(ps, UserTicketEx.getPriorityBasedComparator());
        return ps;
    }

    /** 参加ステータスを表示します */
    public static CalculatedEnrollmentStatus calculateEnrollmentStatus(PartakeConnection con, IPartakeDAOs daos, String userId, EventTicket ticket, Event event) throws DAOException {
        ParticipationStatus status = getParticipationStatus(con, daos, userId, ticket.getId());

        if (status == null)
            return CalculatedEnrollmentStatus.NOT_ENROLLED;

        switch (status) {
        case ENROLLED: {
            int order = getOrderOfEnrolledEvent(con, daos, ticket, event, userId);
            if (order <= ticket.getAmount() || ticket.getAmount() == 0)
                return CalculatedEnrollmentStatus.ENROLLED;
            else
                return CalculatedEnrollmentStatus.ENROLLED_ON_WAITING_LIST;
        }
        case RESERVED: {
            int order = getOrderOfEnrolledEvent(con, daos, ticket, event, userId);
            if (order <= ticket.getAmount() || ticket.getAmount() == 0)
                return CalculatedEnrollmentStatus.RESERVED;
            else
                return CalculatedEnrollmentStatus.RESERVED_ON_WAITING_LIST;
        }
        case NOT_ENROLLED:
            return CalculatedEnrollmentStatus.NOT_ENROLLED;
        case CANCELLED:
            return CalculatedEnrollmentStatus.CANCELLED;
        }

        assert false;
        throw new PartakeRuntimeException(ServerErrorCode.LOGIC_ERROR);
    }

    public static ParticipationStatus getParticipationStatus(PartakeConnection con, IPartakeDAOs daos, String userId, UUID ticketId) throws DAOException {
        UserTicket enrollment = daos.getEnrollmentAccess().findByTicketIdAndUserId(con, ticketId, userId);
        if (enrollment == null)
            return ParticipationStatus.NOT_ENROLLED;
        return enrollment.getStatus();
    }

    /**
     * event の参加順位(何番目に参加したか)を返します。
     */
    public static int getOrderOfEnrolledEvent(PartakeConnection con, IPartakeDAOs daos, EventTicket ticket, Event event, String userId) throws DAOException {
        List<UserTicketEx> enrollments = getEnrollmentExs(con, daos, ticket, event);
        EventTicketHolderList list = ticket.calculateParticipationList(event, enrollments);

        int result = 0;
        for (UserTicket e : list.getEnrolledParticipations()) {
            ++result;
            if (userId.equals(e.getUserId())) { return result; }
        }
        for (UserTicket e : list.getSpareParticipations()) {
            ++result;
            if (userId.equals(e.getUserId())) { return result; }
        }

        return -1;
    }

    // TODO: "changesOnlyComment" should die!
    public static void enrollImpl(PartakeConnection con, IPartakeDAOs daos, UserEx user, UUID ticketId, Event event,
            ParticipationStatus status, String comment, Map<UUID, List<String>> enqueteAnswers,boolean changesOnlyComment, boolean isReservationTimeOver) throws DAOException {
        String userId = user.getId();
        String eventId = event.getId();

        UserTicket oldEnrollment = daos.getEnrollmentAccess().findByTicketIdAndUserId(con, ticketId, userId);
        UserTicket newEnrollment;
        if (oldEnrollment == null) {
            String id = daos.getEnrollmentAccess().getFreshId(con);
            newEnrollment = new UserTicket(id, userId, ticketId, eventId,
                    comment, ParticipationStatus.NOT_ENROLLED, ModificationStatus.NOT_ENROLLED, AttendanceStatus.UNKNOWN, null, TimeUtil.getCurrentDateTime(), TimeUtil.getCurrentDateTime(), null);
        } else {
            newEnrollment = new UserTicket(oldEnrollment);
        }

        newEnrollment.setComment(comment);
        newEnrollment.setEnqueteAnswers(enqueteAnswers);
        if (oldEnrollment == null) {
            newEnrollment.setStatus(status);
            newEnrollment.setModificationStatus(ModificationStatus.CHANGED);
            newEnrollment.setAppliedAt(TimeUtil.getCurrentDateTime());
        } else if (changesOnlyComment || status.equals(oldEnrollment.getStatus())) {
            // 特に変更しない
        } else if (status.isEnrolled() == oldEnrollment.getStatus().isEnrolled()) {
            // 参加する / しないの状況が変更されない場合は、status のみが更新される。
            newEnrollment.setStatus(status);
            newEnrollment.setModificationStatus(ModificationStatus.CHANGED);
        } else {
            newEnrollment.setStatus(status);
            newEnrollment.setModificationStatus(ModificationStatus.CHANGED);
            newEnrollment.setAppliedAt(TimeUtil.getCurrentDateTime());
        }

        if (oldEnrollment == null)
            newEnrollment.setModifiedAt(TimeUtil.getCurrentDateTime());

        //
        if (status != null) {
            IEventActivityAccess eaa = daos.getEventActivityAccess();

            String title;
            switch (status) {
            case ENROLLED:      title = user.getTwitterScreenName() + " さんが参加しました";        break;
            case CANCELLED:     title = user.getTwitterScreenName() + " さんが参加を取りやめました";     break;
            case RESERVED:      title = user.getTwitterScreenName() + " さんが仮参加しました";      break;
            case NOT_ENROLLED:  title = user.getTwitterScreenName() + " さんはもう参加していません"; break;
            default:            title = user.getTwitterScreenName() + " さんが不明なステータスになっています"; break; // TODO: :-P
            }

            String content = String.format("<p>詳細は <a href=\"%s\">%s</a> をごらんください。</p>", event.getEventURL(), event.getEventURL());
            eaa.put(con, new EventActivity(eaa.getFreshId(con), eventId, title, content, TimeUtil.getCurrentDateTime()));
        }

        daos.getEnrollmentAccess().put(con, newEnrollment);
    }

}
TOP

Related Classes of in.partake.model.daofacade.EnrollmentDAOFacade

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.