/* @tier easy @module mm @transform master-util */ /* * mm_cu_0008.c - 마스터 공통 유틸리티 (plain C) [tier=easy] */ #include "mm_cu_0008.h" #include /* 상·하한 적용 정률 수수료 */ long mm_cu_0008_fee(long amount, int rate_bp) { long fee; const long floor_fee = 100L; const long cap_fee = 500000L; if (amount <= 0 || rate_bp < 0) return 0; fee = (amount * (long)rate_bp) / 10000L; if (fee < floor_fee) fee = floor_fee; if (fee > cap_fee) fee = cap_fee; return fee; } /* 최근접 배수 선택: 아래/위 배수 중 더 가까운 쪽으로 정규화 */ long mm_cu_0008_round_unit(long amount, long unit) { long down, up, dd, du; if (unit <= 0) return amount; if (amount % unit == 0) return amount; down = (amount / unit) * unit; if (amount > 0) up = down + unit; else up = down - unit; dd = amount - down; if (dd < 0) dd = -dd; du = up - amount; if (du < 0) du = -du; return dd <= du ? down : up; } /* amount 를 YYYYMMDD 로 보고 월말/윤년 유효성 분류: 0=무효 1=정상 2=월말 */ int mm_cu_0008_classify(long amount) { int y = (int)(amount / 10000L); int m = (int)((amount / 100L) % 100L); int d = (int)(amount % 100L); int dim[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int leap, last; if (m < 1 || m > 12 || d < 1) return 0; leap = (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0); last = dim[m - 1]; if (m == 2 && leap) last = 29; if (d > last) return 0; if (d == last) return 2; return 1; }