diff --git a/classes/models/LengowHook.php b/classes/models/LengowHook.php index 578585c7..1a135e53 100755 --- a/classes/models/LengowHook.php +++ b/classes/models/LengowHook.php @@ -408,9 +408,7 @@ public function hookDisplayAdminOrderTabLink(array $params): string } $hasContent = $marketplace->hasReturnTrackingNumber() - || $marketplace->hasReturnTrackingCarrier() - || !empty($marketplace->getRefundReasons()) - || !empty($marketplace->getRefundModes()); + || $marketplace->hasReturnTrackingCarrier(); if (!$hasContent) { return ''; @@ -445,9 +443,6 @@ public function hookDisplayAdminOrderTabContent(array $params): string $isActiveReturnTrackingNumber = $marketplace->hasReturnTrackingNumber(); $isActiveReturnCarrier = $marketplace->hasReturnTrackingCarrier(); - $refundReasons = $marketplace->getRefundReasons(); - $refundModes = $marketplace->getRefundModes(); - $refundSelectedDatas = $lengowOrder->getRefundDataFromLengowOrder($idOrder, $marketplace->name); $locale = new LengowTranslation(); @@ -461,10 +456,6 @@ public function hookDisplayAdminOrderTabContent(array $params): string 'returnTrackingNumberLabel' => $locale->t('order.screen.return_tracking_number_label'), 'returnCarrierLabel' => $locale->t('order.screen.return_carrier_label'), 'carriers' => $isActiveReturnCarrier ? LengowCarrier::getCarriersChoices($this->context->language->id) : [], - 'refundReasons' => $refundReasons, - 'refundModes' => $refundModes, - 'refundReasonSelected' => $refundSelectedDatas['refund_reason'] ?? '', - 'refundModeSelected' => $refundSelectedDatas['refund_mode'] ?? '', ]); return $this->module->display(_PS_MODULE_LENGOW_DIR_, 'views/templates/hook/order/admin_order_tab.tpl'); diff --git a/classes/models/LengowMarketplace.php b/classes/models/LengowMarketplace.php index 1929687f..8e451629 100644 --- a/classes/models/LengowMarketplace.php +++ b/classes/models/LengowMarketplace.php @@ -162,7 +162,7 @@ public function __construct(string $name) : ''; $acceptFreeValue = !isset($argDescription->accept_free_values) || (bool) $argDescription->accept_free_values; - $this->argValues[(string) $argKey] = [ + $this->argValues[(string) $key][(string) $argKey] = [ 'default_value' => $defaultValue, 'accept_free_values' => $acceptFreeValue, 'valid_values' => $validValues, @@ -246,17 +246,27 @@ public function getAction(string $name): array|false * Get the default value for argument * * @param string $name argument's name + * @param string $action optional action context (ship / cancel / refund) * * @return string|false */ - public function getDefaultValue(string $name): string|false + public function getDefaultValue(string $name, string $action = ''): string|false { - if (array_key_exists($name, $this->argValues)) { - $defaultValue = $this->argValues[$name]['default_value']; + if ($action !== '' && isset($this->argValues[$action][$name])) { + $defaultValue = $this->argValues[$action][$name]['default_value']; if (!empty($defaultValue)) { return $defaultValue; } } + // Fallback: search across all actions (backward compatibility) + foreach ($this->argValues as $actionArgs) { + if (isset($actionArgs[$name])) { + $defaultValue = $actionArgs[$name]['default_value']; + if (!empty($defaultValue)) { + return $defaultValue; + } + } + } return false; } @@ -553,12 +563,17 @@ protected function getAllParams(string $action, LengowOrder $lengowOrder, array break; case LengowAction::ARG_REFUND_REASON: case LengowAction::ARG_REASON: - $params[$arg] = $lengowOrder->getRefundReasonByPrestashopId((int) $lengowOrder->lengowId) - ?? $this->getDefaultValue((string) $arg); + $savedReason = $lengowOrder->getRefundReasonByPrestashopId((int) $lengowOrder->lengowId); + $reasonValue = $savedReason ?: $this->getDefaultValue((string) $arg, $action); + if ($reasonValue !== false && $reasonValue !== '') { + $params[$arg] = $reasonValue; + } elseif (isset($actions['optional_args']) && in_array($arg, $actions['optional_args'], true)) { + break; + } break; case LengowAction::ARG_REFUND_MODE: $params[$arg] = $lengowOrder->getRefundModeByPrestashopId((int) $lengowOrder->lengowId) - ?? $this->getDefaultValue((string) $arg); + ?? $this->getDefaultValue((string) $arg, $action); break; default: if (isset($actions['optional_args']) && in_array($arg, $actions['optional_args'], true)) { @@ -599,7 +614,7 @@ protected function getAllParamsForPartialRefund(string $action, LengowOrder $len case LengowAction::ARG_REFUND_REASON: case LengowAction::ARG_REASON: $params[$arg] = $lengowOrder->getRefundReasonByPrestashopId((int) $lengowOrder->lengowId) - ?? $this->getDefaultValue((string) $arg); + ?? $this->getDefaultValue((string) $arg, LengowAction::TYPE_REFUND); break; case LengowAction::ARG_REFUND_PRICE: $params[$arg] = $decodedExtra['total_order'] ?? 0.00; @@ -612,7 +627,7 @@ protected function getAllParamsForPartialRefund(string $action, LengowOrder $len break; case LengowAction::ARG_REFUND_MODE: $params[$arg] = $lengowOrder->getRefundModeByPrestashopId((int) $lengowOrder->lengowId) - ?? $this->getDefaultValue((string) $arg); + ?? $this->getDefaultValue((string) $arg, LengowAction::TYPE_REFUND); break; case LengowAction::ARG_REFUND_SHIPPING_PRICE: $params[$arg] = (float) $shippingPriceTTC; @@ -922,9 +937,13 @@ public function getRefundReasons(): array $locale = new LengowTranslation(); $choices = [$locale->t('order.screen.refund_reason_label') => '']; $arguments = $this->getMarketplaceArguments(LengowAction::TYPE_REFUND); - $reasons = in_array(LengowAction::ARG_REFUND_REASON, $arguments) ? $this->argValues[LengowAction::ARG_REFUND_REASON]['valid_values'] : []; + $reasons = in_array(LengowAction::ARG_REFUND_REASON, $arguments) + ? ($this->argValues[LengowAction::TYPE_REFUND][LengowAction::ARG_REFUND_REASON]['valid_values'] ?? []) + : []; if (empty($reasons)) { - $reasons = in_array(LengowAction::ARG_REASON, $arguments) ? $this->argValues[LengowAction::ARG_REASON]['valid_values'] : []; + $reasons = in_array(LengowAction::ARG_REASON, $arguments) + ? ($this->argValues[LengowAction::TYPE_REFUND][LengowAction::ARG_REASON]['valid_values'] ?? []) + : []; } if (empty($reasons)) { return []; @@ -936,6 +955,33 @@ public function getRefundReasons(): array return $choices; } + /** + * Get all cancel reasons choices + * + * @return array + */ + public function getCancelReasons(): array + { + $action = $this->getAction(LengowAction::TYPE_CANCEL); + if (!$action) { + return []; + } + $locale = new LengowTranslation(); + $choices = [$locale->t('order.screen.cancel_reason_label') => '']; + $arguments = $this->getMarketplaceArguments(LengowAction::TYPE_CANCEL); + $reasons = in_array(LengowAction::ARG_REASON, $arguments) + ? ($this->argValues[LengowAction::TYPE_CANCEL][LengowAction::ARG_REASON]['valid_values'] ?? []) + : []; + if (empty($reasons)) { + return []; + } + foreach ($reasons as $key => $reason) { + $choices[$reason] = $key; + } + + return $choices; + } + /** * Will return all refund modes for cdsicount * @@ -949,7 +995,9 @@ public function getRefundModes(): array } $locale = new LengowTranslation(); $arguments = $this->getMarketplaceArguments(LengowAction::TYPE_REFUND); - $modes = in_array(LengowAction::ARG_REFUND_MODE, $arguments) ? $this->argValues[LengowAction::ARG_REFUND_MODE]['valid_values'] : []; + $modes = in_array(LengowAction::ARG_REFUND_MODE, $arguments) + ? ($this->argValues[LengowAction::TYPE_REFUND][LengowAction::ARG_REFUND_MODE]['valid_values'] ?? []) + : []; $choices = [$locale->t('order.screen.refund_mode_label') => '']; if (empty($modes)) { return []; @@ -975,7 +1023,7 @@ public function getRefundArguments(): array } $arguments = $this->getMarketplaceArguments(LengowAction::TYPE_REFUND); - return array_intersect($arguments, array_keys($this->argValues)); + return array_intersect($arguments, array_keys($this->argValues[LengowAction::TYPE_REFUND] ?? [])); } /** diff --git a/classes/models/LengowOrder.php b/classes/models/LengowOrder.php index d5b47e79..b9ec74f7 100644 --- a/classes/models/LengowOrder.php +++ b/classes/models/LengowOrder.php @@ -1295,6 +1295,18 @@ public static function countOrderToBeSent(): int return (int) $row['total']; } + /** + * Get the cancel reason from the Lengow orders table (stored in the shared refund_reason column) + * + * @param int $idOrder PrestaShop order id + * + * @return string|null + */ + public static function getCancelReasonByPrestashopId(int $idOrder): ?string + { + return self::getRefundReasonByPrestashopId($idOrder); + } + /** * Get the refund reason from the Lengow orders table * @@ -1373,14 +1385,16 @@ public function getRefundDataFromLengowOrder(int $orderId, string $marketplaceNa if (!$result) { return [ - 'refund_reason' => [], - 'refund_mode' => [], + 'refund_reason' => '', + 'refund_mode' => '', + 'cancel_reason' => '', ]; } return [ - 'refund_reason' => $result['refund_reason'] ?? [], - 'refund_mode' => $result['refund_mode'] ?? [], + 'refund_reason' => $result['refund_reason'] ?? '', + 'refund_mode' => $result['refund_mode'] ?? '', + 'cancel_reason' => $result['refund_reason'] ?? '', ]; } diff --git a/config/admin/services.yml b/config/admin/services.yml index e1f1e58e..cde884cf 100644 --- a/config/admin/services.yml +++ b/config/admin/services.yml @@ -22,6 +22,10 @@ services: class: PrestaShop\Module\Lengow\Controller\Admin\LengowOrderAdminController public: true tags: ['controller.service_arguments'] + arguments: + - '@prestashop.adapter.legacy.context' + - '@twig' + - '@PrestaShop\Module\Lengow\Service\OrderRefundDataUpdater' PrestaShop\Module\Lengow\Controller\Admin\LengowOrderSettingAdminController: class: PrestaShop\Module\Lengow\Controller\Admin\LengowOrderSettingAdminController public: true diff --git a/config/checkmd5.csv b/config/checkmd5.csv index e8c941ca..71e1403f 100644 --- a/config/checkmd5.csv +++ b/config/checkmd5.csv @@ -5,11 +5,11 @@ /lengow.php|bcddd149ff8cb4c6892b7e1d207ac3fa /loader.php|b3d94d65d0a074088758bc1e50736a01 /config/index.php|be8b25f88c14bddd7711e4585ebae316 -/translations/en.csv|81b2e2ef964f1081ff0f455b22a99d42 -/translations/es.csv|213e98bd91d287476e23a155844ed0ae -/translations/fr.csv|a58e1647eaa7fdc493c171860eca27e2 +/translations/en.csv|2d407494a45d6d5247f9df2ae25f14bb +/translations/es.csv|d2b98d9a2d61f16d7923e64b3c54b3bd +/translations/fr.csv|ec528396f3a42d453511486433beb717 /translations/index.php|be8b25f88c14bddd7711e4585ebae316 -/translations/it.csv|8f3106c2c9c88c6b7f40ccb24aec629b +/translations/it.csv|8fedd3707afac47a8833e709ea127b78 /classes/controllers/LengowOrderController.php|1b6b5b8a2fc59948489fda8c321befde /classes/controllers/LengowDashboardController.php|ebe6a9d71e4a9be250061d96ec23b9ca /classes/controllers/LengowLegalsController.php|14effece7503b9524c83f628d255d146 @@ -22,19 +22,19 @@ /classes/controllers/index.php|a90243841e2e64a4ee2965d4dfa12491 /classes/controllers/LengowFeedController.php|41b4db4ac3a070ee3cc599044b51f75d /classes/models/LengowCustomer.php|78579376c21dce9dcea169e642d9802c -/classes/models/LengowHook.php|7e17d9ebfa664d8689fec493745a3900 +/classes/models/LengowHook.php|21b50bbcf412fae023548eab9f4a5e43 /classes/models/LengowOrderDetail.php|a51019c529e83b2f0eda9e8d713dbd3d /classes/models/LengowImport.php|9a106938d503900de7807abf00ac9c6f /classes/models/LengowInstall.php|be765799d993e72a2656cb2f84f81579 /classes/models/LengowConfiguration.php|25df6dedabd775a60420e8c263751278 /classes/models/LengowMain.php|058ddf81649f4a53b93bddefaa6f4129 /classes/models/LengowAction.php|0e51cdaa86b88539c40c7c5273fb8c0d -/classes/models/LengowOrder.php|e7d80bb7b25ca35d2d5958ad71aaf26d +/classes/models/LengowOrder.php|b1824154437ff4d8c9bb5770c3b4ffe7 /classes/models/LengowList.php|071e3d48dfe8f4517374bc57718059b5 /classes/models/LengowOrderCarrier.php|130bddda8e7a344fc2153cb1d55b58f3 /classes/models/LengowOrderError.php|7ab270578749382990d67e7dcc3c3d50 /classes/models/LengowImportOrder.php|1aedede7194e7c832405f86eb7451902 -/classes/models/LengowMarketplace.php|a2175dbe84b063c5097745e13dacb025 +/classes/models/LengowMarketplace.php|e0872ec2adc322a65ce7c15148e5e958 /classes/models/LengowMethod.php|fad805cab01bc5ad136066b65e265f3d /classes/models/LengowToolbox.php|0a7e1d3cd33ccaa8948c8c48b1893617 /classes/models/LengowProduct.php|9a53599f08f1b931ed462e1887722deb @@ -47,7 +47,7 @@ /classes/models/LengowSync.php|0a1a7b2e3922fd50e5768d7846e17175 /classes/models/LengowExport.php|a5e89e32339b8b6d0c84beeff2f5fedb /classes/models/LengowLink.php|bdbc53d7f8c0d25ded5203e321c2933c -/classes/models/LengowConnector.php|0746d2e0d7b4de082f5447567392444d +/classes/models/LengowConnector.php|8f7b3e57cc20bd9a0a48498f29ade5ca /classes/models/LengowTranslation.php|8664ba0942d6ebaee4e66384df308a1f /classes/models/LengowFile.php|b49c051be110d6dd977826d9c5076fea /classes/models/LengowAddress.php|59d6f28bc5dfc1ba4582a416564785e5 @@ -385,6 +385,7 @@ /views/img/unplugged.png|55b5eeee08952d538185a659abbbb932 /views/img/index.php|be8b25f88c14bddd7711e4585ebae316 /views/img/home-orders.png|db05b21ec6b166d844b42c0e807cb265 +/views/PrestaShop/Admin/Sell/Order/Order/Blocks/View/order_actions.html.twig|fa6aae9ca4f5dd38d422c7f4a700038f /views/PrestaShop/Admin/Sell/Order/Order/Blocks/View/Modal/index.php|be8b25f88c14bddd7711e4585ebae316 /views/PrestaShop/Admin/Sell/Order/Order/Blocks/View/index.php|be8b25f88c14bddd7711e4585ebae316 /views/PrestaShop/Admin/Sell/Order/Order/Blocks/index.php|be8b25f88c14bddd7711e4585ebae316 @@ -477,7 +478,7 @@ /views/templates/front/tagpage.tpl|f040d02eb2f79ed7d50e72f7f707db0e /views/templates/front/index.php|be8b25f88c14bddd7711e4585ebae316 /views/templates/hook/order/admin_order_side.tpl|88fc73bbfd960cc7b37165801151a387 -/views/templates/hook/order/admin_order_tab.tpl|dde75b9aab71dec0b10131e2c4a3d361 +/views/templates/hook/order/admin_order_tab.tpl|d79c6736125bb1a341f5d47a02fed28c /views/templates/hook/order/index.php|be8b25f88c14bddd7711e4585ebae316 /views/templates/hook/index.php|be8b25f88c14bddd7711e4585ebae316 /views/templates/index.php|be8b25f88c14bddd7711e4585ebae316 diff --git a/config/routes.yml b/config/routes.yml index 7a1ac426..eaf6e99c 100644 --- a/config/routes.yml +++ b/config/routes.yml @@ -69,3 +69,21 @@ lengow_toolbox: _controller: 'PrestaShop\Module\Lengow\Controller\Admin\LengowToolboxAdminController::indexAction' _legacy_controller: AdminLengowToolbox _legacy_link: AdminLengowToolbox + +lengow_order_reasons: + path: /lengow/order-reasons/{orderId} + methods: [ GET ] + defaults: + _controller: 'PrestaShop\Module\Lengow\Controller\Admin\LengowOrderAdminController::getOrderReasonsAction' + +lengow_save_refund_reason: + path: /lengow/save-refund-reason + methods: [ POST ] + defaults: + _controller: 'PrestaShop\Module\Lengow\Controller\Admin\LengowOrderAdminController::saveRefundReasonAction' + +lengow_save_refund_mode: + path: /lengow/save-refund-mode + methods: [ POST ] + defaults: + _controller: 'PrestaShop\Module\Lengow\Controller\Admin\LengowOrderAdminController::saveRefundModeAction' diff --git a/src/Controller/Admin/LengowOrderAdminController.php b/src/Controller/Admin/LengowOrderAdminController.php index 0285e02f..99a922e1 100644 --- a/src/Controller/Admin/LengowOrderAdminController.php +++ b/src/Controller/Admin/LengowOrderAdminController.php @@ -27,12 +27,27 @@ exit; } +use PrestaShop\Module\Lengow\Service\OrderRefundDataUpdater; +use PrestaShop\PrestaShop\Adapter\LegacyContext; use PrestaShopBundle\Security\Attribute\AdminSecurity; +use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Twig\Environment; class LengowOrderAdminController extends AbstractLengowAdminController { + public function __construct( + LegacyContext $legacyContext, + Environment $twig, + private readonly OrderRefundDataUpdater $orderRefundDataUpdater, + ) { + parent::__construct($legacyContext, $twig); + if (!defined('_PS_MODULE_LENGOW_DIR_')) { + define('_PS_MODULE_LENGOW_DIR_', _PS_MODULE_DIR_ . 'lengow' . \DIRECTORY_SEPARATOR); + } + } + protected function getPageTitle(): string { return (new \LengowTranslation($this->legacyContext))->t('tab.order'); @@ -50,4 +65,79 @@ public function indexAction(Request $request): Response return $this->renderLegacyPage('@Modules/lengow/views/templates/admin/lengow_order/view.html.twig', $lengowController); } + + /** + * Returns cancel/refund reasons and state IDs for a given order as JSON. + * Used by the inline selector in the PS order view Twig override. + */ + #[AdminSecurity("is_granted('read', 'AdminOrders')")] + public function getOrderReasonsAction(int $orderId): JsonResponse + { + if (!$orderId || !\LengowOrder::isFromLengow($orderId)) { + return new JsonResponse(['isFromLengow' => false]); + } + + try { + $lengowOrder = new \LengowOrder($orderId); + $marketplace = $lengowOrder->getMarketplace(); + + if (!$marketplace) { + return new JsonResponse(['isFromLengow' => false]); + } + + $refundSelectedData = $lengowOrder->getRefundDataFromLengowOrder($orderId, $marketplace->name); + + return new JsonResponse([ + 'isFromLengow' => true, + 'cancelReasons' => $marketplace->getCancelReasons(), + 'cancelReasonSelected' => $refundSelectedData['cancel_reason'] ?? '', + 'cancelStateId' => (int) \LengowMain::getOrderState(\LengowOrder::STATE_CANCELED), + 'refundReasons' => $marketplace->getRefundReasons(), + 'refundReasonSelected' => $refundSelectedData['refund_reason'] ?? '', + 'refundModes' => $marketplace->getRefundModes(), + 'refundModeSelected' => $refundSelectedData['refund_mode'] ?? '', + 'refundStateId' => (int) \LengowMain::getOrderState(\LengowOrder::STATE_REFUNDED), + ]); + } catch (\Exception $e) { + return new JsonResponse(['isFromLengow' => false, 'error' => $e->getMessage()]); + } + } + + /** + * Saves the refund or cancel reason for an order. + */ + #[AdminSecurity("is_granted('update', 'AdminOrders')")] + public function saveRefundReasonAction(Request $request): JsonResponse + { + $data = json_decode((string) $request->getContent(), true) ?? []; + $orderId = (int) ($data['orderId'] ?? 0); + $reason = (string) ($data['reason'] ?? ''); + + if (!$orderId) { + return new JsonResponse(['success' => false, 'message' => 'Missing order id']); + } + + $success = $this->orderRefundDataUpdater->updateRefundReason($orderId, $reason); + + return new JsonResponse(['success' => $success]); + } + + /** + * Saves the refund mode for an order. + */ + #[AdminSecurity("is_granted('update', 'AdminOrders')")] + public function saveRefundModeAction(Request $request): JsonResponse + { + $data = json_decode((string) $request->getContent(), true) ?? []; + $orderId = (int) ($data['orderId'] ?? 0); + $mode = (string) ($data['mode'] ?? ''); + + if (!$orderId) { + return new JsonResponse(['success' => false, 'message' => 'Missing order id']); + } + + $success = $this->orderRefundDataUpdater->updateRefundMode($orderId, $mode); + + return new JsonResponse(['success' => $success]); + } } diff --git a/translations/en.csv b/translations/en.csv index 8871b4ee..5a73ede6 100755 --- a/translations/en.csv +++ b/translations/en.csv @@ -172,6 +172,7 @@ order.screen.return_carrier_label|Return carrier order.screen.not_provided|Not provided by the marketplace order.screen.refund_reason_label|Refund reason order.screen.refund_mode_label|Refund mode +order.screen.cancel_reason_label|Cancel reason order.table.action_lengow|Actions order.table.order_lengow_state|Status order.table.order_types|Types diff --git a/translations/es.csv b/translations/es.csv index 975ad29f..3cf4b700 100755 --- a/translations/es.csv +++ b/translations/es.csv @@ -172,6 +172,7 @@ order.screen.return_carrier_label|Transportista de vuelta order.screen.not_provided|No entregado por Marketplace order.screen.refund_reason_label|Motivo de reintegro order.screen.refund_mode_label|Modo de reintegro +order.screen.cancel_reason_label|Motivo de cancelación order.table.action_lengow|Acciones order.table.order_lengow_state|Estado order.table.order_types|Tipos diff --git a/translations/fr.csv b/translations/fr.csv index ade5a057..683b10ac 100755 --- a/translations/fr.csv +++ b/translations/fr.csv @@ -172,6 +172,7 @@ order.screen.return_carrier_label|Transporteur de retour order.screen.not_provided|Non fourni par la marketplace order.screen.refund_reason_label|Raison du remboursement order.screen.refund_mode_label|Mode de remboursement +order.screen.cancel_reason_label|Raison d'annulation order.table.action_lengow|Actions order.table.order_lengow_state|Statut order.table.order_types|Types diff --git a/translations/it.csv b/translations/it.csv index ca465240..e89716a2 100755 --- a/translations/it.csv +++ b/translations/it.csv @@ -172,6 +172,7 @@ order.screen.return_carrier_label|Vettore di ritorno order.screen.not_provided|Non fornito dal marketplace order.screen.refund_reason_label|Motivo del rimborso order.screen.refund_mode_label|Modalità di rimborso +order.screen.cancel_reason_label|Motivo di annullamento order.table.action_lengow|Azione order.table.order_lengow_state|Stato order.table.order_types|Tipi diff --git a/translations/yml/en.yml b/translations/yml/en.yml index 188604d6..b214b819 100755 --- a/translations/yml/en.yml +++ b/translations/yml/en.yml @@ -191,6 +191,7 @@ en: not_provided: "Not provided by the marketplace" refund_reason_label: "Refund reason" refund_mode_label: "Refund mode" + cancel_reason_label: "Cancel reason" table: action_lengow: "Actions" order_lengow_state: "Status" diff --git a/translations/yml/es.yml b/translations/yml/es.yml index 7a79ab00..1e1f2ade 100755 --- a/translations/yml/es.yml +++ b/translations/yml/es.yml @@ -191,6 +191,7 @@ es: not_provided: "No entregado por Marketplace" refund_reason_label: "Motivo de reintegro" refund_mode_label: "Modo de reintegro" + cancel_reason_label: "Motivo de cancelación" table: action_lengow: "Acciones" order_lengow_state: "Estado" diff --git a/translations/yml/fr.yml b/translations/yml/fr.yml index 201603b7..5c440728 100755 --- a/translations/yml/fr.yml +++ b/translations/yml/fr.yml @@ -191,6 +191,7 @@ fr: not_provided: "Non fourni par la marketplace" refund_reason_label: "Raison du remboursement" refund_mode_label: "Mode de remboursement" + cancel_reason_label: "Raison d'annulation" table: action_lengow: "Actions" order_lengow_state: "Statut" diff --git a/translations/yml/it.yml b/translations/yml/it.yml index 73bc53b7..1cec34a4 100755 --- a/translations/yml/it.yml +++ b/translations/yml/it.yml @@ -191,6 +191,7 @@ it: not_provided: "Non fornito dal marketplace" refund_reason_label: "Motivo del rimborso" refund_mode_label: "Modalità di rimborso" + cancel_reason_label: "Motivo di annullamento" table: action_lengow: "Azione" order_lengow_state: "Stato" diff --git a/views/PrestaShop/Admin/Sell/Order/Order/Blocks/View/order_actions.html.twig b/views/PrestaShop/Admin/Sell/Order/Order/Blocks/View/order_actions.html.twig new file mode 100644 index 00000000..ca6c5b07 --- /dev/null +++ b/views/PrestaShop/Admin/Sell/Order/Order/Blocks/View/order_actions.html.twig @@ -0,0 +1,246 @@ +{#** + * Lengow override of PrestaShop's order_actions.html.twig + * Adds contextual cancel/refund reason blocks that appear when the corresponding + * Lengow-mapped order state is selected in the status dropdown. + *#} + + {{ form_start(updateOrderStatusActionBarForm, { + action: path('admin_orders_update_status', {orderId: orderForViewing.id}), + attr: { + id: 'update_order_status_action_form' + } + }) }} + +
+ {% set backgroundColor = '#ffffff' %} + {% set isBright = true %} + {% for choice in updateOrderStatusActionBarForm.new_order_status_id.vars.choices %} + {% if choice.value == updateOrderStatusActionBarForm.new_order_status_id.vars.data %} + {% set backgroundColor = choice.attr['data-background-color'] %} + {% set isBright = choice.attr['data-is-bright'] %} + {% endif %} + {% endfor %} +
+ {{ form_widget(updateOrderStatusActionBarForm.new_order_status_id, { + attr: { + class: 'select-status-colored', + }, + id: 'update_order_status_action_input', + }) }} +
+ + +
+ +
+ {{ form_rest(updateOrderStatusActionBarForm) }} +
+ {{ form_end(updateOrderStatusActionBarForm) }} + + {# Lengow: cancel reason block — populated and shown by JS when cancel state is selected #} + + + {# Lengow: refund reason + mode block — populated and shown by JS when refund state is selected #} + + + {% if orderForViewing.documents.canGenerateInvoice %} +
+ +
+ {% endif %} + +
+
+ +
+
+ + {% if orderForViewing.documents.canGenerateDeliverySlip %} +
+ +
+ {% endif %} + + {{ include('@PrestaShop/Admin/Sell/Order/Order/Blocks/View/extra_order_button_actions.html.twig') }} + + {% if merchandiseReturnEnabled %} + {% if orderForViewing.isDelivered() %} + + {% elseif orderForViewing.hasBeenPaid() or orderForViewing.hasPayments() %} + + {% else %} + + {% endif %} + {% endif %} + + {% if orderForViewing.hasBeenPaid() or orderForViewing.hasPayments() %} + + {% endif %} + + {{ include('@PrestaShop/Admin/Sell/Order/Order/Blocks/View/order_navigation.html.twig') }} + + {# Lengow: JS for contextual show/hide + auto-save via fetch API #} + diff --git a/views/templates/hook/order/admin_order_tab.tpl b/views/templates/hook/order/admin_order_tab.tpl index 026f1e8e..1b182799 100644 --- a/views/templates/hook/order/admin_order_tab.tpl +++ b/views/templates/hook/order/admin_order_tab.tpl @@ -75,46 +75,6 @@ {/if} - {if $refundReasons|@count > 0 || $refundModes|@count > 0} -

Refund

-
- {if $refundReasons|@count > 0} -
-
- - -
-
- {/if} - - {if $refundModes|@count > 0} -
-
- - -
-
- {/if} -
- {/if}