Skip to content

Commit

Permalink
GoGo
Browse files Browse the repository at this point in the history
  • Loading branch information
KimKyuBong committed Nov 17, 2023
1 parent 509324e commit 0f5977a
Show file tree
Hide file tree
Showing 9 changed files with 428 additions and 217 deletions.
25 changes: 13 additions & 12 deletions __test__/testCode.test.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
const InventoryService = require("../utils/inventory")
const InventoryService = require("../utils/inventory");

const startDate = "2023-11-01"
const endDate = "2023-11-12"



it('1', async () => {
const test = await InventoryService.calculateInventory(endDate);

console.log(JSON.stringify(test, null, 2))
const startDate = "2023-11-01";
const endDate = "2023-11-14";
// 엑셀생성 자료 테스트
it("1", async () => {
// await InventoryService.createSnapshotForItem(115, 11);
// await InventoryService.createSnapshotForItem(407, 15);
const test = await InventoryService.getCombinedChanges(startDate, endDate);
console.log(test);
});



// it("2", async () => {
// const test = await InventoryService.getReceiptChanges(startDate, endDate);
// console.log(test);
// });
91 changes: 48 additions & 43 deletions models/index.js
Original file line number Diff line number Diff line change
@@ -1,91 +1,96 @@
'use strict';
"use strict";

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const process = require('process');
const fs = require("fs");
const path = require("path");
const Sequelize = require("sequelize");
const process = require("process");
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const env = process.env.NODE_ENV || "development";
const config = require("../config/config")[env];
const db = {};

function toPascalCase(str) {
return str
// 먼저 모든 언더스코어(_)를 공백으로 치환합니다.
.replace(/_/g, ' ')
// 단어의 첫 글자만 대문자로 변환합니다.
.replace(/\w\S*/g, (txt) => {
return txt.charAt(0).toUpperCase() + txt.substr(1);
})
// 공백을 제거합니다.
.replace(/\s/g, '');
return (
str
// 먼저 모든 언더스코어(_)를 공백으로 치환합니다.
.replace(/_/g, " ")
// 단어의 첫 글자만 대문자로 변환합니다.
.replace(/\w\S*/g, (txt) => {
return txt.charAt(0).toUpperCase() + txt.substr(1);
})
// 공백을 제거합니다.
.replace(/\s/g, "")
);
}

let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config);
sequelize = new Sequelize(
config.database,
config.username,
config.password,
config,
);
}

fs
.readdirSync(__dirname)
.filter(file => {
fs.readdirSync(__dirname)
.filter((file) => {
return (
file.indexOf('.') !== 0 &&
file.indexOf(".") !== 0 &&
file !== basename &&
file.slice(-3) === '.js' &&
file.indexOf('.test.js') === -1
file.slice(-3) === ".js" &&
file.indexOf(".test.js") === -1
);
})
.forEach(file => {
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
const modelName = toPascalCase(file.replace('.js', ''));
.forEach((file) => {
const model = require(path.join(__dirname, file))(
sequelize,
Sequelize.DataTypes,
);
const modelName = toPascalCase(file.replace(".js", ""));
db[modelName] = model;
});

Object.keys(db).forEach(modelName => {
Object.keys(db).forEach((modelName) => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});


// Items 모델에 스냅샷 관계 설정
db.Items.hasMany(db.InventorySnapshots, {
foreignKey: 'itemId', // InventorySnapshots 모델의 컬럼 이름
as: 'snapshots'
foreignKey: "itemId", // InventorySnapshots 모델의 컬럼 이름
as: "snapshots",
});

db.Items.hasMany(db.Receipt, {
foreignKey: 'item_id', // Receipt 모델의 아이템 관련 컬럼 이름
as: 'receipts'
foreignKey: "item_id", // Receipt 모델의 아이템 관련 컬럼 이름
as: "receipts",
});

db.Items.hasMany(db.Inventory, {
foreignKey: 'item_id', // Receipt 모델의 아이템 관련 컬럼 이름
as: 'inventory'
foreignKey: "item_id", // Receipt 모델의 아이템 관련 컬럼 이름
as: "inventory",
});

// InventorySnapshots 모델에 아이템 관계 설정
db.InventorySnapshots.belongsTo(db.Items, {
foreignKey: 'itemId', // InventorySnapshots 모델의 컬럼 이름
as: 'item'
foreignKey: "itemId", // InventorySnapshots 모델의 컬럼 이름
as: "item",
});


db.Inventory.belongsTo(db.Items, {
foreignKey: 'item_id',
as: 'item'
foreignKey: "item_id",
as: "item",
});


db.Receipt.belongsTo(db.Items, {
foreignKey: 'item_id',
as: 'item'
foreignKey: "item_id",
as: "item",
});


db.sequelize = sequelize;
db.Sequelize = Sequelize;
console.log(Object.keys(db));
Expand Down
12 changes: 7 additions & 5 deletions routes/admin/adminRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@ const express = require("express");
const router = express.Router();
const { checkAdminTokens } = require("@token");


// add, remove를 insert로 통합
const insertInventoryRouter = require("./inventory/insertInventory");
const stockInfoRouter = require("./inventory/stockInfo");
const itemCheckRouter = require("./inventory/itemCheck");
const inventoryCheckRouter = require("./inventory/inventoryCheck");
const receiptCheckRouter = require("./inventory/receiptCheck");
const inventoryExcelRouter = require("./inventory/excel");
// const removedItemBarcode = require("./inventory/removeItemBarcode");

const barcodeRouter = require("./auth/barcode");


const adminChargeUserLogRouter = require("./transaction/adminChargeUserLog");
const adminPayUserLogRouter = require("./transaction/adminPayUserLog");
const chargeRouter = require("./transaction/charge");
Expand All @@ -24,9 +25,8 @@ const allChargeRouter = require("./all/allCharge");

const pwChangeRouter = require("./auth/pwchange");


// 아래 모든 요청에 대해 AdminToken 검증을 실시함
router.use(checkAdminTokens)
router.use(checkAdminTokens);

router.use("/charge", chargeRouter);
router.use("/pay", payRouter);
Expand All @@ -42,9 +42,11 @@ router.use("/alluser", allUserRouter);
router.use("/pwchange", pwChangeRouter);

router.use("/insertinventory", insertInventoryRouter);
router.use("/stockInfo", stockInfoRouter);
router.use("/itemCheck", itemCheckRouter);
router.use("/inventoryCheck", inventoryCheckRouter);
router.use("/receiptCheck", receiptCheckRouter);
router.use("/excelDownload", inventoryExcelRouter);
// router.use("/removedItemBarcode", removedItemBarcode);


module.exports = router;
17 changes: 8 additions & 9 deletions routes/admin/inventory/inventoryCheck.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,17 @@ router.get("/", async (req, res) => {

try {
// 재고 변동사항을 조회합니다.
const inventoryChanges = await InventoryService.getInventoryChanges(start_date, end_date);
// const inventoryChanges = await InventoryService.getInventoryChanges(start_date, end_date);
// const test = InventoryService.getInventoryByDate(end_date)
// console.log(InventoryService.getInventoryByDate(test))
const inventoryChanges = await InventoryService.getInventoryChanges(
start_date,
end_date,
);

if (inventoryChanges.length > 0) {
// 재고 스냅샷을 생성합니다.
// await InventoryService.createInventorySnapshot();
// const test = await InventoryService.getInventoryByDate(end_date)
// console.log(test)
res.status(200).send(inventoryChanges);
} else {
res.status(204).json({ message: "해당 기간에 재고가 존재하지 않습니다." });
res
.status(204)
.json({ message: "해당 기간에 재고가 존재하지 않습니다." });
}
} catch (err) {
console.error("Error", err);
Expand Down
20 changes: 20 additions & 0 deletions routes/admin/inventory/itemCheck.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const express = require("express");
const router = express.Router();
const InventoryService = require("@inventory");

router.get("/", async (req, res) => {
try {
const inventoryChanges = await InventoryService.getItemList();

if (inventoryChanges.length > 0) {
res.status(200).send(inventoryChanges);
} else {
res.status(204).json({ message: "아이템 목록이 없습니다." });
}
} catch (err) {
console.error("Error", err);
res.status(500).json({ error: "Internal server error." });
}
});

module.exports = router;
28 changes: 28 additions & 0 deletions routes/admin/inventory/receiptCheck.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
const express = require("express");
const router = express.Router();
const InventoryService = require("@inventory");

router.get("/", async (req, res) => {
const { start_date, end_date } = req.query;

try {
// 재고 변동사항을 조회합니다.
const inventoryChanges = await InventoryService.getReceiptChanges(
start_date,
end_date,
);

if (inventoryChanges.length > 0) {
res.status(200).send(inventoryChanges);
} else {
res
.status(204)
.json({ message: "해당 기간에 재고가 존재하지 않습니다." });
}
} catch (err) {
console.error("Error", err);
res.status(500).json({ error: "Internal server error." });
}
});

module.exports = router;
28 changes: 28 additions & 0 deletions routes/admin/inventory/stockInfo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
const express = require("express");
const router = express.Router();
const InventoryService = require("@inventory");

router.get("/", async (req, res) => {
const { start_date, end_date } = req.query;

try {
// 재고 변동사항을 조회합니다.
const inventoryChanges = await InventoryService.getCombinedChanges(
start_date,
end_date,
);

if (inventoryChanges.length > 0) {
res.status(200).send(inventoryChanges);
} else {
res
.status(204)
.json({ message: "해당 기간에 재고가 존재하지 않습니다." });
}
} catch (err) {
console.error("Error", err);
res.status(500).json({ error: "Internal server error." });
}
});

module.exports = router;
27 changes: 21 additions & 6 deletions utils/date.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,42 @@
const moment = require('moment-timezone');
const moment = require("moment-timezone");

function convertKSTtoUTC(kstDate) {
// KST 날짜 문자열을 받아서 UTC로 변환한 Moment 객체를 반환합니다.
return moment.tz(kstDate, 'Asia/Seoul').utc().format();
return moment.tz(kstDate, "Asia/Seoul").utc().format();
}

function addEndTimeAndConvertToUTC(kstDate) {
// KST 기준으로 하루의 끝에 해당하는 시간을 설정합니다.
const kstEndDate = moment.tz(kstDate, 'Asia/Seoul').endOf('day');
const kstEndDate = moment.tz(kstDate, "Asia/Seoul").endOf("day");
// 그리고 UTC로 변환합니다.
return kstEndDate.utc().format();
}

function subtractOneDayAndConvertToUTC(kstDate) {
// KST 날짜 문자열을 받아서 UTC로 변환한 후 하루를 빼고 반환합니다.
const BeforeDay = moment.tz(kstDate, 'Asia/Seoul').endOf('day').subtract(1, 'day')
const BeforeDay = moment
.tz(kstDate, "Asia/Seoul")
.endOf("day")
.subtract(1, "day");
return BeforeDay.utc().format();
}

function getPreviousMonday(kstDate) {
// 주어진 KST 날짜로부터 이전 주의 월요일을 찾음
const kstMoment = moment.tz(kstDate, "Asia/Seoul");
const dayOfWeek = kstMoment.day(); // 주어진 날짜의 요일 (0: 일요일, 1: 월요일, ..., 6: 토요일)

// 월요일(1)에서 현재 요일을 뺀 만큼 이전 주의 월요일로 이동
const daysToPreviousMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
const previousMonday = kstMoment.subtract(daysToPreviousMonday, "days");

// 이전 주의 월요일을 UTC로 변환하여 반환
return previousMonday.utc().format();
}

module.exports = {
convertKSTtoUTC,
addEndTimeAndConvertToUTC,
subtractOneDayAndConvertToUTC
};
subtractOneDayAndConvertToUTC,
getPreviousMonday,
};
Loading

0 comments on commit 0f5977a

Please sign in to comment.