BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 28 мар 2024, 18:52

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




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
СообщениеДобавлено: 20 июл 2017, 19:02 
Не в сети

Зарегистрирован: 14 июн 2013, 17:39
Сообщения: 68
Карма: 0
В данный момент при снятие отчета с гашением через биллинг получаю следующую ошибку:
Код:
ru.bitel.bgbilling.common.BGException: Error! KKM says: Снятие отчета прервалось
   at ru.bitel.bgbilling.plugins.cashcheck.server.CashCheckUtils.ZReport(CashCheckUtils.java:80)
   at CashCheckCloseDay.execute(CashCheckCloseDay.java:36)
   at ru.bitel.bgbilling.kernel.script.server.bean.GlobalScriptInvoker.invoke(GlobalScriptInvoker.java:38)
   at ru.bitel.bgbilling.kernel.script.server.GlobalScriptServiceImpl.executeGlobalScriptParams(GlobalScriptServiceImpl.java:83)
   at ru.bitel.bgbilling.kernel.script.server.task.GlobalScriptTimer.executeJava(GlobalScriptTimer.java:109)
   at ru.bitel.bgbilling.kernel.script.server.task.GlobalScriptTimer.executeTask(GlobalScriptTimer.java:61)
   at ru.bitel.bgbilling.kernel.task.server.TaskBase.run(TaskBase.java:80)
   at ru.bitel.bgbilling.kernel.task.server.TaskBase.startTask(TaskBase.java:141)
   at bitel.billing.server.task.TaskBaseRunner.executeTask(TaskBaseRunner.java:76)
   at bitel.billing.server.task.bean.RunTask.run(RunTask.java:47)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
   at java.lang.Thread.run(Thread.java:745)

Отчет снимаю с помощью кода из вики

При этом отчет на кассе нормально печатается и смена закрывается. После чего нормально могу заново открыть смену и печатать чеки.
При снятие отчета с гашением через драйвер для работы с ККТ(Смена открывается через биллинг), смена закрывается и не отображается никаких ошибок.

Может кто помочь с решением данной проблемы?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 июл 2017, 19:08 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
Это проблема соответствия описания в протоколе атола с реальным положением дел, уже сталкивались. Вот заметка, которую писали им и не получили ответа, может быть у вас получится:

Цитата:
В общем, техническая процедура там такая:

1) входим в режим 3.0
2) запускаем отчёт
3) ждём пока режим 3.2 ("Идет печать Z-отчета или контрольной ленты") не сменится на какой-то другой
4) далее проверяем что у нас сейчас состояние 7.1 ("Идет обнуление таблиц и гашение операционных регистров") если это не так - то какая-то ошибка по-любому, там есть всякие ошибки детектируются - механика, бумага итд, если ничего из этого, то пишем "Снятие отчета прервалось"

Так велит протокол (и реализация 10 лет назад и по состоянию на 3.1 от 05.2017)

Так вот, у вас после 3.2 судя по логам сразу становится режим 3.0, что и приводит к такой ошибке. Наверное, вам надо спросит в АТОЛе, рассказав что я выше написал. Почему так получается.

В новом описании протокола добавлена такая ремарка:

Если ФН переполнен, то ККТ не переходит в состояние 7.1: после состояния 3.2 идет
состояние 3.0. при большом количестве сменных записей в ФН время снятия суточного
отчета с гашением на некоторых ККТ может увеличиваться.

Но это не ваш случай всё же. У вас нормально снимается отчёт.

НО есть подозрение, что режим 7.1 просто очень быстро у вас проскакивает, наоборот, т.к. ККМ новый и быстро гасится. НО тогда описание алгоритма в протоколе некорректное, и надо бы дописать там заметку, т.к. там вообще указано "(рекомендуемая частота опроса – 2 раза / сек.)", а делается у нас даже чаще, но всё равно ВОЗМОЖНО происходит такое:
- проверяется режим, видим что 3.2
- ждём ещё допустим 200 мс, в этот момент кончается режим 3.2, начинается 7.1, быстро проходит, и возвращается в 3.0 (оно туда вроде как и должно вернуться)
- проверяется режим видим что не 3.2, но и не 7.1 и рисуется ошибка, хотя отчёт уже снялся давно

Хотелось бы сначала услышать комментарии АТОЛа

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 июл 2017, 13:29 
Не в сети

Зарегистрирован: 14 июн 2013, 17:39
Сообщения: 68
Карма: 0
Понятно, спасибо за ответ.

Офтопомо еще один вопрос, может кто сталкивался и решал.

Касса не дает делать возвраты если не было платежей НАЛИЧНЫМИ в смену.
То есть если проводить чек прихода с ЭЛЕКТРОННЫМ платежом, а потом попытаться напечатать чек возврат то касса сругается на то что в ней нет денег для возврата.
Если же напечатать чек прихода с НАЛИЧНЫМ платежом, то можно печатать чеки возвратов столько сколько захочешь.
У нас к примеру наличных платежей нет, есть идеи решения данной проблемы?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 июл 2017, 15:53 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
А возвраты электронными вообще можно делать в принципе?
А для возврата вы ставите тоже тип платежа в ККМ нужный (электронный).
Или вы хотите возвраты делать наличкой? Ну так нельзя кажется, потому что в протоколе там написано явно что да, должно быть достаточное кол-во денег для возврата. Но я думал это только для каждого типа оплаты отдельно считается.
Ну это наверное всё же к АТОЛу тоже вопрос.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 июл 2017, 10:07 
Не в сети

Зарегистрирован: 14 июн 2013, 17:39
Сообщения: 68
Карма: 0
Электронный возврат как раз начинает проходить после того как сделаешь платеж наличными.
Спасибо за ответ, будем писать в атол.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 июл 2017, 12:57 
Не в сети
Аватара пользователя

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


Цитата:
О контроле наличности:
При регистрации покупки ККТ производит контроль наличности, то есть должно выполняться неравенство:
X <= Пр – Пк – Вз + Взп + Вн – Вп,
где
X ‒ размер регистрируемой покупки (расхода);
Пр - сумма регистраций продаж (приходов), оплаченных наличными, за смену;
Пк - сумма регистраций покупок (расходов), оплаченных наличными, за смену + промежуточная сумма текущего чека покупки (расхода);
Вз сумма возвратов продаж (приходов), оплаченных наличными, за смену;
Взп сумма возвратов покупок (расходов), оплаченных наличными, за смену + промежуточная сумма текущего чека покупки (расходов);
Вн сумма внесений денег в кассу за смену;
Вп‒ сумма выплат денег из кассы за смену.

ККТ позволяет отключить эту проверку (неравенство может нарушаться) с единственным ограничением: ККТ запрещает закрывать наличными чек, в котором присутствуют регистрации
без проверки наличности, если после этого нарушится неравенство (при этом в ПК включен данный чек):
0 <= Пр – Пк – Вз + Взп + Вн – Вп.

[!] ККТ позволяет отключить контроль наличности только в том случае, если для типов оплаты 2, 3 и 4 настроена возможность отключения контроля наличности (смотрите Т2Р1П3 .. П5).

Все сказанное о контроле наличности справедливо и для регистрации возврата. Отличие лишь в том, что:
в первом выражении:
X = размер регистрируемого возврата;
Вз = сумма возвратов продаж, оплаченных наличными, за смену + промежуточная сумма текущего чека (возврата продажи);
Взп = сумма возвратов покупок, оплаченных наличными, за смену + промежуточная сумма текущего чека (возврата покупки);
во втором выражении данный чек включен не в Пк, а в Вз.


тут поэтому непонятно почему при контроле наличности любого типа тут пишется везде "оплаченных наличными", зачем это так вообще делается - непотяно, это надо в АТОЛе спросить, видимо.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 июл 2017, 13:01 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
но вообще написано как будто речь именно для закрытия чека с типом налички. вы точно ставите нужный тип платежа для возвратов (в дин.коде, и для нового интерфейса причём)?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2017, 11:41 
Не в сети

Зарегистрирован: 14 июн 2013, 17:39
Сообщения: 68
Карма: 0
Я пробовал по разному, в метод check.setPaymentType(number) подставлял следующие значения:
1. Открыл смену, ставим в приходе тип 1(наличка) то возврат с типом 1 и 2 проходит.
2. Открыл смену, ставим в приходе тип 2(электронный) то возврат с типом 1 и 2 НЕ проходит.

Не совсем понял фразу
Цитата:
для нового интерфейса

Я использовал код из примеров wiki

Возник еще один вопрос :) про добавление в чек инфы про валюту?
Код:
check.addString("Валюта клиента: " + currency)

Вот таким образом я конечно могу напечатать, но на сайте ОФД отображается что платежи приходят в рублях всегда(мы с помощью параметров добавили в биллинг многовалютность), это мне к ОФД нужно обращаться?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2017, 12:27 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
вообще непонятно, на вики вроде нет кода который может вам помочь сделать возврат
давайте сначала начнём:
как вы делаете возврат? не через кнопку "возврат" в админке, надеюсь? через добавление расхода/возврата на договор же?
тогда там надо делать через CheckMaker, не через CheckBuilder , но через CheckBuilder он и не даст вам возврат сделать. но и на вики про CheckMaker вроде нет. это смущает. (или вы про скрипты для автоплатежей? но как тогда и к чему вы прикрутили)
и дайте просто все свои дин.коды для чека

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2017, 12:27 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
про валюты: в ККТ вообще нигде не передаётся инфа о валюте, там нет таких возможностей даже, ККТ настраивается на определённую, насколько я понимаю. если это так, то тогда это настраивается в ККТ, но, емнип, они все рублёвые, это надо потому в ОФД спросить , наверное
(ИМХО, потому наверно должно быть два ККТ и по типу платежа или как-то ещё печатать на определённом,но это не точно)
(ну и всё что вы пишете в addString в ОФД вообще не передаётся, на всякий случай скажу)

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2017, 12:28 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
ну и вот это:
Цитата:
ставим в приходе тип 1(наличка) то возврат с типом 1 и 2 проходит

как понять? в каком ещё приходе? и как вы делаете возврат приходом?

upd а, кажется, понял, типа сначала приход делаете с наличкой/электронным, а потом делаете возврат
ну тогда код покажите, да

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2017, 12:38 
Не в сети

Зарегистрирован: 14 июн 2013, 17:39
Сообщения: 68
Карма: 0
Все делаю через клиент биллинга через добавление расхода/возврата на договор.
Код:
Код:
public class TurborenderCheck extends CheckMaker {
    @Override
    public void addPayment(Payment payment, Check check, Printer printer) throws BGException {
        ParamWorker pw = new ParamWorker(_con);
        String customerEmail = pw.getParam(payment.getContractTitle(), "mail");

        Pattern mailPattern = Pattern.compile("<(.+)>");
        Matcher mailMatcher = mailPattern.matcher(customerEmail);

        if(mailMatcher.find())
            customerEmail = mailMatcher.group(1);

        check.setPaymentType(2); // ставим ТИП ПЛАТЕЖА ККМ: 1 - нал, 2,3,4 - безнал или какой-то другой тип оплаты
        check.setTax(0); // ставим ТИП НАЛОГА ККМ: 0 - по номеру секции (в атолах), N  - какой-то другой на выбор
        check.setOnlyElCheck(true); // "только электронный чек"
        check.setCustomerEmail(customerEmail);
        int paymentDep = 1; // отдел, используется ниже в addPayment
        // добавляем параметр договора
        //int PARAM_ID = 3;
        //ContractParameterManager bgParamMan = new ContractParameterManager( con );
        //String paramVal = bgParamMan.getStringParam( event.getContractID(), PARAM_ID );
        // check.addString( "Какой-то параметр договора: " + paramVal );
        String currency = pw.getParam(payment.getContractTitle(), "currency");
        if(currency == null || currency.equals(""))
            currency = "RUB";
        check.addString("Валюта клиента: " + currency);
        check.addPayment(payment.getSumma(), "Оплата услуг по договору " + payment.getContractTitle(), paymentDep);
    }

    @Override
    public void endCreate(Set<Integer> cids, Check check, Printer printer) throws BGException {
        super.endCreate(cids, check, printer);
    }

    @Override
    public void addPaymentRefund(Payment payment, Check check, Printer printer) throws BGException {
        ParamWorker pw = new ParamWorker(_con);
        String customerEmail = pw.getParam(payment.getContractTitle(), "mail");

        Pattern mailPattern = Pattern.compile("<(.+)>");
        Matcher mailMatcher = mailPattern.matcher(customerEmail);

        if(mailMatcher.find())
            customerEmail = mailMatcher.group(1);

        check.setPaymentType(2); // ставим ТИП ПЛАТЕЖА ККМ: 1 - нал, 2,3,4 - безнал или какой-то другой тип оплаты
        check.setTax(0); // ставим ТИП НАЛОГА ККМ: 0 - по номеру секции (в атолах), N  - какой-то другой на выбор
        check.setOnlyElCheck(true); // "только электронный чек"
        check.setCustomerEmail(customerEmail);
        int paymentDep = 1; // отдел, используется ниже в addPayment
        // добавляем параметр договора
        //int PARAM_ID = 3;
        //ContractParameterManager bgParamMan = new ContractParameterManager( con );
        //String paramVal = bgParamMan.getStringParam( event.getContractID(), PARAM_ID );
        // check.addString( "Какой-то параметр договора: " + paramVal );
        String currency = pw.getParam(payment.getContractTitle(), "currency");
        if(currency == null || currency.equals(""))
            currency = "RUB";
        check.addString("Валюта клиента: " + currency);
        check.addPayment(payment.getSumma(), "Возврат по договору " + payment.getContractTitle(), paymentDep);
    }

    @Override
    public void endCreateRefund(int cid, Check check, Printer printer) throws BGException {
        super.endCreateRefund(cid, check, printer);
    }
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2017, 16:23 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
ну вообще вроде всё правильно тогда у вас, вопросы к АТОЛу наверно теперь остаются только
скорее всего это как-то отключается в настройках в одной из таблиц ККТ, по ним у нас нет информации подробной

это можно убрать, там пустые методы просто:

@Override
public void endCreate(Set<Integer> cids, Check check, Printer printer) throws BGException {
super.endCreate(cids, check, printer);
}

@Override
public void endCreateRefund(int cid, Check check, Printer printer) throws BGException {
super.endCreateRefund(cid, check, printer);
}

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


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

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


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

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


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

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