contract Strategicsale is WhitelistCrowdsale, IndividuallyCappedCrowdsale, IndividuallyPricedCrowdsale {
    uint256 public smallPayment = 3e16; // 0.03 ether

    constructor (address payable wallet, IERC20 token)
        public
        Crowdsale(1, wallet, token)
    {}

    function setCapAndPrice(
        address purchaser,
        uint256 cap,
        uint256 price
    ) public {
        addWhitelisted(purchaser);
        setCap(purchaser, cap);
        setPrice(purchaser, price);
    }

    /**
     * @dev Only accept payment if wei amount is equal to 0.03 ether or the purchaser cap
     * @param beneficiary Token purchaser
     * @param weiAmount Amount of wei contributed
     */
    function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view {
        super._preValidatePurchase(beneficiary, weiAmount);

        uint256 amount = getContribution(beneficiary).add(weiAmount);
        require(amount == smallPayment || amount == getCap(beneficiary), "Strategicsale: wei amount should be equal to purchaser cap or equal to 0.03 ether");
    }
}
function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view {
    super._preValidatePurchase(beneficiary, weiAmount);

    uint256 amount = getContribution(beneficiary).add(weiAmount);
    require(amount == smallPayment || amount == getCap(beneficiary), "Strategicsale: wei amount should be equal to purchaser cap or equal to 0.03 ether");
}

/**
 * @dev Only accept payment if wei amount is equal to 0.03 ether or the purchaser cap
 * @param beneficiary Token purchaser
 * @param weiAmount Amount of wei contributed
 */