BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 08 май 2024, 11:03

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
СообщениеДобавлено: 16 мар 2015, 09:04 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Сервер: вер. 5.2 сборка 1618 от 28.01.2015 21:38:59
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.6.0_22

Есть клиент с режимом "кредит", закрыт за долги в октябре 2014.
Записей баланса с октября нет.
В октябре вх остаток был -244.81, наработка=596.13 => остаток -840.94

В марте приходит оплата 500р. По-идее он не должен его открыть, т.к. сальдо -840.94+500=-340.94 <0
Но биллинг его открывает статусом.
Начал рыться в коде - в BalanceDao.getContractBalance(...) сначала берутся данные на текущий месяц. Если нет - на послений имеющийся. Но при этом входящее сальдо на требуемый месяц в обоих случаях берётся как summa1, хотя если берём данные октября, то нужно брать (summa1 + summa2 - summa3 - summa4).

Т.е. при принятии решения он взял сальдо не -840.94+500, а -244.81+500 и открыл договор.

Код:
mysql> select * from contract_balance where cid=178581 and yy>=2014;
+------+----+--------+----------+---------+--------+--------+
| yy   | mm | cid    | summa1   | summa2  | summa3 | summa4 |
+------+----+--------+----------+---------+--------+--------+
| 2014 |  4 | 178581 | -1036.68 | 2000.00 | 308.00 |   0.00 |
| 2014 |  5 | 178581 |   655.32 |    0.00 | 660.00 |   0.00 |
| 2014 |  6 | 178581 |    -4.68 |    0.00 | 660.00 |   0.00 |
| 2014 |  7 | 178581 |  -664.68 |    0.00 | 596.13 |   0.00 |
| 2014 |  9 | 178581 | -1260.81 | 1500.00 | 484.00 |   0.00 |
| 2014 | 10 | 178581 |  -244.81 |    0.00 | 596.13 |   0.00 |
| 2015 |  3 | 178581 |  -840.94 |  500.00 |  85.16 |   0.00 |
+------+----+--------+----------+---------+--------+--------+
7 rows in set (0.00 sec)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 мар 2015, 11:39 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
по-моему уже было что-то такое :lupa:

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 мар 2015, 10:22 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
ии?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 мар 2015, 13:52 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Cromeshnic писал(а):
Сервер: вер. 5.2 сборка 1618 от 28.01.2015 21:38:59
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.6.0_22

Есть клиент с режимом "кредит", закрыт за долги в октябре 2014.
Записей баланса с октября нет.
В октябре вх остаток был -244.81, наработка=596.13 => остаток -840.94

В марте приходит оплата 500р. По-идее он не должен его открыть, т.к. сальдо -840.94+500=-340.94 <0
Но биллинг его открывает статусом.
Начал рыться в коде - в BalanceDao.getContractBalance(...) сначала берутся данные на текущий месяц. Если нет - на послений имеющийся. Но при этом входящее сальдо на требуемый месяц в обоих случаях берётся как summa1, хотя если берём данные октября, то нужно брать (summa1 + summa2 - summa3 - summa4).

Т.е. при принятии решения он взял сальдо не -840.94+500, а -244.81+500 и открыл договор.

Код:
mysql> select * from contract_balance where cid=178581 and yy>=2014;
+------+----+--------+----------+---------+--------+--------+
| yy   | mm | cid    | summa1   | summa2  | summa3 | summa4 |
+------+----+--------+----------+---------+--------+--------+
| 2014 |  4 | 178581 | -1036.68 | 2000.00 | 308.00 |   0.00 |
| 2014 |  5 | 178581 |   655.32 |    0.00 | 660.00 |   0.00 |
| 2014 |  6 | 178581 |    -4.68 |    0.00 | 660.00 |   0.00 |
| 2014 |  7 | 178581 |  -664.68 |    0.00 | 596.13 |   0.00 |
| 2014 |  9 | 178581 | -1260.81 | 1500.00 | 484.00 |   0.00 |
| 2014 | 10 | 178581 |  -244.81 |    0.00 | 596.13 |   0.00 |
| 2015 |  3 | 178581 |  -840.94 |  500.00 |  85.16 |   0.00 |
+------+----+--------+----------+---------+--------+--------+
7 rows in set (0.00 sec)



Я попробую воспроизвести вашу ситуацию, но судя по коду пока не вижу описанной вами проблемы. Там считывается строка
Цитата:
| 2014 | 10 | 178581 | -244.81 | 0.00 | 596.13 | 0.00 |


И баланс считается именно так summa1 + summa2 - summa3 - summa4.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 мар 2015, 13:56 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Там лимит 0 ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 мар 2015, 14:11 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Лимит: -5401.00

stark писал(а):
И баланс считается именно так summa1 + summa2 - summa3 - summa4.


Это в методе BalanceDao.getBalance(...) - он там не используется.

Смотрите: в BalanceEventProcessor.activateCreditContract(...) передаётся сальдо из ConvergenceBalance.getSaldo().
Экземпляр ConvergenceBalance получается из ContractBalance, который берётся из BalanceDao.getBalance(...).
Так вот, в этой цепочке не учитывается, за какой именно месяц был отдан ContractBalance из BalanceDao.getBalance(...).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 мар 2015, 14:19 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Cromeshnic писал(а):
Лимит: -5401.00

stark писал(а):
И баланс считается именно так summa1 + summa2 - summa3 - summa4.


Это в методе BalanceDao.getBalance(...) - он там не используется.

Смотрите: в BalanceEventProcessor.activateCreditContract(...) передаётся сальдо из ConvergenceBalance.getSaldo().
Экземпляр ConvergenceBalance получается из ContractBalance, который берётся из BalanceDao.getBalance(...).
Так вот, в этой цепочке не учитывается, за какой именно месяц был отдан ContractBalance из BalanceDao.getBalance(...).


Я, кажется, понял. Посмотрим.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 мар 2015, 12:35 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Cromeshnic писал(а):
Сервер: вер. 5.2 сборка 1618 от 28.01.2015 21:38:59
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.6.0_22

Есть клиент с режимом "кредит", закрыт за долги в октябре 2014.
Записей баланса с октября нет.
В октябре вх остаток был -244.81, наработка=596.13 => остаток -840.94

В марте приходит оплата 500р. По-идее он не должен его открыть, т.к. сальдо -840.94+500=-340.94 <0
Но биллинг его открывает статусом.
Начал рыться в коде - в BalanceDao.getContractBalance(...) сначала берутся данные на текущий месяц. Если нет - на послений имеющийся. Но при этом входящее сальдо на требуемый месяц в обоих случаях берётся как summa1, хотя если берём данные октября, то нужно брать (summa1 + summa2 - summa3 - summa4).

Т.е. при принятии решения он взял сальдо не -840.94+500, а -244.81+500 и открыл договор.

Код:
mysql> select * from contract_balance where cid=178581 and yy>=2014;
+------+----+--------+----------+---------+--------+--------+
| yy   | mm | cid    | summa1   | summa2  | summa3 | summa4 |
+------+----+--------+----------+---------+--------+--------+
| 2014 |  4 | 178581 | -1036.68 | 2000.00 | 308.00 |   0.00 |
| 2014 |  5 | 178581 |   655.32 |    0.00 | 660.00 |   0.00 |
| 2014 |  6 | 178581 |    -4.68 |    0.00 | 660.00 |   0.00 |
| 2014 |  7 | 178581 |  -664.68 |    0.00 | 596.13 |   0.00 |
| 2014 |  9 | 178581 | -1260.81 | 1500.00 | 484.00 |   0.00 |
| 2014 | 10 | 178581 |  -244.81 |    0.00 | 596.13 |   0.00 |
| 2015 |  3 | 178581 |  -840.94 |  500.00 |  85.16 |   0.00 |
+------+----+--------+----------+---------+--------+--------+
7 rows in set (0.00 sec)



Тут такая ситуация. Ошибка есть, появилась в 5.2 (в 5.1 ее нет), я даже ее исправил(пока не залиливал). Но ее не просто получить. Если сделать такие же балансы на договоре как в вашем примере с помощью приходов/расходов задним числом, то ситуация не повторяется потому что :

1) Во-первых , если ваше предположение верно о том, что считывается старый месяц, то там считывает строка такая:

Код:
| 2014 | 10 | 178581 |  -244.81 |    0.00 | 596.13 |   0.00 |

сальдо будет -244.81 + 0 (платежи)= -244 < 0 . Не откроет.

2) Во-вторых, при занесении платежа в клиенте, событие об обработке баланса кидается после комита в базу поэтому там всегда уже новый баланс есть.

Код:
| 2015 |  3 | 178581 |  -840.94 |  500.00 |  85.16 |   0.00 |


И тут опять же сальдо -840.94 + 500 < 0, не откроет .

Т.е штатным образом если заносить платеж через клиента, то ошибки нет. Но в общем случае(через платежные системы например) у нас можно добавить платеж и бросить событие до комита в базу, в этом случае проявление этой ошибки возможно, но не вашем случае, у вас вот эта строка для этого бы подошла.
Цитата:
| 2014 | 9 | 178581 | -1260.81 | 1500.00 | 484.00 | 0.00 |



Тут как раз -1260.81 + 1500.00 больше > 0 . В общем теоретически ошибка есть, но не понятно как вы ее получили. Платеж как заносился ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 мар 2015, 13:49 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Эту ошибку легко можно получить так . Если просто поменять лимит (просто слегка его изменить, на рубль например) и последняя запись в балансе будет :
Код:
| 2014 |  9 | 178581 | -1260.81 | 1500.00 | 484.00 |   0.00 |


Тогда его открывает. Это исправили. Но еще есть есть вероятность что у вас по другой причине не сработало - возможно вы добавляли платеж, а событие изменения баланса сработало до его добавления в базу. Хотя в этом случае с этим исправлением ошибка будет по идее наоборот - тут могут не открыть договор.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 мар 2015, 14:23 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Исправлено, обновление выкладывается. Будет в течении минут 10.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 мар 2015, 07:45 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Платёж проводился из 1Сv8 через http-экшен, т.е. то же самое, что и руками добавлять из клиента.

Насчёт того, как получилось есть навскидку версия: до коммита платежа в базу в кэше создался ConvergenceBalance по октябрьским данным, потом в другом потоке в него упал платёж по событию (в ConvergenceBalanceManager.notify()), а потом в основном потоке мы его и взяли в getSaldo().


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 мар 2015, 12:14 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Cromeshnic писал(а):
Платёж проводился из 1Сv8 через http-экшен, т.е. то же самое, что и руками добавлять из клиента.

Насчёт того, как получилось есть навскидку версия: до коммита платежа в базу в кэше создался ConvergenceBalance по октябрьским данным, потом в другом потоке в него упал платёж по событию (в ConvergenceBalanceManager.notify()), а потом в основном потоке мы его и взяли в getSaldo().



Не все еще поправили, еще остались ошибки - исправляем.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 мар 2015, 19:03 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Cromeshnic писал(а):
Платёж проводился из 1Сv8 через http-экшен, т.е. то же самое, что и руками добавлять из клиента.

Насчёт того, как получилось есть навскидку версия: до коммита платежа в базу в кэше создался ConvergenceBalance по октябрьским данным, потом в другом потоке в него упал платёж по событию (в ConvergenceBalanceManager.notify()), а потом в основном потоке мы его и взяли в getSaldo().


С ConvergenceBalance оказался косяк с момента его появления в 5.2. Исправили пока в 6.2, много изменений.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 дек 2016, 20:40 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Тема получила продолжение вот тут:
https://forum.bitel.ru/viewtopic.php?f=22&t=12186
UPD. Ссылку исправил(спасибо georgdts).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 янв 2017, 22:09 
Не в сети
Клиент

Зарегистрирован: 04 июн 2009, 15:33
Сообщения: 268
Откуда: Москва
Карма: 8
https://forum.bitel.ru/viewtopic.php?f=22&t=12186

_________________
Клиент: вер. 7.1.102 / 20.04.2018 19:02:09
os: Windows 8.1; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_172
Сервер: вер. 7.1.970 / 20.04.2018 19:04:17
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_162


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.058s | 48 Queries | GZIP : On ]