Aivanzipper
NoDeny
Старожил
Карма: 62
Offline
Сообщений: 387
|
|
« : 05 Июля 2010, 12:37:05 » |
|
Все знают проблему когда подключаем нового пользователя, например, в феврале, ставим ему день начала потребления, а перерасчет происходит с расчетом 31 день в месяце. Много уже ругались по этому поводу. Оказывается, все фиксится очень просто: в файле nomoney.pl ищем строку $k=sprintf("%.2f",(32-$start_day)/31); (у меня она 247) и заменяем на такие строки chop($mounth_days=`date -v1d -v\`date -v +1m +%m\`m -v-1d +%d`); $k=sprintf("%.2f",($mounth_days-$start_day+1)/$mounth_days); Сохраняем, радуемся. PS жмем плюсик
|
|
« Последнее редактирование: 05 Июля 2010, 12:39:25 от Aivanzipper »
|
Записан
|
|
|
|
Efendy
|
|
« Ответ #1 : 05 Июля 2010, 14:44:53 » |
|
скрипт перехода на новый месяц запускается в начале _следующего_ месяца. Эта ситуация разруливается?
|
|
|
Записан
|
|
|
|
Aivanzipper
NoDeny
Старожил
Карма: 62
Offline
Сообщений: 387
|
|
« Ответ #2 : 05 Июля 2010, 15:01:28 » |
|
скрипт перехода на новый месяц запускается в начале _следующего_ месяца. Эта ситуация разруливается?
А это тут при чем? Я изменил только алгоритм перерасчета, больше ничего.
|
|
« Последнее редактирование: 05 Июля 2010, 15:03:44 от Aivanzipper »
|
Записан
|
|
|
|
Efendy
|
|
« Ответ #3 : 05 Июля 2010, 15:03:31 » |
|
а при том, что в следующем месяце обычно дней не такое количество как в предыдущем. Скрипт запускается в следующем месяце чем том, на который идет расчет
|
|
|
Записан
|
|
|
|
Aivanzipper
NoDeny
Старожил
Карма: 62
Offline
Сообщений: 387
|
|
« Ответ #4 : 05 Июля 2010, 15:05:53 » |
|
Ну и какая разница. Берется первый день следующего месяца минус один день. Получаем дату, выводим в формате %d итого получаем число последнего дня текущего месяца, оно же количество дней в текущем месяце.
|
|
|
Записан
|
|
|
|
Aivanzipper
NoDeny
Старожил
Карма: 62
Offline
Сообщений: 387
|
|
« Ответ #5 : 05 Июля 2010, 15:09:16 » |
|
[root@host /scripts/ping]# date -v1d четверг, 1 июля 2010 г. 16:10:03 (EEST) [root@host /scripts/ping]# date -v1d -v08m воскресенье, 1 августа 2010 г. 16:10:46 (EEST) [root@host /scripts/ping]# date -v1d -v08m -v-1d суббота, 31 июля 2010 г. 16:10:55 (EEST) [root@host /scripts/ping]# date -v1d -v08m -v-1d +%d 31
|
|
|
Записан
|
|
|
|
Aivanzipper
NoDeny
Старожил
Карма: 62
Offline
Сообщений: 387
|
|
« Ответ #6 : 05 Июля 2010, 15:17:40 » |
|
скрипт перехода на новый месяц запускается в начале _следующего_ месяца.
Стоп, или ты хочешь сказать что скрипт nomoney.pl запускается дважды? В момент первой активности юзера и в начале следующего месяца?
|
|
|
Записан
|
|
|
|
Aivanzipper
NoDeny
Старожил
Карма: 62
Offline
Сообщений: 387
|
|
« Ответ #7 : 05 Июля 2010, 15:26:57 » |
|
Специально посмотрел: в таблице users есть поле start_day, в которое соответственно записывается день начала потребления услуги (вычисляется в nomoney.pl в момент первой активности), а уже потом new_month.pl достает из базы значение этого поля, так что все должно быть нормально.
|
|
|
Записан
|
|
|
|
blackjack
NoDeny
Старожил
Карма: 24
Offline
Сообщений: 352
|
|
« Ответ #8 : 05 Июля 2010, 20:01:30 » |
|
вот не пойму вас, есть функция GetMaxDayInMonth() так почему не зделать по формуле сумма снятия=(GetMaxDayInMonth($mon_now)-$day_now)*(стоимость тарифа/GetMaxDayInMonth($mon_now))
все.
|
|
|
Записан
|
|
|
|
stix
NoDeny
Спец
Карма: 72
Offline
Сообщений: 1872
Nodeny Support Team
|
|
« Ответ #9 : 05 Июля 2010, 20:10:12 » |
|
use Date::Manip; my ($m, $y) = UnixDate("today", "%m", "%Y"); my $days = Date_DaysInMonth($m,$y); print "$days\n"; я делал так
|
|
|
Записан
|
|
|
|
Efendy
|
|
« Ответ #10 : 05 Июля 2010, 20:26:04 » |
|
Скрипт перехода на новый месяц не запускается дважды. Суть вот в чем: для одного и того же снятия, подпрограмма подсчета денег запускается в разные месяцы. Сейчас июль. Когда мы просматриваем баланс клиента, то этот баланс считается динамически. Допустим при подсчете баланса используется текущий месяц. Баланс посчитается правильно. Наступит август и нужно произвести непосредственное снятие денег. Т.е. До этого момента баланс считался динамически, а в момент проводок платежа "снятие за инет" он уже фиксируется в базе. Запускается в августе, т.е. количество дней будет уже не то. Можно сделать минус 1 день. Но тогда 1 числа каждого месяца динамический баланс будет неверный.
|
|
|
Записан
|
|
|
|
Aivanzipper
NoDeny
Старожил
Карма: 62
Offline
Сообщений: 387
|
|
« Ответ #11 : 06 Июля 2010, 08:28:00 » |
|
Ну в таком случае надо просто задать одно условие: так как скрипт_перехода запускается только первого числа, необходимо сделать так:
if (дата_сейчас==первое_число) {высчитать сколько дней было в прошлом месяце};
|
|
|
Записан
|
|
|
|
Efendy
|
|
« Ответ #12 : 06 Июля 2010, 08:38:26 » |
|
Ну в таком случае надо просто задать одно условие: так как скрипт_перехода запускается только первого числа, необходимо сделать так:
if (дата_сейчас==первое_число) {высчитать сколько дней было в прошлом месяце};
if( запуск из скрипта перехода) {высчитать сколько дней было в прошлом месяце}
|
|
|
Записан
|
|
|
|
Aivanzipper
NoDeny
Старожил
Карма: 62
Offline
Сообщений: 387
|
|
« Ответ #13 : 06 Июля 2010, 09:03:30 » |
|
Мой вариант: chomp($mounth_days=`date -v1d -v\`date -v +1m +%m\`m -v-1d +%d`); if (`date %d` eq '01\n') {chomp($mounth_days=`date -v1d -v-1d +%d`)}; $k=sprintf("%.2f",($mounth_days-$start_day+1)/$mounth_days);
А как узнать откуда запуск? Было-бы феншуйнее.
|
|
|
Записан
|
|
|
|
Efendy
|
|
« Ответ #14 : 06 Июля 2010, 14:10:35 » |
|
Краткий пересказ: - сделайте эту фичу - разраб занят другим, фича будет в новой версии - хорошо, мы сделали фичу сами - разраб грит, что в фиче есть бока - хорошо, разраб сделай фичу Отвечаю: разраб занят другим, фича будет в новой версии
|
|
|
Записан
|
|
|
|
|