noith/fiscal-receipt

DTO, enums, serialization and validation for Russian fiscal receipts FFD 1.05 and 1.2.

Maintainers

Package info

gitlab.com/noith-payment/fiscal-receipt

Issues

pkg:composer/noith/fiscal-receipt

Statistics

Installs: 5

Dependents: 1

Suggesters: 0

Stars: 0

1.0.1 2026-06-22 16:13 UTC

This package is auto-updated.

Last update: 2026-06-22 13:14:16 UTC


README

PHP-библиотека с DTO, enum, value object, сериализацией и валидацией кассовых чеков для российских форматов ФФД 1.05 и ФФД 1.2.

Возможности

  • DTO для черновиков чеков и фискализированных чеков.
  • Общие value object для денег, количества, ИНН, контактов, ФН, РН ККТ и UInt64.
  • Enum для типов оплаты, предметов расчета, ставок НДС, систем налогообложения и операций.
  • JSON/array-сериализация чеков.
  • Парсинг JSON фискализированных чеков обратно в DTO.
  • Валидация ФЛК для ФФД 1.05 и ФФД 1.2.

Требования

  • PHP 8.2+
  • Composer

Установка

composer require noith/fiscal-receipt

Для разработки:

composer install
composer test

Быстрый старт: ФФД 1.05

<?php

use FiscalReceipt\Common\Enum\OperationType;
use FiscalReceipt\Common\Enum\PaymentMethod;
use FiscalReceipt\Common\Enum\PaymentObject;
use FiscalReceipt\Common\Enum\TaxationType;
use FiscalReceipt\Common\Enum\VatRate;
use FiscalReceipt\Common\Value\Money;
use FiscalReceipt\Common\Value\Quantity;
use FiscalReceipt\Ffd105\Dto\PaymentBreakdown;
use FiscalReceipt\Ffd105\Dto\ReceiptDraft;
use FiscalReceipt\Ffd105\Dto\ReceiptItem;
use FiscalReceipt\Ffd105\Enum\DocumentType;
use FiscalReceipt\Ffd105\Serialization\ReceiptDraftSerializer;

$item = new ReceiptItem(
    price: new Money(10_000),          // 100.00 RUB в копейках
    quantity: new Quantity(1.0),
    sum: new Money(10_000),
    vatRate: VatRate::Vat20,
    name: 'Товар',
    paymentMethod: PaymentMethod::FullPayment,
    paymentObject: PaymentObject::Commodity,
);

$receipt = new ReceiptDraft(
    documentType: DocumentType::Receipt,
    operationType: OperationType::Income,
    taxationType: TaxationType::Osn,
    payments: PaymentBreakdown::electronicOnly(new Money(10_000)),
    items: [$item],
    internetPayment: true,
);

$json = (new ReceiptDraftSerializer())->toJson($receipt);

Быстрый старт: ФФД 1.2

<?php

use FiscalReceipt\Common\Enum\OperationType;
use FiscalReceipt\Common\Enum\PaymentMethod;
use FiscalReceipt\Common\Enum\PaymentObject;
use FiscalReceipt\Common\Enum\QuantityMeasure;
use FiscalReceipt\Common\Enum\TaxationType;
use FiscalReceipt\Common\Enum\VatRate;
use FiscalReceipt\Common\Value\Money;
use FiscalReceipt\Common\Value\Quantity;
use FiscalReceipt\Ffd12\Dto\PaymentBreakdown;
use FiscalReceipt\Ffd12\Dto\ProductCodeNew;
use FiscalReceipt\Ffd12\Dto\ReceiptDraft;
use FiscalReceipt\Ffd12\Dto\ReceiptItem;
use FiscalReceipt\Ffd12\Enum\DocumentType;
use FiscalReceipt\Ffd12\Serialization\ReceiptDraftSerializer;

$item = new ReceiptItem(
    paymentType: PaymentMethod::FullPayment,
    productType: PaymentObject::Commodity,
    sum: new Money(10_000),
    price: new Money(10_000),
    quantity: new Quantity(1.0),
    itemsQuantityMeasure: QuantityMeasure::Piece,
    name: 'Товар',
    nds: VatRate::Vat20,
    productCodeNew: ProductCodeNew::ean13('4601234567890'),
);

$receipt = new ReceiptDraft(
    code: DocumentType::Receipt,
    operationType: OperationType::Income,
    appliedTaxationType: TaxationType::Osn,
    retailPlaceAddress: 'https://example.com',
    retailPlace: 'https://example.com',
    payments: PaymentBreakdown::electronicOnly(new Money(10_000)),
    items: [$item],
    internetPayment: true,
);

$json = (new ReceiptDraftSerializer())->toJson($receipt);

Валидация

use FiscalReceipt\Ffd105\Validation\FiscalizedReceiptValidator;

$result = (new FiscalizedReceiptValidator())->validate($fiscalizedReceipt);

if (!$result->isValid()) {
    foreach ($result->violations as $violation) {
        echo $violation->code . ': ' . $violation->message . PHP_EOL;
    }
}

Для ФФД 1.2 используйте FiscalReceipt\Ffd12\Validation\FiscalizedReceiptValidator.

Парсинг фискализированного чека

use FiscalReceipt\Ffd105\Serialization\FiscalizedReceiptJsonParser;

$receipt = (new FiscalizedReceiptJsonParser())->fromJson($json);

Для ФФД 1.2 используйте FiscalReceipt\Ffd12\Serialization\FiscalizedReceiptJsonParser.

Деньги и суммы

Money хранит значение в копейках:

new Money(10_000);              // 100.00
Money::fromRubles('100.50');    // 10050 копеек

Тесты

composer test

Лицензия

MIT. См. LICENSE.