TimestampReceiptNumberGenerationService.java

package com.github.jenkaby.bikerental.finance.application.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.security.SecureRandom;
import java.time.Clock;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;

@RequiredArgsConstructor
@Service
public class TimestampReceiptNumberGenerationService implements ReceiptNumberGenerationService {

    private static final String RECEIPT_FORMAT = "RCP-%s-%s";
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
    private static final int MAX_RANDOM_SUFFIX = 10000;
    private final Random random = new SecureRandom();
    private final Clock clock;

    @Override
    public String generate() {
        ZonedDateTime now = ZonedDateTime.now(clock);
        String ts = FORMATTER.format(now);
        int randomSuffix = random.nextInt(MAX_RANDOM_SUFFIX);
        String rand = Integer.toHexString(randomSuffix).toUpperCase();
        return RECEIPT_FORMAT.formatted(ts, rand);
    }
}