'Create Supplier Transactions', 'message' => 'You have successfully created currency supplier transactions' ]; } /** @var FetchesCompany */ private $fetchesCompany; /** @var CreateSupplierTransactionProcessor */ private $createSupplierTransactionProcessor; /** @var CreatesDocument */ private $createsDocument; /** @var CreatesFiles */ private $createsFile; /** @var GeneratesTransactionBillNumber */ private $generatesTransactionBillNumber; /** @var FetchesTransaction */ private $fetchesTransaction; /** * CreateSupplierTransactionLogic constructor. * @param FetchesCompany $fetchesCompany * @param CreateSupplierTransactionProcessor $createSupplierTransactionProcessor * @param CreatesDocument $createsDocument * @param CreatesFiles $createsFile * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber * @param FetchesTransaction $fetchesTransaction */ public function __construct(FetchesCompany $fetchesCompany, CreateSupplierTransactionProcessor $createSupplierTransactionProcessor, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber, FetchesTransaction $fetchesTransaction) { $this->fetchesCompany = $fetchesCompany; $this->createSupplierTransactionProcessor = $createSupplierTransactionProcessor; $this->createsDocument = $createsDocument; $this->createsFile = $createsFile; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->fetchesTransaction = $fetchesTransaction; } public function logic(Request $request): JsonResponse { $supplier = $this->fetchesCompany->execute(['id' => $request->route('id')]); $rate = $request->input('rate'); $payments = $request->input('payments'); // todo-refund: activate this for partial refund foreach ($payments as $payment) { $payment = $this->fetchesTransaction->execute(['id' => $payment['id']]); $pendingRefundRequest = $payment->transactions()->refunds()->where('status', ApprovalStatus::PENDING_VERIFICATION)->first(); if ($pendingRefundRequest) { throw new MalformedRequestException('Unable to create supplier order for pending refund request payment'); } $totalRefund = $payment->transactions()->refunds()->where('status', ApprovalStatus::APPROVED)->sum('original_amount'); if ($payment->original_amount - $totalRefund <= 0) { throw new MalformedRequestException('Unable to create supplier order for fully refunded payment'); } } $this->createSupplierTransactionProcessor->execute($supplier, $rate, $payments); if (!count($this->createSupplierTransactionProcessor->getBills())) return $this->response([]); $group = new Group(); $group->save(); $issuer = ''; $receiver = ''; $amount = 0; $original_amount = 0; $currency_id = 0; $original_currency_id = ''; $currency_rate = ''; $tax = 0; $service_charge = 0; foreach ($this->createSupplierTransactionProcessor->getBills() as $key => $row) { $group->transactions()->sync($row->id, false); $issuer = $row->issuer; $receiver = $row->receiver; $amount += $row->amount; $original_amount += $row->original_amount; $currency_id = $row->currency_id; $original_currency_id = $row->original_currency_id; $currency_rate = $row->currency_rate; $tax += $row->tax; $service_charge += $row->service_charge; } $transferFee = (float)$this->createSupplierTransactionProcessor->getTransferTransactions()->sum('service_charge'); $original_amount += $transferFee; $amount = $amount + ($transferFee / $currency_rate) + $service_charge; $group->issuer = $issuer; $group->receiver = $receiver; $group->reference = $this->generatesTransactionBillNumber->execute('SPO-'); $group->amount = $amount; $group->original_amount = $original_amount; $group->currency_id = $currency_id; $group->original_currency_id = $original_currency_id; $group->currency_rate = $currency_rate; $group->tax = $tax; $group->service_charge = $service_charge; $group->update(); $pdf = LaravelMpdf::loadView('pages.pdfs.currency_vendor_order', ['transactions' => $this->createSupplierTransactionProcessor->getBills(), 'transferFeeTransactions' => $this->createSupplierTransactionProcessor->getTransferTransactions(), 'supplier' => $supplier]); $object = new DocumentObject( DocumentType::CURRENCY_VENDOR_ORDER, [chunk_split('data:application/pdf;base64,' . base64_encode($pdf->output()))], '', ApprovalStatus::COMPLETED, 'currency_vendor_order' ); /** @var Document $document */ $document = $this->createsDocument->execute($group, $object); $this->createsFile->execute($document, $object); return $this->response([]); } }