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 . В общем теоретически ошибка есть, но не понятно как вы ее получили. Платеж как заносился ?