Mahdee Rajon  subception

File "IntegrationPaymentDTO.php"

Full Path: /var/www/html/back/app/DTO/IntegrationPaymentDTO.php
File size: 7.92 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace App\DTO;

use App\Domain\Payment\Enums\PaymentStatusEnum;
use App\Domain\Payment\Enums\PaymentTypeEnum;
use Illuminate\Support\Facades\Log;


class IntegrationPaymentDTO
{
    private int $modelId;
    private int $userId;
    private string $organizationId;
    private string $counterpartyId;
    private string $accountId;
    private string $name;
    private string $status;
    private string $paymentType;
    private string $paymentDate;
    private float $amount;
    private string $id;
    private string $actualDate;

    private string $comment;


    private const PAYMENT_TYPE_MAPPING = [
        'ОплатаПоставщику' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ВозвратПокупателю' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ПеречислениеНалога' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'РасчетыПоКредитамИЗаймам' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ВозвратЗайма' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION,
        'ВозвратКредита' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION,
        'ВыдачаЗаймаКонтрагенту' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ПрочиеРасчетыСКонтрагентами' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ПереводНаДругойСчет' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'Депозит' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'СнятиеНаличных' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ПеречислениеПодотчетномуЛицу' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ПеречислениеЗП' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'КомиссияБанка' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ПеречислениеНалогаЗаТретьихЛиц' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ВыплатыСамозанятым' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ПеречислениеПоИсполнительномуЛистуРаботника' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'УдалитьВыплатаСамозанятому' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ПеречислениеДепонентов' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ПеречислениеДивидендов' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ВыдачаЗаймаРаботнику' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ЛичныеСредстваПредпринимателя' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ПрочееСписание' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ПеречислениеЗаработнойПлатыРаботнику' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ПеречислениеСотрудникуПоДоговоруПодряда' => PaymentTypeEnum::PAYMENT_TYPE_PAYMENT,
        'ОплатаПокупателя' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ВозвратОтПоставщика' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ПолучениеЗайма' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ПолучениеКредита' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ВозвратЗаймаКонтрагентом' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ВозвратОтПодотчетногоЛица' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ВозвратНалога' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ОплатаОтФакторинговойКомпании' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ПереводСДругогоСчета' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ВзносНаличными' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'Инкассация' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ПриобретениеИностраннойВалюты' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ПоступленияОтПродажиИностраннойВалюты' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ПоступленияОтПродажПоПлатежнымКартамИБанковскимКредитам' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ВозвратЗаймаРаботником' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ВзносВУставныйКапитал' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
        'ПрочееПоступление' => PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C,
    ];

    public function __construct(
        int    $modelId,
        int    $userId,
        string $organizationId,
        string $counterpartyId,
        string $accountId,
        string $name,
        string $status,
        string $paymentType,
        string $paymentDate,
        float  $amount,
        string $id,
        string $actualDate,
        string $comment,
    )
    {
        $this->modelId = $modelId;
        $this->userId = $userId;
        $this->organizationId = $organizationId;
        $this->counterpartyId = $counterpartyId;
        $this->accountId = $accountId;
        $this->name = $name;
        $this->status = $status;
        $this->paymentType = $this->normalizePaymentType($paymentType);
        $this->paymentDate = $paymentDate;
        $this->amount = $amount;
        $this->id = $id;
        $this->actualDate = $actualDate;
        $this->comment = $comment;
    }

    private function normalizePaymentType(string $externalPaymentType): string
    {

        if (array_key_exists($externalPaymentType, self::PAYMENT_TYPE_MAPPING)) {
            $mappedValue = self::PAYMENT_TYPE_MAPPING[$externalPaymentType];
            return $mappedValue->value;
        }

        return 'UNKNOWN';
    }

    public static function fromArray($modelId, array $data): self
    {
        return new self(
            $modelId ?? 0,
            1,
            $data['organization_id'] ?? 0,
            $data['counterparty_id'] ?? 0,
            $data['account_id'] ?? 0,
            $data['appointment'] ?? 'Платеж из 1с',
            'sent',
            $data['type'] ?? '',
            $data['date'] ?? '',
            $data['amount'] ?? 0.0,
            $data['id'] ?? '',
            $data['payment_date'] ?? '',
            $data['comment'] ?? '',
        );
    }

    public function toArray($account, $counterpartyId, $organizationId): array
    {
        if ($this->paymentType == PaymentTypeEnum::PAYMENT_TYPE_RECEPTION_FROM_1C->value) {
            $status = PaymentStatusEnum::STATUS_RECEIVED;
        }

        if ($this->paymentType == PaymentTypeEnum::PAYMENT_TYPE_MOVING->value) {
            $status = PaymentStatusEnum::STATUS_PAID;
        }

        if ($this->paymentType == PaymentTypeEnum::PAYMENT_TYPE_ISSUEANCE->value) {
            $status = PaymentStatusEnum::STATUS_ISSUED;
        }

        if ($this->paymentType == PaymentTypeEnum::PAYMENT_TYPE_PAYMENT->value) {
            $status = PaymentStatusEnum::STATUS_PAID;
        }

        return [
            'model_id' => $this->modelId,
            'user_id' => $this->userId,
            'organization_id' => $organizationId,
            'counterparty_id' => $counterpartyId,
            'account_id' => $account->id,
            'name' => $this->name,
            'status' => $status ?? $this->status,
            'payment_type' => $this->paymentType,
            'payment_date' => $this->paymentDate,
            'amount' => $this->amount,
            'external_id' => $this->id,
            'actual_date' => $this->actualDate,
            'purpose_of_payment_1c' => $this->name,
            'note_1c' => $this->comment,
            'account_debit_1c' => $account->name,
        ];
    }
}