import DateFormatter from "../date/date-formatter"; import DataConverter from "./data-converter"; import { SEOUL_REGION_TELEPHONE_NUMBER } from "../common/constants"; import { chargingPowerListData } from "../common/data/csms/charging-price/charging-power-list.data"; import { reportTypeData } from "../common/data/chungguk-admin/report/list/report-type.data"; import { reportStatusData } from "../common/data/chungguk-admin/report/list/report-status.data"; export default class DataFormatter { /** * 숫자가 아니면 삭제되며 숫자가 주어지면 2자리-3자리-4자리 혹은 3자리-4자리-4자리로 format해 return한다. * * "01011112222" -> "010-1111-2222" * "021234567" -> "02-123-4567" * * @static * @public * @return string * @param number */ static addHyphenToNumber(number: string) { return number .replace(/[^0-9]/g, "") .replace(/^(\d{2,3})(\d{3,4})(\d{4})$/, "$1-$2-$3"); } /** * value의 값이 존재하면 그대로 보여주고 없을 경우 "-"를 return한다. * * null -> "-" * "hello" -> "hello" * * @static * @public * @return string * @param value */ static checkDataEmptyValue(value?: string | null): string { return !value || "" === value ? "-" : value; } /** * value가 0이거나 값이 없으면 return "-", 1 이상이면 value를 return한다. * * null -> "-" * 0 -> "-" * 5 -> 5 * * @static * @public * @return "-" or value * @param value */ static checkEmptyAndZeroValue(value: number): number | string { return !value || 0 === value ? "-" : value; } /** * value가 null이나 undefined일 경우 "-" return, 아닐경우 value를 return한다. * * null -> "-" * undefined -> "-" * "hello" -> "hello" * * @static * @public * @return '-' or value * @param value */ static checkNullAndUndefinedValue(value: any) { return null === value || undefined === value ? "-" : value; } /** * value가 null이나 return, 아닐경우 value를 return한다. * * null -> "-" * undefined -> undefined * "hello" -> "hello" * * @static * @public * @return "-" or value * @param value */ static checkNullValue(value: any) { return null !== value ? value : "-"; } /** * link에 html a tag를 넣어 return한다. * * @static * @public * @return html tag * @param link string url */ static checkValidLink(link: string) { const linkRegex = /^(https?:\/\/)?(\w)+(\.\w+)+$/g; return linkRegex.test(link) ? `${link}` : link; } /** * 인자로 두 수를 넣으면 ~kW이상 ~kW 미만으로 convert해 return한다. * 400.01 이상일 경우 ~KW이상 * 두 인자가 같을 경우 ~kW 로 표현된다. * * 100,100 -> 100kW * 500, 400.01 -> 400.01이상 * 30, 100 -> 7kW 이상 100kW 미만 * * @static * @public * @return 400초과면 400kW 이상, 400 이하이면 ~kW 이상 kW미만으로 표현 * @param from * @param to */ static convertChargingPowerValueToRangeString(from: number, to: number) { const fromValue = DataFormatter.findPowerValue("from", from); const toValue = DataFormatter.findPowerValue("to", to); if (from === to) { return `${fromValue}kW`; } else if (400.01 === to) { return `${fromValue}kW 이상`; } else { return `${fromValue}kW 이상 ${toValue}kW 미만`; } } /** * value의 값이 null이면 null return, 아니면 value를 return한다. * * null -> null * "hello" -> "hello" * 2 -> 2 * * @static * @public * @return null or value * @param value */ static convertEmptyValueToNull(value: string | number | undefined | null) { return null !== value ? value : null; } /** * value의 값이 null이 아니면 unit을 붙여주고 존재하지 않을 경우 return "-" * * null, "원" -> "-" * 300, "원" -> "300원" * * @static * @public * @return value + unit or "-" * @param value * @param unit 단위 */ static convertEmptyValueToNullAndInsertUnit( value: number | null, unit: string ) { return null === value ? "-" : value + unit; } /** * 전화번호 input값 02로 시작할 경우 2자리-4자리-4자리 그 외에 경우에는 3자리-4자리-4자리로 format해 fieldName의 field에 set한다. * * "0101234-4567" , "phoneNumber" -> "010-1234-4567" phoneNumber 필드에 set * "021234567", "phoneNumber" -> "02-123-4567"를 phoneNumber 필드에 set * * @static * @public * @return 02-1111-2222 or 010-1111-2222 * @param value * @param setFieldValue form의 setFiledValue * @param fieldName form의 fieldName */ static convertPhoneNumberBetweenDashBarInForm( value: string, setFieldValue: (field: string, value: any) => void, fieldName: string ) { setFieldValue( fieldName, value .replace(/[^0-9]/g, "") .replace( 12 === value.length && value.startsWith(SEOUL_REGION_TELEPHONE_NUMBER) ? /^(\d{0,2})(\d{0,4})(\d{0,4})$/g : /^(\d{2,3})(\d{3,4})(\d{4})$/g, "$1-$2-$3" ) .replace(/(\-{1,2})$/g, "") ); } /** * type으로 from이 주어지면 power보다 큰 값을 찾아 그 앞의 값은 반환하며 to가 주어지면 주어진 power보다 작은 값을 찾아 그 뒤의 값을 return한다. * * "from", chargingPowerListData[11] -> chargingPowerListData[11] * "to", chargingPowerListData[11] -> chargingPowerListData[10] * "to", chargingPowerListData[0] - 1 -> chargingPowerListData[0] * "from", 500 -> chargingPowerListData[chargingPowerListData.length - 1] * * @static * @public * @return power * @param type from: 주어진 power보다 큰 값을 찾아 그 앞의 값으로 변환. * to: 주어진 power보다 작은 값을 찾아 그 뒤의 값으로 변환. * @param power */ static convertPowerData(type: "from" | "to", power: number): number { const powerListLength = chargingPowerListData.length; if ("from" === type) { for (let i = 0; i < powerListLength; i++) { if (power < chargingPowerListData[i]) { return chargingPowerListData[i - 1]; } } return chargingPowerListData[powerListLength - 1]; } else { for (let i = powerListLength - 1; i > 0; i--) { if (power > chargingPowerListData[i]) { return chargingPowerListData[i]; } } return chargingPowerListData[0]; } } /** * type에 따라 주어진 power보다 작거나 같은값 혹은 크거나 같은 값 중 가장 작은값, 가장 큰 값을 return한다. * * "to", 90 -> 100 * "from", 90 -> 50 * * @static * @public * @return * @param type from: chargingPowerListData에서 주어진 power보다 작거나 같은 값 중 가장 큰 값. * to: chargingPowerListData에서 주어진 power보다 크거나 같은 값 중 가장 작은 값. * @param power */ static findPowerValue(type: "from" | "to", power: number) { const powerListLength = chargingPowerListData.length; let powerValue; if ("from" === type) { powerValue = chargingPowerListData[0]; for (let i = 0; i < powerListLength - 2; i += 2) { if (power >= chargingPowerListData[i]) { powerValue = chargingPowerListData[i]; } } } else if ("to" === type) { powerValue = chargingPowerListData[powerListLength - 2]; for (let i = powerListLength - 2; i >= 0; i -= 2) { if (power <= chargingPowerListData[i]) { powerValue = chargingPowerListData[i]; } } } return powerValue; } /** * value에 3자리마다 ,를 넣고 뒤에 unit을 붙인다. showZero에 따라 0을 보여줄지 정하고 value가 undefined거나 null일 때 showZero가 false면 "-"를 return한다. * * 20000, "원", true -> "20,000원" * undefined, "원", false -> "-" * * @static * @public * @return string * @param value * @param unit string * @param showZero boolean */ static formatCommaValue( value: number | null | undefined, unit: string, showZero: boolean ): string { return null === value || undefined === value ? showZero ? "0" + unit : "-" : value.toLocaleString("ko-KR") + unit; } /** * null이나 undefined를 넘기면 "-" return, number를 넘기면 3자리 마다 , 추가해 return한다. * * null -> "-" * undefined -> "-" * 3000 -> "3,000" * * @static * @public * @return string * @param value */ static formatCommaValueNoUnit(value: number | null | undefined): string { return null === value || undefined === value ? "-" : value.toLocaleString("ko-KR"); } /** * 아우토크립트.멋진회사 -> 아우토크립트(멋진회사) convert하는 함수 * * @static * @public * @return '.'이 포함되면 .이후는 ()안에 포함. * @param name 운영기관 이름 */ static formatOperatingInstitutionName(name: string) { if (!name) return name; const [primary, secondary] = name.split("."); return `${primary}${secondary ? `(${secondary})` : ""}`; } /** * 아우토크립트(멋진회사) -> 아우토크립트.멋진회사 convert하는 함수 * * @static * @public * @return ()안에 포함된 이름을 '.'을 뒤에 붙임. * @param name 운영기관 이름 */ static parseOperatingInstitutionName(name: string) { if (!name) return name; const [primary, secondary] = name.replace(")", "").split("("); return `${primary}${secondary ? `.${secondary}` : ""}`; } /** * 인자로 넘긴 array가 length가 있으면 filterList에 array의 value, isAll은 false를 넣어 return하고 빈 배열이면 그 배열을 다시 return한다. * * { filterList: [{ value: "kkkk" }] } -> { filterList: ["kkkk"], isAll: false } * { filterList: [] } -> { filterList: [] } * * @static * @public * @return filterList, isAll을 포함한 object * @param arr filterList: {value: string}[] */ static parseValueList(arr: any) { if (0 === arr.filterList.length) return arr; return { filterList: arr.filterList.map((item: any) => item.value), isAll: false, }; } /** * 주차 요금을 입력해 주세요 질문에 들어온 대답을 분/원으로 format해 return한다. * * [{ question: "주차 요금을 입력해 주세요", answer: "기본요금 : 5/1000" },] * -> [{ answer: ["기본요금 :\n5분\n / \n1,000원"], question: "주차 요금을 입력해 주세요" },] * [{ question: "주차 요금을 입력해 주세요", answer: "기본요금 : 120/1000" },] -> [{ answer: ["기본요금 :\n2시간\n / \n1,000원"], question: "주차 요금을 입력해 주세요",}] * * @static * @public * @return string * @param list */ static convertChargePriceList(list: any) { const convertedReportQnaList: Array = []; let hasChargePriceList = false; const reportContent = list?.filter((item: any) => { if ("주차 요금을 입력해 주세요" === item.question) { hasChargePriceList = true; const splitAnswer = item.answer.split("/"); const chargePrice = Number(splitAnswer[1]).toLocaleString("ko-KR") + "원"; let hourAndMinute: any = Number(splitAnswer[0].slice(6)); const chargeName = splitAnswer[0].slice(0, 6); if (hourAndMinute > 60) { hourAndMinute = chargeName + "\n" + Math.floor(hourAndMinute / 60) + "시간"; } else { hourAndMinute = chargeName + "\n" + hourAndMinute + "분"; } convertedReportQnaList.push(hourAndMinute + "\n / \n" + chargePrice); } else { return item; } }); return hasChargePriceList ? [ ...reportContent, { question: "주차 요금을 입력해 주세요", answer: convertedReportQnaList, }, ] : reportContent; } /** * 제보에 대한 정보가 인자로 주어지면 그 정보를 convert해 return한다. * * "반영 여부", true -> "반영" * "승인 상태", 1 -> "승인 완료" * "제보 일시", "2024-01-03T05:39:14.230Z" -> "2024-01-03 14:39:14" * "최종 업데이트", "2024-01-03T05:39:14.230Z" -> "2024-01-03 14:39:14" * "담당자", 3905 -> "계정(3905)" * "제보 구분", true -> "자동 반영 제보" * "제보 수집 항목", 2 -> "주차 요금" * * @static * @public * @return string * @param field * @param info */ static reportConvertValue(field: string, info: any) { if ("반영 여부" === field) { return info ? "반영" : "미반영"; } if ("제보 구분" === field) { return info ? "자동 반영 제보" : "수동 반영 제보"; } if ("제보 수집 항목" === field) { return DataConverter.convertData(reportTypeData, "index", info) ?.description; } if ("승인 상태" === field) { return DataConverter.convertData(reportStatusData, "index", info) ?.description; } if ("담당자" === field) { return isNaN(info) || info === null ? `관리자(${info ? info : "-"})` : `계정(${info})`; } if ("제보 일시" === field || "최종 업데이트" === field) { return DateFormatter.noSetKoreanHour(info, "yyyy-MM-dd HH:mm:ss"); } return info; } }