<?xml version="1.0" encoding="utf-8"?>
	<rss version="2.0">
		<channel> 
			<title>Version history CMS Donate Engine</title> 
			<link>https://cde.by/en/news/</link> 
			<description>Here you can see the history of changes in CMS Donate Engine.</description>
			<item>
				<title>v19.2.39</title>
				<description><![CDATA[fix(http): return 405 for routing MethodNotAllowedException]]></description>
				<files><![CDATA[Total: 2 files (+0, ~2, -0)

www/src/app/
  M constants.php
www/src/app/Http/
  M RequestHandler.php]]></files>
				<pubDate>Mon, 12 Oct 2026 17:29:18 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.38</title>
				<description><![CDATA[fix(admin): layout alignment and Response support

- restore text-right on #naviButtons for legacy float-based toolbars
- wrap cron navi in d-inline-flex to prevent button collapse
- capture controller return value in AdminRunner and pass Response
  through, matching FrontRunner behaviour]]></description>
				<files><![CDATA[Total: 6 files (+0, ~6, -0)

www/public/style/lte3/
  M admin_layout.tpl
  M admin_pjax.tpl
www/public/style/lte3/views/cron/
  M navi.tpl
www/src/admin/
  M AdminRunner.php
www/src/admin/controllers/
  M cron.php
www/src/app/
  M constants.php]]></files>
				<pubDate>Mon, 12 Oct 2026 07:09:52 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.37</title>
				<description><![CDATA[feat(store): distinguish missing identity from offline player

When the account has neither a Steam id nor a server auth id, the
store cannot identify the player in the game at all, but RconGive
returned playerOffline and the UI asked the user to join the server.
Add GiveResult::identityMissing, return it when both steam and
playerServerAuth are empty, and surface STORE_IDENTITY_MISSING from
the purchase match. playerOffline is now returned only when an
identifier exists but the player is not on the server.]]></description>
				<files><![CDATA[Total: 6 files (+1, ~5, -0)

www/src/admin/lib/updater/migrate_mysql/
  A MigrateMySQL19236.php
www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/
  M PurchaseResult.php
  M StorePurchaseService.php
www/src/app/Features/Store/Purchase/Give/
  M GiveResult.php
  M RconGive.php]]></files>
				<pubDate>Mon, 12 Oct 2026 06:26:39 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.35</title>
				<description><![CDATA[fix(store): use Steam auth id and drop undefined from purchase POST

StorePurchaseService read $_SESSION[steam_id] (linked profile) instead
of $_SESSION[STEAMID] (Steam auth), so userIsOnline() missed players
who were online.
form_submit_ajax unconditionally read #username_inp, #steam_inp and
#server_auth; .val() returned undefined for absent fields and the
literal undefined went into every purchase request.
Prefer STEAMID when building GiveContext, coalesce the three lookups and ignore the literal undefined on the server side.]]></description>
				<files><![CDATA[Total: 7 files (+0, ~7, -0)

www/public/style/gente/js/
  M shop.js
www/src/app/
  M constants.php
www/src/app/Features/Store/Http/
  M StoreApiController.php
www/src/app/Features/Store/Purchase/
  M StorePurchaseService.php
www/src/app/lib/
  M Template.php
www/src/app/lib/rcon/
  M Facade.php
  M Rcon7dtd.php]]></files>
				<pubDate>Mon, 12 Oct 2026 05:56:32 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.34</title>
				<description><![CDATA[fix(store/give): reject offline RCON delivery instead of silently queueing]]></description>
				<files><![CDATA[Total: 2 files (+0, ~2, -0)

www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/Give/
  M RconGive.php]]></files>
				<pubDate>Sun, 11 Oct 2026 18:02:44 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.33</title>
				<description><![CDATA[fix(store/purchase): handle player_off and not_deliverable statuses explicitly]]></description>
				<files><![CDATA[Total: 7 files (+1, ~6, -0)

www/src/admin/lib/updater/migrate_mysql/
  A MigrateMySQL19232.php
www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/
  M PurchaseResult.php
  M StorePurchaseService.php
www/src/app/Features/Store/Purchase/Give/
  M RconGive.php
www/src/app/Features/Store/Purchase/Ports/
  M ProductStock.php
www/src/app/lib/queue/
  M Service.php]]></files>
				<pubDate>Sun, 11 Oct 2026 17:42:08 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.31</title>
				<description><![CDATA[fix(store/give): return player_off for offline player instead of fake ok]]></description>
				<files><![CDATA[Total: 3 files (+0, ~3, -0)

www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/Give/
  M GiveResult.php
  M RconGive.php]]></files>
				<pubDate>Sun, 11 Oct 2026 15:46:56 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.30</title>
				<description><![CDATA[fix(store/give): fail explicitly on unresolved placeholders

PlaceholderResolver previously treated empty placeholder values
null as absent and let them slip through to str_ireplace,
so commands like tele %crossid% ... reached the game server with
literal tokens and the game replied player not found.
- add PlaceholderNotResolvedException with the missing placeholder list
- collect unresolved placeholders before substitution and throw
  instead of emitting a half-built command
- catch it separately in RconGive and return GiveResult::notDeliverable
  instead of misleading serverOffline
- persist the failure via PurchaseLog::writePlaceholderFailure]]></description>
				<files><![CDATA[Total: 9 files (+1, ~8, -0)

www/public/style/lte3/views/rcon/
  M list.tpl
www/src/admin/controllers/
  M cron.php
www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/Give/
  M GiveResult.php
  M RconGive.php
www/src/app/Features/Store/Purchase/Ports/
  M LogStoreAdapter.php
  M PurchaseLog.php
www/src/app/lib/rcon/
  A PlaceholderNotResolvedException.php
  M PlaceholderResolver.php]]></files>
				<pubDate>Sun, 11 Oct 2026 15:35:38 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.29</title>
				<description><![CDATA[feat(cron): add same_type queue delivery mode

- QueueService: MODE_SAME_TYPE + runSameTypeWithConnections()
- ServerMonitor: match three modes (strict/same_type/any)
- cron.php + panel.tpl: select with three options
- MigrateMySQL19228: QUEUE_DELIVERY_* translations (up/down)]]></description>
				<files><![CDATA[Total: 12 files (+4, ~8, -0)

www/public/style/lte3/
  M admin_ajax.tpl
  M admin_layout.tpl
  A admin_pjax.tpl
www/public/style/lte3/views/cron/
  A navi.tpl
  A panel.tpl
www/src/admin/controllers/
  M cron.php
www/src/admin/lib/cron/
  M ServerMonitor.php
www/src/admin/lib/updater/migrate_mysql/
  A MigrateMySQL19227.php
www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/Give/
  M RconGive.php
www/src/app/lib/
  M Template.php
www/src/app/lib/queue/
  M Service.php]]></files>
				<pubDate>Sun, 11 Oct 2026 11:58:14 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.26</title>
				<description><![CDATA[fix(confirm): remove double [c] offset in generate()
$cN = database_columns[c] already unwraps the section, but
generate() accessed $cN[c][table]  14 null !92 Incorrect table
name. remove()/get() are correct; only generate() had the bug.]]></description>
				<files><![CDATA[Total: 2 files (+0, ~2, -0)

www/src/app/
  M constants.php
www/src/app/models/Confirm/
  M modelConfirm.php]]></files>
				<pubDate>Sat, 10 Oct 2026 18:55:11 +0300</pubDate>
			</item>
		</channel>
	</rss>