Files
tk-factory-services/system1-factory/api/controllers/settlementController.js
Hyungi Ahn 7c1369a1be feat(purchase): 구매 취소/반품 + 입고일 기준 월별 분석
- 상태 추가: cancelled(구매취소), returned(반품)
- API: PUT /:id/cancel, /:id/return, /:id/revert-cancel
- 데스크탑: 구매완료→취소 버튼, 입고완료→반품 버튼, 취소→되돌리기
- 분석 페이지: 구매일/입고일 기준 전환 토글, 입고일 기준 월간 분류 집계 + 입고 목록
- Settlement API: GET /received-summary, /received-list (입고일 기준)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 11:07:19 +09:00

103 lines
4.3 KiB
JavaScript

const SettlementModel = require('../models/settlementModel');
const logger = require('../utils/logger');
const SettlementController = {
// 월간 요약 (분류별 + 업체별)
getMonthlySummary: async (req, res) => {
try {
const { year_month } = req.query;
if (!year_month) return res.status(400).json({ success: false, message: '년월을 선택해주세요.' });
const [categorySummary, vendorSummary] = await Promise.all([
SettlementModel.getCategorySummary(year_month),
SettlementModel.getVendorSummary(year_month)
]);
res.json({ success: true, data: { categorySummary, vendorSummary } });
} catch (err) {
logger.error('Settlement summary error:', err);
res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' });
}
},
// 월간 상세 구매 목록
getMonthlyPurchases: async (req, res) => {
try {
const { year_month } = req.query;
if (!year_month) return res.status(400).json({ success: false, message: '년월을 선택해주세요.' });
const rows = await SettlementModel.getMonthlyPurchases(year_month);
res.json({ success: true, data: rows });
} catch (err) {
logger.error('Settlement purchases error:', err);
res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' });
}
},
// 가격 변동 목록
getPriceChanges: async (req, res) => {
try {
const { year_month } = req.query;
if (!year_month) return res.status(400).json({ success: false, message: '년월을 선택해주세요.' });
const rows = await SettlementModel.getPriceChanges(year_month);
res.json({ success: true, data: rows });
} catch (err) {
logger.error('Settlement priceChanges error:', err);
res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' });
}
},
// 입고일 기준 월간 요약
getMonthlyReceivedSummary: async (req, res) => {
try {
const { year_month } = req.query;
if (!year_month) return res.status(400).json({ success: false, message: '년월을 선택해주세요.' });
const categorySummary = await SettlementModel.getCategorySummaryByReceived(year_month);
res.json({ success: true, data: { categorySummary } });
} catch (err) {
logger.error('Settlement received summary error:', err);
res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' });
}
},
// 입고일 기준 월간 상세 목록
getMonthlyReceivedList: async (req, res) => {
try {
const { year_month } = req.query;
if (!year_month) return res.status(400).json({ success: false, message: '년월을 선택해주세요.' });
const rows = await SettlementModel.getMonthlyReceived(year_month);
res.json({ success: true, data: rows });
} catch (err) {
logger.error('Settlement received list error:', err);
res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' });
}
},
// 정산 완료
complete: async (req, res) => {
try {
const { year_month, vendor_id, notes } = req.body;
if (!year_month || !vendor_id) return res.status(400).json({ success: false, message: '년월과 업체를 선택해주세요.' });
const result = await SettlementModel.completeSettlement(year_month, vendor_id, req.user.id, notes);
res.json({ success: true, data: result, message: '정산 완료 처리되었습니다.' });
} catch (err) {
logger.error('Settlement complete error:', err);
res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' });
}
},
// 정산 취소
cancel: async (req, res) => {
try {
const { year_month, vendor_id } = req.body;
if (!year_month || !vendor_id) return res.status(400).json({ success: false, message: '년월과 업체를 선택해주세요.' });
const result = await SettlementModel.cancelSettlement(year_month, vendor_id);
res.json({ success: true, data: result, message: '정산이 취소되었습니다.' });
} catch (err) {
logger.error('Settlement cancel error:', err);
res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' });
}
}
};
module.exports = SettlementController;