:: Visual Foxpro, Foxpro for DOS
Печать чеков по протоколу ШТРИХ-ФР
Каратаев

Сообщений: 3977
Откуда: Алматы
Дата регистрации: 04.12.2001
Добрый день! Коллеги, возникла необходимость срочного внедрения в программу работы с протоколом штрих-фр.
Насколько я понял, тут фискальный чек сразу автоматом улетает в налоговую. А я про этого зверя вообще впервые слышу...
Поискал по форуму, нашёл вот это: forum.foxclub.ru
Мало чего понял. Можно-ли дать пример с пояснениями, что называется "для особо одарённых"?
Сам я в этом вопросе полный ноль.


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Печать чеков по протоколу ШТРИХ-ФР
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Во вложении пример реализации. Заточенный под конкретную систему, потому требует доработки, хотя подключение и первые команды должны проходить в любом случае.
Реализованы чеки продажи, возврата продажи (оба с использованием налички и банковских карт) и прием 100% предоплаты по безналу от ч/л.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Печать чеков по протоколу ШТРИХ-ФР
Каратаев

Сообщений: 3977
Откуда: Алматы
Дата регистрации: 04.12.2001
Спасибо огромное! Буду разбираться...



------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Печать чеков по протоколу ШТРИХ-ФР
Равиль

Сообщений: 6549
Откуда: Уфа
Дата регистрации: 01.08.2003
ssa
Во вложении пример реализации. Заточенный под конкретную систему, потому требует доработки, хотя подключение и первые команды должны проходить в любом случае.
Реализованы чеки продажи, возврата продажи (оба с использованием налички и банковских карт) и прием 100% предоплаты по безналу от ч/л.

и тут наш Piva ?
Цитата:
.... Piva BEAR v.250 format 08.06.2017 15:59:38


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Печать чеков по протоколу ШТРИХ-ФР
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Равиль
и тут наш Piva ?
Цитата:
.... Piva BEAR v.250 format 08.06.2017 15:59:38
Он тут только как автор первоначального форматера взамен beautify.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Печать чеков по протоколу ШТРИХ-ФР
Каратаев

Сообщений: 3977
Откуда: Алматы
Дата регистрации: 04.12.2001
Однако засада... Всё осложняется тем, что в моём случае - это web-касса. То есть самого аппарата нет, всё происходит онлайн... Попробую связаться с производителем, может что посоветуют...


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Печать чеков по протоколу ШТРИХ-ФР
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Каратаев
Однако засада... Всё осложняется тем, что в моём случае - это web-касса. То есть самого аппарата нет, всё происходит онлайн... Попробую связаться с производителем, может что посоветуют...
Подключай её через Тест драйвера и после этого программа воспользуется установками из этой проги. Как можешь убедиться в приложенных файлах нет никаких параметров подключения, используются настроенные этой самой прогой.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Печать чеков по протоколу ШТРИХ-ФР
Каратаев

Сообщений: 3977
Откуда: Алматы
Дата регистрации: 04.12.2001
ssa
Подключай её через Тест драйвера
Какой-то заколдованный круг. Там драйвер - это не то, что мы обычно подразумеваем под этим понятием. Нельзя скачать и установить. Это некая карта, которую нужно покупать у производителя. А тот утверждает, что этот драйвер работает только с 1С.
То есть потестировать не могу, а без этого купить, чтобы потом не использовать, если не прокатит моё подключение- не вариант.
Так, что пока топчусь на месте... Нашли тут ещё одного нашего производителя, который говорит, что если ваша система поддерживает протокол штрих-фр, то можно подключиться к их веб-кассе... Сегодня с ним свяжусь, уточню детали...


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Печать чеков по протоколу ШТРИХ-ФР
pasha_usue
Автор

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Каратаев
ssa
Подключай её через Тест драйвера
Какой-то заколдованный круг. Там драйвер - это не то, что мы обычно подразумеваем под этим понятием. Нельзя скачать и установить. Это некая карта, которую нужно покупать у производителя. А тот утверждает, что этот драйвер работает только с 1С.
То есть потестировать не могу, а без этого купить, чтобы потом не использовать, если не прокатит моё подключение- не вариант.
Если там используется технология 1C Native DLL, то её к фоксу прикрутить будет очень затратно, а то и нереально. На Си++ можно сэмулировать API 1C (структуры, интерфейсы объектов для событий и методов), и пользоваться такой DLL-кой. Но тож затратно по времени.
Ratings: 0 negative/0 positive
Re: Печать чеков по протоколу ШТРИХ-ФР
Каратаев

Сообщений: 3977
Откуда: Алматы
Дата регистрации: 04.12.2001
pasha_usue
На Си++ можно сэмулировать API 1C (структуры, интерфейсы объектов для событий и методов), и пользоваться такой DLL-кой. Но тож затратно по времени.
И всё-же прикрутил. Чисто на Фоксе, через API-интеграцию. Уже работает, все довольны.
Правда пришлось писать свой, ну очень специфический, парсер Json-ответов сервера... А в целом получилась чертовски удобная штука...


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/2 positive
Re: Печать чеков по протоколу ШТРИХ-ФР
pasha_usue
Автор

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Аплодирую. Есть чем поделиться?
Ratings: 0 negative/0 positive
Re: Печать чеков по протоколу ШТРИХ-ФР
Каратаев

Сообщений: 3977
Откуда: Алматы
Дата регистрации: 04.12.2001
pasha_usue
Аплодирую. Есть чем поделиться?
Честно говоря, даже и не знаю... Всё слишком завязано на мою программу... Разве что кому-то будут интересны какие-то общие моменты...
Вот, например, авторизация на сервисе webkassa, вырезка и кода класса:
PROCEDURE WebKassaAuthorize
* Пример взят отсюда: forum.foxclub.ru
* Доработка с параметрами моя
LPARAMETERS tcLogin, tcPassword
m.xml = "" && условленная структура сообщения
TEXT TO m.xml NOSHOW PRETEXT 1+2 TEXTMERGE
{
"Login" : <<tcLogin>>,
"Password" : <<tcPassword>>
}
ENDTEXT
m.url = This.cBaseApiUrl+'Authorize'
RETURN This.DoHttp(m.url, m.xml)
ENDPROC
А вот, собственно код DoHttp
PROCEDURE DoHttp
LPARAMETERS tcUrl, tcXml
tcXml = STRCONV(tcXml,9)
* HTTP-шлюз. Общение с сервисом осуществляется при помощи отправки HTTP-запросов на заданный адрес сервиса
* по протоколу HTTP методами GET/POST, проверка типа контента и валидность кодировки не осуществляется.
*oHTTP = CREATEOBJECT("MSXML2.XMLHTTP.6.0")
oHTTP = CREATEOBJECT("MSXML2.XMLHTTP")
oHTTP.open("POST", tcUrl)
oHTTP.setRequestHeader("Content-Type", "application/json")
oHTTP.send(0h+tcXml)
ltStart = DATETIME()
*DO WHILE m.oHTTP.readyState <> 4 AND DATETIME() - m.ltStart < 30 && Таймаут подобрать по своему усмотрению
DO WHILE m.oHTTP.readyState <> 4
DOEVENTS FORCE
ENDDO
LOCAL lcResponse
lcResponse = ""
*!* PUSH KEY CLEAR
*!* SET STEP ON
* Разбор ответа
DO CASE
CASE m.oHTTP.readyState <> 4
* Не дождались ответа
lcResponse = "Нет ответа от сервера"
CASE !BETWEEN(m.oHTTP.Status, 200, 299)
* HTTP код ошибки
* В теории "нормальным" считается любой код 2**, не только 200
* lcResponse = "Ошибка обработки данных"
lcResponse = m.oHTTP.responseText
MESSAGEBOX(lcResponse)
*This.ShowError(lcResponse)
* Здесь надо сделать разбор ошибки
* Хотябы вычислить её код
OTHERWISE
lcResponse = m.oHTTP.responseText
* Можно разбирать сам "текст ответа" сервера
ENDCASE
*m.r = m.oHTTP.responseText
m.r = lcResponse
oHTTP = .NULL.
*MESSAGEBOX(m.r)
RETURN m.r
ENDPROC
Или вот отправка чека из накладной:
PROCEDURE WebKassaCheck
* Проверка нужен ли вообще чек (по типу платежа)
IF !INLIST(typplat, 'N','B','K','R','S','T','F') && Официальные типы платежей
=MESSAGEBOX("Неофициальные документы WebKassa не обрабатывает",16+0+0,"WebKassa")
RETURN .F.
ENDIF
* 0 = Наличные
* 1 = Оплата картой
* 2 = Оплата в кредит
* 3 = Оплата тарой
**************************************
* Какая в данный момент актуальная фирма
IF This.ActualFirm(kodotpr) = .F.
RETURN .F.
ENDIF
***************************************
IF INLIST(typplat, 'B','T') && Безнал
This.nPaymentType = 1
ELSE
This.nPaymentType = 0 && Нал
ENDIF
*MESSAGEBOX(This.cToken+chr(13)+This.cUniqueNumber)
local lnOperationType, xml, lcResponse
* kodoper = 'OP' typvhod = 'OP'
*m.lnOperationType = IIF(kodoper == 'OP', 2, 3)
m.xml = ""
m.lcResponse = ""
TEXT TO m.xml NOSHOW PRETEXT 1+2 TEXTMERGE
{
"Token" : <<This.cToken>>,
"CashboxUniqueNumber" : <<This.cUniqueNumber>>,
"OperationType" : <<This.nOperationType>>,
"Positions" : [
ENDTEXT
SELECT cur_webkas
LOCAL lnKvoPos, lnSum, lnSumx, lnKvo, lcExtCheckNum
m.lnKvoPos = RECCOUNT("cur_webkas") && tov_dv
STORE 0.00 TO m.lnSum, m.lnSumx
FOR m.i = 1 TO m.lnKvoPos
GO m.i
m.lnSum = cena_ * kol_vo
m.lnSumx = m.lnSumx + m.lnSum
*m.NameTov = STRTRAN(name_tov,"/","|")
m.NameTov = ALLTRIM(name_tov)
m.lnTaxType = IIF(INLIST(kodotpr,"A444","1111"),0,100) && 0-без налога, 100-НДС
IF m.lnTaxType = 100
m.TaxPercent = 12
m.lnTax = (Lnds(cena_,m.TaxPercent,"N")*kol_vo)
*m.lnTax = VAL(TRANSFORM(m.lnTax,"9 999 999.99"))
m.lnTax=ROUND(m.lnTax,2)
*!* FOR di = 7 TO 2 STEP -1
*!* m.lnTax=ROUND(m.lnTax,di)
*!* ENDFOR
ELSE
m.TaxPercent = 0
m.lnTax = 0
ENDIF
TEXT TO m.xml ADDITIVE NOSHOW PRETEXT 1+2 TEXTMERGE
{
"Count" : <<kol_vo>>,
"Price" : <<cena_>>,
"TaxPercent" : <<m.TaxPercent>>,
"Tax" : <<m.lnTax>>,
"TaxType" : <<m.lnTaxType>>,
"PositionName" : <<'"'+ALLTRIM(m.NameTov)+'"'>>,
"PositionCode" : <<'"'+TRANSFORM(m.i)+'"'>>,
"UnitCode" : <<This.WebKassaConvertUnins(ed_iz)>>,
"ProductId" : <<IIF(EMPTY(kod_duty),0,ALLTRIM(kod_duty))>>
}<<IIF(m.i < m.lnKvoPos,",","")>>
ENDTEXT
ENDFOR
m.lcExtCheckNum = kodotpr+"-"+ALLTRIM(nompp) + "-" + DTOS(dtoper)
TEXT TO m.xml ADDITIVE NOSHOW PRETEXT 1+2 TEXTMERGE
],
"Payments" : [
{
"Sum" : <<IIF(This.nPaymentType = 1, m.lnSumx, 0)>>,
"PaymentType" : 1
},
{
"Sum" : <<IIF(This.nPaymentType = 0, m.lnSumx, 0)>>,
"PaymentType" : 0
}
],
"RoundType" : 0,
"ExternalCheckNumber" : <<'"'+m.lcExtCheckNum+'"'>>
}
ENDTEXT
*STRTOFILE(m.xml,"c:\ProgVFP\Test\KKM\webkassa\Test\wkass.txt")
m.url = This.cBaseApiUrl+'Check'
*m.xml = "["+m.xml+"]"
m.lcResponse = This.DoHttp(m.url, m.xml)
* MESSAGEBOX(m.lcResponse)
*STRTOFILE(m.lcResponse,"c:\ProgVFP\Test\KKM\webkassa\Test\Check.txt")
*STRTOFILE(m.lcResponse,"c:\ProgVFP\Test\KKM\webkassa\Test\Error.txt")
*STRTOFILE(m.lcResponse,ADDBS(goApp.pathmydocuments + 'Saved')+"\Ticket.txt")
LOCAL llSuccess, lcTicketPrintUrl, lcLocalResponse
DO CASE
CASE ATC("Data", m.lcResponse) > 0
* Даже в этом случае могут быть ошибки и их надо проверить
IF ATC("Errors", m.lcResponse) > 0
m.llSuccess = .F.
m.lcResponse = [{"]+STREXTRACT(m.lcResponse,["],[}],63)+[}]
This.ShowError(m.lcResponse)
ELSE
m.lcLocalResponse = m.lcResponse
*STRTOFILE(m.lcLocalResponse,"c:\ProgVFP\Test\KKM\webkassa\Test\LocResp.txt")
m.lcResponse = STREXTRACT(m.lcResponse,["],["],61)
m.lcTicketPrintUrl = m.lcResponse
m.llSuccess = .T.
ENDIF
CASE ATC("Errors", m.lcResponse) > 0
This.ShowError(m.lcResponse)
ENDCASE
IF m.llSuccess = .T.
*MESSAGEBOX(m.lcTicketPrintUrl)
* m.lcTicketPrintUrl = strtran(m.lcTicketPrintUrl,"https://kkm","https://devkkm") && Б боевом режиме убрать замену
*!* Declare INTEGER ShellExecute IN Shell32 INTEGER, STRING @, STRING @, ;
*!* STRING @, STRING @, SHORT
*!* ShellExecute(0, "open", m.lcTicketPrintUrl, "", "", 1)
* MESSAGEBOX(m.lcTicketPrintUrl)
LOCAL lcstatus, lcconsole, lctalk
lcstatus = SET("STATUS BAR")
lcconsole = SET("CONSOLE")
lctalk = SET("TALK")
SET STATUS BAR OFF
SET CONSOLE OFF
SET TALK OFF
TRY
m.lcLocalPrintUrl = This.MakeLocalFile(m.lcLocalResponse)
DO FORM frm_webkassa WITH m.lcLocalPrintUrl
CATCH
DO FORM frm_webkassa WITH m.lcTicketPrintUrl
ENDTRY
SET STATUS BAR &lcstatus
SET CONSOLE &lcconsole
SET TALK &lctalk
ENDIF
RETURN m.llSuccess
ENDPROC
Прошу прощения, код ещё не вычищал... Это впереди... Кстати, тут виден мой способ парсинга, основан на STREXTRACT()... Тут всего пара строк с парсингом, а в реальности есть целая процедура такого разбора json... Не знаю, надо ли кому всё это. Если что-то заинтересует, я постараюсь ответить...


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/3 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 30 vnkor dimag  (Гостей: 28)

© 2000-2024 Fox Club 
Яндекс.Метрика