feat(dispatch): bouton « Répondre dans legacy » (lien reply_ticket.php du tech)

- useHelpers.legacyReplyUrl(job, staffId?) → https://store.targo.ca/targo/reply_ticket.php?ticket=<legacy_ticket_id>&staff=<3301 par défaut = Tech Targo>
- RightPanel : n° ticket legacy cliquable + bouton d'action « 📝 Répondre dans legacy »
- permet au tech d'écrire dans le ticket legacy depuis ERPNext (lecture seule de notre côté)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
louispaulb 2026-06-06 10:30:32 -04:00
parent 67395cd35e
commit 15976342e4
2 changed files with 17 additions and 2 deletions

View File

@ -94,6 +94,16 @@ export function legacyDeptColor (dept) {
return null
}
// Lien « Répondre au ticket » du serveur legacy (osTicket custom) — celui que les techs reçoivent
// pour écrire dans le ticket. Format observé : reply_ticket.php?ticket=<id>&staff=<staffId>.
// staff par défaut = 3301 (compte « Tech Targo » sous lequel le ticket est assigné dans legacy).
export const LEGACY_REPLY_BASE = 'https://store.targo.ca/targo/reply_ticket.php'
export function legacyReplyUrl (job, staffId) {
const id = job && job.legacyTicketId
if (!id) return null
return `${LEGACY_REPLY_BASE}?ticket=${encodeURIComponent(id)}&staff=${staffId || 3301}`
}
export function jobColor (job, techColors, store) {
// Tech en pause/absent (statut interne 'off') → ses jobs en ROUGE vif (à réassigner) — priorité opérationnelle
if (job.assignedTech && store) {

View File

@ -1,6 +1,6 @@
<script setup>
import { inject } from 'vue'
import { fmtDur, prioLabel, prioClass, ICON } from 'src/composables/useHelpers'
import { fmtDur, prioLabel, prioClass, ICON, legacyReplyUrl } from 'src/composables/useHelpers'
import TagEditor from 'src/components/shared/TagEditor.vue'
const props = defineProps({
@ -84,7 +84,11 @@ const onDeleteTag = inject('onDeleteTag')
<div class="sb-rp-field"><span class="sb-rp-lbl">Statut</span>{{ panel.data?.job?.status }}</div>
<div v-if="panel.data?.job?.legacyTicketId" class="sb-rp-field">
<span class="sb-rp-lbl">Ticket legacy</span>
<span>#{{ panel.data.job.legacyTicketId }}<span v-if="panel.data?.job?.legacyDept"> · {{ panel.data.job.legacyDept }}</span></span>
<a class="sb-rp-link" :href="legacyReplyUrl(panel.data.job)" target="_blank" rel="noopener"
:title="'Répondre / écrire dans le ticket #' + panel.data.job.legacyTicketId + ' (serveur legacy)'">
#{{ panel.data.job.legacyTicketId }}<span v-if="panel.data?.job?.legacyDept"> · {{ panel.data.job.legacyDept }}</span>
<span class="sb-rp-link-icon"></span>
</a>
</div>
<div v-if="panel.data?.job?.note" class="sb-rp-field"><span class="sb-rp-lbl">Note</span>{{ panel.data.job.note }}</div>
<div class="sb-rp-field">
@ -111,6 +115,7 @@ const onDeleteTag = inject('onDeleteTag')
<button class="sb-rp-primary" @click="emit('edit', panel.data.job)"> Modifier</button>
<button class="sb-rp-btn" @click="emit('move', panel.data.job, panel.data.tech?.id)"> Déplacer / Réassigner</button>
<button class="sb-rp-btn" @click="emit('geofix', panel.data.job)">📍 Géofixer sur la carte</button>
<a v-if="legacyReplyUrl(panel.data?.job)" class="sb-rp-btn" :href="legacyReplyUrl(panel.data.job)" target="_blank" rel="noopener" style="text-decoration:none;text-align:center">📝 Répondre dans legacy</a>
<button v-if="panel.data?.job?.assignedTech" class="sb-rp-btn sb-ctx-warn" @click="emit('unassign', panel.data.job)"> Désaffecter</button>
</div>
</template>