공과금
공과금은 공공 서비스(전기, 수도, 가스 등) 사용에 대한 요금을 의미합니다. 여기서는 공공 서비스의 고지서 데이터를 다룹니다.
공과금은 전기요금(ELECTRIC), 수도요금(WATER), 가스요금(GAS) 세 가지로 구분됩니다.
각 공과금은 고객 정보(납부자번호)를 기준으로 관리되며, 종류, 고객번호, 청구월로 구분됩니다. (종류, 고객번호, 청구월 조합이 Unique Key라는 것을 의미합니다.)
공통 구성 요소
Section titled “공통 구성 요소”모든 공과금은 다음의 공통 속성을 가집니다.
billingPeriod와 같이 객체 타입인 경우, 별도의 타입 정의를 참고하세요.
interface BillingPeriod { start: string; // 청구 시작일 (예: '2023-10-01') end: string; // 청구 종료일 (예: '2023-10-31')}interface CommonUtility { type: 'ELECTRIC' | 'WATER' | 'GAS'; // 공과금 종류 customerNumber: string; // 고객번호 billingMonthId: number; // 청구월 ID billingPeriod: BillingPeriod; // 청구기간 totalAmount: number; // 이번 달 청구 금액 unpaidAmount: number; // 전월 미납 금액 billingAmount: number; // 총 청구금액 (이번 달 금액 + 전월 미납액) paidAmount: number; // 납부한 금액 paymentDueDate: Date; // 납부마감일 usage: number; // 사용량 (단위: kWh, m³) usageFee: number; // 사용요금 vat: number; // 부가가치세}data class BillingPeriod( val start: String, // 청구 시작일 (예: '2023-10-01') val end: String // 청구 종료일 (예: '2023-10-31'))interface CommonUtility { val type: String // 공과금 종류 ('ELECTRIC', 'WATER', 'GAS') val customerNumber: String // 고객번호 val billingMonthId: Long // 청구월 ID val billingPeriod: BillingPeriod // 청구기간 val totalAmount: Double // 이번 달 청구 금액 val unpaidAmount: Double // 전월 미납 금액 val billingAmount: Double // 총 청구금액 (이번 달 금액 + 전월 미납액) val paidAmount: Double // 납부한 금액 val paymentDueDate: Date // 납부마감일 val usage: Double // 사용량 (단위: kWh, m³) val usageFee: Double // 사용요금 val vat: Double // 부가가치세}type: 공과금 종류.ELECTRIC,WATER,GAS중 하나입니다.customerNumber: 해당 공과금이 속한 고객을 식별하는 번호입니다.billingMonthId: 공과금이 귀속되는 청구월의 고유 ID입니다.billingPeriod: 요금이 부과된 사용 기간입니다.totalAmount: 해당 월에 발생한 순수 사용 요금입니다.unpaidAmount: 이전 청구 기간에서 납부되지 않고 이월된 미납 금액입니다.billingAmount: 총 청구금액. 이번 달 사용 요금과 전월 미납액을 합산한 최종 청구 금액입니다. (산출식:totalAmount+unpaidAmount)paidAmount: 현재 청구 기간에 대해 이미 납부된 금액입니다.paymentDueDate: 요금을 납부해야 하는 마지막 날짜입니다.usage: 해당 기간 동안 사용한 자원의 양입니다. (단위: kWh, m³)usageFee: 사용량에 따라 부과되는 요금입니다.vat: 요금에 부과되는 부가가치세입니다.
공과금 납부 상태
Section titled “공과금 납부 상태”공과금은 납부 상태에 따라 다음과 같이 구분할 수 있습니다.
- 미납: 납부한 요금이 없고, 납부 마감일이 지나지 않은 상태입니다.
- 납부 완료: 청구금액과 납부한 요금이 일치하는 상태입니다.
- 연체: 납부 마감일이 지났음에도 청구금액 전액이 납부되지 않은 상태입니다.
- 부분 납부: 납부한 요금이 0보다 크지만, 청구금액보다는 작은 상태입니다.
아래는 납부 상태를 계산하는 로직의 예시입니다.
function getPaymentState( billingAmount: number, paidAmount: number, paymentDueDate: Date): '미납' | '납부 완료' | '연체' | '부분 납부' | '알 수 없음' { if (paidAmount === 0 && new Date() <= paymentDueDate) { return '미납'; } else if (billingAmount === paidAmount) { return '납부 완료'; } else if (new Date() > paymentDueDate && paidAmount < billingAmount) { return '연체'; } else if (paidAmount > 0 && paidAmount < billingAmount) { return '부분 납부'; } return '알 수 없음';}fun getPaymentState( billingAmount: Double, paidAmount: Double, paymentDueDate: Date): String { return when { paidAmount == 0.0 && Date.now() <= paymentDueDate -> "미납" billingAmount == paidAmount -> "납부 완료" Date.now() > paymentDueDate && paidAmount < billingAmount -> "연체" paidAmount > 0.0 && paidAmount < billingAmount -> "부분 납부" else -> "알 수 없음" }}종류별 상세 구성
Section titled “종류별 상세 구성”interface ElectricityUtility extends CommonUtility { type: 'ELECTRIC'; baseFee: number; // 기본요금 climateFee: number; // 기후환경요금 fuelAdjustment: number; // 연료비 조정액 powerIndustryFund: number; // 전력산업기금}data class ElectricityUtility( override val customerNumber: String, override val billingMonthId: Long, override val billingPeriod: BillingPeriod, override val totalAmount: Double, override val unpaidAmount: Double, override val billingAmount: Double, override val paidAmount: Double, override val paymentDueDate: Date, override val usage: Double, override val usageFee: Double, override val vat: Double, // 수도요금의 부가세는 0입니다. val baseFee: Double, // 기본요금 val climateFee: Double, // 기후환경요금 val fuelAdjustment: Double, // 연료비 조정액 val powerIndustryFund: Double // 전력산업기금) : CommonUtility { override val type: String = "ELECTRIC"}전기요금은 공통 항목에 더해 다음의 속성을 가집니다.
baseFee: 사용량과 관계없이 부과되는 고정 기본요금입니다.climateFee: 기후 변화 대응 및 환경 개선을 위해 부과되는 요금입니다.fuelAdjustment: 발전에 사용된 연료비 변동을 반영하여 조정되는 금액입니다.powerIndustryFund: 전력 산업 발전을 위해 조성되는 기금입니다.
interface WaterUtility extends CommonUtility { type: 'WATER'; baseFee: number; // 기본요금 environmentalFee: number; // 환경개선부담금 waterSupplyFee: number; // 상수도요금 sewageFee: number; // 하수도요금 waterUseFee: number; // 물이용부담금}data class WaterUtility( override val customerNumber: String, override val billingMonthId: Long, override val billingPeriod: BillingPeriod, override val totalAmount: Double, override val unpaidAmount: Double, override val billingAmount: Double, override val paidAmount: Double, override val paymentDueDate: Date, override val usage: Double, override val usageFee: Double, override val vat: Double, // 수도요금의 부가세는 0입니다. val baseFee: Double, // 기본요금 val environmentalFee: Double, // 환경개선부담금 val waterSupplyFee: Double, // 상수도요금 val sewageFee: Double, // 하수도요금 val waterUseFee: Double // 물이용부담금) : CommonUtility { override val type: String = "WATER"}수도요금은 공통 항목에 더해 다음의 속성을 가집니다.
baseFee: 사용량과 관계없이 부과되는 고정 기본요금입니다.environmentalFee: 수질 오염 방지 및 환경 개선을 위해 부과되는 부담금입니다.waterSupplyFee: 깨끗한 물(상수) 공급에 대한 요금입니다.sewageFee: 사용한 물을 처리(하수)하는 데 드는 비용에 대한 요금입니다.waterUseFee: 수자원 관리 및 개발을 위해 부과되는 부담금입니다.
수도요금의 경우, 부가가치세(
vat)는 0으로 처리됩니다.
interface GasUtility extends CommonUtility { type: 'GAS'; baseFee: number; // 기본요금}data class GasUtility( override val customerNumber: String, override val billingMonthId: Long, override val billingPeriod: BillingPeriod, override val totalAmount: Double, override val unpaidAmount: Double, override val billingAmount: Double, override val paidAmount: Double, override val paymentDueDate: Date, override val usage: Double, override val usageFee: Double, override val vat: Double, val baseFee: Double // 기본요금) : CommonUtility { override val type: String = "GAS"}가스요금은 공통 항목에 더해 다음의 속성을 가집니다.
baseFee: 사용량과 관계없이 부과되는 고정 기본요금입니다.
검침기록 모계약일때 각 공과금의 검침 기록을 관리합니다.
배분방식 공과금의 배분 방식을 정의합니다.
공과금 공과금의 공급 계약을 관리합니다. 공과금 납부자를 식별하는 고유한 고객번호를 관리합니다.
청구월 특정 기간 동안 발생한 관리비를 청구하기 위한 기준이 되는 월입니다.