Comments 28
Называйте вещи своими именами. Касса это касса возможно со встроенным принтером чеков, а принтер чеков это принтер чеков.
Плюс цена у этой «кассы» очень странная. Быстрый гуглёж показал что есть решения с клавиатурой и экраном вплоть до практически двух кратной разницы в стоимости при такой же скорости печати. А значит производитель щедро накрутил цену. Как с штрих сканерами. На Али они стоят порой в десять раз дешевле при аналогичном качестве работы.
Ну она где-то стоит 11, а где-то 6, на Авито вообще бу можно снятые с учёта за 4 найти Атол, где вы за 2-3 нашли с экраном и кнопками и зачем это надо, если онлайн касса предусматривает номенклатуру, а это уже вся логика в 1с или подобной учётной софтине.
Где надо, я озвучил. Атол сильно завышает цену на подобный девайс.
Сейчас к примеру спамят рекламой сигарет(в смысле перехода на новый их учёт). Уже неделю активно долбят по нескольку раз за день, и отключить ни как нельзя. А это сильно мешает продавцам. Сигареты, алкоголь и другая продукция требующая нового учёта у меня никогда не продавалась и не может продаваться, что можно посмотреть по коду ОКВЭД и давать таргетированную рекламу или вовсе её отключить на кассе.
Все попавшие на скрин? судя по описанию умеют передавать данные ОФД, через wi-fi, сим карту, LAN, синий зуб или USB.
Аппаратно ЭЛВЕС-МФ вроде как там одно и тоже что в Атол 30ф, только добавили клаву и экран и программно зарезали функционал.
Округление дробей при подсчете сумм, нужно округлять до копеек, иначе можно получить 1.000000001 или 0.999999999
Наверное, стОит присмотреться к арифметике с фиксированной точкой. Например, в копейках целыми числами считать.
Собственно, когда-то двоично-десятичные числа именно для этого и придумали.
Планируемая схема примерно такая — есть CRM, которая крутится на сервере в локальной сети, ее открывают из браузеров, с серверной стороны на PHP через curl будут отправляться чеки и печататься на кассе. А сама касса подключена к любому компу на Windows в этой же сети.
Так я немного не понял… Касса на Винде?.. Какая же тут кросплатформенность.
Вот если бы API сервер JSON был бы внутри аппарата(вставить ту же малинку себе внутрь) и тогда мне не надо ставить всякие драйвера… а просто делаю request из любого языка из любой ОС… Это уже уровень.
Или хотя бы кроссплатформенное rest api(и не обязательно полный web сервер поднимать)
Типа запустил(в любой ОС) java -jar atol.jar или node atol.js и всё запустился.
(У нас например так но атол я снял с поддержки… Можно об этом почитать в топике https://habr.com/ru/post/453822/
Можно например Orange Pi Zero приклеить к аппарату сбоку и по Ethernet подключить, сделать небольшой транспорт запросов, дополнив его авторизацией и поправив еще контроль очередей и обработку зависших заданий.
У меня точно такие же были пожелания чтобы касса была самостоятельной, даже рассматривал кассы типа Эвотор и похожие другие, но Эвотор вещь в себе, весь обмен через облако идет и аппарат сам себе компьютер, а с любого своего адреса на него долбиться или с него собирать данные со своего сервера без написания нативного приложения под их андроид не получится (так мне в оф. поддержке ответили).
но драйвера аналогичные есть на linux x64/x32/arm,
А Вы с linux ом хорошол работаете?.. Там вот там не всё просто, драйвера эти не везде ставятся..(Как правило это ubuntu какой нибудь последней версии с последним или конкретным ядром).Я использую CentOS и когда я проводил исследования они не поднимались. Проще было чем "трахаться" со стыковкой драйверов и ОС самому писать на низкоуровневом протоколе(те же затраты сил и нервов)… В случае атола внутри она "такая калоша" ,-хуже низкоуровневого протокола для ФР не видел.
Полтора года назад после весьма энергичных поисков я нашёл только одного производителя таких касс (для вставки ФН вскрывал корпус, там была какая-то платка какого-то *** Pi).
За три года уже написано много серверов для ККМ.
Есть как аппаратно-программные (ардуинки со специальной прошивкой),
так и разной степени удобности / платности под обычный ПК.
Но то, что Вы сейчас описали в статье по удобству установки / интеграции
по моему мнению проигрывает практически всем.
Хм, таки есть жизнь
Чуть более года полтора назад я перебрал чуть ли не все аппараты, заколебал всех местных поставщиков и только у Старруса была касса с поддержкой JSON (с жутко глючным настроечным софтом, я два ФН запорол, пока они отлаживались на мне).
У какой-то кассы (не помню уже) был жуткий бинарный формат, видимо сделанный в спешке на основе «проводного» протокола.
Другие производители и вовсе не хотели давать протокол («кто ты такой?»).
В отличие от описываемого в статье аппарата касса от Старруса давала ответ сразу, без повторных запросов.
Впереди работа с маркировкой, скучать не придётся.
Но рынок цивилизируется, радует.
А потом проверить состояние смены, если не может получить, то смотреть выхлоп в результатах curl, а и еще важный момент забыл упомянуть, uuid генерируется через exec('uuidgen -r');
это требует установленной консольной утилиты, если команда uuidgen в консоли не выполняется…
Я тут уже новую версию библиотеки почти сделал пока к рабочему проекту прикручиваю, обработки всех ошибок сделал — когда нет соединения с сервером, когда с сервером общается, но сам ккт выключен и сервер до него достучаться не может и всякое такое
сервер перезапускала, UUid генерируется, в ответ выходит:
Array ( [0] => [1] => 0 [2] => )
и все…
curl выдают bool(false)
жду, наверно, новую версию.
может проблема в том, что " есть CRM, которая крутится на сервере в локальной сети, ее открывают из браузеров" а моя не на локале, а на хостинге?
Я вообще вижу лучшее решение ситуации на будущее — использовать например RabbitMQ и связать Python/Go транспорт с моей системой на PHP, т.к. работа через веб-сервер не только не очень безопасна, но и немного подтупливает с ответом на запросы, некоторые запросы действительно нуждаются в отложенной отработке, например печать чека, но вот элементарно проверить состояние смены, статус аппарата (вдруг бумага закончилась) и всё такое — могло бы сразу ответы выдавать, и то что авторизацию + шифрование по https не придумали это дикий недочет…
new Vue({
el: '#app',
data() {
return {
url:'http://127.0.0.1:16732/requests',
electronically: false,
showModal: false,
results: null,
tariffs: [
{id:0, name:'По городу', cost: 23},
{id:1, name:'Дачи', cost: 54},
{id:2, name:'Староконсурская', cost:60}
],
valueQr:'Билет липовый',
sizeQr:200
}
},
created() {
},
methods: {
geterateUuid : function(){
return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,c=>(c^crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4).toString(16))
},
getStatus: function(uid){
setTimeout(function(){
axios.get(`http://127.0.0.1:16732/requests/${uid}`)
.then(response => {
// JSON responses are automatically parsed.
console.log(response.data.results[0].errorDescription)
alert(response.data.results[0].errorDescription)
})
.catch(e => {
console.log(e)
})
}, 20000);
},
Tiket: function(event){
const cost = parseInt(event.target.dataset.cost, 10);
axios({
method: 'POST',
headers: { 'Content-Type': 'application/json' },
url: this.url,
data: {
"uuid": this.geterateUuid(),
"request": [
{
"type": "sell",
"taxationType": "osn",
"electronically": this.electronically,
"ignoreNonFiscalPrintErrors": true,
"operator": {
"name": "Иванов",
"vatin": "123654789507",
"paymentsAddress": "Автобус",
},
"clientInfo": {
"emailOrPhone": "+79181111111"
},
"items": [
{
"type": "position",
"name": "Проезд",
"price": cost,
"quantity": 1.0,
"amount": cost,
"paymentMethod": "fullPayment",
"paymentObject": "commodity",
"tax": {
"type": "vat20"
}
}
],
"payments": [
{
"type": "cash",
"sum": cost,
"printItems": [
{
"type": "text",
"text": "Оплата за проезд по городу"
}
]
}
],
"total": cost,
"postItems": [
{
"type": "text",
"text": "ТУТ МОЖНО РАЗМЕСТИТЬ РЕКЛАМУ",
"alignment": "center"
},
{
"type": "text",
"text": "Г.КРАСНОДАР 2019 Г.",
"alignment": "center"
},
{
"type": "text",
"text": "СЧАСТЛИВОГО ПУТИ",
"alignment": "center"
},
{
"type": "barcode",
"barcode": "978020137962",
"barcodeType": "EAN13"
}
]
}
]
}
})
.then((response) => {
const uuid = JSON.parse(response.config.data).uuid;
if(response.status === 201){
console.log('вызов запроса статуса');
this.getStatus(uuid)
this.showModal = true
}
})
.catch(error => {
console.log(error);
});
}
}
})
Опыт интеграции онлайн кассы Атол с собственной торговой CRM