<freeStyleBuild _class='hudson.model.FreeStyleBuild'><action _class='hudson.model.ParametersAction'><parameter _class='hudson.model.StringParameterValue'><name>TARGET_HOST</name><value>192.168.12.68</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>BRANCH</name><value>dev</value></parameter></action><action _class='hudson.model.CauseAction'><cause _class='hudson.model.Cause$RemoteCause'><shortDescription>Started by remote host 127.0.0.1</shortDescription><addr>127.0.0.1</addr></cause></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesorigindev _class='hudson.plugins.git.util.Build'><buildNumber>4</buildNumber><marked><SHA1>bf69e20f22003bbc73714edec19512152cea83bd</SHA1><branch><SHA1>bf69e20f22003bbc73714edec19512152cea83bd</SHA1><name>refs/remotes/origin/dev</name></branch></marked><revision><SHA1>bf69e20f22003bbc73714edec19512152cea83bd</SHA1><branch><SHA1>bf69e20f22003bbc73714edec19512152cea83bd</SHA1><name>refs/remotes/origin/dev</name></branch></revision></refsremotesorigindev></buildsByBranchName><lastBuiltRevision><SHA1>bf69e20f22003bbc73714edec19512152cea83bd</SHA1><branch><SHA1>bf69e20f22003bbc73714edec19512152cea83bd</SHA1><name>refs/remotes/origin/dev</name></branch></lastBuiltRevision><remoteUrl>https://github.com/younex1/erp-nuxt-frontend.git</remoteUrl><scmName></scmName></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><building>false</building><displayName>#4</displayName><duration>586011</duration><estimatedDuration>593163</estimatedDuration><fullDisplayName>erp-frontend-deploy-instance #4</fullDisplayName><id>4</id><inProgress>false</inProgress><keepLog>false</keepLog><number>4</number><queueId>5888</queueId><result>SUCCESS</result><timestamp>1793034500623</timestamp><url>https://jenkins.younex.de/job/erp-frontend-deploy-instance/4/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/offers/conditions/index.post.ts</affectedPath><affectedPath>app/components/offers/QuoteModal.vue</affectedPath><affectedPath>server/api/settings/software-catalog/lists.get.ts</affectedPath><affectedPath>app/composables/useOfferSoftwareQuote.ts</affectedPath><affectedPath>server/api/offers/quote/preview.post.ts</affectedPath><affectedPath>app/pages/settings/software-catalog/index.vue</affectedPath><affectedPath>reference/template-cleanup/01-idempiere-truncate.sql</affectedPath><affectedPath>app/utils/softwareCatalogDefaults.ts</affectedPath><affectedPath>server/utils/chatAccess.ts</affectedPath><affectedPath>app/pages/users/leads/[id]/edit.vue</affectedPath><affectedPath>server/api/settings/software-catalog/seed.post.ts</affectedPath><affectedPath>reference/template-cleanup/README.md</affectedPath><affectedPath>app/components/offers/SoftwareQuoteModal.vue</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><affectedPath>server/api/settings/software-catalog/save.post.ts</affectedPath><affectedPath>server/api/settings/software-catalog/seed-lists.post.ts</affectedPath><affectedPath>app/components/leads/ChatConsoleModal.vue</affectedPath><affectedPath>server/api/offers/software-catalog/index.get.ts</affectedPath><affectedPath>reference/test-scripts/software-catalog-seed-lists.mts</affectedPath><affectedPath>server/utils/offers/softwareCatalog.ts</affectedPath><affectedPath>.claude/rules/offers/software-quote.md</affectedPath><affectedPath>app/composables/menu/admin/sales.ts</affectedPath><affectedPath>app/components/MainNavigationMenu.vue</affectedPath><affectedPath>server/utils/offers/softwareQuotePdf.ts</affectedPath><affectedPath>server/api/offers/quote/send.post.ts</affectedPath><commitId>7247b7d3b3973109586dfc39741d445d9fa06b91</commitId><timestamp>1793023127000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Software offer type "LogShip Cloud" + maintainable catalog in iDempiere

Second offer type next to the 3PL fulfillment quote on the lead page: a SaaS
offer for the LogShip Cloud product with its own modal (packages, overage
staffel, feature matrix, add-ons, onboarding package with phases/highlights,
positions, requirements, texts) and branded PDF (package card, prices, 4–5
column package comparison, onboarding section, example calculation). Header
switch "Fulfillment | LogShip Cloud" in both modals; offers/quote preview+send
branch on payload.offerType, conditions saved as offer_conditions.softwareQuote.

Catalog persisted in iDempiere (CUST_SoftwarePlan / CUST_SoftwareCatalogItem,
enum columns as AD_Reference lists): server util with 5-min cache and fail-soft
defaults, routes for read / lists / whole-catalog save / seed / seed-lists,
staff gate option requireChat=false. Settings → Software-Katalog is a matrix
editor (packages = columns, features = rows, click cell = minimum package,
mode pill, drag &amp; drop rows/columns, inline rename, details panel, add-ons
list, one save) — linked from Sales in both menus. Offers carry a catalog
snapshot so old PDFs stay reproducible.

Also: backdrop close only on a real backdrop click (both offer modals), feature
rows no longer squeezed by the global select width, dark-mode styling for the
catalog page, the KI console and the offer modals, template clean-up keeps the
two new tables, recipe .claude/rules/offers/software-quote.md.
</comment><date>2026-10-26 14:58:47 +0100</date><id>7247b7d3b3973109586dfc39741d445d9fa06b91</id><msg>Software offer type "LogShip Cloud" + maintainable catalog in iDempiere</msg><path><editType>edit</editType><file>app/components/offers/QuoteModal.vue</file></path><path><editType>edit</editType><file>app/composables/menu/admin/sales.ts</file></path><path><editType>edit</editType><file>app/components/MainNavigationMenu.vue</file></path><path><editType>add</editType><file>.claude/rules/offers/software-quote.md</file></path><path><editType>add</editType><file>app/composables/useOfferSoftwareQuote.ts</file></path><path><editType>add</editType><file>server/api/settings/software-catalog/save.post.ts</file></path><path><editType>add</editType><file>server/api/settings/software-catalog/lists.get.ts</file></path><path><editType>add</editType><file>server/utils/offers/softwareQuotePdf.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>add</editType><file>app/utils/softwareCatalogDefaults.ts</file></path><path><editType>edit</editType><file>app/pages/users/leads/[id]/edit.vue</file></path><path><editType>edit</editType><file>app/components/leads/ChatConsoleModal.vue</file></path><path><editType>edit</editType><file>server/api/offers/quote/preview.post.ts</file></path><path><editType>add</editType><file>server/api/offers/software-catalog/index.get.ts</file></path><path><editType>add</editType><file>server/api/settings/software-catalog/seed-lists.post.ts</file></path><path><editType>edit</editType><file>server/api/offers/quote/send.post.ts</file></path><path><editType>add</editType><file>reference/test-scripts/software-catalog-seed-lists.mts</file></path><path><editType>add</editType><file>server/api/settings/software-catalog/seed.post.ts</file></path><path><editType>edit</editType><file>server/api/offers/conditions/index.post.ts</file></path><path><editType>add</editType><file>app/pages/settings/software-catalog/index.vue</file></path><path><editType>add</editType><file>app/components/offers/SoftwareQuoteModal.vue</file></path><path><editType>edit</editType><file>reference/template-cleanup/README.md</file></path><path><editType>edit</editType><file>server/utils/chatAccess.ts</file></path><path><editType>edit</editType><file>reference/template-cleanup/01-idempiere-truncate.sql</file></path><path><editType>add</editType><file>server/utils/offers/softwareCatalog.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/utils/offers/softwareQuotePdf.ts</affectedPath><affectedPath>app/composables/useOfferSoftwareQuote.ts</affectedPath><affectedPath>app/components/offers/SoftwareQuoteModal.vue</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>e41d3f6dc8550eda20b6a57c1a42ccba2ca35f50</commitId><timestamp>1793024418000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>LogShip offer: onboarding package marked optional, "ab" price, travel costs excluded

The onboarding package prints as optional with an "ab 3.250 €" starting price
(final fixed price after the kickoff) and a note that travel and accommodation
costs for on-site appointments are billed as incurred — in the price table, the
onboarding section, the example calculation and the Hinweise. Both aspects are
per-offer switches in the modal (default on) and persist with the conditions.
</comment><date>2026-10-26 15:20:18 +0100</date><id>e41d3f6dc8550eda20b6a57c1a42ccba2ca35f50</id><msg>LogShip offer: onboarding package marked optional, "ab" price, travel costs excluded</msg><path><editType>edit</editType><file>app/components/offers/SoftwareQuoteModal.vue</file></path><path><editType>edit</editType><file>server/utils/offers/softwareQuotePdf.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>app/composables/useOfferSoftwareQuote.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/utils/offers/softwareQuotePdf.ts</affectedPath><affectedPath>app/composables/useOfferSoftwareQuote.ts</affectedPath><affectedPath>app/utils/softwareCatalogDefaults.ts</affectedPath><affectedPath>app/components/offers/SoftwareQuoteModal.vue</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>a08361cbd2c664f0b42f95f54c50f2e7272e01ac</commitId><timestamp>1793025148000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>LogShip offer: editable fee-line name and subtext, package taglines

The monthly software-fee row prints "&lt;package&gt; — monatliche Softwaregebühr"
with the package tagline (catalog Description) and the included volumes as
subtext; name and subtext can be overridden per offer (empty = automatic).
The package card shows the tagline too. Default catalog names are now
Start / Wachstum / Premium / Enterprise with taglines (e.g. Start: "Der
komplette Fulfillment-Kern für Ihren Einstieg."); the live rows were updated
to match. Modal gets tagline, fee-name and fee-subtext fields (de/en/es).
</comment><date>2026-10-26 15:32:28 +0100</date><id>a08361cbd2c664f0b42f95f54c50f2e7272e01ac</id><msg>LogShip offer: editable fee-line name and subtext, package taglines</msg><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>server/utils/offers/softwareQuotePdf.ts</file></path><path><editType>edit</editType><file>app/composables/useOfferSoftwareQuote.ts</file></path><path><editType>edit</editType><file>app/components/offers/SoftwareQuoteModal.vue</file></path><path><editType>edit</editType><file>app/utils/softwareCatalogDefaults.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/inouts/quick-rma.post.ts</affectedPath><affectedPath>app/pages/mobile/return.vue</affectedPath><affectedPath>app/pages/integrations/returns-desktop.vue</affectedPath><affectedPath>app/composables/useReturnedQty.ts</affectedPath><commitId>a332853cd2e7e11a943633fdca396c6ac7a54586</commitId><timestamp>1793031078000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Returns: count only received customer returns as returned qty, link receipt lines to reused marketplace RMA lines

The mobile + desktop return pages summed every completed M_RMA on the
shipment as already returned. Marketplace-imported RMAs (Amazon) are
Completed with the expected qty before the parcel arrives, so unprocessed
returns showed Remaining 0/1 and could not be entered (e.g. shipment
536925 / RMA 30614). Shared useReturnedQty composable now counts only
completed/closed customer-return receipts linked via M_RMA_ID.

quick-rma: when reusing such an RMA, receipt lines are matched to RMA
lines by shipment line id (then product, then line number restricted to
unlinked lines) instead of the bare line number, which the Amazon
importer assigns as a counter. Orphan check also accepts closed receipts.
</comment><date>2026-10-26 17:11:18 +0100</date><id>a332853cd2e7e11a943633fdca396c6ac7a54586</id><msg>Returns: count only received customer returns as returned qty, link receipt lines to reused marketplace RMA lines</msg><path><editType>edit</editType><file>server/api/inouts/quick-rma.post.ts</file></path><path><editType>add</editType><file>app/composables/useReturnedQty.ts</file></path><path><editType>edit</editType><file>app/pages/mobile/return.vue</file></path><path><editType>edit</editType><file>app/pages/integrations/returns-desktop.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/inouts/quick-rma.post.ts</affectedPath><commitId>ba5f7e6b2a5f8f26ee1dd348cc9d7103c25b8c6d</commitId><timestamp>1793031125000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>quick-rma: prefer line-number match over product match for unlinked RMA lines

Keeps the previous behaviour for RMAs created without M_InOutLine_ID
(sales-order return page) when the same product appears on two lines.
</comment><date>2026-10-26 17:12:05 +0100</date><id>ba5f7e6b2a5f8f26ee1dd348cc9d7103c25b8c6d</id><msg>quick-rma: prefer line-number match over product match for unlinked RMA lines</msg><path><editType>edit</editType><file>server/api/inouts/quick-rma.post.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>reference/demo-instance/hess/catalog.json</affectedPath><affectedPath>app/pages/materials/products/index.vue</affectedPath><affectedPath>reference/demo-instance/hess/build-catalog.py</affectedPath><affectedPath>server/utils/productsGrid.ts</affectedPath><affectedPath>reference/demo-instance/create-master-articles.sh</affectedPath><affectedPath>reference/demo-instance/hess/cattree.json</affectedPath><affectedPath>reference/demo-instance/add-purchase-prices.sh</affectedPath><affectedPath>app/components/materials/ProductVariantsCard.vue</affectedPath><affectedPath>app/pages/materials/products/[id]/edit.vue</affectedPath><affectedPath>server/api/materials/products/[id]/variants.get.ts</affectedPath><affectedPath>reference/demo-instance/hess/masters.json</affectedPath><affectedPath>reference/demo-instance/set-parent-ids.sh</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>bf69e20f22003bbc73714edec19512152cea83bd</commitId><timestamp>1793034452000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Product variants: master (IsSummary) articles + ParentId grouping, Varianten card and list column; Hess/Livipur demo catalog tooling
</comment><date>2026-10-26 18:07:32 +0100</date><id>bf69e20f22003bbc73714edec19512152cea83bd</id><msg>Product variants: master (IsSummary) articles + ParentId grouping, Varianten card and list column; Hess/Livipur demo catalog tooling</msg><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>add</editType><file>reference/demo-instance/hess/masters.json</file></path><path><editType>add</editType><file>reference/demo-instance/hess/catalog.json</file></path><path><editType>add</editType><file>reference/demo-instance/hess/cattree.json</file></path><path><editType>add</editType><file>reference/demo-instance/add-purchase-prices.sh</file></path><path><editType>edit</editType><file>server/utils/productsGrid.ts</file></path><path><editType>add</editType><file>app/components/materials/ProductVariantsCard.vue</file></path><path><editType>edit</editType><file>app/pages/materials/products/[id]/edit.vue</file></path><path><editType>add</editType><file>server/api/materials/products/[id]/variants.get.ts</file></path><path><editType>add</editType><file>reference/demo-instance/set-parent-ids.sh</file></path><path><editType>add</editType><file>reference/demo-instance/create-master-articles.sh</file></path><path><editType>add</editType><file>reference/demo-instance/hess/build-catalog.py</file></path><path><editType>edit</editType><file>app/pages/materials/products/index.vue</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></culprit></freeStyleBuild>