Push-Arbeitsblätter: deutsche Zeit, keine System-Pushes, keine Doppelten
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
531ee2a02b
commit
8d5de87ead
2 files changed
+120
-55
No files matched your search
@@ -1,4 +1,6 @@
|
||||
import { config } from '../config.js'
|
||||
import { berlinDateTime } from './berlinTime.js'
|
||||
import { withLocks } from './keyedLock.js'
|
||||
import {
|
||||
listDocuments,
|
||||
getDocument,
|
||||
@@ -11,17 +13,10 @@ const WSID_START = 100000
|
||||
// worksheets.details ist auf 4000 Zeichen begrenzt
|
||||
const DETAILS_MAX_LENGTH = 3900
|
||||
|
||||
function formatToday() {
|
||||
// dd.mm.yyyy - gleiches Format wie CreateWorksheetModal der Ticketsystem-SPA
|
||||
const d = new Date()
|
||||
const day = String(d.getDate()).padStart(2, '0')
|
||||
const m = String(d.getMonth() + 1).padStart(2, '0')
|
||||
return `${day}.${m}.${d.getFullYear()}`
|
||||
}
|
||||
|
||||
function formatTimeNow() {
|
||||
const d = new Date()
|
||||
return `${String(d.getHours()).padStart(2, '0')}${String(d.getMinutes()).padStart(2, '0')}`
|
||||
/** Pusht das System-Konto selbst (automatische Commits) - dafuer kein Arbeitsblatt. */
|
||||
export function isSystemPusher(pusher) {
|
||||
const name = pusher?.username || pusher?.login || ''
|
||||
return name.toLowerCase() === config.gitea.systemUser.toLowerCase()
|
||||
}
|
||||
|
||||
async function generateNextWsid() {
|
||||
@@ -72,9 +67,14 @@ export async function createGitPushWorksheet({
|
||||
commits = [],
|
||||
pusher,
|
||||
commitSha,
|
||||
pushedAt = new Date(),
|
||||
}) {
|
||||
if (!ticketId) return null
|
||||
|
||||
if (isSystemPusher(pusher)) {
|
||||
return { skipped: true, reason: 'system_pusher' }
|
||||
}
|
||||
|
||||
let workorder
|
||||
try {
|
||||
workorder = await getDocument(config.collections.workorders, ticketId)
|
||||
@@ -86,51 +86,57 @@ export async function createGitPushWorksheet({
|
||||
const woid = workorder.woid
|
||||
if (!woid) return null
|
||||
|
||||
if (await gitWorksheetExists(woid, commitSha)) {
|
||||
return { skipped: true, reason: 'duplicate_commit' }
|
||||
}
|
||||
// Gesperrt je Ticket+Commit, damit zwei gleichzeitige Zustellungen desselben Webhooks
|
||||
// (Gitea liefert bei Bedarf erneut zu) nicht zweimal denselben Duplikat-Check bestehen
|
||||
// und zwei Arbeitsblaetter anlegen.
|
||||
const lockKey = `ws:${woid}:${(commitSha || '').slice(0, 7)}`
|
||||
return withLocks([lockKey], async () => {
|
||||
if (await gitWorksheetExists(woid, commitSha)) {
|
||||
return { skipped: true, reason: 'duplicate_commit' }
|
||||
}
|
||||
|
||||
const wsid = await generateNextWsid()
|
||||
const pusherName = pusher?.full_name || pusher?.username || pusher?.login || 'Gitea'
|
||||
const latestCommit = commits[commits.length - 1] || commits[0]
|
||||
let details = [
|
||||
`Git Push auf \`${repoFullName}\` (Branch: ${branch})`,
|
||||
`Commit: ${commitSha?.slice(0, 7) || latestCommit?.id?.slice(0, 7) || '?'}`,
|
||||
'',
|
||||
formatCommitLines(commits, repoFullName),
|
||||
].join('\n')
|
||||
if (details.length > DETAILS_MAX_LENGTH) {
|
||||
details = `${details.slice(0, DETAILS_MAX_LENGTH)}\n… (gekuerzt)`
|
||||
}
|
||||
const wsid = await generateNextWsid()
|
||||
const pusherName = pusher?.full_name || pusher?.username || pusher?.login || 'Gitea'
|
||||
const latestCommit = commits[commits.length - 1] || commits[0]
|
||||
let details = [
|
||||
`Git Push auf \`${repoFullName}\` (Branch: ${branch})`,
|
||||
`Commit: ${commitSha?.slice(0, 7) || latestCommit?.id?.slice(0, 7) || '?'}`,
|
||||
'',
|
||||
formatCommitLines(commits, repoFullName),
|
||||
].join('\n')
|
||||
if (details.length > DETAILS_MAX_LENGTH) {
|
||||
details = `${details.slice(0, DETAILS_MAX_LENGTH)}\n… (gekuerzt)`
|
||||
}
|
||||
|
||||
// Endzeit = Push-Zeitpunkt. Startzeit bleibt leer und wird im Ticketsystem
|
||||
// nachgetragen ("Zeit nachtragen") - erst dann zaehlt die Arbeitszeit.
|
||||
const today = formatToday()
|
||||
const worksheet = await createDocument(
|
||||
config.collections.worksheets,
|
||||
{
|
||||
wsid,
|
||||
woid: String(woid),
|
||||
workorderId: ticketId,
|
||||
employeeId: 'gitea',
|
||||
employeeName: pusherName,
|
||||
employeeShort: 'GIT',
|
||||
serviceType: 'GIT',
|
||||
oldStatus: workorder.status || '',
|
||||
newStatus: workorder.status || '',
|
||||
oldResponseLevel: workorder.response || '',
|
||||
newResponseLevel: workorder.response || '',
|
||||
totalTime: 0,
|
||||
startDate: today,
|
||||
startTime: '',
|
||||
endDate: today,
|
||||
endTime: formatTimeNow(),
|
||||
details,
|
||||
isComment: true,
|
||||
createdAt: new Date().toISOString(),
|
||||
},
|
||||
ID.unique()
|
||||
)
|
||||
// Endzeit = Push-Zeitpunkt in deutscher Zeit (MESZ/MEZ). Startzeit bleibt leer und wird
|
||||
// im Ticketsystem nachgetragen ("Zeit nachtragen") - erst dann zaehlt die Arbeitszeit.
|
||||
const { date, time } = berlinDateTime(pushedAt)
|
||||
const worksheet = await createDocument(
|
||||
config.collections.worksheets,
|
||||
{
|
||||
wsid,
|
||||
woid: String(woid),
|
||||
workorderId: ticketId,
|
||||
employeeId: 'gitea',
|
||||
employeeName: pusherName,
|
||||
employeeShort: 'GIT',
|
||||
serviceType: 'GIT',
|
||||
oldStatus: workorder.status || '',
|
||||
newStatus: workorder.status || '',
|
||||
oldResponseLevel: workorder.response || '',
|
||||
newResponseLevel: workorder.response || '',
|
||||
totalTime: 0,
|
||||
startDate: date,
|
||||
startTime: '',
|
||||
endDate: date,
|
||||
endTime: time,
|
||||
details,
|
||||
isComment: true,
|
||||
createdAt: new Date().toISOString(),
|
||||
},
|
||||
ID.unique()
|
||||
)
|
||||
|
||||
return { created: true, wsid, worksheetId: worksheet.$id }
|
||||
return { created: true, wsid, worksheetId: worksheet.$id }
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user