-
Standard: Kommentare bereinigt (Methodenkommentare ergänzt, lange Kommentare auf einen Satz, Inline-, Template- und SCSS-Kommentare entfernt, @inheritDoc, #[\Override] an __toString), Kommentar-Prüfung aktualisiert, geänderte Dateien auf LF
Entfernte Kommentare (Wozu, zum Nachlesen):
- acptemplates/countryOptionType.tpl: htmlCheckMissingLabel:off htmlCheckMissingLabel:on
- acptemplates/shopOption.tpl: fake fields are a workaround for chrome autofill picking the wrong fields taken from http://stackoverflow.com/a/15917221
- files/acp/database/install_de.yourecom.shop.php: Install Database for shop; NULL: the question belongs to no group; net amount in the default currency that an answer adds to the unit price (placement product only); one `key=amount` per line: extra net amounts of single choices; days after the order that the answers are deleted automatically, 0 = never; NULL = take the default of the question; NULL = take the default of each question of the group; fingerprint of the order question answers of the line, '' without answers; same product with other answers is another line; paid with value vouchers (a payment, not a discount: the totals keep their tax), see VoucherManager; purchase on invoice: granted at once, to be paid by this day (0 = no purchase on invoice); dunning fees, they are owed on top of the total; open purchases on invoice (dunning cronjob, ACP list); NULL: the answer belongs to the whole order, otherwise to this order item; NULL once the question was deleted; name and label stay as they were when the order was placed; the value as text for display (choices as their label), as it was when the order was placed; customer or staff; time of the newest renewal of the support (an update purchase), 0 = never; end of the support period, kept by ProductSupport for lists and reminders, 0 = no end; the end the customer has been reminded of; end of the licence, an expired licence downloads nothing, 0 = no end; versions released up to this time are included, kept by ProductSupport::refreshLicences(), 0 = all; the end of the licence the customer was reminded of, and the last stage of that reminder; what a renewal or an upgrade changed on an existing licence, so a cancellation or a credit note can take it back; value vouchers bought in the shop (multi-purpose vouchers: VAT arises when they are redeemed); a present: who gets the voucher by mail, with which message, on which day (0 = with the payment); presents still to send (hourly cronjob); a cancellation gave the amount back to the voucher; what credit notes gave back of the amount; the part of the amount that goes back to value vouchers instead of the payment gateway; § 11 PAngV: every change of the net list price (option `price`, cents of the default currency), for the lowest; price of the 30 days before a price reduction; which version of the terms and of the information on withdrawal went to the customer with the order; domains a licence is bound to; a removed domain keeps its row (removedTime) to count the changes per year; a licence transfer request: who owned the licence, who should get it, and the state it is in. `fee` is the gross; amount charged for it (0 = none), `orderID` the order that paid it once `status` passes `pendingPayment`; every shop mail actually sent, for the ACP "Postausgang" (outbox): proof of delivery and a way to resend one; who was told about a new version and how: `available` (included) or an offer (`update`, `renewal`); a product sub-page ("Unterseite"), e.g. documentation or a licence addendum; owner-managed like a version; ToDO: Remove shop1_customer_option
- files/acp/database/update_dropCancellationInvoiceNumber.php: Drops the legacy column `invoiceNumber` of withdrawals.
- files/acp/database/update_dropCartItemOldIndex.php: Drops the unique index of the cart items that did not know the order question answers: with answers, the same product can be in the cart in several lines (replaced by `cartID_productID_type_answerHash`).
- files/acp/global.php: define paths; include config; @noinspection PhpIncludeInspection include WCF; @noinspection PhpIncludeInspection
- files/acp/install_de.yourecom.shop.php: Add default data by installation.; add useronline box to page: de.yourecom.shop.productList; assign box 'com.woltlab.wcf.RegisterButton.content' to de.yourecom.shop.product
- files/acp/update_backfillOrderNumber.php: Gives every existing order without an order number one in the same format new orders get (`A-yymm` + zero-padded orderID, `TEST-` prefix for test orders). Orders placed before the column existed have none, and the order cancellation form only looks orders up by their order number. Runs after the database PIP, which creates the column when updating from a version before 6.2.7.
- files/acp/update_backfillOrderTransactionLogTransactionID.php: Gives every existing shop1_order_transaction_log row with an empty transactionID.
- files/acp/update_backfillProductPriceHistory.php: Starts the price history (§ 11 PAngV) with the current list price of every product.
- files/acp/update_backfillSupportEndsAt.php: Writes the end of the support period into the licences of the products with a support period (new column supportEndsAt). Can run again without effect.
- files/acp/update_licenceSigningKey.php: Creates the key pair for signed licence answers once, so parallel first checks cannot create two.
- files/acp/update_markVersionNoticesSent.php: Marks the versions released before the licence update notice as announced, so the update does not mail them.
- files/acp/update_migrateCancellationInvoiceNumber.php: Moves the order number of withdrawals submitted before 6.2.7 from the legacy column `invoiceNumber` (the form field was labelled "Bestellnummer") to `orderNumber`. Runs after the database PIP, which creates `orderNumber` when updating from an older version, and before `update_dropCancellationInvoiceNumber.php` drops the old column.; `getColumns()` builds `SHOW COLUMNS FROM \`{$table}\`` and lets Database::prepare() rewrite the; `app1_` table prefix to the real installation number. A bound `?` parameter on an; information_schema query would bypass that rewrite and always miss on installations with WCF_N != 1.; already migrated
- files/acp/update_migrateProductFeatures.php: Converts product highlights still stored in the old newline-separated format (one title per line) to the JSON format of ProductFeatureList, which reads nothing else since 6.2.8.
- files/acp/update_moveSupportDurationOptions.php: The support period is a service of the shop. Until 6.2.8 Beta 17 the options "supportDuration" and "supportDurationUnit" were defined by de.yourecom.shop.workplace, now the shop defines them. The option values are stored in one column per option ID, so the rows are handed over to the shop instead of being created again: the ID, the column and every value stay as they are, the import of productOption.xml afterwards updates the rows. The language items of the options and of the offer on the product page move with them. Runs before the language items and the product options are imported and can run again without effect.; a row of the shop with the same name wins, the unique index (optionName, packageID) would not allow both; the data column of a moved option (e.g. productOption12 on shop1_product_option_data) was created by the; workplace package; without this, uninstalling it would drop the column and lose every stored support duration; the language import leaves the items of other packages as they are, so they are handed over as well
- files/acp/update_offerPlaceholderProduct.php: Creates the hidden system product once that a free offer line item (one without a real product) is booked against, so every `shop1_order_item` keeps a real `productID` without a schema change.
- files/acp/update_openOrderActiveSince.php: Remembers when the handling of open orders came in: payment reminders only apply to orders placed after that.
- files/acp/update_rebuildProductHeaderThumbnails.php: Creates the smaller copies of the header images (`headerSmall`, `headerMedium`) for the products that exist already. A failing image never stops the update.
- files/global.php: include config; @noinspection PhpIncludeInspection include wcf
- files/lib/acp/action/CreateOrderCreditNoteAction.class.php: A credit note references an invoice number, so one must already exist.
- files/lib/acp/form/CurrencyAddForm.class.php: iso; title; symbol; iso code; exchange rate
- files/lib/acp/form/CustomerAddForm.class.php: Bucket options by category; Sorted categories; Load required option metadata; Apply default fallback if configured
- files/lib/acp/form/CustomerOptionAddForm.class.php: General; type config; permissions; askDuringRegistration; searchable; editable (bitmask); visible (bitmask); decode config; move fields
- files/lib/acp/form/LicenceEditForm.class.php: Edits a licence: end, start of updates and support, internal note; every change needs a reason and goes into the history of the licence, shown below the form. 0 means "no end" and "since the purchase", the field stays empty then; the next change needs its own reason
- files/lib/acp/form/MailEventEditForm.class.php: Customizes one mail event (Vorlagen je Ereignis): on/off, a recipient/sender override, and the subject/message in German and English. Shows a preview using the most recent real order, so the placeholders are not just names. The default subject phrase of this event, rendered with the preview order if there is one (most subject phrases reference `{$order->...}` directly) - an empty string if there is no order to render it with yet.
- files/lib/acp/form/OrderAnswersPurgeForm.class.php: Deletes the answers of an order that hold personal data, for example on the request of the customer. The order itself stays as the law requires.
- files/lib/acp/form/OrderQuestionEditForm.class.php: the fields read the translations from the language item names
- files/lib/acp/form/OrderQuestionGroupEditForm.class.php: the field reads the translations from the language item name
- files/lib/acp/form/ProductListWidgetAddForm.class.php: "none" is stored as NULL; the note is saved as a language item in saved(); Saves the note as the language item shop.product.list.widget.<name> and returns the name to store, or removes it and returns '' if the note is empty.
- files/lib/acp/form/ProductOptionAddForm.class.php: Load option categories; Load product categories (tree); general section; type section
- files/lib/acp/form/ShopOptionForm.class.php: The settings of the shop (category "shop" and its subcategories) for the operator of a shop. The general option pages need the permission `admin.configuration.canEditOption`, which opens every option of the suite (mail, paths, modules). A shop operator who is not an administrator of the whole installation (a hosted shop, a shop manager) gets the permission `admin.shop.canManageSettings` instead: it opens only the options of the shop and of the payment methods, nothing else. Returns whether the option category may be the root of the page (the one the `id` names). The payment page also starts at the category "general", because the options of the bank transfer sit directly in "general.payment"; what is shown and saved is restricted to the allowed categories either way (see initOptionHandler()). Only the options of the allowed categories are loaded, so only they are shown, read from the form and saved: an option that is not part of the form would otherwise be saved empty. the tabs and sections of the categories this page does not show; the page of the core's option form is skipped on purpose (its permission check)
- files/lib/acp/page/DiscountAccountingExportPage.class.php: redemptions stored without currency are only computed, not combined with others
- files/lib/acp/page/InvoiceArchiveExportPage.class.php: `$neededPermissions` only requires one of them (core semantics); the export itself needs its own permission
- files/lib/acp/page/OfferEditItemsPage.class.php: Shows a draft (or already sent) offer's line items, the dialog to add more while it is still a draft, and the actions to send it or cancel it.
- files/lib/acp/page/OpenOrderPreviewPage.class.php: look ahead: 0 = now, otherwise that many hours
- files/lib/acp/page/OrderExportPage.class.php: the end date counts as a whole day; German spreadsheets expect a semicolon and a decimal comma; Returns the answers to the order questions as one text "question: answer; ...", without answers that hold personal data unless they were asked for.
- files/lib/acp/page/StatisticsExportPage.class.php: `$neededPermissions` only requires one of them (core semantics); the export itself needs its own permission
- files/lib/acp/page/StatisticsTaxPdfPage.class.php: `$neededPermissions` only requires one of them (core semantics); the export itself needs its own permission; the provider reads the basis from the request
- files/lib/action/AssignProductLabelDialogAction.class.php: only the label groups that every selected product offers and the active user may set; the label fields add their choice to the form data as "labelIDs" (group => label), outside of "data"; a single product shows its current labels
- files/lib/action/DownloadAction.class.php: The first download ends the right of withdrawal: a prefetch or an <img>/<iframe> on a foreign page must not trigger it.; the start of the execution for the right of withdrawal; User download history; User wants subscriptions? Product already subscribed?
- files/lib/action/GuestDownloadAction.class.php: refunded, canceled or withdrawn orders lose the download, even before the token expires; A test order's downloads must not inflate the customer-visible download counter.
- files/lib/action/LicenceVerifyAction.class.php: Licence check for software: `key`, `domain` and optionally `product` (GET or POST) give a signed JSON answer (see docs/licence-api.md). Called by servers, so without XSRF token and session; at most `LIMIT` checks per IP address and hour.
- files/lib/action/OrderPaymentMethodAction.class.php: no change of the payment method while a payment is under way, it would lead to a second payment
- files/lib/action/OrderReorderAction.class.php: lines that were ordered with answers to order questions go back with the same answers, one line each; a product that cannot be bought any more (sold out, withdrawn) is left out, the rest still goes into the cart
- files/lib/command/cart/AddCartItem.class.php: Add-ons the customer chose with the product, units by add-on product ID; required and automatic ones are added anyway.; the regular purchase of a value voucher is a line of its own type (no VAT, issues codes); one order starts one subscription per offering, see UpdateCartItemQuantity; a present: checked here, and every recipient is a line of its own; the fee of a transfer request of the acting user, awaiting payment; one line per request; a parallel request created the item first; Checks the submitted answers against the questions of the product page and returns the normalized answers. Only one-time purchases carry answers; a missing or wrong answer stops the purchase with an error on the question. what the answers to the questions of the product page add (engraving, express, ...); a multi-purpose voucher is no taxable supply when it is sold, the VAT arises when it is redeemed
- files/lib/command/cart/UpdateCartItemQuantity.class.php: one order starts one subscription per offering, a higher quantity would be charged but not delivered
- files/lib/command/order/CancelOrderByCustomer.class.php: Cancels the order. A mail or notification that cannot be sent is logged, the cancellation stays.; paid or started to pay while the customer was looking at the dialog
- files/lib/command/order/ChangeOrderStatus.class.php: Prepares the status change; `byPaymentProcessing` allows what only the payment processing may do.; Applies the status. With `sendMail` false the status mail is returned instead of sent.; a failed payment is told by `PaymentFailedNotice` after a grace period (the customer may pay again at once);; renewals of a subscription have their own dunning, the customer does not get a second mail for the same payment
- files/lib/command/order/ClaimGuestOrder.class.php: Prepares the claim of the order by the user; `token` is the plain token from the claim link.; Claims the order and returns it as stored now.; only one request may claim the order, a second one (double submit) would grant the licences again; paid at some point, and not reversed since (cancellation, refund, chargeback): a withdrawn/refunded; order must not grant licences, re-reserve stock or be un-cancelled just because it claims a guest order
- files/lib/command/order/CreateOrder.class.php: Prepares the order with its data (`shop1_order` columns) from the cart. Creates the order and returns it.; the checks come after the test flag was settled: only staff may place test orders; the way to pay could have become unavailable since it was chosen (amount changed, rules changed); two checkouts at once must not both stay within the limit of open invoices: checked again under a lock; value vouchers pay a part (or all) of the total; the invoice keeps the full amount with its tax; bought on invoice: granted now, paid until the due date
- files/lib/command/order/ResetOrderPaymentProcessing.class.php: Clears the payment under way.
- files/lib/command/order/SendOrderReminderNow.class.php: Sends the reminder after the last one sent. Money that is on its way is no reason for a reminder, the wording of "customer pays by themselves" is used for it.
- files/lib/command/order/question/SetOrderQuestionGroupI18nValues.class.php: Saves the title if one was submitted.; a plain value applies to every language; the handler only takes that as a list of values per language
- files/lib/command/order/question/SetOrderQuestionI18nValues.class.php: Saves the fields that carry a value; fields that were not submitted keep their language items.; a plain value applies to every language; the handler only takes that as a list of values per language
- files/lib/command/product/CreateProduct.class.php: Prepares the product; `contents` is keyed by languageID (0 = monolingual). Creates the product.
- files/lib/command/product/DeleteProducts.class.php: Prepares the deletion. Deletes the products and returns their number.; per language version, before the rows cascade away with the product
- files/lib/command/product/ProductAssignments.class.php: the keys of groups start with `g`
- files/lib/command/product/RevertProductContent.class.php: Prepares the restore.; Restores the text.
- files/lib/command/product/SetProductOptionValues.class.php: § 11 PAngV: every price change goes into the history for the lowest price of the last 30 days
- files/lib/command/product/UpdateProduct.class.php: Prepares the update; `contents` is keyed by languageID (0 = monolingual), an empty list leaves them unchanged. Saves the product.
- files/lib/data/cart/Cart.class.php: a value voucher keeps the price it was put in with, it has no tax that could change
- files/lib/data/category/ShopCategory.class.php: object type name of the shop categories; check permissions; map category permission to user group permission; get ids; cache does not exist or is outdated; update storage data
- files/lib/data/category/ShopCategoryAction.class.php: reset storage and notifications
- files/lib/data/currency/CurrencyEditor.class.php: remove default flag from all currencies; set current currency as default currency
- files/lib/data/currency/country/Country.class.php: Returns the title of this country.
- files/lib/data/currency/country/CountryEditor.class.php: remove default flag from all currencies; set current country as default country
- files/lib/data/currency/taxCategory/TaxCategoryAction.class.php: load configuration; add entry; save configuration; remove entry
- files/lib/data/currency/taxCategory/TaxCategoryEditor.class.php: load taxCategory product option; decode selectOptions; only append if enabled; check if already present; add entry if missing; save configuration
- files/lib/data/customer/Customer.class.php: Returns the value of a specific customer option. Optional: Filter out disabled options.; Returns the customer by wsc userID, read only once per request. Use it for read-only purposes like price display, CustomerEditor resets it on changes. load cache; check permission; fallback to default style; get default style; init style
- files/lib/data/customer/CustomerEditor.class.php: Provides functions to edit a customer object. Supports updating dynamic customer option values.
- files/lib/data/customer/option/CustomerOption.class.php: each bit grants visibility to its own group only: an admin-only option (e.g. businessVerified) must never; show up in the customer's own account or the checkout; the admin bit is for the ACP only: options the operator sets (e.g. businessVerified, which decides about 0 %; VAT outside the EU) must never be editable by the customer; Returns the effective fallback value for prefill logic. Returns null if no fallback applies. Country → Default country; Gender → Explicitly return null to clear garbage values; Birthday → Explicitly return null to clear the "0000-00-00" zero-date sentinel; no one; owner only; admin; owner + admin; registered; registered (merged mask); guest; everyone; no one; owner only; admin; owner + admin
- files/lib/data/customer/option/category/CustomerOptionCategory.class.php: Returns the title of this category.
- files/lib/data/discount/Discount.class.php: Builds the `b2bTiers` payload stored inside `customerData` from raw tier pairs, dropping incomplete/empty pairs and ordering the remaining tiers by threshold. a value voucher is a means of payment, no discount lowers its price; already an amount of the cart currency; Allows extensions to substitute a different eligible amount for a cart item,; e.g. when its due-today line total is temporarily reduced (trial, first-charge waiver).; limit and used budget are kept in the default currency
- files/lib/data/faq/FaqEntry.class.php: Represents an FAQ entry: `productID` null is a shop-wide entry (ACP-managed), set is the product's own FAQ (owner-managed, like a product tab).
- files/lib/data/modification/log/ProductLogModificationLogList.class.php: get object type; use table index as array index, the list hands out the viewable decorators of its logs
- files/lib/data/modification/log/ViewableProductListProductModificationLog.class.php: Returns readable representation of current log entry.
- files/lib/data/modification/log/ViewableProductModificationLog.class.php: Returns readable representation of current log entry.
- files/lib/data/order/Order.class.php: Returns what is left to pay through the payment method: the total minus what vouchers paid, plus dunning fees of a purchase on invoice. the cheap checks first, the status is a query; Returns the answers to the order questions as question name => value: of the whole order, or of one order item. The answers are the snapshot of the moment the order was placed. Returns whether the customer may still change the answers: there are some, the order is not paid and not canceled. Staff may change them at any time. Returns all items of this order. Results are cached to avoid repeated database queries. Fallback old yourecom database design; § 356 Abs. 5 BGB: digital content delivered after the customer waived the right of withdrawal; Whether this is a purchase on invoice that was granted when it was placed: it waits for its payment, but the customer has the goods, so only a withdrawal or the dunning ends it, no cancellation of an unpaid order. Returns whether staff may still book a payment on this canceled order: it was canceled because it was not paid (by the customer or the shop), so a late payment, e.g. a bank transfer, has to be bookable. an order without a customer matches no cart (0 === 0 would let every guest with a cart in); Returns whether the customer started a checkout for this order that was never completed (e.g. an expired Stripe Checkout Session) and payment is still outstanding.
- files/lib/data/order/OrderAction.class.php: delete user notifications
- files/lib/data/order/OrderEditor.class.php: GoBD: an issued invoice number never changes; e-invoice (ZUGFeRD/Factur-X): PDF/A-3 with the XML attached, decided before rendering; update new invoiceFile; the snapshot's unit price is gross, like the order item's (see OrderItem::getTaxedUnitPrice()); Returns an image as data URI; opaque puts raster images on white, PDF/A (e-invoice) forbids transparency and would otherwise turn transparent areas black. the stored unit price has cents precision, the line total must add up with it; a multi-purpose voucher is no taxable supply when it is sold; a free product needs no tax category, anything with a price does
- files/lib/data/order/ViewableOrderList.class.php: the order overview shows status, items and cancellation of every order, load them all at once
- files/lib/data/order/creditNote/OrderCreditNoteAction.class.php: Confirms one or more draft credit notes: re-validates the credited quantities against everything already sent for the order. With the parameter `externalRefund` the money already went back outside the shop (a refund in the gateway's dashboard, a dispute): the credit note is only recorded, nothing is refunded again and the customer gets no mail from here. Re-checked under the order lock, against the credit notes committed in the meantime.; the voucher share as of now (before this one counts): another credit note may have been confirmed since the draft; licences an upgrade was credited with: their money is in the upgrade already (the status change reports it); the money for a value voucher goes back, so the voucher does too; the money went back outside the shop, nothing to the vouchers; the PDF must not say otherwise; no discount lowers a value voucher, its line goes back in full; the old licences come back; for an upgrade the new licences go below like those of a regular purchase; a sentinel keeps the query from meaning "all products" when no line grants licences; the renewal that came with the update is taken back as well; an absolute path, for the same reason as OrderFulfillment::attachInvoice(); the order discount lies on the other lines only, value vouchers get none; Credits every item quantity no credit note covers yet. With `$externalRefund` the money already went back outside the shop (a refund in the gateway's dashboard, a lost dispute): the credit note is only recorded, nothing is refunded again through the gateway, and the customer gets no mail from here.
- files/lib/data/order/question/OrderQuestion.class.php: a label may be a language item (plain texts stay as they are)
- files/lib/data/order/question/OrderQuestionAction.class.php: label and help text live in language items, a plain value of the form fields is not a column; a unique placeholder until the ID is known, the final name derives from the ID; the name is fixed after creation, label and help text live in language items
- files/lib/data/order/question/group/OrderQuestionGroupAction.class.php: a unique placeholder until the ID is known, the final name derives from the ID; the name is fixed after creation, the title lives in a language item
- files/lib/data/order/transaction/log/OrderTransactionLog.class.php: Returns the log entry for an order's original completed payment, or `null` if the order was never paid through a logged, gateway-processed transaction (e.g. bank transfer).
- files/lib/data/product/AccessibleProductList.class.php: Creates a new AccessibleProductList object.
- files/lib/data/product/HistorySavingProduct.class.php: fetch the data of the latest edit; the edit history is kept per language version, see HistorySavingProductContent
- files/lib/data/product/LikeableProductProvider.class.php: fetch products; set message; check permissions; short output; output
- files/lib/data/product/Product.class.php: ensure array for safe access; every displayed price needs the customer for its tax, so use the per-request lookup; the customer sees what he pays: the net surcharge with the tax of the product; getHighestProductVersion() is genuinely nullable for a product without any version;; PHPStan mis-resolves fetchObject()'s `@return ?T` as non-null here.
- files/lib/data/product/ProductAction.class.php: update user's product counter; fire activity event; update watched objects; mark obsolete notifications as confirmed; mark product notifications as read; reset storage; notifications are only relevant for logged-in users; notifications are only relevant for logged-in users; publish products; decrease user product counter; remove user activity events; get delete notes; all labels, also those the active user may not see, so that the log and `hasLabels` are complete; update `hasLabels` flag; log adding new labels; one entry per changed label group: set, replaced or removed; sort labels by label group show order
- files/lib/data/product/ProductEditor.class.php: delete old authors; save authors
- files/lib/data/product/TaggedProductList.class.php: Creates a new TaggedProductList object.
- files/lib/data/product/ViewableProduct.class.php: cache does not exist or is outdated; update storage data; cache does not exist or is outdated; a product that fell out of the "new products" list because it is no longer; new must not keep inflating this count, or it could never be marked as read; update storage data
- files/lib/data/product/ViewableProductList.class.php: last visit time; subscriptions; get product content; preload the option values of all products with a single query; preload the last version and the icon of all products, lists show them for every product; load deletion data
- files/lib/data/product/content/ProductContentAction.class.php: delete tag to object entries; delete entry from search index
- files/lib/data/product/licence/ProductLicenceAction.class.php: Changes end, start of updates and support and the note of licences by hand (ACP); the history keeps what changed and why, support end and update window follow the new start. the staff is not bound to the limits of the customer
- files/lib/data/product/licence/ProductLicenceList.class.php: Creates a new ProductVersionList object.; add conditions
- files/lib/data/product/list/widget/ProductListWidget.class.php: Returns the internal widget name.; Returns the language item describing the widget type (e.g. for use in the ACP list).
- files/lib/data/product/option/ProductOptionEditor.class.php: Creates a user group for the product, creates the corresponding language items, assigns all existing customers to the group and stores the group reference in the product. create language items; insert all existing customers into the usergroup
- files/lib/data/product/option/category/ProductOptionCategory.class.php: Returns the internal category name.
- files/lib/data/product/review/ProductReview.class.php: Returns the display username of the review author. Anonymous reviews return a generic label instead of the author's username.
- files/lib/data/product/review/ProductReviewAction.class.php: handle ip address; prepare review message; save review; update attachments; register embedded objects; update product statistics
- files/lib/data/product/review/ViewableProductReviewList.class.php: reviews; embeedes objects
- files/lib/data/product/review/response/ProductReviewResponseAction.class.php: handle ip address; prepare message; create response; reload because reviewID is the primary key (no auto increment)
- files/lib/data/product/tab/ProductTab.class.php: Represents a product sub-page ("Unterseite"): a WYSIWYG tab shown on the product page, owner-managed like a version, optionally restricted to licence holders of the product. Whether the current user may see this tab's content: public tabs always, licence-holder-only tabs only for an owned licence or someone who may edit the product.
- files/lib/data/product/version/ProductVersion.class.php: Author always allowed; Free products; Commercial product: check paid status; guests own no licences; Checks without cache whether the user owns this version or a later one up to the next chargeable version that the update window of a valid licence covers. If requested version <= owned → allow; Check next chargeable version
- files/lib/data/product/version/ProductVersionAction.class.php: Inject versionFileID (file upload); Inject user; Save product version; content; loop through all languages; save embedded objects; check for quotes; check for mentions; send notifications for quotes; get user profiles; ignore self-quoting; fire event; send notifications for mentions; resolve the uploaded file before update(); never overwrite an existing file with an empty value; log changes; embedded objects; remove obsolete contents; cleanup quotes; Collect decorated objects and clean up related data before deletion.; Now re-evaluate lastVersionID for each affected product.; parse template
- files/lib/event/discount/DiscountableLineTotalCalculating.class.php: Requests the amount of a cart item a discount applies to. Listeners can adjust it, e.g. to discount the regular price of a subscription whose first period is free.
- files/lib/event/order/OrderAnswersChanged.class.php: The answers to the order questions of an order were changed after the order was placed, by the customer (until the payment) or by staff. A plugin that already acted on the old answers can follow the change.
- files/lib/event/order/OrderAnswersSaved.class.php: An order was placed and the answers to its order questions are stored; they can be read with `Order::getAnswers()`. Fires inside the transaction of the order, before the payment, so a listener that fulfils the order waits for `OrderProductPaymentReceived` instead.
- files/lib/event/order/OrderCustomerNoteEditableChecking.class.php: Asks whether the customer may still change the note of an order. Any listener can deny it, e.g. once the parcel label was created.
- files/lib/event/order/OrderPaymentMethodsResolving.class.php: Requests the payment methods offered for paying an order. Listeners can restrict them and request that the payment method is stored for later charges (vaulting), e.g. for recurring billing.
- files/lib/event/order/OrderQuestionAnswerValidating.class.php: The answers to the order questions of the checkout passed the standard checks. A listener can add errors of its own (for example "this address is taken"); the buyer sees them next to the question.
- files/lib/event/order/OrderTotalCalculating.class.php: Requests the final totals of a newly created order. Listeners can adjust the totals, e.g. to add shipping costs.
- files/lib/event/page/ProductPageAssigningVariables.class.php: Is fired when the product page assigns its template variables, so that plugins can add their own (for example the system behind the support of the product).
- files/lib/form/CartForm.class.php: one order starts one subscription per offering, see UpdateCartItemQuantity; one field for both: a value voucher pays, a discount code lowers the price
- files/lib/form/CheckoutOverviewForm.class.php: guests prove they are human right before the order is placed, not before they may look at the cart;; discount codes in the cart are guarded by the flood control of DiscountEngine; Returns the suggestion of a customer field, or of one of the combined sources "name" (company of a business buyer, else first and last name) and "address" (the full postal address), so the buyer never types twice what he entered under personal data. "country=DE": "1" if the buyer lives in that country, for a yes/no question such as "based in Germany"; the order copies the answers from the cart; paid in full with value vouchers: nothing is left for a payment method
- files/lib/form/CheckoutPaymentForm.class.php: nothing left: say why instead of an empty page; paid in full with value vouchers: nothing to choose (the order keeps the first allowed way to pay); Label of a payment option with the logos of what the buyer pays with (PaymentOptionLogos), never of the provider. The name is shown only without a logo, otherwise it would appear twice (#809).
- files/lib/form/LicenceTransferForm.class.php: no form object (this form is `AbstractFormBuilderForm<null>`), so the id would be lost on a validation error; validate() ran the field validator (recipient resolved or rejected) before save() is ever reached
- files/lib/form/MyAccountForm.class.php: one page with a section per category instead of tabs: required fields must never hide in a tab the buyer; did not open; a category without a single visible option would be an empty section; Apply defaultValue fallback
- files/lib/form/OrderAnswersEditForm.class.php: a guest has no user ID, an order without a customer account must never match him
- files/lib/form/OrderCancellationForm.class.php: Older orders may have no order number, but customers still have the invoice number.
- files/lib/form/OrderClaimForm.class.php: the token from the confirmation mail has to survive the submit
- files/lib/form/OrderCustomerNoteEditForm.class.php: Order::getLink() intentionally points to the ACP order page (see; its own docblock) — not a link a customer should be sent to.
- files/lib/form/ProductAddForm.class.php: group permissions user.shop.maxStartedProductsPer24Hours and user.shop.floodControlTime; general; Category selection; Icon fields; Label fields; Authors; Edit reason; options (non-ml); Once a product manages multiple versions, the first version's file and; version string are edited via the dedicated version management instead.
- files/lib/form/ProductEditForm.class.php: Monolingual; Multilingual; multilingual; non multilingual
- files/lib/form/ProductTabAddForm.class.php: Creates a new product sub-page ("Unterseite") - a WYSIWYG tab shown on the product page, owner-managed like a product version (FormBuilder).
- files/lib/form/ProductVersionAddForm.class.php: Version field; Censorship; Unique-Check; IsChargeable; DisableVersion; WYSIWYG
- files/lib/form/VoucherBalanceForm.class.php: Shows the balance of a value voucher to everybody who has its code (also the recipient of a present). Wrong codes are counted, too many in a short time block the form, so codes cannot be guessed. nothing is stored: the result is shown with the form
- files/lib/page/CheckoutPaymentProcessPage.class.php: value vouchers paid a part of the total, the gateway is asked for the rest only
- files/lib/page/OfferPage.class.php: Shows the customer (or guest, through the offer's token) what is in the offer and, while it is still payable, the button that pays it (see {@see \shop\system\endpoint\controller\shop\offers\PayOffer}).
- files/lib/page/ProductLicenceListPage.class.php: the product is part of the URL: links, canonical URL and sorting/paging must keep it
- files/lib/page/ProductListPage.class.php: Creates the list views for all active, configured widgets. A tab group carries its active child widgets as tabs, a child widget is only shown inside its group.
- files/lib/page/ProductPage.class.php: schema.org Product/Offer/AggregateRating structured data (JSON-LD), rendered in product.tpl. See buildStructuredData(). Load tags; Reviews; Labels; Likes; Load all ProductOptions; Og/meta tags etc.
- files/lib/page/TcPage.class.php: Rendered content, including the table of contents that WCF's message rendering pipeline prepends automatically (same as for articles/posts).
- files/lib/page/WithdrawalNoticePage.class.php: Rendered content, including the table of contents that WCF's message rendering pipeline prepends automatically (same as for articles/posts).
- files/lib/system/SHOPCore.class.php: add product; add category; add parent categories
- files/lib/system/attachment/ProductTabAttachmentObjectType.class.php: Attachment object type implementation for product tabs ("Unterseiten"); download/preview additionally respects the tab's own visibility (public vs licence-holders-only).
- files/lib/system/box/CategoriesBoxController.class.php: get categories; get active category
- files/lib/system/cache/tolerant/StatisticsCache.class.php: some providers (e.g. the tax report) read the basis (order date / payment date) from the request; instead of from the period; keep it in sync so a rebuild (including the background job) matches this cache entry
- files/lib/system/cart/CartQuantityCache.class.php: a guest cart can only be modified by its own session
- files/lib/system/category/ShopCategoryType.class.php: delete products with no categories
- files/lib/system/comment/manager/ProductCommentManager.class.php: fetch response; deleted responses are missing from the cache; fetch comments; fetch users; set message; comment like; short output; output; response like; short output; output
- files/lib/system/cronjob/DiscountAutomationCronjob.class.php: Sends a cart abandonment reminder email to the cart owner, optionally mentioning a personal discount code that was created for them.
- files/lib/system/cronjob/OrderAnswerRetentionCronjob.class.php: Deletes the answers to order questions that have a retention period once their order is older than that, together with what the change log kept of them.
- files/lib/system/cronjob/ReadYourecomAPICountryCronjob.class.php: Read yourecom.de json; get countries; update own countries; insert country; update title; create language items
- files/lib/system/cronjob/ReadYourecomAPICurrencyCronjob.class.php: Read yourecom.de xml; get currencies; update own currencies; insert currency; update title; create language items; exchange rates were written directly, so the cached currencies are stale now
- files/lib/system/cronjob/VatIdRevalidationCronjob.class.php: nothing to check, but it must not block the queue: push it to the back like a checked one; VIES seems unavailable: the remaining customers stay the oldest and come first in the next run
- files/lib/system/discount/DiscountManager.class.php: Finds active discounts that conflict with the given (not necessarily persisted) discount definition, e.g. for showing warnings in the ACP before saving. read inside the transaction and locked: two parallel reversals must not both count the same amount
- files/lib/system/discount/simulation/SimulatedCartItem.class.php: Creates a simulated cart item from raw cart item data.
- files/lib/system/endpoint/controller/shop/mailEvents/TestSendMailEvent.class.php: Sends the event's current (saved) text to the acting staff member's own address, using the most recent real order for the placeholders - so they can check how a customized text actually reads before relying on it.
- files/lib/system/endpoint/controller/shop/offers/PayOffer.class.php: The customer (or guest, through the offer's own token) pays the offer: a real order is created and the customer is sent on to the normal payment method chooser for it.
- files/lib/system/endpoint/controller/shop/orderCreditNotes/VoidOrderCreditNote.class.php: Voids the credit note with the given ID. The record and its PDF are kept for bookkeeping purposes; only its status changes.
- files/lib/system/endpoint/controller/shop/orders/BookInvoicePayment.class.php: under the order lock, so a dunning cancellation or a second click cannot run at the same time
- files/lib/system/event/listener/CustomerVatIdListener.class.php: Re-checks the given (possibly just-changed) VAT ID against VIES and persists the result. An empty VAT ID always clears the validated flag without calling VIES.
- files/lib/system/event/listener/GuestCartUserLoggedInListener.class.php: Attaches the session cart to the authenticated user or merges it into an existing user cart.; only scalar entries (codes, ids) can be compared by array_unique()
- files/lib/system/event/listener/MembersListViewInitializedListener.class.php: Adds the product count sort field.
- files/lib/system/event/listener/OrderRefundGatewayListener.class.php: Refunds an order marked as refunded in the ACP: a credit note for everything not credited yet goes into the register and refunds what the payment gateway got. Without an invoice the gateway refunds the whole payment.
- files/lib/system/event/listener/ShopAcpMenuItemCollectingListener.class.php: Registers all shop items the current user may see.
- files/lib/system/event/listener/UserListBoxControllerListener.class.php: only consider users with at least one product
- files/lib/system/form/builder/ProductOptionFormFieldFactory.class.php: Collects the options a field can depend on.
- files/lib/system/form/builder/container/ProductFeaturesFormContainer.class.php: Collect validated core field values and remove them from the product table payload.
- files/lib/system/form/builder/data/processor/ProductContentFormDataProcessor.class.php: field suffix per language version: "_de" etc., none without multilingualism
- files/lib/system/form/builder/data/processor/ProductOptionFormDataProcessor.class.php: Collects the options of the form. multiple selections (checkboxes) are stored outside of `data`, one value per line
- files/lib/system/form/builder/field/OrderAnswerEditFormField.class.php: submitted without any value (all optional checkboxes unchecked)
- files/lib/system/form/builder/field/OrderQuestionAssignmentFormField.class.php: Form field of the product form that assigns order questions to the product: per question whether it is asked, whether it is required, and where it comes in the order.
- files/lib/system/gridView/ProductLicenceGridView.class.php: Sets up the columns for the licences of the product.
- files/lib/system/gridView/admin/DiscountCodeGridView.class.php: Initializes the grid view for the given discount campaign.
- files/lib/system/gridView/admin/OpenInvoiceGridView.class.php: The purchases on invoice that are granted but not paid: what is owed, by when, which reminder was sent. "Payment booked" pays the order. the interaction "book payment" asks every row for its status: one query for all
- files/lib/system/gridView/admin/OrderGridView.class.php: Initializes columns, filters and interactions for the ACP order list.
- files/lib/system/gridView/renderer/DiscountCodeAssignedUserColumnRenderer.class.php: Keeps the column empty when a code is not assigned to a user.
- files/lib/system/gridView/renderer/LicenceKeyColumnRenderer.class.php: a dash, not an empty cell: the row link of the ACP list needs a text
- files/lib/system/gridView/renderer/LicenceOffersColumnRenderer.class.php: the language item escapes the title already
- files/lib/system/gridView/renderer/LicenceRenewColumnRenderer.class.php: a licence with an end is renewed as a whole, the support comes with it
- files/lib/system/gridView/renderer/ProductOptionCategoryFieldsColumnRenderer.class.php: Renders the product options (input fields) assigned to a product option category as a comma-separated list of their translated titles.
- files/lib/system/interaction/admin/DiscountCodeAddInteraction.class.php: Registers the voucher code creation action for code based discounts.
- files/lib/system/interaction/admin/DiscountCodeListInteraction.class.php: Registers the voucher code list action for code based discounts.
- files/lib/system/interaction/admin/DiscountInteractions.class.php: Registers the ACP context menu actions for discounts.
- files/lib/system/interaction/bulk/user/ProductBulkInteractions.class.php: The bulk interactions of the product lists and the trash, they replace the clipboard actions. Each interaction is offered with the same permission and state rules that `ProductAction` validates. Adds the interactions the active user may use.
- files/lib/system/interaction/user/MyLicenceTransferInteractions.class.php: What a customer can do with a licence transfer request in "My transfer requests": the requester may cancel it, the recipient may accept or decline it.
- files/lib/system/invoice/InvoiceAllowance.class.php: Describes the allowance and the tax group it reduces.
- files/lib/system/invoice/InvoiceAmounts.class.php: Calculates the amounts of the lines, allowances and charges in one currency.
- files/lib/system/invoice/InvoiceCharge.class.php: Describes the charge and the tax group it increases.
- files/lib/system/invoice/InvoiceLine.class.php: Describes the line; the net amounts follow from the gross total in `InvoiceAmounts`.
- files/lib/system/invoice/InvoiceParty.class.php: Describes the party; the country code (ISO 3166-1 alpha-2) is the only mandatory part of the address.
- files/lib/system/invoice/InvoiceSequence.class.php: Finds holes in the invoice numbers of a period: the numbers are gapless by law (GoBD), a missing number is a case for the accountant. A number is read as a prefix and a running number at the end (`INV-2026-000009`: prefix `INV-2026-`, number 9, six digits); numbers with different prefixes are separate sequences. The first and the last number of a sequence in the period are the limits, what lies before or after is not asked about.
- files/lib/system/invoice/InvoiceTexts.class.php: The free texts of the invoice (additional text under the totals, footer line): `{orderNumber}`, `{invoiceNumber}`, `{date}` and `{total}` are replaced by the values of the order, unknown placeholders stay as they are.
- files/lib/system/legal/LegalDocumentPdf.class.php: The terms and conditions and the information on the right of withdrawal as PDF files: for the download on the pages and as attachments of the order confirmation (the customer gets them on a durable medium). A PDF is made once per text and language and kept in the billing directory under a name that contains a hash of what is in it, so a changed text gives a new file and the old ones stay valid for the mails that refer to them. What was sent with an order is recorded (`shop1_order_legal_document`: document, language, hash), so it can be shown later which version the customer received.
- files/lib/system/licence/LicenceDomains.class.php: Domains a licence is used on (option `licenceDomains`: `optional` or `required`, at most `licenceDomainLimit`). The customer binds and changes them in "My licences" (`licenceDomainChanges` removals per year), the licence check binds the first domains itself. Development domains (localhost, *.test, staging.…) never count, domains on the blacklist (option `shop_licence_domain_blacklist`) are never accepted. Checks a new set of domains for the licence; returns the error (`invalid`, `blacklisted`, `limit`, `changes`) or '' and the normalized domains.
- files/lib/system/licence/LicenceExpiryReminder.class.php: Reminds customers that a licence of a shop order ends, in stages (option `shop_licence_expiry_reminder_days`, e.g. "30, 7"), each stage once per end; a renewal moves the end and starts the stages again. The notification links to the product, where the licence can be renewed. Returns the stage (1-based) that is due for a licence, 0 if none: the latest stage whose time has come and that was not sent for this end yet. the stage due now, in SQL, so licences already reminded for it do not fill the batch
- files/lib/system/licence/LicenceKeys.class.php: Licence keys of products (option `licenceKeyMode`): `generated` creates a random key from a pattern for every licence, `pool` hands out keys the staff imported. Every licence gets its key when it is created (`ProductLicenceAction`); a key is never handed out twice, a new key blocks the old one. Creates a key from a pattern: `X` is a random letter or digit, `9` a random digit, everything else stays. A pattern with too few random characters gets more at its end. the next shortage warns again; Returns how many new licences of the product (cart types `price` and `upgrade`) can get a key, `PHP_INT_MAX` if keys are not limited. Gives the licence its key (nothing if the product hands out none or the licence has one). Returns the key, empty if there is none (empty pool: the staff is told). without a new key the old one stays valid; Whether the customer may get a new key for the licence now: their own valid licence with a key, at most `REISSUE_LIMIT` times in 30 days.
- files/lib/system/licence/LicenceLog.class.php: The history of a licence: what the staff, the customer or the shop did with it (`shop1_product_licence_log`) together with the purchase and the renewals and upgrades of orders (`shop1_product_licence_change`). Notes an action on a licence by the acting user (none in a cronjob). `$changes` holds the changed fields as [old, new]. the newest first, within the same second the later entry
- files/lib/system/licence/LicenceOffers.class.php: What a customer can buy for a licence they own: upgrades to other products and add-ons they do not own yet. Shown in "My licences", the links lead to the purchase box of the product. one list for all, and the same product objects (with their purchase rules) for every licence of the page
- files/lib/system/licence/LicencePurchase.class.php: Purchases that act on licences the customer owns already, as cart types beside the regular purchase (`price`): - `update`: the newest version for licences that have none (see {@see \shop\system\order\OrderFulfillment}), - `renewal`: extends ended or ending licences by the licence term (option `renewalPrice`), - `upgrade`: buys this product in exchange for a valid licence of one of the products in `upgradeFrom` (option `upgradePrice`); the old licence ends, the new one is a regular licence of the order. Renewals and upgrades note what they changed in `shop1_product_licence_change`, a cancellation or a credit note takes it back with {@see self::revert()}. Returns the end of a licence renewed at the given time: the term is added to the old end, or to now if it has ended already, so renewing early loses nothing. Returns the licences of the user for the product that a renewal can extend: those with an end, the first to end first. Returns the valid licences of the user for the given products that an upgrade can take, the first to end first (licences without an end last). the renewal starts support and update window again, like an update purchase does; Ends as many licences of the upgraded products as the item upgrades; the new licences are created like the ones of a regular purchase. Returns how many old licences it ended, as many new ones are due. Returns how many units of upgrades that take licences of the given products the user has in orders not granted yet and, for other target products than the given one, in the cart: one old licence is exchanged only once. Returns the other orders whose upgrades exchanged licences of this order: their price counted these licences, a refund of this order would pay the credit out a second time. Takes back what renewals and upgrades of the order (or of one item, up to the given quantity) changed on licences, the newest change first. a later change (another renewal) built on this one: only this one's extension goes, the later one stays
- files/lib/system/licence/LicenceSignature.class.php: Signs licence answers and licence files with Ed25519, so software can check them offline with the public key of the shop (shown in the ACP licence list). The key pair is created on first use and kept in the registry. the registry does not cache a value set for a package without stored values yet
- files/lib/system/licence/LicenceTerms.class.php: The term of a licence bought in the shop: how long it is valid (`licenceDuration`, 0 = unlimited) and up to when it gets new versions (`updateAccess`: unlimited, like the support period, an own period or none after the purchase). An expired licence downloads nothing; versions released after `updatesUntil` need an update purchase. Only licences of a shop order have a term, licences of a subscription or added by hand last as long as they exist. Returns up to when a licence gets new versions, 0 = unlimited. `$from` is the purchase or the newest update purchase, `$supportEndsAt` the end of its support period (0 = no end). Returns the widest update window of the valid licences of the user for the product: 0 = unlimited, -1 = none of them is valid.
- files/lib/system/licence/LicenceTransfer.class.php: Transfers a licence to another registered user (product option `licenceTransfer`): `none` (off), `approval` (staff decides first) or `automatic` (goes straight to the recipient). An optional fee (`transferPrice`) is a cart line like a renewal or an upgrade (cart type `transfer`, {@see \shop\system\product\ProductPricing::NATIVE_CART_TYPES}), charged to the requester before the recipient is asked; it is never refunded, whatever the outcome. State machine (see {@see ProductLicenceTransfer} for the `STATUS_*` constants): a request starts at `pendingApproval` (mode `approval`) or skips straight to `pendingPayment` (a fee is due) or `pendingAcceptance` (neither). Staff approval, once given, leads to `pendingPayment` or `pendingAcceptance` the same way. From `pendingAcceptance` the recipient accepts (the licence moves: owner, domains, user group) or declines. The requester may cancel at any point before the recipient has decided; staff may reject only while `pendingApproval`. Licences linked to a subscription (`shop1_subscription_licence`, the subscription keeps paying the original customer) or already used up by an upgrade cannot be transferred. Resolves a recipient by username or email; never the given user themselves, never a user who owns the licence already (nothing to transfer). Whether the licence can be transferred by the given user now: theirs, valid, not linked to a subscription, not used up by an upgrade, the product allows it, and no transfer of it is already under way. Returns the status a fresh request starts at: staff decides first in `approval` mode, otherwise it goes straight to payment (a fee is due) or to the recipient. Returns the status a request moves to once staff approves it (or, in `automatic` mode, the status it starts at): payment if a fee is due, otherwise straight to the recipient. Creates the transfer request, in its first status, and notifies whoever acts next (staff, the recipient, or nobody yet if the requester still has to pay). The recipient accepts: the licence changes hands, its domains are cleared (the new owner binds their own), and the shop's user group of the product follows, like a purchase or a cancellation would move it. the licence is gone or changed hands in the meantime (another transfer, staff edit): nothing to move; Whether the licence is already used up by an upgrade (no renewal, no transfer: the owner does not really have it any more). Whether the licence belongs to a subscription: it is kept paid and granted by the subscription, a transfer would leave the subscription billing one customer for a licence that lives with another. Moves the shop's user group of the product from the old owner (if they have no other licence of it left) to the new one (if they do not have it already). the recipient keeps every group he is in: without `deleteOldGroups` => false the core replaces all of them (staff and; forum groups included) with this one and the defaults; Tells whoever acts on the request's current status: staff (`pendingApproval`), the recipient (`pendingAcceptance`), or the requester (every terminal status); nobody while `pendingPayment` (the requester is sent straight to the checkout instead). STATUS_PENDING_PAYMENT (the requester goes straight to the checkout) and STATUS_CANCELED (the requester; canceled it themselves, nothing to tell them) notify nobody
- files/lib/system/licence/LicenceUpdateNotice.class.php: Tells the licence holders of a product about its new version: holders whose licence includes it can download it (`available`), holders without update access get the update purchase offered (`update`), holders whose licence has ended get the renewal offered (`renewal`). Each holder hears once per version; what was sent is kept in `shop1_product_version_notice` for the statistics ("renewed after an update notice"). Only the newest version of a product is announced, half an hour after its release (time to correct a mistake), and only within a week, so imported or older versions stay silent. mark first: a failing notice must not repeat for every run
- files/lib/system/licence/LicenceVerification.class.php: The answer of the licence check for software (`LicenceVerifyAction`) and the signed licence file: whether a key is valid on a domain, with term, update window and support. Unknown keys get no details. Checks the key on the domain (binds the domain on first use) and returns the signed answer. `$productID` limits the check to one product (keys of different products' pools may be equal). the answer goes to whoever knows the key: no name of the customer; the newest version and whether the update window of the licence covers it
- files/lib/system/licence/UpgradeCredit.class.php: The upgrade price "difference" (option `upgradePriceMode`): the regular price of the new product minus what is left of the old licence, at least the upgrade price. What is left is the net price paid for the old licence, for a licence with a term in proportion to the time it still runs. Returns what is left of a licence bought for the given net price: all of it without a term, otherwise the share of the term that is still to come. The lowest credit of the licences an upgrade can take: every unit of the line gets the same price, so no unit is credited more than the licence it exchanges is worth. What is left of one licence: what was paid for it (after order discounts) in a paid order not credited back, for a licence with a term in proportion to the time it still runs. Licences without a paid order are worth nothing. only money that came in counts: no open invoice, nothing given back by a credit note
- files/lib/system/listView/AbstractProductListWidgetItemsView.class.php: widgets are showcases, products are moderated in the regular product lists
- files/lib/system/listView/ProductLogListView.class.php: the list is a UNION without table alias, so columns are unqualified
- files/lib/system/listView/UserProductListView.class.php: Creates the list view for the given user's products.
- files/lib/system/mail/MailEventRegistry.class.php: The order-related mail events that can be switched off, redirected or have their text customized in the ACP (Vorlagen je Ereignis). Every one of them already goes through {@see \shop\system\order\OrderStatusMail} or Deliberately scoped to the `order.*` mails (the vast majority, and all of the outbox-integrated ones from Teil a): voucher, credit note, cart-abandonment, guest-account and offer mails are not yet configurable here. The placeholders available in a customized subject/message, the same for every event: plain strings, not live objects, so a customized text can never reach beyond what the admin was shown in the editor. Returns the `shop.mail.<suffix>.subject`/`.message` phrase suffix for a mailKey (the `order.` prefix, which only exists for the outbox/mailKey namespace, is not part of the phrase name).
- files/lib/system/mail/MailEventSettings.class.php: Reads and writes the per-event mail settings (Vorlagen je Ereignis): on/off, a recipient/sender override, and a customized subject/message per language. A missing row of either table means "use the built-in default".
- files/lib/system/mail/MailResender.class.php: Resends an outbox entry by rebuilding it from the current data (not a byte-for-byte copy of what went out the first time - e.g. a changed billing address is picked up). Only order-related mails (the vast majority of shop mails) can be resent this way for now; everything else is outbox-only, see `vergleich-viecode.md`. Rebuilds and resends the mail; throws {@see UserInputException} if it cannot be resent (not an order mail, or the order is gone).
- files/lib/system/mail/PlaceholderRenderer.class.php: Substitutes the plain-string placeholders ({@see MailEventRegistry::PLACEHOLDERS}) in a customized mail subject or message. Deliberately `strtr()`, not a template engine: an admin-authored text can never execute code or reach beyond the values computed here, however it is written.
- files/lib/system/moderation/DeletedProductListViewProvider.class.php: The trashed products on the page with the deleted content of the moderation, with the bulk interactions of the product lists. Uses the identifier and phrases of the former object type `de.yourecom.shop.product`.
- files/lib/system/moderation/queue/AbstractProductVersionModerationQueueHandler.class.php: fetch version id for each version; fetch products
- files/lib/system/offer/OfferManager.class.php: An admin-created quote (`Offer`): the admin adds products and/or free-text line items with their own tax category, an optional discount and an expiry date, for a registered customer or a guest email. The customer gets a link and pays with any allowed payment method; only once paid does a real {@see Order} exist (built through the normal Simplification (documented, not a bug): every line's tax uses its tax category's home-country `fallbackRate` at `TaxMode::NORMAL`, not the full OSS/cross-border resolution a normal cart uses — an offer is created before any customer address is known. Fine for the common domestic case; a cross-border offer needs a manual tax check. Cart/order item type an offer line becomes: deliberately not in `ProductPricing::NATIVE_CART_TYPES`, so `OrderEditor::importCart()` uses the item's own stored `price`/`taxRate`/`taxCategoryID` as-is instead of resolving …
de.yourecom.shop
6.2
-2.448 Löschungen +699 Hinzufügungen 3.147 Gesamt 300 Dateien
|