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);
}
}
}