Ошибка при снятие отчета с гашением

Печать кассовых и бумажных чеков по занесению платежа в биллинг.

Ошибка при снятие отчета с гашением

Сообщение Antonavt » 20 июл 2017, 19:02

В данный момент при снятие отчета с гашением через биллинг получаю следующую ошибку:
$this->bbcode_second_pass_code('', '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)
')
Отчет снимаю с помощью кода из вики

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

Может кто помочь с решением данной проблемы?
Antonavt
 
Сообщения: 68
Зарегистрирован: 14 июн 2013, 17:39

Re: Ошибка при снятие отчета с гашением

Сообщение dimOn » 20 июл 2017, 19:08

Это проблема соответствия описания в протоколе атола с реальным положением дел, уже сталкивались. Вот заметка, которую писали им и не получили ответа, может быть у вас получится:

$this->bbcode_second_pass_quote('', '') общем, техническая процедура там такая:

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 и рисуется ошибка, хотя отчёт уже снялся давно

Хотелось бы сначала услышать комментарии АТОЛа
dimOn
 
Сообщения: 5918
Зарегистрирован: 30 май 2008, 15:51

Re: Ошибка при снятие отчета с гашением

Сообщение Antonavt » 21 июл 2017, 13:29

Понятно, спасибо за ответ.

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

Касса не дает делать возвраты если не было платежей НАЛИЧНЫМИ в смену.
То есть если проводить чек прихода с ЭЛЕКТРОННЫМ платежом, а потом попытаться напечатать чек возврат то касса сругается на то что в ней нет денег для возврата.
Если же напечатать чек прихода с НАЛИЧНЫМ платежом, то можно печатать чеки возвратов столько сколько захочешь.
У нас к примеру наличных платежей нет, есть идеи решения данной проблемы?
Antonavt
 
Сообщения: 68
Зарегистрирован: 14 июн 2013, 17:39

Re: Ошибка при снятие отчета с гашением

Сообщение dimOn » 23 июл 2017, 15:53

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

Re: Ошибка при снятие отчета с гашением

Сообщение Antonavt » 24 июл 2017, 10:07

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

Re: Ошибка при снятие отчета с гашением

Сообщение dimOn » 24 июл 2017, 12:57

тогда непонятно с этим
вообще в протоколе написано, что это можно отключить, но как-то частично. вот смотрите:


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

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

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

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


тут поэтому непонятно почему при контроле наличности любого типа тут пишется везде "оплаченных наличными", зачем это так вообще делается - непотяно, это надо в АТОЛе спросить, видимо.
dimOn
 
Сообщения: 5918
Зарегистрирован: 30 май 2008, 15:51

Re: Ошибка при снятие отчета с гашением

Сообщение dimOn » 24 июл 2017, 13:01

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

Re: Ошибка при снятие отчета с гашением

Сообщение Antonavt » 26 июл 2017, 11:41

Я пробовал по разному, в метод check.setPaymentType(number) подставлял следующие значения:
1. Открыл смену, ставим в приходе тип 1(наличка) то возврат с типом 1 и 2 проходит.
2. Открыл смену, ставим в приходе тип 2(электронный) то возврат с типом 1 и 2 НЕ проходит.

Не совсем понял фразу
$this->bbcode_second_pass_quote('', '')ля нового интерфейса

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

Возник еще один вопрос :) про добавление в чек инфы про валюту?
$this->bbcode_second_pass_code('', 'check.addString("Валюта клиента: " + currency)')
Вот таким образом я конечно могу напечатать, но на сайте ОФД отображается что платежи приходят в рублях всегда(мы с помощью параметров добавили в биллинг многовалютность), это мне к ОФД нужно обращаться?
Antonavt
 
Сообщения: 68
Зарегистрирован: 14 июн 2013, 17:39
Вернуться к началу

Re: Ошибка при снятие отчета с гашением

Сообщение dimOn » 26 июл 2017, 12:27

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

Re: Ошибка при снятие отчета с гашением

Сообщение dimOn » 26 июл 2017, 12:27

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

Re: Ошибка при снятие отчета с гашением

Сообщение dimOn » 26 июл 2017, 12:28

ну и вот это:
$this->bbcode_second_pass_quote('', '')тавим в приходе тип 1(наличка) то возврат с типом 1 и 2 проходит

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

upd а, кажется, понял, типа сначала приход делаете с наличкой/электронным, а потом делаете возврат
ну тогда код покажите, да
dimOn
 
Сообщения: 5918
Зарегистрирован: 30 май 2008, 15:51
Вернуться к началу

Re: Ошибка при снятие отчета с гашением

Сообщение Antonavt » 26 июл 2017, 12:38

Все делаю через клиент биллинга через добавление расхода/возврата на договор.
Код:
$this->bbcode_second_pass_code('', '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);
}
}')
Antonavt
 
Сообщения: 68
Зарегистрирован: 14 июн 2013, 17:39

Re: Ошибка при снятие отчета с гашением

Сообщение dimOn » 26 июл 2017, 16:23

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

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

@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);
}
dimOn
 
Сообщения: 5918
Зарегистрирован: 30 май 2008, 15:51


Вернуться в Плагин CashCheck

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

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

cron