public function testMultiTransaction()
 {
     $transferRequest = new TransferRequest();
     $transferRequest->setType(TransferRequest::TYPE_GENERAL);
     $transferRequest->setSourceBankAccount($this->account);
     $transferRequest->setDate(\DateTime::createFromFormat('Y-m-d', '2016-03-12'));
     $receiverBankAccount = new BankAccount();
     $receiverBankAccount->setType(BankAccount::TYPE_CURRENT);
     $receiverBankAccount->setBankName('トウキョウトミン');
     $receiverBankAccount->setHolderName('テストー.カブシキガイシャ');
     //Note: using a normal dot/dash in this example
     $receiverBankAccount->setBankCode('0137');
     $receiverBankAccount->setBranchName('シブヤ');
     $receiverBankAccount->setBranchCode('031');
     $receiverBankAccount->setNumber('1231990');
     $violations = Validator::validateBankAccount($receiverBankAccount, Validator::BANK_ACCOUNT_ROLE_RECEIVER);
     $this->assertTrue(count($violations) === 0);
     $receiverTransaction = new MoneyTransferTransaction();
     $receiverTransaction->setDestinationBankAccount($receiverBankAccount);
     $receiverTransaction->setAmount(1103661);
     $violations = Validator::validateMoneyTransferTransaction($receiverTransaction);
     $this->assertTrue(count($violations) === 0);
     $transferRequest->addTransaction($receiverTransaction);
     $receiverBankAccount = new BankAccount();
     $receiverBankAccount->setType(BankAccount::TYPE_NORMAL);
     $receiverBankAccount->setBankName('ミツビシトウキョウUFJ');
     $receiverBankAccount->setHolderName('カ)ゼンギン');
     //Note: using a normal dot in this example
     $receiverBankAccount->setBankCode('0005');
     $receiverBankAccount->setBranchName('ギンザドオリ');
     $receiverBankAccount->setBranchCode('024');
     $receiverBankAccount->setNumber('2275535');
     $violations = Validator::validateBankAccount($receiverBankAccount, Validator::BANK_ACCOUNT_ROLE_RECEIVER);
     $this->assertTrue(count($violations) === 0);
     $receiverTransaction = new MoneyTransferTransaction();
     $receiverTransaction->setDestinationBankAccount($receiverBankAccount);
     $receiverTransaction->setAmount(599300);
     $violations = Validator::validateMoneyTransferTransaction($receiverTransaction);
     $this->assertTrue(count($violations) === 0);
     $transferRequest->addTransaction($receiverTransaction);
     $zenginContentShiftJis = $this->generator->generate($transferRequest);
     //Let's verify that ミツビシトウキョウUFJ "small" (full-width + latin + small voiced) is converted correctly.
     //We do compare to the result file below, but we'd like to explicitly check for this beforehand anyway.
     $zenginContentUtf = \mb_convert_encoding($zenginContentShiftJis, 'utf-8', 'cp932');
     $this->assertTrue(str_replace('ミツビシトウキヨウUFJ', '', $zenginContentUtf) !== $zenginContentUtf);
     $this->assertTrue(str_replace(1103661 + 599300, '', $zenginContentUtf) !== $zenginContentUtf, "Cannot find total amount.");
     $this->validateZenginContent($zenginContentShiftJis, 'results/multi-transaction.txt');
 }
 public function testValidationFailsWithCorruptedTransaction()
 {
     //Ensuring that validation cascades and checks transactions.
     $transaction = $this->transferRequest->getTransactions()[0];
     $transaction->setAmount(-500);
     $violations = Validator::validateTransferRequest($this->transferRequest);
     $this->assertTrue(count($violations) === 1);
     $this->assertTrue(count($violations->get('transactions')) === 1);
 }
 private function generateTransferXML(TransferRequest $request)
 {
     $xml = null;
     if ($request->getFundingMapped() == null) {
         $xml = "<TransferRequest>";
         $xml .= "<LocalDate>" . $request->getLocalDate() . "</LocalDate>";
         $xml .= "<LocalTime>" . $request->getLocalTime() . "</LocalTime>";
         $xml .= "<TransactionReference>" . $request->getTransactionReference() . "</TransactionReference>";
         $xml .= "<SenderName>" . $request->getSenderName() . "</SenderName>";
         $xml .= "<SenderAddress>";
         $xml .= "<Line1>" . $request->getSenderAddress()->getLine1() . "</Line1>";
         $xml .= "<Line2>" . $request->getSenderAddress()->getLine2() . "</Line2>";
         $xml .= "<City>" . $request->getSenderAddress()->getCity() . "</City>";
         $xml .= "<CountrySubdivision>" . $request->getSenderAddress()->getCountrySubdivision() . "</CountrySubdivision>";
         $xml .= "<PostalCode>" . $request->getSenderAddress()->getPostalCode() . "</PostalCode>";
         $xml .= "<Country>" . $request->getSenderAddress()->getCountry() . "</Country>";
         $xml .= "</SenderAddress>";
         $xml .= "<FundingCard>";
         $xml .= "<AccountNumber>" . $request->getFundingCard()->getAccountNumber() . "</AccountNumber>";
         $xml .= "<ExpiryMonth>" . $request->getFundingCard()->getExpiryMonth() . "</ExpiryMonth>";
         $xml .= "<ExpiryYear>" . $request->getFundingCard()->getExpiryYear() . "</ExpiryYear>";
         $xml .= "</FundingCard>";
         $xml .= "<FundingUCAF>" . $request->getFundingUCAF() . "</FundingUCAF>";
         $xml .= "<FundingMasterCardAssignedId>" . $request->getFundingMasterCardAssignedId() . "</FundingMasterCardAssignedId>";
         $xml .= "<FundingAmount>";
         $xml .= "<Value>" . $request->getFundingAmount()->getValue() . "</Value>";
         $xml .= "<Currency>" . $request->getFundingAmount()->getCurrency() . "</Currency>";
         $xml .= "</FundingAmount>";
         $xml .= "<ReceiverName>" . $request->getReceiverName() . "</ReceiverName>";
         $xml .= "<ReceiverAddress>";
         $xml .= "<Line1>" . $request->getReceiverAddress()->getLine1() . "</Line1>";
         $xml .= "<Line2>" . $request->getReceiverAddress()->getLine2() . "</Line2>";
         $xml .= "<City>" . $request->getReceiverAddress()->getCity() . "</City>";
         $xml .= "<PostalCode>" . $request->getReceiverAddress()->getPostalCode() . "</PostalCode>";
         $xml .= "<Country>" . $request->getReceiverAddress()->getCountry() . "</Country>";
         $xml .= "</ReceiverAddress>";
         $xml .= "<ReceiverPhone>" . $request->getReceiverPhone() . "</ReceiverPhone>";
         $xml .= "<ReceivingCard>";
         $xml .= "<AccountNumber>" . $request->getReceivingCard()->getAccountNumber() . "</AccountNumber>";
         $xml .= "</ReceivingCard>";
         $xml .= "<ReceivingAmount>";
         $xml .= "<Value>" . $request->getReceivingAmount()->getValue() . "</Value>";
         $xml .= "<Currency>" . $request->getReceivingAmount()->getCurrency() . "</Currency>";
         $xml .= "</ReceivingAmount>";
         $xml .= "<Channel>" . $request->getChannel() . "</Channel>";
         $xml .= "<UCAFSupport>" . $request->getUCAFSupport() . "</UCAFSupport>";
         $xml .= "<ICA>" . $request->getICA() . "</ICA>";
         $xml .= "<ProcessorId>" . $request->getProcessorId() . "</ProcessorId>";
         $xml .= "<RoutingAndTransitNumber>" . $request->getRoutingAndTransitNumber() . "</RoutingAndTransitNumber>";
         $xml .= "<CardAcceptor>";
         $xml .= "<Name>" . $request->getCardAcceptor()->getName() . "</Name>";
         $xml .= "<City>" . $request->getCardAcceptor()->getCity() . "</City>";
         $xml .= "<State>" . $request->getCardAcceptor()->getState() . "</State>";
         $xml .= "<PostalCode>" . $request->getCardAcceptor()->getPostalCode() . "</PostalCode>";
         $xml .= "<Country>" . $request->getCardAcceptor()->getCountry() . "</Country>";
         $xml .= "</CardAcceptor>";
         $xml .= "<TransactionDesc>" . $request->getTransactionDesc() . "</TransactionDesc>";
         $xml .= "<MerchantId>" . $request->getMerchantId() . "</MerchantId>";
         $xml .= "</TransferRequest>";
     } else {
         $xml = "<TransferRequest>";
         $xml .= "<LocalDate>" . $request->getLocalDate() . "</LocalDate>";
         $xml .= "<LocalTime>" . $request->getLocalTime() . "</LocalTime>";
         $xml .= "<TransactionReference>" . $request->getTransactionReference() . "</TransactionReference>";
         $xml .= "<FundingMapped>";
         $xml .= "<SubscriberId>" . $request->getFundingMapped()->getSubscriberId() . "</SubscriberId>";
         $xml .= "<SubscriberType>" . $request->getFundingMapped()->getSubscriberType() . "</SubscriberType>";
         $xml .= "<SubscriberAlias>" . $request->getFundingMapped()->getSubscriberAlias() . "</SubscriberAlias>";
         $xml .= "</FundingMapped>";
         $xml .= "<FundingUCAF>" . $request->getFundingUCAF() . "</FundingUCAF>";
         $xml .= "<FundingMasterCardAssignedId>" . $request->getFundingMasterCardAssignedId() . "</FundingMasterCardAssignedId>";
         $xml .= "<FundingAmount>";
         $xml .= "<Value>" . $request->getFundingAmount()->getValue() . "</Value>";
         $xml .= "<Currency>" . $request->getFundingAmount()->getCurrency() . "</Currency>";
         $xml .= "</FundingAmount>";
         $xml .= "<ReceiverName>" . $request->getReceiverName() . "</ReceiverName>";
         $xml .= "<ReceiverAddress>";
         $xml .= "<Line1>" . $request->getReceiverAddress()->getLine1() . "</Line1>";
         $xml .= "<Line2>" . $request->getReceiverAddress()->getLine2() . "</Line2>";
         $xml .= "<City>" . $request->getReceiverAddress()->getCity() . "</City>";
         $xml .= "<PostalCode>" . $request->getReceiverAddress()->getPostalCode() . "</PostalCode>";
         $xml .= "<Country>" . $request->getReceiverAddress()->getCountry() . "</Country>";
         $xml .= "</ReceiverAddress>";
         $xml .= "<ReceiverPhone>" . $request->getReceiverPhone() . "</ReceiverPhone>";
         $xml .= "<ReceivingCard>";
         $xml .= "<AccountNumber>" . $request->getReceivingCard()->getAccountNumber() . "</AccountNumber>";
         $xml .= "</ReceivingCard>";
         $xml .= "<ReceivingAmount>";
         $xml .= "<Value>" . $request->getReceivingAmount()->getValue() . "</Value>";
         $xml .= "<Currency>" . $request->getReceivingAmount()->getCurrency() . "</Currency>";
         $xml .= "</ReceivingAmount>";
         $xml .= "<Channel>" . $request->getChannel() . "</Channel>";
         $xml .= "<UCAFSupport>" . $request->getUCAFSupport() . "</UCAFSupport>";
         $xml .= "<ICA>" . $request->getICA() . "</ICA>";
         $xml .= "<ProcessorId>" . $request->getProcessorId() . "</ProcessorId>";
         $xml .= "<RoutingAndTransitNumber>" . $request->getRoutingAndTransitNumber() . "</RoutingAndTransitNumber>";
         $xml .= "<CardAcceptor>";
         $xml .= "<Name>" . $request->getCardAcceptor()->getName() . "</Name>";
         $xml .= "<City>" . $request->getCardAcceptor()->getCity() . "</City>";
         $xml .= "<State>" . $request->getCardAcceptor()->getState() . "</State>";
         $xml .= "<PostalCode>" . $request->getCardAcceptor()->getPostalCode() . "</PostalCode>";
         $xml .= "<Country>" . $request->getCardAcceptor()->getCountry() . "</Country>";
         $xml .= "</CardAcceptor>";
         $xml .= "<TransactionDesc>" . $request->getTransactionDesc() . "</TransactionDesc>";
         $xml .= "<MerchantId>" . $request->getMerchantId() . "</MerchantId>";
         $xml .= "</TransferRequest>";
     }
     return $xml;
 }
 private function generateTrailerLine(TransferRequest $request)
 {
     $items = array();
     $items[] = array('%1d', self::RECORD_TRAILER);
     $items[] = array('%06d', count($request->getTransactions()));
     $totalAmount = array_sum(array_map(function (MoneyTransferTransaction $transaction) {
         return $transaction->getAmount();
     }, $request->getTransactions()));
     $items[] = array('%012d', $totalAmount);
     $items[] = array('%s', str_repeat(' ', 101));
     return StringUtil::sprintfItemGroupsToString($items);
 }