Example #1
0
 def begin(self, host_datetime=datetime.now()):
     """
     Начало работы с кассой
     :param host_datetime: Время управляющего компьютера
     """
     query = Output(0x10)
     query.add_param(host_datetime)
     self.send(query)
Example #2
0
    def open_doc(self,
                 doc_type: DocumentType,
                 mode_bulk: bool = False,
                 mode_delay: bool = False,
                 departament: int = 0,
                 number: int = 0):
        """
        Открыть документ

        В пакетном режиме формирования документа, при успешном выполнении команд формирования чека
        - (Не реализовано) Установить дополнительные реквизиты позиции
        - print_text: Печать текста
        - print_barcode: Печатать штрих-код
        - add_item: Добавить товарную позицию
        - doc_subtotal: Подытог
        - Скидка на чек
        - doc_payment: Оплата
        - Внесение / изъятие суммы
        - Печать реквизита
        - Сравнить сумму по чеку
        , ответ на команду не посылается. Если какая-либо команда выполняется с ошибкой, то на нее возвращается
        стандартный ответ с кодом ошибки. Последующие команды формирования чека игнорируются, на каждую такую комадну
        возвращается стандартный ответ с кодом ошибки "Функция невыполнима при данном статусе ККТ" до поступления команд
         “Завершить документ” или “Аннулировать документ”.

        При возникновении ошибки в процессе наполнения документа в пакетном режиме необходимо аннулировать документ и
        полностью сформировать документ заново, начиная с команды "Открыть документ".

        :param doc_type: Тип документа
        :param mode_bulk: Пакетный режим формирования документа
        :param mode_delay: Режим отложенной печати реквизитов
        :param departament: Номер отдела (1-99)
        :param number: Номер документа
        """
        param = doc_type.value
        if mode_bulk:
            param = param & 1 << 4
        if mode_delay:
            param = param & 1 << 5
        query = Output(0x30)
        query.add_param(str(param))
        query.add_param(str(departament))
        query.add_param(self.operator)
        if number == 0 and self.settings.cheque.external_counter:
            raise Exception(
                "Настроена внешняя нумерация чеков, необходимо передавать номер документа!"
            )
        query.add_param(str(number))
        query.add_param(self.tax_system)
        self.send(query)
Example #3
0
    def add_item(self,
                 title: str,
                 article: str,
                 count: float,
                 price: float,
                 number_tax: int,
                 payment_type: PaymentType,
                 subject_matter: SubjectMatter,
                 discount_total: float = 0,
                 number_item: str = "",
                 number_departament: int = 0,
                 code_country: str = None,
                 number_customs: str = None,
                 excise_total: float = None):
        """
        Добавить товарную позицию

        Эта команда может быть вызвана сразу после открытия чека и может повторяться любое количество раз (если признак
        способа расчета не равен 7) внутри текущего документа для отражения всего списка товаров. Если позиция не может
        быть добавлена в ФН, на чеке после данных о позиции печатается строка “ОПЕРАЦИЯ ОТМЕНЕНА” и возвращается
        соответствующий код ошибки ФН.

        Для повышения точности вычислений, можно передавать количество с точностью до 9 знаков после запятой, при этом в
        умножении на цену будет участвовать 9 знаков после запятой, а печататься только первые 3.

        Сумма позиции, получаемая в результате умножения цены на количество, округляется к ближайшему целому, т.е. часть
        менее 0.5 коп отбрасывается, 0.5 коп и более округляется до 1 коп.

        Параметры ”Номер товарной позиции” и “Номер секции” не являются обязательными и могут отсутствовать. Если номер
        секции отсутствует (или равен нулю), учет ведется на номер отдела, указанный при открытии документа. Номер
        позиции - символьное поле, состоящее из цифр и символа разделителя, которым может быть пробел, двоеточие, тире и
         другие символы.

        В связи с требованиями ФФД поле "Название товара" при длине, большей 128 символов, будет обрезано до 128
        символов.
        :param title: название товара(0..224)
        :param article: артикул или штриховой код товара/номер ТРК
        :param count: количество товара в товарной позиции
        :param price: цена товара по данному артикулу
        :param number_tax: номер ставки налога (Номер налога в регистре кассы обычно (1-20%, 2-10%, 3-Без НДС или 0%))
        :param number_item: номер товарной позиции
        :param number_departament: номер секции
        :param discount_total: сумма скидки
        :param payment_type: признак способа расчета
        :param subject_matter: признак предмета расчета
        :param code_country: код страны происхождения товара (номер)
        :param number_customs: номер таможенной декларации
        :param excise_total: сумма акциза
        :return:
        """
        query = Output(0x42)
        query.add_param(title)
        query.add_param(article)
        query.add_param("%0.3f" % count)
        query.add_param("%0.3f" % price)
        query.add_param(str(number_tax))
        query.add_param(number_item)
        query.add_param(str(number_departament))
        query.add_param("").add_param("")
        query.add_param("%0.3f" % discount_total)
        query.add_param(str(payment_type.value))
        query.add_param(str(subject_matter.value))
        # Насколько я понял нужны только для расчетов ЮР лиц
        if code_country:
            query.add_param(code_country)
        if number_customs:
            query.add_param(number_customs)
        if excise_total:
            query.add_param(excise_total)
        self.send(query)
Example #4
0
    def close_doc(self,
                  cut: CutFlag,
                  sign_internet_payment: bool = None,
                  address: str = None,
                  title: str = None,
                  value: str = None,
                  buyer: str = None,
                  buyer_inn: str = None) -> CloseDocData:
        """
        Завершить документ

        Фискальный признак возвращается только при завершении чеков на приход, возврат прихода, расход и возврат
        расхода. В пакетном режиме формирования документа, команда “Завершить документ” выключает пакетный режим.
        Если в пакетном режиме ошибка возникла ранее команды “Завершить документ”, то ответ команду “Завершить документ”
        не возвращается. Можно продолжить формирование документа, начиная с команды вернувшей ошибку, обычном режиме.

        :param cut: флаг отрезки документов
        :param sign_internet_payment: установить признак расчетов в интернет
        :param address: адрес покупателя # TODO Email?
        :param title: название дополнительного реквизита пользователя
        :param value: значение дополнительного реквизита пользователя
        :param buyer: покупатель
        :param buyer_inn: ИНН покупателя
        :return:
        """
        query = Output(0x31)
        query.add_param(cut)
        if address:
            query.add_param(address)
        if sign_internet_payment:
            query.add_param(sign_internet_payment)
        if title:
            query.add_param(title)
        if value:
            query.add_param(value)
        if buyer:
            query.add_param(buyer)
        if buyer_inn:
            query.add_param(buyer_inn)
        packet = self.send(query)
        return CloseDocData(packet)