[Date Prev][Date Next][Thread Prev][Thread Next][Minivend by date
][Minivend by thread
]
Re: [mv] Prorate discount script bug
****** message to minivend-users from "Bill Randle" <billr@exgate.tek.com> ******
Sydney,
Now I understand! I thought everything was being prorated down to $1.00
at the end of the month. This equation, though a bit more complicated,
should do the trick:
$s - $s * (1 - 1 / $mon{$month}) * ($n - 1) / ($mon{$month} - 1);
[<start lesson> Derivation (from simple algebra):
step 1, offset the days by 1 so they become zero-based as it
simplifies the derivation
step 2, draw a graph of price vs. time
|
|\ <-- starting price s
price | \
| \
| \
| \ <-- ending price e
|----------> day-in-month - 1
day ^
0 day (mdays - 1)
ending price (e) = starting price (s) / mdays
slope of the line (m) = (e - s) / (mdays - 1)
step 3, plug the numbers into the standard equation of a line: y = mx + b
in this case, y is the price and x is the day number (zero-based); b is
the value on day 0 (which is the initial price). So (using p for
the price, n for the 1-based day number, mdays for days in a month),
p = ((e - s) / (mdays - 1)) * (n - 1) + s
substitue for e:
p = ((s/mdays - s) / (mdays - 1)) * (n - 1) + s
factor out -s:
p = -s * ((-1/mdays + 1) / (mdays - 1)) * (n - 1) + s
rearrange the order:
p = s - s * (1 - 1/mdays) * (n - 1) / (mdays - 1)
<end of lesson>]
-Bill
On Jun 30, 2:33pm, Sydney Urshan wrote:
} Subject: Re: [mv] Prorate discount script bug
} ****** message to minivend-users from Sydney Urshan
<urshan@nethollywood.net> ******
}
} Bill,
}
} I just installed this script (at http://nethollywood.net) to check it
} out (on the last day of the month). The new result is $1 no matter
} what the item costs. (Which is better than $0!)
}
} Instead, a $20 item today should be $.67 and a $5 item should be
} $.17. If this month had a different # days, then the results would
} be different by a few cents. The example below was $1 on the last
} day because, for simplicity sake, it was a $30 item in a 30 day
} month. Can you help me tweak it to get it working right?
}
} Thanks,
}
} Sydney
}
} >****** message to minivend-users from Bill Randle
} ><billr@exgate.tek.com> ******
} >
} >Sydney,
} >
} >Try this for the calculation:
} > $s - ($s - 1) * ($n - 1) / ($mon{$month} - 1);
} >
} >I tried it for a few test cases and it seems to work for me. You could,
} >of course, build the length-Of_month-1 value into your month table.
} >Also, for a little less overhead, you could use localtime() directly,
} >rather than calling $Tag->time(), as you don't need the formating. E.g.:
} > my ($sec, $min, $hr, $mday, $mon) = localtime;
} >If you do that, remember that $mon goes from 0 to 11.
} >
} > -Bill
} >
} >
} >Sydney Urshan wrote:
} > >
} > > Well, if it's a $30 item in a 30 day month, day 30 should be $1, day
} > > 29 should be $2...day 2 should be $29, and the first day of the month
} > > should be $30 with everything else in between adjusted accordingly.
} > >
} > > >Sydney Urshan wrote:
} > > >>
} > > >> The following discount script works perfect until the last day of
the
} > > >> month at which time the result is 0. Can someone help me out on
this
} > > >> one?
} > > >>
} > > >> [loop list='2001 2002 3001 3002']
} > > >> [discount [loop-code]]
} > > >> my $bit = $Tag->time('', {}, '%m %d');
} > > >> my ($month, $n) = split /\s+/, $bit;
} > > >> $n =~ s/^0//;
} > > >> my %mon = (
} > > >> '01' => 31,
} > > >> '02' => 29,
} > > >> '03' => 31,
} > > >> '04' => 30,
} > > >> '05' => 31,
} > > >> '06' => 30,
} > > >> '07' => 31,
} > > >> '08' => 31,
} > > >> '09' => 30,
} > > >> '10' => 31,
} > > >> '11' => 30,
} > > >> '12' => 31,
} > > >> );
} > > >> if ($mon{$month} and $n > 1) {
} > > >> return ($s - ($s / $mon{$month} * $n));
} > > >> }
} > > >> return $s;
} > > >> [/discount]
} > > >> [/loop]
} > > >>
} > > >> Thanks,
} > > >>
} > > >> Sydney Urshan
} > > >
} > > >Look at your calculation again:
} > > > $s - ($s / days_in_month * day_of_month);
} > > >This is equivalent to saying:
} > > > $s - $s * (days_in_month / day_of_month);
} > > >when day_of_month is the same as days_in_month, you get
} > > > $s - $s * 1;
} > > >which is 0.
} > > >
} > > >What did you intend the prorate to be at the end of the month?
} > > >
} > > > -Bill
} -
} To unsubscribe from the list, DO NOT REPLY to this message. Instead, send
} email with 'UNSUBSCRIBE minivend-users' in the body to
Majordomo@minivend.com.
} Archive of past messages: http://www.minivend.com/minivend/minivend-list
}-- End of excerpt from Sydney Urshan
-
To unsubscribe from the list, DO NOT REPLY to this message. Instead, send
email with 'UNSUBSCRIBE minivend-users' in the body to Majordomo@minivend.com.
Archive of past messages: http://www.minivend.com/minivend/minivend-list