trinion_tp-1.0.x-dev/src/Plugin/Field/FieldWidget/OtpravlenniyPlatezhFieldWidget.php

src/Plugin/Field/FieldWidget/OtpravlenniyPlatezhFieldWidget.php
<?php

namespace Drupal\trinion_tp\Plugin\Field\FieldWidget;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\node\Entity\Node;

/**
 * Виджет для отображения счетов отправленного платежа
 *
 * @FieldWidget(
 *   id = "trinion_tp_otpravlenniy_platezh_field_widget",
 *   label = "Строки отправленного платежа",
 *   field_types = {"entity_reference"},
 * )
 */
class OtpravlenniyPlatezhFieldWidget extends WidgetBase {

  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    if ($platezh = \Drupal::routeMatch()->getParameter('node')) {
      $companiya = $platezh->get('field_tp_poluchatel')->getString();
    }
    else {
      $comp = \Drupal::request()->get('field_tp_poluchatel');
      $companiya = NULL;
      if (isset($comp['0']['target_id']) && preg_match('/\((\d+)\)("|)$/', $comp['0']['target_id'], $match)) {
        $companiya = $match[1];
      }
    }
    $scheta = \Drupal::service('trinion_tp.helper')->schetaCompaniiDliaOplati($companiya, $platezh, 'schet_postavschika');

    foreach ($scheta as $schet_id) {
      if ($schet = Node::load($schet_id)) {
        $element[$schet_id]['data'] = [
          '#type' => 'markup',
          '#markup' => date('j.m.Y', strtotime($schet->get('field_tp_data')->getString())),
        ];
        $element[$schet_id]['nomer'] = [
          '#type' => 'markup',
          '#markup' => $schet->label(),
        ];
        $summa = $schet->get('field_tp_itogo')->getString();
        $schet_data = \Drupal::service('trinion_tp.helper')->calculateSchetProdavtsa($schet);
        $oplachenaya_summa = $schet_data['summa_oplati'];
        if (!is_numeric($oplachenaya_summa))
          $oplachenaya_summa = 0;
        $element[$schet_id]['summa'] = [
          '#type' => 'markup',
          '#markup' => $summa,
        ];
        $neoplacheno = $summa - $oplachenaya_summa;
        $element[$schet_id]['ne_oplacheno'] = [
          '#type' => 'markup',
          '#markup' => $neoplacheno,
        ];
        $element[$schet_id]['nid'] = [
          '#type' => 'hidden',
          '#value' => $schet_id,
        ];
        $element[$schet_id]['oplacheno'] = [
          '#type' => 'number',
          '#default_value' => 0,
          '#size' => 10,
          '#step' => '0.01',
          '#max' => $summa,
        ];
        $element[$schet_id]['stroka_id'] = [
          '#type' => 'hidden',
          '#default_value' => '',
        ];
        foreach ($items as $item) {
          if (is_null($item->entity))
            continue;
          $schet_saved = Node::load($item->entity->get('field_tp_schet')->getString());
          if ($schet_saved->id() == $schet_id) {
            $element[$schet_id]['oplacheno']['#default_value'] = $item->entity->get('field_tp_oplachennaya_summa')->getString();
            $element[$schet_id]['stroka_id']['#default_value'] = $item->entity->id();
          }
        }
      }
    }
    return $element;
  }

  public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
    static $vals = [];
    if ($vals)
      return $vals;
    if ($form_state->getErrors())
      return;
    else {
      $element = $form_state->getTriggeringElement();
      if (strpos($element['#name'], 'field_tp_poluchatel') === 0)
        return;
      $post_data = \Drupal::request()->request->all();
      $itogo = $post_data['field_tp_itogo'][0]['value'];
      foreach ($post_data['field_tp_stroki'][0] as $schet_nid => $schet_data) {
        if (!is_array($schet_data))
          continue;
        $itogo -= $schet_data['oplacheno'];
      }
      if ($itogo < 0) {
        $form_state->setErrorByName('', 'Оплаченная сумма счетов не может превышать сумму платежа. Разница ' . abs($itogo) . ' руб.');
        return;
      }

      foreach ($values[0] as $key => $schet) {
        if (!is_numeric($key) || empty($schet['oplacheno']))
          continue;
        if ($node_schet = Node::load($schet['nid'])) {
          if (empty($schet['stroka_id'])) {
            $data = [
              'type' => 'stroka_scheta_prodavca_k_oplate',
              'title' => $node_schet->label(),
              'uid' => \Drupal::currentUser()->id(),
              'status' => 1,
              'field_tp_schet' => $schet['nid'],
              'field_tp_oplachennaya_summa' => $schet['oplacheno'],
            ];
            $stroka_schet = Node::create($data);
          }
          else {
            $stroka_schet = Node::load($schet['stroka_id']);
            $stroka_schet->field_tp_oplachennaya_summa = $schet['oplacheno'];
          }
          $stroka_schet->save();
          $vals[] = ['target_id' => $stroka_schet->id()];
        }
      }
    }
    return $vals;
  }
}

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

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