trinion_tp-1.0.x-dev/src/Form/ClientBankImportPaymentsForm.php

src/Form/ClientBankImportPaymentsForm.php
<?php

namespace Drupal\zoo_mod\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\file\Entity\File;
use Drupal\node\Entity\Node;
use Drupal\taxonomy\Entity\Term;

/**
 * Форма загрузки платежей Клиент-банк
 */
class ClientBankImportPaymentsForm extends FormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'zoo_mod_client_bank_import_payments';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['file'] = [
      '#type' => 'managed_file',
      '#title' => 'Файл',
//      '#required' => TRUE,
      '#upload_validators' => [
        'file_validate_extensions' => ['txt'],
      ],
    ];

    $form['actions'] = [
      '#type' => 'actions',
    ];
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => 'Загрузить',
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $file = $form_state->getValue('file');
    if (empty($file[0]))
      return;
    $file = File::load($file[0]);

    $file_path = $file->get('uri')->getString();
    $str = file_get_contents($file_path);
    $str = iconv('Windows-1251', 'UTF-8', $str);
    preg_match_all('/СекцияДокумент=.*?КонецДокумента/s', $str, $matches);
    $count_created = 0;
    foreach ($matches[0] as $match) {
      $lines = explode("\n", $match);
      $data = ['other' => ''];
      foreach ($lines as $line) {
        if ($line == 'КонецДокумента')
          break;
        list($param, $value) = explode('=', $line);
        $value = trim($value);
        switch ($param) {
          case 'СекцияДокумент':
            $data['client_bank_type_doc'] = $value;
            break;
          case 'Номер':
            $data['nomer'] = $value;
            break;
          case 'Дата':
            $data['document_date'] = $value;
            break;
          case 'Сумма':
            $data['inc_sum'] = $value;
            break;
          case 'Плательщик':
            $data['payer_name'] = $value;
            break;
          case 'ПлательщикИНН':
            $data['payer_inn'] = $value;
            break;
          case 'ПлательщикКПП':
            $data['payer_kpp'] = $value;
            break;
          case 'ПлательщикРасчСчет':
            $data['payer_schet'] = $value;
            break;
          case 'ПлательщикБанк1':
            $data['payer_bank'] = $value;
            break;
          case 'ПлательщикБИК':
            $data['payer_bik'] = $value;
            break;
          case 'ПлательщикКорсчет':
            $data['payer_kor_schet'] = $value;
            break;
          case 'Получатель':
            $data['recepient_name'] = $value;
            break;
          case 'ПолучательИНН':
            $data['recepient_inn'] = $value;
            break;
          case 'ПолучательКПП':
            $data['recepient_kpp'] = $value;
            break;
          case 'ПолучательРасчСчет':
            $data['recepient_schet'] = $value;
            break;
          case 'ПолучательБанк1':
            $data['recepient_bank'] = $value;
            break;
          case 'ПолучательБИК':
            $data['recepient_bik'] = $value;
            break;
          case 'ПолучательКорсчет':
            $data['recepient_kor_schet'] = $value;
            break;
          case 'НазначениеПлатежа':
            $data['destination_reason'] = $value;
            break;
          default:
            $data['other'] .= $param . ': ' . $value . PHP_EOL;
        }
      }

      $payer_tid = $this->createContragent($data, 'payer');
      $recepient_tid = $this->createContragent($data, 'recepient');
      if (empty($payer_tid)) {
        \Drupal::messenger()->addError('Не удалось создать Плательщика: ' . implode("\n", $lines));
        return;
      }
      if (empty($recepient_tid)) {
        \Drupal::messenger()->addError('Не удалось создать Получателя: ' . implode("\n", $lines));
        return;
      }

      $client_bank_type_doc_tid = $this->createDocType($data['client_bank_type_doc']);
      $query = \Drupal::entityQuery('node')
        ->accessCheck(TRUE)
        ->condition('type', 'client_bank_payment')
        ->condition('field_nomer', $data['nomer'])
        ->condition('field_payer', $payer_tid)
        ->condition('field_recepient', $recepient_tid)
        ->condition('field_client_bank_type_doc', $client_bank_type_doc_tid);
      $doc = $query->execute();
      if (empty($doc)) {
        $node = Node::create([
          'type' => 'client_bank_payment',
          'title' => $data['client_bank_type_doc'] . ' ' . $data['document_date'],
          'uid' => 1,
          'status' => 1,
          'field_client_bank_type_doc' => $client_bank_type_doc_tid,
          'field_document_date' => date('Y-m-d', strtotime($data['document_date'])),
          'field_call_comment' => $data['destination_reason'],
          'field_nomer' => $data['nomer'],
          'field_payer' => $payer_tid,
          'field_recepient' => $recepient_tid,
          'field_description' => $data['other'],
          'field_inc_sum' => $data['inc_sum'],
        ]);
        $node->save();
        $count_created++;
      }
    }
    \Drupal::messenger()->addStatus('Создано ' . $count_created . ' документов');
  }

  public function createContragent($data, $type) {
    if (!isset($data[$type . '_inn']) || trim($data[$type . '_inn']) == '') {
      \Drupal::messenger()->addError("У контрагента '{$data[$type . '_name']}' не заполнен ИНН. Документ {$data['nomer']}.");
      return;
    }
    if (!isset($data[$type . '_kpp']) || trim($data[$type . '_kpp']) == '') {
      \Drupal::messenger()->addError("У контрагента '{$data[$type . '_name']}' не заполнен КПП. Документ {$data['nomer']}.");
      return;
    }
    $vid = 'contragent_client_bank';
    $query = \Drupal::entityQuery('taxonomy_term')
      ->accessCheck(TRUE)
      ->condition('vid', $vid)
      ->condition('field_inn', $data[$type . '_inn'])
      ->condition('field_kpp', $data[$type . '_kpp']);
    $tid = $query->execute();
    if (empty($tid)) {
      $term = Term::create([
        'vid' => $vid,
        'name' => $data[$type . '_name'],
        'field_bank' => $data[$type . '_bank'],
        'field_bik' => $data[$type . '_bik'],
        'field_inn' => $data[$type . '_inn'],
        'field_kpp' => $data[$type . '_kpp'],
        'field_kor_schet' => $data[$type . '_kor_schet'],
        'field_schet' => $data[$type . '_schet'],
      ]);
      $term->save();
      $tid = $term->id();
    }
    else
      $tid = reset($tid);
    return $tid;
  }

  public function createDocType($name) {
    if (empty($name))
      return;
    $vid = 'client_bank_type_doc';
    $query = \Drupal::entityQuery('taxonomy_term')
      ->accessCheck(TRUE)
      ->condition('vid', $vid)
      ->condition('name', $name);
    $tid = $query->execute();
    if (empty($tid)) {
      $term = Term::create([
        'vid' => $vid,
        'name' => $name,
      ]);
      $term->save();
      $tid = $term->id();
    }
    else
      $tid = reset($tid);
    return $tid;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc