/* @tier hard @module py @transform payment-util */ /* * py_cu_0002.c - 지급 공통 유틸리티 (plain C) [tier=hard] */ #include "py_cu_0002.h" #include /* 원리금 이자액: rate_bp 연이율을 월할(1/12) 적용 */ long py_cu_0002_fee(long amount, int rate_bp) { long annual_bp; long interest; if (amount <= 0 || rate_bp < 0) return 0; annual_bp = (long)rate_bp; interest = (amount * annual_bp) / (10000L * 12L); if (interest < 0) interest = 0; return interest; } /* 반올림(오사오입, 0.5 이상 올림)으로 unit 정규화 */ long py_cu_0002_round_unit(long amount, long unit) { long q, r; if (unit <= 0) return amount; q = amount / unit; r = amount - q * unit; if (r < 0) { r += unit; q -= 1; } if (r * 2 >= unit) q += 1; return q * unit; } /* Luhn 체크섬 유효성으로 분류: 유효=2, 무효 소액=0, 무효 고액=1 */ int py_cu_0002_classify(long amount) { long v = amount < 0 ? -amount : amount; int sum = 0, alt = 0, d; long t = v; while (t > 0) { d = (int)(t % 10); if (alt) { d *= 2; if (d > 9) d -= 9; } sum += d; alt = !alt; t /= 10; } if (sum % 10 == 0) return 2; return v < 1000000L ? 0 : 1; }