HEX
Server: nginx/1.24.0
System: Linux rtfmfm 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64
User: neo (1001)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/wsklad/app/Imports/CashExpenseDocumentCsvImport.php
<?php

namespace App\Imports;

use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithCustomCsvSettings;
use Maatwebsite\Excel\Concerns\Importable;
use Carbon\Carbon;
use App\ImportsCashExpenseDocument;


class CashExpenseDocumentCsvImport implements ToCollection, WithCustomCsvSettings
{

    use Importable;
    public $dateReg; // променливата за дата на регистрация от контролера се взема
    public $generateWarehouseNumber; // флага дали да се генерира номер на склад се взема от контролера

    public function getCsvSettings(): array
    {
        return [
            'input_encoding' => 'Windows-1251',  // за да разчита кирилица
            'delimiter' => ';',                  // разделител
            'enclosure' => '',                   // няма затваряне
        ];
    }
    public function collection(Collection $rows)
    {
        $data = [];
        $firstRowSkipped = false; // флаг за това дали сме пропуснали първия ред
        foreach ($rows as $key => $row) {
            // прескачаме първия ред
            if (!$firstRowSkipped) {
                $firstRowSkipped = true;
                continue;
            }

            // дата на документа
            $dateString = trim($row[2] ?? '');
            $cleanedDate = preg_replace('/[^0-9.]/', '', $dateString);
            $cleanedDate = preg_replace('/^(\d{1,2})\.(\d{1,2})\.(\d{4}).*/', '$1.$2.$3', $cleanedDate);
            $dateDoc = Carbon::createFromFormat('d.m.Y', $cleanedDate)->format('Y-m-d');

            // определя се номерът на склад
            if ($this->generateWarehouseNumber == 1) {
                $prefix = substr($row[1], 0, 2);
                switch ($prefix) {
                    case '10':
                        $orgUnitId = 1;
                        break;
                    case '23':
                        $orgUnitId = 11;
                        break;
                    case '24':
                        $orgUnitId = 21;
                        break;
                    case '90':
                        $orgUnitId = 3;
                        break;
                    case '8':
                        $orgUnitId = 18;
                        break;
                    case '7':
                        $orgUnitId = 7;
                        break;
                    default:
                        $orgUnitId = $row[14];
                        break;
                }
            } else {
                $orgUnitId = $row[14];
            }

             // променливи за булстат и vat номер които да се залагат ако имаме определен клиент, или да вземат стойностите от съответните колони, ако нямаме определените клиенти
            $bulstat = $vat = '';
            switch ($row[5]) {
                case '-99':
                    $bulstat = $vat = 949494949;
                    break;
                case '-50':
                    $bulstat = $vat = 939393939;
                    break;
                case '230024764':
                    $bulstat = $vat = 939393939;
                    break;
                default:
                    $bulstat = $row[7];
                    $vat = $row[8] ?? $row[7];
                    break;
            }

            $data[$key]['doc_type'] = $row[0];
            $data[$key]['doc_number'] = str_pad($row[1], 10, '0', STR_PAD_LEFT);
            $data[$key]['doc_date'] = $dateDoc;
            $data[$key]['doc_paymentreasonsnumber'] = $row[3] ?? null;
            $data[$key]['doc_paymentreasons'] = $row[4];
            $data[$key]['client_code'] = $row[5];
            $data[$key]['client_name'] = str_replace(['|', ';'], '/', $row[6]);
            $data[$key]['client_bulstat'] = $bulstat;
            $data[$key]['client_vat_number'] = $vat;
            $data[$key]['client_city'] = $row[9];
            $data[$key]['client_address'] = isset($row[9]) ? $row[9] . ', ' . $row[10] : $row[10];
            $data[$key]['client_molname'] = $row[11];
            $data[$key]['doc_amt'] = $row[12];
            $data[$key]['doc_description'] = $row[13] ?? null;
            $data[$key]['orgunitid'] = $orgUnitId;
            $data[$key]['doc_paymenttype'] = $row[15];
            $data[$key]['doc_creditcardtype'] = $row[16];
        }

        $chunks = array_chunk($data, 100, true);
        foreach ($chunks as $chunk) {
            ImportsCashExpenseDocument::insert($chunk);
        }
    }
}