<freeStyleBuild _class='hudson.model.FreeStyleBuild'><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.TimerTrigger$TimerTriggerCause'><shortDescription>Started by timer</shortDescription></cause></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesorigindev _class='hudson.plugins.git.util.Build'><buildNumber>738</buildNumber><marked><SHA1>c11453c0e75288e9d497bff9644e55c9541eafea</SHA1><branch><SHA1>c11453c0e75288e9d497bff9644e55c9541eafea</SHA1><name>refs/remotes/origin/dev</name></branch></marked><revision><SHA1>c11453c0e75288e9d497bff9644e55c9541eafea</SHA1><branch><SHA1>c11453c0e75288e9d497bff9644e55c9541eafea</SHA1><name>refs/remotes/origin/dev</name></branch></revision></refsremotesorigindev></buildsByBranchName><lastBuiltRevision><SHA1>c11453c0e75288e9d497bff9644e55c9541eafea</SHA1><branch><SHA1>c11453c0e75288e9d497bff9644e55c9541eafea</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'><artifactsUrl>https://jenkins.younex.de/view/all/job/build-logship-frontend/738/artifact</artifactsUrl><changesUrl>https://jenkins.younex.de/view/all/job/build-logship-frontend/changes</changesUrl><displayUrl>https://jenkins.younex.de/view/all/job/build-logship-frontend/738/</displayUrl><testsUrl>https://jenkins.younex.de/view/all/job/build-logship-frontend/738/testReport</testsUrl></action><building>false</building><displayName>#738</displayName><duration>68685</duration><estimatedDuration>71602</estimatedDuration><fullDisplayName>build-logship-frontend #738</fullDisplayName><id>738</id><inProgress>false</inProgress><keepLog>false</keepLog><number>738</number><queueId>5705</queueId><result>SUCCESS</result><timestamp>1789516800273</timestamp><url>https://jenkins.younex.de/view/all/job/build-logship-frontend/738/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/dashboard/RecentCallsCard.vue</affectedPath><affectedPath>server/api/telephony/blacklist.post.ts</affectedPath><affectedPath>server/utils/telephony/blacklist.ts</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>31601308527d637a24ce1dbb928085488affb6c8</commitId><timestamp>1789459780000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Dashboard: add call-blacklist button to Recent Calls card

Admin-only "Sperren" action per row, writes to FreePBX's astdb-based
Blacklist via AMI DBPut (no MySQL table involved) so future calls from
that number are rejected immediately.
</comment><date>2026-09-15 10:09:40 +0200</date><id>31601308527d637a24ce1dbb928085488affb6c8</id><msg>Dashboard: add call-blacklist button to Recent Calls card</msg><path><editType>edit</editType><file>app/components/dashboard/RecentCallsCard.vue</file></path><path><editType>add</editType><file>server/api/telephony/blacklist.post.ts</file></path><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>add</editType><file>server/utils/telephony/blacklist.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/utils/telephony/cdr.ts</affectedPath><affectedPath>app/components/dashboard/RecentCallsCard.vue</affectedPath><affectedPath>app/assets/langs/shared.js</affectedPath><commitId>d8620a46b42efac1131bfce361e06bb2beec307b</commitId><timestamp>1789460110000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Dashboard: always show Queue-routed calls on Recent Calls card

Previously the card only showed missed inbound + answered outbound,
so support-line calls that came in via the Queue and got answered
(possibly after a missed ring on another agent) never appeared.
Queue-routed inbound calls now always show regardless of outcome;
direct-dial inbound calls keep the missed-only behavior.
</comment><date>2026-09-15 10:15:10 +0200</date><id>d8620a46b42efac1131bfce361e06bb2beec307b</id><msg>Dashboard: always show Queue-routed calls on Recent Calls card</msg><path><editType>edit</editType><file>app/assets/langs/shared.js</file></path><path><editType>edit</editType><file>server/utils/telephony/cdr.ts</file></path><path><editType>edit</editType><file>app/components/dashboard/RecentCallsCard.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/sales/sis/index.vue</affectedPath><affectedPath>server/api/sales/sis/listings.get.ts</affectedPath><affectedPath>server/utils/sisMatching.ts</affectedPath><affectedPath>server/utils/amazonSpApi.ts</affectedPath><affectedPath>server/api/sales/sis/price-update.post.ts</affectedPath><commitId>89a23e942f5ea0be7a9453c79ffef0b394b352f6</commitId><timestamp>1789462887000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>SIS: fix intermittent load hang, safen Amazon price pushes, in-flight glow

Amazon-side errors (report timeout, 429, ...) were silently triggering a
full refresh-and-retry of the whole route (report poll + matching, or a
full price push run twice) because event.context.lastIdempiereError is
only ever set by iDempiere calls — tag Amazon-origin errors and skip the
retry for them. Also: timeouts + retry-after-aware backoff on every raw
SP-API/LWA call (none had any before), parallelize the previously serial
SKU/ASIN/price chunk lookups in sisMatching.ts, a real loading
spinner/elapsed-time + client-side fetch timeout instead of a static
"Loading listings..." line, and a per-order-source push queue so rapid
per-field price pushes never burst past Amazon's ~1 req/sec limit.

Also adds the requested "knight rider" glowing border animation on a
price field while its push is in flight, handing off to the existing
success/error flash once it resolves.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_013G7aDXCyYUwGgTG81QTP8E
</comment><date>2026-09-15 11:01:27 +0200</date><id>89a23e942f5ea0be7a9453c79ffef0b394b352f6</id><msg>SIS: fix intermittent load hang, safen Amazon price pushes, in-flight glow</msg><path><editType>edit</editType><file>server/api/sales/sis/listings.get.ts</file></path><path><editType>edit</editType><file>server/api/sales/sis/price-update.post.ts</file></path><path><editType>edit</editType><file>server/utils/sisMatching.ts</file></path><path><editType>edit</editType><file>app/pages/sales/sis/index.vue</file></path><path><editType>edit</editType><file>server/utils/amazonSpApi.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/telephony/recordings/audio.get.ts</affectedPath><affectedPath>server/utils/telephony/recordings.ts</affectedPath><commitId>11e64f412c360e3e27d2d2f1e62aceee6f5f3e2f</commitId><timestamp>1789462899000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Telephony: fix call recording playback for .gsm files

Recordings served as .gsm played inconsistently in the dashboard phone
card and the contact-page recordings modal ("play does nothing" for
most, "player shows up" only for .wav/.mp3) — no browser ships a native
GSM 06.10 decoder, so the &lt;audio&gt; element just sits at
readyState=HAVE_NOTHING forever with no error event. ffmpeg (already
used to decode these same .gsm files for whisper transcription)
transcodes .gsm to mp3 server-side before streaming; .wav/.mp3 pass
through unchanged.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_013G7aDXCyYUwGgTG81QTP8E
</comment><date>2026-09-15 11:01:39 +0200</date><id>11e64f412c360e3e27d2d2f1e62aceee6f5f3e2f</id><msg>Telephony: fix call recording playback for .gsm files</msg><path><editType>edit</editType><file>server/utils/telephony/recordings.ts</file></path><path><editType>edit</editType><file>server/api/telephony/recordings/audio.get.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/sales/returns/index.vue</affectedPath><commitId>e7e99c24f3437370b725c5cd1ff3b75eb198bf86</commitId><timestamp>1789463284000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Returns: add searchable Products column (line items + qty)

/sales/returns now fetches ?withLines=1 (the M_InOutLine + nested
M_Product_ID expand already used by the dashboard "Letzte Retouren"
card) and shows the returned products with their quantities inline in
a new grid column, with its own text filter — no master-detail.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_013G7aDXCyYUwGgTG81QTP8E
</comment><date>2026-09-15 11:08:04 +0200</date><id>e7e99c24f3437370b725c5cd1ff3b75eb198bf86</id><msg>Returns: add searchable Products column (line items + qty)</msg><path><editType>edit</editType><file>app/pages/sales/returns/index.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/pages/integrations/inventory-desktop.vue</affectedPath><commitId>376abf176801739a3c3d427a56263898d657861c</commitId><timestamp>1789470038000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Inventory Desktop: BOM tags + exclude-BOM filter on article search

Ports the same excludeBom checkbox + BOM/JTL-BOM tags mobile/inventory.vue
already has on its article text search (server already supports both via
/api/materials/products/search?excludeBom=), but defaults the checkbox to
checked here — a physical stock count is about individually-located
articles, not kit/BOM headers, unlike the mobile default (unchecked).

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_013G7aDXCyYUwGgTG81QTP8E
</comment><date>2026-09-15 13:00:38 +0200</date><id>376abf176801739a3c3d427a56263898d657861c</id><msg>Inventory Desktop: BOM tags + exclude-BOM filter on article search</msg><path><editType>edit</editType><file>app/pages/integrations/inventory-desktop.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>server/api/print/return-label.post.ts</affectedPath><commitId>006f06ebd1f54f49f2fef962ffa4a48861c1a862</commitId><timestamp>1789482747000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Return label: enlarge header-band text for readability

Company name and date/time in the dark top band were too small against
the fill, especially on the common 74x52/56x75/102x152 label sizes.
Bumps bar height and font sizes on both sides and raises the minimum
shrink-to-fit floor for long company names.
</comment><date>2026-09-15 16:32:27 +0200</date><id>006f06ebd1f54f49f2fef962ffa4a48861c1a862</id><msg>Return label: enlarge header-band text for readability</msg><path><editType>edit</editType><file>server/api/print/return-label.post.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/composables/useReturnLabelPrinter.ts</affectedPath><affectedPath>server/api/print/return-label.post.ts</affectedPath><affectedPath>app/components/NavBar.vue</affectedPath><affectedPath>app/composables/states.ts</affectedPath><affectedPath>app/components/rmas/ReturnLabelPrinterPicker.vue</affectedPath><affectedPath>app/pages/mobile/return.vue</affectedPath><affectedPath>app/pages/integrations/returns-desktop.vue</affectedPath><commitId>8e1a9966727348cffb3a45f49e81b2eebed592d5</commitId><timestamp>1789482760000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Return-label printer: org default + per-session override

Return labels no longer print per-article, so the legacy per-product
printer field (m_product.labelprinter_rma) no longer fits how they're
used. Replaces it with a printer picker in the top navbar (desktop) /
returns page header (mobile), admin-only (IsClientAdministrator), that
staff switch per working place — remembered per device via localStorage
so it survives reloads. Falls back to the org's CUST_Printer marked
"Default printer (for its type)" (printerType=lab), else the lab
printer with the smallest id.

Also fixes a bug in /api/print/return-label where an explicit body.queue
override was never actually consulted (labelPrinterId always defaulted
to a truthy 'b', winning the || before queue was checked), and
consolidates return-label printing to one request per return instead of
grouping lines by printer — a return is one label listing every article,
so the old per-product grouping could silently split one return across
multiple partial-article labels.
</comment><date>2026-09-15 16:32:40 +0200</date><id>8e1a9966727348cffb3a45f49e81b2eebed592d5</id><msg>Return-label printer: org default + per-session override</msg><path><editType>edit</editType><file>app/composables/states.ts</file></path><path><editType>edit</editType><file>app/pages/mobile/return.vue</file></path><path><editType>add</editType><file>app/components/rmas/ReturnLabelPrinterPicker.vue</file></path><path><editType>edit</editType><file>app/pages/integrations/returns-desktop.vue</file></path><path><editType>edit</editType><file>app/components/NavBar.vue</file></path><path><editType>add</editType><file>app/composables/useReturnLabelPrinter.ts</file></path><path><editType>edit</editType><file>server/api/print/return-label.post.ts</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/sales/OrderForm.vue</affectedPath><commitId>70d978c5f75ce97343d7740bbd8478a2c3d7b01d</commitId><timestamp>1789482764000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>Sales order edit: emphasize ship-to name over partner

On the completed-order shipping summary, the partner name was bold and
the actual ship-to location (Name/Name2) was plain text, making it easy
to misread which one the order ships to. Indents the partner row and
drops its bold, and bolds the Name/Name2 values instead.
</comment><date>2026-09-15 16:32:44 +0200</date><id>70d978c5f75ce97343d7740bbd8478a2c3d7b01d</id><msg>Sales order edit: emphasize ship-to name over partner</msg><path><editType>edit</editType><file>app/components/sales/OrderForm.vue</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>app/components/requests/MyTicketDetail.vue</affectedPath><commitId>c11453c0e75288e9d497bff9644e55c9541eafea</commitId><timestamp>1789483734000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName></author><authorEmail>info@younex.de</authorEmail><comment>My-Tickets: fix staff replies stamped with wrong org, hiding them from limited-role customers

sendMessage() stamped new r_requestupdate rows with the replying staff
member's currently active org (logship_organization_id cookie) instead
of the ticket's own org. A limited-role customer's access is scoped to
only their own org (IsAccessAllOrgs=false), so any reply written while
staff had a different org active became invisible to them via
iDempiere's row-level security — even though the ticket itself and
their own messages stayed visible. Every other send path in this file
(accounting-flag note, assign-to-merchant, status actions) already
preferred the ticket's own org with this exact fallback; only the main
composer's sendMessage() was missing it.

Confirmed against production data: customer "stoyan" (Wonderhome) was
missing 4 of 9 staff replies on ticket 1000426, all sent while support
had a different org active.
</comment><date>2026-09-15 16:48:54 +0200</date><id>c11453c0e75288e9d497bff9644e55c9541eafea</id><msg>My-Tickets: fix staff replies stamped with wrong org, hiding them from limited-role customers</msg><path><editType>edit</editType><file>app/components/requests/MyTicketDetail.vue</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/info</absoluteUrl><fullName>info</fullName><id>info</id></culprit></freeStyleBuild>