CREATE OR REPLACE PACKAGE finance_util_pkg IS
-- 1. Get current timestamp
FUNCTION get_current_timestamp RETURN TIMESTAMP;
-- 2. Get financial quarter for a given date
FUNCTION get_financial_quarter(p_date DATE) RETURN NUMBER;
-- 3. Calculate simple interest
FUNCTION calculate_simple_interest(p_principal NUMBER,
p_rate NUMBER,
p_time NUMBER) RETURN NUMBER;
-- 4. Calculate compound interest
FUNCTION calculate_compound_interest(p_principal NUMBER,
p_rate NUMBER,
p_time NUMBER,
p_n NUMBER) RETURN NUMBER;
-- 5. Generate unique transaction ID
FUNCTION generate_transaction_id RETURN VARCHAR2;
-- 6. Check if a date is a weekend
FUNCTION is_weekend(p_date DATE) RETURN VARCHAR2;
-- 7. Calculate the number of business days between two dates
FUNCTION business_days_between(p_start_date DATE,
p_end_date DATE) RETURN NUMBER;
-- 8. Convert amount to words (e.g., 123 -> 'One Hundred Twenty-Three')
FUNCTION convert_number_to_words(p_number NUMBER) RETURN VARCHAR2;
-- 9. Get last day of the month
FUNCTION get_last_day_of_month(p_date DATE) RETURN DATE;
-- 10. Get the difference in years between two dates
FUNCTION years_between(p_start_date DATE, p_end_date DATE) RETURN NUMBER;
-- 11. Calculate loan EMI (Equated Monthly Installment)
FUNCTION calculate_emi(p_principal NUMBER,
p_rate NUMBER,
p_time_in_years NUMBER) RETURN NUMBER;
-- 12. Validate an IBAN number (International Bank Account Number)
FUNCTION validate_iban(p_iban VARCHAR2) RETURN VARCHAR2;
-- 13. Calculate monthly savings for retirement target
FUNCTION calculate_retirement_savings(p_target NUMBER,
p_years NUMBER,
p_rate NUMBER) RETURN NUMBER;
-- 14. Get the fiscal year for a given date
FUNCTION get_fiscal_year(p_date DATE) RETURN VARCHAR2;
-- 15. Convert currency (based on a rate)
FUNCTION convert_currency(p_amount NUMBER, p_rate NUMBER) RETURN NUMBER;
-- 16. Get total working hours between two timestamps (excluding weekends)
FUNCTION working_hours_between(p_start_ts TIMESTAMP,
p_end_ts TIMESTAMP) RETURN NUMBER;
-- 17. Generate a random account number
FUNCTION generate_account_number RETURN VARCHAR2;
-- 18. Calculate VAT for a given amount
FUNCTION calculate_vat(p_amount NUMBER, p_vat_rate NUMBER) RETURN NUMBER;
-- 19. Calculate future value of investment (FVI)
FUNCTION calculate_future_value(p_present_value NUMBER,
p_rate NUMBER,
p_time NUMBER) RETURN NUMBER;
-- 20. Get next working day
FUNCTION get_next_working_day(p_date DATE) RETURN DATE;
END finance_util_pkg;
/
CREATE OR REPLACE PACKAGE BODY finance_util_pkg IS
-- 1. Get current timestamp
FUNCTION get_current_timestamp RETURN TIMESTAMP IS
BEGIN
RETURN SYSTIMESTAMP;
END get_current_timestamp;
-- 2. Get financial quarter for a given date
FUNCTION get_financial_quarter(p_date DATE) RETURN NUMBER IS
BEGIN
RETURN TO_NUMBER(TO_CHAR(p_date, 'Q'));
END get_financial_quarter;
-- 3. Calculate simple interest
FUNCTION calculate_simple_interest(p_principal NUMBER,
p_rate NUMBER,
p_time NUMBER) RETURN NUMBER IS
BEGIN
RETURN (p_principal * p_rate * p_time) / 100;
END calculate_simple_interest;
-- 4. Calculate compound interest
FUNCTION calculate_compound_interest(p_principal NUMBER,
p_rate NUMBER,
p_time NUMBER,
p_n NUMBER) RETURN NUMBER IS
BEGIN
RETURN p_principal * POWER((1 + p_rate / (p_n * 100)), p_n * p_time);
END calculate_compound_interest;
-- 5. Generate unique transaction ID
FUNCTION generate_transaction_id RETURN VARCHAR2 IS
BEGIN
RETURN 'TXN-' || TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') ||
DBMS_RANDOM.VALUE(1, 1000000);
END generate_transaction_id;
-- 6. Check if a date is a weekend
FUNCTION is_weekend(p_date DATE) RETURN VARCHAR2 IS
BEGIN
IF TO_CHAR(p_date, 'D') IN ('6', '7') THEN
RETURN 'Yes';
ELSE
RETURN 'No';
END IF;
END is_weekend;
-- 7. Calculate the number of business days between two dates
FUNCTION business_days_between(p_start_date DATE,
p_end_date DATE)
RETURN NUMBER IS
l_days NUMBER := 0;
BEGIN
FOR r IN (SELECT p_start_date + LEVEL - 1 AS current_date
FROM dual
CONNECT BY LEVEL <= p_end_date - p_start_date + 1) LOOP
IF TO_CHAR(r.current_date, 'D') NOT IN ('6', '7') THEN
l_days := l_days + 1;
END IF;
END LOOP;
RETURN l_days;
END business_days_between;
-- 8. Convert amount to words (simplified version)
FUNCTION convert_number_to_words(p_number NUMBER) RETURN VARCHAR2 IS
BEGIN
-- For simplicity, this is a placeholder. Implementing number-to-words
-- requires a more comprehensive solution.
RETURN TO_CHAR(TO_DATE(p_number, 'J'), 'JSP');
END convert_number_to_words;
-- 9. Get last day of the month
FUNCTION get_last_day_of_month(p_date DATE) RETURN DATE IS
BEGIN
RETURN LAST_DAY(p_date);
END get_last_day_of_month;
-- 10. Get the difference in years between two dates
FUNCTION years_between(p_start_date DATE, p_end_date DATE) RETURN NUMBER IS
BEGIN
RETURN MONTHS_BETWEEN(p_end_date, p_start_date) / 12;
END years_between;
-- 11. Calculate loan EMI (Equated Monthly Installment)
FUNCTION calculate_emi(p_principal NUMBER,
p_rate NUMBER,
p_time_in_years NUMBER) RETURN NUMBER IS
l_rate_per_month NUMBER := p_rate / (12 * 100);
l_time_in_months NUMBER := p_time_in_years * 12;
BEGIN
RETURN (p_principal * l_rate_per_month *
POWER(1 + l_rate_per_month, l_time_in_months)) /
(POWER(1 + l_rate_per_month, l_time_in_months) - 1);
END calculate_emi;
-- 12. Validate an IBAN number (simple checksum validation)
FUNCTION validate_iban(p_iban VARCHAR2) RETURN VARCHAR2 IS
BEGIN
-- Simplified validation logic
IF LENGTH(p_iban) BETWEEN 15 AND 34 THEN
RETURN 'Valid';
ELSE
RETURN 'Invalid';
END IF;
END validate_iban;
-- 13. Calculate monthly savings for retirement target
FUNCTION calculate_retirement_savings(p_target NUMBER,
p_years NUMBER,
p_rate NUMBER) RETURN NUMBER IS
l_rate_per_month NUMBER := p_rate / (12 * 100);
l_months NUMBER := p_years * 12;
BEGIN
RETURN p_target / (POWER(1 + l_rate_per_month, l_months) - 1);
END calculate_retirement_savings;
-- 14. Get the fiscal year for a given date
FUNCTION get_fiscal_year(p_date DATE) RETURN VARCHAR2 IS
BEGIN
RETURN TO_CHAR(ADD_MONTHS(p_date, 6), 'YYYY');
END get_fiscal_year;
-- 15. Convert currency (using a given rate)
FUNCTION convert_currency(p_amount NUMBER, p_rate NUMBER) RETURN NUMBER IS
BEGIN
RETURN p_amount * p_rate;
END convert_currency;
-- 16. Get total working hours between two timestamps (excluding weekends)
FUNCTION working_hours_between(p_start_ts TIMESTAMP,
p_end_ts TIMESTAMP) RETURN NUMBER IS
BEGIN
-- Simplified for working hours between two dates
-- (9 AM - 6 PM logic can be added as per requirements)
RETURN EXTRACT(DAY FROM (p_end_ts - p_start_ts)) * 8;
END working_hours_between;
-- 17. Generate a random account number
FUNCTION generate_account_number RETURN VARCHAR2 IS
BEGIN
RETURN 'ACCT-' || DBMS_RANDOM.STRING('X', 10);
END generate_account_number;
-- 18. Calculate VAT for a given amount
FUNCTION calculate_vat(p_amount NUMBER, p_vat_rate NUMBER) RETURN NUMBER IS
BEGIN
RETURN p_amount * (p_vat_rate / 100);
END calculate_vat;
-- 19. Calculate future value of investment (FVI)
FUNCTION calculate_future_value(p_present_value NUMBER,
p_rate NUMBER,
p_time NUMBER) RETURN NUMBER IS
BEGIN
RETURN p_present_value * POWER((1 + p_rate / 100), p_time);
END calculate_future_value;
-- 20. Get the next working day
FUNCTION get_next_working_day(p_date DATE) RETURN DATE IS
BEGIN
IF TO_CHAR(p_date, 'D') = '6' THEN
RETURN p_date + 2;
ELSIF TO_CHAR(p_date, 'D') = '7' THEN
RETURN p_date + 1;
ELSE
RETURN p_date;
END IF;
END get_next_working_day;
END finance_util_pkg;
/