public function create(Refund $refund)
    {
        // Set create authorship data if not already set
        if (!$refund->authorship->createdAt()) {
            $refund->authorship->create(new DateTimeImmutable(), $this->_currentUser->id);
        }
        $this->_validate($refund);
        $event = new Event\TransactionalEvent($refund);
        $event->setTransaction($this->_trans);
        $refund = $this->_eventDispatcher->dispatch(Events::CREATE_START, $event)->getRefund();
        $this->_trans->run('
			INSERT INTO
				refund
			SET
				payment_id  = :paymentID?in,
				created_at  = :createdAt?d,
				created_by  = :createdBy?in,
				currency_id = :currencyID?s,
				method      = :method?sn,
				amount      = :amount?f,
				reason      = :reason?sn,
				reference   = :reference?sn
		', array('paymentID' => $refund->payment ? $refund->payment->id : null, 'createdAt' => $refund->authorship->createdAt(), 'createdBy' => $refund->authorship->createdBy(), 'currencyID' => $refund->currencyID, 'method' => $refund->method->getName(), 'amount' => $refund->amount, 'reason' => $refund->reason, 'reference' => $refund->reference));
        $sqlVariable = 'REFUND_ID_' . uniqid();
        $this->_trans->setIDVariable($sqlVariable);
        $refund->id = '@' . $sqlVariable;
        if (!$this->_transOverridden) {
            $this->_trans->commit();
            return $this->_loader->getByID($this->_trans->getIDVariable($sqlVariable));
        }
        return $refund;
    }
 /**
  * Generate a voucher for a new refund with a method of "voucher" and set
  * the generated voucher code to the refund reference.
  *
  * @param Refund\Event\TransactionalEvent $event
  */
 public function generateForVoucherRefunds(Refund\Event\TransactionalEvent $event)
 {
     $refund = $event->getRefund();
     // Skip unless the refund is using the "voucher" method
     if ('voucher' !== $refund->method->getName()) {
         return false;
     }
     $voucher = new Voucher();
     $voucher->currencyID = $refund->currencyID;
     $voucher->amount = $refund->amount;
     $voucher->id = $this->_idGenerator->generate();
     $this->_create->setTransaction($event->getTransaction());
     $this->_create->create($voucher);
     $refund->reference = $voucher->id;
     $event->setRefund($refund);
 }