Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions core/components/minishop3/config/routes/manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -964,6 +964,12 @@
return $controller->getActiveDropdown($params);
});

// Dropdown list of active payments (optional delivery_id filter via msDeliveryMember)
$router->get('/payments-active', function ($params) use ($modx) {
$controller = new \MiniShop3\Controllers\Api\Manager\PaymentsController($modx);
return $controller->getActiveDropdown($params);
});

// Read: any mgr who can open grids (view_document). Write is global msGridField — mssetting_save.
$router->group('/grid-config', function ($router) use ($modx) {
$router->get('/{grid_key}', function ($params) use ($modx) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use MiniShop3\Router\HttpStatus;
use MiniShop3\Router\Response;
use MiniShop3\Services\Grid\ManagerListFilterPolicy;
use MiniShop3\Services\Settings\SettingsComboListService;
use MiniShop3\Utils\PriceAdjustment;
use MODX\Revolution\modX;

Expand Down Expand Up @@ -47,11 +48,13 @@ public function getActiveDropdown(array $params = []): array
{
$this->modx->lexicon->load('minishop3:default');

$q = $this->modx->newQuery(msDelivery::class, ['active' => 1]);
$q->sortby('position', 'ASC');

/** @var SettingsComboListService $comboList */
$comboList = $this->modx->services->get('ms3_settings_combo_list');
$results = [];
foreach ($this->modx->getIterator(msDelivery::class, $q) as $delivery) {
foreach ($comboList->iterateActiveDeliveries(
(int) ($params['id'] ?? 0),
trim((string) ($params['query'] ?? ''))
) as $delivery) {
$results[] = $this->formatActiveDropdownItem($delivery);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use MiniShop3\Router\HttpStatus;
use MiniShop3\Router\Response;
use MiniShop3\Services\Grid\ManagerListFilterPolicy;
use MiniShop3\Services\Settings\SettingsComboListService;
use MiniShop3\Utils\PriceAdjustment;
use MODX\Revolution\modX;

Expand All @@ -19,13 +20,61 @@
*/
class PaymentsController
{
/**
* Public fields for GET /api/mgr/payments-active (order-form dropdown).
*
* Must never include integration secrets: properties, class, validation_rules.
*/
public const ACTIVE_DROPDOWN_FIELDS = [
'id',
'name',
'price',
'active',
'position',
];

protected modX $modx;

public function __construct(modX $modx)
{
$this->modx = $modx;
}

/**
* Active payments for order-form dropdowns (no integration secrets).
* GET /api/mgr/payments-active
*
* Optional query: delivery_id — restrict to payments linked via msDeliveryMember.
*/
public function getActiveDropdown(array $params = []): array
{
$this->modx->lexicon->load('minishop3:default');

/** @var SettingsComboListService $comboList */
$comboList = $this->modx->services->get('ms3_settings_combo_list');
$results = [];
foreach ($comboList->iterateActivePayments(
(int) ($params['id'] ?? 0),
(int) ($params['delivery_id'] ?? 0),
trim((string) ($params['query'] ?? ''))
) as $payment) {
$results[] = $this->formatActiveDropdownItem($payment);
}

return Response::success(['results' => $results])->getData();
}

/**
* Project a payment row to the dropdown whitelist (no MODX required).
*
* @param array<string, mixed> $data
* @return array<string, mixed>
*/
public static function projectActiveDropdownFields(array $data): array
{
return array_intersect_key($data, array_flip(self::ACTIVE_DROPDOWN_FIELDS));
}

/**
* Get list of payments with pagination and search
* GET /api/mgr/payments
Expand Down Expand Up @@ -356,6 +405,29 @@ protected function formatPayment(msPayment $payment): array
];
}

protected function formatActiveDropdownItem(msPayment $payment): array
{
$data = [];
foreach (self::ACTIVE_DROPDOWN_FIELDS as $field) {
$raw = $payment->get($field);
$data[$field] = match ($field) {
'id', 'position' => (int) $raw,
'active' => (int) (bool) $raw,
default => $raw,
};
}

$name = (string) ($data['name'] ?? '');
if ($name !== '' && str_starts_with($name, 'ms3_')) {
$translated = $this->modx->lexicon($name);
if ($translated !== $name) {
$data['name'] = $translated;
}
}

return $data;
}

/**
* Get deliveries for specific payment
* GET /api/mgr/payments/{id}/deliveries
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use MiniShop3\Router\HttpStatus;
use MiniShop3\Router\Response;
use MiniShop3\Services\Settings\SettingsComboListService;

/**
* API controller for working with reference data (vendors, categories, etc)
Expand All @@ -20,37 +21,21 @@ class ReferencesController extends BaseApiController
public function getVendors(array $params): Response
{
try {
$query = $this->modx->newQuery('MiniShop3\\Model\\msVendor');

$query->select(['id', 'name']);

$query->sortby('name', 'ASC');

$searchQuery = $_GET['query'] ?? null;
if (!empty($searchQuery)) {
$query->where([
'name:LIKE' => "%{$searchQuery}%",
'OR:description:LIKE' => "%{$searchQuery}%",
]);
}

$collection = $this->modx->getCollection('MiniShop3\\Model\\msVendor', $query);

$vendors = [];
foreach ($collection as $vendor) {
$vendors[] = [
'id' => (int)$vendor->get('id'),
'name' => $vendor->get('name'),
];
}

$options = [];
foreach ($vendors as $row) {
$options[] = [
'value' => $row['id'],
'label' => (string)$row['name'],
];
}
/** @var SettingsComboListService $comboList */
$comboList = $this->modx->services->get('ms3_settings_combo_list');
$includeId = SettingsComboListService::resolvePinnedIncludeId(
(int) ($params['id'] ?? $_GET['id'] ?? 0),
$params['limit'] ?? $_GET['limit'] ?? null
);
$vendors = $comboList->listVendorsForCombo(
$includeId,
trim((string) ($params['query'] ?? $_GET['query'] ?? ''))
);

$options = array_map(
static fn(array $row): array => ['value' => $row['id'], 'label' => (string) $row['name']],
$vendors
);

return Response::success([
'vendors' => $vendors,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use MiniShop3\Model\msDelivery;
use MiniShop3\Model\msDeliveryMember;
use MiniShop3\Services\Settings\SettingsComboListService;
use MODX\Revolution\Processors\Model\GetListProcessor;
use xPDO\Om\xPDOObject;
use xPDO\Om\xPDOQuery;
Expand All @@ -15,6 +16,26 @@ class GetList extends GetListProcessor
public $defaultSortDirection = 'asc';
public $permission = 'mssetting_list';

/**
* Combo mode delegates to SettingsComboListService (same source as REST dropdowns).
*
* @return array|string
*/
public function process()
{
if ($this->getProperty('combo')) {
/** @var SettingsComboListService $comboList */
$comboList = $this->modx->services->get('ms3_settings_combo_list');
$rows = $comboList->listActiveDeliveriesForCombo(
(int) $this->getProperty('id'),
trim((string) $this->getProperty('query', ''))
);

return $this->outputArray($rows, count($rows));
}

return parent::process();
}

/**
* @param xPDOQuery $c
Expand All @@ -23,15 +44,10 @@ class GetList extends GetListProcessor
*/
public function prepareQueryBeforeCount(xPDOQuery $c)
{
if ($this->getProperty('combo')) {
$c->select('id,name');
$c->where(['active' => 1, 'OR:id:=' => $this->getProperty('id')]);
} else {
$c->leftJoin(msDeliveryMember::class, 'Payments');
$c->groupby('msDelivery' . '.id');
$c->select($this->modx->getSelectColumns($this->classKey, 'msDelivery'));
$c->select('COUNT(Payments.payment_id) as payments');
}
$c->leftJoin(msDeliveryMember::class, 'Payments');
$c->groupby('msDelivery' . '.id');
$c->select($this->modx->getSelectColumns($this->classKey, 'msDelivery'));
$c->select('COUNT(Payments.payment_id) as payments');
if ($query = trim($this->getProperty('query'))) {
$c->where([
'name:LIKE' => "%{$query}%",
Expand All @@ -43,7 +59,6 @@ public function prepareQueryBeforeCount(xPDOQuery $c)
return $c;
}


/**
* @param xPDOObject $object
*
Expand Down

This file was deleted.

This file was deleted.

Loading