CBSubs doesn't prorate plan duration. So, no there's not possible without some custom queries or solution. You can only prorate the remaining value of the subscription. So their upgrade subscription would be discounted instead of having its duration extended. Duration options for plans are planned at some point though, but I've no idea when.
You could force this behavior though by using CBSubs SQL Actions, query for the plan they upgraded from, calculate the remaining duration, then add it to their new subscriptions expiration date. That should give you exactly what you're wanting. The below is an example query of how to do this.
Code:
UPDATE `#__cbsubs_subscriptions` AS a
SET a.`expiry_date` = DATE_ADD( a.`expiry_date`, INTERVAL ( SELECT TIMESTAMPDIFF( SECOND, b.`expiry_date`, b.`previous_expiry_date` ) FROM ( SELECT * FROM `#__cbsubs_subscriptions` ) AS b WHERE b.`id` = a.`replaces_subscription` ) SECOND )
WHERE a.`id` = '[subscription_id]'
AND a.`replaces_subscription` IS NOT NULL
The above should add the remaining time (in seconds) of the subscription they upgraded from to their new subscription. The issue with update queries is they can't update and select from themselves at the same time. That causes an issue with the engine unsure what to do if the two conflict. The solution is a subquery in a subquery. This causes the table to be put into memory temporarily so you can get the previous subscriptions date difference so it can be added. This COULD be slow if you've a massive amount of subscription rows (I can't say for sure, I don't have a test case for that) though. Example of the results as follows.
Plan A (upgrading from)
Expiry Date: 2014-06-27 18:09:27 (when it was replaced)
Previous Expiry Date: 2015-06-27 18:08:45 (when it would've normally expired)
Date Difference: 31535958 (in seconds)
Plan B (upgrading to)
Expiry Date: 2015-06-27 18:09:27
New Expiry Date: 2016-06-26 18:08:45 (with 31535958 seconds added)
The below can be ran directly on phpmyadmin with SUBSCRIPTION_ID_HERE replaced to test the outcome of these calculations to ensure accuracy and to test different situations. Note if your table prefix is not jos_ when using the below to test you'll need to replace it with whatever your template prefix is.
Code:
SELECT b.`expiry_date` AS old_cur_expiry_date,
b.`previous_expiry_date` AS old_prev_expiry_date,
a.`expiry_date` AS cur_expiry_date,
DATE_ADD( a.`expiry_date`, INTERVAL TIMESTAMPDIFF( SECOND, b.`expiry_date`, b.`previous_expiry_date` ) SECOND ) AS new_expiry_date,
TIMESTAMPDIFF( SECOND, b.`expiry_date`, b.`previous_expiry_date` ) AS diff
FROM `jos_cbsubs_subscriptions` AS a
INNER JOIN `jos_cbsubs_subscriptions` AS b
ON b.`id` = a.`replaces_subscription`
WHERE a.`id` = SUBSCRIPTION_ID_HERE
AND a.`replaces_subscription` IS NOT NULL
As with any code suggestions. Backup your database and test thoroughly to ensure you get the desired behavior.