<?xml version="1.0" encoding="utf-8"?>
	<rss version="2.0">
		<channel> 
			<title>История коммерческой редакции CMS Donate Engine</title> 
			<link>https://cde.by/ru/news/</link> 
			<description>Здесь Вы можете ознакомиться с историей изменений в CMS Donate Engine.</description>
			<item>
				<title>v19.2.52</title>
				<description><![CDATA[fix(user): read balance from money db in PlayerDataRepository]]></description>
				<files><![CDATA[Total: 3 files (+0, ~3, -0)

www/src/app/
  M constants.php
www/src/app/config/
  M services.php
www/src/app/lib/user/
  M PlayerDataRepository.php]]></files>
				<pubDate>Fri, 16 Oct 2026 15:39:03 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.51</title>
				<description><![CDATA[fix(store): prevent double refund on concurrent cancel
The cancel flow credited the buyer before flipping the message body,
so two admins clicking at the same time could each pass the marker
check and each trigger addMoney, doubling the refund.
Flip the message body first with a conditional UPDATE on the original
body and bail out when affectedRows is 0. Only the request that wins
the UPDATE proceeds to credit the buyer and write the refund log.
Roll back the body if addMoney returns false.]]></description>
				<files><![CDATA[Total: 3 files (+0, ~3, -0)

www/src/app/
  M constants.php
www/src/app/Features/Store/Http/
  M StoreCatalogController.php
  M StoreDeliveryController.php]]></files>
				<pubDate>Fri, 16 Oct 2026 13:53:46 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.50</title>
				<description><![CDATA[fix(store): restore add-product action in category nav]]></description>
				<files><![CDATA[Total: 2 files (+0, ~2, -0)

www/src/app/
  M constants.php
www/src/app/Features/Store/Http/
  M StoreCatalogController.php]]></files>
				<pubDate>Fri, 16 Oct 2026 13:34:33 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.49</title>
				<description><![CDATA[feat(store): manual delivery with admin workflow in IM
Discord is a notification channel, not a delivery method. Split the
concern: GiveType::Manual replaces GiveType::Discord as the delivery
type, ManualGive settles the purchase (money, stock, log) at buy time,
and delivery is performed by an admin in-game.
PurchaseDialogNotifier posts new manual orders to the shared admin
dialog: the bot is the author, admins are members, the message shows
the server, item x count, a link to the buyer profile, and the
command in a code block.
Three inline actions per order:
- Copy       14 client-side, clipboard
- I delivered  14 atomic UPDATE on the message body, first click wins
- Cancel and refund  14 credits the buyer via memberData and writes a
  buy_store_refund row through PurchaseLog::writeRefund
Admin membership in the server dialog is synced on each purchase:
new owners are added, removed owners are dropped, the bot stays first.
StorePurchaseService notifies admins only for Manual. StoreApiController
and StoreAdminDeleteService use UrlGeneratorInterface for URLs instead
of string concatenation. Rename name -> serverName in
StoreProductQuery::findForPurchase and GiveContext.
Discord webhook (discord_hook_shop) is used only as an additional
notification channel for manual orders, in plain text.
Migration 19248:
- products: give 'discord' -> 'manual'
- bundles: '"give":"discord"' -> '"give":"manual"' in command JSON
- new translations for admin workflow and player refund notice
- remove obsolete ADMIN_PURCHASE_NOTIFY_SUBJECT(_GLOBAL)]]></description>
				<files><![CDATA[Total: 36 files (+8, ~27, -1)

www/public/style/gente/mods/im/
  M listing.tpl
  A view.js
  M view.tpl
www/public/style/gente/mods/store/
  M admin_modal_edit_product.tpl
  A purchase_delivery.tpl
  A purchase_delivery_cancelled.tpl
  A purchase_delivery_done.tpl
www/src/admin/lib/updater/migrate_mysql/
  A MigrateMySQL19248.php
www/src/app/
  M constants.php
www/src/app/config/
  M services.php
www/src/app/controllers/
  M comeback.php
  M im.php
www/src/app/Features/Store/
www/src/app/Features/Store/Admin/View/
  M StoreAdminDeleteService.php
www/src/app/Features/Store/Catalog/
  M StoreProductQuery.php
www/src/app/Features/Store/Http/
  M StoreApiController.php
  A StoreDeliveryController.php
  M StoreModalController.php
www/src/app/Features/Store/Purchase/
  A PurchaseDialogNotifier.php
  M PurchaseFactory.php
  M PurchaseResolver.php
  M PurchaseResult.php
  M StorePurchaseService.php
www/src/app/Features/Store/Purchase/Give/
  D DiscordGive.php
  M GiveContext.php
  M GiveHandler.php
  M GiveResult.php
  M GiveType.php
  M InventoryGive.php
  A ManualGive.php
www/src/app/Features/Store/Purchase/Ports/
  M LogStoreAdapter.php
  M PurchaseLog.php
www/src/app/models/shopLogs/
  M LogStore.php
  M LogViewFormatter.php
www/tests/Unit/Features/Store/Purchase/
  M PurchaseResolverTest.php
www/tests/Unit/Features/Store/Purchase/Give/
  M RconGiveTest.php]]></files>
				<pubDate>Fri, 16 Oct 2026 13:19:48 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.47</title>
				<description><![CDATA[fix(session): reload steam_id when session holds an empty string]]></description>
				<files><![CDATA[Total: 7 files (+2, ~5, -0)

www/src/app/
  M constants.php
www/src/app/config/
  M services.php
www/src/app/Features/Profile/
  M UcpController.php
www/src/app/Features/User/
  A UserLookup.php
www/src/app/lib/
  M memberData.php
www/src/app/usecases/
  M SteamRegistrationUseCase.php
www/tests/Unit/Session/
  A CurrentUserTest.php]]></files>
				<pubDate>Wed, 14 Oct 2026 13:09:04 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.46</title>
				<description><![CDATA[fix(session): reload steam_id from profile when session holds an empty string]]></description>
				<files><![CDATA[Total: 2 files (+0, ~2, -0)

www/src/app/
  M constants.php
www/src/app/lib/session/
  M CurrentUser.php]]></files>
				<pubDate>Wed, 14 Oct 2026 08:52:57 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.45</title>
				<description><![CDATA[refactor(store): unify SteamID validation, DI purchase service
fix(database): cache tags]]></description>
				<files><![CDATA[Total: 12 files (+1, ~11, -0)

www/src/app/
  M constants.php
www/src/app/config/
  M services.php
www/src/app/Features/Profile/
  M UcpController.php
www/src/app/Features/Profile/View/
  M ucp.tpl
www/src/app/Features/Store/Http/
  M StoreApiController.php
www/src/app/Features/Store/Purchase/
  M StorePurchaseService.php
www/src/app/lib/database/
  M Database.php
www/src/app/lib/database/middleware/
  M CacheMiddleware.php
  M SqlParserMiddleware.php
www/src/app/lib/rcon/
  M PlaceholderResolver.php
www/tests/Unit/Database/
  M SqlParserMiddlewareTest.php
www/tests/Unit/Rcon/
  A PlaceholderResolverTest.php]]></files>
				<pubDate>Wed, 14 Oct 2026 08:36:33 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.44</title>
				<description><![CDATA[refactor(rcon): move protocol implementations into Protocol subdirectory]]></description>
				<files><![CDATA[Total: 43 files (+20, ~3, -20)

www/src/admin/lib/updater/menu/
  M MenuRestorer.php
www/src/app/
  M constants.php
www/src/app/lib/rcon/
  D InterfaceRcon.php
  D Rcon7dtd.php
  M RconAdapter.php
  D RconArma2.php
  D RconArma3.php
  D RconConan.php
  D RconDayz.php
  D RconFivem.php
  D RconL4d2.php
  D RconMinecraft.php
  D RconMta.php
  D RconPalworld.php
  D RconQuake3.php
  D RconRocket.php
  D RconRustWs.php
  D RconSamp.php
  D RconSoulmask.php
  D RconSteam.php
  D RconTeamspeak3.php
  D RconTelnet.php
  D RconWebsender.php
www/src/app/lib/rcon/Protocol/
  A InterfaceRcon.php
  A Rcon7dtd.php
  A RconArma2.php
  A RconArma3.php
  A RconConan.php
  A RconDayz.php
  A RconFivem.php
  A RconL4d2.php
  A RconMinecraft.php
  A RconMta.php
  A RconPalworld.php
  A RconQuake3.php
  A RconRocket.php
  A RconRustWs.php
  A RconSamp.php
  A RconSoulmask.php
  A RconSteam.php
  A RconTeamspeak3.php
  A RconTelnet.php
  A RconWebsender.php]]></files>
				<pubDate>Wed, 14 Oct 2026 06:29:21 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.43</title>
				<description><![CDATA[refactor(rcon,query): add RconClient interface, rename Facade adapters]]></description>
				<files><![CDATA[Total: 31 files (+4, ~25, -2)

www/src/admin/controllers/
  M luckperms.php
  M management.php
  M perm.php
  M query.php
  M rcon.php
  M users.php
www/src/admin/lib/cron/
  M Gifts.php
  M Permissions.php
  M ServerCron.php
  M ServerMonitor.php
www/src/app/
  M constants.php
www/src/app/controllers/
  M bans.php
  M groups.php
  M inv.php
  M myitems.php
  M servers.php
  M shopitems.php
  M teleport.php
  M unban.php
www/src/app/Features/Store/Purchase/
  M PurchaseFactory.php
www/src/app/Features/Store/Purchase/Command/
  M AffixCatalog.php
www/src/app/Features/Store/Purchase/Give/
  M RconGive.php
www/src/app/lib/inventory/protocols/minecraft/
  M RconGiveFromBasket.php
www/src/app/lib/query/
  D Facade.php
  A QueryAdapter.php
www/src/app/lib/queue/
  M Service.php
www/src/app/lib/rcon/
  A RconAdapter.php
  A RconClient.php
www/src/app/lib/server/
  M GameAuth.php
www/tests/Unit/Features/Store/Purchase/Give/
  A RconGiveTest.php]]></files>
				<pubDate>Tue, 13 Oct 2026 18:50:39 +0300</pubDate>
			</item>
			<item>
				<title>v19.2.42</title>
				<description><![CDATA[feat(store): name the server in player-offline message]]></description>
				<files><![CDATA[Total: 5 files (+1, ~4, -0)

www/src/admin/lib/updater/migrate_mysql/
  A MigrateMySQL19241.php
www/src/app/
  M constants.php
www/src/app/Features/Store/Purchase/
  M StorePurchaseService.php
www/src/app/lib/
  M Template.php
www/src/app/lib/rcon/
  M PlaceholderResolver.php]]></files>
				<pubDate>Tue, 13 Oct 2026 08:56:46 +0300</pubDate>
			</item>
		</channel>
	</rss>