Skip to content
Code-Schnipsel Gruppen Projekte
Commit a2f05d41 erstellt von Patrick Müller's avatar Patrick Müller
Dateien durchsuchen

feat: link existing transactions to orders

Übergeordneter 091d9b3a
No related branches found
No related tags found
2 Merge Requests!67Next,!66Dev
<?php
use QUI\ERP\Accounting\Payments\Transactions\Handler as TransactionHandler;
use QUI\Utils\Security\Orthos;
use QUI\Exception;
/**
* Assign a transaction to an order.
*
* @param string $orderHash
* @param string $txId
*/
QUI::$Ajax->registerFunction(
'package_quiqqer_order_ajax_backend_linkTransaction',
function ($orderHash, $txId) {
$Orders = QUI\ERP\Order\Handler::getInstance();
$Order = $Orders->getOrderByHash($orderHash);
$Transaction = TransactionHandler::getInstance()->get(Orthos::clear($txId));
if ($Transaction->isHashLinked($Order->getHash())) {
throw new Exception([
'quiqqer/order',
'message.ajax.backend.linkTransaction.error.tx_already_linked',
[
'orderHash' => $Order->getHash(),
'txId' => $Transaction->getTxId()
]
]);
}
$Order->linkTransaction($Transaction);
},
['orderHash', 'txId'],
'Permission::checkAdminUser'
);
......@@ -388,6 +388,25 @@ define('package/quiqqer/order/bin/backend/classes/Orders', [
showError : false
});
});
},
/**
* Add a payment to an order
*
* @param {String} orderHash
* @param {String} txId
* @
*/
linkTransaction: function (orderHash, txId) {
return new Promise((resolve, reject) => {
QUIAjax.post('package_quiqqer_order_ajax_backend_linkTransaction', resolve, {
'package': 'quiqqer/order',
orderHash: orderHash,
txId : txId,
onError : reject,
showError: true
});
});
}
});
});
\ No newline at end of file
......@@ -1065,6 +1065,13 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
).then(function() {
Control.refresh();
});
},
onLinkTransaction: (txId, Control) => {
Orders.linkTransaction(self.getAttribute('hash'), txId).then(() => {
Control.refresh();
}).catch((err) => {
console.error(err);
});
}
}
}).inject(Container);
......
......@@ -974,8 +974,7 @@ define('package/quiqqer/order/bin/backend/controls/panels/Orders', [
* event : on payment add button click
*/
$onAddPaymentButtonClick: function(Button) {
const self = this,
selectedData = this.$Grid.getSelectedData();
const selectedData = this.$Grid.getSelectedData();
if (!selectedData.length) {
return;
......@@ -987,16 +986,16 @@ define('package/quiqqer/order/bin/backend/controls/panels/Orders', [
require([
'package/quiqqer/payment-transactions/bin/backend/controls/IncomingPayments/AddPaymentWindow'
], function(AddPaymentWindow) {
], (AddPaymentWindow) => {
new AddPaymentWindow({
entityId: selectedData[0]['prefixed-id'],
entityType: 'Order',
paymentId: selectedData[0].paymentId,
events: {
onSubmit: function(Win, data) {
onSubmit: (Win, data) => {
Win.Loader.show();
self.addPayment(
this.addPayment(
hash,
data.amount,
data.payment_method,
......@@ -1006,6 +1005,13 @@ define('package/quiqqer/order/bin/backend/controls/panels/Orders', [
}).catch(function() {
Win.Loader.hide();
});
},
onSubmitExisting: (txId, Win) => {
this.linkTransaction(hash,txId).then(function() {
Win.close();
}).catch(function() {
Win.Loader.hide();
});
}
}
}).open();
......@@ -1041,6 +1047,25 @@ define('package/quiqqer/order/bin/backend/controls/panels/Orders', [
});
},
/**
* Link transaction to an order
*
* @param {String} orderHash
* @param {String} txId
* @return {Promise<void>}
*/
linkTransaction: function (orderHash, txId) {
this.Loader.show();
return Orders.linkTransaction(orderHash, txId).then(() => {
return this.refresh();
}).then(() => {
this.Loader.hide();
}).catch((err) => {
console.error(err);
});
},
/**
* Return the grid column
*
......
......@@ -434,6 +434,11 @@
<groups name="quiqqer/order" datatype="php">
<locale name="message.ajax.backend.linkTransaction.error.tx_already_linked">
<de><![CDATA[Die Transaktion "[txId]" ist bereits mit Bestellung "[orderHash]" verknüpft.]]></de>
<en><![CDATA[Transaction "[txId]" is already linked to order "[orderHash]".]]></en>
</locale>
<locale name="history.SalesOrder.created_from_order">
<de><![CDATA[Erstellt aus Bestellung "[id]" durch [user] (#[userId]).]]></de>
<en><![CDATA[Created from order "[id]" by [user] (#[userId]).]]></en>
......
......@@ -1464,6 +1464,98 @@ public function getPaymentDataEntry($key)
return null;
}
/**
* Links an existing transaction (i.e. a transaction that was originally created for a different entity than
* this order) to this order.
*
* This does not trigger invoice creation, mails etc.
*
* @param Transaction $Transaction
* @return void
*
* @throws QUI\Database\Exception
* @throws QUI\Exception
*/
public function linkTransaction(Transaction $Transaction): void
{
if ($this->isTransactionIdAddedToOrder($Transaction->getTxId())) {
return;
}
if ($Transaction->isHashLinked($this->getHash())) {
return;
}
QUI\ERP\Debug::getInstance()->log('Order:: link transaction');
if (
$this->getAttribute('paid_status') == QUI\ERP\Constants::PAYMENT_STATUS_PAID ||
$this->getAttribute('paid_status') == QUI\ERP\Constants::PAYMENT_STATUS_CANCELED
) {
return;
}
$Transaction->addLinkedHash($this->getHash());
try {
$calculation = QUI\ERP\Accounting\Calc::calculatePayments($this);
} catch (\Exception $Exception) {
QUI\System\Log::writeException($Exception);
return;
}
QUI\ERP\Debug::getInstance()->log('Order:: Calculate -> data');
QUI\ERP\Debug::getInstance()->log($calculation);
switch ($calculation['paidStatus']) {
case QUI\ERP\Constants::PAYMENT_STATUS_OPEN:
case QUI\ERP\Constants::PAYMENT_STATUS_PAID:
case QUI\ERP\Constants::PAYMENT_STATUS_PART:
case QUI\ERP\Constants::PAYMENT_STATUS_ERROR:
case QUI\ERP\Constants::PAYMENT_STATUS_DEBIT:
case QUI\ERP\Constants::PAYMENT_STATUS_CANCELED:
case QUI\ERP\Constants::PAYMENT_STATUS_PLAN:
break;
default:
$this->setAttribute('paid_status', QUI\ERP\Constants::PAYMENT_STATUS_ERROR);
}
$User = QUI::getUserBySession();
$this->addHistory(
QUI::getLocale()->get(
'quiqqer/order',
'history.message.edit',
[
'username' => $User->getName(),
'uid' => $User->getId()
]
)
);
QUI\ERP\Debug::getInstance()->log('Order:: Calculate -> Update DB');
if (!is_array($calculation['paidData'])) {
$calculation['paidData'] = json_decode($calculation['paidData'], true);
}
if (!is_array($calculation['paidData'])) {
$calculation['paidData'] = [];
}
QUI::getDataBase()->update(
Handler::getInstance()->table(),
[
'paid_data' => json_encode($calculation['paidData']),
'paid_date' => $calculation['paidDate']
],
['id' => $this->getId()]
);
$this->setPaymentStatus($calculation['paidStatus'], true);
}
/**
* @param Transaction $Transaction
*
......@@ -1490,7 +1582,6 @@ public function addTransaction(Transaction $Transaction)
QUI\ERP\Debug::getInstance()->log('Order:: add transaction start');
$User = QUI::getUserBySession();
$paidData = $this->getAttribute('paid_data');
$amount = $Transaction->getAmount();
$date = $Transaction->getDate();
......@@ -1509,30 +1600,8 @@ public function addTransaction(Transaction $Transaction)
return;
}
if (!is_array($paidData)) {
$paidData = json_decode($paidData, true);
}
if (!is_array($paidData)) {
$paidData = [];
}
$isTxAlreadyAdded = function ($txid, $paidData) {
foreach ($paidData as $paidEntry) {
if (!isset($paidEntry['txid'])) {
continue;
}
if ($paidEntry['txid'] == $txid) {
return true;
}
}
return false;
};
// already added
if ($isTxAlreadyAdded($Transaction->getTxId(), $paidData)) {
if ($this->isTransactionIdAddedToOrder($Transaction->getTxId())) {
return;
}
......@@ -1599,6 +1668,35 @@ public function addTransaction(Transaction $Transaction)
);
}
/**
* @param string $txId
* @return bool
*/
protected function isTransactionIdAddedToOrder(string $txId): bool
{
$paidData = $this->getAttribute('paid_data');
if (is_string($paidData)) {
$paidData = json_decode($paidData, true);
}
if (!is_array($paidData)) {
$paidData = [];
}
foreach ($paidData as $paidEntry) {
if (!isset($paidEntry['txid'])) {
continue;
}
if ($paidEntry['txid'] == $txId) {
return true;
}
}
return false;
}
/**
* Alias for getTransactions
*/
......
0% oder .
You are about to add 0 people to the discussion. Proceed with caution.
Bearbeitung dieser Nachricht zuerst beenden!
Bitte registrieren oder zum Kommentieren