디폴트값 수정

This commit is contained in:
2025-10-22 19:42:54 +09:00
parent 84240f57a7
commit f4123b158d
+56 -24
View File
@@ -183,7 +183,7 @@ exports.parseEventFile = async (req, res) => {
console.error(`회원 ${member.id}의 에버리지 계산 오류:`, error); console.error(`회원 ${member.id}의 에버리지 계산 오류:`, error);
} }
memberMap.set(member.name, { memberMap.set(member.name.trim(), {
id: member.id, id: member.id,
name: member.name, name: member.name,
gender: member.gender, gender: member.gender,
@@ -340,7 +340,7 @@ function processRawData(rawData, memberMap) {
const row = rawData[i]; const row = rawData[i];
if (row.length < 2) continue; if (row.length < 2) continue;
// 이름: 한글 2자 이상 // 이름: 한글 2자 이상
const name = colMap.name !== undefined ? row[colMap.name] : row.find(cell => /^[-힣a-z]{2,}$/i.test(cell)); const name = (colMap.name !== undefined ? row[colMap.name] : row.find(cell => /^[-힣a-z]{2,}$/i.test(cell)))?.toString().trim();
if (!name) continue; if (!name) continue;
const teamNumber = colMap.team !== undefined ? row[colMap.team] : ''; const teamNumber = colMap.team !== undefined ? row[colMap.team] : '';
const scores = (colMap.scores || []).map(idx => parseInt(row[idx], 10)).filter(n => !isNaN(n)); const scores = (colMap.scores || []).map(idx => parseInt(row[idx], 10)).filter(n => !isNaN(n));
@@ -348,7 +348,7 @@ function processRawData(rawData, memberMap) {
const total = colMap.total !== undefined ? parseInt(row[colMap.total], 10) : null; const total = colMap.total !== undefined ? parseInt(row[colMap.total], 10) : null;
const avg = colMap.avg !== undefined ? parseFloat(row[colMap.avg]) : null; const avg = colMap.avg !== undefined ? parseFloat(row[colMap.avg]) : null;
// 회원 매핑 (이름 기준) // 회원 매핑 (이름 기준)
const memberMatch = memberMap && memberMap.get && name ? memberMap.get(name) : null; const memberMatch = memberMap && memberMap.get && name ? memberMap.get(name.trim()) : null;
participants.push({ participants.push({
name, name,
teamNumber, teamNumber,
@@ -526,6 +526,28 @@ exports.saveEventFileData = async (req, res) => {
try { try {
// 트랜잭션 시작 // 트랜잭션 시작
const result = await sequelize.transaction(async (t) => { const result = await sequelize.transaction(async (t) => {
// 이벤트 타입/상태 정규화 (모델 enum 호환)
const normalizeEventType = (v) => {
if (!v) return 'regular';
const s = String(v).toLowerCase();
if (['regular','일반'].includes(s)) return 'regular';
if (['lightning','번개'].includes(s)) return 'lightning';
if (['practice','연습'].includes(s)) return 'practice';
if (['exchange','교류전'].includes(s)) return 'exchange';
if (['event','행사'].includes(s)) return 'event';
return 'other';
};
const normalizeStatus = (v) => {
if (!v) return 'completed';
const s = String(v).toLowerCase();
if (['active','활성'].includes(s)) return 'active';
if (['ready','대기','준비','draft'].includes(s)) return 'ready';
if (['completed','완료','done','finished'].includes(s)) return 'completed';
if (['canceled','cancelled','취소'].includes(s)) return 'canceled';
if (['deleted','삭제'].includes(s)) return 'deleted';
return 'completed';
};
// 1. 이벤트 생성 또는 업데이트 // 1. 이벤트 생성 또는 업데이트
let event; let event;
if (eventData.id) { if (eventData.id) {
@@ -542,13 +564,13 @@ exports.saveEventFileData = async (req, res) => {
await event.update({ await event.update({
title: eventData.title, title: eventData.title,
description: eventData.description || '', description: eventData.description || '',
eventType: eventData.eventType, eventType: normalizeEventType(eventData.eventType),
startDate: new Date(eventData.startDate), startDate: new Date(eventData.startDate),
endDate: eventData.endDate ? new Date(eventData.endDate) : null, endDate: eventData.endDate ? new Date(eventData.endDate) : null,
location: eventData.location || '', location: eventData.location || '',
gameCount: eventData.gameCount || 3, gameCount: eventData.gameCount || 3,
maxParticipants: eventData.maxParticipants || 0, maxParticipants: eventData.maxParticipants || 0,
status: eventData.status || '완료' status: normalizeStatus(eventData.status)
}, { transaction: t }); }, { transaction: t });
} else { } else {
// 새 이벤트 생성 // 새 이벤트 생성
@@ -556,13 +578,13 @@ exports.saveEventFileData = async (req, res) => {
clubId, clubId,
title: eventData.title, title: eventData.title,
description: eventData.description || '', description: eventData.description || '',
eventType: eventData.eventType, eventType: normalizeEventType(eventData.eventType),
startDate: new Date(eventData.startDate), startDate: new Date(eventData.startDate),
endDate: eventData.endDate ? new Date(eventData.endDate) : null, endDate: eventData.endDate ? new Date(eventData.endDate) : null,
location: eventData.location || '', location: eventData.location || '',
gameCount: eventData.gameCount || 3, gameCount: eventData.gameCount || 3,
maxParticipants: eventData.maxParticipants || 0, maxParticipants: eventData.maxParticipants || 0,
status: eventData.status || '완료', status: normalizeStatus(eventData.status),
publicHash: generateRandomHash() publicHash: generateRandomHash()
}, { transaction: t }); }, { transaction: t });
} }
@@ -635,8 +657,8 @@ exports.saveEventFileData = async (req, res) => {
eventParticipant = await EventParticipant.create({ eventParticipant = await EventParticipant.create({
eventId: event.id, eventId: event.id,
memberId: participant.memberId, memberId: participant.memberId,
status: '참가확정', status: 'confirmed',
paymentStatus: '납부완료', paymentStatus: 'paid',
teamId: teamId, teamId: teamId,
comment: '' comment: ''
}, { transaction: t }); }, { transaction: t });
@@ -645,9 +667,10 @@ exports.saveEventFileData = async (req, res) => {
// 새 회원 생성 및 참가자 등록 // 새 회원 생성 및 참가자 등록
const newMember = await Member.create({ const newMember = await Member.create({
name: participant.name, name: participant.name,
gender: participant.gender || '남성', // normalize enum values to match Member model
memberType: '정회원', gender: (participant.gender === 'female' || participant.gender === '여성') ? 'female' : 'male',
status: '활성' memberType: 'guest',
status: 'active'
}, { transaction: t }); }, { transaction: t });
// 클럽 회원으로 등록 // 클럽 회원으로 등록
@@ -667,7 +690,7 @@ exports.saveEventFileData = async (req, res) => {
eventParticipant = await EventParticipant.create({ eventParticipant = await EventParticipant.create({
eventId: event.id, eventId: event.id,
memberId: newMember.id, memberId: newMember.id,
status: '참가확정', status: 'confirmed',
teamId: teamId, teamId: teamId,
comment: '' comment: ''
}, { transaction: t }); }, { transaction: t });
@@ -705,20 +728,29 @@ exports.saveEventFileData = async (req, res) => {
transaction: t transaction: t
}); });
// 새 점수 등록 // 새 점수 등록 (숫자 배열/객체 배열 모두 지원)
for (const scoreData of participant.scores) { const scoreItems = Array.isArray(participant.scores)
// 핵디캡 값이 없는 경우 참가자의 핵디캡 값 사용 ? participant.scores.map((s, idx) => (
const handicap = scoreData.handicap !== undefined ? scoreData.handicap : (participant.handicap || 0); typeof s === 'number'
// 총점수가 없는 경우 원점수 사용 ? { gameNumber: idx + 1, score: s }
const totalScore = scoreData.totalScore !== undefined ? scoreData.totalScore : scoreData.score; : s
))
: [];
for (const s of scoreItems) {
const gameNumber = Number(s.gameNumber ?? 0) || 0;
const baseScore = Number(s.score ?? 0) || 0;
const handicap = s.handicap !== undefined ? Number(s.handicap) : Number(participant.handicap || 0);
const totalScore = s.totalScore !== undefined ? Number(s.totalScore) : baseScore;
if (gameNumber <= 0) continue;
await EventScore.create({ await EventScore.create({
eventId: event.id, eventId: event.id,
participantId: eventParticipant.id, participantId: eventParticipant.id,
gameNumber: scoreData.gameNumber, gameNumber,
score: scoreData.score, score: baseScore,
handicap: handicap, handicap,
totalScore: totalScore, totalScore,
teamNumber: participant.teamNumber || null teamNumber: participant.teamNumber || null
}, { transaction: t }); }, { transaction: t });
} }