mirror of
https://github.com/anthonyaxenov/atol-online.git
synced 2024-11-21 21:34:34 +00:00
Готов класс оплаты Payment
для будущей поддержки оплат в документе
This commit is contained in:
parent
65ec639014
commit
7d0c526663
@ -147,6 +147,11 @@ final class Constraints
|
||||
*/
|
||||
const CORRECTION_DATE_FORMAT = 'd.m.Y';
|
||||
|
||||
/**
|
||||
* Максимальная сумма одной оплаты
|
||||
*/
|
||||
const MAX_COUNT_PAYMENT_SUM = 99999.999;
|
||||
|
||||
/**
|
||||
* Регулярное выражение для валидации строки ИНН
|
||||
*
|
||||
|
119
src/Entities/Payment.php
Normal file
119
src/Entities/Payment.php
Normal file
@ -0,0 +1,119 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
declare(strict_types = 1);
|
||||
|
||||
namespace AtolOnline\Entities;
|
||||
|
||||
use AtolOnline\Constants\Constraints;
|
||||
use AtolOnline\Enums\PaymentTypes;
|
||||
use AtolOnline\Exceptions\InvalidEnumValueException;
|
||||
use AtolOnline\Exceptions\NegativePaymentSumException;
|
||||
use AtolOnline\Exceptions\TooHighPaymentSumException;
|
||||
use JetBrains\PhpStorm\ArrayShape;
|
||||
use JetBrains\PhpStorm\Pure;
|
||||
|
||||
/**
|
||||
* Класс, описывающий оплату
|
||||
*
|
||||
* @see https://online.atol.ru/files/API_atol_online_v4.pdf Документация, стр 30
|
||||
*/
|
||||
class Payment extends Entity
|
||||
{
|
||||
/**
|
||||
* @var int Тип оплаты
|
||||
*/
|
||||
protected int $type;
|
||||
|
||||
/**
|
||||
* @var float Сумма оплаты (1031, 1081, 1215, 1216, 1217)
|
||||
*/
|
||||
protected float $sum;
|
||||
|
||||
/**
|
||||
* Конструктор
|
||||
*
|
||||
* @param int $type Тип оплаты
|
||||
* @param float $sum Сумма оплаты
|
||||
* @throws InvalidEnumValueException
|
||||
* @throws NegativePaymentSumException
|
||||
* @throws TooHighPaymentSumException
|
||||
*/
|
||||
public function __construct(int $type, float $sum)
|
||||
{
|
||||
$this->setType($type)->setSum($sum);
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает установленный тип оплаты
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getType(): int
|
||||
{
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает тип оплаты
|
||||
*
|
||||
* @param int $type
|
||||
* @return $this
|
||||
* @throws InvalidEnumValueException
|
||||
*/
|
||||
public function setType(int $type): self
|
||||
{
|
||||
PaymentTypes::isValid($type) && $this->type = $type;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает установленную сумму оплаты
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getSum(): float
|
||||
{
|
||||
return $this->sum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает сумму оплаты
|
||||
*
|
||||
* @param float $sum
|
||||
* @return $this
|
||||
* @throws TooHighPaymentSumException
|
||||
* @throws NegativePaymentSumException
|
||||
*/
|
||||
public function setSum(float $sum): self
|
||||
{
|
||||
$sum = round($sum, 2);
|
||||
if ($sum > Constraints::MAX_COUNT_PAYMENT_SUM) {
|
||||
throw new TooHighPaymentSumException($sum);
|
||||
}
|
||||
if ($sum < 0) {
|
||||
throw new NegativePaymentSumException($sum);
|
||||
}
|
||||
$this->sum = $sum;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
#[Pure]
|
||||
#[ArrayShape(['type' => 'int', 'sum' => 'float'])]
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return [
|
||||
'type' => $this->getType(),
|
||||
'sum' => $this->getSum(),
|
||||
];
|
||||
}
|
||||
}
|
@ -1,99 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
declare(strict_types = 1);
|
||||
|
||||
namespace AtolOnline\Entities;
|
||||
|
||||
use AtolOnline\Enums\PaymentTypes;
|
||||
|
||||
/**
|
||||
* Класс, описывающий оплату. Тег ФФД - 1031, 1081, 1215, 1216, 1217.
|
||||
*
|
||||
* @package AtolOnline\Entities
|
||||
*/
|
||||
class todoPayment extends Entity
|
||||
{
|
||||
/**
|
||||
* @var int Тип оплаты
|
||||
*/
|
||||
protected int $type;
|
||||
|
||||
/**
|
||||
* @var float Сумма оплаты
|
||||
*/
|
||||
protected float $sum;
|
||||
|
||||
/**
|
||||
* todoPayment constructor.
|
||||
*
|
||||
* @param int $payment_type Тип оплаты
|
||||
* @param float $sum Сумма оплаты
|
||||
*/
|
||||
public function __construct(int $payment_type = PaymentTypes::ELECTRON, float $sum = 0.0)
|
||||
{
|
||||
$this->setType($payment_type);
|
||||
$this->setSum($sum);
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает тип оплаты. Тег ФФД - 1031, 1081, 1215, 1216, 1217.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getType(): int
|
||||
{
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает тип оплаты. Тег ФФД - 1031, 1081, 1215, 1216, 1217.
|
||||
*
|
||||
* @param int $type
|
||||
* @return $this
|
||||
*/
|
||||
public function setType(int $type): todoPayment
|
||||
{
|
||||
$this->type = $type;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает сумму оплаты
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function getSum(): float
|
||||
{
|
||||
return $this->sum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает сумму оплаты
|
||||
*
|
||||
* @param float $sum
|
||||
* @return $this
|
||||
*/
|
||||
public function setSum(float $sum): todoPayment
|
||||
{
|
||||
$this->sum = $sum;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function jsonSerialize()
|
||||
{
|
||||
return [
|
||||
'type' => $this->getType(),
|
||||
'sum' => $this->getSum(),
|
||||
];
|
||||
}
|
||||
}
|
38
src/Exceptions/NegativePaymentSumException.php
Normal file
38
src/Exceptions/NegativePaymentSumException.php
Normal file
@ -0,0 +1,38 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
declare(strict_types = 1);
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use AtolOnline\Constants\Ffd105Tags;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке указать оплате отрицательную сумму
|
||||
*/
|
||||
class NegativePaymentSumException extends AtolException
|
||||
{
|
||||
protected array $ffd_tags = [
|
||||
Ffd105Tags::PAYMENT_TYPE_CASH,
|
||||
Ffd105Tags::PAYMENT_TYPE_CREDIT,
|
||||
Ffd105Tags::PAYMENT_TYPE_ELECTRON,
|
||||
Ffd105Tags::PAYMENT_TYPE_PREPAID,
|
||||
Ffd105Tags::PAYMENT_TYPE_OTHER,
|
||||
];
|
||||
|
||||
/**
|
||||
* Конструктор
|
||||
*
|
||||
* @param float $sum
|
||||
*/
|
||||
public function __construct(float $sum)
|
||||
{
|
||||
parent::__construct('Размер оплаты не может быть отрицательным: ' . $sum);
|
||||
}
|
||||
}
|
31
src/Exceptions/TooHighPaymentSumException.php
Normal file
31
src/Exceptions/TooHighPaymentSumException.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
declare(strict_types = 1);
|
||||
|
||||
namespace AtolOnline\Exceptions;
|
||||
|
||||
use AtolOnline\Constants\Constraints;
|
||||
use AtolOnline\Constants\Ffd105Tags;
|
||||
|
||||
/**
|
||||
* Исключение, возникающее при попытке установки слишком большой суммы оплаты
|
||||
*/
|
||||
class TooHighPaymentSumException extends TooManyException
|
||||
{
|
||||
protected $message = 'Слишком высокый размер оплаты';
|
||||
protected array $ffd_tags = [
|
||||
Ffd105Tags::PAYMENT_TYPE_CASH,
|
||||
Ffd105Tags::PAYMENT_TYPE_CREDIT,
|
||||
Ffd105Tags::PAYMENT_TYPE_ELECTRON,
|
||||
Ffd105Tags::PAYMENT_TYPE_PREPAID,
|
||||
Ffd105Tags::PAYMENT_TYPE_OTHER,
|
||||
];
|
||||
protected float $max = Constraints::MAX_COUNT_PAYMENT_SUM;
|
||||
}
|
105
tests/AtolOnline/Tests/Entities/PaymentTest.php
Normal file
105
tests/AtolOnline/Tests/Entities/PaymentTest.php
Normal file
@ -0,0 +1,105 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2020-2021 Антон Аксенов (Anthony Axenov)
|
||||
*
|
||||
* This code is licensed under MIT.
|
||||
* Этот код распространяется по лицензии MIT.
|
||||
* https://github.com/anthonyaxenov/atol-online/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
namespace AtolOnline\Tests\Entities;
|
||||
|
||||
use AtolOnline\{
|
||||
Constants\Constraints,
|
||||
Entities\Payment,
|
||||
Enums\PaymentTypes,
|
||||
Tests\BasicTestCase
|
||||
};
|
||||
use AtolOnline\Exceptions\{
|
||||
InvalidEnumValueException,
|
||||
NegativePaymentSumException,
|
||||
TooHighPaymentSumException,
|
||||
};
|
||||
|
||||
/**
|
||||
* Набор тестов для проверки работы класса оплаты
|
||||
*/
|
||||
class PaymentTest extends BasicTestCase
|
||||
{
|
||||
/**
|
||||
* Тестирует конструктор
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Payment
|
||||
* @covers \AtolOnline\Entities\Payment::setType
|
||||
* @covers \AtolOnline\Entities\Payment::getType
|
||||
* @covers \AtolOnline\Entities\Payment::setSum
|
||||
* @covers \AtolOnline\Entities\Payment::getSum
|
||||
* @covers \AtolOnline\Entities\Payment::jsonSerialize
|
||||
* @return void
|
||||
* @throws InvalidEnumValueException
|
||||
* @throws NegativePaymentSumException
|
||||
* @throws TooHighPaymentSumException
|
||||
*/
|
||||
public function testConstructor(): void
|
||||
{
|
||||
$this->assertAtolable(
|
||||
new Payment(PaymentTypes::ELECTRON, 123.456789),
|
||||
[
|
||||
'type' => PaymentTypes::ELECTRON,
|
||||
'sum' => 123.46,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение при некорректном типе
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Payment
|
||||
* @covers \AtolOnline\Entities\Payment::setType
|
||||
* @covers \AtolOnline\Enums\PaymentTypes::isValid
|
||||
* @covers \AtolOnline\Exceptions\InvalidEnumValueException
|
||||
* @return void
|
||||
* @throws InvalidEnumValueException
|
||||
* @throws NegativePaymentSumException
|
||||
* @throws TooHighPaymentSumException
|
||||
*/
|
||||
public function testInvalidEnumValueException(): void
|
||||
{
|
||||
$this->expectException(InvalidEnumValueException::class);
|
||||
$this->expectExceptionMessage('Некорректное значение AtolOnline\Enums\PaymentTypes::123');
|
||||
new Payment(123, 123.456789);
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение при слишком большой сумме
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Payment
|
||||
* @covers \AtolOnline\Entities\Payment::setSum
|
||||
* @covers \AtolOnline\Exceptions\TooHighPaymentSumException
|
||||
* @return void
|
||||
* @throws InvalidEnumValueException
|
||||
* @throws NegativePaymentSumException
|
||||
*/
|
||||
public function testTooHighPaymentSumException(): void
|
||||
{
|
||||
$this->expectException(TooHighPaymentSumException::class);
|
||||
new Payment(PaymentTypes::ELECTRON, Constraints::MAX_COUNT_PAYMENT_SUM + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует исключение при отрицательной сумме
|
||||
*
|
||||
* @covers \AtolOnline\Entities\Payment
|
||||
* @covers \AtolOnline\Entities\Payment::setSum
|
||||
* @covers \AtolOnline\Exceptions\NegativePaymentSumException
|
||||
* @return void
|
||||
* @throws InvalidEnumValueException
|
||||
* @throws NegativePaymentSumException
|
||||
* @throws TooHighPaymentSumException
|
||||
*/
|
||||
public function testNegativePaymentSumException(): void
|
||||
{
|
||||
$this->expectException(NegativePaymentSumException::class);
|
||||
new Payment(PaymentTypes::ELECTRON, -1);
|
||||
}
|
||||
}
|
@ -12,6 +12,7 @@ namespace AtolOnline\Tests\Entities;
|
||||
use AtolOnline\{
|
||||
Entities\Vat,
|
||||
Enums\VatTypes,
|
||||
Exceptions\InvalidEnumValueException,
|
||||
Tests\BasicTestCase
|
||||
};
|
||||
|
||||
@ -69,6 +70,7 @@ class VatTest extends BasicTestCase
|
||||
* @covers \AtolOnline\Entities\Vat::getSum
|
||||
* @covers \AtolOnline\Entities\Vat::getCalculated
|
||||
* @covers \AtolOnline\Entities\Vat::jsonSerialize
|
||||
* @throws InvalidEnumValueException
|
||||
*/
|
||||
public function testConstructor(string $type, float $sum): void
|
||||
{
|
||||
@ -90,6 +92,7 @@ class VatTest extends BasicTestCase
|
||||
* @param float $after_minus Результат после -20р
|
||||
* @covers \AtolOnline\Entities\Vat::addSum
|
||||
* @covers \AtolOnline\Entities\Vat::getCalculated
|
||||
* @throws InvalidEnumValueException
|
||||
*/
|
||||
public function testVatAdd(string $type, float $after_plus, float $after_minus)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user