/**
  * {@inheritdoc}
  */
 public function submitForm(array &$form, FormStateInterface $form_state)
 {
     $payment_id = $form['payment_reference']['#value'];
     $acquisition_code = PaymentReference::queue()->claimPayment($payment_id);
     if ($acquisition_code && PaymentReference::queue()->acquirePayment($payment_id, $acquisition_code)) {
         \Drupal::state()->set('payment_reference_test_payment_reference_element', $payment_id);
     }
 }
 /**
  * @covers ::factory
  */
 public function testFactory()
 {
     $container = new Container();
     $factory = $this->getMock(PaymentFactoryInterface::class);
     $container->set('payment_reference.payment_factory', $factory);
     \Drupal::setContainer($container);
     $this->assertSame($factory, PaymentReference::factory());
 }
 /**
  * Tests the field.
  */
 protected function testField()
 {
     // Create the field and field instance.
     $field_name = strtolower($this->randomMachineName());
     entity_create('field_storage_config', array('cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, 'entity_type' => 'user', 'field_name' => $field_name, 'type' => 'payment_reference'))->save();
     entity_create('field_config', array('bundle' => 'user', 'entity_type' => 'user', 'field_name' => $field_name, 'settings' => array('currency_code' => 'EUR', 'line_items_data' => [])))->save();
     $payment = Generate::createPayment(mt_rand());
     $payment->setPaymentStatus(Payment::statusManager()->createInstance('payment_success'));
     $payment->save();
     PaymentReference::queue()->save('user.' . $field_name, $payment->id());
     $this->assertEqual(PaymentReference::queue()->loadPaymentIds('user.' . $field_name, $payment->getOwnerId()), array($payment->id()));
     // Set a field value on an entity and test getting it.
     /** @var \Drupal\user\UserInterface $user */
     $user = entity_create('user', array('name' => $this->randomString()));
     $user->get($field_name)->appendItem($payment->id());
     $this->assertEqual($user->get($field_name)->first()->entity->id(), $payment->id());
     // Save the entity, load it from storage and test getting the field value.
     $user->save();
     $user = entity_load_unchanged('user', $user->id());
     $this->assertEqual($user->{$field_name}[0]->target_id, $payment->id());
     $this->assertEqual(PaymentReference::queue()->loadPaymentIds('user.' . $field_name, $payment->getOwnerId()), []);
 }
 /**
  * {@inheritdoc}
  */
 public function preSave()
 {
     $entity_type_id = $this->getFieldDefinition()->getFieldStorageDefinition()->getTargetEntityTypeId();
     $entity_storage = \Drupal::entityManager()->getStorage($entity_type_id);
     /** @var \Drupal\Core\Entity\ContentEntityInterface $current_entity */
     $current_entity = $this->getEntity();
     $unchanged_payment_id = NULL;
     if ($current_entity->id()) {
         /** @var \Drupal\Core\Entity\ContentEntityInterface $unchanged_entity */
         $unchanged_entity = $entity_storage->loadUnchanged($current_entity->id());
         if ($unchanged_entity) {
             $unchanged_payment_id = $unchanged_entity->get($this->getFieldDefinition()->getName())->get($this->name)->get('target_id')->getValue();
         }
     }
     $current_payment_id = $this->get('target_id')->getValue();
     // Only claim the payment if the payment ID in this field has changed since
     // the field's target entity was last saved or if the entity is new.
     if (!$current_entity->id() || $current_payment_id != $unchanged_payment_id) {
         $queue = PaymentReferenceServiceWrapper::queue();
         $acquisition_code = $queue->claimPayment($current_payment_id);
         if ($acquisition_code !== FALSE) {
             $queue->acquirePayment($current_payment_id, $acquisition_code);
         } else {
             $this->get('target_id')->setValue(0);
         }
     }
 }