Биллинговая система Nodeny
27 Апреля 2024, 04:16:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1] 2 3
  Печать  
Автор Тема: Перерасчет при подкючении  (Прочитано 12276 раз)
Aivanzipper
NoDeny
Старожил
*

Карма: 62
Offline Offline

Сообщений: 387


206967443
Просмотр профиля
« : 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
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« Ответ #1 : 05 Июля 2010, 14:44:53 »

скрипт перехода на новый месяц запускается в начале _следующего_ месяца. Эта ситуация разруливается?
Записан
Aivanzipper
NoDeny
Старожил
*

Карма: 62
Offline Offline

Сообщений: 387


206967443
Просмотр профиля
« Ответ #2 : 05 Июля 2010, 15:01:28 »

скрипт перехода на новый месяц запускается в начале _следующего_ месяца. Эта ситуация разруливается?

А это тут при чем?
Я изменил только алгоритм перерасчета, больше ничего.
« Последнее редактирование: 05 Июля 2010, 15:03:44 от Aivanzipper » Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« Ответ #3 : 05 Июля 2010, 15:03:31 »

а при том, что в следующем месяце обычно дней не такое количество как в предыдущем. Скрипт запускается в следующем месяце чем том, на который идет расчет
Записан
Aivanzipper
NoDeny
Старожил
*

Карма: 62
Offline Offline

Сообщений: 387


206967443
Просмотр профиля
« Ответ #4 : 05 Июля 2010, 15:05:53 »

Ну и какая разница. Берется первый день следующего месяца минус один день. Получаем дату, выводим в формате %d итого получаем число последнего дня текущего месяца, оно же количество дней в текущем месяце.
Записан
Aivanzipper
NoDeny
Старожил
*

Карма: 62
Offline Offline

Сообщений: 387


206967443
Просмотр профиля
« Ответ #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 Offline

Сообщений: 387


206967443
Просмотр профиля
« Ответ #6 : 05 Июля 2010, 15:17:40 »

скрипт перехода на новый месяц запускается в начале _следующего_ месяца.

Стоп, или ты хочешь сказать что скрипт nomoney.pl запускается дважды? В момент первой активности юзера и в начале следующего месяца?
Записан
Aivanzipper
NoDeny
Старожил
*

Карма: 62
Offline Offline

Сообщений: 387


206967443
Просмотр профиля
« Ответ #7 : 05 Июля 2010, 15:26:57 »

Специально посмотрел: в таблице users есть поле start_day, в которое соответственно записывается день начала потребления услуги (вычисляется в nomoney.pl в момент первой активности), а уже потом new_month.pl достает из базы значение этого поля, так что все должно быть нормально.
Записан
blackjack
NoDeny
Старожил
*

Карма: 24
Offline Offline

Сообщений: 352


Просмотр профиля Email
« Ответ #8 : 05 Июля 2010, 20:01:30 »

вот не пойму вас, есть функция GetMaxDayInMonth()
так почему не зделать по формуле
сумма снятия=(GetMaxDayInMonth($mon_now)-$day_now)*(стоимость тарифа/GetMaxDayInMonth($mon_now))

все.
Записан
stix
NoDeny
Спец
*

Карма: 72
Offline Offline

Сообщений: 1872


Nodeny Support Team

205539
Просмотр профиля
« Ответ #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
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« Ответ #10 : 05 Июля 2010, 20:26:04 »

Скрипт перехода на новый месяц не запускается дважды. Суть вот в чем:
для одного и того же снятия, подпрограмма подсчета денег запускается в разные месяцы. Сейчас июль. Когда мы просматриваем баланс клиента, то этот баланс считается динамически. Допустим при подсчете баланса используется текущий месяц. Баланс посчитается правильно. Наступит август и нужно произвести непосредственное снятие денег. Т.е. До этого момента баланс считался динамически, а в момент проводок платежа "снятие за инет" он уже фиксируется в базе. Запускается в августе, т.е. количество дней будет уже не то. Можно сделать минус 1 день. Но тогда 1 числа каждого месяца динамический баланс будет неверный.
Записан
Aivanzipper
NoDeny
Старожил
*

Карма: 62
Offline Offline

Сообщений: 387


206967443
Просмотр профиля
« Ответ #11 : 06 Июля 2010, 08:28:00 »

Ну в таком случае надо просто задать одно условие: так как скрипт_перехода запускается только первого числа, необходимо сделать так:

if (дата_сейчас==первое_число) {высчитать сколько дней было в прошлом месяце};
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« Ответ #12 : 06 Июля 2010, 08:38:26 »

Ну в таком случае надо просто задать одно условие: так как скрипт_перехода запускается только первого числа, необходимо сделать так:

if (дата_сейчас==первое_число) {высчитать сколько дней было в прошлом месяце};
if( запуск из скрипта перехода) {высчитать сколько дней было в прошлом месяце}
Записан
Aivanzipper
NoDeny
Старожил
*

Карма: 62
Offline Offline

Сообщений: 387


206967443
Просмотр профиля
« Ответ #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
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4782



Просмотр профиля
« Ответ #14 : 06 Июля 2010, 14:10:35 »

Краткий пересказ:

- сделайте эту фичу
- разраб занят другим, фича будет в новой версии
- хорошо, мы сделали фичу сами
- разраб грит, что в фиче есть бока
- хорошо, разраб сделай фичу

Отвечаю:

Цитировать
разраб занят другим, фича будет в новой версии
Записан
Страниц: [1] 2 3
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!