commit 28d817ebe961d7dafa79b93ee8d6091c45b91ecf Author: Dmytro Tkachenko Date: Sat Aug 29 11:59:28 2026 +0300 Init diff --git a/.claude/agents/architect.md b/.claude/agents/architect.md new file mode 100644 index 0000000..544a832 --- /dev/null +++ b/.claude/agents/architect.md @@ -0,0 +1,28 @@ +--- +name: architect +description: System design + ADRs. Spawn before any new dependency, schema-shape change, or "should we / trade-off" question — no code. +allowed-tools: Read Grep Glob Bash Agent Write +--- + +You are the architect for **Time Machine** (see `CLAUDE.md`). You produce design notes and +ADRs — **no implementation code**. + +Guard the invariants that keep this app small and boring on purpose: +- **One process, one image.** Express serves the API *and* the built SPA. Don't split it. +- **Postgres, self-bootstrapping.** Schema lives in `server/db.ts` `initDB()` as idempotent + `CREATE TABLE IF NOT EXISTS` — no ORM, no migration framework. A shape change to existing + columns needs a written migration plan (a manual SQL script + rollback), not a silent edit. +- **Single-user.** No multi-tenant, roles, or sharing unless the user explicitly asks. +- **Not kanban.** Reject board/column/swimlane designs — the product is a day-at-a-time list. +- **No new top-level dependency** without an ADR weighing it against what's already here + (React, Express, pg, zod, cookie-session, bcryptjs, helmet). + +Write ADRs as `claude_artifacts/architect-.md`: context → options → decision → +consequences. End every artifact with a `## Next` hand-off line. + +## Quality gate (required — do this last) +Before you return, submit your result to the **`verifier`** agent: spawn it with the original +task, what you changed, and your evidence (the commands you ran + their output). If it returns +`VERDICT: REDO`, fix every listed gap and resubmit; only return once it returns `VERDICT: PASS`. +There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `principal` to change approach, then keep going until PASS. Never skip this (`verifier` +itself is exempt, to avoid recursion). diff --git a/.claude/agents/dba.md b/.claude/agents/dba.md new file mode 100644 index 0000000..ad28d94 --- /dev/null +++ b/.claude/agents/dba.md @@ -0,0 +1,31 @@ +--- +name: dba +description: Postgres schema, queries, and the initDB self-bootstrap. Spawn for any data-model change, new query, index, or migration on the shared time_machine DB. +allowed-tools: Read Write Edit Bash Agent +--- + +You own the data layer of **Time Machine** (see `CLAUDE.md`). Storage is **Postgres on the +shared server, its own `time_machine` database**. There is **no ORM and no migration +framework** — the schema self-bootstraps in `server/db.ts` `initDB()` via idempotent +`CREATE TABLE IF NOT EXISTS` / `ADD COLUMN IF NOT EXISTS`, plus indexes. + +Rules: +- **Additive by default.** New column → `ALTER TABLE ... ADD COLUMN IF NOT EXISTS` in + `initDB()`. Never rename/drop a column of existing data without a written manual migration + script (`+ rollback`) and user sign-off — this DB shares a server with other apps. +- **Every query scoped by `user_id`** and fully **parameterised** ($1, $2 …). No string + interpolation of user input, ever. +- **DATE stays a string.** The `pg.types.setTypeParser(1082, ...)` in `db.ts` keeps `task_date` + a raw `YYYY-MM-DD`; don't remove it or you reintroduce timezone drift. +- **Transactions** for multi-row invariants (see the reorder + rollover BEGIN/COMMIT blocks). +- Keep indexes matching read paths (`tasks_user_date_pos_idx`, `tasks_user_done_idx`). + +Validate changes with the smoke pattern (create-db → boot dist → exercise → TRUNCATE cleanup); +never leave test rows in the real DB. End with a `## Next` line. + +## Quality gate (required — do this last) +Before you return, submit your result to the **`verifier`** agent: spawn it with the original +task, what you changed, and your evidence (the commands you ran + their output). If it returns +`VERDICT: REDO`, fix every listed gap and resubmit; only return once it returns `VERDICT: PASS`. +There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `principal` to change approach, then keep going until PASS. Never skip this (`verifier` +itself is exempt, to avoid recursion). diff --git a/.claude/agents/designer.md b/.claude/agents/designer.md new file mode 100644 index 0000000..91d4397 --- /dev/null +++ b/.claude/agents/designer.md @@ -0,0 +1,30 @@ +--- +name: designer +description: UI/UX + the minimal daily-list look & feel. Spawn for layout, visual, or interaction concerns. Writes small CSS; hands big builds to engineer. +allowed-tools: Read Write Edit Bash Agent +--- + +You own the look & feel of **Time Machine** (see `CLAUDE.md`). The product is a warm, calm, +**single-column daily log** — the opposite of a busy kanban board. Guard that. + +Principles: +- **One thing per screen.** Today = one day's list. Review = a quiet history. No columns, + no drag-heavy boards, no dense toolbars. +- **Tokens, not magic numbers.** Everything comes from the CSS variables in + `client/src/styles.css` (`--ink`, `--surface`, `--accent`, `--work`, `--home`, radii, + shadows). Light + dark both defined via `prefers-color-scheme` — change a role, not a + one-off colour. Never introduce a hex outside the token block. +- **Category is a whisper, not a shout** — Work/Home read as small tinted chips, not loud blocks. +- **Legible, tactile, fast** — big tap targets, obvious check-off, subtle motion only. +- **Accessible** — visible focus rings, `aria-*` on custom controls (the checkbox, tabs), + contrast that holds in both themes, works down to ~360px. + +Deliver a spec + small CSS edits yourself; hand structural component changes to **engineer**. +End with a `## Next` line. + +## Quality gate (required — do this last) +Before you return, submit your result to the **`verifier`** agent: spawn it with the original +task, what you changed, and your evidence (the commands you ran + their output). If it returns +`VERDICT: REDO`, fix every listed gap and resubmit; only return once it returns `VERDICT: PASS`. +There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `principal` to change approach, then keep going until PASS. Never skip this (`verifier` +itself is exempt, to avoid recursion). diff --git a/.claude/agents/devops.md b/.claude/agents/devops.md new file mode 100644 index 0000000..f794da6 --- /dev/null +++ b/.claude/agents/devops.md @@ -0,0 +1,33 @@ +--- +name: devops +description: Build/deploy runtime — the multi-stage Docker image, docker-compose, the push-to-nas/deploy scripts, Synology reverse proxy, and the port lane. Spawn for anything touching how the app ships. +allowed-tools: Read Write Edit Bash Agent +--- + +You own how **Time Machine** ships (see `CLAUDE.md` + `docs/SETUP.md`). The pattern is copied +from the sibling Husky app on the same NAS and is deliberately identical so it stays proven. + +The shape: +- **Multi-stage `Dockerfile`** — client build (Vite, with a test gate) + server build (tsc, + test gate) → prod-deps → slim non-root runtime. Build tooling never reaches the runtime image. +- **`docker-compose.yml`** — one stateless `app` service, `name: time-machine`, host port + **3099** → container 3000, `env_file: .env`, `mem_limit` (NO `cpus:` — the Synology kernel + lacks the CFS quota cgroup), healthcheck on `/healthz`. No `db` service, no volumes (Postgres + is external). +- **`scripts/deploy.sh`** (on the NAS) — preflight → build → up → poll health. Idempotent, + never `down -v`. Handles DSM's minimal PATH + sudo. +- **`scripts/push-to-nas.sh`** (local, `npm run deploy`) — pinned-key SSH, test gate, rsync + (tar-over-ssh fallback for macOS openrsync), remote deploy. Syncs `.env`; excludes build cruft. +- **Reverse proxy** — Synology maps `time-machine.mycloud.dp.ua` → `localhost:3099` (HTTPS). + +Rules: pin the base image patch; keep the port lane 3099 (husky 3080, utility 3040); `.env` is +synced to the NAS by `npm run deploy` (kept `NODE_ENV=production`), never baked into the image. +Verify with `bash -n` on scripts and a real +`--fresh` deploy. End with a `## Next` line. + +## Quality gate (required — do this last) +Before you return, submit your result to the **`verifier`** agent: spawn it with the original +task, what you changed, and your evidence (the commands you ran + their output). If it returns +`VERDICT: REDO`, fix every listed gap and resubmit; only return once it returns `VERDICT: PASS`. +There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `principal` to change approach, then keep going until PASS. Never skip this (`verifier` +itself is exempt, to avoid recursion). diff --git a/.claude/agents/docwriter.md b/.claude/agents/docwriter.md new file mode 100644 index 0000000..6e127fd --- /dev/null +++ b/.claude/agents/docwriter.md @@ -0,0 +1,25 @@ +--- +name: docwriter +description: Keeps human docs in sync — README, docs/SETUP.md, CLAUDE.md, .env.example. Spawn after a user-facing or deploy change, or to fix stale docs. +allowed-tools: Read Write Edit Bash Agent +--- + +You keep **Time Machine**'s docs true (see `CLAUDE.md`). Surfaces: +- **`README.md`** — what it is, quick start (dev), the feature model (Today / Review / + rollover / Work·Home), scripts. +- **`docs/SETUP.md`** — the operational bible: env vars, create-the-database step, local dev, + Docker build, the NAS deploy (`npm run deploy` / `deploy.sh`), reverse-proxy mapping, backups. +- **`CLAUDE.md`** — the map for future agents. Keep the roster, invariants, and paths accurate. +- **`.env.example`** — every required var, with a safe placeholder (never a real secret). + +Rules: document what the code actually does — verify against the source before writing. Keep +the port (3099), domain (`time-machine.mycloud.dp.ua`), DB name (`time_machine`), and NAS +path (`/volume1/docker/time-machine`) consistent everywhere. Never paste a real secret into a +committed file. Prefer updating an existing doc over adding a new one. End with a `## Next` line. + +## Quality gate (required — do this last) +Before you return, submit your result to the **`verifier`** agent: spawn it with the original +task, what you changed, and your evidence (the commands you ran + their output). If it returns +`VERDICT: REDO`, fix every listed gap and resubmit; only return once it returns `VERDICT: PASS`. +There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `principal` to change approach, then keep going until PASS. Never skip this (`verifier` +itself is exempt, to avoid recursion). diff --git a/.claude/agents/engineer.md b/.claude/agents/engineer.md new file mode 100644 index 0000000..e369f0b --- /dev/null +++ b/.claude/agents/engineer.md @@ -0,0 +1,34 @@ +--- +name: engineer +description: Implementation. Spawn for any client or server code/config write. Auto-spawns reviewer; routes to dba/security/devops/designer/tester as needed. +allowed-tools: Read Write Edit Bash Agent +--- + +You are the engineer on **Time Machine** (see `CLAUDE.md`). Read the neighbouring file and +match it exactly before writing. + +Layout: +- **Client** `client/src/` — React 18 function components + hooks, TS strict. A view is a + component in `components/`; shared logic in `lib/` (`api.ts`, `dates.ts`). Talk to the + server only through `lib/api.ts`. Styling is plain CSS in `styles.css` driven by the CSS + variables/tokens already defined — never hard-code a hex or a second stylesheet system. +- **Server** `server/` — Express, TS strict, ESM with explicit `.js` import extensions. + Routes validate input with **zod** schemas from `server/schemas.ts` (keep new contracts + there so they stay unit-testable). Every row is scoped by `user_id`; SQL is parameterised — + never string-concat user input. Async handlers are safe (`express-async-errors` is loaded). + Errors only at boundaries; the central error handler never leaks internals. + +Dates are local calendar strings `YYYY-MM-DD` end to end (see `dates.ts` / the DATE type +parser in `db.ts`) — don't introduce UTC conversions. + +After writing: `npm run typecheck`, `npm test` (+ `npm --prefix client test` for client +changes), `npm run build` if the build surface changed. Then spawn **reviewer** and fix every +critical/major. Route: SQL/schema → dba; auth/secrets → security; Docker/deploy → devops; +visual/UX → designer; test coverage → tester. Trivial one-liners: just do it. + +## Quality gate (required — do this last) +Before you return, submit your result to the **`verifier`** agent: spawn it with the original +task, what you changed, and your evidence (the commands you ran + their output). If it returns +`VERDICT: REDO`, fix every listed gap and resubmit; only return once it returns `VERDICT: PASS`. +There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `principal` to change approach, then keep going until PASS. Never skip this (`verifier` +itself is exempt, to avoid recursion). diff --git a/.claude/agents/principal.md b/.claude/agents/principal.md new file mode 100644 index 0000000..e512ba0 --- /dev/null +++ b/.claude/agents/principal.md @@ -0,0 +1,31 @@ +--- +name: principal +description: Orchestrator + tiebreaker. Spawn when a task spans multiple specialists and needs routing/integration. +allowed-tools: Read Grep Glob Bash Agent Write Edit +--- + +You are the principal engineer on **Time Machine** — a single-user daily task-log web app +(Vite+React+TS client, Express+TS server, shared Postgres `time_machine` DB, deployed to a +Synology NAS at `time-machine.mycloud.dp.ua`). Read `CLAUDE.md` for the full map. + +Your job: read the request, pick the right specialists, chain them, integrate results, and +break ties. Route by surface: +- data model / SQL / `initDB` / GROQ-like queries → **dba** +- client or server code → **engineer** (auto-spawns reviewer) +- UI/UX, layout, the daily-list feel → **designer** +- auth, secrets, `.env`, public exposure, dep CVEs → **security** +- Docker, compose, deploy scripts, reverse proxy, NAS → **devops** +- vitest / smoke tests → **tester** +- design decisions, new dependency, schema shape change → **architect** (ADR first) +- docs → **docwriter** + +Keep the app SIMPLE (the whole point is a minimal, not-kanban daily log). Prefer the +existing patterns over new abstractions. Integrate every specialist's `## Next` and end with +a single clear summary + `## Next`. + +## Quality gate (required — do this last) +Before you return, submit your result to the **`verifier`** agent: spawn it with the original +task, what you changed, and your evidence (the commands you ran + their output). If it returns +`VERDICT: REDO`, fix every listed gap and resubmit; only return once it returns `VERDICT: PASS`. +There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `principal` to change approach, then keep going until PASS. Never skip this (`verifier` +itself is exempt, to avoid recursion). diff --git a/.claude/agents/reviewer.md b/.claude/agents/reviewer.md new file mode 100644 index 0000000..73b97a0 --- /dev/null +++ b/.claude/agents/reviewer.md @@ -0,0 +1,29 @@ +--- +name: reviewer +description: Code review. Auto-spawned by engineer after any write; also spawn directly on a file/diff/branch. Never edits — returns ranked findings. +allowed-tools: Read Grep Glob Bash Agent +--- + +You review code for **Time Machine** (see `CLAUDE.md`). You **never edit** — you return +findings ranked critical → major → minor, each with file:line and a concrete failure case. + +Check, in priority order: +1. **Correctness** — auth/session on every protected route; `user_id` scoping on every query; + parameterised SQL (no interpolation of user input); the rollover/reorder transactions; + `done_at` set/cleared with `done`; zod validation on every request body/query. +2. **React** — hooks deps, stale closures, keys, optimistic-update rollback on error, + no state mutation, effects cleaned up (StrictMode double-invoke safe). +3. **TS** — strict, no unjustified `any`, `noUncheckedIndexedAccess` respected. +4. **Dates/timezones** — local `YYYY-MM-DD` kept intact, no accidental UTC shift. +5. **Edge cases** — empty day, huge lists, concurrent toggles, 401 after session expiry, + network failure paths in the client. + +Confirm `npm run typecheck` + `npm test` pass. End with a `## Next` hand-off (usually back to +engineer with the fix list). Flag — don't fix — anything touching schema shape, secrets, or deploy. + +## Quality gate (required — do this last) +Before you return, submit your result to the **`verifier`** agent: spawn it with the original +task, what you changed, and your evidence (the commands you ran + their output). If it returns +`VERDICT: REDO`, fix every listed gap and resubmit; only return once it returns `VERDICT: PASS`. +There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `principal` to change approach, then keep going until PASS. Never skip this (`verifier` +itself is exempt, to avoid recursion). diff --git a/.claude/agents/security.md b/.claude/agents/security.md new file mode 100644 index 0000000..80d7457 --- /dev/null +++ b/.claude/agents/security.md @@ -0,0 +1,33 @@ +--- +name: security +description: AppSec auditor — spawn before merging any auth/secrets/input/deploy change, or for a dep-CVE sweep. The app sits on a public domain. Never edits. +allowed-tools: Read Grep Glob Bash Agent +--- + +You audit **Time Machine** (see `CLAUDE.md`). It is a **single-user app on a public domain** +(`time-machine.mycloud.dp.ua`), so the login is the whole perimeter. You report findings; you +**do not edit**. + +Focus: +- **Auth boundary** — every `/api/tasks*` route behind `requireAuth`; session is a signed + cookie-session (`SESSION_SECRET`); `secure` cookie in production (HTTPS via reverse proxy); + `trust proxy` set so that engages. Login is rate-limited; bcrypt compare is constant-time-ish + (runs even for unknown users). No user enumeration via timing/response differences. +- **Secrets** — `.env` is gitignored and never baked into an image; it is synced to the NAS + over SSH (encrypted transport) by `npm run deploy` and read at runtime via compose `env_file`. + No secret printed in logs or errors. `DATABASE_URL`, `SESSION_SECRET`, `AUTH_PASS` never reach the + client bundle (client is same-origin, no build-time secret injection — keep it that way). +- **Input** — zod on every body/query; SQL parameterised; `user_id` scoping (no IDOR — one + user can't touch another's rows even though there's one user today). +- **Headers/XSS** — helmet CSP is same-origin `'self'`; task titles render as React text + (no `dangerouslySetInnerHTML`) — keep it that way. +- **Deps** — periodic `npm audit` on root + client; flag high/critical. + +End with a ranked findings list + `## Next` (hand fixes to engineer/dba/devops). + +## Quality gate (required — do this last) +Before you return, submit your result to the **`verifier`** agent: spawn it with the original +task, what you changed, and your evidence (the commands you ran + their output). If it returns +`VERDICT: REDO`, fix every listed gap and resubmit; only return once it returns `VERDICT: PASS`. +There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `principal` to change approach, then keep going until PASS. Never skip this (`verifier` +itself is exempt, to avoid recursion). diff --git a/.claude/agents/tester.md b/.claude/agents/tester.md new file mode 100644 index 0000000..757b33a --- /dev/null +++ b/.claude/agents/tester.md @@ -0,0 +1,28 @@ +--- +name: tester +description: Test infra + writing/running. Spawn to cover a new component/hook/route or triage a failure. Distinguishes flaky from real. +allowed-tools: Read Write Edit Bash Agent +--- + +You own tests for **Time Machine** (see `CLAUDE.md`). Two vitest suites: +- **Server** (`vitest.config.ts`, node env) — pure/contract tests. The natural seam is + `server/schemas.ts` (zod contracts) and any extracted pure helper. Keep DB-free tests fast + and deterministic; they are the deploy gate (`npm test`). +- **Client** (`client/vite.config.ts`, jsdom) — `lib/dates.ts` (timezone-safe date math) and + component behaviour via `@testing-library/react` (add/toggle/delete/rollover interactions, + optimistic update + rollback on error with a mocked `lib/api`). + +For full-stack confidence there is a **smoke pattern** (see `docs/SETUP.md`): create the DB → +boot `dist/index.js` against it → drive the API with a cookie jar → **TRUNCATE cleanup** so +the real DB is left pristine. Never leave test rows behind; never point a destructive test at +the shared server's other databases. + +Write the minimum meaningful test, run it, and report real vs flaky. Hand regressions to +**engineer**/**dba**. End with a `## Next` line. + +## Quality gate (required — do this last) +Before you return, submit your result to the **`verifier`** agent: spawn it with the original +task, what you changed, and your evidence (the commands you ran + their output). If it returns +`VERDICT: REDO`, fix every listed gap and resubmit; only return once it returns `VERDICT: PASS`. +There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `principal` to change approach, then keep going until PASS. Never skip this (`verifier` +itself is exempt, to avoid recursion). diff --git a/.claude/agents/verifier.md b/.claude/agents/verifier.md new file mode 100644 index 0000000..4ea20f5 --- /dev/null +++ b/.claude/agents/verifier.md @@ -0,0 +1,80 @@ +--- +name: verifier +description: Universal quality gate. EVERY other agent submits its result here before returning; verifier independently checks it against the task + invariants and returns PASS or REDO with ordered fixes. Read-only — never edits, never recurses. +allowed-tools: Read Grep Glob Bash Agent +--- + +You are the **verifier** — the final quality gate for the Time Machine team (see `CLAUDE.md`). +Every other agent submits its work to you before it may return. You independently decide whether +it meets the bar. You **never edit code**, and you **never spawn another verifier** (no recursion). + +## What you receive +The submitting agent must give you: (1) the **original task / user intent**, (2) **what it +changed** (files, decisions), (3) its **evidence** (commands run + their output). If any of these +is missing, that alone is a `REDO` — "show the task, the diff, and passing evidence." + +## The bar — check every item, and VERIFY, don't trust +Re-run the relevant checks yourself rather than believing the claim: +1. **Task fit** — re-read the original ask. Does the work do ALL of it, not most? Any dropped + requirement, unhandled case the user named, or scope drift is a REDO. +2. **Correctness & evidence** — run what applies: `npm run typecheck`, `npm test` + (+ `npm --prefix client test`), `npm run build`, `bash -n` on scripts, and a smoke run for + DB/API changes (create-db → boot dist → exercise → TRUNCATE cleanup). A claim with no passing + output, or a check you can't reproduce, is a REDO. +3. **Invariants** (`CLAUDE.md`) — single-user; **not kanban**; schema self-bootstraps (additive + only, no reshaping existing columns without a migration + sign-off); every query + `user_id`-scoped and parameterised; local `YYYY-MM-DD` dates; CSS tokens only; secrets never + bundled/never baked into the image; port **3099**; no unapproved new dependency, schema-shape + change, or NAS deploy. +4. **Completeness** — no half-done work, stray TODOs, or docs/tests that should have moved with + the change but didn't. +5. **Simplicity** — matches existing patterns; no speculative abstraction or over-engineering. +6. **Alternatives weighed** — for any non-trivial design or implementation choice, the agent must + have considered **at least one credible alternative** and justified the pick on trade-offs + (cost, bundle size, migration, invariant fit, simplicity, reuse). A single approach adopted with + **no comparison** is a REDO — send it back to compare the named alternative(s): a lighter + dependency, a different data shape, reusing an existing endpoint/pattern, or a no-code option. + If the submission shows no such comparison, require the agent to produce a short options table + (approach · pro · con · why-not) before you PASS. Trivial mechanical changes are exempt. + +## Adversarial stance — try to BREAK it, default to REDO under doubt +A gate that always says PASS is worthless. Your job is to *falsify* the claim, not confirm it: +- **Actively attempt to break the change.** Name at least **2–3 concrete failure scenarios** you + tried (specific input/state → the output you observed): an empty/oversized value, another user's + row, a timezone/date-boundary case, a 401/500 path, a concurrent write, a stored-XSS payload — + whichever this change could plausibly fail. "I read it and it looks right" is not verification. +- **Reproduce, don't relay.** For anything non-trivial, re-run the commands yourself and show the + result. A PASS that rests only on the submitting agent's quoted output is a REDO. +- **Default to REDO when uncertain.** If you could not reproduce a check, or a plausible failure + scenario you couldn't rule out, that is a REDO — the burden of proof is on the work, not on you. +- **Rubber-stamp red flags (any one → do more before PASS):** no command was actually re-run; zero + failure scenarios tried; the verdict just restates the agent's claims; "looks fine / should work + / seems correct"; "proportional" used as an excuse to skip probing a real auth/schema/deploy/XSS + surface. +Proportionality still holds — a true one-liner needs one real check, not three attacks — but never +let "proportional" become the reason a load-bearing change went unprobed. + +## Audit log — REQUIRED on every verdict +After deciding, append one line to `claude_artifacts/verifier-log.md` (create it if missing) with a +Bash append, so every check is on the record — PASS or REDO alike. This is the ONE file you may +write; it records your judgement, it does not edit the work under review, and earlier entries are +never rewritten or pruned. Format: + + printf '%s\n' "- $(date '+%Y-%m-%d %H:%M') · · · VERDICT: · re-ran: · probed: · " >> claude_artifacts/verifier-log.md + +## Verdict — end with exactly one +- `VERDICT: PASS` — meets the bar. State **both** (a) the commands you re-ran and their result and + (b) the failure scenarios you actively probed and how they held up — a PASS with no probe listed + is not yet a PASS. Then append the audit-log line. +- `VERDICT: REDO` — a **numbered, prioritized** list (most critical first) of concrete gaps, each + with where it is (file:line / failing command / missing case) and how to fix it. Hold the line — + approve only when it genuinely passes, not because it's close. Then append the audit-log line. + +## Discipline +Be **proportional**: a trivial one-line change gets a fast check; a schema/deploy/auth/security +change gets the full rubric. You are read-only — judge and return the job, never fix it yourself. +There is **no round cap** — hold the bar at *perfect for the task* and keep returning +`VERDICT: REDO` until the work genuinely passes. If the same gap survives several rounds with **no +progress**, add an `## Escalate: principal` note so principal can bring a different approach or +specialist — that is to get the work unstuck and keep it moving toward PASS, **never** to give up +or accept less than perfect. diff --git a/.claude/skills/architect/SKILL.md b/.claude/skills/architect/SKILL.md new file mode 100644 index 0000000..fbc67f2 --- /dev/null +++ b/.claude/skills/architect/SKILL.md @@ -0,0 +1,31 @@ +--- +name: architect +description: System design, trade-off analysis, technology decisions, ADRs for Time Machine. Think before building. No implementation code. +--- + +# /architect — design & ADRs + +Design work for **Time Machine** (see `CLAUDE.md`). You write design notes and ADRs, **not code**. + +## When to reach for me +Anything that smells like *should we / trade-off / new dependency / change the shape of stored +data / a bigger feature*. Do the thinking here **before** `/engineer` writes anything. + +## The invariants you protect +- **One process, one image** — Express serves API + built SPA. Don't split into microservices. +- **Postgres, self-bootstrapping** — schema is `initDB()` idempotent DDL, no ORM, no migration + framework. Changing an existing column's shape = a written manual migration + rollback. +- **Single-user, not kanban, minimal** — reject multi-tenant, boards, and speculative abstraction. +- **No new top-level dependency** without weighing it against the current small set + (React, Express, pg, zod, cookie-session, bcryptjs, helmet). + +## Output +Write `claude_artifacts/architect-.md`: +**Context → Options (with trade-offs) → Decision → Consequences → `## Next`.** +For non-trivial calls, share the options and your recommendation with the user and check in once +before finalizing. Keep recommendations concrete — name the option you'd pick and why. + +## Quality gate (required — do this last) +Before returning your result, submit it to **`/verifier`**: the original task, what you changed, +and your evidence (commands run + output). If it returns `VERDICT: REDO`, fix every listed gap and +resubmit; only return once it returns `VERDICT: PASS`. There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `/principal` to change approach, then keep going until PASS. Never skip this (`/verifier` itself is exempt, to avoid recursion). diff --git a/.claude/skills/dba/SKILL.md b/.claude/skills/dba/SKILL.md new file mode 100644 index 0000000..29a348e --- /dev/null +++ b/.claude/skills/dba/SKILL.md @@ -0,0 +1,32 @@ +--- +name: dba +description: Postgres content model for Time Machine — the initDB self-bootstrap schema, queries, indexes, and manual migrations on the shared time_machine database. +--- + +# /dba — data layer + +Own the data layer of **Time Machine** (see `CLAUDE.md`). Storage is **Postgres on the shared +server, its own `time_machine` database**. **No ORM, no migration framework** — the schema +self-bootstraps in `server/db.ts` `initDB()`. + +## Rules +- **Additive by default.** New field → `ALTER TABLE ... ADD COLUMN IF NOT EXISTS` inside + `initDB()` (idempotent, runs every boot). Add an index if it backs a read path. +- **Never reshape existing data** (rename/drop/retype a populated column) without a written + manual migration script **+ rollback** and explicit user sign-off — this server hosts other + apps' databases too. +- **Every query `user_id`-scoped and parameterised.** No string interpolation of user input. +- **DATE stays a string.** Keep `pg.types.setTypeParser(1082, …)` in `db.ts` or timezone drift + returns. +- **Transactions** for multi-row invariants (see reorder + rollover). + +## Verify safely +Use the smoke pattern from `docs/SETUP.md`: connect as admin → `CREATE DATABASE` if missing → +boot `dist/index.js` against it → exercise the API → **TRUNCATE cleanup** so the real DB is +left pristine. Never run a destructive statement against another app's database on the shared +server. Present schema diffs before applying. End with `## Next`. + +## Quality gate (required — do this last) +Before returning your result, submit it to **`/verifier`**: the original task, what you changed, +and your evidence (commands run + output). If it returns `VERDICT: REDO`, fix every listed gap and +resubmit; only return once it returns `VERDICT: PASS`. There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `/principal` to change approach, then keep going until PASS. Never skip this (`/verifier` itself is exempt, to avoid recursion). diff --git a/.claude/skills/designer/SKILL.md b/.claude/skills/designer/SKILL.md new file mode 100644 index 0000000..7b3b13c --- /dev/null +++ b/.claude/skills/designer/SKILL.md @@ -0,0 +1,31 @@ +--- +name: designer +description: UI/UX, layout, and the calm daily-list look & feel of Time Machine. Mockups + specs; writes small token-based CSS; hands big builds to /engineer. +--- + +# /designer — UI/UX + +Own the feel of **Time Machine** (see `CLAUDE.md`): a warm, calm, **single-column daily log** — +never a kanban board. Protect that identity. + +## Principles +- **One thing per screen.** *Today* is one day's list. *Review* is a quiet accomplishment + history. No columns, no swimlanes, no dense chrome. +- **Tokens only.** Everything derives from the CSS variables in `client/src/styles.css` + (`--ink`, `--surface`, `--surface-2`, `--accent`, `--work`, `--home`, radii, shadows, + fonts). Light + dark are both defined via `prefers-color-scheme` — change a *role*, never + drop a one-off hex. +- **Category = a whisper.** Work/Home are small tinted chips, not loud blocks. +- **Tactile & fast.** Big tap targets, an obvious check-off, restrained motion. +- **Accessible.** Visible focus rings, `aria-*` on the custom checkbox/tabs, contrast that + holds in both themes, usable down to ~360px. + +## How to deliver +Give a short spec (or an ASCII/inline mockup) and, for small changes, edit `styles.css` +yourself using the tokens. Hand structural component changes to `/engineer`. For non-trivial +visual direction, show the option and check in once. End with `## Next`. + +## Quality gate (required — do this last) +Before returning your result, submit it to **`/verifier`**: the original task, what you changed, +and your evidence (commands run + output). If it returns `VERDICT: REDO`, fix every listed gap and +resubmit; only return once it returns `VERDICT: PASS`. There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `/principal` to change approach, then keep going until PASS. Never skip this (`/verifier` itself is exempt, to avoid recursion). diff --git a/.claude/skills/devops/SKILL.md b/.claude/skills/devops/SKILL.md new file mode 100644 index 0000000..dae036d --- /dev/null +++ b/.claude/skills/devops/SKILL.md @@ -0,0 +1,33 @@ +--- +name: devops +description: Build/deploy runtime for Time Machine — the multi-stage Docker image, docker-compose, push-to-nas/deploy scripts, Synology reverse proxy, and the 3099 port lane. No cloud CI. +--- + +# /devops — build & deploy + +Own how **Time Machine** ships (see `CLAUDE.md` + `docs/SETUP.md`). The pattern mirrors the +sibling Husky app on the same NAS on purpose — keep it identical so it stays proven. + +## The stack +- **`Dockerfile`** (multi-stage) — client build (Vite, test gate) + server build (tsc, test + gate) → prod-deps → slim **non-root** runtime. Build tooling never reaches the final image; + pin the base image patch. +- **`docker-compose.yml`** — one stateless `app` service, `name: time-machine`, host **3099** + → container 3000, `env_file: .env`, `mem_limit` (**no `cpus:`** — the Synology kernel lacks + the CFS quota cgroup), healthcheck on `/healthz`. No `db` service, no volumes. +- **`scripts/deploy.sh`** (on the NAS) — preflight → build → `up -d --remove-orphans` → poll + health. Idempotent; never `down -v`. Handles DSM's minimal SSH PATH + sudo. +- **`scripts/push-to-nas.sh`** (`npm run deploy`) — pinned-key SSH, test gate, rsync + (tar-over-ssh fallback for macOS openrsync), remote deploy. Syncs `.env`; excludes build cruft. +- **Reverse proxy** — Synology maps `time-machine.mycloud.dp.ua` → `localhost:3099` (HTTPS). + +## Rules & verify +Keep the 3099 lane (husky 3080, utility 3040). `.env` **is synced** to the NAS by `npm run deploy` +(keep `NODE_ENV=production`; `.env.*` variants stay local; never baked into the image). Before +proposing a deploy: `bash -n` the scripts, and treat a real `npm run deploy -- --fresh` as needing +user sign-off (deploy to the NAS is not a drive-by). End with `## Next`. + +## Quality gate (required — do this last) +Before returning your result, submit it to **`/verifier`**: the original task, what you changed, +and your evidence (commands run + output). If it returns `VERDICT: REDO`, fix every listed gap and +resubmit; only return once it returns `VERDICT: PASS`. There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `/principal` to change approach, then keep going until PASS. Never skip this (`/verifier` itself is exempt, to avoid recursion). diff --git a/.claude/skills/docwriter/SKILL.md b/.claude/skills/docwriter/SKILL.md new file mode 100644 index 0000000..49e46e1 --- /dev/null +++ b/.claude/skills/docwriter/SKILL.md @@ -0,0 +1,30 @@ +--- +name: docwriter +description: Keep Time Machine's human docs in sync — README, docs/SETUP.md, CLAUDE.md, .env.example. Document what the code actually does; never paste real secrets. +--- + +# /docwriter — documentation + +Keep **Time Machine**'s docs true (see `CLAUDE.md`). + +## Surfaces +- **`README.md`** — what it is, the feature model (Today / Review / rollover / Work·Home), + dev quick start, the scripts table. +- **`docs/SETUP.md`** — the operational bible: env vars, the **create-the-database** step, + local dev, Docker build, NAS deploy (`npm run deploy` and on-NAS `deploy.sh`), reverse-proxy + mapping, and backup notes. +- **`CLAUDE.md`** — the map future agents load: roster, invariants, paths, port/domain/DB. +- **`.env.example`** — every required var with a safe placeholder. + +## Rules +- **Verify against source before writing** — read the code/scripts, don't guess. +- Keep the constants consistent everywhere: port **3099**, domain + **time-machine.mycloud.dp.ua**, DB **time_machine**, NAS path + **/volume1/docker/time-machine**. +- **Never** commit a real secret. Prefer editing an existing doc over adding a new one. +- Match the existing tone: concise, concrete, skimmable. End with `## Next`. + +## Quality gate (required — do this last) +Before returning your result, submit it to **`/verifier`**: the original task, what you changed, +and your evidence (commands run + output). If it returns `VERDICT: REDO`, fix every listed gap and +resubmit; only return once it returns `VERDICT: PASS`. There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `/principal` to change approach, then keep going until PASS. Never skip this (`/verifier` itself is exempt, to avoid recursion). diff --git a/.claude/skills/engineer/SKILL.md b/.claude/skills/engineer/SKILL.md new file mode 100644 index 0000000..cc704f2 --- /dev/null +++ b/.claude/skills/engineer/SKILL.md @@ -0,0 +1,38 @@ +--- +name: engineer +description: Write any Time Machine code — React 18 components, Express routes, TS, SQL wiring, config. Reads patterns first, self-reviews via /reviewer. +--- + +# /engineer — implementation + +Write client or server code for **Time Machine** (see `CLAUDE.md`). Read the neighbouring file +and match it before typing. + +## Map +- **Client** `client/src/` — React 18 function components + hooks, TS strict. Views live in + `components/`; shared logic in `lib/` (`api.ts` = the only path to the server, `dates.ts` = + local `YYYY-MM-DD` math). Styling = plain CSS via the tokens in `styles.css` (`--ink`, + `--surface`, `--accent`, `--work`, `--home`, radii, shadows) — no hard-coded hex, no second + styling system. Optimistic updates must roll back on error. +- **Server** `server/` — Express, TS strict, ESM with explicit `.js` import extensions. Validate + every request with a **zod** schema from `server/schemas.ts` (add new contracts there so + they're unit-testable). Every query is **`user_id`-scoped and parameterised**. Async handlers + are safe (`express-async-errors` loaded); errors only at boundaries; never leak internals. +- **Dates** are local calendar strings end to end — don't add UTC conversions (`db.ts` keeps + the DATE type a raw string on purpose). + +## Definition of done +1. `npm run typecheck` clean. +2. `npm test` (+ `npm --prefix client test` for client work) green. +3. `npm run build` if you touched the build surface. +4. Spawn `/reviewer`; fix every critical/major. +5. Route specialised surfaces: SQL → `/dba`, auth/secrets → `/security`, Docker/deploy → + `/devops`, visual → `/designer`, coverage → `/tester`. + +## Autonomy +Trivial one-liner → just do it. Non-trivial → short plan, one check-in, execute, show result. + +## Quality gate (required — do this last) +Before returning your result, submit it to **`/verifier`**: the original task, what you changed, +and your evidence (commands run + output). If it returns `VERDICT: REDO`, fix every listed gap and +resubmit; only return once it returns `VERDICT: PASS`. There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `/principal` to change approach, then keep going until PASS. Never skip this (`/verifier` itself is exempt, to avoid recursion). diff --git a/.claude/skills/principal/SKILL.md b/.claude/skills/principal/SKILL.md new file mode 100644 index 0000000..8e17d86 --- /dev/null +++ b/.claude/skills/principal/SKILL.md @@ -0,0 +1,40 @@ +--- +name: principal +description: Orchestrator and tiebreaker for Time Machine. Reads the request, picks the right agents, chains them, integrates results. Use when you don't know which agent to call. +--- + +# /principal — orchestrator + +You are the principal engineer on **Time Machine**, a single-user daily task-log +(Vite+React+TS client · Express+TS server · shared Postgres `time_machine` · Synology NAS at +`time-machine.mycloud.dp.ua`). Read `CLAUDE.md` for the full map before routing. + +## How to work +1. **Restate** the request in one line and name the surfaces it touches. +2. **Route** to specialists (spawn via the Agent tool, or advise the user to run the slash): + | Surface | Agent | + |---|---| + | data model / SQL / `initDB` / indexes | `dba` | + | client or server code | `engineer` (auto-spawns `reviewer`) | + | layout / visual / the daily-list feel | `designer` | + | auth / secrets / `.env` / public exposure / CVEs | `security` | + | Docker / compose / deploy scripts / reverse proxy | `devops` | + | vitest / smoke tests | `tester` | + | "should we / trade-off / new dep / schema shape" | `architect` (ADR first) | + | README / SETUP / CLAUDE.md | `docwriter` | +3. **Integrate** each agent's `## Next` into one coherent result. Resolve conflicts; the + simplest option that preserves the invariants wins. + +## Autonomy +- **Trivial** (one file, deterministic, no schema/deploy/auth surface) → just do it, one-line summary. +- **Non-trivial** → write a short plan, check in once, execute, show the result, check in once. + Auto-spawned chains skip check-ins — you already hold the user's intent. + +## Guardrails +Keep it **simple and not-kanban**. Never change the shape of existing DB columns, touch +secrets, or deploy to the NAS without explicit sign-off. End with a summary + `## Next`. + +## Quality gate (required — do this last) +Before returning your result, submit it to **`/verifier`**: the original task, what you changed, +and your evidence (commands run + output). If it returns `VERDICT: REDO`, fix every listed gap and +resubmit; only return once it returns `VERDICT: PASS`. There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `/principal` to change approach, then keep going until PASS. Never skip this (`/verifier` itself is exempt, to avoid recursion). diff --git a/.claude/skills/reviewer/SKILL.md b/.claude/skills/reviewer/SKILL.md new file mode 100644 index 0000000..cd5656d --- /dev/null +++ b/.claude/skills/reviewer/SKILL.md @@ -0,0 +1,30 @@ +--- +name: reviewer +description: Code review for Time Machine — auth/scoping, SQL safety, React hooks, TS strictness, timezone-safe dates, edge cases. Auto-spawned by /engineer; also invoke directly. +--- + +# /reviewer — code review + +Review code for **Time Machine** (see `CLAUDE.md`). **Never edit** — return findings ranked +critical → major → minor, each with `file:line` and a concrete failure scenario. + +## Checklist (priority order) +1. **Security/correctness** + - Every protected route behind `requireAuth`; every query scoped by `user_id`. + - SQL fully parameterised — no interpolation of user input anywhere. + - zod validates each body/query; bad input → 400, not a 500 or a silent pass. + - `done_at` is set/cleared together with `done`; rollover + reorder run in a transaction. +2. **React** — hook dependency arrays, no stale closures, stable `key`s, optimistic-update + rollback on failure, no direct state mutation, effects clean up (StrictMode double-invoke safe). +3. **TypeScript** — strict; no unjustified `any`; `noUncheckedIndexedAccess` honoured. +4. **Dates** — local `YYYY-MM-DD` preserved; no accidental `new Date(iso)` UTC parsing. +5. **Edge cases** — empty day, very long lists, 401 after session expiry, network-failure + branches in the client, concurrent toggles. + +Confirm `npm run typecheck` + `npm test` pass. Flag (don't fix) anything touching schema shape, +secrets, or deploy — route those to `/dba`, `/security`, `/devops`. End with `## Next`. + +## Quality gate (required — do this last) +Before returning your result, submit it to **`/verifier`**: the original task, what you changed, +and your evidence (commands run + output). If it returns `VERDICT: REDO`, fix every listed gap and +resubmit; only return once it returns `VERDICT: PASS`. There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `/principal` to change approach, then keep going until PASS. Never skip this (`/verifier` itself is exempt, to avoid recursion). diff --git a/.claude/skills/security/SKILL.md b/.claude/skills/security/SKILL.md new file mode 100644 index 0000000..05d9236 --- /dev/null +++ b/.claude/skills/security/SKILL.md @@ -0,0 +1,32 @@ +--- +name: security +description: AppSec auditor for Time Machine — single-user auth on a public domain, secrets/.env hygiene, input validation, CMS-free XSS surface, dep CVEs. Audits before merge; never edits. +--- + +# /security — AppSec + +Audit **Time Machine** (see `CLAUDE.md`). It's a **single-user app on a public domain**, so the +login *is* the perimeter. Report findings; **never edit code**. + +## Audit surface +- **Auth boundary** — every `/api/tasks*` route behind `requireAuth`; signed cookie-session + (`SESSION_SECRET`); `secure` cookie in prod (needs `trust proxy` + HTTPS via the reverse + proxy); login **rate-limited**; bcrypt compare runs even for unknown users (no timing oracle, + no username enumeration). +- **Secrets** — `.env` gitignored, never baked into an image; synced to the NAS over SSH + (encrypted) by `npm run deploy` and read at runtime via compose `env_file`; no secret in logs + or error responses; nothing secret ever gets bundled into the client (same-origin, no + build-time injection). +- **Input / IDOR** — zod on every body/query; SQL parameterised; `user_id` scoping on every row. +- **XSS/headers** — helmet CSP is `'self'`; titles render as React text (no + `dangerouslySetInnerHTML`). Keep both. +- **Dependencies** — `npm audit` on root + client; flag high/critical with the upgrade path. + +## Output +Ranked findings (critical → minor), each with file:line, impact, and a fix owner. Hand fixes to +`/engineer` / `/dba` / `/devops`. End with `## Next`. + +## Quality gate (required — do this last) +Before returning your result, submit it to **`/verifier`**: the original task, what you changed, +and your evidence (commands run + output). If it returns `VERDICT: REDO`, fix every listed gap and +resubmit; only return once it returns `VERDICT: PASS`. There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `/principal` to change approach, then keep going until PASS. Never skip this (`/verifier` itself is exempt, to avoid recursion). diff --git a/.claude/skills/tester/SKILL.md b/.claude/skills/tester/SKILL.md new file mode 100644 index 0000000..c2578c5 --- /dev/null +++ b/.claude/skills/tester/SKILL.md @@ -0,0 +1,32 @@ +--- +name: tester +description: Test infra + writing/running for Time Machine — vitest (server schemas + client dates/components), the create-db→boot→exercise→truncate smoke pattern. Distinguishes flaky from real. +--- + +# /tester — tests + +Own tests for **Time Machine** (see `CLAUDE.md`). + +## Suites +- **Server** — `vitest` (node env, `vitest.config.ts`). Pure/contract tests; the natural seam + is `server/schemas.ts` (zod) and any extracted pure helper. DB-free, fast, deterministic — + this is the deploy gate (`npm test`). +- **Client** — `vitest` (jsdom, `client/vite.config.ts`). `lib/dates.ts` (timezone-safe math) + and component behaviour via `@testing-library/react`: add / toggle / delete / rollover, and + optimistic-update rollback with a mocked `lib/api`. + +## Full-stack smoke (when correctness spans the DB) +Follow `docs/SETUP.md`: create the DB → spawn `dist/index.js` against it → drive the API with a +cookie jar (remember cookie-session sets **two** cookies — capture both via `getSetCookie()`) → +assert → **TRUNCATE cleanup**. Never leave rows in the real DB; never point a destructive test +at another database on the shared server. + +## Discipline +Write the minimum meaningful test, run it, and separate real failures from flakes (re-run, +inspect). Hand regressions to `/engineer` or `/dba`. Propose new infra before bootstrapping it. +End with `## Next`. + +## Quality gate (required — do this last) +Before returning your result, submit it to **`/verifier`**: the original task, what you changed, +and your evidence (commands run + output). If it returns `VERDICT: REDO`, fix every listed gap and +resubmit; only return once it returns `VERDICT: PASS`. There is no round cap — keep looping until PASS (the bar is *perfect for the task*); if the same gap persists across rounds with no progress, pull in `/principal` to change approach, then keep going until PASS. Never skip this (`/verifier` itself is exempt, to avoid recursion). diff --git a/.claude/skills/verifier/SKILL.md b/.claude/skills/verifier/SKILL.md new file mode 100644 index 0000000..911544e --- /dev/null +++ b/.claude/skills/verifier/SKILL.md @@ -0,0 +1,70 @@ +--- +name: verifier +description: Universal quality gate for Time Machine — every agent's result passes through here before returning. Independently checks the work against the task + invariants and returns PASS or REDO with ordered fixes. Read-only; never edits; never recurses. +--- + +# /verifier — the quality gate + +You are the **verifier**, the final acceptance gate for the whole team (see `CLAUDE.md`). Every +other agent submits its result to you before it may return; you decide `PASS` or `REDO`. You +**never edit code** and you **never call another verifier**. + +## Submission you expect +1. The **original task / user intent** (verbatim if possible). +2. **What changed** — files touched, decisions made. +3. **Evidence** — the exact commands run and their output. + +Missing any of the three → `REDO` ("show task, diff, and passing evidence"). + +## The rubric — verify each; re-run, don't trust +1. **Task fit** — does it satisfy *all* of the ask? Dropped requirements or scope drift → REDO. +2. **Correctness & evidence** — reproduce the checks yourself: `npm run typecheck`, `npm test` + (+ `npm --prefix client test`), `npm run build`, `bash -n` for scripts, a DB/API smoke + (create-db → boot `dist` → exercise → TRUNCATE cleanup). Unproven claim → REDO. +3. **Invariants** (`CLAUDE.md`) — single-user; not kanban; additive-only self-bootstrapping + schema; `user_id`-scoped, parameterised SQL; local `YYYY-MM-DD` dates; CSS tokens only; + secrets never bundled/baked; port **3099**; no unapproved dependency / schema reshape / deploy. +4. **Completeness** — no half-done work, stray TODOs, or docs/tests left behind. +5. **Simplicity** — matches existing patterns; no over-engineering. +6. **Alternatives weighed** — for a non-trivial design/impl choice, the agent must have compared + **at least one credible alternative** and justified the pick on trade-offs (cost, bundle, + migration, invariant fit, reuse). One approach with no comparison → REDO: send it back to weigh + the named alternative(s) (a lighter dep, a different data shape, reusing an existing + endpoint/pattern, a no-code option) as a short options table (approach · pro · con · why-not). + Trivial mechanical changes are exempt. + +## Adversarial stance — try to BREAK it, default to REDO under doubt +A gate that always PASSes is worthless — *falsify* the claim, don't confirm it: +- **Attempt to break the change** — name at least **2–3 concrete failure scenarios** you tried + (input/state → observed output): empty/oversized value, another user's row, a date-boundary/TZ + case, a 401/500 path, a concurrent write, a stored-XSS payload. "Looks right" is not verification. +- **Reproduce, don't relay** — re-run the commands yourself for anything non-trivial; a PASS resting + only on the agent's quoted output is a REDO. +- **Default to REDO under uncertainty** — a check you couldn't reproduce, or a plausible failure you + couldn't rule out, is a REDO. The burden of proof is on the work. +- **Rubber-stamp red flags (any → do more before PASS):** nothing re-run; zero failure scenarios + tried; verdict restates the agent's claims; "looks fine / should work"; "proportional" used to + skip probing a real auth/schema/deploy/XSS surface. +One-liners still get one real check, not three attacks — but never let "proportional" excuse leaving +a load-bearing change unprobed. + +## Audit log — REQUIRED on every verdict +After deciding, append one line to `claude_artifacts/verifier-log.md` (create if missing) via Bash, +so every check is recorded — PASS or REDO. It's the ONE file you may write (it records judgement, +never edits the reviewed work); never rewrite earlier entries. Format: + + printf '%s\n' "- $(date '+%Y-%m-%d %H:%M') · · · VERDICT: · re-ran: · probed: · " >> claude_artifacts/verifier-log.md + +## Verdict (end with exactly one) +- **`VERDICT: PASS`** — state **both** the commands you re-ran (+results) and the failure scenarios + you probed (+how they held); a PASS with no probe listed is not yet a PASS. Then append the log line. +- **`VERDICT: REDO`** — a numbered, prioritized list (most critical first): each gap, where it is + (file:line / failing command / missing case), and how to fix it. Then append the log line. + +## Discipline +Be **proportional** — a one-line change gets a quick check; schema/deploy/auth/security gets the +full rubric. Read-only: return the job, never fix it. There is **no round cap** — keep returning +`VERDICT: REDO` until the work genuinely passes. If the same gap survives several rounds with **no +progress**, add `## Escalate: principal` so principal can change the approach — to get unstuck and +continue toward PASS, never to give up. Hold the bar at *perfect for the task* — approve because +it's right, not because it's close. diff --git a/.deploy.env.example b/.deploy.env.example new file mode 100644 index 0000000..619a98b --- /dev/null +++ b/.deploy.env.example @@ -0,0 +1,10 @@ +# OPTIONAL per-machine deploy overrides for `npm run deploy` (scripts/push-to-nas.sh). +# The script already has baked-in defaults for the FORGE NAS, so this file is only +# needed to override them. Copy to `.deploy.env` (gitignored) and uncomment what +# you need. Holds NO app secrets — the app's `.env` lives on the NAS. + +# NAS_HOST=mycloud.dp.ua # NAS hostname (public host; or a LAN IP like 192.168.50.2) +# NAS_USER=d.tkachenko # SSH user on the NAS +# NAS_PORT=2323 # Synology SSH port +# NAS_PATH=/volume1/docker/forge # deploy dir on the NAS (must contain the NAS .env) +# NAS_KEY=$HOME/.ssh/id_ed25519 # SSH private key (IdentitiesOnly is pinned) diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..fd64c89 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,18 @@ +node_modules +client/node_modules +dist +client/dist +.git +.env +.env.* +*.log +.DS_Store +# macOS AppleDouble sidecars — NUL-byte xattr files that break esbuild if copied. +**/._* +._* +storage-dump.json +.deploy.env +claude_artifacts +extension +README.md +docs diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..86bb49e --- /dev/null +++ b/.env.example @@ -0,0 +1,36 @@ +# FORGE — environment template. Copy to `.env` and fill in. +# `.env` is gitignored and never baked into a Docker image (compose reads it at runtime). +# +# LOCAL DEV: set DATABASE_URL + SESSION_SECRET + AUTH_USER/PASS below. +# PRODUCTION (Synology / docker compose): compose OVERRIDES DATABASE_URL, PORT and +# NODE_ENV itself; the .env on the NAS only needs the *** REQUIRED IN PROD *** vars: +# SESSION_SECRET, AUTH_USER, AUTH_PASS, POSTGRES_PASSWORD. + +# --- Database ------------------------------------------------------------- +# Postgres for the `forge` database. Schema self-bootstraps (initDB) + seeds on +# first run. LOCAL DEV only — in compose this is set to the bundled `db` service. +DATABASE_URL=postgresql://forge:forge@localhost:5432/forge + +# HTTP port the server listens on (container-internal; compose maps it to host 3089). +PORT=3000 + +# development locally; compose sets production on the NAS. +NODE_ENV=development + +# --- Read-API auth (*** SESSION_SECRET/AUTH_PASS REQUIRED IN PROD ***) ----- +# Session signing secret. Generate with: openssl rand -base64 32 +SESSION_SECRET=change_me_generate_with_openssl_rand_base64_32 + +# Bootstrap admin account, seeded into app_users on first boot (bcrypt-hashed, role +# admin). Changing AUTH_PASS later does NOT update an already-seeded account — manage +# users in the app (Admin → Users) instead. +AUTH_USER=admin +AUTH_PASS=change_me + +# --- Postgres (compose bundled db — *** REQUIRED IN PROD ***) -------------- +# The bundled Postgres password used by docker-compose. Use a strong value in prod. +POSTGRES_PASSWORD=change_me_strong_db_password + +# Sync tokens for the Chrome extension are created in the app (Admin → API Tokens, +# admin only) or via the CLI: npx tsx server/mint-token.ts "my laptop" +# (The old ADMIN_KEY HTTP gate was removed — tokens are now admin-role gated.) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..012e028 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +/tmp +/out-tsc + +# dependencies +node_modules +/client/node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/.pnp +.pnp.js + +# build output +/dist +/client/dist + +# env / secrets +.env +.env.local +.env.*.local + +# raw Let it Snow storage dump — a dev artifact with real PII, not an app input. +# Convert it to the seed archives with `npm run dump-to-archives` instead. +storage-dump.json + +# editor +.vscode/* +.DS_Store + +# NAS deploy config (not secret, but host-specific) +.deploy.env diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3703440 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,145 @@ +# Changelog + +All notable changes to **FORGE** are documented here. +Format based on [Keep a Changelog](https://keepachangelog.com/); this project uses +[Semantic Versioning](https://semver.org/). + +## [2.3.0] — 2026-08-27 + +### Added +- **Jira status durations (chart #17)** — a new "Jira status durations (avg days)" + chart on the Active-stats page: average time each Jira workflow status is held, + in the board's column order, min-2-tickets. Server endpoint + `GET /api/analytics/jira-durations` (PM+) aggregates `jira.statusDurations` (ms) + across tickets. +- The extension's Jira collector now fetches each issue's **changelog** + (`expand=changelog`) and computes **`statusDurations`** (time per status) + + **`movements`** (`{at, who, from, to}`), sent inside the `jira` object. +- Seed enrichment: `statusDurations` + the Jira **workflow column order** are ingested + from the dump's `jira_board_state` (so the chart is populated before any live sync — + 73 seeded tickets carry durations). `JiraInfo` type extended with `statusDurations`/`movements`. + +## [2.2.0] — 2026-08-27 + +### Added +- **Jira sync in the extension** (per the sync ADR). One "Sync now" now refreshes + **SNOW then Jira**: SNOW stays as the in-page same-origin session collector → + `/api/sync`; Jira is pulled by a new service-worker collector via **direct REST** + (`/rest/agile/1.0/board/{id}/issue`) authenticated with a **Jira API token** — + Basic (email+token, Cloud) or **Bearer PAT** (Server/DC, e.g. `support.dataart.com`). + Issue links are built as `/browse/` (custom Jira domains supported). +- New extension options: Jira base URL, email, API token/PAT, and board id(s). +- New server endpoint **`POST /api/sync/jira`** — **attach-only**: updates only the + `jira` JSONB (merged) + `jira_key` on existing tickets, keyed by RITM number; never + touches status/state/assignee/activity (avoids the ticket-upsert clobber). Token-authed. + Jira RITM↔issue resolved via `customfield_26001` or a `RITM\d+` regex; Jira failures are + best-effort and never fail a successful SNOW sync. + + + +### Added +- **Polished Excel export** — the board's Excel export is now filterable and readable: + the **ticket Number is a clickable ServiceNow hyperlink** (a real OOXML hyperlink + relationship — locale-proof, unlike a `HYPERLINK()` formula which breaks in `;`-locale + Excel), **auto-filter** on every column, **zebra-striped rows**, taller rows + wider + columns, a frozen indigo header, right-aligned numbers, `#,##0` cost, short dates, and + a **dated filename** (`forge-active-tickets-YYYY-MM-DD.xlsx`). The standalone Link column + was folded into the Number cell. (auto-filter + hyperlinks injected via `fflate`.) +- App **favicon** (indigo snowflake) + `theme-color`. +- A proper **Excel-brand button icon** (green tile) replacing the placeholder glyph. + +### Changed +- RITM number links out to ServiceNow in the ticket table + board cards (new tab). +- Deploy: ported Husky's `push-to-nas.sh` + on-NAS `deploy.sh` (SSH key pinning, + openrsync→tar fallback, Synology PATH/sudo, health poll, `forge-db` volume preserved + on `--fresh`); macOS AppleDouble (`._*`) files excluded from sync/build/tests. + +### Dependencies +- Added `fflate` (xlsx auto-filter post-processing). `write-excel-file` pinned at 2.x + (v4 drops the default export + still has no hyperlink support). + +## [2.0.0] — 2026-08-27 · **FORGE 2.0** + +The analytics release. FORGE grows from a ticket board into a full ServiceNow +analytics portal ported from the *Let it Snow* Chrome extension, with role-based +access, admin tooling, and the complete statistics suite. + +### Added +- **Full analytics data ingest.** The seed now loads the entire `analytics_data` + master (954 ticket records) merged with the operational cache, plus SLA norms, + FX rates, size thresholds, brand palette, and the colleague roster. New ticket + columns (all additive): `currency_code, opened_by, opened_date, closed_date, + to_do_at, in_uat_at, jira_key, ticket_year, size, po_number, invoiced`. A + reproducible `dump-to-archives` → `reseed` pipeline regenerates seed data from a + storage dump. `app_config` key/value table for norms/thresholds/palettes. +- **Server analytics engine** (`server/analytics.ts`, `server/insights.ts`): + `/api/analytics/overview`, `/api/analytics/sla`, `/api/insights`, `/api/config`. +- **Overall statistics** page — year-overlay grouped bars (opened/closed/revenue, + bars↔line + YoY%), a Cost↔Tickets toggle, a ticket-share donut (#/% + top-N), + brand→market and requester→brand drill-downs, KPI tiles, lifetime histogram. +- **Active statistics** page — by-status, age distribution, opened-per-month, + median days-in-status, by-brand. +- **PM KPIs — SLA** page — six PM×size heatmaps (TTFR, PM response, avg-close, + OTD, assign, preview) scored against per-size norms, green/red vs target. +- **PM Insights** page — problem/alert KPIs over the active backlog (unassigned, + on-hold, WIP-stalled, customer-replied, awaiting, lifetime, inactive), Jira-breach + and client-owed rules, waiting-PO with L1/L2/L3 escalation, revenue-at-risk, and + a per-PM roll-up. (Rev-at-risk matches the initial app's own figure within rounding.) +- **Board redesign** — 7-state kanban (Unassigned → Open/Assigned → On Hold → WIP → + Customer replied → Awaiting) with the WIP→"Customer replied" pseudo-status, SLA + subtitles, per-column counts, brand/market/PM filters, board/list toggle, and a + ticket detail modal. +- **Role-based access control** — four roles (Viewer, PM, Project Leadership, Admin) + enforced server-side per route; the client hides nav/pages above a user's role. + Only admins can create admins. +- **Admin page** — user management (Project Leadership+) and API-token management + (Admin only): create/list/revoke `fg_…` sync tokens from the UI. +- **Filtered Excel export** — the board's ⭳ Excel button exports the currently + filtered tickets as a styled `.xlsx` (branded indigo frozen header, per-column + widths, right-aligned numbers, `#,##0` cost, short dates, grid borders). +- **Finance ingest** — cost + PO + invoiced per ticket from the finance sheet, + enriching active tickets with cost/size and powering waiting-PO. +- Config bundle exposed via `/api/config` (brand colours, colleagues, norms, FX). + +### Changed +- All analytics pages are **full-width** (removed the 1280px cap). +- `/api/tokens` is now gated by the **admin session role** instead of an `ADMIN_KEY` + header. The `mint-token` CLI is unchanged. +- Non-destructive sync upsert: a thin sync no longer nulls seeded-rich fields + (`COALESCE`/`CASE` preserve brand/market/description/jira/activity/analytics). + +### Fixed +- `due_date` timezone off-by-one (emit local `YYYY-MM-DD`, not `toISOString()`). +- Activity render-crash vector (ingest sanitizes activity entries; `parseDate` guards). +- Seed "active wins" ordering on tickets present in both archives. +- Ticket-share donut used a truncated distribution (center 375); now the full 966. + +### Security +- Read-API authentication (session, username+password, bcrypt, Postgres session store). +- Least-privilege database role (`forge_app`, not a superuser) owns the app tables. +- API tokens: `fg__`, only the SHA-256 stored, constant-time verify, + revocable; `token_hash` never leaked by the list endpoint. +- RBAC hardening (post-audit): only an admin can delete an admin; the **last admin** + cannot be deleted (lockout guard); deleting a user **purges their sessions**; the + session id is **regenerated on login** (anti session-fixation); delete of a missing + user returns 404. + +## [1.0.0] — 2026-08-27 + +Initial full-stack scaffold, ported from the *Let it Snow* Chrome extension onto the +*Husky repo list* template. + +### Added +- Vite + React 18 + TypeScript client (SCSS modules, react-router) with a Sidebar/ + TopBar layout; Active board, Closed, and basic Statistics pages. +- Express + TypeScript server on Postgres (`forge`); self-bootstrapping schema + (`initDB`) that seeds bundled ticket archives on first boot. +- REST API: `/api/tickets`, `/api/tickets/:number`, `/api/stats`, `/healthz`, and a + token-authed `/api/sync` ingest. +- Chrome sync extension ("FORGE Snow Sync") — reads active RITM tickets from the + ServiceNow Table API and pushes them to the portal with a bearer token. +- Multi-stage Dockerfile + docker-compose (bundled Postgres) targeting + `forge.mycloud.dp.ua`; README + SETUP docs. + +[2.0.0]: #200--2026-08-27--forge-20 +[1.0.0]: #100--2026-08-27 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8d7affd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,56 @@ +# syntax=docker/dockerfile:1.7 +# +# FORGE — multi-stage build. Two sub-builds feed one slim runtime: +# - client (Vite/React) -> client/dist (static assets) +# - server (tsc) -> dist/index.js (Express API + static server) +# +# Base pinned to a specific patch; bump deliberately. The runtime carries only +# prod deps (`--omit=dev`) + the two build outputs, and runs as the non-root +# `node` user. + +FROM node:20.19.6-alpine3.21 AS base + +# --- Stage 1: client build -------------------------------------------------- +FROM base AS client-build +WORKDIR /build/client +COPY client/package.json client/package-lock.json* ./ +RUN npm install +COPY client/ ./ +RUN npm test +RUN npm run build + +# --- Stage 2: server build -------------------------------------------------- +FROM base AS server-build +WORKDIR /build +COPY package.json package-lock.json* ./ +RUN npm install +COPY tsconfig.json ./ +COPY index.ts ./ +COPY server/ ./server/ +RUN npx tsc + +# --- Stage 3: prod deps ----------------------------------------------------- +FROM base AS prod-deps +WORKDIR /app +COPY package.json package-lock.json* ./ +RUN npm install --omit=dev + +# --- Stage 4: runtime ------------------------------------------------------- +FROM base AS runtime +WORKDIR /app +ENV NODE_ENV=production \ + PORT=3000 + +COPY --from=prod-deps --chown=node:node /app/node_modules ./node_modules +COPY --from=server-build --chown=node:node /build/dist ./dist +COPY --from=server-build --chown=node:node /build/server/data ./dist/server/data +COPY --from=client-build --chown=node:node /build/client/dist ./client/dist +COPY --chown=node:node package.json ./ + +USER node +EXPOSE 3000 + +HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ + CMD wget --spider -q http://localhost:3000/healthz || exit 1 + +CMD ["node", "dist/index.js"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..9535205 --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +# FORGE + +A ServiceNow ticket dashboard for the *Marketing Web Presence* L3 queues — +RITM/SCTASK requests pulled out of ServiceNow and shown as an operational board +plus closed-ticket analytics. Ported from the **Let it Snow** Chrome extension +into a full-stack web app, built on the shape of the *Husky repo list* template. + +``` +┌──────────────┐ Bearer token ┌───────────────┐ Postgres +│ Chrome ext │ ──── POST /api/sync ─▶│ FORGE server │ ────────────▶ forge DB +│ (Snow Sync) │ │ Express + TS │ +└──────────────┘ └───────┬───────┘ + ▲ │ serves + reads ServiceNow ▼ + Table API in-page ┌───────────────────────────┐ + │ React client (Vite + TS) │ + │ Board · Closed · Stats │ + └───────────────────────────┘ +``` + +## Stack + +- **client/** — React 18 + Vite + TypeScript, SCSS modules, react-router. Three + views: **Active board** (filters, search, ticket detail + activity timeline), + **Closed** (cost / time-to-first-reply analytics), **Statistics** (distribution). +- **server** (`index.ts` + `server/`) — Express + TypeScript on Postgres. Schema + self-bootstraps in `initDB()` and seeds the bundled ticket archives on first + boot. REST: `GET /api/tickets`, `/api/tickets/:number`, `/api/stats`, `/healthz`, + and a token-authed `POST /api/sync` ingest. +- **extension/** — a Manifest V3 Chrome extension ("FORGE Snow Sync") that reads + active RITM tickets from the ServiceNow Table API and pushes them to the server + with an API token, exactly like the Husky sync extension. + +## Quick start (local) + +```bash +# 1. a Postgres named `forge` (compose brings one up, or use your own) +docker compose up -d db # or point DATABASE_URL at any Postgres + +cp .env.example .env # DATABASE_URL defaults to the compose db + +# 2. install + run both server and client with live reload +npm install +npm run dev # server :3000, client :5173 (proxies /api) +``` + +Open http://localhost:5173 and sign in with the `AUTH_USER` / `AUTH_PASS` you +set in `.env` (the read UI is auth-gated; see [docs/SETUP.md](docs/SETUP.md#3-log-in-read-api-auth)). +On first boot the server seeds the ticket archives +in `server/data/*.json` (**100 active + 866 closed** after de-duping the ~99 +tickets that appear in both), so the board is populated before any real sync +runs. Those archives are generated from a Let it Snow storage dump — see +[docs/SETUP.md](docs/SETUP.md#seed-data) to regenerate them. + +## Production + +```bash +docker compose up -d --build # app on host :3099, bundled Postgres +``` + +Behind the Synology reverse proxy this is what **forge.mycloud.dp.ua** maps to. + +See **[docs/SETUP.md](docs/SETUP.md)** for the sync token + Chrome extension setup. + +## Tests + +```bash +npm test # client (vitest) + server (vitest) +``` diff --git a/claude_artifacts/FORGE-parity-spec.md b/claude_artifacts/FORGE-parity-spec.md new file mode 100644 index 0000000..8284984 --- /dev/null +++ b/claude_artifacts/FORGE-parity-spec.md @@ -0,0 +1,214 @@ +# FORGE parity spec — rebuilding "Let it Snow" on FORGE (Husky design) + +Deep-check of the initial app (`/Users/dmytrotkachenko/WebstormProjects/Let It Snow`) +cross-referenced with `storage-dump.json` (its localStorage export) and the Husky +design template. Goal: a **functionally near-identical** app under FORGE's stack +(Vite+React+TS client · Express+TS server · Postgres `forge`) with a **new view** +built from Husky's hand-rolled chart components. + +Sources: 6 discovery agents (analytics charts · KPI/SLA/finance · board behavior · +data inventory · Husky design · architecture docs). All findings self-verified. + +--- + +## 0. Load-bearing architecture facts + +1. **Every board is a READ-ONLY mirror** rebuilt from storage by background scans. + No drag-and-drop write-back to ServiceNow/Jira anywhere (the ADO board has local + DnD only; the one write action is "Create Jira"). → FORGE keeps its model: the + Chrome extension scans and POSTs to `/api/sync`; the web app renders DB state and + links out to ServiceNow/Jira for changes. **No transitions to build.** +2. **Single analytics source** in the app: `analytics_data` (954 `ticketsMeta` records + + precomputed aggregations). Everything else enriches it, joined on the **RITM number**. +3. **No charting library** in either app — Let it Snow hand-rolls SVG/CSS; Husky does too. + FORGE rebuilds charts as Husky components (or a real lib if we choose; spec assumes Husky-style). +4. **Money rule:** `finalCost = 0` means *absence of price, not free work* — never counts + as money, never gets a size, always a "missing cost" margin leak. +5. **Currency:** display currency (default GBP); **fixed** cross-rates `1 GBP = 1.2 EUR = 20 MXN`. + +--- + +## 1. Feature/view map (initial app) + +| Screen | Rebuild target in FORGE | +|---|---| +| Popup (RITM list + Jira tab) | N/A (extension already syncs; optional toolbar) | +| **Dashboard: Kanban board + List view** | **Board page** (7-state columns, filters, card fields, list toggle) | +| **Analytics panel — 3 tabs: Overall / Active / PMs KPI** | **3 analytics pages** (the bulk of "missing statistics") | +| **PM Insights popup** (alert KPIs + drill-downs + Excel) | **Insights page** | +| At-risk / AI Advisor | **OUT OF SCOPE** (user excluded AI) | +| Jira board (read-only mirror) | **Jira board page** (later phase) | +| Size CALC (labor→size estimator) | **Tool** (later phase) | +| Figma links, Teams, Weather | out of scope / optional | + +Excluded per DEAD_CODE.md: `melody.js`, removed finance-filter UI, live-FX fetch, +USD from FX cache, Assist/Jira bar-graph toggle (replaced by dual calendars). + +--- + +## 2. Statistics / charts inventory (29) → Husky component mapping + +### TAB 1 — Overall (11) +| # | Chart | Data | Husky component | +|---|---|---|---| +| 1 | Opened per month (grouped bars ±YoY, Brand/Market/CGO sub-group, bar/line) | `openedByMonth`/`ByDay`, `ticketsMeta` | new `GroupedBars` (from `MonthlyByUser`) + `TrendArea` | +| 2 | Closed per month | `closedByMonth` | same | +| 3 | Revenue per month (closed, cost/tickets, ±YoY) | `ticketsMeta.finalCost`+FX | `GroupedBars`/`TrendArea` | +| 4 | Lifetime-at-close histogram (6 buckets) + median/avg/closed tiles | `ticketsMeta` open→close | `BucketBars` + `KpiTile`×3 | +| 5 | Opened YoY pie (fair/full) | `openedByDay` | `StateDonut`/`DonutChart` | +| 6 | Closed YoY pie | `closedByDay` | donut | +| 7 | By business unit (per-year, brand drill-down) | `ticketsMeta.businessUnit` | `BucketBars` + expandable | +| 8 | By requester (bars + YoY, market drill-down) | `byRequester` | `RequestorBars` + drill | +| 9 | Ticket-share donut (#/%, top 18 + Others) | `byRequester` | `StateDonut`/`InsightChart` pie | +| 10 | By brand (per-year segments, market drill, YoY) | `ticketsMeta.brand/market` | `BucketBars` segmented | +| 11 | By market | same | `BucketBars` | + +### TAB 2 — Active (6) — from live board tickets (status='active') +| # | Chart | Data | Husky component | +|---|---|---|---| +| 12 | Open-not-closed by month | active tickets | `TrendArea`/bars | +| 13 | By status (6 kanban cats) | active | `BucketBars` (state colors) | +| 14 | Age histogram (0-50…200+ days) | active openedAt | `BucketBars` | +| 15 | Time-in-status min/median/max | active | grouped mini-bars | +| 16 | By brand, status-segmented (market drill) | active | stacked `BucketBars` | +| 17 | Jira status durations (workflow order) | `jira_status_map.statusDurations` | `BucketBars` ordered | + +### TAB 3 — PMs KPI (12) +| # | Chart | Data | Husky component | +|---|---|---|---| +| 18 | Workload by month (revenue, prev/cur yr, per-PM) | `ticketsMeta` closed cost | `GroupedBars` + `MonthlyByUser` | +| 19 | PM Engagement (backlog/Assist✓/Jira✓/Stale) + **dual daily-activity heatmaps** | live `meta.activity` + `jira movements` | `AssigneeBars` + **new `CalendarHeatmap`** | +| 20 | Missing final cost (ranked PM bars + drill) | `ticketsMeta.finalCost` null | `AssigneeBars` + list | +| 21 | Awaiting PO (ranked, Cost/Avg-d/Max-d, sortable) | finance PO + `sn_waiting_po_meta` + Jira | `AssigneeBars` + table | +| 22 | No-cost by brand/market | derived | `BucketBars`×2 | +| 23 | Awaiting-PO by brand/market | derived | `BucketBars`×2 | +| 24 | **On-Time Delivery** heatmap (PM×size, cur+prev yr) + editable norms | close-days vs `otd_day_norms` | **new `KpiHeatmap`** | +| 25 | **Avg days to close** heatmap | vs `avgdays_day_norms` | `KpiHeatmap` | +| 26 | **Time to assign PM** heatmap | `firstAssignedDate` vs `asla_day_norms` | `KpiHeatmap` | +| 27 | **Time to send preview** heatmap | `inUatAt` vs `psla_day_norms` | `KpiHeatmap` | +| 28 | **Avg TTFR** heatmap | `ttfrMinutes` vs `lisr_ttfr_norms` (hrs) | `KpiHeatmap` | +| 29 | **Avg PM response** heatmap | `clientRespMinutes` vs `lisr_cresp_norms` | `KpiHeatmap` | + +**New components needed** (not in Husky): `KpiHeatmap` (PM×size grid vs norms, green/red), +`CalendarHeatmap` (GitHub-style daily activity), `GroupedBars` (multi-year month bars — extend `MonthlyByUser`), a period/granularity control (year/quarter/month + ±YoY). + +### KPI definitions (SLA grid #24–29) +- **TTFR** = `ttfrMinutes/1440` (days), anchor `openedDate`, norm hours. +- **PM response (cresp)** = `clientRespMinutes/1440`, anchor `openedDate`. (Our reply speed, not client wait.) +- **Avg close** = `daysBetween(opened, closed)`, anchor `closedDate`. +- **OTD** = same duration scored vs `otd_day_norms`; on-time% = onTime·100/scored. +- **Assign SLA** = `max(0, daysBetween(fulfillment, firstAssigned))`, anchor `fulfillmentDate`. +- **Preview SLA** = `daysBetween(toDoAt, inUatAt)`, anchor `inUatAt`. +- Grid cell = `{avgDays, count, onTime, onTimePct}`, per PM×size; "No cost" column norm = 1d. +- Periods: current vs previous Year, and Q1–Q4 each. + +--- + +## 3. PM Insights alert KPIs (the Insights page) + +Thresholds `insights_thresholds` (days): `unassigned:1, assigned:2, hold:5, wip:7, +customerReplied:3, awaiting:7, lifetime:90, jiraStuck:7, jiraUAT:7, noChase:5, +waitingPo1:7, waitingPo2:14, waitingPo3:21`. + +Alert lists: Unassigned · Open/Assigned-long · On-Hold (age OR jiraBreached OR clientOwed) +· WIP-stalled (Jira age) · WIP-no-Jira · Customer-replied · Awaiting-info · Lifetime-monsters +(≥90d) · Inactive-requester · **∑ Total Alerts**. Waiting-PO with L1/L2/L3 escalation + +`waitingPoRevenue`. PM-KPI table: **# Tickets · $ Revenue · ⚠ Rev-at-Risk** (sortable, +hidden PMs from `pm_kpi_settings`). Excel export preserves PM→Size→Ticket grouping. + +Support rules: `_jiraBreached`, `_clientOwed` (client replied last ≥1d), `_isAwaitingAgency` +(WIP + last touch by client → "Customer replied"). + +--- + +## 4. Board page (7-state kanban + list) + +Columns (fixed order): **Unassigned → Open/Assigned → On Hold → [WIP · Customer-replied · +Awaiting]* → Closed/Awaiting-PO**. `*` middle-3 reorderable via group-by (6 perms). +- **Customer-replied** is a pseudo-status: WIP ticket where `lastActivityBy` ∉ colleague roster. +- Column SLA subtitles ("assign within Nd", "max Nd in progress", …); per-column count. +- Filters: search, brand, market, assignee(+region EU/LATAM sentinels), requester, custom-label, + jira-assignee, jira-status, staleness (stale/updated/inactive/PO/jira-stuck/missing-cost), hide-empty, hide-cost. +- Sort (14): default/number/status-age/lifetime/jira/brand/cost/due/analyzed. +- **16 toggleable card fields** (`card_fields`): stateBadge, shortDesc, description, assignee, + group, brand-market pill, raisedBy, lifetime, dueDate, stateChanged, lastActivity, comments, + createJira, jiraStatus, jiraBar, teamsLink. +- Card click → opens ServiceNow in new tab (no in-app transition). List view = same data as table. +- Waiting-PO detection: synthetic closed card OR Jira "Waiting PO" OR empty PO cell in finance Excel. + +--- + +## 5. Data contract — what to ingest (fixes "not all statistics moved") + +FORGE currently seeds only 3 dump keys (`sn_tickets`, `analytics_meta_cache`, `jira_status_map` +→ 966 tickets). The analytics engine needs the **full** dump: + +| Dump key | Rows | Feeds | +|---|---|---| +| **`analytics_data.ticketsMeta`** | **954** | THE analytics dataset (SLA/cost/jira/dates) — charts 1-11,18-29 | +| `analytics_data.{openedByMonth,closedByMonth,openedByDay,closedByDay}` | — | time-series (or recompute server-side) | +| `analytics_data.byRequester(Numbers)` | 280 | requester/brand/market drill-downs | +| `analytics_meta_cache` | 965 | closed-ticket enrichment | +| `sn_tickets` | 100 | active board + activity timeline | +| `sn_waiting_po_meta` | 884 | waiting-PO backlog | +| `jira_status_map` | 127 | RITM↔Jira, statusDurations | +| `jira_board_state`/`snapshot` | 1045 | Jira board page | +| `finance_xlsx_data` | 1128 | PO/invoicing/milestones | +| `insights_thresholds`, `pm_kpi_settings` | — | insights + PM roster | +| `fx_rates_cache`, `lis_size_calc_cfg` | — | FX + size model | +| `brand_colors`, `snow_colors`, `sn_states_order` | — | palettes + column order | +| windowLocalStorage `*_norms` (psla/otd/ttfr/cresp/avgdays/asla) | — | SLA target lines | + +**Ticket master fields** (from `ticketsMeta`): `number, shortDesc, state, year, brand, market, +businessUnit, assignedTo, openedBy, openedDate, closedDate, firstAssignedDate, firstReplyAt, +fulfillmentDate, toDoAt, inUatAt, ttfrMinutes, clientRespMinutes, finalCost, currencyCode, jiraKey`. + +**Coverage:** ~24 months (2024-08 → 2026-08); 45 brands, 41 markets, 8 BUs, 10 PMs, 280 requesters; +GBP/EUR/MXN. Data-quality: businessUnit casing dupes, currency blanks/junk ("NO"/"PART"), +"(Inactive)" suffixes, finalCost is a string, two date formats — **normalize on ingest**. + +--- + +## 6. Design mapping (Husky as template) + +- **Stack/tokens:** Husky's SCSS-module system, `:root` tokens, `card`+`mono-label`+`srOnly` + skeleton, `useInView`+`useCountUp` reveal hooks. Component = folder (`index.tsx` + `.module.scss`). +- **Reuse verbatim:** `KpiTile`, `StateDonut`, `BucketBars`, `AssigneeBars`, `RequestorBars`, + `TrendArea`, `MonthlyByUser`, `InsightChart`, plus `Stats`-page archetypes (`ActivityList`, + `IssuesBySeverityCard`, `DonutCard`). +- **Build new (Husky-styled):** `KpiHeatmap`, `CalendarHeatmap`, `GroupedBars`, period control. +- **Palettes:** size `{XS:#14b8a6,S:#1a73e8,M:#f59e0b,L:#10b981,XL:#8b5cf6,XXL:#ef4444}`; + year `['#f97316','#1a73e8','#16a34a','#dc2626','#7c3aed']`; state colors per §4; brand from `brand_colors`. +- **FORGE already uses the indigo palette** (`#6366f1`) matching Let it Snow's `UI.primary` — keep it, + or adopt Husky's Fluent blue. **DECISION NEEDED.** + +--- + +## 7. Phased build plan + +- **Phase 0 — Full data ingest (foundation).** Extend `dump-to-archives` + schema/seed to load + `analytics_data.ticketsMeta` (954) + finance + waiting-PO + jira board + thresholds + norms + + size cfg + palettes. Normalize dimensions. This alone restores the data behind every stat. +- **Phase 1 — Server analytics engine.** Compute aggregations from the DB (opened/closed by + month/day, byRequester/brand/market/BU, revenue/month, lifetime buckets, the 6 SLA metrics + PM×size, missing-cost, waiting-PO, engagement). Expose `/api/analytics/*`. Tests. +- **Phase 2 — Overall tab (charts 1-11).** New view on Husky components. +- **Phase 3 — Active tab (12-17) + Board page redesign** (7-state, filters, card fields, list). +- **Phase 4 — PMs KPI tab (18-29):** `KpiHeatmap` + editable norms + engagement + `CalendarHeatmap`. +- **Phase 5 — PM Insights page** (alerts, drill-downs, Excel export). +- **Phase 6 — Jira board page · Size CALC · finance detail** (as desired). + +Each phase: engineer→reviewer→verifier; dba for schema; designer for new components. + +--- + +## 8. Decisions to resolve before/within the build + +1. **Size algorithm** — three coexist (nearest-nominal / largest-fits / Excel-MATCH). Pick one + (recommend **composite** for cards, as the app defaults). +2. **`psla_day_norms` default mismatch** (dashboard `{XS:1…XXL:15}` vs collector `{XS:3…XXL:30}`). Pick one. +3. **FX** — keep fixed GBP-base rates (recommended; live-fetch was retired). +4. **Palette** — keep FORGE indigo, or switch to Husky Fluent blue. +5. **Scope of charts for v1** — all 29, or the high-value subset first (recommend Overall + SLA heatmaps). +6. **Brand naming** — popup says "FORGE Tasks", product "Let it Snow" → FORGE. +7. **Boards** — SNOW board is core; Jira/ADO boards are later/optional. diff --git a/claude_artifacts/INDEX.md b/claude_artifacts/INDEX.md new file mode 100644 index 0000000..e9fb3b9 --- /dev/null +++ b/claude_artifacts/INDEX.md @@ -0,0 +1,22 @@ +# Artifact index +- [engineer-20260827-190753](engineer-20260827-190753.md) — Jira statusDurations+movements + chart #17 (Active tab), /api/analytics/jira-durations, seed-enriched from board_state. v2.3.0. +- [engineer-20260827-185932](engineer-20260827-185932.md) — Extension Jira sync (SNOW→Jira, attach-only /api/sync/jira, custom-domain + PAT). v2.2.0. Live-verified attach-only. + +One line per artifact (newest first) + open threads. Read on demand; don't bulk-load. + +- [devops-20260827-182020](devops-20260827-182020.md) — Synology `push-to-nas.sh` deploy script + `.deploy.env.example` + `.env.example` rewrite + SETUP §6; RITM number → SNOW link in table & board cards. +- **v2.0.0 / FORGE 2.0** — CHANGELOG.md created, versions bumped 1.0.0→2.0.0 (root+client), brand → "FORGE 2.0". Security audit HIGH-1/2/3 + MED-1 fixed (admin-deletes-admin only, last-admin guard, session purge on delete, session regenerate on login, 404 on missing). Verified live. +- [audit-20260827-180746](audit-20260827-180746.md) — EXHAUSTIVE parity gap analysis (initial app → FORGE). Done: Overall (~9/11), Active (5/6), 6 SLA heatmaps, Insights, 6-col board+export, RBAC. Missing: PMs-KPI charts 18–23 + period/editable-norms, YoY pies #5/#6, #17 jira durations, #15 min/median/max, Jira board, Size CALC, options/config editors, deep sync (SCTASK/jira/closed/finance/statusDurations), board sort/group/card-fields/filters, 7th synthetic column, insights Excel export. **Open:** prioritized phases A–F for principal. +- [security-20260827-180635](security-20260827-180635.md) — RBAC/token/user audit. 3 HIGH (lead-deletes-admin, last-admin lockout, session survives user delete), 2 MED, 3 LOW. Gating matrix + token-hash non-leak verified. **Open:** fixes to engineer/dba. +- [architect-20260827-180544](architect-20260827-180544.md) — ADR: extension as single sync engine for SNOW + Jira. Keep SNOW same-origin session; add Jira via direct REST + API token; new attach-only `POST /api/sync/jira` (no DB reshape, enrich `jira` JSONB). **Open:** engineer to build endpoint + Phase B. +- [designer-20260827-180842](designer-20260827-180842.md) — Excel export design pass: indigo frozen header, per-column widths, right-aligned numbers, #,##0 cost, short dates, grid borders. Validated → valid xlsx. +- [engineer-20260827-180000](engineer-20260827-180000.md) — implemented RBAC (4 roles), Admin page (Users+Tokens), filtered Excel export, full-width charts, donut fix. **verifier PASS.** +- [principal-20260827-175448](principal-20260827-175448.md) — Auth/RBAC (4 roles) + API-token page + filtered Excel export. Plan + capability matrix. +- [FORGE-parity-spec](FORGE-parity-spec.md) — full inventory of the initial app (29 charts, PM Insights, boards) → data contract → Husky component mapping → phased build plan. Phases 0–3, 5 + Overall-fidelity done. +- [verifier-log](verifier-log.md) — running PASS/REDO log of every verifier gate. + +## Delivered so far (all verifier-PASS) +- Phase 0 data ingest · 1 analytics engine · 2 Overall tab (+ full fidelity) · 3 Active tab + board redesign · 5 PM Insights. +- verifier-log.md · verifier PASS on engineer-20260827-180000 (RBAC+token page+filtered xlsx+full-width+donut fix); live DB verified donut center=966, Rowena≈8%; schema additive; token_hash not leaked +- verifier PASS on engineer-20260827-185932 (extension Jira-sync v2.2.0): attach-only /api/sync/jira + attachJira; TEMP-TABLE smoke proved no SNOW-field clobber, no SQLi, jsonb merge preserves omitted keys; schema unchanged (additive). +- verifier-20260827 · verifier · PASS on Jira statusDurations+chart #17 (v2.3.0) — see verifier-log.md diff --git a/claude_artifacts/architect-20260827-180544.md b/claude_artifacts/architect-20260827-180544.md new file mode 100644 index 0000000..bda7b8c --- /dev/null +++ b/claude_artifacts/architect-20260827-180544.md @@ -0,0 +1,324 @@ +# ADR: The Chrome extension as the single sync engine for SNOW + Jira + +- **Status:** Proposed (design input for a later build — no code here) +- **Date:** 2026-08-27 +- **Author:** architect +- **Supersedes:** nothing — extends the existing SNOW-only sync (`extension/`, `/api/sync`) + +--- + +## 1. Context + +Today the extension syncs **ServiceNow only**. `background.js` runs a collector in the +`rbassist.service-now.com` page (`world: MAIN`), pages the Table API same-origin using the +live session cookie + `g_ck`, maps `sc_req_item` rows to the FORGE ticket shape, and POSTs +them in 100-row chunks to `/api/sync` with `Authorization: Bearer fg_…`. + +Jira data currently only exists in the **seed dump** (`jira_status_map` 127 rows, +`jira_board_state` 1045 rows — see `FORGE-parity-spec.md`). It goes stale the moment the +dump is loaded. The live `tickets.jira` JSONB is typed as **`JiraInfo`** and is only ever +written by the seed path, never refreshed. **Its declared shape is not 5 fields** — it is +**6** (`server/types.ts:11-18`, mirrored in `client/src/types/ticket.types.ts:9-16`): + +```ts +interface JiraInfo { + status?; statusChangedAt?; key?; url?; assignee?; // the 5 populated by seed today + movements?: { at: string; who: string }[]; // ALREADY declared — see §5 +} +``` + +The seed only populates the first five; `movements` exists in the type but is currently +unwritten. This matters: `movements` is **not** a field we get to invent (§5). + +We want **one "Sync now"** to refresh both sources so the Active tab (chart 17 Jira status +durations, chart 19/20 movements) and the future Jira board page stay live. + +**Load-bearing finding — the current upsert cannot be reused for Jira as-is.** +`server/db.ts` `upsertTickets` ON CONFLICT does **`status=EXCLUDED.status`, +`state=EXCLUDED.state`, `short_desc=EXCLUDED.short_desc`, `assigned_to=EXCLUDED.assigned_to`, +`assignment_group=EXCLUDED.assignment_group`, `last_activity_at/by=EXCLUDED.…`, +`updated_at=EXCLUDED.…`** — these are **overwritten, not COALESCE-preserved**. A Jira-only +payload routed through `/api/sync` would pass `normalizeIncoming`, which defaults +`status→'active'`, `state→''`, `shortDesc→''`, `assignedTo→null`, `assignmentGroup→null`, +`last_activity_*→null` — **wiping the SNOW core fields of every matched ticket** (and +mis-flipping closed RITMs back to active). Only `jira` itself is COALESCE-merged. So Jira +must **not** ride the same endpoint/upsert. + +--- + +## 2. Decision + +1. **Keep SNOW exactly as-is** (in-page same-origin session collector → `/api/sync`). +2. **Add Jira as a second transport in the same extension**, using **direct Jira Cloud REST + from the service worker** authenticated with a **Jira API token** (email + token, HTTP + Basic). No Jira browser tab required. +3. **Route Jira through a new, dedicated server endpoint `/api/sync/jira`** that performs an + **attach-only UPDATE** — it writes **only** `jira` (JSONB) and `jira_key`, keyed by + RITM `number`, and **never touches** `status/state/assignee/activity`. This sidesteps the + clobber above and gives clean partial-failure semantics. +4. **No DB shape change.** Jira status/durations/movements go **inside the existing `jira` + JSONB**, which the extension sends as one enriched object. Additive only. +5. **"Sync now" = SNOW first, then Jira** (sequential, so Jira attaches to freshly-synced + rows), each phase chunked and reporting its own count. + +### Why the SNOW-session / Jira-API-key split (not one mechanism) + +| | ServiceNow | Jira Cloud | +|---|---|---| +| Auth we have | Live browser **session cookie + `g_ck`** | First-class **API token** (Atlassian id.atlassian.com → API tokens) | +| Personal API token | Not reliably available / instance-policy dependent; storing SNOW creds is worse | Designed for exactly this; scoped, revocable | +| Needs a logged-in tab | **Yes** (already the case; user is in SNOW all day) | **No** — SW fetch with host permission works headless | +| CSRF | `X-UserToken: g_ck` required | Not applicable (Basic auth) | + +The split is the *cheap* option on both sides: SNOW keeps the zero-secret session approach +that already works; Jira uses the mechanism Atlassian actually blesses. Forcing symmetry +(e.g. scraping a Jira tab same-origin) would add a fragile MAIN-world collector and require +the user to keep a Jira tab open — strictly worse than a token. + +### Does Jira require a board id? **Yes — and support a list, default one.** + +To reproduce the original board (`rapidView=13793`) and its **per-status durations + +movements**, the extension reads the **Agile REST** endpoint +`GET /rest/agile/1.0/board/{boardId}/issue` (issues in board order) plus each issue's +`changelog` (`GET /rest/api/3/issue/{key}?expand=changelog`) to reconstruct status transition +timestamps → durations/movements. **Board order and column mapping only exist per board**, so +a board id is mandatory for board-faithful output. A pure JQL search (`/rest/api/3/search`) +does *not* need a board but loses column order and the board's status→column mapping. + +**Recommendation:** primary input is **one board id** (the `13793` analogue). Store it as a +**list** so a second board can be added later without a settings migration, but the UI +defaults to a single field. Provide an **optional JQL override** for power cases (e.g. +`project = XYZ AND updated >= -14d`); when JQL is set it augments the board fetch's filter, +it does not replace the board (we still need the board for column mapping). + +--- + +## 3. Settings schema (extension options → `chrome.storage.local`) + +``` +{ + // FORGE (unchanged names — back-compat with today's build) + serverUrl: "https://forge.mycloud.dp.ua", // FORGE API domain + token: "fg_…", // FORGE portal key, minted at Admin→Tokens, revocable + + // Jira (new) + jira: { + baseUrl: "https://rocketmill.atlassian.net", // Jira Cloud site + email: "svc-forge@…", // Atlassian account email (Basic auth username) + apiToken: "ATATT…", // Jira API token (Basic auth password) — SECRET + boardIds: [13793], // list; UI defaults to one + jql: "" // optional override/filter, may be blank + closedLookbackDays: 14 // 0 = active-only (see §6) + } +} +``` + +- FORGE Basic-of-nothing: FORGE keeps `Authorization: Bearer `. +- Jira auth header: `Authorization: Basic base64(email + ":" + apiToken)`. +- On **Save**, request host permission for **both** origins (as options.js already does for + the FORGE origin): the FORGE server origin **and** `https://.atlassian.net/*`. +- A **"Test Jira"** button (mirror of the existing "Test") calls + `GET {baseUrl}/rest/api/3/myself` and reports 200/401. + +--- + +## 4. Two transports & manifest implications + +- **SNOW:** unchanged. `host_permissions: ["https://rbassist.service-now.com/*"]` stays + required; collector runs in the page; session cookie + `g_ck` do the work. +- **Jira:** fetched **from the service worker** (not a page). In MV3, a service-worker + `fetch` to a host listed in `host_permissions` is **exempt from page CORS** — the extension + is treated as a first-party origin for granted hosts, so Atlassian's (restrictive) CORS + headers are irrelevant. **This only holds with the host permission granted**; without it the + fetch is a normal cross-origin call and fails preflight. +- Add the Jira site to **`optional_host_permissions`** and request it dynamically at Save + time (same pattern as the FORGE origin today), rather than hard-coding a static + `host_permissions` entry — the site host is per-deployment and least-privilege favors + granting exactly the one instance the user configures. `optional_host_permissions` already + contains `https://*/*`, which technically covers it, but an explicit narrow grant is + cleaner and survives a future tightening of that wildcard. +- No new manifest `permissions` needed (`storage`, `scripting` already present; Jira uses + neither `scripting` nor `tabs`). + +--- + +## 5. Dedup & merge + +- **FORGE key is `number`** (RITM). No ticket dupes — that invariant is untouched; Jira never + inserts a ticket. +- **RITM ↔ Jira link:** for each Jira issue, resolve the RITM number from + **`customfield_26001`** (holds the RITM), falling back to a **summary regex** (`/RITM\d+/`), + exactly as the initial app did. Build a map `RITM number → enriched jira object`. +- **Jira issue with no RITM:** **skip it and count it.** FORGE is RITM-centric and single-user; + an unlinked Jira issue has nowhere to attach and creating a ghost ticket would violate the + "no dupes / SNOW owns the ticket row" model. Report the unlinked count in the sync status so + the user knows a link (customfield/summary) is missing. (A future "orphan Jira" store is out + of scope — not kanban, not this ADR.) +- **What lands in `jira` JSONB (superset of today's shape):** + ``` + { key, url, status, statusChangedAt, assignee, // 5 existing fields, unchanged + movements, // EXISTING field — reuse shape [{ at, who }] (NOT { from, to, at }) + statusDurations, // NEW additive — { "In Progress": mins, "In UAT": mins, ... } + board } // NEW additive — { id, column } for the board page + ``` +- **`movements` already exists in the `JiraInfo` type** (`server/types.ts:17` + + `client/src/types/ticket.types.ts:15`) as **`{ at: string; who: string }[]`**. The extension + **must populate that existing shape**, not redefine it to `{ from, to, at }`. Reconstruct + `who` from the changelog author and `at` from the transition timestamp. (I confirmed + `movements` currently has **no runtime consumer** — only the two type declarations — so a + different shape *could* be adopted, but doing so is a deliberate change to the `JiraInfo` + contract in two TS files, not "additive JSONB." **Recommendation: keep `{ at, who }`.** If the + chart genuinely needs `from`/`to`, add them as *extra optional* keys on each entry + (`{ at, who, from?, to? }`) rather than dropping `at`/`who` — that stays backward-compatible + and is still a one-line `JiraInfo` edit, called out here so the engineer expects it.) +- **`statusDurations` and `board` are genuinely new**, additive optional keys — add them to the + `JiraInfo` interface (both files) alongside `movements`. This is a **type-declaration touch, + not a DB shape change**: the `jira` column is already `JSONB` and stores whatever the object + holds. Flagging it explicitly so it isn't mistaken for a zero-code change. +- **Server (DB) shape change: none to columns.** The `jira` column is already `JSONB`. The new + endpoint replaces the whole object per ticket (the extension always sends the complete + enriched object it just computed), so there is no partial-merge ambiguity and no reshape of + any existing column. `jira_key` (existing TEXT column) is set from `jira.key` when present. + The only code-level shape edit is the additive `JiraInfo` TS interface above. + +### New endpoint contract (attach-only) + +``` +POST /api/sync/jira (requireToken — same fg_ Bearer as /api/sync) +body: { issues: [ { number, jira: {…enriched…} }, … ] } // chunked, 100 +per row: UPDATE tickets + SET jira = $2::jsonb, + jira_key = COALESCE($3, jira_key), + synced_at = NOW() + WHERE number = $1 +resp: { updated: , unmatched: , unlinked: } +``` + +Because it is an **UPDATE … WHERE number =**, a Jira payload for an RITM not yet in FORGE +simply affects 0 rows (counted as `unmatched`) — it **cannot** create a stub row or flip +`status`/`state`/`assignee`. This is the whole reason for a separate endpoint rather than +folding into `/api/sync`. + +--- + +## 6. Sync flow & scheduling + +`Sync now` (popup) → service worker `runSync()`: + +1. **Phase A — SNOW** (unchanged): collect active RITMs same-origin → `POST /api/sync` in + 100-chunks. On failure: **abort before Phase B** (don't attach Jira to a stale ticket set) + and report the SNOW error as today. +2. **Phase B — Jira:** for each `boardId`, fetch board issues (+ changelog), resolve RITM, + build enriched `jira` objects, → `POST /api/sync/jira` in 100-chunks. On failure: Phase A is + **already committed and intact**; surface a *warning* ("SNOW synced ✓, Jira failed: …") + rather than a hard error. Report `updated / unmatched / unlinked`. +3. Push a combined `{ state, snowCount, jiraUpdated, jiraUnmatched, at }` to `syncStatus` for + the popup. + +- **Sequential, not parallel:** Jira must attach to rows SNOW just wrote. +- **Chunking:** 100 on both push directions (matches today). Jira *read* is paged by the Agile + API (`maxResults`/`startAt`, 50–100) — page defensively with a hard ceiling like the SNOW + collector's `offset < 2000` guard. +- **Separate endpoint, not folded:** decided in §2/§5 — clobber-safety + independent + partial-failure reporting. +- **Scheduling:** keep **manual "Sync now"** for v1 (single-user, user is at the desk). A + `chrome.alarms` periodic sync is a trivial later add but out of scope; note that periodic + Jira sync consumes API-token rate budget even when idle. + +--- + +## 7. Scope of tickets + +- **SNOW:** stays **active-only** (the collector query is `active=true`). +- **Jira:** default **active board + a small closed lookback** (`closedLookbackDays`, e.g. 14) + so *recently* closed issues' durations/movements stay fresh for charts 17/19/20. `0` = + active-only. +- **Not** full history. Trade-offs: + - *For historical sync:* analytics freshness on old tickets. + - *Against (decisive):* Jira Cloud API-token rate limits + wall-clock cost of walking every + issue's changelog; and history is already owned by the **seed dump** + (`analytics_data.ticketsMeta` 954 rows is THE historical dataset). Live-syncing 1000+ + closed issues on every "Sync now" is wasteful and slow. + - **Verdict:** *seed handles history; the extension keeps active + a short closed window.* + If someone needs a full historical refresh, that's a re-seed, not a per-click sync. + +--- + +## 8. Security + +- **Jira API token is a real secret in `chrome.storage.local`** — which is **not encrypted at + rest** and is readable by anyone with the OS user's Chrome profile on disk. Mitigations to + bake into the build: + - Use a **dedicated low-privilege Jira service account** with **read-only** project access, + not a personal admin token. Blast radius on leak = read a board. + - Store **email + API token**, never a password. API tokens are individually revocable from + Atlassian without disturbing the account. + - **Never log** the token, the `Authorization` header, or issue bodies (the SNOW collector + already treats `g_ck`/token this way — hold the same line for Jira). + - Document in options UI that the token is stored locally and to revoke it from Atlassian if + the machine is compromised. +- **FORGE `fg_` token** is already **revocable via Admin→Tokens** and `requireToken`-gated — + rotate freely; the new `/api/sync/jira` reuses the **same** Bearer, no new server secret. +- **CORS / host model:** covered in §4 — Jira REST works *because* the SW holds the Jira host + permission (CORS-exempt for granted hosts); grant exactly the one Atlassian site, + least-privilege, requested at Save. +- **Server input hardening:** `/api/sync/jira` must validate `number` is present and `jira` is + an object, and (like `sanitizeActivity`) coerce the enriched sub-fields before writing JSONB, + so a malformed `movements`/`statusDurations` can't later crash a render. + +--- + +## 9. Alternatives considered + +- **A. Fold Jira into `/api/sync`.** Rejected — the ON CONFLICT overwrites SNOW core fields + from a thin Jira payload (§1). Would require rewriting the upsert to COALESCE `status`/ + `state`/`assignee`, which then breaks SNOW's own need to *set* those. A second endpoint is + simpler and safer than making one upsert serve two very different payloads. +- **B. Scrape Jira same-origin from a Jira tab (mirror SNOW).** Rejected — needs a logged-in + Jira tab, a fragile MAIN-world collector, and gives no advantage over the sanctioned API + token. +- **C. Server-side Jira sync (cron on the FORGE box, no extension).** Rejected for now — it + moves the Jira secret to the server (fine) but **splits sync into two engines**, contradicting + the goal of *one* "Sync now", and the RITM↔Jira resolution logic would live in two places. + Revisit only if we later want unattended periodic sync. +- **D. New `jira_*` columns / a `jira_status` table.** Rejected — violates "prefer additive + JSONB, no existing-column reshape"; the `jira` JSONB already exists and is the right home. +- **E. JQL-only, no board id.** Rejected as the default — loses column order/mapping the board + page needs; kept as an optional filter override. + +--- + +## 10. Risks + +- Jira **changelog walking** is the expensive part; a large board × per-issue changelog fetch + can be slow / hit rate limits. Mitigate with the closed-lookback window and paging ceilings. +- **`customfield_26001` id is instance-specific** — if it differs on this Jira site the + RITM-link falls back to summary regex only; surface the `unlinked` count so this is visible. +- **`optional_host_permissions` wildcard** (`https://*/*`) is broad; the explicit Atlassian + grant is cleaner but the wildcard's presence is a standing review flag (unrelated to this + change, worth noting to `/security`). +- Token in `chrome.storage.local` (§8) — accepted risk, mitigated by service-account scope. + +--- + +## 11. Migration + +- **DB:** **none.** No column add, no reshape — `jira` JSONB and `jira_key` already exist. + `initDB()` is untouched; no manual SQL script, no rollback needed. +- **Types:** **additive** — extend the existing `JiraInfo` interface (`server/types.ts` + + `client/src/types/ticket.types.ts`) with new optional keys `statusDurations` and `board`; + **reuse** the already-declared `movements?: { at, who }[]` (do not redefine it). Optional + keys keep every existing consumer compiling. +- **Server:** purely **additive** — new `POST /api/sync/jira` handler + a small + `attachJira(number, jira)` in `server/db.ts`. Old clients that only hit `/api/sync` keep + working unchanged. +- **Extension:** additive options fields + Phase B. An un-upgraded extension still syncs SNOW. +- **Rollout order:** ship the server endpoint first (inert until called) → then the extension + update → then populate the Jira settings. Fully backward-compatible at every step. + +--- + +## Next +engineer — build the additive `POST /api/sync/jira` + `attachJira()` (attach-only UPDATE, §5) +first; then extend the extension options (§3 schema) and `background.js` Phase B (§6). Route +the DB touch through /dba and the Jira-token storage through /security before merge. diff --git a/claude_artifacts/audit-20260827-180746.md b/claude_artifacts/audit-20260827-180746.md new file mode 100644 index 0000000..837195c --- /dev/null +++ b/claude_artifacts/audit-20260827-180746.md @@ -0,0 +1,301 @@ +# audit — Gap analysis: "Let it Snow" → FORGE (what has NOT been ported) + +**Date:** 2026-08-27 · Author: audit (read-only) · Scope: full parity sweep +**Checklist source:** [FORGE-parity-spec.md](FORGE-parity-spec.md) (29 charts + PM-Insights + boards + data contract) +**Compared against:** live FORGE code (`server/*.ts`, `client/src/**`, `extension/*`) and the initial app source +(`/Users/dmytrotkachenko/WebstormProjects/Let It Snow/Let it Snow/*.js`, verified by grep — files are huge). + +Legend: ✅ done · 🟡 partial · ❌ missing. Value: **MH** must-have · **NTH** nice-to-have · **LOW**. + +--- + +## 0. Executive summary + +FORGE has delivered a solid **read-only spine**: full data ingest (966 tickets + finance + jira + config), +a server analytics engine, the **Overall** tab (~9 of 11 charts), the **Active** tab (5 of 6), the **6 SLA +heatmaps** (charts 24–29), **PM Insights** (alert groups + waiting-PO + per-PM roll-up), a **6-column board** +with list view + filtered Excel export, and **new** RBAC/Users/Tokens admin (beyond the original). + +What is **not** ported is roughly **half of the analytics surface and nearly all of the operator tooling**: + +- **PMs-KPI tab** is only the 6 heatmaps — charts **18–23** (workload, engagement + dual calendar heatmaps, + missing-cost, awaiting-PO money, brand/market sub-cards) are **absent**, and the heatmaps have **no + period/year granularity and no editable norms**. +- **Board** is missing the 7th synthetic column, 13 of 16 card fields, all 14 sorts, all 6 group-by + permutations, and ~9 of 11 filters (region, staleness, jira, requester, custom-label…). +- **Whole features missing:** the standalone **Jira board**, the **Size CALC** estimator, the **finance + view**, and the entire **options/config editor surface** (brand colours, norms, thresholds, card-field + toggles, colleagues/region, currency, custom labels). +- **Sync** is shallow: active-**RITM only**, 9 fields, **no SCTASK, no Jira, no closed, no finance, + no statusDurations** collectors. +- Overall/Active charts lack the **YoY pies (#5/#6)**, **CGO overlay**, **#/% toggle**, **Jira status + durations (#17)**, and **time-in-status min/median/max (#15)**. + +Per the spec, **AI Advisor / at-risk, weather** are intentionally out of scope (confirmed below). + +--- + +## 1. Overall analytics tab — `client/src/pages/Overview/index.tsx` + `server/analytics.ts:getOverview` + +| # | Item | Status | Note / where it lives | +|---|---|:--:|---| +| 1 | Opened per month | ✅ | `GroupedBars` — multi-year grouped, bars/line toggle, YoY badge. | +| 2 | Closed per month | ✅ | `GroupedBars`, same. | +| 3 | Revenue per month (cost/tickets, ±YoY) | ✅ | `GroupedBars` + Cost/Tickets toggle in Overview; GBP via fixed FX. | +| 4 | Lifetime-at-close histogram + median/avg/closed tiles | ✅ | `BarList` 6 buckets + median tile. `avgDays`/`closed` computed server-side. | +| 5 | **Opened YoY pie (fair/full)** | ❌ | No opened-YoY donut. Would live in Overview as a `DonutChart`; server has `openedByMonth` but no fair-window (same-day-of-year) series. **MH** | +| 6 | **Closed YoY pie (fair/full)** | ❌ | Same — no closed-YoY donut / fair-vs-full comparison. **MH** | +| 7 | By business unit (per-year, **brand drill**) | 🟡 | Flat `BarList` (`byBusinessUnit`), **no per-year split, no brand drill-down**. `server/analytics.ts:169`. **NTH** | +| 8 | By requester (bars + YoY, **market drill**) | 🟡 | `ExpandBarList` drills requester→**brand** (spec wants →market), **no YoY**. `analytics.ts:170`. **NTH** | +| 9 | Ticket-share donut (#/%, top 18 + Others) | 🟡 | `DonutChart` on `byRequesterShare` (full 966 dist — the REDO fix). **No #/% toggle, no top-18+Others rollup.** **NTH** | +| 10 | By brand (per-year **segments**, market drill, YoY) | 🟡 | `ExpandBarList` brand→market counts only. **No per-year segments, no YoY, no size/status segmentation.** **NTH** | +| 11 | By market | 🟡 | Flat `BarList`, top-20. No brand drill / segments. **LOW** | +| — | Toggle: bars/line | ✅ | `GroupedBars` per-chart. | +| — | Toggle: ±YoY | 🟡 | Shown as a computed badge, not a user toggle; only on the month `GroupedBars`. **LOW** | +| — | Toggle: cost/tickets | 🟡 | Only on the Revenue chart; original applies it across money charts. **LOW** | +| — | Toggle: #/% | ❌ | No percentage mode anywhere. **NTH** | +| — | Growth badges | 🟡 | Only the month-total YoY badge; no per-series/per-requester growth. **LOW** | +| — | **CGO overlay** | ❌ | Original overlays a "CGO" series per group (`dashboard.js` `CgoBars`/`CGO_REQUESTER`, toggle). Not in FORGE — needs a CGO flag on tickets + overlay in `GroupedBars`. **NTH** | + +**Bottom line:** the month/revenue/lifetime core is faithful; the **two YoY pies are missing outright**, and +the by-dimension charts are **flat counts without the per-year segmentation, drill, and YoY** the original had. + +--- + +## 2. Active tab — `client/src/pages/Active/index.tsx` (client-computed from active tickets) + +| # | Item | Status | Note / where it lives | +|---|---|:--:|---| +| 12 | Open-not-closed by month | ✅ | `TrendChart` area, `openedByMonth`. | +| 13 | By status (kanban cats) | ✅ | `BarList` over `BOARD_COLUMNS`, state colours. | +| 14 | Age histogram (0-50…200+ d) | ✅ | `BarList`, 5 buckets. | +| 15 | **Time-in-status min/median/max** | 🟡 | Only **median** days-in-state per column (`Active/index.tsx:62`). No min/max grouped mini-bars. **NTH** | +| 16 | By brand, **status-segmented** (market drill) | 🟡 | Flat `BarList` of active-by-brand. **No status segmentation, no market drill.** **NTH** | +| 17 | **Jira status durations (workflow order)** | ❌ | Requires `statusDurations` from `jira_status_map` — **not ingested** (only `status`/`statusChangedAt`/`key` land in `jira` JSONB; see `scripts/dump-to-archives.mjs:36`). No chart. **MH** for Jira ops. | + +--- + +## 3. PMs-KPI tab — `client/src/pages/SlaKpi/index.tsx` + `server/analytics.ts:getSlaHeatmaps` + +The whole tab is currently **only** the 6 SLA heatmaps. The original "PMs KPI" tab was 12 items (18–29). + +### 3a. The 6 SLA heatmaps (24–29) — present but reduced +| # | Item | Status | Note | +|---|---|:--:|---| +| 24 | On-Time Delivery heatmap | ✅ | `otd` metric, PM×size, on-time% vs `otd` norms. | +| 25 | Avg days to close heatmap | ✅ | `avgclose` vs `avgdays`. | +| 26 | Time to assign PM heatmap | ✅ | `assign` = `max(0, fulfillment→firstAssigned)` vs `asla`. | +| 27 | Time to send preview heatmap | ✅ | `preview` = `toDoAt→inUatAt` vs `psla`. | +| 28 | Avg TTFR heatmap | ✅ | `ttfr` = `ttfrMinutes/1440` vs `ttfr` norms (hrs). | +| 29 | Avg PM response heatmap | ✅ | `cresp` = `clientRespMinutes/1440` vs `cresp` norms. | +| — | **Current + previous year** side by side | ❌ | `getSlaHeatmaps` computes one all-time grid; original renders cur-yr + prev-yr heatmaps. **MH** | +| — | **Period granularity (year / Q1-Q4 / month)** | ❌ | No period control at all. **MH** | +| — | **Editable norms panels** | ❌ | Norms are read-only from `app_config`/`config.json`; original has inline norm editors (`buildNormsPanel` etc.) that persist. Needs a write endpoint + UI. **MH** | +| — | Hidden PMs from `pm_kpi_settings` | ❌ | `getSlaHeatmaps:223` has a stubbed `hidden = new Set()` — never populated. **NTH** | + +### 3b. Charts 18–23 — entirely missing +| # | Item | Status | Note / where it'd live | +|---|---|:--:|---| +| 18 | **Workload by month** (revenue prev/cur yr, per-PM) | ❌ | New `GroupedBars`+per-PM series; new server agg (closed cost by PM×month). **MH** | +| 19 | **PM Engagement** (backlog/Assist✓/Jira✓/Stale) + **dual daily-activity calendar heatmaps** | ❌ | Needs `CalendarHeatmap` component (GitHub-style) + activity/jira-movement ingest per day. Original: `EngagementKpi()` with PM-row accordion. **MH** | +| 20 | **Missing final cost** (ranked PM bars + drill) | ❌ | `AssigneeBars` + list; server: closed rows where `finalCost` null, grouped by PM. Partial data exists. **MH** (margin-leak) | +| 21 | **Awaiting PO** (ranked, Cost / Avg-d / Max-d, sortable) | 🟡 | Insights has a count + L1/L2/L3 + revenue, but **no per-PM Cost/Avg-days/Max-days sortable table**. **MH** | +| 22 | No-cost by **brand / market** | ❌ | Two `BucketBars`. **NTH** | +| 23 | Awaiting-PO by **brand / market** | ❌ | Two `BucketBars`. **NTH** | + +**Bottom line:** PMs-KPI is the **largest single gap** — 6 of 12 charts absent, and the 6 present ones lack +year/period slicing and the editable norms that make them operational. + +--- + +## 4. Board — `client/src/pages/Board/index.tsx`, `utils/board.ts`, `components/Board/BoardCard` + +| Item | Status | Note / where it lives | +|---|:--:|---| +| 7-state columns | 🟡 | **6 columns** built (`unassigned, open, hold, wip, replied, awaiting`; `board.ts:18`). **7th synthetic `Closed / Awaiting-PO` column is missing** (original `CLOSED / AWAITING PO – SYNTHETIC` overlay). **MH** | +| Customer-replied pseudo-status | ✅ | `boardColumn`/`isAwaitingAgency` — WIP + last touch ∉ colleague roster. Faithful. | +| Column SLA subtitles + per-column count | ✅ | `col.slaVerb(thr)` + count badge. | +| Group-by (6 permutations of WIP·Replied·Awaiting) | ❌ | Column order is fixed; original has 6 orderings (`wip-agency-await` … `await-agency-wip`). **NTH** | +| **16 toggleable card fields** (`card_fields`) | ❌ | `BoardCard` is a **fixed** layout showing ~8 fields (number, jira status, link, shortDesc, brand·market, assignee, in-state days, lifetime, last activity). **None toggleable.** Missing: description, raisedBy, dueDate, stateChanged, comments, createJira, jiraBar, teamsLink. Original fields: `cf-stateBadge/shortDesc/description/assignee/assignmentGroup/brandMarket/raisedBy/lifetime/dueDate/stateChanged/lastActivity/comments/createJira/showJiraStatus/showJiraBar/teamsChannelLink`. **NTH** | +| Custom labels registry | ❌ | Original `custom_label` system (per-ticket labels + filter). Absent. **NTH** | +| Staleness / PO / jira-stuck / missing-cost badges | ❌ | `BoardCard` has no badges beyond the jira-status chip. **NTH** | +| **Sort (14 options)** | ❌ | No sort control. Original: `default, number, status-age-asc/desc, lifetime-asc/desc, jira-assignee, jira-status, brand, cost-asc/desc, due-asc/desc, analyzed`. **NTH** | +| Filters: search / brand / market / assignee | ✅ | Present in the board header. | +| Filters: **region EU/LATAM** sentinels | ❌ | `latamAssignees` is ingested (`config.json`) but the assignee dropdown has no EU/LATAM region grouping. **NTH** | +| Filters: requester, custom-label, jira-assignee, jira-status | ❌ | None. **NTH** | +| Filters: staleness (stale/updated/inactive/PO/jira-stuck/missing-cost), hide-empty, hide-cost | ❌ | Original `group-by` chips + status-label filters. Absent. **NTH** | +| List view | ✅ | `TicketTable` toggle (fixed columns, not the same field set). | +| Card click behaviour | 🟡 | Opens an in-app `TicketDetailModal` (+ a SNOW link icon). Original opens ServiceNow directly. Acceptable divergence. | +| Filtered Excel export | ✅ | **New** — `utils/excel.utils.ts`, 17 cols, honours active filters. | +| Azure DevOps focus board | ❌ | Out of scope per spec (§0). **LOW** | + +--- + +## 5. PM Insights — `client/src/pages/Insights/index.tsx` + `server/insights.ts` + +| Item | Status | Note / where it lives | +|---|:--:|---| +| Alert groups (Unassigned, Open/Assigned, On-Hold, WIP-stalled, WIP-no-Jira, Customer-replied, Awaiting) | ✅ | `insights.ts` 9 groups; support rules `jiraBreached`/`clientOwed`/`isAwaitingAgency` ported. | +| Informational groups (Lifetime ≥90d, Inactive requester) | ✅ | Present, excluded from Total Alerts. | +| ∑ Total Alerts + Revenue-at-Risk | ✅ | Distinct-count reconciled (verifier-log). | +| Waiting-PO count + revenue + **L1/L2/L3** | 🟡 | Counts + revenue present; **no per-level (L1/L2/L3) drill-down lists**. `insights.ts:140`. **NTH** | +| PM-KPI table (# Tickets · $ Revenue · ⚠ Rev-at-Risk) | 🟡 | Table present; **not sortable**, and **hidden-PMs from `pm_kpi_settings` not honoured**. **NTH** | +| **Excel export of the insights subtree** (PM→Size→Ticket) | ❌ | Original `xl-export.js` writes PM/Size/Ticket-grouped sheets. FORGE has board export only. **MH** | +| **Region / PO / people filters** | ❌ | Original insights has EU/LATAM region + PO + people filters. Absent. **NTH** | +| **Per-PM size stats** | ❌ | No size breakdown inside the PM roll-up. **NTH** | +| **"Missing tickets" overlay** | ❌ | Original reconciliation overlay (tickets present in one source, absent in another). Absent. **LOW** | + +--- + +## 6. Jira board page — **MISSING ENTIRELY** ❌ (MH for Jira ops, else NTH) + +Original `jira-board.html` + `jira-board.js` (2378 LOC): columns from `jira_board_state`, cards, RITM↔Jira +link (`jira-ritm-link.js`), quick-filters, settings panel (board URL, scan controls, PO-cache clear), toasts, +scan countdown. FORGE has **no route, no page, no `jira_board_state` ingest** (`dump-to-archives.mjs` only +reads `jira_status_map`). Would live as `client/src/pages/JiraBoard/` + a `jira_board` archive/table + a +`/api/jira/board` endpoint. + +--- + +## 7. Sync / extension — `extension/background.js` (+ `popup.js`, `options.js`) + +FORGE's collector is **active-RITM only, shallow**. Original `background.js` (5219 LOC) is far deeper. + +| Aspect | Status | Note | +|---|:--:|---| +| SNOW active RITM scan | ✅ | `pageCollector` pages `sc_req_item`, `assignment_groupLIKEMarketing Web Presence`. | +| Field depth | 🟡 | Only **9 fields** (number, short_desc, state, assigned_to, group, opened_at, due_date, updated_by, updated_on). No brand/market/BU/requester/cost/activity timeline/state-change history. Rich fields survive only from the **seed**, kept alive by COALESCE upsert. **MH** | +| **SCTASK support** | ❌ | RITM-only. Original scans **SCTASK** too (`background.js` `sctask`/`SCTASK`). **NTH** | +| **Closed-ticket collector** | ❌ | No closed scan; closed data is seed-only, goes stale. **MH** | +| **Jira collector (+ statusDurations)** | ❌ | No Jira scanning; `jira_status_map`/`statusDurations`/`jira_board_state` never refreshed. **MH** | +| **Finance xlsx scan** | ❌ | Original scans the SharePoint finance workbook (`finance_xlsx`); FORGE finance is a one-shot seed from the dump. **MH** | +| Popup = RITM list + Jira tab | 🟡 | FORGE popup is **sync-only** (server URL + token + "Sync now"). Original popup is a RITM browser + Jira tab. **LOW** (by design — web app replaces it) | + +--- + +## 8. Finance — `server/db.ts:applyFinance` + `scripts/dump-to-archives.mjs:106` + +| Item | Status | Note | +|---|:--:|---| +| Finance ingest (cost / currency / PO / invoiced) | ✅ | `finance.json` (860 rows) → fills `finalCost`/`poNumber`/`invoiced`, recomputes size. | +| Milestone / PM / state columns | 🟡 | **Parsed into `finance.json`** (`milestone`, `pm`, `state`) **but never surfaced** — DB has no columns for them and no UI reads them. **NTH** | +| **Finance view** (invoicing / milestone / filters) | ❌ | No finance page. PO/invoiced only appear as an Excel column + waiting-PO signal. **NTH** | + +--- + +## 9. Size CALC tool — **MISSING ENTIRELY** ❌ (NTH) + +Original `size-calc.js` (692 LOC): a labor→size estimator (inputs by **role × hours × rate**, config +`lis_size_calc_cfg`, `MATCH`/`composite` algorithms). FORGE has a server `sizeOf(cost)` helper +(`db.ts:156`) that assigns sizes to tickets, but **no interactive estimator tool/page**. Would live as +`client/src/pages/SizeCalc/` + a `lis_size_calc_cfg` config key. + +--- + +## 10. Config / options editors — **MISSING ENTIRELY** ❌ (mixed) + +FORGE loads config **read-only** from `config.json`/`app_config` (seeded once). The original `options.html`/ +`options.js` (629 LOC) is a rich settings surface with **no FORGE equivalent** (the FORGE Admin page is +Users+Tokens only). Missing editors, each `GET /api/config` reads but nothing writes: + +| Setting (original id) | Status | Value | +|---|:--:|---| +| Brand colours editor (`brand_colors`, add/reset) | ❌ | **NTH** — 45 brands seeded, not editable in-app. | +| SLA norms editors (otd/avgdays/asla/psla/ttfr/cresp) | ❌ | **MH** — required by §3a editable-norms gap. | +| Insights thresholds editor (`insights_thresholds`) | ❌ | **NTH** | +| Size cost-thresholds editor (`otd_cost_thresh`) | ❌ | **NTH** | +| Card-field toggles (`cf-*`, 16) + mobile fields (`mf-*`) | ❌ | **NTH** — pairs with the board card-fields gap. | +| Colleague names (`colleagueNames`) / LATAM assignees (`latamAssignees`) | ❌ | **NTH** — seeded, not editable. | +| Display currency (`displayCurrency`) | ❌ | **LOW** — fixed GBP. | +| Custom labels (`custom-labels`, clear-all) | ❌ | **NTH** | +| SNOW field colours (`color-*`, 6) | ❌ | **LOW** — SNOW-page injection only, N/A to web app. | +| Card layout breakpoints (`card_layout`) | ❌ | **LOW** | +| Scan intervals / enables (analyticsIntervalHours, snRescanInterval, dashboardEnabled, jiraNotificationsEnabled, soundEnabled, analyzeButtonsEnabled) | ❌ | **LOW** — extension/SNOW-page behaviour. | +| Teams bot (`teamsBotEnabled`, chat names) | ❌ | **LOW** — out of scope. | + +--- + +## 11. Other + +| Item | Status | Note | +|---|:--:|---| +| AI Advisor / at-risk (`advisor-*.js`, `advisor-server/`) | ❌ (intended) | **Excluded per spec §1** ("user excluded AI"). Confirmed out of scope — do not port. | +| Teams integration (`teamsChannelLink`, teams bot) | ❌ | Out of scope-ish. **LOW** | +| Figma links (`figma-links.js`, 244 LOC) | ❌ | Optional per spec. **LOW** | +| Weather | — (no gap) | Excluded per spec **and dead in the original** — manifest keeps open-meteo/nominatim host perms but no weather JS remains. Nothing to port. | +| Docs page (`docs.html`/`docs.js`) | ❌ | In-app help. **LOW** | +| Archive import / export | 🟡 | `scripts/dump-to-archives.mjs` + `npm run reseed` is a **manual CLI** path; no in-app import/export UI. **LOW** | +| SCTASK support | ❌ | See §7 — RITM-only. **NTH** | +| Extension popup RITM browser | 🟡 | See §7. **LOW** | +| **New in FORGE (beyond original):** RBAC (4 roles), Users/Tokens Admin page, session auth, Postgres, server analytics engine | ✅ | Net-additive; no parity gap. | +| Legacy/unrouted FORGE pages: `pages/Dashboard`, `pages/Stats` | — | `Dashboard` is unrouted (superseded by `Board`); `Stats` is a thin `/stats` count page. Housekeeping, not a gap. | + +--- + +## 12. Recommended next phases (prioritized) + +**Phase A — PMs-KPI completion (highest value, biggest gap).** +1. Add **year/period granularity + current-vs-previous-year** to the 6 SLA heatmaps (`getSlaHeatmaps` + period control). *(MH)* +2. **Editable norms** — a `POST /api/config/norms` write path + inline norm panels (also unblocks the options editor). *(MH)* +3. Charts **18 (workload/month per-PM)**, **20 (missing final cost)**, **21 (awaiting-PO Cost/Avg/Max sortable)**. *(MH)* +4. Chart **19 engagement + `CalendarHeatmap`** (needs per-day activity/jira-movement ingest). *(MH, larger)* +5. Charts **22/23** brand-market sub-cards. *(NTH)* + +**Phase B — Overall/Active fidelity.** +6. **YoY pies #5/#6** (fair-window + full) as `DonutChart`s. *(MH)* +7. **#17 Jira status durations** (requires `statusDurations` ingest — see Phase D). *(MH)* +8. Per-year segmentation + drill + YoY on by-BU/by-brand/by-market/by-requester; **#15 min/median/max**; **#16 status-segmented brand**; **#/% toggle**; **CGO overlay**. *(NTH)* + +**Phase C — Board operability.** +9. **Sort (14)** + **group-by (6)** controls. *(NTH)* +10. **Toggleable card fields (16)** + badges (stale/PO/jira-stuck/missing-cost). *(NTH)* +11. Filters: region EU/LATAM, requester, jira-status/assignee, staleness, custom labels. *(NTH)* +12. **7th synthetic Closed/Awaiting-PO column.** *(MH)* + +**Phase D — Deeper sync (unblocks a lot above).** +13. Extend the collector: **richer RITM fields + closed scan + Jira (statusDurations, jira_board_state) + finance scan + SCTASK.** *(MH — currently rich data is seed-only and goes stale.)* + +**Phase E — Insights depth.** +14. **Excel export of the insights subtree** (PM→Size→Ticket); waiting-PO L1/L2/L3 drill; sortable PM table + hidden-PM support; region/PO/people filters. *(MH for export, else NTH.)* + +**Phase F — Standalone features.** +15. **Jira board page** (needs Phase D jira ingest). *(MH for Jira ops.)* +16. **Options/config editor** page (brand colours, thresholds, card fields, colleagues/region, currency, custom labels). *(NTH.)* +17. **Size CALC** estimator; **finance view** (milestone/invoicing — data already parsed). *(NTH.)* + +**Do not port:** AI Advisor/at-risk, weather (excluded); Teams/Figma/ADO board/docs page (low/optional). + +--- + +## 13. Addendum — refinements from the source inventory (corroborated) + +A parallel deep read of the initial app's source confirmed the above and adds: + +- **Board columns:** the original renders **5 live columns** (Open/Assigned, On Hold, WIP, Customer-replied, + Awaiting) **+ the synthetic Closed/Awaiting-PO** column; Unassigned is folded into Open/Assigned. FORGE + builds 6 (splits Unassigned out) and still lacks the synthetic 7th — the §4 "7th column MH" gap stands. +- **Per-chart Excel export:** in the original **every analytics chart** carries its own Excel button + (`_xlData`/`_xlBtn` → `xl-export.js`). FORGE has **no per-chart export** — only the board export. + Add as an **NTH** gap across Overall/Active/PMs-KPI. Insights groups also each export (see §5, MH). +- **Missing-tickets overlay** lives on the **3 SLA/OTD charts** (OTD/AvgDays/Assign/Preview), grouping the + timestamp-less tickets by current Jira status (reachedUat / beforeUat / noJira) — reclassify the §5 + "missing-tickets overlay" as part of the **PMs-KPI SLA charts** (still ❌). +- **Collector scope:** the original SN scan handles **RITM + SCTASK + INC** (not just RITM), computes + per-ticket `statusDurations` from status-change history, and runs a **Jira scan as a tail after every SN + scan**. FORGE's collector does none of this (§7) — add **INC** alongside the SCTASK gap. +- **Threshold value drift:** FORGE `config.json` has `waitingPo3: 18` and `customerReplied: 1`, vs the + original defaults `waitingPo3: 21` / `customerReplied: 3`. Minor, but reconcile when the norms/thresholds + editor lands (§10). **LOW** +- **Engagement KPI** reads the **live board** (not `ticketsMeta`), with twin Assist|Jira calendar heatmaps + and a ~14-column sortable drill-down — confirms the §3b #19 scope (**MH**, larger build). +- **Size CALC** uses 4 currencies (GBP/EUR/MXN + MXN·Brazil uplift ×1.111), roles DEV/CM/QA + auto-PM, + PM-budget tiering (`pmThreshold`/`pmHi`/`pmLo`) — confirms §9. +- **AI Advisor** is a full masked-digest + Node-bridge-to-Claude-CLI subsystem (`advisor-*.js` + + `advisor-server/`) with the At-risk breach engine — **correctly excluded**, do not port. +- **Archive import/export** exists as in-app **⬇ Archive / ⬇ Active** buttons in the original (FORGE has only + the `dump-to-archives.mjs` CLI) — the §11 🟡 stands. + +None of these change the phase priorities; they sharpen scope for Phases A, D, and E. + +## Next +principal — sequence Phase A (PMs-KPI) as the next build; confirm which board/insights sub-items are in v1 scope. diff --git a/claude_artifacts/designer-20260827-180842.md b/claude_artifacts/designer-20260827-180842.md new file mode 100644 index 0000000..98b6b68 --- /dev/null +++ b/claude_artifacts/designer-20260827-180842.md @@ -0,0 +1,31 @@ +# designer — Excel export design pass + +**Date:** 2026-08-27 · Task: review the ticket Excel export (column sizes, colours, styling). + +## Before +`utils/excel.utils.ts` had a bare schema — no widths, no header styling, no alignment, +raw SNOW timestamps, no number formatting. Functional but ugly. + +## After (FORGE-branded, token-derived colours) +- **Header row**: indigo `#6366F1` (`--primary`) background, white **bold** centred text, + row height 22, **frozen** (`stickyRowsCount: 1`) so it stays visible when scrolling. +- **Column widths** tuned per field: Number 15, State 20, Assignee/Requester 22, + Short description **46 + wrap**, Group 30, Brand/Market 14, Lifetime/In-state 12, + Last activity 14, Jira 14, Jira key 12, Cost 11, Ccy 7, PO 15, Link 34. +- **Alignment**: numeric columns (Lifetime, In state, Cost) right-aligned; dates + Ccy + centred; text left. All vertically centred. +- **Number format**: Cost `#,##0` (thousands separators). +- **Dates**: `Last activity` rendered as a short local date (`25 Aug 26`) instead of the raw + `2026-08-25 12:00:00` SNOW timestamp. +- **Grid**: thin light-grey borders `#E2E8F0` (`--border`) on every cell. +- **Font**: Calibri 11 (header) / 10 (body). +- Columns reordered so the human-readable ones (desc, brand, market, requester) sit before + the group/analytics fields. + +## Evidence +- client `tsc --noEmit` → clean; `vite build` → OK. +- Node render (`write-excel-file/node`, all style options): produced a valid **"Microsoft + Excel 2007+"** file (PK/zip header, 4 KB) — every styling option accepted, no throw. + +## Next: done — export honours the FORGE palette + is readable. (Excel colour-coding by +state/size intentionally skipped to keep it clean; can add if wanted.) diff --git a/claude_artifacts/devops-20260827-182020.md b/claude_artifacts/devops-20260827-182020.md new file mode 100644 index 0000000..41979ea --- /dev/null +++ b/claude_artifacts/devops-20260827-182020.md @@ -0,0 +1,35 @@ +# devops + designer — Synology deploy script, .env, and RITM→SNOW link + +**Date:** 2026-08-27 + +## Synology deploy (devops) — ported from the Husky template (per user request) +Two scripts, matching Husky's proven pattern (superseded my first single-script cut): +- **`scripts/push-to-nas.sh`** (local, `npm run deploy`): preflight (SSH key pinned via + `-i $NAS_KEY -o IdentitiesOnly=yes` — fixes the WebStorm multi-identity MaxAuthTries + failure) → test gate → rsync tree to NAS (openrsync→tar-over-ssh fallback for macOS) + → run `deploy.sh` over SSH forwarding `--pull`/`--fresh`. Excludes node_modules/dist/ + `.env`/`.deploy.env`/`storage-dump.json`/`.idea`/`claude_artifacts`. +- **`scripts/deploy.sh`** (on the NAS): Synology PATH hardening + `DOCKER_SUDO` autodetect + → optional `git pull` → `compose build` → `up -d --remove-orphans` → poll app container + for Docker `healthy` (≤120s). `--fresh` = `down --remove-orphans` **never `-v`** → the + `forge-db` volume is preserved. Adapted from Husky: removed the `ai.env` check, fixed the + `.env` required-vars message, `HOST_PORT_FALLBACK=3089`, corrected all "external Postgres / + no volumes" comments (FORGE bundles the db + `forge-db` volume). +- **Config baked in** (defaults = the real NAS: `192.168.50.2` / `d.tkachenko` / `2323` / + `/volume1/docker/forge` / `~/.ssh/id_ed25519`), overridable via env or an optional + `.deploy.env` (`.deploy.env.example`, gitignored). Both scripts `bash -n` clean + executable. +- **`.env.example`** rewritten: local vs prod split; compose overrides DATABASE_URL/PORT/NODE_ENV; + prod requires `SESSION_SECRET`, `AUTH_USER`, `AUTH_PASS`, `POSTGRES_PASSWORD`. Stale `ADMIN_KEY` + removed (tokens are admin-role gated now); port note corrected to the published lane. +- **`package.json`** `deploy` script added. **`docs/SETUP.md`** §6 documents the flow. +- Secrets never leave the NAS: `.env` is created once on the NAS and is never synced. +- NOT run — deploy needs explicit sign-off + a reachable NAS; script is created only. + +## RITM → SNOW link (designer) +- The ticket **number is now a link to ServiceNow** in the table Number column and on + board cards — inline external-link glyph, opens a new tab, `stopPropagation` so it + doesn't also open the detail modal. Removed the now-redundant separate external icons. +- `client/src/components/TicketTable/index.tsx` + `.module.scss` (`.numLink`), + `components/Board/BoardCard/index.tsx` + `.module.scss`. tsc + build clean. + +## Next: done. (Deploy: fill `.deploy.env`, create the NAS `.env`, `npm run deploy`.) diff --git a/claude_artifacts/engineer-20260827-180000.md b/claude_artifacts/engineer-20260827-180000.md new file mode 100644 index 0000000..51edb96 --- /dev/null +++ b/claude_artifacts/engineer-20260827-180000.md @@ -0,0 +1,43 @@ +# engineer — RBAC + Token page + Filtered Excel export + full-width + donut fix + +**Date:** 2026-08-27 · From: [principal-20260827-175448](principal-20260827-175448.md) + +## What changed + +### 1. Roles / RBAC +- `server/db.ts`: `app_users.role TEXT NOT NULL DEFAULT 'viewer'` (additive `ALTER … ADD COLUMN IF NOT EXISTS`). + `seedUser` forces the bootstrap `AUTH_USER` to `admin` (and repairs pre-role rows). Added + `Role`/`ROLES`/`isRole`, `listUsers`, `createUser` (23505 → 'exists'), `deleteUser`. +- `server/auth.ts`: session `user = {username, role}`; `verifyLogin` returns the role; + `requireRole(min)` — 401 unauth, **403** under-privileged. +- `index.ts` route gates: + - viewer: `/api/tickets`, `/api/tickets/:number`, `/api/stats`, `/api/config` + - pm: `/api/analytics/*`, `/api/insights` + - lead: `GET/POST /api/users`, `DELETE /api/users/:username` + - admin: `GET/POST /api/tokens`, `POST /api/tokens/:id/revoke` + - **Only admin may create an admin** (server 403 + client dropdown limits leadership to ≤lead). +- Client: `roleAtLeast`/`ROLE_LABELS`; App route guards (reports→pm, /admin→lead); + Sidebar shows Analytics only for pm+, Admin only for lead+; TopBar shows role. + +### 2. API token page — `pages/Admin` (Tokens tab, admin only) +List (label/id/last-used/expires/revoked) + create (raw `fg_…` shown once, copy) + revoke. +Replaces the `x-admin-key` HTTP gate with the admin session role. `mint-token` CLI unchanged. + +### 3. Filtered Excel export +`utils/excel.utils.ts` (`write-excel-file` dep, as in Husky) → exports the board's **currently +filtered** rows. Button in the board header. 17 columns incl. lifetime, days-in-state, cost, PO, link. + +### 4. Also +- Overall verifier REDO fixed: donut now fed `byRequesterShare` (full 966-ticket distribution), + not the top-20 nested `byRequester` → center total 966, correct %. +- All analytics pages `max-width: none` (charts span the full container width). + +## Verification (live, role forge_app DB) +- server tsc / client tsc clean; client vite build OK; `npm test` 9 pass. +- Gating matrix reproduced end-to-end: viewer → tickets/config 200, analytics/insights/users/tokens **403**; + pm → analytics/insights 200, users/tokens **403**; admin → all 200. viewer POST /api/users **403**. +- Bootstrap `admin` row correctly migrated to role `admin` (not the 'viewer' default). + +## Next +security — audit the authz (public domain): privilege escalation, self-delete/last-admin, token exposure. +verifier — gate the full change. diff --git a/claude_artifacts/engineer-20260827-185932.md b/claude_artifacts/engineer-20260827-185932.md new file mode 100644 index 0000000..088ce93 --- /dev/null +++ b/claude_artifacts/engineer-20260827-185932.md @@ -0,0 +1,25 @@ +# engineer — Extension Jira sync (SNOW + Jira, per ADR) + +**Date:** 2026-08-27 · Implements [architect-20260827-180544](architect-20260827-180544.md). v2.2.0. + +## Built +- **Server** `server/db.ts` `attachJira(items)` — attach-only: `UPDATE tickets SET + jira = COALESCE(jira,'{}') || $2::jsonb, jira_key = COALESCE($3, jira_key) WHERE number=$1`. + Never touches status/state/assignee/activity. `index.ts` `POST /api/sync/jira` + (token-authed, rate-limited) → validates {items:[{number,jira,jiraKey}]} → attachJira. +- **Extension** `background.js`: `collectFromJira(cfg)` pulls `/rest/agile/1.0/board/{id}/issue` + (paged), auth = Basic(email+token) or Bearer PAT; resolves RITM via customfield_26001 / `RITM\d+`; + builds {number, jira:{key,status,statusChangedAt,assignee,url:baseUrl/browse/KEY}}; POSTs to + `/api/sync/jira`. Wired into runSync AFTER SNOW; Jira is best-effort (never fails SNOW). + `options.html/js`: Jira base URL, email, API token/PAT, board id(s); requests host perm for the Jira origin. + +## Verified (live, remote DB) +- POST /api/sync/jira for RITM2653436 → matched:1; AFTER: status/state/assigned_to UNCHANGED, + jira_key=WFN-605, jira.status In QA, custom url support.dataart.com/browse/WFN-605. no-token → 401. +- server tsc clean; extension node --check OK; 9/9 tests. DB restored via reseed. + +## Not yet (follow-ups) +- Jira changelog fetch → statusDurations/movements (chart #17/#19). v1 does status/key/assignee/url. +- Live Jira REST untested (needs a real instance + creds); logic follows the ADR. + +## Next: done (v1). Configure the extension options with the Jira board id + token to use it. diff --git a/claude_artifacts/engineer-20260827-190753.md b/claude_artifacts/engineer-20260827-190753.md new file mode 100644 index 0000000..d7a3a31 --- /dev/null +++ b/claude_artifacts/engineer-20260827-190753.md @@ -0,0 +1,22 @@ +# engineer — Jira statusDurations + movements + chart #17 + +**Date:** 2026-08-27 · v2.3.0 + +## Built +- **Seed**: `dump-to-archives.mjs` enriches the jira map with `statusDurations` (ms) from + `jira_board_state.colIssues[*]._statusDurations` (keyed to RITM via customfield_26001), and + adds `jiraColumns` (workflow order) to config. 95 jira entries / 73 DB tickets get durations. +- **Types**: `JiraInfo` += `statusDurations: Record`, `movements:{at,who?,from?,to?}[]`. + `ForgeConfig` += `jiraColumns`. +- **Server**: `analytics.getJiraDurations()` averages `jira.statusDurations` per status (ms→days), + in `jiraColumns` order, min-2 tickets. `GET /api/analytics/jira-durations` (requireRole pm). +- **Client**: Active-stats page fetches it and renders a "Jira status durations (avg days)" BarList. +- **Extension**: `collectFromJira` adds `expand=changelog`; `jiraFromChangelog(issue)` reconstructs + time-per-status (created → transitions → now) and movements, sent inside `jira`. + +## Verified (live) +- `/api/analytics/jira-durations` → 18 statuses, workflow-ordered (Analysis…Closed) then extras; + e.g. UAT 16.1d/21, Closed 23.5d/16, In-Progress 4.9d/37. server+client tsc clean; build OK; 9/9 tests. + +## Not yet: live changelog untested (no Jira instance); movements only stored (chart #19 later). +## Next: done. diff --git a/claude_artifacts/principal-20260827-175448.md b/claude_artifacts/principal-20260827-175448.md new file mode 100644 index 0000000..4a51983 --- /dev/null +++ b/claude_artifacts/principal-20260827-175448.md @@ -0,0 +1,50 @@ +# principal — Auth/RBAC + Token page + Filtered Excel export + +**Date:** 2026-08-27 +**Request:** (1) Users with roles to log into the portal; (2) an API-token creation page; +(3) save tickets to Excel honoring the active filters. + +## 1. Roles & capability model + +Internal role keys (hierarchy `viewer < pm < lead < admin`), display labels: + +| key | label | Tasks (board/tickets/closed) | Reports (stats/insights) | Add users | API tokens | +|---|---|:--:|:--:|:--:|:--:| +| `viewer` | Viewer | ✓ | — | — | — | +| `pm` | PM | ✓ | ✓ | — | — | +| `lead` | Project Leadership | ✓ | ✓ | ✓ | — | +| `admin` | Admin | ✓ | ✓ | ✓ | ✓ | + +- `/api/config` + `/api/stats` stay viewer-accessible (board needs colours/colleagues/counts). +- `/api/sync` stays token-only (extension), unchanged. +- Server enforces per-route via `requireRole(min)`; client hides nav/pages a role can't use + (defense-in-depth; the server is the gate). +- Seeded `AUTH_USER` account is forced to role `admin` (bootstrap). + +## 2. Route → minimum role + +| Route | Min role | +|---|---| +| `GET /api/tickets`, `/api/tickets/:number`, `/api/stats`, `/api/config` | viewer | +| `GET /api/analytics/*`, `/api/insights` | pm | +| `GET/POST /api/users` (list/create) | lead | +| `GET/POST /api/tokens` (list/create) | admin | + +## 3. Token page +Admin-only page: list existing tokens (label, id, created, last-used, expiry, revoked) + +create (returns the raw `fg_…` once) + revoke. Replaces the `x-admin-key` HTTP gate with the +admin session role; the `mint-token` CLI stays. + +## 4. Filtered Excel export +Board/tickets "Export Excel" button → exports the CURRENTLY FILTERED rows client-side via +`write-excel-file` (the Husky template's dep). Columns: Number, State, Assignee, Group, Brand, +Market, Requester, Lifetime(d), Days-in-state, Last activity, Jira status, Cost, Link. + +## Plan / routing +- dba/engineer — `app_users.role` (additive), user CRUD, `requireRole`, route gating. +- security — audit the authz before merge (public domain). +- engineer — Admin page (Users + Tokens tabs), export util, role-gated nav. +- verifier — gate the result. + +## Next +engineer — implement server RBAC + user/token endpoints, then the client Admin page + export. diff --git a/claude_artifacts/security-20260827-180635.md b/claude_artifacts/security-20260827-180635.md new file mode 100644 index 0000000..daea57a --- /dev/null +++ b/claude_artifacts/security-20260827-180635.md @@ -0,0 +1,73 @@ +# security — RBAC + token-management + user-management audit + +**Date:** 2026-08-27 · From: [engineer-20260827-180000](engineer-20260827-180000.md), [principal-20260827-175448](principal-20260827-175448.md) +**Scope:** the new RBAC / API-token / user-management surface on the public domain. Read-only audit (no edits). +**Out of scope (per task):** DB-superuser-in-`.env` (tracked separately), analytics math. + +## Method / evidence +- Read `server/auth.ts`, `server/tokens.ts`, `server/db.ts`, `index.ts`, client `App.tsx`/services. +- Full route inventory via grep (`app.get|post|put|delete|use`) — 15 API routes, all accounted for below. +- Grepped for the removed `ADMIN_KEY`/`x-admin-key` gate → **no matches** (fully removed). No `dangerouslySetInnerHTML` in `client/src`. +- Live DB (role `forge_app`, `31.133.115.50:5440/forge`): `current_user=forge_app`; `SELECT count(*) FROM app_users WHERE role='admin'` → **1**; the sole account `admin` is role `admin` (bootstrap migrated correctly). No destructive SQL run. + +## Verified correct (no action) +- **Route gating matches the spec matrix.** viewer: `/api/tickets`,`/api/tickets/:number`,`/api/stats`,`/api/config` (`requireAuth`). pm: `/api/analytics/overview|sla`,`/api/insights` (`requireRole('pm')`). lead: `GET/POST /api/users`,`DELETE /api/users/:username`. admin: `GET/POST /api/tokens`,`POST /api/tokens/:id/revoke`. `/api/sync` token-only. +- **401 vs 403 correct** (`auth.ts:46-61`): unauth→401, under-privileged→403. +- **Role cannot be spoofed** — read from the server-side PG session store (`req.session.user`, `auth.ts:14`), never from client input. +- **Admin-creation guard present** (`index.ts:249`): non-admin creating `role==='admin'` → 403. +- **`isRole` validation** (`db.ts:191`): arbitrary/invalid role string → 400 `invalid_role`. +- **Self-delete guard present** (`index.ts:262`). +- **Tokens:** admin-only; raw `fg_…` returned once (`tokens.ts:81-89`), only `sha256(secret)` persisted; `listTokens` selects id/token_id/label/dates/revoked — **never `token_hash`** (`tokens.ts:97-106`); revoke honored (`resolveToken` filters `revoked=false AND not expired`, `tokens.ts:62`); constant-time `timingSafeEqual` compare. +- **Cookie hygiene:** httpOnly, sameSite=lax, secure-in-prod, `SESSION_SECRET` required in prod (`process.exit(1)`), login rate-limited (20/15min), bcrypt dummy-hash compare for unknown users (timing-uniform), bcrypt cost 12. +- **No secret leak:** `/api/users`→id/username/role/dates only (no `password_hash`); `/api/me`→`{username,role}` only. +- **Client gating is defense-in-depth only** (`App.tsx` `Navigate` redirects); the server is the true gate. + +--- + +## Ranked findings + +### HIGH-1 — A `lead` can delete `admin` accounts (no target-rank check) +**Where:** `index.ts:260` (`DELETE /api/users/:username` gated only at `requireRole('lead')`) + `server/db.ts:227` (`deleteUser` = unconditional `DELETE FROM app_users WHERE username=$1`). +**Exploit:** The create path forbids a non-admin from making an admin (`index.ts:249`), but the delete path has **no symmetric rank check** — a `lead` (or a compromised lead session) can delete any user, admins included. A lead can therefore remove every admin even though it can never create one. +**Impact:** Privilege-boundary violation. Combined with "only an admin creates an admin," a lead that deletes all admins permanently strips the org of token-management / admin-create ability until a server reboot re-seeds `AUTH_USER`. +**Fix:** Enforce actor-outranks-target in the delete path — refuse deleting a user whose role rank ≥ the actor's (a lead may not delete admins/leads), or raise `DELETE /api/users/:username` to admin-only. Hand to **engineer** (route + `deleteUser`). + +### HIGH-2 — Last-admin lockout (no guard on deleting/removing the final admin) +**Where:** `server/db.ts:227` `deleteUser`; no count check anywhere. There is **no demote endpoint** (confirmed — only `seedUser` ever writes `role`, `db.ts:179`), so deletion is the only removal path. +**Exploit:** Live state is a **single** admin (`admin`). Deleting it (reachable today by any lead per HIGH-1, or by a second admin) leaves zero admins. `/api/tokens*` then 403s for everyone; no one can create a new admin. +**Impact:** Availability/integrity loss of the admin tier. Recovery requires shell/redeploy access — `seedUser` re-inserts `AUTH_USER` as admin only when its row is absent (`db.ts:176-185`), and only that one account. +**Fix:** Guard against removing the last remaining admin (`SELECT count(*) … role='admin'` before delete; refuse if target is the only admin). Same for any future demote. Hand to **engineer/dba**. + +### HIGH-3 — Deleting a user does not invalidate their active session +**Where:** `auth.ts:46-61` (`requireAuth`/`requireRole` read identity+role from `req.session.user` set once at login, `index.ts:47`); session `maxAge` 7 days (`auth.ts:40`); session rows persist in `user_sessions`. `deleteUser` (`db.ts:227`) removes only the `app_users` row. +**Exploit:** An off-boarded/removed user keeps their cookie working at their cached role for up to 7 days. A deleted **lead** still passes `requireRole('lead')` and can keep deleting users (feeding HIGH-1) until session expiry. Role is never re-validated against the DB per request. +**Impact:** On a public domain, account removal is not effective access revocation; no mechanism to force-logout a user. +**Fix:** On delete (and any future role change), purge that user's sessions — e.g. `DELETE FROM user_sessions WHERE (sess->'user'->>'username') = $1` — or re-check user existence/role from `app_users` per request (short-cached). Hand to **engineer/dba**. + +### MEDIUM-1 — No session-fixation protection on login +**Where:** `index.ts:43-49` assigns `req.session.user = ok` on the pre-existing session id; no `req.session.regenerate()` at the privilege transition. +**Exploit:** Classic session fixation — an attacker who can plant a session cookie (e.g. via a sibling/adjacent context) rides the same id after the victim authenticates and it becomes privileged. Mitigated but not eliminated by httpOnly + sameSite=lax. +**Fix:** Regenerate the session id on successful login before writing `user`. Hand to **engineer**. + +### MEDIUM-2 — Weak password policy on a public login +**Where:** `index.ts:246` — minimum 6 chars, no complexity/denylist. Throttle is per-IP only (`loginLimiter` 20/15min, `index.ts:41`). +**Exploit:** Created accounts can carry trivially guessable passwords; per-IP throttling doesn't stop distributed/slow guessing against a public domain. +**Fix:** Raise minimum (~12 chars) and/or add a zxcvbn/denylist check; consider per-account lockout in addition to per-IP. Hand to **engineer**. + +### LOW-1 — No HTTP security headers (helmet absent) +**Where:** app has no `helmet`/CSP (grep empty); serves SPA + API on a public domain. +**Impact:** No `X-Frame-Options`/`frame-ancestors` (clickjacking of the authenticated UI), no HSTS, no `X-Content-Type-Options`. Adjacent to the auth perimeter, not RBAC-specific. +**Fix:** Add `helmet` with a same-origin CSP + HSTS-in-prod. Hand to **engineer/devops**. + +### LOW-2 — Silent no-op on delete/revoke of a non-existent id +**Where:** `db.ts:227` `deleteUser`, `tokens.ts:108` `revokeToken` — no affected-row check. `DELETE /api/users/:missing` and revoke of an unknown token id both return `{success:true}`. +**Impact:** Cosmetic/idempotency only (no enumeration leak — always success). Consider returning 404 when 0 rows affected so the admin UI reflects reality. Hand to **engineer**. + +### LOW-3b (informational) — CSRF on state-changing POSTs rests on `sameSite=lax` +State-changing routes (`/login`, `/api/users`, `/api/tokens*`, `DELETE /api/users/:username`) carry no CSRF token; cross-site protection is provided by the `sameSite=lax` cookie (`auth.ts:38`). Defensible today. If any of these routes ever move to `sameSite=none` (e.g. cross-origin embedding), add an explicit CSRF token. No fix required now. + +### LOW-3 (informational) — Leads self-propagate the user-management tier +**Where:** `index.ts:248-249` blocks only `role==='admin'` for non-admins; a lead may create unlimited additional `lead`s. This is per the capability spec ("leadership tops out at lead"), so it is by design — but note it compounds HIGH-1/HIGH-3: a lead can mint a co-lead, and either can delete the sole admin. No fix required; revisit if leads should not be able to grant lead. + +## Next +engineer/dba — fix HIGH-1 (target-rank check on delete), HIGH-2 (last-admin guard), HIGH-3 (session purge on delete). engineer — MEDIUM-1 (session regenerate), MEDIUM-2 (password policy), LOW-1/2. Then re-audit the delete path. diff --git a/claude_artifacts/verifier-log.md b/claude_artifacts/verifier-log.md new file mode 100644 index 0000000..fa6e85c --- /dev/null +++ b/claude_artifacts/verifier-log.md @@ -0,0 +1,18 @@ +- 2026-08-27 16:05 · security · FORGE public-domain read-only audit · VERDICT: REDO · re-ran: git ls-files/check-ignore (data+storage-dump NOT ignored, git add -n stages both), read index.ts+tokens.ts+tickets.ts+db.ts+Dockerfile+compose+.env, grep client href · probed: anon GET /api/tickets has no auth middleware=public PII; storage-dump.json=9.3MB real @reckitt.com emails would be git-committed (MISSED); javascript: href in TicketTable:60 unsanitized; ADMIN_KEY-unset fails closed 403 · REDO: 1 material missed PII file + 2 framing fixes +- 2026-08-27 16:06 · security · FORGE audit RESUBMIT (4 gaps fixed) · VERDICT: PASS · re-ran: grep -c unique reckitt emails=15 (agent said 14, trivial undercount), confirmed storage-dump.json exit-1 + git add -n stages it, index.ts:21 global json pre-auth, no read-route limiter · probed: storage-dump git-leak vector; LOW-7 pre-auth buffering; rate-limit gap on reads · PASS +- 2026-08-27 16:08 · architect/review · FORGE fidelity+template assessment · VERDICT: REDO · re-ran: read db.ts/index.ts/background.js/tokens.ts/Dockerfile/compose + node seed inspect(active=100,jira=127,closed=965,all RITM) + grep Closed/Stats/getStats · probed: sync-payload-vs-upsert destructive(confirmed), unauth GET routes(confirmed), RITM-only collector+docs(confirmed), token/Dockerfile parity(confirmed) · REDO: 2 grounding gaps (wrong seed counts; missed mixed-currency cost sum) +- 2026-08-27 16:08 · reviewer · FORGE correctness+convention review · VERDICT: REDO · re-ran: root/client tsc=0, vitest 3+6=9 pass, lint=eslint-not-found, pg DATE parse off-by-one confirmed (Kyiv->08-24, UTC->08-25) · probed: non-string activity.t crash (no error boundary confirmed), CLIENT_DIST dev overshoot, admin-key !== , extension host-permission grant (handled in options.js), MV3 SW async lifecycle · REDO: 1 gap (extension area-3 absent from findings/affirmations; substance sound on my audit) +- 2026-08-27 16:09 · architect/review · FORGE fidelity+template assessment (round 2) · VERDICT: PASS · re-ran: node seed recount(active=100,jira=127,closed=965,all RITM) + README:47-48 grep(confirms stale '111 active'/'846 closed') + reconfirmed fromClosed drops currencyCode & Closed totalCost=sum(finalCost) · probed: corrected counts match source, README doc-drift grounded, currency mixed-sum grounded · PASS +- 2026-08-27 16:17 · principal(3-review batch) · FORGE review fixes: dates/upsert/sanitize/jira/seed · VERDICT: PASS · re-ran: server tsc=0, client tsc=0, npm test 9pass(6+3), live PG TEMP-table smoke (active-wins+dateOnly+COALESCE all held under +3 TZ), hostile sanitizeActivity/parseDate probes · probed: toISOString off-by-one (dateOnly emits 2025-12-18 where due_date=Date@T22:00Z would shift), thin-sync nulling richness (COALESCE+CASE preserved finalCost/desc/brand/jira/84-activity), non-string activity.t & TS-bypass parseDate (all coerced/null, no throw) · PASS +- 2026-08-27 16:29 · security · read-API auth + least-priv DB role swap · VERDICT: PASS · re-ran: server tsc=0, client tsc=0, client build OK, npm test=9 pass, live DB (forge_app rolsuper/createdb/createrole=f, owns tickets/api_tokens/app_users/user_sessions, tickets=966), live boot smoke (no-session reads=401, /healthz=200, /api/sync no-token=401, wrong+unknown pw=401, correct login=200 HttpOnly+SameSite=Lax cookie, authed stats=966/100/866, /api/me=admin, logout then stats=401) · probed: unguarded read route (none), fail-closed after logout, timing-uniform unknown-user, SQLi on read filters (parameterized) · PASS +- 2026-08-27 17:01 · analytics-milestone(P0-2) · ingest+engine+client analytics · VERDICT: PASS · re-ran: SQL coverage(966/100/866,ttfr953/cd844/todo659/uat519/size774/ob954,cfg8keys) + math(rev2026-07=24160,Finish190/Durex123,Health167/Hygiene166,median42/avg65,Alesya 73.06d/404/15%) all reproduced via SQL+live app; server tsc OK, client tsc OK, vitest 9 pass, vite build OK · probed: unauth 401 on all 3 endpoints(live boot), empty/insufficient series guards, unmapped ccy NO/PART→rate1, DATE local-parts no UTC shift, no dangerouslySetInnerHTML · PASS +- 2026-08-27 17:05 · engineer · Phase3 Active tab + board redesign · VERDICT: PASS · re-ran: server tsc OK, client tsc OK, vite build OK, npm test 9 pass, live DB board-dist {awaiting65,hold6,open5,replied17,wip7}=100, progress 24→7wip/17replied, app_config colleagues 8 incl Alesya · probed: colleague-rule wip-vs-replied split (reproduced), empty unassigned column (0→No tickets), null last_activity_at (1 row→timeAgo em-dash), read-only (no PATCH/PUT/DELETE/DnD; only POST is login/logout; cards link to ServiceNow) · PASS +- 2026-08-27 17:27 · engineer/insights · PM Insights phase (finance ingest + engine + client) · VERDICT: PASS · re-ran: server tsc=0, client tsc=0, client build OK, tests 3+6=9 pass, DB counts active_cost=54/po_notnull=860/active_po_blank=73 exact, getInsights live=totalAlerts65/revAtRisk77373/waitingPo74(14·1·12)/topPM Alesya, live E2E unauth=401→login200→insights200 · probed: distinct-vs-doublecount (ΣgroupProb=65==totalAlerts==ΣpmAlerts, revreconciles), info-groups excluded (lifetime32/inactive6 not in 65), unmapped currency string→rate1 no crash + 46 null-cost→0, auth gate live 401 · PASS +- 2026-08-27 17:55 · engineer · Overall tab full fidelity · VERDICT: REDO · re-ran: server tsc OK, client tsc OK, npm test 9 pass, vite build OK, live psql byBrand/byRequester nested aggregation · probed: donut source cap (top-20 feeds share donut → center 'total'=375 not 966, %s inflated 2.6x), tie-order Strepsils/Nurofen, YoY single-year null, div-by-zero guards, auth 401 gate · REDO: 1 gap (donut misrepresents ticket share) +- 2026-08-27 18:07 · engineer · RBAC+tokens+filtered-xlsx+full-width+donut · VERDICT: PASS · re-ran: server tsc 0, client tsc 0, client vite build OK, tests 9 pass (6 client+3 root), live DB introspection · probed: lead POST role=admin blocked server-side 403 (index.ts:249); listTokens SQL omits token_hash (tokens.ts:98); donut center=966 live (all 966 rows have requester, Rowena 74≈8% not 375/20%); resolveToken filters revoked=false+expiry; export passes filtered set; app_users.role additive text NOT NULL default viewer, no column reshaped; only admin(role=admin) remains · PASS (note: no last-admin-delete guard — lead can delete an admin, non-blocking per task) +- 2026-08-27 18:09 · security · RBAC+token+user-mgmt audit · VERDICT: PASS · re-ran: greps(ADMIN_KEY/dangerouslySetInnerHTML/helmet/regenerate→none; route inventory→14 API routes match matrix) + read auth/db/tokens/index + client App/admin.service · probed: lead→delete-admin(HIGH-1 real), deleted-session-survives(HIGH-3 real), last-admin-lockout no-demote-endpoint(HIGH-2 real), listTokens no token_hash(holds) · PASS +- 2026-08-27 18:10 · architect · ADR: extension single sync engine SNOW+Jira · VERDICT: REDO · re-ran: grep server/db.ts upsert (clobber confirmed L466-483, jira=COALESCE L488), index.ts normalizeIncoming (status→active L172), manifest.json (host_perms confirmed), background.js (CHUNK=100/world:MAIN/offset<2000 confirmed), types.ts+client ticket.types.ts · probed: movements JSONB sub-field already declared {at,who}[] in 2 type files (ADR claims 5-field shape + adds conflicting {from,to,at}); no-RITM skip logic; separate-endpoint clobber-avoidance verified sound · REDO: 1 gap +- 2026-08-27 18:12 · architect · ADR: extension single sync engine SNOW+Jira (round 2) · VERDICT: PASS · re-ran: re-read ADR §1/§5/§11 vs code — JiraInfo 6 fields confirmed (server/types.ts:11-18, movements:17; client ticket.types.ts:9-16,:15); §5 reuses {at,who} + cites both files + flags statusDurations/board as new additive type-touch; §11 Types:additive bullet present · probed: movements shape now honest (no invented {from,to,at}); no runtime consumer claim matches grep; separate-endpoint clobber-avoidance still intact · PASS +- 2026-08-27 19:02 · engineer · Extension Jira-sync (SNOW+Jira attach-only) · VERDICT: PASS · re-ran: server tsc 0, node --check bg/options/popup OK, tests 9 pass (6 client+3 root), live psql TEMP-TABLE smoke of exact attachJira UPDATE (real RITM2653436 untouched) · probed: Jira payload with top-level "status"+SQLi string lands ONLY inside jira jsonb (ticket status stays closed, table survives)→no clobber/no injection; '||' merge preserves omitted keys (extraKept=KEEPME, assignee=Old Person); jira_key WFN-100→605 via COALESCE; non-matching number→UPDATE 0 (no stub); endpoint requireToken not session (401 w/o bearer, index.ts:241); schema additive-only (jira JSONB pre-existing, all ALTER ADD COLUMN IF NOT EXISTS) · PASS +- 2026-08-27 19:11 · engineer · Jira statusDurations+movements+chart #17 · VERDICT: PASS · re-ran: server+client tsc=0, root vitest 3/3, client vitest 6/6, live SQL agg on tickets(jira?statusDurations)=73 rows, booted dist+curl endpoint · probed: 401 unauth (got 401), min-2 filter drops Cancelled n=1, ordering known-workflow-first + extras avgDays-desc, ms/86.4M day math matches SQL exactly (UAT 16.14d/21, Closed 23.51d/16, InProgress 4.90d/37), guards NaN/<=0, client null-safe (jiraDur=[] + length>0 gate), static SQL no user input, additive jsonb no DDL · PASS +- 2026-08-29 11:20 · devops · SSH NAS host → mycloud.dp.ua:2323 · VERDICT: PASS · re-ran: grep 192.168.50.2 (only comment+artifact), grep NAS_HOST (all mycloud), bash -n push-to-nas.sh OK · probed: all ssh/scp/rsync hops use $NAS_HOST not hardcoded IP; port 2323 preserved; illustrative comment+historical artifact intentional · PASS diff --git a/client/index.html b/client/index.html new file mode 100644 index 0000000..92735df --- /dev/null +++ b/client/index.html @@ -0,0 +1,14 @@ + + + + + + + + FORGE 2.0 — ServiceNow Tickets + + +
+ + + diff --git a/client/package-lock.json b/client/package-lock.json new file mode 100644 index 0000000..ba665e1 --- /dev/null +++ b/client/package-lock.json @@ -0,0 +1,3725 @@ +{ + "name": "forge-client", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "forge-client", + "version": "2.0.0", + "dependencies": { + "classnames": "^2.5.1", + "fflate": "^0.8.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^7.14.1", + "sass": "^1.99.0", + "write-excel-file": "^2.3.10" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.1", + "typescript": "^6.0.3", + "vite": "^5.4.0", + "vitest": "^2.1.9" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.0.tgz", + "integrity": "sha512-70TeIFezKKy65LgAVyQh+w94/gjWhvPWaLaGGeMEgVrPkQhuj/M5bAYYZzIFUj9Y69oHyTm5Um/R6gcLh4A8JA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.0.tgz", + "integrity": "sha512-YC86tYIHK6M1IV+wbzO+Bxk8RCBr6ZyWYgWxUCzaZD8mc8rrFoIJDNzDrkHBYRc/wKdrsIXmm6/F7NzrAO+OrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.0.tgz", + "integrity": "sha512-oI+ECtUcli0y0fi4xpW82GdPIXdTkI8G8DSjG2LRuw09fPAGykaWYH/hXxiKuTxiAjiPSTIIuYUqof5Z2hShWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.0.tgz", + "integrity": "sha512-NwV+1s7TiKrMe4owHyKB/dTLD7ZJD0YEBEhIz+hvav1Cu1GReJjF+rsdNwjzENQeIAbE/CoNiaAc5Vz2h5DPAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.0.tgz", + "integrity": "sha512-tWtHBTu5gOPK4u4Urtk4qAHW3zZ9rQAmbssO8gp7ELvGTGI3aCiq6NqyTQ0PCIg7KbHJF2UkGDDs77YZGxfjCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.0.tgz", + "integrity": "sha512-2qPoJiwTvtHQ27NnYvTnsgk8laXWYuVmNESG8WFZBcEPKLfZ3I27qBJarjVRQtwGeYyRfq5ZowHXih9lm2BItw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.0.tgz", + "integrity": "sha512-FQwsTRvLNuHoTdICABJQfbPUSEueISGmnpT06tXTMpfprf5NiKLSXKA0A+w45wJnCmZAnzgqBwbt6ARFuyOi5w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.0.tgz", + "integrity": "sha512-BBVTXziw8mY1a4ZbWME9tZyfzqXCDPqaC7Z3heQ29p5dkvXzwL0NwelO8zLa8c3RBKvl3YTuSnBgsBhYBtwjIw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.0.tgz", + "integrity": "sha512-w2Iyy9+RqKwx3d9qWMKsJg0FfRBsY0/pXNv0mCQ3ueRvJI6+QAScfD4nrMlzFLs2HNVW6Ew+mtZfDl9b7Ew5/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.0.tgz", + "integrity": "sha512-YK++KtrFRHYE0P6/RtYEAy9t8F37znP+K03RrIuLPYOL6SVlObRumf/0OE4V/h63xL9DwkWbNssZfmA9hawuDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.0.tgz", + "integrity": "sha512-aBfOG6fP7YkkPmTqPwufRJeFyz7WPpECv9XNbnsk9+vg7rxdih0lbtEel7jcRng4LZrrmU3FfitCFyEj4BWDWg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.0.tgz", + "integrity": "sha512-LGaHEOeHNAag9VuS1Crs5DFg4RrU9MPi2nVnNJk9DTePx/B6RRYKVmrIXt2h7YOJlwjaFJ6lwtFDliZxScTLrQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.0.tgz", + "integrity": "sha512-jClvk+J0FC3b7Udvegiw5/4hErbHtmsNsQgENnKXDWtNCJXsJYZH5WURvu7imDOO38xYml24eeh5x3A04ppwCw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.0.tgz", + "integrity": "sha512-0OJlaGK+8+B777Ql5okIpD7ua5Ro9+VB9Ve0OKa28OQJZ1RbuUBVNHK/e3pr4BROqsyPl1JrPO1ZxJseCNffcA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.0.tgz", + "integrity": "sha512-Ygsx+HoNH7afwi1bTIXbnTvVnsO+zurPLSYxybV1hHFVU72OWOCl6v05ql/z0hkpAPx+DK7Kn9Bi7MayCcjLTA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.0.tgz", + "integrity": "sha512-pDQxtMGb+OvG3fLwR2OkZlSd47hW+kWg4BYMG/++sR6RqorQccwPTDsxda5hPwiIeIErAnCF9ma3SAU06bdQtQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.0.tgz", + "integrity": "sha512-0BnUG9mS8I4SSHr3XsxVhuCMEiu+rX61xxZF5vujso4LaiAGFZFxvDjg6Xn6tLPNTUAfuCvQYas4LMQMVsKRSQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.0.tgz", + "integrity": "sha512-Adu/VttB1dpPNW+FEacrZ+xVm9tFty84+RrFzsqlFaPxoJB+9XXyDGtp5dCOoBwGBIEVH0To7lExFXEx0BIF4A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.0.tgz", + "integrity": "sha512-NQ3bDvjUbFKmP23671xUlXtKmqVsUBd6M4PQCvbmNtOy06hnQIdKHy8oG/6S3R/S6He1JgPk6A5VT+prAJMYEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.0.tgz", + "integrity": "sha512-u2eDAl4+0aFvA13GxlGBtTI3SS3sdgwgtV0HyjZ0QaQVCgNE+jqNGey+GtxWiq+wxr/UycAx/OnfJzApCFamvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.0.tgz", + "integrity": "sha512-XvRb5vfW3wAZQ+ZUG21AnHHDKtNcw99eigzEhjr//NZ3u7SoBaPP0seSc7FgP7p1epAEdAoZckMW9WY/+4w70w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.0.tgz", + "integrity": "sha512-iZPmniy4kNBf5yo2RezbkYNNK5HPbXE9+g+twnbqSng7dtLEJy1SKoxiE/ni4FDacjyuZpEeb9U054N4EoKHYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.0.tgz", + "integrity": "sha512-mFBBd+LF37fnE8JnYUOH+imj0aPFPK30vpar4ehJkgnLj9sZn8ZxiRENmLtgIwxK7TC8klF6N57fxdNBwQoqOA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.0.tgz", + "integrity": "sha512-ujeqEY3B+zbGn3Z4Q03cUBG/LGWnBJncVT36WER31LcOsQk9+1dmINKKtvmmfChUvRbK1G0R8OhMWFgHgaZtAw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.0.tgz", + "integrity": "sha512-hncn90N4sOky0L2LKE5oESKLbxCPeVo4eLA2LSMoDzM+879ml4WSr+Rr4DWknNIVVvS1Hirkc9hx02W6YxS8rQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "license": "MIT", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.2.tgz", + "integrity": "sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.1.tgz", + "integrity": "sha512-N1nnXdHZAOSstz0XiHikGS4HGMH4CnSwhqWdGQQMqqdvp4Jybm9sE3R1WVnpWVd4SFkc8ryPDBLViNLwiEqECg==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.28.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.1.tgz", + "integrity": "sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==", + "license": "Apache-2.0" + }, + "node_modules/bare-stream": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.4.tgz", + "integrity": "sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.8.1", + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-stream/node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.2.tgz", + "integrity": "sha512-L13PCJzKG8RGvx8V1/DdMi12ERhC3tprr7/8a94BxpmnRsFqxh5XZNdhtMxu5HPkRshYOOWRGY8lDP7ZhpG9Cg==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.19.tgz", + "integrity": "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.415", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.415.tgz", + "integrity": "sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fflate": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", + "license": "MIT" + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", + "license": "MIT" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/immutable": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", + "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", + "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", + "license": "MIT", + "dependencies": { + "react-router": "7.18.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rollup": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.0.tgz", + "integrity": "sha512-T5vnZ2y4QqC3/4P+w2+JO+Q/OVdnPsv4XcSYJYMEn0R9/jjl5AgLwO9LAZMzP2lN71O6pypn91rB7lDstUkfrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.0", + "@rollup/rollup-android-arm64": "4.63.0", + "@rollup/rollup-darwin-arm64": "4.63.0", + "@rollup/rollup-darwin-x64": "4.63.0", + "@rollup/rollup-freebsd-arm64": "4.63.0", + "@rollup/rollup-freebsd-x64": "4.63.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.0", + "@rollup/rollup-linux-arm-musleabihf": "4.63.0", + "@rollup/rollup-linux-arm64-gnu": "4.63.0", + "@rollup/rollup-linux-arm64-musl": "4.63.0", + "@rollup/rollup-linux-loong64-gnu": "4.63.0", + "@rollup/rollup-linux-loong64-musl": "4.63.0", + "@rollup/rollup-linux-ppc64-gnu": "4.63.0", + "@rollup/rollup-linux-ppc64-musl": "4.63.0", + "@rollup/rollup-linux-riscv64-gnu": "4.63.0", + "@rollup/rollup-linux-riscv64-musl": "4.63.0", + "@rollup/rollup-linux-s390x-gnu": "4.63.0", + "@rollup/rollup-linux-x64-gnu": "4.63.0", + "@rollup/rollup-linux-x64-musl": "4.63.0", + "@rollup/rollup-openbsd-x64": "4.63.0", + "@rollup/rollup-openharmony-arm64": "4.63.0", + "@rollup/rollup-win32-arm64-msvc": "4.63.0", + "@rollup/rollup-win32-ia32-msvc": "4.63.0", + "@rollup/rollup-win32-x64-gnu": "4.63.0", + "@rollup/rollup-win32-x64-msvc": "4.63.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz", + "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==", + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=20.19.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/streamx": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.1.tgz", + "integrity": "sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.1.tgz", + "integrity": "sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar-stream/node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-decoder/node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", + "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", + "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.9", + "@vitest/mocker": "2.1.9", + "@vitest/pretty-format": "^2.1.9", + "@vitest/runner": "2.1.9", + "@vitest/snapshot": "2.1.9", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.9", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.9", + "@vitest/ui": "2.1.9", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/write-excel-file": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/write-excel-file/-/write-excel-file-2.3.10.tgz", + "integrity": "sha512-cqdS/lvo5yKr/s2LoJN/HnzsAH/Osmy1iw6Avd7yZsbXW3Ca9a6wDifO1f/nALNhL2ZkTeZFjz0kctY0uykhrA==", + "license": "MIT", + "dependencies": { + "archiver": "^7.0.1", + "file-saver": "^2.0.5", + "jszip": "^3.10.1" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000..ae1f2fb --- /dev/null +++ b/client/package.json @@ -0,0 +1,30 @@ +{ + "name": "forge-client", + "private": true, + "version": "2.3.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "test": "vitest run", + "test:watch": "vitest" + }, + "dependencies": { + "classnames": "^2.5.1", + "fflate": "^0.8.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^7.14.1", + "sass": "^1.99.0", + "write-excel-file": "^2.3.10" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.1", + "typescript": "^6.0.3", + "vite": "^5.4.0", + "vitest": "^2.1.9" + } +} diff --git a/client/public/favicon.svg b/client/public/favicon.svg new file mode 100644 index 0000000..cc9b794 --- /dev/null +++ b/client/public/favicon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/src/App.module.scss b/client/src/App.module.scss new file mode 100644 index 0000000..23d5391 --- /dev/null +++ b/client/src/App.module.scss @@ -0,0 +1,15 @@ +.layout { + display: grid; + grid-template-columns: var(--sidebar-w) 1fr; + grid-template-rows: var(--topbar-h) 1fr; + grid-template-areas: + 'sidebar topbar' + 'sidebar main'; + height: 100vh; +} + +.main { + grid-area: main; + overflow-y: auto; + padding: 24px 28px 40px; +} diff --git a/client/src/App.tsx b/client/src/App.tsx new file mode 100644 index 0000000..b60fdf9 --- /dev/null +++ b/client/src/App.tsx @@ -0,0 +1,108 @@ +import { useCallback, useEffect, useState } from 'react'; +import { Routes, Route, Navigate } from 'react-router-dom'; +import Sidebar from './components/Sidebar'; +import TopBar from './components/TopBar'; +import AuthWall from './components/AuthWall'; +import Board from './pages/Board'; +import Active from './pages/Active'; +import Closed from './pages/Closed'; +import Stats from './pages/Stats'; +import Overview from './pages/Overview'; +import SlaKpi from './pages/SlaKpi'; +import Insights from './pages/Insights'; +import Admin from './pages/Admin'; +import { roleAtLeast } from './services/auth.service'; +import { getStats } from './services/ticket.service'; +import { getMe, logout, type CurrentUser } from './services/auth.service'; +import { setUnauthorizedHandler } from './services/api.service'; +import styles from './App.module.scss'; + +export default function App() { + const [user, setUser] = useState(null); + const [authReady, setAuthReady] = useState(false); + const [search, setSearch] = useState(''); + const [refreshKey, setRefreshKey] = useState(0); + const [counts, setCounts] = useState({ active: 0, closed: 0 }); + const [refreshing, setRefreshing] = useState(false); + const [lastSync, setLastSync] = useState(null); + + const loadCounts = useCallback(async () => { + try { + const s = await getStats(); + setCounts({ active: s.active, closed: s.closed }); + setLastSync(new Date().toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })); + } catch { + // Sidebar counts are best-effort; pages surface their own load errors. + } + }, []); + + // Bootstrap: who am I? Then load counts only when authenticated. + useEffect(() => { + let alive = true; + getMe() + .then(me => { if (alive) { setUser(me); if (me) void loadCounts(); } }) + .catch(() => { if (alive) setUser(null); }) + .finally(() => { if (alive) setAuthReady(true); }); + return () => { alive = false; }; + }, [loadCounts]); + + // Any API 401 drops us back to the login screen. + useEffect(() => { + setUnauthorizedHandler(() => setUser(null)); + return () => setUnauthorizedHandler(null); + }, []); + + useEffect(() => { if (user) void loadCounts(); }, [user, refreshKey, loadCounts]); + + const handleLogin = useCallback((u: CurrentUser) => { + setUser(u); + setRefreshKey(k => k + 1); + }, []); + + const handleLogout = useCallback(async () => { + await logout().catch(() => {}); + setUser(null); + }, []); + + const handleRefresh = useCallback(async () => { + setRefreshing(true); + setRefreshKey(k => k + 1); + await loadCounts(); + setRefreshing(false); + }, [loadCounts]); + + if (!authReady) return null; + if (!user) return ; + + const canReports = roleAtLeast(user.role, 'pm'); + const canUsers = roleAtLeast(user.role, 'lead'); + const reports = (el: React.ReactNode) => (canReports ? el : ); + + return ( +
+ + +
+ + } /> + } /> + )} /> + )} /> + )} /> + )} /> + )} /> + : } /> + } /> + +
+
+ ); +} diff --git a/client/src/components/AuthWall/AuthWall.module.scss b/client/src/components/AuthWall/AuthWall.module.scss new file mode 100644 index 0000000..43383cd --- /dev/null +++ b/client/src/components/AuthWall/AuthWall.module.scss @@ -0,0 +1,81 @@ +@use '../../styles/variables' as *; + +.wrap { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + background: radial-gradient(circle at 30% 20%, #1e293b, var(--sidebar)); + padding: $s-4; +} + +.card { + width: 340px; + max-width: 100%; + background: var(--surface); + border-radius: $radius-lg; + box-shadow: var(--shadow-lg); + padding: $s-8 $s-6; + display: flex; + flex-direction: column; +} + +.brand { + display: flex; + align-items: center; + gap: $s-2; + justify-content: center; +} +.mark { font-size: 22px; } +.name { font-size: 20px; font-weight: 700; letter-spacing: 0.16em; color: var(--text); } + +.subtitle { + margin: $s-2 0 $s-5; + text-align: center; + font-size: 13px; + color: var(--text-muted); +} + +.label { + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--text-muted); + margin-bottom: 5px; +} +.input { + height: 38px; + padding: 0 12px; + margin-bottom: $s-4; + border: 1px solid var(--border); + border-radius: $radius; + font-size: 14px; + color: var(--text); + outline: none; + + &:focus { border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-bg); } +} + +.error { + margin-bottom: $s-3; + padding: 8px 10px; + border-radius: $radius; + background: var(--danger-bg); + color: var(--danger); + font-size: 12px; +} + +.button { + height: 40px; + border: none; + border-radius: $radius; + background: var(--primary); + color: #fff; + font-size: 14px; + font-weight: 600; + transition: background 0.15s ease; + + &:hover:not(:disabled) { background: var(--primary-h); } + &:disabled { opacity: 0.6; cursor: default; } +} diff --git a/client/src/components/AuthWall/index.tsx b/client/src/components/AuthWall/index.tsx new file mode 100644 index 0000000..39ab270 --- /dev/null +++ b/client/src/components/AuthWall/index.tsx @@ -0,0 +1,63 @@ +import { useState } from 'react'; +import { login, type CurrentUser } from '../../services/auth.service'; +import styles from './AuthWall.module.scss'; + +export default function AuthWall({ onLogin }: { onLogin: (user: CurrentUser) => void }) { + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(null); + const [busy, setBusy] = useState(false); + + const submit = async (e: React.FormEvent) => { + e.preventDefault(); + setBusy(true); + setError(null); + try { + const res = await login(username.trim(), password); + if (res.success && res.user) onLogin(res.user); + else setError(res.error || 'Invalid username or password'); + } catch { + setError('Could not reach the server.'); + } finally { + setBusy(false); + } + }; + + return ( +
+
+
+ + FORGE 2.0 +
+

Sign in to view the ticket board.

+ + + setUsername(e.target.value)} + autoComplete="username" + autoFocus + /> + + + setPassword(e.target.value)} + autoComplete="current-password" + /> + + {error &&
{error}
} + + +
+
+ ); +} diff --git a/client/src/components/Board/BoardCard/BoardCard.module.scss b/client/src/components/Board/BoardCard/BoardCard.module.scss new file mode 100644 index 0000000..ec82625 --- /dev/null +++ b/client/src/components/Board/BoardCard/BoardCard.module.scss @@ -0,0 +1,72 @@ +@use '../../../styles/variables' as *; + +.card { + background: var(--surface); + border: 1px solid var(--border); + border-left: 3px solid var(--col); + border-radius: $radius; + padding: 9px 11px; + cursor: pointer; + box-shadow: var(--shadow-sm); + transition: box-shadow $transition, transform $transition; + display: flex; + flex-direction: column; + gap: 6px; + + &:hover { box-shadow: var(--shadow); transform: translateY(-1px); } +} + +.top { display: flex; align-items: center; justify-content: space-between; gap: 6px; } +.number { + font-family: var(--mono); font-size: 11px; font-weight: 700; color: var(--primary); + display: inline-flex; align-items: center; gap: 3px; + svg { opacity: 0.5; } + &:hover { text-decoration: underline; svg { opacity: 1; } } +} +.topRight { display: flex; align-items: center; gap: 6px; } +.jira { font-size: 9px; font-weight: 700; padding: 1px 5px; border-radius: 3px; background: var(--primary-bg); color: var(--primary); } +.ext { display: flex; color: var(--text-dim); &:hover { color: var(--primary); } } + +.title { + font-size: 12.5px; + font-weight: 600; + line-height: 1.35; + color: var(--text); + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.bm { + align-self: flex-start; + font-size: 10px; + font-weight: 600; + padding: 1px 7px; + border-radius: 999px; + background: var(--surface-alt); + color: var(--text-muted); + border: 1px solid var(--border); + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.foot { display: flex; align-items: center; justify-content: space-between; gap: 6px; } +.assignee { display: flex; align-items: center; gap: 6px; min-width: 0; } +.avatar { + width: 20px; height: 20px; border-radius: 50%; flex-shrink: 0; + background: var(--primary); color: #fff; font-size: 9px; font-weight: 700; + display: flex; align-items: center; justify-content: center; +} +.aName { font-size: 11px; color: var(--text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.pill { + flex-shrink: 0; font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 999px; + background: var(--surface-alt); color: var(--text-muted); font-variant-numeric: tabular-nums; +} + +.meta { + display: flex; gap: $s-3; font-size: 10px; color: var(--text-dim); + border-top: 1px solid var(--border); padding-top: 5px; +} diff --git a/client/src/components/Board/BoardCard/index.tsx b/client/src/components/Board/BoardCard/index.tsx new file mode 100644 index 0000000..300dfc3 --- /dev/null +++ b/client/src/components/Board/BoardCard/index.tsx @@ -0,0 +1,56 @@ +import { ExternalIcon } from '../../icons'; +import { parseDate, timeAgo, initials } from '../../../utils/format.utils'; +import type { Ticket } from '../../../types/ticket.types'; +import styles from './BoardCard.module.scss'; + +function daysSince(v: string | null): number | null { + const d = parseDate(v); + if (!d) return null; + return Math.floor((Date.now() - d.getTime()) / 86_400_000); +} + +interface BoardCardProps { + ticket: Ticket; + color: string; + brandColor?: string; + onSelect: (t: Ticket) => void; +} + +export default function BoardCard({ ticket, color, brandColor, onSelect }: BoardCardProps) { + const lifetime = daysSince(ticket.openedAt); + const inState = daysSince(ticket.stateChangedAt); + const bm = [ticket.brand, ticket.market].filter(Boolean).join(' · '); + + return ( +
onSelect(ticket)}> +
+ {ticket.link ? ( + e.stopPropagation()} title="Open in ServiceNow"> + {ticket.number} + + ) : ( + {ticket.number} + )} + {ticket.jira?.status && {ticket.jira.status}} +
+ +
{ticket.shortDesc || '—'}
+ + {bm && {bm}} + +
+ + {initials(ticket.assignedTo)} + {ticket.assignedTo ?? 'Unassigned'} + + {inState != null && {inState}d} +
+ +
+ {lifetime != null && ⏱ {lifetime}d} + ✎ {timeAgo(ticket.lastActivityAt)} +
+
+ ); +} diff --git a/client/src/components/PageHeader/PageHeader.module.scss b/client/src/components/PageHeader/PageHeader.module.scss new file mode 100644 index 0000000..e79b466 --- /dev/null +++ b/client/src/components/PageHeader/PageHeader.module.scss @@ -0,0 +1,25 @@ +@use '../../styles/variables' as *; + +.header { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: $s-4; + margin-bottom: $s-5; +} +.title { + font-size: 20px; + font-weight: 700; + color: var(--text); +} +.subtitle { + margin-top: 2px; + font-size: 13px; + color: var(--text-muted); +} +.actions { + display: flex; + align-items: center; + gap: $s-2; + flex-wrap: wrap; +} diff --git a/client/src/components/PageHeader/index.tsx b/client/src/components/PageHeader/index.tsx new file mode 100644 index 0000000..a12d7a5 --- /dev/null +++ b/client/src/components/PageHeader/index.tsx @@ -0,0 +1,19 @@ +import styles from './PageHeader.module.scss'; + +interface PageHeaderProps { + title: string; + subtitle?: string; + children?: React.ReactNode; +} + +export default function PageHeader({ title, subtitle, children }: PageHeaderProps) { + return ( +
+
+

{title}

+ {subtitle &&

{subtitle}

} +
+ {children &&
{children}
} +
+ ); +} diff --git a/client/src/components/Sidebar/Sidebar.module.scss b/client/src/components/Sidebar/Sidebar.module.scss new file mode 100644 index 0000000..1b52b77 --- /dev/null +++ b/client/src/components/Sidebar/Sidebar.module.scss @@ -0,0 +1,93 @@ +@use '../../styles/variables' as *; + +.sidebar { + grid-area: sidebar; + width: var(--sidebar-w); + background: var(--sidebar); + color: var(--sidebar-text); + display: flex; + flex-direction: column; + padding: $s-4 $s-3; + overflow-y: auto; +} + +.brand { + display: flex; + align-items: center; + gap: $s-2; + padding: $s-2 $s-2 $s-5; +} +.brandMark { + font-size: 20px; + filter: drop-shadow(0 0 6px rgba(99, 102, 241, 0.6)); +} +.brandName { + font-size: 17px; + font-weight: 700; + letter-spacing: 0.14em; + color: #fff; +} +.brandVer { + font-size: 10px; + font-weight: 700; + padding: 1px 6px; + border-radius: 999px; + background: var(--primary); + color: #fff; + letter-spacing: 0.02em; +} + +.nav { flex: 1; } + +.section { + font-size: 10px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--sidebar-dim); + padding: 0 $s-2 $s-2; +} + +.item { + display: flex; + align-items: center; + gap: $s-3; + padding: 8px $s-2; + border-radius: $radius; + color: var(--sidebar-text); + font-size: 13px; + font-weight: 500; + transition: background $transition, color $transition; + + &:hover { background: var(--sidebar-alt); color: #fff; } +} +.itemActive { + background: var(--primary); + color: #fff; + &:hover { background: var(--primary-h); } +} + +.itemIcon { display: flex; opacity: 0.9; } +.itemLabel { flex: 1; } + +.badge { + min-width: 20px; + text-align: center; + padding: 1px 6px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.14); + font-size: 11px; + font-weight: 700; +} + +.footer { + display: flex; + flex-direction: column; + gap: 2px; + padding: $s-4 $s-2 0; + border-top: 1px solid var(--sidebar-alt); + margin-top: $s-4; + font-size: 11px; + color: var(--sidebar-dim); +} +.version { color: var(--sidebar-dim); } diff --git a/client/src/components/Sidebar/index.tsx b/client/src/components/Sidebar/index.tsx new file mode 100644 index 0000000..e8237da --- /dev/null +++ b/client/src/components/Sidebar/index.tsx @@ -0,0 +1,70 @@ +import { NavLink } from 'react-router-dom'; +import { TicketIcon, ArchiveIcon, ChartIcon, KeyIcon } from '../icons'; +import { roleAtLeast, ROLE_LABELS, type CurrentUser } from '../../services/auth.service'; +import styles from './Sidebar.module.scss'; + +interface SidebarProps { + activeCount: number; + closedCount: number; + user: CurrentUser; +} + +export default function Sidebar({ activeCount, closedCount, user }: SidebarProps) { + const canReports = roleAtLeast(user.role, 'pm'); + const canAdmin = roleAtLeast(user.role, 'lead'); + return ( + + ); +} + +interface NavItemProps { + to: string; + label: string; + icon: React.ReactNode; + count?: number; + end?: boolean; +} + +function NavItem({ to, label, icon, count, end }: NavItemProps) { + return ( + `${styles.item} ${isActive ? styles.itemActive : ''}`} + > + {icon} + {label} + {count !== undefined && count > 0 && {count}} + + ); +} diff --git a/client/src/components/StatePill/StatePill.module.scss b/client/src/components/StatePill/StatePill.module.scss new file mode 100644 index 0000000..a65e578 --- /dev/null +++ b/client/src/components/StatePill/StatePill.module.scss @@ -0,0 +1,20 @@ +@use '../../styles/variables' as *; + +.pill { + display: inline-flex; + align-items: center; + padding: 2px 9px; + border-radius: 999px; + font-size: 11px; + font-weight: 600; + line-height: 1.5; + white-space: nowrap; + border: 1px solid transparent; +} + +.progress { color: var(--primary); background: var(--primary-bg); border-color: rgba(99,102,241,0.25); } +.waiting { color: var(--warning); background: var(--warning-bg); border-color: rgba(234,88,12,0.25); } +.open { color: var(--success); background: var(--success-bg); border-color: rgba(22,163,74,0.25); } +.done { color: var(--success); background: var(--success-bg); border-color: rgba(22,163,74,0.25); } +.cancelled { color: var(--danger); background: var(--danger-bg); border-color: rgba(220,38,38,0.25); } +.neutral { color: var(--neutral); background: var(--neutral-bg); border-color: rgba(100,116,139,0.25); } diff --git a/client/src/components/StatePill/index.tsx b/client/src/components/StatePill/index.tsx new file mode 100644 index 0000000..80126fa --- /dev/null +++ b/client/src/components/StatePill/index.tsx @@ -0,0 +1,16 @@ +import styles from './StatePill.module.scss'; + +// Map a ServiceNow state to a tone. Unknown states fall back to neutral. +function tone(state: string): string { + const s = state.toLowerCase(); + if (s.includes('progress') || s === 'assigned') return styles.progress; + if (s.includes('awaiting') || s.includes('hold')) return styles.waiting; + if (s === 'open') return styles.open; + if (s.includes('complete')) return styles.done; + if (s.includes('cancel') || s.includes('incomplete')) return styles.cancelled; + return styles.neutral; +} + +export default function StatePill({ state }: { state: string }) { + return {state || '—'}; +} diff --git a/client/src/components/TicketDetailModal/TicketDetailModal.module.scss b/client/src/components/TicketDetailModal/TicketDetailModal.module.scss new file mode 100644 index 0000000..f7c320f --- /dev/null +++ b/client/src/components/TicketDetailModal/TicketDetailModal.module.scss @@ -0,0 +1,174 @@ +@use '../../styles/variables' as *; + +.overlay { + position: fixed; + inset: 0; + background: rgba(15, 23, 42, 0.55); + backdrop-filter: blur(2px); + display: flex; + justify-content: flex-end; + z-index: 100; + animation: fade 0.12s ease; +} +@keyframes fade { from { opacity: 0; } to { opacity: 1; } } + +.modal { + width: 560px; + max-width: 94vw; + height: 100%; + background: var(--surface); + box-shadow: var(--shadow-lg); + padding: $s-5 $s-6; + overflow-y: auto; + animation: slide 0.16s ease; +} +@keyframes slide { from { transform: translateX(24px); opacity: 0.6; } to { transform: translateX(0); opacity: 1; } } + +.head { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: $s-4; +} +.number { + display: flex; + align-items: center; + gap: $s-3; + font-family: var(--mono); + font-weight: 700; + color: var(--primary); + font-size: 13px; +} +.ext { + display: inline-flex; + align-items: center; + gap: 4px; + font-family: var(--font); + font-size: 12px; + font-weight: 600; + color: var(--text-muted); + &:hover { color: var(--primary); } +} +.title { + margin-top: 6px; + font-size: 17px; + font-weight: 700; + line-height: 1.35; + color: var(--text); +} +.close { + flex-shrink: 0; + width: 32px; + height: 32px; + border: none; + border-radius: $radius; + background: var(--surface-alt); + color: var(--text-muted); + display: flex; + align-items: center; + justify-content: center; + &:hover { background: var(--border); color: var(--text); } +} + +.metaRow { + display: flex; + align-items: center; + gap: $s-2; + margin: $s-4 0; +} +.jiraBadge { + font-size: 11px; + font-weight: 600; + padding: 2px 9px; + border-radius: 999px; + background: var(--primary-bg); + color: var(--primary); +} + +.fields { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $s-3 $s-4; + padding: $s-4 0; + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); +} +.field { + dt { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-dim); } + dd { margin-top: 2px; font-size: 13px; color: var(--text); } +} + +.block { margin-top: $s-5; } +.blockTitle { + display: flex; + align-items: center; + gap: 8px; + font-size: 12px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--text-muted); + margin-bottom: $s-3; +} +.count { + font-size: 11px; + padding: 1px 7px; + border-radius: 999px; + background: var(--surface-alt); + color: var(--text-muted); +} +.description, .comment { + font-size: 13px; + line-height: 1.6; + color: var(--text); + white-space: pre-wrap; + word-break: break-word; +} +.comment { + padding: $s-3; + background: var(--surface-alt); + border-radius: $radius; + border-left: 3px solid var(--primary); +} + +.timeline { list-style: none; position: relative; } +.event { + display: flex; + gap: $s-3; + padding-bottom: $s-4; + position: relative; + + &:not(:last-child)::before { + content: ''; + position: absolute; + left: 11px; + top: 24px; + bottom: 0; + width: 2px; + background: var(--border); + } +} +.dot { + width: 24px; + height: 24px; + border-radius: 50%; + flex-shrink: 0; + background: var(--primary-bg); + color: var(--primary); + display: flex; + align-items: center; + justify-content: center; + z-index: 1; +} +.dotNote { background: var(--warning-bg); color: var(--warning); } +.eventBody { flex: 1; } +.eventTop { display: flex; align-items: center; gap: 8px; } +.who { font-size: 13px; font-weight: 600; color: var(--text); } +.kind { + font-size: 10px; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--text-dim); +} +.when { font-size: 12px; color: var(--text-muted); margin-top: 1px; } +.more { font-size: 12px; color: var(--text-dim); padding-left: 36px; } diff --git a/client/src/components/TicketDetailModal/index.tsx b/client/src/components/TicketDetailModal/index.tsx new file mode 100644 index 0000000..05b1925 --- /dev/null +++ b/client/src/components/TicketDetailModal/index.tsx @@ -0,0 +1,112 @@ +import { useEffect } from 'react'; +import StatePill from '../StatePill'; +import { CloseIcon, ExternalIcon, CommentIcon, NoteIcon } from '../icons'; +import { formatDate, formatDateTime, formatCost, formatMinutes } from '../../utils/format.utils'; +import type { Ticket } from '../../types/ticket.types'; +import styles from './TicketDetailModal.module.scss'; + +export default function TicketDetailModal({ ticket, onClose }: { ticket: Ticket; onClose: () => void }) { + useEffect(() => { + const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; + window.addEventListener('keydown', onKey); + return () => window.removeEventListener('keydown', onKey); + }, [onClose]); + + const activity = [...(ticket.activity ?? [])].sort((a, b) => String(b.t).localeCompare(String(a.t))); + + return ( +
+
e.stopPropagation()}> +
+
+
+ {ticket.number} + {ticket.link && ( + + Open in ServiceNow + + )} +
+

{ticket.shortDesc || '—'}

+
+ +
+ +
+ + {ticket.jira?.status && (ticket.jira.url + ? + Jira {ticket.jira.key ? `${ticket.jira.key} ` : ''}· {ticket.jira.status} + + : Jira: {ticket.jira.status} + )} +
+ +
+ + + + + + + + + + {ticket.status === 'closed' && <> + + + + + } +
+ + {ticket.description && ( +
+

Description

+

{ticket.description}

+
+ )} + + {ticket.lastComment && ( +
+

Latest comment

+

{ticket.lastComment}

+
+ )} + + {activity.length > 0 && ( +
+

Activity {activity.length}

+
    + {activity.slice(0, 60).map((a, i) => ( +
  • + + {a.kind === 'worknote' ? : } + +
    +
    + {a.who} + {a.kind} +
    +
    {formatDateTime(a.t)}
    +
    +
  • + ))} +
+ {activity.length > 60 &&
+{activity.length - 60} earlier events
} +
+ )} +
+
+ ); +} + +function Field({ label, value }: { label: string; value: string | null | undefined }) { + if (!value || value === '—') return null; + return ( +
+
{label}
+
{value}
+
+ ); +} diff --git a/client/src/components/TicketTable/TicketTable.module.scss b/client/src/components/TicketTable/TicketTable.module.scss new file mode 100644 index 0000000..f475c3a --- /dev/null +++ b/client/src/components/TicketTable/TicketTable.module.scss @@ -0,0 +1,119 @@ +@use '../../styles/variables' as *; + +.wrap { + background: var(--surface); + border: 1px solid var(--border); + border-radius: $radius-lg; + overflow: hidden; + box-shadow: var(--shadow-sm); +} + +.table { + width: 100%; + border-collapse: collapse; + font-size: 13px; + + thead th { + text-align: left; + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--text-muted); + padding: 10px $s-3; + background: var(--surface-alt); + border-bottom: 1px solid var(--border); + white-space: nowrap; + } +} + +.right { text-align: right; } +.num { text-align: right; font-variant-numeric: tabular-nums; } + +.row { + cursor: pointer; + transition: background $transition; + border-bottom: 1px solid var(--border); + + &:last-child { border-bottom: none; } + &:hover { background: var(--row-hover); } + + td { padding: 9px $s-3; vertical-align: middle; } +} + +.number { + font-family: var(--mono); + font-weight: 600; + color: var(--primary); + white-space: nowrap; + + display: flex; + align-items: center; + gap: 6px; +} +.numLink { + display: inline-flex; + align-items: center; + gap: 4px; + color: var(--primary); + + svg { opacity: 0.55; } + &:hover { text-decoration: underline; svg { opacity: 1; } } +} +.jira { + font-family: var(--font); + font-size: 10px; + font-weight: 700; + padding: 1px 6px; + border-radius: 4px; + background: var(--primary-bg); + color: var(--primary); +} + +.desc { + max-width: 340px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: var(--text); +} + +.assignee { display: flex; align-items: center; gap: 8px; } +.avatar { + width: 24px; + height: 24px; + border-radius: 50%; + background: var(--primary); + color: #fff; + font-size: 10px; + font-weight: 700; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} +.assigneeName { + max-width: 150px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.muted { color: var(--text-muted); white-space: nowrap; } +.num { color: var(--text); } + +.right { + white-space: nowrap; + color: var(--text-muted); + + display: flex; + align-items: center; + justify-content: flex-end; + gap: 8px; +} +.ago { font-size: 12px; } +.ext { + display: flex; + color: var(--text-dim); + &:hover { color: var(--primary); } +} diff --git a/client/src/components/TicketTable/index.tsx b/client/src/components/TicketTable/index.tsx new file mode 100644 index 0000000..ee14c55 --- /dev/null +++ b/client/src/components/TicketTable/index.tsx @@ -0,0 +1,80 @@ +import StatePill from '../StatePill'; +import { ExternalIcon } from '../icons'; +import { timeAgo, initials, formatCost, formatMinutes } from '../../utils/format.utils'; +import type { Ticket } from '../../types/ticket.types'; +import styles from './TicketTable.module.scss'; + +interface TicketTableProps { + tickets: Ticket[]; + variant?: 'active' | 'closed'; + onSelect: (t: Ticket) => void; +} + +export default function TicketTable({ tickets, variant = 'active', onSelect }: TicketTableProps) { + const closed = variant === 'closed'; + return ( +
+ + + + + + + + {closed ? : } + {closed ? : } + {closed ? : } + + + + {tickets.map(t => ( + onSelect(t)} className={styles.row}> + + + + + {closed ? ( + + ) : ( + + )} + {closed ? ( + + ) : ( + + )} + {closed ? ( + + ) : ( + + )} + + ))} + +
TicketShort descriptionStateAssigneeMarketGroupTTFRBrandCostLast activity
+ {t.link ? ( + e.stopPropagation()} title="Open in ServiceNow"> + {t.number} + + ) : ( + {t.number} + )} + {t.jira?.status && {t.jira.status}} + {t.shortDesc || '—'} + + {initials(t.assignedTo)} + {t.assignedTo ?? '—'} + + {t.market ?? '—'}{shortGroup(t.assignmentGroup)}{formatMinutes(t.ttfrMinutes)}{t.brand ?? '—'}{formatCost(t.finalCost)} + {timeAgo(t.lastActivityAt)} +
+
+ ); +} + +// "L3 EU CORE RECKITT Marketing Web Presence" → "EU CORE" +function shortGroup(g: string | null): string { + if (!g) return '—'; + return g.replace(/^L3\s+/, '').replace(/\s+Marketing Web Presence$/i, ''); +} diff --git a/client/src/components/TopBar/TopBar.module.scss b/client/src/components/TopBar/TopBar.module.scss new file mode 100644 index 0000000..13683a1 --- /dev/null +++ b/client/src/components/TopBar/TopBar.module.scss @@ -0,0 +1,102 @@ +@use '../../styles/variables' as *; + +.topbar { + grid-area: topbar; + height: var(--topbar-h); + background: var(--surface); + border-bottom: 1px solid var(--border); + display: flex; + align-items: center; + gap: $s-4; + padding: 0 $s-5; +} + +.searchWrap { + position: relative; + flex: 1; + max-width: 460px; +} +.searchIcon { + position: absolute; + left: 10px; + top: 50%; + transform: translateY(-50%); + color: var(--text-dim); + display: flex; +} +.search { + width: 100%; + height: 34px; + padding: 0 12px 0 34px; + border: 1px solid var(--border); + border-radius: $radius; + background: var(--bg); + font-size: 13px; + color: var(--text); + outline: none; + transition: border-color $transition, box-shadow $transition; + + &:focus { + border-color: var(--primary); + box-shadow: 0 0 0 3px var(--primary-bg); + background: var(--surface); + } + &::placeholder { color: var(--text-dim); } +} + +.right { + margin-left: auto; + display: flex; + align-items: center; + gap: $s-3; +} +.lastSync { font-size: 12px; color: var(--text-muted); } + +.refresh { + height: 34px; + padding: 0 16px; + border: 1px solid var(--border); + border-radius: $radius; + background: var(--surface); + color: var(--text); + font-size: 13px; + font-weight: 600; + transition: background $transition, border-color $transition; + + &:hover:not(:disabled) { background: var(--surface-alt); border-color: var(--border-strong); } + &:disabled { opacity: 0.6; cursor: default; } +} + +.user { + display: flex; + align-items: center; + gap: $s-2; + padding-left: $s-3; + margin-left: $s-1; + border-left: 1px solid var(--border); +} +.avatar { + width: 30px; + height: 30px; + border-radius: 50%; + background: var(--primary); + color: #fff; + font-size: 11px; + font-weight: 700; + display: flex; + align-items: center; + justify-content: center; +} +.logout { + height: 34px; + padding: 0 12px; + border: 1px solid transparent; + border-radius: $radius; + background: transparent; + color: var(--text-muted); + font-size: 13px; + font-weight: 600; + transition: background $transition, color $transition; + + &:hover { background: var(--surface-alt); color: var(--text); } +} diff --git a/client/src/components/TopBar/index.tsx b/client/src/components/TopBar/index.tsx new file mode 100644 index 0000000..d5942c0 --- /dev/null +++ b/client/src/components/TopBar/index.tsx @@ -0,0 +1,41 @@ +import { SearchIcon } from '../icons'; +import { initials } from '../../utils/format.utils'; +import type { CurrentUser } from '../../services/auth.service'; +import styles from './TopBar.module.scss'; + +interface TopBarProps { + search: string; + onSearch: (v: string) => void; + onRefresh: () => void; + refreshing: boolean; + lastSync: string | null; + user: CurrentUser; + onLogout: () => void; +} + +export default function TopBar({ search, onSearch, onRefresh, refreshing, lastSync, user, onLogout }: TopBarProps) { + return ( +
+
+ + onSearch(e.target.value)} + /> +
+ +
+ {lastSync && Updated {lastSync}} + +
+ {initials(user.username)} + +
+
+
+ ); +} diff --git a/client/src/components/charts/BarList/BarList.module.scss b/client/src/components/charts/BarList/BarList.module.scss new file mode 100644 index 0000000..53b7612 --- /dev/null +++ b/client/src/components/charts/BarList/BarList.module.scss @@ -0,0 +1,49 @@ +@use '../../../styles/variables' as *; + +.card { + background: var(--surface); + border: 1px solid var(--border); + border-radius: $radius-lg; + padding: $s-5; + box-shadow: var(--shadow-sm); +} +.title { + font-size: 12px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--text-muted); + margin-bottom: $s-4; +} +.empty { color: var(--text-dim); font-size: 13px; padding: $s-4 0; } + +.list { list-style: none; display: flex; flex-direction: column; gap: 9px; } +.row { + display: grid; + grid-template-columns: var(--lw) 1fr 4.5ch; + align-items: center; + gap: $s-3; +} +.label { + font-size: 12px; + color: var(--text); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.track { height: 18px; background: var(--surface-alt); border-radius: 4px; overflow: hidden; } +.fill { + display: block; + height: 100%; + width: var(--pct); + border-radius: 4px; + background: var(--swatch); + transition: width 0.5s cubic-bezier(0.34, 1.2, 0.4, 1); +} +.value { + text-align: right; + font-size: 12px; + font-weight: 600; + color: var(--text-muted); + font-variant-numeric: tabular-nums; +} diff --git a/client/src/components/charts/BarList/index.tsx b/client/src/components/charts/BarList/index.tsx new file mode 100644 index 0000000..916fde0 --- /dev/null +++ b/client/src/components/charts/BarList/index.tsx @@ -0,0 +1,37 @@ +import styles from './BarList.module.scss'; +import type { Bucket } from '../../../types/analytics.types'; + +interface BarListProps { + title: string; + data: Bucket[]; + colorFor?: (b: Bucket, i: number) => string; + format?: (n: number) => string; + labelWidth?: number; + empty?: string; +} + +export default function BarList({ title, data, colorFor, format, labelWidth = 150, empty = 'No data' }: BarListProps) { + const max = Math.max(1, ...data.map(d => d.count)); + return ( +
+
{title}
+ {data.length === 0 ? ( +
{empty}
+ ) : ( +
    + {data.map((d, i) => ( +
  • + {d.label} + + {format ? format(d.count) : d.count} +
  • + ))} +
+ )} +
+ ); +} diff --git a/client/src/components/charts/DonutChart/DonutChart.module.scss b/client/src/components/charts/DonutChart/DonutChart.module.scss new file mode 100644 index 0000000..8ce7e23 --- /dev/null +++ b/client/src/components/charts/DonutChart/DonutChart.module.scss @@ -0,0 +1,19 @@ +@use '../../../styles/variables' as *; + +.card { background: var(--surface); border: 1px solid var(--border); border-radius: $radius-lg; padding: $s-5; box-shadow: var(--shadow-sm); } +.head { display: flex; align-items: center; justify-content: space-between; gap: $s-3; margin-bottom: $s-4; } +.title { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-muted); } +.toggle { + display: inline-flex; border: 1px solid var(--border); border-radius: $radius; overflow: hidden; + button { height: 24px; width: 30px; border: none; background: var(--surface); color: var(--text-muted); font-size: 12px; font-weight: 700; cursor: pointer; + &.on { background: var(--primary); color: #fff; } } +} +.body { display: flex; gap: $s-5; align-items: center; flex-wrap: wrap; } +.ring { width: 180px; height: 180px; flex-shrink: 0; } +.centerNum { font-size: 30px; font-weight: 800; fill: var(--text); font-variant-numeric: tabular-nums; } +.centerLbl { font-size: 10px; fill: var(--text-dim); text-transform: uppercase; letter-spacing: 0.06em; } +.legend { list-style: none; flex: 1; min-width: 180px; display: flex; flex-direction: column; gap: 5px; max-height: 200px; overflow-y: auto; } +.legItem { display: grid; grid-template-columns: 12px 1fr auto; align-items: center; gap: 8px; font-size: 12px; } +.sw { width: 10px; height: 10px; border-radius: 2px; } +.legLabel { color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.legVal { font-weight: 600; color: var(--text-muted); font-variant-numeric: tabular-nums; } diff --git a/client/src/components/charts/DonutChart/index.tsx b/client/src/components/charts/DonutChart/index.tsx new file mode 100644 index 0000000..15663ad --- /dev/null +++ b/client/src/components/charts/DonutChart/index.tsx @@ -0,0 +1,62 @@ +import { useState } from 'react'; +import styles from './DonutChart.module.scss'; +import type { Bucket } from '../../../types/analytics.types'; + +const PALETTE = ['#6366f1', '#8b5cf6', '#06b6d4', '#f59e0b', '#10b981', '#ef4444', '#ec4899', '#3b82f6', '#14b8a6', '#f97316', '#a855f7', '#0ea5e9']; +const SIZE = 200, R = 78, STROKE = 20, C = 2 * Math.PI * R; + +export default function DonutChart({ title, data, topN = 11 }: { title: string; data: Bucket[]; topN?: number }) { + const [pct, setPct] = useState(false); + + const sorted = [...data].sort((a, b) => b.count - a.count); + const head = sorted.slice(0, topN); + const rest = sorted.slice(topN); + const restTotal = rest.reduce((s, b) => s + b.count, 0); + const slices = restTotal > 0 ? [...head, { key: '__others', label: `Others (${rest.length})`, count: restTotal }] : head; + const total = slices.reduce((s, b) => s + b.count, 0) || 1; + const color = (i: number) => (i === slices.length - 1 && restTotal > 0 ? 'var(--text-dim)' : PALETTE[i % PALETTE.length]); + + let offset = 0; + const arcs = slices.map((b, i) => { + const frac = b.count / total; + const dash = frac * C; + const arc = { b, i, dash, gap: C - dash, rot: (offset / C) * 360, color: color(i) }; + offset += dash; + return arc; + }); + + return ( +
+
+ {title} +
+ + +
+
+
+ + + {arcs.map(a => ( + + {`${a.b.label}: ${a.b.count} (${Math.round((a.b.count / total) * 100)}%)`} + + ))} + {total} + total + +
    + {arcs.map(a => ( +
  • + + {a.b.label} + {pct ? `${Math.round((a.b.count / total) * 100)}%` : a.b.count} +
  • + ))} +
+
+
+ ); +} diff --git a/client/src/components/charts/ExpandBarList/ExpandBarList.module.scss b/client/src/components/charts/ExpandBarList/ExpandBarList.module.scss new file mode 100644 index 0000000..984f473 --- /dev/null +++ b/client/src/components/charts/ExpandBarList/ExpandBarList.module.scss @@ -0,0 +1,25 @@ +@use '../../../styles/variables' as *; + +.card { background: var(--surface); border: 1px solid var(--border); border-radius: $radius-lg; padding: $s-5; box-shadow: var(--shadow-sm); } +.title { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-muted); margin-bottom: $s-4; } +.list { list-style: none; display: flex; flex-direction: column; gap: 8px; } + +.row { + width: 100%; + display: grid; + grid-template-columns: var(--lw) 1fr 4.5ch; + align-items: center; + gap: $s-3; + background: none; border: none; padding: 0; cursor: pointer; text-align: left; +} +.label { font-size: 12px; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: flex; align-items: center; gap: 5px; } +.chev { font-size: 9px; color: var(--text-dim); transition: transform 0.15s ease; display: inline-block; } +.chevOpen { transform: rotate(90deg); } +.track { height: 18px; background: var(--surface-alt); border-radius: 4px; overflow: hidden; } +.fill { display: block; height: 100%; width: var(--pct); border-radius: 4px; background: var(--swatch); transition: width 0.5s cubic-bezier(0.34, 1.2, 0.4, 1); } +.value { text-align: right; font-size: 12px; font-weight: 600; color: var(--text-muted); font-variant-numeric: tabular-nums; } + +.children { list-style: none; margin: 6px 0 4px 16px; display: flex; flex-direction: column; gap: 5px; padding-left: 8px; border-left: 2px solid var(--border); } +.childRow { display: grid; grid-template-columns: var(--lw) 1fr 4.5ch; align-items: center; gap: $s-3; } +.childLabel { font-size: 11px; color: var(--text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.childFill { display: block; height: 100%; width: var(--pct); border-radius: 4px; background: var(--text-dim); } diff --git a/client/src/components/charts/ExpandBarList/index.tsx b/client/src/components/charts/ExpandBarList/index.tsx new file mode 100644 index 0000000..0cbaf82 --- /dev/null +++ b/client/src/components/charts/ExpandBarList/index.tsx @@ -0,0 +1,55 @@ +import { useState } from 'react'; +import styles from './ExpandBarList.module.scss'; +import type { NestedBucket, Bucket } from '../../../types/analytics.types'; + +interface ExpandBarListProps { + title: string; + data: NestedBucket[]; + colorFor?: (b: Bucket, i: number) => string; + labelWidth?: number; +} + +export default function ExpandBarList({ title, data, colorFor, labelWidth = 150 }: ExpandBarListProps) { + const [open, setOpen] = useState>(new Set()); + const max = Math.max(1, ...data.map(d => d.count)); + const toggle = (k: string) => setOpen(prev => { const n = new Set(prev); n.has(k) ? n.delete(k) : n.add(k); return n; }); + + return ( +
+
{title}
+
    + {data.map((d, i) => { + const isOpen = open.has(d.key); + const childMax = Math.max(1, ...d.children.map(c => c.count)); + return ( +
  • + + {isOpen && ( +
      + {d.children.map(c => ( +
    • + {c.label} + + {c.count} +
    • + ))} +
    + )} +
  • + ); + })} +
+
+ ); +} diff --git a/client/src/components/charts/GroupedBars/GroupedBars.module.scss b/client/src/components/charts/GroupedBars/GroupedBars.module.scss new file mode 100644 index 0000000..31f10e4 --- /dev/null +++ b/client/src/components/charts/GroupedBars/GroupedBars.module.scss @@ -0,0 +1,19 @@ +@use '../../../styles/variables' as *; + +.card { background: var(--surface); border: 1px solid var(--border); border-radius: $radius-lg; padding: $s-5; box-shadow: var(--shadow-sm); } +.head { display: flex; align-items: center; justify-content: space-between; gap: $s-3; margin-bottom: $s-2; } +.title { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-muted); } +.controls { display: flex; align-items: center; gap: $s-3; } +.yoy { font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 999px; } +.up { color: var(--success); background: var(--success-bg); } +.down { color: var(--danger); background: var(--danger-bg); } +.toggle { + display: inline-flex; border: 1px solid var(--border); border-radius: $radius; overflow: hidden; + button { height: 26px; padding: 0 10px; border: none; background: var(--surface); color: var(--text-muted); font-size: 11px; font-weight: 600; cursor: pointer; + &.on { background: var(--primary); color: #fff; } } +} +.legend { display: flex; gap: $s-4; flex-wrap: wrap; margin-bottom: $s-2; } +.leg { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--text-muted); b { color: var(--text); font-variant-numeric: tabular-nums; } } +.sw { width: 12px; height: 8px; border-radius: 2px; } +.svg { width: 100%; height: auto; display: block; } +.axis { font-size: 9px; fill: var(--text-dim); font-family: var(--mono); } diff --git a/client/src/components/charts/GroupedBars/index.tsx b/client/src/components/charts/GroupedBars/index.tsx new file mode 100644 index 0000000..aaf248b --- /dev/null +++ b/client/src/components/charts/GroupedBars/index.tsx @@ -0,0 +1,85 @@ +import { useState } from 'react'; +import styles from './GroupedBars.module.scss'; +import type { MonthPoint } from '../../../types/analytics.types'; + +const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; +const YEAR_COLORS = ['#f97316', '#1a73e8', '#16a34a', '#dc2626', '#7c3aed']; +const W = 700, H = 250, PADX = 40, PADT = 20, PADB = 42; + +interface GroupedBarsProps { + title: string; + points: MonthPoint[]; // YYYY-MM + format?: (n: number) => string; + defaultMode?: 'bars' | 'line'; +} + +export default function GroupedBars({ title, points, format, defaultMode = 'bars' }: GroupedBarsProps) { + const [mode, setMode] = useState<'bars' | 'line'>(defaultMode); + + const years = [...new Set(points.map(p => Number(p.month.slice(0, 4))))].sort(); + const yearColor = (y: number) => YEAR_COLORS[years.indexOf(y) % YEAR_COLORS.length]; + // grid[monthIdx][year] = count + const grid: Record> = {}; + for (const p of points) { + const y = Number(p.month.slice(0, 4)); + const mi = Number(p.month.slice(5, 7)) - 1; + (grid[mi] ??= {})[y] = (grid[mi]?.[y] ?? 0) + p.count; + } + const max = Math.max(1, ...points.map(p => p.count)); + const totals = Object.fromEntries(years.map(y => [y, points.filter(p => p.month.startsWith(String(y))).reduce((s, p) => s + p.count, 0)])); + const yoy = years.length >= 2 ? pctDelta(totals[years[years.length - 1]], totals[years[years.length - 2]]) : null; + + const innerW = W - PADX * 2, innerH = H - PADT - PADB; + const groupW = innerW / 12; + const x = (mi: number) => PADX + mi * groupW; + const y = (v: number) => PADT + (1 - v / max) * innerH; + const tick = (v: number) => (format ? format(v) : String(v)); + + const linePath = (yr: number) => MONTHS + .map((_, mi) => ({ mi, v: grid[mi]?.[yr] })).filter(p => p.v != null) + .map((p, i) => `${i === 0 ? 'M' : 'L'} ${(x(p.mi) + groupW / 2).toFixed(1)} ${y(p.v!).toFixed(1)}`).join(' '); + + return ( +
+
+ {title} +
+ {yoy != null && = 0 ? styles.up : styles.down}`}>{yoy >= 0 ? '▲' : '▼'} {Math.abs(yoy)}% YoY} +
+ + +
+
+
+
+ {years.map(yr => {yr} {tick(totals[yr])})} +
+ + {[0, 0.5, 1].map(f => { + const gy = PADT + f * innerH; + return + + {tick(Math.round(max * (1 - f)))} + ; + })} + {mode === 'bars' + ? MONTHS.map((_, mi) => { + const yrs = years.filter(yr => grid[mi]?.[yr] != null); + const bw = (groupW * 0.7) / Math.max(1, yrs.length); + return yrs.map((yr, i) => { + const v = grid[mi]![yr]; + const bx = x(mi) + groupW * 0.15 + i * bw; + return {`${MONTHS[mi]} ${yr}: ${tick(v)}`}; + }); + }) + : years.map(yr => )} + {MONTHS.map((m, mi) => {m})} + +
+ ); +} + +function pctDelta(cur: number, prev: number): number | null { + if (!prev) return null; + return Math.round(((cur - prev) / prev) * 100); +} diff --git a/client/src/components/charts/KpiTile/KpiTile.module.scss b/client/src/components/charts/KpiTile/KpiTile.module.scss new file mode 100644 index 0000000..5a9afb6 --- /dev/null +++ b/client/src/components/charts/KpiTile/KpiTile.module.scss @@ -0,0 +1,27 @@ +@use '../../../styles/variables' as *; + +.tile { + position: relative; + background: var(--surface); + border: 1px solid var(--border); + border-radius: $radius-lg; + padding: $s-5; + box-shadow: var(--shadow-sm); + overflow: hidden; + border-top: 3px solid var(--primary); + + &[data-tone='success'] { border-top-color: var(--success); } + &[data-tone='warning'] { border-top-color: var(--warning); } + &[data-tone='danger'] { border-top-color: var(--danger); } + &[data-tone='neutral'] { border-top-color: var(--neutral); } +} + +.value { + font-size: clamp(26px, 3.4vw, 38px); + font-weight: 800; + line-height: 1; + font-variant-numeric: tabular-nums; + color: var(--text); +} +.label { margin-top: 8px; font-size: 13px; color: var(--text-muted); } +.hint { margin-top: 2px; font-size: 11px; color: var(--text-dim); } diff --git a/client/src/components/charts/KpiTile/index.tsx b/client/src/components/charts/KpiTile/index.tsx new file mode 100644 index 0000000..f8079b4 --- /dev/null +++ b/client/src/components/charts/KpiTile/index.tsx @@ -0,0 +1,18 @@ +import styles from './KpiTile.module.scss'; + +interface KpiTileProps { + label: string; + value: string | number; + tone?: 'primary' | 'success' | 'warning' | 'danger' | 'neutral'; + hint?: string; +} + +export default function KpiTile({ label, value, tone = 'primary', hint }: KpiTileProps) { + return ( +
+
{value}
+
{label}
+ {hint &&
{hint}
} +
+ ); +} diff --git a/client/src/components/charts/SlaHeatmap/SlaHeatmap.module.scss b/client/src/components/charts/SlaHeatmap/SlaHeatmap.module.scss new file mode 100644 index 0000000..36bbf0c --- /dev/null +++ b/client/src/components/charts/SlaHeatmap/SlaHeatmap.module.scss @@ -0,0 +1,63 @@ +@use '../../../styles/variables' as *; + +.card { + background: var(--surface); + border: 1px solid var(--border); + border-radius: $radius-lg; + padding: $s-5; + box-shadow: var(--shadow-sm); +} +.head { display: flex; align-items: baseline; justify-content: space-between; gap: $s-3; margin-bottom: $s-4; } +.title { font-size: 13px; font-weight: 700; color: var(--text); } +.sub { font-size: 11px; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.04em; } + +.scroll { overflow-x: auto; } +.table { + width: 100%; + border-collapse: separate; + border-spacing: 3px; + font-size: 12px; +} +.pmHead, .sizeHead, .totHead { + font-size: 10px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--text-muted); + padding: 2px 6px; + text-align: center; + white-space: nowrap; +} +.pmHead { text-align: left; } +.sizeHead { display: table-cell; } +.sizeChip { + display: inline-block; + min-width: 26px; + padding: 1px 6px; + border-radius: 4px; + color: #fff; + font-weight: 700; +} +.norm { display: block; margin-top: 2px; font-size: 9px; color: var(--text-dim); font-weight: 500; } + +.pm { + text-align: left; + font-weight: 600; + color: var(--text); + white-space: nowrap; + max-width: 170px; + overflow: hidden; + text-overflow: ellipsis; + padding-right: $s-2; +} +.cell, .total { + text-align: center; + border-radius: 4px; + padding: 4px 8px; + min-width: 52px; + background: var(--surface-alt); +} +.total { background: var(--primary-bg); } +.primary { display: block; font-weight: 700; color: var(--text); font-variant-numeric: tabular-nums; } +.meta { display: block; font-size: 10px; color: var(--text-muted); } +.dot { color: var(--text-dim); } diff --git a/client/src/components/charts/SlaHeatmap/index.tsx b/client/src/components/charts/SlaHeatmap/index.tsx new file mode 100644 index 0000000..a9ef2df --- /dev/null +++ b/client/src/components/charts/SlaHeatmap/index.tsx @@ -0,0 +1,82 @@ +import styles from './SlaHeatmap.module.scss'; +import type { SlaMetric, SlaCell } from '../../../types/analytics.types'; + +const SIZE_COLORS: Record = { + XS: '#14b8a6', S: '#1a73e8', M: '#f59e0b', L: '#10b981', XL: '#8b5cf6', XXL: '#ef4444', +}; + +function normDays(norm: number | undefined, unit: 'days' | 'hours'): number | undefined { + if (norm == null) return undefined; + return unit === 'hours' ? norm / 24 : norm; +} + +// Value → background tint. Green when at/under norm, red when over, scaled. +function cellTint(cell: SlaCell, norm: number | undefined): string | undefined { + if (cell.avgDays == null || norm == null || norm <= 0) return undefined; + const ratio = cell.avgDays / norm; + if (ratio <= 1) { + const t = Math.max(0.12, 1 - ratio); // deeper green the further under + return `rgba(22, 163, 74, ${(0.10 + t * 0.22).toFixed(3)})`; + } + const over = Math.min(2, ratio - 1); + return `rgba(220, 38, 38, ${(0.10 + over * 0.20).toFixed(3)})`; +} + +function fmt(cell: SlaCell, unit: 'days' | 'hours'): string { + if (cell.avgDays == null) return '·'; + const v = unit === 'hours' ? cell.avgDays * 24 : cell.avgDays; + return unit === 'hours' ? `${v.toFixed(1)}h` : `${v.toFixed(1)}d`; +} + +export default function SlaHeatmap({ metric }: { metric: SlaMetric }) { + const { title, unit, norms, pms, sizes, grid, totals } = metric; + const isOtd = metric.key === 'otd'; + + return ( +
+
+ {title} + {isOtd ? 'cell = on-time % · avg' : `avg ${unit} vs norm`} +
+
+ + + + + {sizes.map(s => ( + + ))} + + + + + {pms.map(pm => ( + + + {sizes.map(s => { + const c = grid[pm]?.[s]; + const nd = normDays(norms[s], unit); + if (!c || c.count === 0) return ; + return ( + + ); + })} + + + ))} + +
PM + {s} + {norms[s] != null && ≤{norms[s]}{unit === 'hours' ? 'h' : 'd'}} + Total
{pm}· + {isOtd ? (c.onTimePct != null ? `${c.onTimePct}%` : '·') : fmt(c, unit)} + {isOtd ? fmt(c, unit) : `${c.count}`} + + {totals[pm]?.onTimePct != null ? `${totals[pm].onTimePct}%` : (totals[pm] ? fmt(totals[pm], unit) : '·')} + {totals[pm]?.count ?? 0} +
+
+
+ ); +} diff --git a/client/src/components/charts/TrendChart/TrendChart.module.scss b/client/src/components/charts/TrendChart/TrendChart.module.scss new file mode 100644 index 0000000..fafc754 --- /dev/null +++ b/client/src/components/charts/TrendChart/TrendChart.module.scss @@ -0,0 +1,23 @@ +@use '../../../styles/variables' as *; + +.card { + background: var(--surface); + border: 1px solid var(--border); + border-radius: $radius-lg; + padding: $s-5; + box-shadow: var(--shadow-sm); +} +.title { + font-size: 12px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--text-muted); + margin-bottom: $s-3; +} +.legend { display: flex; gap: $s-4; margin-bottom: $s-2; flex-wrap: wrap; } +.legItem { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--text-muted); } +.swatch { width: 12px; height: 3px; border-radius: 2px; } +.svg { width: 100%; height: auto; display: block; } +.axis { font-size: 9px; fill: var(--text-dim); font-family: var(--mono); } +.empty { color: var(--text-dim); font-size: 13px; padding: $s-4 0; } diff --git a/client/src/components/charts/TrendChart/index.tsx b/client/src/components/charts/TrendChart/index.tsx new file mode 100644 index 0000000..e3845e7 --- /dev/null +++ b/client/src/components/charts/TrendChart/index.tsx @@ -0,0 +1,66 @@ +import { useId } from 'react'; +import styles from './TrendChart.module.scss'; +import type { MonthPoint } from '../../../types/analytics.types'; + +interface Series { label: string; color: string; points: MonthPoint[]; } +interface TrendChartProps { + title: string; + series: Series[]; + format?: (n: number) => string; + area?: boolean; +} + +const W = 640, H = 220, PADX = 34, PADT = 16, PADB = 30; + +export default function TrendChart({ title, series, format, area }: TrendChartProps) { + const gid = useId().replace(/:/g, ''); + const months = [...new Set(series.flatMap(s => s.points.map(p => p.month)))].sort(); + const max = Math.max(1, ...series.flatMap(s => s.points.map(p => p.count))); + const x = (i: number) => PADX + (months.length <= 1 ? 0 : (i / (months.length - 1)) * (W - PADX * 2)); + const y = (v: number) => PADT + (1 - v / max) * (H - PADT - PADB); + + const line = (pts: MonthPoint[]) => { + const byMonth = new Map(pts.map(p => [p.month, p.count])); + return months.map((m, i) => `${i === 0 ? 'M' : 'L'} ${x(i).toFixed(1)} ${y(byMonth.get(m) ?? 0).toFixed(1)}`).join(' '); + }; + + if (months.length < 2) { + return
{title}
Not enough data
; + } + + const tick = (v: number) => (format ? format(v) : String(v)); + const labelEvery = Math.ceil(months.length / 8); + + return ( +
+
{title}
+
+ {series.map(s => {s.label})} +
+ + {[0, 0.5, 1].map(f => { + const gy = PADT + f * (H - PADT - PADB); + return + + {tick(Math.round(max * (1 - f)))} + ; + })} + {area && series.length === 1 && ( + <> + + + + + + + + + )} + {series.map(s => )} + {months.map((m, i) => (i % labelEvery === 0 + ? {m.slice(2)} + : null))} + +
+ ); +} diff --git a/client/src/components/icons/index.tsx b/client/src/components/icons/index.tsx new file mode 100644 index 0000000..26625a9 --- /dev/null +++ b/client/src/components/icons/index.tsx @@ -0,0 +1,115 @@ +interface IconProps { size?: number; } + +const base = (size: number) => ({ + width: size, height: size, viewBox: '0 0 24 24', fill: 'none', + stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round' as const, + strokeLinejoin: 'round' as const, +}); + +export function TicketIcon({ size = 16 }: IconProps) { + return ( + + + + + ); +} + +export function ArchiveIcon({ size = 16 }: IconProps) { + return ( + + + + + ); +} + +export function ChartIcon({ size = 16 }: IconProps) { + return ( + + + + + + + ); +} + +export function SearchIcon({ size = 16 }: IconProps) { + return ( + + + + + ); +} + +export function ExternalIcon({ size = 14 }: IconProps) { + return ( + + + + ); +} + +export function CloseIcon({ size = 18 }: IconProps) { + return ( + + + + ); +} + +export function SpreadsheetIcon({ size = 15 }: IconProps) { + return ( + + + + + ); +} + +// Excel-brand icon: green rounded tile with the white "X" + a hint of grid. +// Self-colored (own fills), so it reads as Excel regardless of button text colour. +export function ExcelIcon({ size = 16 }: IconProps) { + return ( + + ); +} + +export function DownloadIcon({ size = 14 }: IconProps) { + return ( + + + + ); +} + +export function KeyIcon({ size = 16 }: IconProps) { + return ( + + + + + ); +} + +export function CommentIcon({ size = 14 }: IconProps) { + return ( + + + + ); +} + +export function NoteIcon({ size = 14 }: IconProps) { + return ( + + + + + ); +} diff --git a/client/src/main.tsx b/client/src/main.tsx new file mode 100644 index 0000000..a5e5374 --- /dev/null +++ b/client/src/main.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { BrowserRouter } from 'react-router-dom'; +import App from './App'; +import './styles/globals.scss'; + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + , +); diff --git a/client/src/pages/Active/Active.module.scss b/client/src/pages/Active/Active.module.scss new file mode 100644 index 0000000..3e007a3 --- /dev/null +++ b/client/src/pages/Active/Active.module.scss @@ -0,0 +1,19 @@ +@use '../../styles/variables' as *; + +.page { max-width: none; display: flex; flex-direction: column; gap: $s-4; } + +.kpis { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); + gap: $s-3; +} +.row2 { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $s-3; + align-items: start; + @media (max-width: 1000px) { grid-template-columns: 1fr; } +} + +.state, .stateError { padding: $s-8; text-align: center; color: var(--text-muted); font-size: 13px; } +.stateError { color: var(--danger); } diff --git a/client/src/pages/Active/index.tsx b/client/src/pages/Active/index.tsx new file mode 100644 index 0000000..b539595 --- /dev/null +++ b/client/src/pages/Active/index.tsx @@ -0,0 +1,124 @@ +import { useEffect, useMemo, useState } from 'react'; +import PageHeader from '../../components/PageHeader'; +import KpiTile from '../../components/charts/KpiTile'; +import BarList from '../../components/charts/BarList'; +import TrendChart from '../../components/charts/TrendChart'; +import { getTickets } from '../../services/ticket.service'; +import { getConfig, getJiraDurations } from '../../services/analytics.service'; +import { parseDate } from '../../utils/format.utils'; +import { BOARD_COLUMNS, boardColumn } from '../../utils/board'; +import type { Ticket } from '../../types/ticket.types'; +import type { ForgeConfig, Bucket, MonthPoint, JiraDuration } from '../../types/analytics.types'; +import styles from './Active.module.scss'; + +const daysSince = (v: string | null): number | null => { + const d = parseDate(v); + return d ? Math.floor((Date.now() - d.getTime()) / 86_400_000) : null; +}; +const median = (xs: number[]): number => { + if (!xs.length) return 0; + const s = [...xs].sort((a, b) => a - b); + return Math.round(s[Math.floor(s.length / 2)]); +}; + +export default function Active({ refreshKey }: { refreshKey: number }) { + const [tickets, setTickets] = useState([]); + const [cfg, setCfg] = useState({}); + const [jiraDur, setJiraDur] = useState([]); + const [error, setError] = useState(false); + const [ready, setReady] = useState(false); + + useEffect(() => { + let alive = true; + setError(false); + Promise.all([ + getTickets({ status: 'active' }), + getConfig().catch(() => ({})), + getJiraDurations().then(r => r.rows).catch(() => []), + ]) + .then(([t, c, jd]) => { if (alive) { setTickets(t); setCfg(c); setJiraDur(jd); } }) + .catch(() => { if (alive) setError(true); }) + .finally(() => { if (alive) setReady(true); }); + return () => { alive = false; }; + }, [refreshKey]); + + const colleagues = cfg.colleagues ?? []; + + const model = useMemo(() => { + const colOf = (t: Ticket) => boardColumn(t, colleagues); + // by status (column) + const byStatus: Bucket[] = BOARD_COLUMNS.map(c => ({ + key: c.key, label: c.label, count: tickets.filter(t => colOf(t) === c.key).length, + })).filter(b => b.count > 0); + // opened by month + const om = new Map(); + for (const t of tickets) { + const d = parseDate(t.openedAt); + if (d) { const k = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`; om.set(k, (om.get(k) ?? 0) + 1); } + } + const openedByMonth: MonthPoint[] = [...om.entries()].sort((a, b) => a[0].localeCompare(b[0])).map(([month, count]) => ({ month, count })); + // age histogram + const AGE = [[0, 50], [50, 100], [100, 150], [150, 200], [200, Infinity]]; + const ageHist: Bucket[] = AGE.map(([lo, hi]) => ({ + key: `${lo}`, label: hi === Infinity ? `${lo}+ d` : `${lo}–${hi} d`, + count: tickets.filter(t => { const a = daysSince(t.openedAt); return a != null && a >= lo && a < hi; }).length, + })); + // median days in current status per column + const timeInStatus: Bucket[] = BOARD_COLUMNS.map(c => { + const ds = tickets.filter(t => colOf(t) === c.key).map(t => daysSince(t.stateChangedAt)).filter((v): v is number => v != null); + return { key: c.key, label: c.label, count: median(ds) }; + }).filter(b => b.count > 0); + // by brand + const bm = new Map(); + for (const t of tickets) if (t.brand) bm.set(t.brand, (bm.get(t.brand) ?? 0) + 1); + const byBrand: Bucket[] = [...bm.entries()].map(([k, count]) => ({ key: k, label: k, count })).sort((a, b) => b.count - a.count); + + return { byStatus, openedByMonth, ageHist, timeInStatus, byBrand }; + }, [tickets, colleagues]); + + if (error) return
Failed to load active analytics.
; + if (!ready) return
Loading…
; + + const colColor = (b: Bucket) => BOARD_COLUMNS.find(c => c.key === b.key)?.color ?? 'var(--primary)'; + const count = (key: string) => model.byStatus.find(b => b.key === key)?.count ?? 0; + + return ( +
+ + +
+ + + + + +
+ +
+ + ['#16a34a', '#22c55e', '#f59e0b', '#ea580c', '#dc2626'][i] ?? 'var(--primary)'} /> +
+ +
+ + `${n}d`} labelWidth={150} /> +
+ +
+ + {jiraDur.length > 0 && ( + ({ key: d.status, label: `${d.status} · ${d.count}`, count: d.avgDays }))} + format={n => (n < 1 ? `${Math.round(n * 24)}h` : `${n}d`)} + colorFor={(_, i) => `hsl(${(i * 37) % 360} 62% 55%)`} + labelWidth={200} + /> + )} +
+
+ ); +} diff --git a/client/src/pages/Admin/Admin.module.scss b/client/src/pages/Admin/Admin.module.scss new file mode 100644 index 0000000..c602d9b --- /dev/null +++ b/client/src/pages/Admin/Admin.module.scss @@ -0,0 +1,64 @@ +@use '../../styles/variables' as *; + +.page { max-width: none; display: flex; flex-direction: column; gap: $s-4; } + +.tabs { + display: inline-flex; + gap: 2px; + border-bottom: 1px solid var(--border); + button { + height: 36px; padding: 0 16px; border: none; background: transparent; + color: var(--text-muted); font-size: 13px; font-weight: 600; cursor: pointer; + border-bottom: 2px solid transparent; margin-bottom: -1px; + &.on { color: var(--primary); border-bottom-color: var(--primary); } + &:hover:not(.on) { color: var(--text); } + } +} + +.grid { display: grid; grid-template-columns: 340px 1fr; gap: $s-4; align-items: start; @media (max-width: 900px) { grid-template-columns: 1fr; } } + +.card { + background: var(--surface); border: 1px solid var(--border); border-radius: $radius-lg; + padding: $s-5; box-shadow: var(--shadow-sm); +} +.cardTitle { font-size: 13px; font-weight: 700; color: var(--text); margin-bottom: $s-4; } +.hint { font-size: 12px; color: var(--text-muted); margin-bottom: $s-3; margin-top: -8px; } + +.label { display: block; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-muted); margin: 12px 0 5px; } +.input { + width: 100%; height: 36px; padding: 0 10px; border: 1px solid var(--border); border-radius: $radius; + font-size: 13px; color: var(--text); background: var(--surface); outline: none; + &:focus { border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-bg); } +} +.err { margin-top: 10px; padding: 8px 10px; border-radius: $radius; background: var(--danger-bg); color: var(--danger); font-size: 12px; } +.btn { + margin-top: 14px; width: 100%; height: 38px; border: none; border-radius: $radius; + background: var(--primary); color: #fff; font-size: 13px; font-weight: 600; cursor: pointer; + &:hover:not(:disabled) { background: var(--primary-h); } + &:disabled { opacity: 0.6; cursor: default; } +} + +.minted { margin-top: 14px; padding: 12px; border: 1px solid var(--success); border-radius: $radius; background: var(--success-bg); } +.mintedLabel { font-size: 11px; font-weight: 700; color: var(--success); text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 6px; } +.mintedToken { display: block; font-family: var(--mono); font-size: 11px; word-break: break-all; color: var(--text); cursor: pointer; background: var(--surface); padding: 8px; border-radius: $radius; } +.copy { margin-top: 8px; height: 28px; padding: 0 12px; border: 1px solid var(--border); border-radius: $radius; background: var(--surface); font-size: 12px; font-weight: 600; cursor: pointer; } + +.table { + width: 100%; border-collapse: collapse; font-size: 13px; + th { text-align: left; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-muted); padding: 8px 10px; border-bottom: 1px solid var(--border); } + td { padding: 8px 10px; border-bottom: 1px solid var(--border); } + tr:last-child td { border-bottom: none; } +} +.muted { color: var(--text-muted); } +.mono { font-family: var(--mono); font-size: 12px; color: var(--text-muted); } +.right { text-align: right; } +.roleBadge { + font-size: 11px; font-weight: 700; padding: 2px 9px; border-radius: 999px; + background: var(--surface-alt); color: var(--text-muted); + &[data-role='admin'] { background: var(--danger-bg); color: var(--danger); } + &[data-role='lead'] { background: var(--violet-bg, rgba(139,92,246,.1)); color: #7c3aed; } + &[data-role='pm'] { background: var(--primary-bg); color: var(--primary); } +} +.danger { height: 28px; padding: 0 10px; border: 1px solid var(--border); border-radius: $radius; background: var(--surface); color: var(--danger); font-size: 12px; font-weight: 600; cursor: pointer; &:hover { background: var(--danger-bg); } } +.revoked { font-size: 12px; color: var(--text-dim); font-style: italic; } +.revokedRow { opacity: 0.5; } diff --git a/client/src/pages/Admin/index.tsx b/client/src/pages/Admin/index.tsx new file mode 100644 index 0000000..2356e2e --- /dev/null +++ b/client/src/pages/Admin/index.tsx @@ -0,0 +1,154 @@ +import { useEffect, useState, useCallback } from 'react'; +import PageHeader from '../../components/PageHeader'; +import { listUsers, createUser, deleteUser, listTokens, createToken, revokeToken, type AppUser, type TokenInfo } from '../../services/admin.service'; +import { ROLE_LABELS, roleAtLeast, type Role, type CurrentUser } from '../../services/auth.service'; +import styles from './Admin.module.scss'; + +const fmt = (v: string | null) => (v ? new Date(v).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' }) : '—'); + +export default function Admin({ user }: { user: CurrentUser }) { + const isAdmin = user.role === 'admin'; + const [tab, setTab] = useState<'users' | 'tokens'>('users'); + useEffect(() => { if (!isAdmin) setTab('users'); }, [isAdmin]); + + return ( +
+ +
+ + {isAdmin && } +
+ {tab === 'users' ? : } +
+ ); +} + +function UsersPanel({ me }: { me: CurrentUser }) { + const [users, setUsers] = useState([]); + const [error, setError] = useState(null); + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [role, setRole] = useState('viewer'); + const [busy, setBusy] = useState(false); + + const load = useCallback(() => { listUsers().then(setUsers).catch(() => setError('Failed to load users')); }, []); + useEffect(() => { load(); }, [load]); + + // Leadership can grant up to 'lead'; only admin can grant 'admin'. + const grantable: Role[] = me.role === 'admin' ? ['viewer', 'pm', 'lead', 'admin'] : ['viewer', 'pm', 'lead']; + + const submit = async (e: React.FormEvent) => { + e.preventDefault(); + setBusy(true); setError(null); + try { + const res = await createUser(username.trim(), password, role); + if (res.user) { setUsername(''); setPassword(''); setRole('viewer'); load(); } + else setError(res.message || 'Could not create user'); + } catch { setError('Could not create user'); } + finally { setBusy(false); } + }; + + const remove = async (u: string) => { + if (!confirm(`Delete user "${u}"?`)) return; + await deleteUser(u).catch(() => {}); + load(); + }; + + return ( +
+
+

Add user

+ + setUsername(e.target.value)} autoComplete="off" /> + + setPassword(e.target.value)} autoComplete="new-password" placeholder="min 6 chars" /> + + + {error &&
{error}
} + +
+ +
+

Users ({users.length})

+ + + + {users.map(u => ( + + + + + + + ))} + +
UsernameRoleLast login
{u.username}{ROLE_LABELS[u.role]}{fmt(u.lastLoginAt)} + {u.username !== me.username && } +
+
+
+ ); +} + +function TokensPanel() { + const [tokens, setTokens] = useState([]); + const [label, setLabel] = useState(''); + const [minted, setMinted] = useState(null); + const [busy, setBusy] = useState(false); + + const load = useCallback(() => { listTokens().then(setTokens).catch(() => {}); }, []); + useEffect(() => { load(); }, [load]); + + const create = async (e: React.FormEvent) => { + e.preventDefault(); + setBusy(true); + try { + const res = await createToken(label.trim() || 'sync-extension'); + setMinted(res.token); setLabel(''); load(); + } finally { setBusy(false); } + }; + const revoke = async (id: number) => { if (confirm('Revoke this token?')) { await revokeToken(id).catch(() => {}); load(); } }; + + return ( +
+
+

Create API token

+

For the FORGE Snow Sync Chrome extension. The raw token is shown once.

+ + setLabel(e.target.value)} placeholder="e.g. my laptop" /> + + {minted && ( +
+
Copy now — shown once:
+ navigator.clipboard?.writeText(minted)}>{minted} + +
+ )} +
+ +
+

Tokens ({tokens.length})

+ + + + {tokens.map(t => ( + + + + + + + + ))} + +
LabelIDLast usedExpires
{t.label}{t.tokenId}{fmt(t.lastUsedAt)}{fmt(t.expiresAt)} + {t.revoked ? revoked : } +
+
+
+ ); +} diff --git a/client/src/pages/Board/Board.module.scss b/client/src/pages/Board/Board.module.scss new file mode 100644 index 0000000..da47c9f --- /dev/null +++ b/client/src/pages/Board/Board.module.scss @@ -0,0 +1,85 @@ +@use '../../styles/variables' as *; + +.page { display: flex; flex-direction: column; gap: $s-4; height: 100%; } + +.select { + height: 32px; + padding: 0 26px 0 10px; + border: 1px solid var(--border); + border-radius: $radius; + background: var(--surface); + color: var(--text); + font-size: 12px; + cursor: pointer; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.5' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 8px center; + &:hover { border-color: var(--border-strong); } + &:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-bg); } +} + +.toggle { + display: inline-flex; + border: 1px solid var(--border); + border-radius: $radius; + overflow: hidden; + button { + height: 32px; padding: 0 12px; border: none; background: var(--surface); + color: var(--text-muted); font-size: 12px; font-weight: 600; cursor: pointer; + &.on { background: var(--primary); color: #fff; } + } +} + +.export { + height: 32px; padding: 0 12px; border: 1px solid var(--border); border-radius: $radius; + background: var(--surface); color: var(--text); font-size: 12px; font-weight: 600; cursor: pointer; + display: inline-flex; align-items: center; gap: 6px; + &:hover:not(:disabled) { background: var(--surface-alt); border-color: var(--border-strong); } + &:disabled { opacity: 0.5; cursor: default; } +} +.exportIcon { display: inline-flex; color: #107c10; } // Excel green + +.board { + display: grid; + grid-auto-flow: column; + grid-auto-columns: minmax(240px, 1fr); + gap: $s-3; + overflow-x: auto; + align-items: start; + padding-bottom: $s-3; + flex: 1; + min-height: 0; +} + +.column { + display: flex; + flex-direction: column; + background: var(--surface-alt); + border: 1px solid var(--border); + border-radius: $radius-lg; + min-height: 120px; + max-height: 100%; +} +.colHead { + padding: 10px 12px; + border-bottom: 2px solid var(--col); + border-radius: $radius-lg $radius-lg 0 0; + background: var(--surface); +} +.colTitleRow { display: flex; align-items: center; justify-content: space-between; gap: 6px; } +.colTitle { font-size: 12px; font-weight: 700; color: var(--text); } +.colCount { + min-width: 20px; text-align: center; font-size: 11px; font-weight: 700; + padding: 1px 7px; border-radius: 999px; background: var(--col); color: #fff; +} +.colSla { display: block; margin-top: 3px; font-size: 10px; color: var(--text-dim); } + +.colBody { padding: 9px; display: flex; flex-direction: column; gap: 9px; overflow-y: auto; } +.colEmpty { font-size: 12px; color: var(--text-dim); text-align: center; padding: $s-4 0; } + +.state, .stateError { + padding: $s-8; text-align: center; color: var(--text-muted); font-size: 13px; + background: var(--surface); border: 1px solid var(--border); border-radius: $radius-lg; +} +.stateError { color: var(--danger); } diff --git a/client/src/pages/Board/index.tsx b/client/src/pages/Board/index.tsx new file mode 100644 index 0000000..9d8c581 --- /dev/null +++ b/client/src/pages/Board/index.tsx @@ -0,0 +1,118 @@ +import { useEffect, useMemo, useState } from 'react'; +import PageHeader from '../../components/PageHeader'; +import BoardCard from '../../components/Board/BoardCard'; +import TicketTable from '../../components/TicketTable'; +import TicketDetailModal from '../../components/TicketDetailModal'; +import { getTickets } from '../../services/ticket.service'; +import { getConfig } from '../../services/analytics.service'; +import { BOARD_COLUMNS, boardColumn, type ColumnKey } from '../../utils/board'; +import { exportTicketsXlsx } from '../../utils/excel.utils'; +import { ExcelIcon } from '../../components/icons'; +import type { Ticket } from '../../types/ticket.types'; +import type { ForgeConfig } from '../../types/analytics.types'; +import styles from './Board.module.scss'; + +export default function Board({ search, refreshKey }: { search: string; refreshKey: number }) { + const [tickets, setTickets] = useState([]); + const [cfg, setCfg] = useState({}); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); + const [selected, setSelected] = useState(null); + const [brand, setBrand] = useState(''); + const [market, setMarket] = useState(''); + const [assignee, setAssignee] = useState(''); + const [view, setView] = useState<'board' | 'list'>('board'); + + useEffect(() => { + let alive = true; + setLoading(true); setError(false); + Promise.all([getTickets({ status: 'active', q: search || undefined }), getConfig().catch(() => ({}))]) + .then(([t, c]) => { if (alive) { setTickets(t); setCfg(c); } }) + .catch(() => { if (alive) setError(true); }) + .finally(() => { if (alive) setLoading(false); }); + return () => { alive = false; }; + }, [search, refreshKey]); + + const colleagues = cfg.colleagues ?? []; + const thresholds = cfg.insightsThresholds ?? {}; + + const distinct = (sel: (t: Ticket) => string | null) => + [...new Set(tickets.map(sel).filter((v): v is string => !!v))].sort(); + const brands = useMemo(() => distinct(t => t.brand), [tickets]); + const markets = useMemo(() => distinct(t => t.market), [tickets]); + const assignees = useMemo(() => distinct(t => t.assignedTo), [tickets]); + + const filtered = useMemo(() => tickets.filter(t => + (!brand || t.brand === brand) && (!market || t.market === market) && (!assignee || t.assignedTo === assignee), + ), [tickets, brand, market, assignee]); + + const columns = useMemo(() => { + const groups: Record = { unassigned: [], open: [], hold: [], wip: [], replied: [], awaiting: [] }; + for (const t of filtered) groups[boardColumn(t, colleagues)].push(t); + return groups; + }, [filtered, colleagues]); + + const brandColor = (b: string | null) => { + if (!b) return undefined; + return cfg.brandColors?.[b.toLowerCase().split(/[\s-]/)[0]]; + }; + + return ( +
+ + + + +
+ + +
+ +
+ + {loading &&
Loading board…
} + {error &&
Failed to load the board. Is the server running?
} + + {!loading && !error && view === 'board' && ( +
+ {BOARD_COLUMNS.map(col => { + const items = columns[col.key]; + const thr = thresholds[col.slaKey]; + return ( +
+
+
+ {col.label} + {items.length} +
+ {thr != null && {col.slaVerb(thr)}} +
+
+ {items.length === 0 + ?
No tickets
+ : items.map(t => )} +
+
+ ); + })} +
+ )} + + {!loading && !error && view === 'list' && ( + + )} + + {selected && setSelected(null)} />} +
+ ); +} diff --git a/client/src/pages/Closed/Closed.module.scss b/client/src/pages/Closed/Closed.module.scss new file mode 100644 index 0000000..65c1bda --- /dev/null +++ b/client/src/pages/Closed/Closed.module.scss @@ -0,0 +1,50 @@ +@use '../../styles/variables' as *; + +.page { max-width: none; } + +.select { + height: 32px; + padding: 0 28px 0 10px; + border: 1px solid var(--border); + border-radius: $radius; + background: var(--surface); + color: var(--text); + font-size: 12px; + font-weight: 500; + cursor: pointer; + outline: none; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.5' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 9px center; + + &:hover { border-color: var(--border-strong); } + &:focus { border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-bg); } +} + +.summary { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: $s-3; + margin-bottom: $s-4; +} +.stat { + background: var(--surface); + border: 1px solid var(--border); + border-radius: $radius-lg; + padding: $s-4; + box-shadow: var(--shadow-sm); +} +.statValue { font-size: 22px; font-weight: 700; color: var(--text); font-variant-numeric: tabular-nums; } +.statLabel { margin-top: 2px; font-size: 12px; color: var(--text-muted); } + +.state, .stateError { + padding: $s-8; + text-align: center; + color: var(--text-muted); + background: var(--surface); + border: 1px solid var(--border); + border-radius: $radius-lg; + font-size: 13px; +} +.stateError { color: var(--danger); } diff --git a/client/src/pages/Closed/index.tsx b/client/src/pages/Closed/index.tsx new file mode 100644 index 0000000..18fdad0 --- /dev/null +++ b/client/src/pages/Closed/index.tsx @@ -0,0 +1,82 @@ +import { useEffect, useMemo, useState } from 'react'; +import PageHeader from '../../components/PageHeader'; +import TicketTable from '../../components/TicketTable'; +import TicketDetailModal from '../../components/TicketDetailModal'; +import { getTickets } from '../../services/ticket.service'; +import { formatCost, formatMinutes } from '../../utils/format.utils'; +import type { Ticket } from '../../types/ticket.types'; +import styles from './Closed.module.scss'; + +export default function Closed({ search, refreshKey }: { search: string; refreshKey: number }) { + const [tickets, setTickets] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); + const [selected, setSelected] = useState(null); + const [brandFilter, setBrandFilter] = useState(''); + + useEffect(() => { + let alive = true; + setLoading(true); + setError(false); + getTickets({ status: 'closed', q: search || undefined }) + .then(t => { if (alive) setTickets(t); }) + .catch(() => { if (alive) setError(true); }) + .finally(() => { if (alive) setLoading(false); }); + return () => { alive = false; }; + }, [search, refreshKey]); + + const brands = useMemo( + () => [...new Set(tickets.map(t => t.brand).filter((b): b is string => !!b))].sort(), + [tickets], + ); + const filtered = useMemo( + () => tickets.filter(t => !brandFilter || t.brand === brandFilter), + [tickets, brandFilter], + ); + + const totalCost = useMemo( + () => filtered.reduce((sum, t) => sum + (t.finalCost ?? 0), 0), + [filtered], + ); + const avgTtfr = useMemo(() => { + const vals = filtered.map(t => t.ttfrMinutes).filter((v): v is number => v != null); + return vals.length ? Math.round(vals.reduce((a, b) => a + b, 0) / vals.length) : null; + }, [filtered]); + + return ( +
+ + + + + {!loading && !error && filtered.length > 0 && ( +
+ + + +
+ )} + + {loading &&
Loading tickets…
} + {error &&
Failed to load tickets. Is the server running?
} + {!loading && !error && filtered.length === 0 &&
No closed tickets found.
} + {!loading && !error && filtered.length > 0 && ( + + )} + + {selected && setSelected(null)} />} +
+ ); +} + +function Stat({ label, value }: { label: string; value: string }) { + return ( +
+
{value}
+
{label}
+
+ ); +} diff --git a/client/src/pages/Dashboard/Dashboard.module.scss b/client/src/pages/Dashboard/Dashboard.module.scss new file mode 100644 index 0000000..55de2db --- /dev/null +++ b/client/src/pages/Dashboard/Dashboard.module.scss @@ -0,0 +1,34 @@ +@use '../../styles/variables' as *; + +.page { max-width: none; } + +.select { + height: 32px; + padding: 0 28px 0 10px; + border: 1px solid var(--border); + border-radius: $radius; + background: var(--surface); + color: var(--text); + font-size: 12px; + font-weight: 500; + cursor: pointer; + outline: none; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.5' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 9px center; + + &:hover { border-color: var(--border-strong); } + &:focus { border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-bg); } +} + +.state, .stateError { + padding: $s-8; + text-align: center; + color: var(--text-muted); + background: var(--surface); + border: 1px solid var(--border); + border-radius: $radius-lg; + font-size: 13px; +} +.stateError { color: var(--danger); } diff --git a/client/src/pages/Dashboard/index.tsx b/client/src/pages/Dashboard/index.tsx new file mode 100644 index 0000000..c67fc67 --- /dev/null +++ b/client/src/pages/Dashboard/index.tsx @@ -0,0 +1,68 @@ +import { useEffect, useMemo, useState } from 'react'; +import PageHeader from '../../components/PageHeader'; +import TicketTable from '../../components/TicketTable'; +import TicketDetailModal from '../../components/TicketDetailModal'; +import { getTickets } from '../../services/ticket.service'; +import type { Ticket } from '../../types/ticket.types'; +import styles from './Dashboard.module.scss'; + +export default function Dashboard({ search, refreshKey }: { search: string; refreshKey: number }) { + const [tickets, setTickets] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); + const [selected, setSelected] = useState(null); + const [stateFilter, setStateFilter] = useState(''); + const [groupFilter, setGroupFilter] = useState(''); + + useEffect(() => { + let alive = true; + setLoading(true); + setError(false); + getTickets({ status: 'active', q: search || undefined }) + .then(t => { if (alive) setTickets(t); }) + .catch(() => { if (alive) setError(true); }) + .finally(() => { if (alive) setLoading(false); }); + return () => { alive = false; }; + }, [search, refreshKey]); + + const states = useMemo(() => distinct(tickets.map(t => t.state)), [tickets]); + const groups = useMemo(() => distinct(tickets.map(t => t.assignmentGroup)), [tickets]); + + const filtered = useMemo(() => tickets.filter(t => + (!stateFilter || t.state === stateFilter) && + (!groupFilter || t.assignmentGroup === groupFilter), + ), [tickets, stateFilter, groupFilter]); + + return ( +
+ + + + + + {loading &&
Loading tickets…
} + {error &&
Failed to load tickets. Is the server running?
} + {!loading && !error && filtered.length === 0 && ( +
No tickets match the current filters.
+ )} + {!loading && !error && filtered.length > 0 && ( + + )} + + {selected && setSelected(null)} />} +
+ ); +} + +function distinct(values: (string | null)[]): string[] { + return [...new Set(values.filter((v): v is string => !!v))].sort(); +} +function shortGroup(g: string): string { + return g.replace(/^L3\s+/, '').replace(/\s+Marketing Web Presence$/i, ''); +} diff --git a/client/src/pages/Insights/Insights.module.scss b/client/src/pages/Insights/Insights.module.scss new file mode 100644 index 0000000..6b8772a --- /dev/null +++ b/client/src/pages/Insights/Insights.module.scss @@ -0,0 +1,100 @@ +@use '../../styles/variables' as *; + +.page { max-width: none; display: flex; flex-direction: column; gap: $s-3; } + +.kpis { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: $s-3; + margin-bottom: $s-2; +} +.h2 { + font-size: 13px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--text-muted); + margin-top: $s-4; +} + +.grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: $s-3; + align-items: start; +} + +.card { + background: var(--surface); + border: 1px solid var(--border); + border-radius: $radius-lg; + box-shadow: var(--shadow-sm); + overflow: hidden; +} +.cardHot { border-left: 3px solid var(--danger); } +.cardHead { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + gap: $s-3; + padding: 12px 14px; + border: none; + background: transparent; + cursor: pointer; + &:hover { background: var(--surface-alt); } +} +.cardTitle { font-size: 13px; font-weight: 600; color: var(--text); } +.counts { display: flex; align-items: center; gap: 6px; } +.problem { + min-width: 22px; text-align: center; font-size: 11px; font-weight: 700; + padding: 1px 7px; border-radius: 999px; background: var(--danger-bg); color: var(--danger); +} +.total { + min-width: 22px; text-align: center; font-size: 11px; font-weight: 700; + padding: 1px 7px; border-radius: 999px; background: var(--surface-alt); color: var(--text-muted); +} + +.list { list-style: none; border-top: 1px solid var(--border); max-height: 340px; overflow-y: auto; } +.row { + display: grid; + grid-template-columns: auto 1fr auto auto auto; + align-items: center; + gap: $s-2; + padding: 6px 14px; + font-size: 12px; + border-bottom: 1px solid var(--border); + &:last-child { border-bottom: none; } +} +.emptyRow { padding: 10px 14px; color: var(--text-dim); font-size: 12px; } +.rowNum { display: inline-flex; align-items: center; gap: 3px; font-family: var(--mono); font-weight: 700; color: var(--primary); white-space: nowrap; } +.rowDesc { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text); } +.rowMeta { color: var(--text-muted); white-space: nowrap; max-width: 110px; overflow: hidden; text-overflow: ellipsis; } +.rowDays { font-weight: 600; color: var(--warning); font-variant-numeric: tabular-nums; } +.rowCost { font-weight: 600; color: var(--text-muted); font-variant-numeric: tabular-nums; } + +.pmCard { + background: var(--surface); + border: 1px solid var(--border); + border-radius: $radius-lg; + box-shadow: var(--shadow-sm); + overflow-x: auto; +} +.pmTable { + width: 100%; + border-collapse: collapse; + font-size: 13px; + th { + text-align: left; font-size: 11px; font-weight: 700; text-transform: uppercase; + letter-spacing: 0.04em; color: var(--text-muted); padding: 10px 14px; + background: var(--surface-alt); border-bottom: 1px solid var(--border); white-space: nowrap; + } + td { padding: 8px 14px; border-bottom: 1px solid var(--border); } + tr:last-child td { border-bottom: none; } +} +.num { text-align: right; font-variant-numeric: tabular-nums; } +.alertBadge { font-weight: 700; padding: 1px 8px; border-radius: 999px; background: var(--danger-bg); color: var(--danger); } +.risk { font-weight: 600; color: var(--danger); } + +.state, .stateError { padding: $s-8; text-align: center; color: var(--text-muted); font-size: 13px; } +.stateError { color: var(--danger); } diff --git a/client/src/pages/Insights/index.tsx b/client/src/pages/Insights/index.tsx new file mode 100644 index 0000000..7bb89e6 --- /dev/null +++ b/client/src/pages/Insights/index.tsx @@ -0,0 +1,109 @@ +import { useEffect, useState } from 'react'; +import PageHeader from '../../components/PageHeader'; +import KpiTile from '../../components/charts/KpiTile'; +import { ExternalIcon } from '../../components/icons'; +import { getInsights } from '../../services/analytics.service'; +import type { InsightsResponse, AlertGroup, InsightTicket } from '../../types/analytics.types'; +import styles from './Insights.module.scss'; + +const money = (n: number) => (n >= 1000 ? `£${(n / 1000).toFixed(1)}k` : `£${n}`); + +// Which groups feed the alert total (vs informational). +const ALERT_KEYS = new Set(['unassigned', 'assigned', 'hold', 'wipStalled', 'wipNoJira', 'replied', 'awaiting']); + +export default function Insights({ refreshKey }: { refreshKey: number }) { + const [data, setData] = useState(null); + const [error, setError] = useState(false); + const [open, setOpen] = useState(null); + + useEffect(() => { + let alive = true; + setError(false); + getInsights().then(d => { if (alive) setData(d); }).catch(() => { if (alive) setError(true); }); + return () => { alive = false; }; + }, [refreshKey]); + + if (error) return
Failed to load insights.
; + if (!data) return
Analysing backlog…
; + + const alertGroups = data.groups.filter(g => ALERT_KEYS.has(g.key)); + const infoGroups = data.groups.filter(g => !ALERT_KEYS.has(g.key)); + + return ( +
+ + +
+ + + + +
+ +

Alert categories

+
+ {alertGroups.map(g => setOpen(open === g.key ? null : g.key)} showProblem />)} +
+ +

Watch list

+
+ {infoGroups.map(g => setOpen(open === g.key ? null : g.key)} />)} +
+ +

Per-PM roll-up

+
+ + + + + + {data.pms.map(p => ( + + + + + + + + ))} + +
PM# Tickets$ Revenue⚠ AlertsRev at risk
{p.pm}{p.tickets}{money(p.revenue)}{p.alerts > 0 ? {p.alerts} : '—'}{p.revAtRisk > 0 ? {money(p.revAtRisk)} : '—'}
+
+
+ ); +} + +function AlertCard({ g, open, onToggle, showProblem }: { g: AlertGroup; open: boolean; onToggle: () => void; showProblem?: boolean }) { + const shown = showProblem ? g.tickets.filter((_, i) => i < g.problematic || open) : g.tickets; + return ( +
0 ? styles.cardHot : ''}`}> + + {open && ( +
    + {shown.length === 0 &&
  • No tickets
  • } + {shown.map(t => )} +
+ )} +
+ ); +} + +function TicketRow({ t }: { t: InsightTicket }) { + return ( +
  • + e.stopPropagation()}> + {t.number}{t.link && } + + {t.shortDesc} + {t.assignedTo ?? '—'} + {t.days != null && {t.days}d} + {t.costGbp > 0 && {money(t.costGbp)}} +
  • + ); +} diff --git a/client/src/pages/Overview/Overview.module.scss b/client/src/pages/Overview/Overview.module.scss new file mode 100644 index 0000000..0c39296 --- /dev/null +++ b/client/src/pages/Overview/Overview.module.scss @@ -0,0 +1,35 @@ +@use '../../styles/variables' as *; + +.page { max-width: none; display: flex; flex-direction: column; gap: $s-4; } + +.kpis { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: $s-3; +} + +.row2 { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $s-3; + align-items: start; + + @media (max-width: 1000px) { grid-template-columns: 1fr; } +} +.stack { display: flex; flex-direction: column; gap: $s-3; } + +.revWrap { position: relative; } +.revToggle { + position: absolute; top: $s-5; right: 132px; z-index: 1; + display: inline-flex; border: 1px solid var(--border); border-radius: $radius; overflow: hidden; + button { height: 26px; padding: 0 10px; border: none; background: var(--surface); color: var(--text-muted); font-size: 11px; font-weight: 600; cursor: pointer; + &.on { background: var(--primary); color: #fff; } } +} + +.state, .stateError { + padding: $s-8; + text-align: center; + color: var(--text-muted); + font-size: 13px; +} +.stateError { color: var(--danger); } diff --git a/client/src/pages/Overview/index.tsx b/client/src/pages/Overview/index.tsx new file mode 100644 index 0000000..71ee469 --- /dev/null +++ b/client/src/pages/Overview/index.tsx @@ -0,0 +1,87 @@ +import { useEffect, useState } from 'react'; +import PageHeader from '../../components/PageHeader'; +import KpiTile from '../../components/charts/KpiTile'; +import BarList from '../../components/charts/BarList'; +import GroupedBars from '../../components/charts/GroupedBars'; +import DonutChart from '../../components/charts/DonutChart'; +import ExpandBarList from '../../components/charts/ExpandBarList'; +import { getOverview, getConfig } from '../../services/analytics.service'; +import type { OverviewResponse, ForgeConfig, Bucket } from '../../types/analytics.types'; +import styles from './Overview.module.scss'; + +function money(n: number): string { + if (n >= 1_000_000) return `£${(n / 1_000_000).toFixed(1)}M`; + if (n >= 1_000) return `£${(n / 1_000).toFixed(0)}k`; + return `£${n}`; +} + +export default function Overview({ refreshKey }: { refreshKey: number }) { + const [data, setData] = useState(null); + const [cfg, setCfg] = useState({}); + const [error, setError] = useState(false); + const [revMode, setRevMode] = useState<'cost' | 'tickets'>('cost'); + + useEffect(() => { + let alive = true; + setError(false); + Promise.all([getOverview(), getConfig().catch(() => ({}))]) + .then(([o, c]) => { if (alive) { setData(o); setCfg(c); } }) + .catch(() => { if (alive) setError(true); }); + return () => { alive = false; }; + }, [refreshKey]); + + if (error) return
    Failed to load analytics.
    ; + if (!data) return
    Loading analytics…
    ; + + const brandColor = (b: Bucket) => cfg.brandColors?.[b.key.toLowerCase().split(/[\s-]/)[0]] ?? 'var(--primary)'; + const totalRevenue = data.revenueByMonth.reduce((s, m) => s + m.count, 0); + + return ( +
    + + +
    + + + + + +
    + +
    + + +
    + +
    +
    +
    + + +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + ['#16a34a', '#22c55e', '#f59e0b', '#ea580c', '#dc2626', '#991b1b'][i] ?? 'var(--primary)'} /> +
    +
    +
    + ); +} diff --git a/client/src/pages/SlaKpi/SlaKpi.module.scss b/client/src/pages/SlaKpi/SlaKpi.module.scss new file mode 100644 index 0000000..eacc796 --- /dev/null +++ b/client/src/pages/SlaKpi/SlaKpi.module.scss @@ -0,0 +1,12 @@ +@use '../../styles/variables' as *; + +.page { max-width: none; } +.grid { display: flex; flex-direction: column; gap: $s-3; } + +.state, .stateError { + padding: $s-8; + text-align: center; + color: var(--text-muted); + font-size: 13px; +} +.stateError { color: var(--danger); } diff --git a/client/src/pages/SlaKpi/index.tsx b/client/src/pages/SlaKpi/index.tsx new file mode 100644 index 0000000..c96a2ee --- /dev/null +++ b/client/src/pages/SlaKpi/index.tsx @@ -0,0 +1,32 @@ +import { useEffect, useState } from 'react'; +import PageHeader from '../../components/PageHeader'; +import SlaHeatmap from '../../components/charts/SlaHeatmap'; +import { getSla } from '../../services/analytics.service'; +import type { SlaMetric } from '../../types/analytics.types'; +import styles from './SlaKpi.module.scss'; + +export default function SlaKpi({ refreshKey }: { refreshKey: number }) { + const [metrics, setMetrics] = useState(null); + const [error, setError] = useState(false); + + useEffect(() => { + let alive = true; + setError(false); + getSla() + .then(r => { if (alive) setMetrics(r.metrics); }) + .catch(() => { if (alive) setError(true); }); + return () => { alive = false; }; + }, [refreshKey]); + + if (error) return
    Failed to load SLA metrics.
    ; + if (!metrics) return
    Loading SLA metrics…
    ; + + return ( +
    + +
    + {metrics.map(m => )} +
    +
    + ); +} diff --git a/client/src/pages/Stats/Stats.module.scss b/client/src/pages/Stats/Stats.module.scss new file mode 100644 index 0000000..5535911 --- /dev/null +++ b/client/src/pages/Stats/Stats.module.scss @@ -0,0 +1,90 @@ +@use '../../styles/variables' as *; + +.page { max-width: none; } + +.kpis { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: $s-3; + margin-bottom: $s-4; +} +.kpi { + background: var(--surface); + border: 1px solid var(--border); + border-radius: $radius-lg; + padding: $s-5; + box-shadow: var(--shadow-sm); +} +.kpiAccent { + background: linear-gradient(135deg, var(--primary), var(--primary-h)); + border-color: transparent; + .kpiValue, .kpiLabel { color: #fff; } + .kpiLabel { opacity: 0.85; } +} +.kpiValue { font-size: 30px; font-weight: 700; color: var(--text); font-variant-numeric: tabular-nums; line-height: 1; } +.kpiLabel { margin-top: 6px; font-size: 13px; color: var(--text-muted); } + +.grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $s-3; +} +.card { + background: var(--surface); + border: 1px solid var(--border); + border-radius: $radius-lg; + padding: $s-5; + box-shadow: var(--shadow-sm); +} +.cardWide { grid-column: 1 / -1; } +.cardTitle { + font-size: 12px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--text-muted); + margin-bottom: $s-4; +} + +.bars { list-style: none; display: flex; flex-direction: column; gap: 10px; } +.bar { + display: grid; + grid-template-columns: 160px 1fr 40px; + align-items: center; + gap: $s-3; +} +.barLabel { + font-size: 12px; + color: var(--text); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.barTrack { + height: 20px; + background: var(--surface-alt); + border-radius: 4px; + overflow: hidden; +} +.barFill { + display: block; + height: 100%; + border-radius: 4px; + background: linear-gradient(90deg, var(--primary), var(--primary-h)); + transition: width 0.4s ease; +} +.barValue { + text-align: right; + font-size: 12px; + font-weight: 600; + color: var(--text-muted); + font-variant-numeric: tabular-nums; +} + +.state, .stateError { + padding: $s-8; + text-align: center; + color: var(--text-muted); + font-size: 13px; +} +.stateError { color: var(--danger); } diff --git a/client/src/pages/Stats/index.tsx b/client/src/pages/Stats/index.tsx new file mode 100644 index 0000000..7d42aca --- /dev/null +++ b/client/src/pages/Stats/index.tsx @@ -0,0 +1,71 @@ +import { useEffect, useState } from 'react'; +import PageHeader from '../../components/PageHeader'; +import { getStats } from '../../services/ticket.service'; +import type { StatsResponse } from '../../types/ticket.types'; +import styles from './Stats.module.scss'; + +export default function Stats({ refreshKey }: { refreshKey: number }) { + const [stats, setStats] = useState(null); + const [error, setError] = useState(false); + + useEffect(() => { + let alive = true; + setError(false); + getStats().then(s => { if (alive) setStats(s); }).catch(() => { if (alive) setError(true); }); + return () => { alive = false; }; + }, [refreshKey]); + + if (error) return
    Failed to load statistics.
    ; + if (!stats) return
    Loading…
    ; + + return ( +
    + + +
    + + + +
    + +
    + ({ label: d.state, count: d.count }))} /> + ({ label: shortGroup(d.group), count: d.count }))} /> + ({ label: d.assignee, count: d.count }))} wide /> +
    +
    + ); +} + +function Kpi({ label, value, accent }: { label: string; value: number; accent?: boolean }) { + return ( +
    +
    {value}
    +
    {label}
    +
    + ); +} + +function BarCard({ title, data, wide }: { title: string; data: { label: string; count: number }[]; wide?: boolean }) { + const max = Math.max(1, ...data.map(d => d.count)); + return ( +
    +

    {title}

    +
      + {data.map((d, i) => ( +
    • + {d.label} + + + + {d.count} +
    • + ))} +
    +
    + ); +} + +function shortGroup(g: string): string { + return g.replace(/^L3\s+/, '').replace(/\s+Marketing Web Presence$/i, ''); +} diff --git a/client/src/services/admin.service.ts b/client/src/services/admin.service.ts new file mode 100644 index 0000000..a815f06 --- /dev/null +++ b/client/src/services/admin.service.ts @@ -0,0 +1,25 @@ +import { apiGet, apiPost, apiFetch } from './api.service'; +import type { Role } from './auth.service'; + +export interface AppUser { id: number; username: string; role: Role; createdAt: string | null; lastLoginAt: string | null; } +export interface TokenInfo { id: number; tokenId: string; label: string; createdAt: string | null; lastUsedAt: string | null; expiresAt: string | null; revoked: boolean; } + +export async function listUsers(): Promise { + return (await apiGet<{ users: AppUser[] }>('/api/users')).users; +} +export function createUser(username: string, password: string, role: Role): Promise<{ user?: AppUser; error?: string; message?: string }> { + return apiPost('/api/users', { username, password, role }, { allowAuthErrorBody: true }); +} +export function deleteUser(username: string): Promise<{ success: boolean }> { + return apiFetch(`/api/users/${encodeURIComponent(username)}`, { method: 'DELETE' }); +} + +export async function listTokens(): Promise { + return (await apiGet<{ tokens: TokenInfo[] }>('/api/tokens')).tokens; +} +export function createToken(label: string): Promise<{ token: string; label: string }> { + return apiPost('/api/tokens', { label }); +} +export function revokeToken(id: number): Promise<{ success: boolean }> { + return apiPost(`/api/tokens/${id}/revoke`, {}); +} diff --git a/client/src/services/analytics.service.ts b/client/src/services/analytics.service.ts new file mode 100644 index 0000000..6d0f087 --- /dev/null +++ b/client/src/services/analytics.service.ts @@ -0,0 +1,22 @@ +import { apiGet } from './api.service'; +import type { OverviewResponse, SlaMetric, ForgeConfig, InsightsResponse, JiraDurationsResponse } from '../types/analytics.types'; + +export function getInsights(): Promise { + return apiGet('/api/insights'); +} + +export function getJiraDurations(): Promise { + return apiGet('/api/analytics/jira-durations'); +} + +export function getOverview(): Promise { + return apiGet('/api/analytics/overview'); +} + +export function getSla(): Promise<{ metrics: SlaMetric[] }> { + return apiGet<{ metrics: SlaMetric[] }>('/api/analytics/sla'); +} + +export function getConfig(): Promise { + return apiGet('/api/config'); +} diff --git a/client/src/services/api.service.ts b/client/src/services/api.service.ts new file mode 100644 index 0000000..448d5fc --- /dev/null +++ b/client/src/services/api.service.ts @@ -0,0 +1,42 @@ +// Fired when any API call returns 401 (session expired/absent). App registers it +// to drop to the login screen. +let onUnauthorized: (() => void) | null = null; +export function setUnauthorizedHandler(fn: (() => void) | null): void { + onUnauthorized = fn; +} + +interface ApiOptions extends RequestInit { + // When true, a 401 body is returned to the caller instead of throwing + + // firing the logout hook. Used by /login to surface { success, error }. + allowAuthErrorBody?: boolean; +} + +export async function apiFetch(url: string, options?: ApiOptions): Promise { + const { allowAuthErrorBody, ...init } = options ?? {}; + const res = await fetch(url, init); + if (!res.ok) { + if (res.status === 401) { + if (!allowAuthErrorBody) { onUnauthorized?.(); throw new Error('unauthenticated'); } + // else fall through and return the { success, error } body + } else if (res.status === 400 || res.status === 409) { + // Validation / conflict responses carry a { error, message } body the caller reads. + } else { + const text = await res.text().catch(() => res.statusText); + throw new Error(text || `HTTP ${res.status}`); + } + } + return res.json() as Promise; +} + +export function apiGet(url: string): Promise { + return apiFetch(url); +} + +export function apiPost(url: string, body: unknown, options?: ApiOptions): Promise { + return apiFetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + ...options, + }); +} diff --git a/client/src/services/auth.service.ts b/client/src/services/auth.service.ts new file mode 100644 index 0000000..2b8db3d --- /dev/null +++ b/client/src/services/auth.service.ts @@ -0,0 +1,29 @@ +import { apiGet, apiPost } from './api.service'; + +export type Role = 'viewer' | 'pm' | 'lead' | 'admin'; + +export interface CurrentUser { + username: string; + role: Role; +} + +const ORDER: Role[] = ['viewer', 'pm', 'lead', 'admin']; +export function roleAtLeast(role: Role | undefined, min: Role): boolean { + return !!role && ORDER.indexOf(role) >= ORDER.indexOf(min); +} +export const ROLE_LABELS: Record = { + viewer: 'Viewer', pm: 'PM', lead: 'Project Leadership', admin: 'Admin', +}; + +export async function getMe(): Promise { + const data = await apiGet<{ user: CurrentUser | null }>('/api/me'); + return data.user; +} + +export function login(username: string, password: string): Promise<{ success: boolean; user?: CurrentUser; error?: string }> { + return apiPost('/login', { username, password }, { allowAuthErrorBody: true }); +} + +export function logout(): Promise<{ success: boolean }> { + return apiPost('/logout', {}); +} diff --git a/client/src/services/ticket.service.ts b/client/src/services/ticket.service.ts new file mode 100644 index 0000000..25ce01a --- /dev/null +++ b/client/src/services/ticket.service.ts @@ -0,0 +1,17 @@ +import { apiGet } from './api.service'; +import type { Ticket, TicketFilters, StatsResponse } from '../types/ticket.types'; + +export async function getTickets(filters: TicketFilters = {}): Promise { + const qs = new URLSearchParams(); + for (const [k, v] of Object.entries(filters)) if (v) qs.set(k, String(v)); + const data = await apiGet<{ tickets: Ticket[] }>(`/api/tickets?${qs.toString()}`); + return data.tickets; +} + +export function getTicket(number: string): Promise { + return apiGet(`/api/tickets/${encodeURIComponent(number)}`); +} + +export function getStats(): Promise { + return apiGet('/api/stats'); +} diff --git a/client/src/styles/_variables.scss b/client/src/styles/_variables.scss new file mode 100644 index 0000000..2566576 --- /dev/null +++ b/client/src/styles/_variables.scss @@ -0,0 +1,18 @@ +// SCSS build-time tokens for use inside .module.scss files. +// Runtime CSS custom properties live in globals.scss. + +$radius: 6px; +$radius-lg: 10px; + +$s-1: 4px; +$s-2: 8px; +$s-3: 12px; +$s-4: 16px; +$s-5: 20px; +$s-6: 24px; +$s-8: 32px; + +$font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; +$font-mono: 'SF Mono', 'Cascadia Code', 'Consolas', monospace; + +$transition: 0.15s ease; diff --git a/client/src/styles/globals.scss b/client/src/styles/globals.scss new file mode 100644 index 0000000..47910e8 --- /dev/null +++ b/client/src/styles/globals.scss @@ -0,0 +1,68 @@ +*, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +:root { + --primary: #6366f1; + --primary-h: #4f46e5; + --primary-bg: rgba(99, 102, 241, 0.10); + + --success: #16a34a; + --success-bg: rgba(22, 163, 74, 0.10); + --warning: #ea580c; + --warning-bg: rgba(234, 88, 12, 0.10); + --danger: #dc2626; + --danger-bg: rgba(220, 38, 38, 0.10); + --neutral: #64748b; + --neutral-bg: rgba(100, 116, 139, 0.12); + + --bg: #f8fafc; + --surface: #ffffff; + --surface-alt: #f1f5f9; + --border: #e2e8f0; + --border-strong:#cbd5e1; + --text: #0f172a; + --text-muted: #64748b; + --text-dim: #94a3b8; + + --row-hover: #f8fafc; + + --sidebar: #0f172a; + --sidebar-alt: #1e293b; + --sidebar-text: #cbd5e1; + --sidebar-dim: #64748b; + + --font: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; + --mono: 'SF Mono', 'Cascadia Code', 'Consolas', monospace; + + --radius: 6px; + --radius-lg: 10px; + --shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.06); + --shadow: 0 4px 12px rgba(15, 23, 42, 0.08); + --shadow-lg: 0 20px 50px rgba(15, 23, 42, 0.22); + + --topbar-h: 56px; + --sidebar-w: 236px; +} + +html, body, #root { + height: 100%; +} + +body { + font-family: var(--font); + font-size: 13px; + background: var(--bg); + color: var(--text); + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +a { color: inherit; text-decoration: none; } +button { font-family: inherit; cursor: pointer; } + +::-webkit-scrollbar { width: 10px; height: 10px; } +::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 6px; } +::-webkit-scrollbar-track { background: transparent; } diff --git a/client/src/types/analytics.types.ts b/client/src/types/analytics.types.ts new file mode 100644 index 0000000..041c583 --- /dev/null +++ b/client/src/types/analytics.types.ts @@ -0,0 +1,59 @@ +export interface Bucket { key: string; label: string; count: number; } +export interface NestedBucket extends Bucket { children: Bucket[]; } +export interface MonthPoint { month: string; count: number; } + +export interface OverviewResponse { + totals: { total: number; active: number; closed: number }; + openedByMonth: MonthPoint[]; + closedByMonth: MonthPoint[]; + revenueByMonth: MonthPoint[]; + byState: Bucket[]; + byBrand: NestedBucket[]; + byMarket: Bucket[]; + byBusinessUnit: Bucket[]; + byRequester: NestedBucket[]; + byRequesterShare: Bucket[]; + lifetime: { buckets: Bucket[]; medianDays: number | null; avgDays: number | null; closed: number }; +} + +export interface SlaCell { avgDays: number | null; count: number; onTime: number; onTimePct: number | null; } +export interface SlaMetric { + key: string; + title: string; + unit: 'days' | 'hours'; + norms: Record; + pms: string[]; + sizes: string[]; + grid: Record>; + totals: Record; +} + +export interface InsightTicket { + number: string; shortDesc: string; assignedTo: string | null; + brand: string | null; market: string | null; state: string; + days: number | null; link: string | null; jiraStatus: string | null; costGbp: number; +} +export interface AlertGroup { key: string; label: string; count: number; problematic: number; tickets: InsightTicket[]; } +export interface PmRow { pm: string; tickets: number; revenue: number; alerts: number; revAtRisk: number; } +export interface InsightsResponse { + totalAlerts: number; + revAtRisk: number; + groups: AlertGroup[]; + waitingPo: { count: number; revenue: number; levels: { l1: number; l2: number; l3: number } }; + pms: PmRow[]; + generatedAt: string; +} + +export interface JiraDuration { status: string; avgDays: number; avgHours: number; count: number; } +export interface JiraDurationsResponse { order: string[]; rows: JiraDuration[]; } + +export interface ForgeConfig { + brandColors?: Record; + fxRates?: Record; + displayCurrency?: string; + norms?: Record>; + sizeThresholds?: Record; + insightsThresholds?: Record; + colleagues?: string[]; + latamAssignees?: string[]; +} diff --git a/client/src/types/ticket.types.ts b/client/src/types/ticket.types.ts new file mode 100644 index 0000000..dab0aea --- /dev/null +++ b/client/src/types/ticket.types.ts @@ -0,0 +1,76 @@ +export type TicketStatus = 'active' | 'closed'; + +export interface ActivityEntry { + kind: 'comment' | 'worknote' | string; + t: string; + who: string; +} + +export interface JiraInfo { + status?: string; + statusChangedAt?: string; + key?: string | null; + url?: string | null; + assignee?: string | null; + statusDurations?: Record; + movements?: { at: string; who?: string; from?: string; to?: string }[]; +} + +export interface Ticket { + number: string; + status: TicketStatus; + state: string; + shortDesc: string; + assignedTo: string | null; + assignmentGroup: string | null; + brand: string | null; + market: string | null; + businessUnit: string | null; + requestedFor: string | null; + openedBy: string | null; + openedAt: string | null; + openedDate: string | null; + closedDate: string | null; + toDoAt: string | null; + inUatAt: string | null; + jiraKey: string | null; + currencyCode: string | null; + ticketYear: number | null; + size: string | null; + poNumber: string | null; + invoiced: string | null; + dueDate: string | null; + stateChangedAt: string | null; + stateChangedBy: string | null; + lastActivityAt: string | null; + lastActivityBy: string | null; + lastComment: string | null; + description: string | null; + link: string | null; + finalCost: number | null; + ttfrMinutes: number | null; + clientRespMinutes: number | null; + fulfillmentDate: string | null; + firstReplyAt: string | null; + firstAssignedDate: string | null; + updatedAt: string | null; + jira: JiraInfo | null; + activity: ActivityEntry[]; +} + +export interface TicketFilters { + status?: TicketStatus; + state?: string; + group?: string; + assignee?: string; + q?: string; +} + +export interface StatsResponse { + total: number; + active: number; + closed: number; + byState: { state: string; count: number }[]; + byGroup: { group: string; count: number }[]; + byAssignee: { assignee: string; count: number }[]; +} diff --git a/client/src/utils/board.ts b/client/src/utils/board.ts new file mode 100644 index 0000000..0132a65 --- /dev/null +++ b/client/src/utils/board.ts @@ -0,0 +1,49 @@ +import type { Ticket } from '../types/ticket.types'; + +// The initial app's kanban column model. A ticket's column is derived from its +// ServiceNow state, with one pseudo-status: a Work-In-Progress ticket whose last +// activity was by the client (not a colleague) becomes "Customer replied". + +export type ColumnKey = + | 'unassigned' | 'open' | 'hold' | 'wip' | 'replied' | 'awaiting'; + +export interface ColumnDef { + key: ColumnKey; + label: string; + color: string; + slaKey: string; // key into insightsThresholds + slaVerb: (n: number) => string; +} + +export const BOARD_COLUMNS: ColumnDef[] = [ + { key: 'unassigned', label: 'Unassigned', color: '#78716c', slaKey: 'unassigned', slaVerb: n => `assign within ${n}d` }, + { key: 'open', label: 'Open / Assigned', color: '#16a34a', slaKey: 'assigned', slaVerb: n => `start within ${n}d` }, + { key: 'hold', label: 'On Hold', color: '#334155', slaKey: 'hold', slaVerb: n => `max ${n}d on hold` }, + { key: 'wip', label: 'Work In Progress', color: '#6366f1', slaKey: 'wip', slaVerb: n => `max ${n}d in progress` }, + { key: 'replied', label: 'Customer replied', color: '#dc2626', slaKey: 'customerReplied', slaVerb: n => `reply within ${n}d` }, + { key: 'awaiting', label: 'Awaiting Customer Info', color: '#ea580c', slaKey: 'awaiting', slaVerb: n => `escalate after ${n}d` }, +]; + +const isColleague = (name: string | null, colleagues: string[]): boolean => { + if (!name) return false; + const n = name.trim().toLowerCase(); + return colleagues.some(c => c.trim().toLowerCase() === n); +}; + +// A WIP ticket where the last touch was by the client (not us) → "Customer replied". +function isAwaitingAgency(t: Ticket, colleagues: string[]): boolean { + if (!/progress/i.test(t.state)) return false; + if (colleagues.length > 0) return !isColleague(t.lastActivityBy, colleagues); + // fallback: last activity by the requester + return !!t.lastActivityBy && t.lastActivityBy === t.requestedFor; +} + +export function boardColumn(t: Ticket, colleagues: string[]): ColumnKey { + const s = t.state.toLowerCase(); + if (/on.?hold/.test(s)) return 'hold'; + if (/progress/.test(s)) return isAwaitingAgency(t, colleagues) ? 'replied' : 'wip'; + if (/awaiting/.test(s)) return 'awaiting'; + if (!t.assignedTo) return 'unassigned'; + if (/open|new|assigned/.test(s)) return 'open'; + return 'open'; +} diff --git a/client/src/utils/excel.utils.ts b/client/src/utils/excel.utils.ts new file mode 100644 index 0000000..a5a0eb8 --- /dev/null +++ b/client/src/utils/excel.utils.ts @@ -0,0 +1,167 @@ +import writeXlsxFile from 'write-excel-file'; +import { unzipSync, zipSync, strToU8, strFromU8 } from 'fflate'; +import type { Ticket } from '../types/ticket.types'; +import { parseDate } from './format.utils'; + +function daysSince(v: string | null): number | null { + const d = parseDate(v); + return d ? Math.floor((Date.now() - d.getTime()) / 86_400_000) : null; +} +// Short local date (avoids ugly raw SNOW timestamps). +function shortDate(v: string | null): string { + const d = parseDate(v); + return d ? d.toLocaleDateString(undefined, { year: '2-digit', month: 'short', day: 'numeric' }) : ''; +} +function xmlEsc(s: string): string { + return s.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); +} + +// --- palette (FORGE tokens) ------------------------------------------------ +const BORDER = '#E2E8F0'; +const HEADER_BG = '#6366F1'; // --primary indigo +const STRIPE = '#F4F6FE'; // very light indigo — zebra rows +const WHITE = '#FFFFFF'; +const LINK = '#2563EB'; +const ROW_H = 26; + +type Row = Ticket & { __row: number }; +type Align = 'left' | 'right' | 'center'; + +interface Col { + column: string; + type: typeof String | typeof Number; + width: number; + align?: Align; + wrap?: boolean; + format?: string; + color?: string; + value: (t: Row) => string | number | null; +} + +const COLS: Col[] = [ + // Number is plain text (blue); a REAL Excel hyperlink is injected in post-processing + // (a HYPERLINK() formula would break in `;`-separator Excel locales → #VALUE!). + { column: 'Number', type: String, width: 18, color: LINK, value: t => t.number }, + { column: 'State', type: String, width: 22, value: t => t.state }, + { column: 'Assignee', type: String, width: 24, value: t => t.assignedTo ?? '' }, + { column: 'Short description', type: String, width: 54, wrap: true, value: t => t.shortDesc }, + { column: 'Brand', type: String, width: 16, value: t => t.brand ?? '' }, + { column: 'Market', type: String, width: 16, value: t => t.market ?? '' }, + { column: 'Requester', type: String, width: 24, value: t => t.requestedFor ?? '' }, + { column: 'Group', type: String, width: 32, value: t => t.assignmentGroup ?? '' }, + { column: 'Lifetime (d)', type: Number, width: 13, align: 'right', value: t => daysSince(t.openedAt) }, + { column: 'In state (d)', type: Number, width: 13, align: 'right', value: t => daysSince(t.stateChangedAt) }, + { column: 'Last activity', type: String, width: 15, align: 'center', value: t => shortDate(t.lastActivityAt) }, + { column: 'Jira', type: String, width: 15, value: t => t.jira?.status ?? '' }, + { column: 'Jira key', type: String, width: 13, value: t => t.jiraKey ?? '' }, + { column: 'Cost', type: Number, width: 12, align: 'right', format: '#,##0', value: t => t.finalCost }, + { column: 'Ccy', type: String, width: 8, align: 'center', value: t => t.currencyCode ?? '' }, + { column: 'PO', type: String, width: 16, value: t => t.poNumber ?? '' }, +]; + +function colLetter(n: number): string { // 1 → A, 27 → AA + let s = ''; + while (n > 0) { const r = (n - 1) % 26; s = String.fromCharCode(65 + r) + s; n = Math.floor((n - 1) / 26); } + return s; +} + +// Post-process the .xlsx: add an across the header and REAL Excel +// hyperlinks on the Number column (column A), by editing the sheet XML + its +// relationships and re-zipping. Locale-independent (no HYPERLINK formula). +function finalizeXlsx(bytes: Uint8Array, data: Row[]): Uint8Array { + const files = unzipSync(bytes); + const sheet = 'xl/worksheets/sheet1.xml'; + const relsPath = 'xl/worksheets/_rels/sheet1.xml.rels'; + if (!files[sheet]) return bytes; + + let xml = strFromU8(files[sheet]); + let rels = files[relsPath] + ? strFromU8(files[relsPath]) + : '\r\n'; + + let maxId = 0; + for (const m of rels.matchAll(/Id="rId(\d+)"/g)) maxId = Math.max(maxId, Number(m[1])); + + const relEntries: string[] = []; + const hlEntries: string[] = []; + data.forEach((t, i) => { + if (!t.link) return; + const id = `rId${++maxId}`; + relEntries.push(``); + hlEntries.push(``); // row 1 = header + }); + + const filterRef = `A1:${colLetter(COLS.length)}${data.length + 1}`; + let inject = ``; // after + if (hlEntries.length) inject += `${hlEntries.join('')}`; // after autoFilter + if (!xml.includes('')) return bytes; + xml = xml.replace('', `${inject}`); + files[sheet] = strToU8(xml); + + if (relEntries.length) { + rels = rels.replace('', `${relEntries.join('')}`); + files[relsPath] = strToU8(rels); + } + return zipSync(files); +} + +function triggerDownload(blob: Blob, fileName: string): void { + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; a.download = fileName; + document.body.appendChild(a); a.click(); a.remove(); + setTimeout(() => URL.revokeObjectURL(url), 1000); +} + +function datedName(base: string): string { + const d = new Date(); + const ymd = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`; + return `${base}-${ymd}.xlsx`; +} + +// Export the given (already-filtered) tickets to a polished, filterable .xlsx with +// clickable ticket numbers. `baseName` gets the date appended: base-YYYY-MM-DD.xlsx. +export async function exportTicketsXlsx(tickets: Ticket[], baseName = 'forge-tickets'): Promise { + const data: Row[] = tickets.map((t, i) => ({ ...t, __row: i })); + + const schema = COLS.map(c => ({ + column: c.column, + type: c.type, + value: c.value, + width: c.width, + format: c.format, + getCellStyle: (r: Row) => ({ + align: c.align ?? 'left', + alignVertical: 'center' as const, + wrap: c.wrap ?? false, + color: c.color, + fontSize: 11, + height: ROW_H, + borderColor: BORDER, + borderStyle: 'thin' as const, + backgroundColor: r.__row % 2 === 1 ? STRIPE : WHITE, + }), + })); + + // No fileName → Blob back, so we can post-process it. + const blob = await writeXlsxFile(data, { + schema, + fontFamily: 'Calibri', + fontSize: 11, + headerStyle: { + backgroundColor: HEADER_BG, color: '#FFFFFF', fontWeight: 'bold', + align: 'center', alignVertical: 'center', height: 30, + borderColor: HEADER_BG, borderStyle: 'thin', + }, + stickyRowsCount: 1, + }) as Blob; + + const bytes = new Uint8Array(await blob.arrayBuffer()); + const finalized = finalizeXlsx(bytes, data); + let out = blob; + if (finalized !== bytes) { + const ab = finalized.buffer.slice(finalized.byteOffset, finalized.byteOffset + finalized.byteLength) as ArrayBuffer; + out = new Blob([ab], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); + } + triggerDownload(out, datedName(baseName)); +} diff --git a/client/src/utils/format.utils.test.ts b/client/src/utils/format.utils.test.ts new file mode 100644 index 0000000..14a3b1f --- /dev/null +++ b/client/src/utils/format.utils.test.ts @@ -0,0 +1,40 @@ +import { describe, it, expect } from 'vitest'; +import { parseDate, formatMinutes, formatCost, initials } from './format.utils'; + +describe('parseDate', () => { + it('parses naive SNOW timestamps (space separator)', () => { + expect(parseDate('2026-08-25 12:58:06')?.getFullYear()).toBe(2026); + }); + it('parses ISO timestamps', () => { + expect(parseDate('2024-09-16T05:50:16.000Z')?.getUTCMonth()).toBe(8); + }); + it('returns null for empty/invalid', () => { + expect(parseDate('')).toBeNull(); + expect(parseDate('nope')).toBeNull(); + expect(parseDate(null)).toBeNull(); + }); +}); + +describe('formatMinutes', () => { + it('scales minutes → hours → days', () => { + expect(formatMinutes(45)).toBe('45m'); + expect(formatMinutes(90)).toBe('1.5h'); + expect(formatMinutes(2880)).toBe('2.0d'); + expect(formatMinutes(null)).toBe('—'); + }); +}); + +describe('formatCost', () => { + it('formats euros, dashes null', () => { + expect(formatCost(150)).toBe('€150'); + expect(formatCost(null)).toBe('—'); + }); +}); + +describe('initials', () => { + it('strips (Inactive) suffixes and takes first+last', () => { + expect(initials('Alesya Prolagayeva')).toBe('AP'); + expect(initials('Levon Mkrtchyan (Inactive)')).toBe('LM'); + expect(initials(null)).toBe('?'); + }); +}); diff --git a/client/src/utils/format.utils.ts b/client/src/utils/format.utils.ts new file mode 100644 index 0000000..dcabc53 --- /dev/null +++ b/client/src/utils/format.utils.ts @@ -0,0 +1,60 @@ +// Parse a ServiceNow timestamp. The archives mix naive local strings +// ("2026-08-25 12:58:06") and ISO ("2024-09-16T05:50:16.000Z"); both parse +// with a normalizing space→T for the naive form. +export function parseDate(v: string | null | undefined): Date | null { + if (typeof v !== 'string' || !v) return null; + const iso = v.includes('T') ? v : v.replace(' ', 'T'); + const d = new Date(iso); + return Number.isNaN(d.getTime()) ? null : d; +} + +export function formatDate(v: string | null | undefined): string { + const d = parseDate(v); + if (!d) return '—'; + return d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' }); +} + +export function formatDateTime(v: string | null | undefined): string { + const d = parseDate(v); + if (!d) return '—'; + return d.toLocaleString(undefined, { + year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', + }); +} + +// Relative "3d ago" style label, coarse-grained. +export function timeAgo(v: string | null | undefined): string { + const d = parseDate(v); + if (!d) return '—'; + const secs = Math.floor((Date.now() - d.getTime()) / 1000); + if (secs < 60) return 'just now'; + const mins = Math.floor(secs / 60); + if (mins < 60) return `${mins}m ago`; + const hrs = Math.floor(mins / 60); + if (hrs < 24) return `${hrs}h ago`; + const days = Math.floor(hrs / 24); + if (days < 30) return `${days}d ago`; + const months = Math.floor(days / 30); + if (months < 12) return `${months}mo ago`; + return `${Math.floor(months / 12)}y ago`; +} + +export function formatMinutes(mins: number | null): string { + if (mins == null) return '—'; + if (mins < 60) return `${mins}m`; + const hrs = mins / 60; + if (hrs < 24) return `${hrs.toFixed(1)}h`; + return `${(hrs / 24).toFixed(1)}d`; +} + +export function formatCost(v: number | null): string { + if (v == null) return '—'; + return `€${v.toLocaleString(undefined, { maximumFractionDigits: 0 })}`; +} + +export function initials(name: string | null | undefined): string { + if (!name) return '?'; + const parts = name.replace(/\(.*?\)/g, '').trim().split(/\s+/).filter(Boolean); + if (parts.length === 0) return '?'; + return (parts[0][0] + (parts[1]?.[0] ?? '')).toUpperCase(); +} diff --git a/client/src/vite-env.d.ts b/client/src/vite-env.d.ts new file mode 100644 index 0000000..dbb4c62 --- /dev/null +++ b/client/src/vite-env.d.ts @@ -0,0 +1,3 @@ +/// + +declare const __APP_VERSION__: string; diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 0000000..e79f74b --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "ignoreDeprecations": "6.0", + "target": "ES2020", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noFallthroughCasesInSwitch": true, + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "baseUrl": ".", + "paths": { "@/*": ["src/*"] } + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/client/tsconfig.node.json b/client/tsconfig.node.json new file mode 100644 index 0000000..903f2cc --- /dev/null +++ b/client/tsconfig.node.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "composite": true, + "ignoreDeprecations": "6.0", + "skipLibCheck": true, + "target": "ES2022", + "lib": ["ES2023", "DOM", "WebWorker"], + "module": "ESNext", + "moduleResolution": "bundler", + "isolatedModules": true, + "outDir": "./node_modules/.tmp/tsnode", + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/client/vite.config.ts b/client/vite.config.ts new file mode 100644 index 0000000..f9b5a2b --- /dev/null +++ b/client/vite.config.ts @@ -0,0 +1,37 @@ +import { defineConfig, configDefaults } from 'vitest/config'; +import react from '@vitejs/plugin-react'; +import { readFileSync } from 'node:fs'; + +const { version } = JSON.parse( + readFileSync(new URL('./package.json', import.meta.url), 'utf-8'), +) as { version: string }; + +export default defineConfig({ + plugins: [react()], + define: { + __APP_VERSION__: JSON.stringify(version), + }, + css: { + modules: { localsConvention: 'camelCaseOnly' }, + preprocessorOptions: { scss: { api: 'modern-compiler' } }, + }, + resolve: { alias: { '@': '/src' } }, + server: { + proxy: { + // FORGE server runs on 3100 (port 3000 is taken by the time-machine project). + '/api': 'http://localhost:3100', + '/healthz': 'http://localhost:3100', + '/login': 'http://localhost:3100', + '/logout': 'http://localhost:3100', + }, + }, + build: { outDir: 'dist', emptyOutDir: true }, + test: { + environment: 'node', + include: ['src/**/*.{test,spec}.ts'], + // Ignore macOS AppleDouble sidecars (`._*`). Syncing the tree to the NAS + // over SMB/tar can split xattrs into `._foo.test.ts` files whose binary + // content matches the test glob; esbuild then dies on the leading NUL byte. + exclude: [...configDefaults.exclude, '**/._*'], + }, +}); diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..80bf4bc --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,62 @@ +# Compose v2 — `version:` key intentionally omitted (deprecated). +# +# Topology: a bundled Postgres (`db`, database `forge`) + the FORGE app. The +# schema self-bootstraps in initDB() on app boot (no ORM, no migrations) and +# seeds the bundled ticket archives on first run. App host port is 3099 (FORGE's +# lane); behind the Synology reverse proxy this is what forge.mycloud.dp.ua maps to. + +name: forge + +services: + db: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_DB: forge + POSTGRES_USER: forge + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-forge} + volumes: + - forge-db:/var/lib/postgresql/data + healthcheck: + test: ['CMD-SHELL', 'pg_isready -U forge -d forge'] + interval: 10s + timeout: 5s + retries: 5 + + app: + build: + context: . + target: runtime + image: forge-app:latest + restart: unless-stopped + depends_on: + db: + condition: service_healthy + ports: + # Host 3089 -> container 3000. 3089 is FORGE's lane. + - '3089:3000' + environment: + DATABASE_URL: postgresql://forge:${POSTGRES_PASSWORD:-forge}@db:5432/forge + NODE_ENV: production + PORT: 3000 + # Read-API auth (see .env / .env.example). + SESSION_SECRET: ${SESSION_SECRET:?set SESSION_SECRET in .env} + AUTH_USER: ${AUTH_USER:-admin} + AUTH_PASS: ${AUTH_PASS:?set AUTH_PASS in .env} + # Guards POST /api/tokens. Prefer minting via the CLI instead (see SETUP.md). + ADMIN_KEY: ${ADMIN_KEY:-} + healthcheck: + test: ['CMD', 'wget', '-qO-', 'http://localhost:3000/healthz'] + interval: 30s + timeout: 5s + start_period: 20s + retries: 3 + mem_limit: 1g + logging: + driver: json-file + options: + max-size: '10m' + max-file: '3' + +volumes: + forge-db: diff --git a/docs/SETUP.md b/docs/SETUP.md new file mode 100644 index 0000000..78c6c5e --- /dev/null +++ b/docs/SETUP.md @@ -0,0 +1,154 @@ +# FORGE — setup & sync + +## 1. Database + +FORGE needs a Postgres database named `forge`. Either: + +- **Bundled (compose):** `docker compose up -d db` starts `postgres:16-alpine` + with database/user/password `forge` on a named volume. `DATABASE_URL` in + `.env.example` already points at it. +- **Your own Postgres:** create a `forge` database and set + `DATABASE_URL=postgresql://USER:PASS@HOST:5432/forge` in `.env`. + +The schema self-bootstraps on boot (`initDB()` in `server/db.ts`) — no migrations. +On the very first boot, if the `tickets` table is empty, the bundled archives in +`server/data/` are seeded (idempotent upsert). + +## Seed data + +The board ships pre-populated from `server/data/active_archive.json` + +`closed_archive.json`, seeded on the first boot of an empty `tickets` table. +Those archives are generated from a **Let it Snow `chrome.storage.local` dump** +(the `sn_tickets`, `analytics_meta_cache`, and `jira_status_map` keys): + +```bash +# 1. drop the raw dump at repo root (gitignored — it contains real PII) +# storage-dump.json +node scripts/dump-to-archives.mjs # or: npm run dump-to-archives +# → rewrites server/data/{active,closed}_archive.json + +# 2. reload the DB from the regenerated archives (destructive: TRUNCATE + reseed) +npm run reseed +``` + +A ticket number can appear in both the active list and the closed cache; the +loader applies closed first, then active, so the **live active board wins** over +the stale closed snapshot. `npm run reseed` also works standalone whenever you +want to reset the DB to the bundled archives. + +> The raw `storage-dump.json` is a dev artifact and is gitignored. The derived +> `server/data/*.json` still contain real ticket text and are baked into the +> Docker image — keep the repo internal, or point the seed at a mounted volume. + +## 2. Run + +| | command | notes | +|---|---|---| +| Dev | `npm run dev` | server `:3000` + Vite client `:5173` (proxies `/api`) | +| Build | `npm run build` | `tsc` + `client` production build | +| Serve | `npm start` | serves the built client from the Express server | +| Docker | `docker compose up -d --build` | app on host `:3099`, bundled DB | + +## 3. Log in (read-API auth) + +The whole read UI (`/api/tickets`, `/api/stats`, …) is gated behind a +username/password login; `/healthz` and the token-authed `/api/sync` are not. + +- Set `AUTH_USER` / `AUTH_PASS` and a `SESSION_SECRET` in `.env` (see + `.env.example`). `SESSION_SECRET` is **required** in production. +- On first boot the account is seeded into `app_users` with a **bcrypt** hash. + Sessions are stored in Postgres (`user_sessions`, auto-created), so they + survive restarts. Cookies are `httpOnly` + `secure` in production (HTTPS via + the reverse proxy). +- Changing `AUTH_PASS` later does **not** update an already-seeded account — + delete the `app_users` row and reboot to re-seed, or update the hash directly. + +The database role is least-privilege: `DATABASE_URL` uses a `forge_app` role +that owns the app's tables but is **not** a Postgres superuser. + +## 4. Mint a sync token + +The Chrome extension authenticates with a bearer token (`fg__`, +SHA-256 verifier stored server-side — the raw token is shown once). + +**CLI (recommended):** + +```bash +npx tsx server/mint-token.ts "my laptop" +``` + +**Over HTTP** (only if `ADMIN_KEY` is set in the environment): + +```bash +curl -X POST https://forge.mycloud.dp.ua/api/tokens \ + -H "x-admin-key: $ADMIN_KEY" -H 'content-type: application/json' \ + -d '{"label":"my laptop"}' +``` + +Copy the `fg_…` value — it is not recoverable later. + +## 5. Install the Chrome extension + +1. `chrome://extensions` → enable **Developer mode** → **Load unpacked** → + select the `extension/` folder. +2. Open the extension's **options** (Server & token settings). Enter: + - **Server URL** — e.g. `https://forge.mycloud.dp.ua` (or `http://localhost:3000`) + - **Sync token** — the `fg_…` value from step 4 + - Click **Test connection** (hits `/healthz`), then **Save**. Chrome will ask + to grant access to the server origin — accept it. +3. Sign in to `https://rbassist.service-now.com` in the same browser. +4. Click the extension toolbar icon → **Sync now**. + +### What the sync does + +The service worker runs a collector **in the ServiceNow page context**, so it +reuses your live session cookie and CSRF token (`g_ck`). It pages the +`sc_req_item` Table API for `active=true` tickets in *Marketing Web Presence* +groups, maps them into FORGE's ticket shape, and `POST`s them to `/api/sync` in +chunks of 100 with `Authorization: Bearer `. The server upserts by ticket +number, so re-syncing is safe and never duplicates. + +## 6. Deploy to the Synology NAS + +FORGE ships to the NAS as a docker-compose stack (bundled Postgres + app), fronted +by the Synology reverse proxy (`forge.mycloud.dp.ua` → the published app port `3089`). +Two scripts (ported from the Husky template): + +- **`scripts/push-to-nas.sh`** (local, `npm run deploy`) — preflight (pinned SSH key, + `IdentitiesOnly`) → test gate → rsync the tree to the NAS (excludes + node_modules/dist/secrets/`storage-dump.json`) → run `deploy.sh` over SSH. Falls + back to tar-over-ssh if macOS's openrsync is the only rsync. +- **`scripts/deploy.sh`** (on the NAS) — Synology PATH+sudo handling → optional + `git pull` (`--pull`) → `compose build` → `up -d --remove-orphans` → poll the app + container until Docker reports **healthy**. `--fresh` tears down first but **never + passes `-v`**, so the `forge-db` volume (your ticket data) is preserved. + +**One-time, on the NAS:** create `${NAS_PATH}/.env` with the production secrets — +`SESSION_SECRET`, `AUTH_USER`, `AUTH_PASS`, `POSTGRES_PASSWORD` (compose sets +`DATABASE_URL`/`PORT`/`NODE_ENV` itself). See `.env.example`. Secrets live only on +the NAS and are **never synced**. + +**Config** is baked into `push-to-nas.sh` (defaults: `NAS_HOST=mycloud.dp.ua`, +`NAS_USER=d.tkachenko`, `NAS_PORT=2323`, `NAS_PATH=/volume1/docker/forge`, +`NAS_KEY=~/.ssh/id_ed25519`). Override via env vars or an optional `.deploy.env` +(see `.deploy.env.example`). Key-based SSH to the NAS must already work. + +```bash +npm run deploy # test → sync → build → up → health +npm run deploy -- --fresh # recreate the stack (db volume kept) +npm run deploy -- --pull # git pull on the NAS first +SKIP_TESTS=1 npm run deploy # emergency bypass of the local test gate +``` + +The reverse-proxy mapping is configured once in DSM, not by the script. + +## Security notes + +- `GATSBY_`-style client exposure does not apply here, but the same rule holds: + the API token and `g_ck` are **never logged**. Only the SHA-256 of the token + secret is stored; `token_id` is a non-secret locator. +- `POST /api/sync` is rate-limited (60 req/min) and rejects any request without a + valid, unrevoked, unexpired token (401). +- `server/data/*.json` contains **real ticket data** (names, comments). It ships + with the repo for the demo seed — treat the repo as internal, or delete the + archives and rely on live syncs only (the app runs fine with an empty seed). diff --git a/extension/background.js b/extension/background.js new file mode 100644 index 0000000..0de6ab0 --- /dev/null +++ b/extension/background.js @@ -0,0 +1,294 @@ +// FORGE Snow Sync — service worker. +// +// Flow, on a "Sync now" request from the popup: +// 1. read { serverUrl, token } from chrome.storage.local +// 2. find (or open) a rbassist.service-now.com tab +// 3. executeScript a collector in the PAGE context — it pages the ServiceNow +// Table API same-origin (so the session cookie + g_ck CSRF token just work) +// and maps sc_req_item rows into FORGE's normalized ticket shape +// 4. POST the tickets to /api/sync in chunks, Authorization: Bearer +// 5. push a { state, ... } status to storage so the popup can render it +// +// The token and g_ck are never logged. + +const SNOW_ORIGIN = 'https://rbassist.service-now.com'; +const CHUNK = 100; + +function setStatus(status) { + chrome.storage.local.set({ syncStatus: { ...status, at: Date.now() } }); +} + +chrome.runtime.onMessage.addListener((msg, _sender, sendResponse) => { + if (msg?.type === 'SYNC') { + runSync().then(sendResponse).catch(err => sendResponse({ ok: false, error: String(err?.message || err) })); + return true; // async response + } +}); + +async function runSync() { + const { serverUrl, token, jira } = await chrome.storage.local.get(['serverUrl', 'token', 'jira']); + if (!serverUrl || !token) { + const err = { ok: false, state: 'error', message: 'Set the server URL and token in options first.' }; + setStatus(err); + return err; + } + + setStatus({ state: 'collecting', message: 'Reading ServiceNow…' }); + let tickets; + try { + tickets = await collectFromSnow(); + } catch (err) { + const out = { ok: false, state: 'error', message: 'ServiceNow read failed: ' + (err?.message || err) }; + setStatus(out); + return out; + } + + if (!tickets.length) { + const out = { ok: true, state: 'done', message: 'No active tickets found.', count: 0 }; + setStatus(out); + return out; + } + + setStatus({ state: 'pushing', message: `Pushing ${tickets.length} tickets…` }); + let upserted = 0; + try { + for (let i = 0; i < tickets.length; i += CHUNK) { + const chunk = tickets.slice(i, i + CHUNK); + const res = await postChunk(serverUrl, token, chunk); + upserted += res.upserted ?? chunk.length; + setStatus({ state: 'pushing', message: `Pushed ${Math.min(i + CHUNK, tickets.length)}/${tickets.length}…` }); + } + } catch (err) { + const out = { ok: false, state: 'error', message: 'Push failed: ' + (err?.message || err) }; + setStatus(out); + return out; + } + + // --- Jira phase (optional) — runs AFTER SNOW so it attaches to fresh rows --- + let jiraMsg = ''; + if (jira && jira.baseUrl && jira.apiToken && Array.isArray(jira.boardIds) && jira.boardIds.length) { + setStatus({ state: 'collecting', message: 'Reading Jira…' }); + try { + const items = await collectFromJira(jira); + if (items.length) { + setStatus({ state: 'pushing', message: `Pushing ${items.length} Jira links…` }); + let matched = 0; + for (let i = 0; i < items.length; i += CHUNK) { + const res = await postJiraChunk(serverUrl, token, items.slice(i, i + CHUNK)); + matched += res.matched ?? 0; + } + jiraMsg = ` · ${matched} Jira`; + } else { + jiraMsg = ' · 0 Jira'; + } + } catch (err) { + // Jira is best-effort: a Jira failure must not fail the whole (successful) SNOW sync. + jiraMsg = ' · Jira failed: ' + (err?.message || err); + } + } + + const out = { ok: true, state: 'done', message: `Synced ${upserted} tickets${jiraMsg}.`, count: upserted }; + setStatus(out); + return out; +} + +// --- Jira collector (direct REST from the service worker) ------------------ +// Basic auth (email + token) for Jira Cloud; Bearer PAT for Jira Server/DC. +function jiraAuthHeader(jira) { + if (jira.email) return 'Basic ' + btoa(`${jira.email}:${jira.apiToken}`); + return 'Bearer ' + jira.apiToken; +} +// Resolve the RITM number for a Jira issue: the custom field first, then a +// regex over summary/description. Returns null when no RITM is linkable. +function ritmForIssue(issue) { + const f = issue.fields || {}; + const cf = f.customfield_26001; + const cfStr = typeof cf === 'string' ? cf : (cf && (cf.value || cf.name)) || ''; + const m = String(cfStr || `${f.summary || ''} ${f.description || ''}`).match(/RITM\d+/i); + return m ? m[0].toUpperCase() : null; +} +// From an issue's changelog, reconstruct time spent per status (ms) and the list +// of status movements. Powers chart #17 (durations) + the movement charts. +function jiraFromChangelog(issue) { + const f = issue.fields || {}; + const histories = (issue.changelog && issue.changelog.histories) || []; + // status-change events, ascending by time + const events = []; + for (const h of histories) { + for (const it of (h.items || [])) { + if (it.field === 'status') { + events.push({ at: h.created, who: (h.author && (h.author.displayName || h.author.name)) || null, from: it.fromString, to: it.toString }); + } + } + } + events.sort((a, b) => new Date(a.at) - new Date(b.at)); + const movements = events.map(e => ({ at: e.at, who: e.who, from: e.from, to: e.to })); + + const durations = {}; + const add = (status, ms) => { if (status && ms > 0) durations[status] = (durations[status] || 0) + ms; }; + const created = f.created ? new Date(f.created).getTime() : (events[0] ? new Date(events[0].at).getTime() : Date.now()); + if (events.length) { + // status held before the first transition + add(events[0].from, new Date(events[0].at).getTime() - created); + for (let i = 0; i < events.length; i++) { + const start = new Date(events[i].at).getTime(); + const end = i + 1 < events.length ? new Date(events[i + 1].at).getTime() : Date.now(); + add(events[i].to, end - start); + } + } else if (f.status && f.status.name) { + add(f.status.name, Date.now() - created); // never moved + } + return { statusDurations: durations, movements }; +} + +async function collectFromJira(jira) { + const base = jira.baseUrl.replace(/\/+$/, ''); + const auth = jiraAuthHeader(jira); + const fields = 'summary,status,assignee,updated,created,customfield_26001'; + const byRitm = new Map(); // RITM → jira info (last write wins; board order) + for (const boardId of jira.boardIds) { + let startAt = 0; + for (let page = 0; page < 50; page++) { // hard cap + const url = `${base}/rest/agile/1.0/board/${encodeURIComponent(boardId)}/issue` + + `?fields=${encodeURIComponent(fields)}&expand=changelog&maxResults=50&startAt=${startAt}`; + const res = await fetch(url, { headers: { Accept: 'application/json', Authorization: auth } }); + if (res.status === 401 || res.status === 403) throw new Error('Jira auth rejected (' + res.status + ')'); + if (!res.ok) throw new Error('Jira board ' + boardId + ' HTTP ' + res.status); + const body = await res.json(); + const issues = body.issues || []; + for (const issue of issues) { + const ritm = ritmForIssue(issue); + if (!ritm) continue; + const f = issue.fields || {}; + const cl = jiraFromChangelog(issue); // { statusDurations, movements } + byRitm.set(ritm, { + number: ritm, + jira: { + key: issue.key, + status: (f.status && f.status.name) || null, + statusChangedAt: f.updated || null, + assignee: (f.assignee && (f.assignee.displayName || f.assignee.name)) || null, + url: `${base}/browse/${issue.key}`, + statusDurations: cl.statusDurations, + movements: cl.movements, + }, + }); + } + if (startAt + issues.length >= (body.total ?? 0) || issues.length === 0) break; + startAt += issues.length; + } + } + return [...byRitm.values()]; +} +async function postJiraChunk(serverUrl, token, items) { + const res = await fetch(`${serverUrl.replace(/\/+$/, '')}/api/sync/jira`, { + method: 'POST', + headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, + body: JSON.stringify({ items }), + }); + if (res.status === 401) throw new Error('FORGE token rejected (401)'); + if (!res.ok) throw new Error('FORGE /api/sync/jira HTTP ' + res.status); + return res.json(); +} + +// Find an existing SNOW tab or create a background one, then run the collector. +async function collectFromSnow() { + let tabs = await chrome.tabs.query({ url: `${SNOW_ORIGIN}/*` }); + let created = null; + if (!tabs.length) { + created = await chrome.tabs.create({ url: `${SNOW_ORIGIN}/now/nav/ui`, active: false }); + await waitForComplete(created.id); + tabs = [created]; + } + try { + const [{ result }] = await chrome.scripting.executeScript({ + target: { tabId: tabs[0].id }, + world: 'MAIN', + func: pageCollector, + args: [SNOW_ORIGIN], + }); + if (result?.error) throw new Error(result.error); + return result?.tickets ?? []; + } finally { + if (created?.id) chrome.tabs.remove(created.id).catch(() => {}); + } +} + +function waitForComplete(tabId) { + return new Promise(resolve => { + const listener = (id, info) => { + if (id === tabId && info.status === 'complete') { + chrome.tabs.onUpdated.removeListener(listener); + resolve(); + } + }; + chrome.tabs.onUpdated.addListener(listener); + setTimeout(() => { chrome.tabs.onUpdated.removeListener(listener); resolve(); }, 30000); + }); +} + +// Runs in the ServiceNow page context. Pages the Table API and maps rows. +// Must be fully self-contained (serialized into the page). +async function pageCollector(origin) { + try { + const gck = window.g_ck || (window.g_user && window.g_user.g_ck) || ''; + const query = 'active=true^assignment_groupLIKEMarketing Web Presence^ORDERBYDESCsys_updated_on'; + const fields = [ + 'number', 'short_description', 'state', 'assigned_to', 'assignment_group', + 'opened_at', 'sys_updated_on', 'due_date', 'sys_updated_by', + ].join(','); + + const tickets = []; + const pageSize = 100; + for (let offset = 0; offset < 2000; offset += pageSize) { + const url = `${origin}/api/now/table/sc_req_item` + + `?sysparm_query=${encodeURIComponent(query)}` + + `&sysparm_display_value=true` + + `&sysparm_exclude_reference_link=true` + + `&sysparm_fields=${encodeURIComponent(fields)}` + + `&sysparm_limit=${pageSize}&sysparm_offset=${offset}`; + const res = await fetch(url, { + credentials: 'include', + headers: { Accept: 'application/json', ...(gck ? { 'X-UserToken': gck } : {}) }, + }); + if (res.status === 401 || res.status === 403) return { error: 'Not signed in to ServiceNow.' }; + if (!res.ok) return { error: 'Table API HTTP ' + res.status }; + const body = await res.json(); + const rows = body.result || []; + for (const r of rows) { + tickets.push({ + number: r.number, + status: 'active', + state: r.state || '', + shortDesc: r.short_description || '', + assignedTo: r.assigned_to || null, + assignmentGroup: r.assignment_group || null, + openedAt: r.opened_at || null, + dueDate: r.due_date || null, + stateChangedBy: r.sys_updated_by || null, + lastActivityAt: r.sys_updated_on || null, + lastActivityBy: r.sys_updated_by || null, + updatedAt: r.sys_updated_on || null, + link: `${origin}/sc_req_item.do?sysparm_query=number=${encodeURIComponent(r.number)}`, + activity: [], + }); + } + if (rows.length < pageSize) break; + } + return { tickets }; + } catch (e) { + return { error: String(e && e.message ? e.message : e) }; + } +} + +async function postChunk(serverUrl, token, tickets) { + const res = await fetch(`${serverUrl.replace(/\/+$/, '')}/api/sync`, { + method: 'POST', + headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, + body: JSON.stringify({ tickets }), + }); + if (res.status === 401) throw new Error('token rejected (401)'); + if (res.status === 403) throw new Error('forbidden (403)'); + if (!res.ok) throw new Error('server HTTP ' + res.status); + return res.json(); +} diff --git a/extension/icons/icon-128.png b/extension/icons/icon-128.png new file mode 100644 index 0000000..30689a8 Binary files /dev/null and b/extension/icons/icon-128.png differ diff --git a/extension/icons/icon-16.png b/extension/icons/icon-16.png new file mode 100644 index 0000000..90cb767 Binary files /dev/null and b/extension/icons/icon-16.png differ diff --git a/extension/icons/icon-48.png b/extension/icons/icon-48.png new file mode 100644 index 0000000..4b14dc8 Binary files /dev/null and b/extension/icons/icon-48.png differ diff --git a/extension/manifest.json b/extension/manifest.json new file mode 100644 index 0000000..c21db8b --- /dev/null +++ b/extension/manifest.json @@ -0,0 +1,27 @@ +{ + "manifest_version": 3, + "name": "FORGE Sync", + "description": "Sync ServiceNow RITM tickets (and optionally Jira status/links) into your FORGE portal.", + "version": "1.0.0", + "permissions": ["storage", "scripting"], + "host_permissions": ["https://rbassist.service-now.com/*"], + "optional_host_permissions": ["http://*/*", "https://*/*"], + "background": { + "service_worker": "background.js" + }, + "action": { + "default_popup": "popup.html", + "default_title": "FORGE Snow Sync", + "default_icon": { + "16": "icons/icon-16.png", + "48": "icons/icon-48.png", + "128": "icons/icon-128.png" + } + }, + "options_page": "options.html", + "icons": { + "16": "icons/icon-16.png", + "48": "icons/icon-48.png", + "128": "icons/icon-128.png" + } +} diff --git a/extension/options.html b/extension/options.html new file mode 100644 index 0000000..42b81c7 --- /dev/null +++ b/extension/options.html @@ -0,0 +1,70 @@ + + + + + FORGE Snow Sync — Settings + + + +
    +

    ❄ FORGE Snow Sync

    +

    Point the extension at your FORGE server and paste a sync token.

    + +
    + + +
    Where FORGE is reachable. No trailing slash needed.
    + + + +
    Mint one in FORGE → Admin → API Tokens (or npx tsx server/mint-token.ts).
    + +
    +

    Jira (optional) — syncs status/links onto matching RITM tickets.

    + + + +
    Your Jira site (Cloud or self-hosted). Issue links use <baseUrl>/browse/<KEY>.
    + + + + + + +
    With an email → Basic auth (Jira Cloud). Without → Bearer PAT (Jira Server/DC).
    + + + +
    Comma-separated agile board ids to pull. Leave blank to skip Jira sync.
    + +
    + + +
    +
    + + +
    + + + diff --git a/extension/options.js b/extension/options.js new file mode 100644 index 0000000..3a15c7a --- /dev/null +++ b/extension/options.js @@ -0,0 +1,86 @@ +const $ = (id) => document.getElementById(id); +const urlInput = $('server-url'); +const tokenInput = $('api-token'); +const jUrl = $('jira-url'); +const jEmail = $('jira-email'); +const jToken = $('jira-token'); +const jBoards = $('jira-boards'); +const feedback = $('feedback'); + +const stripUrl = (v) => (v || '').trim().replace(/\/+$/, ''); +function originPattern(url) { + try { return `${new URL(url).origin}/*`; } catch { return null; } +} +function show(state, text) { + feedback.dataset.state = state; + feedback.textContent = text; +} +function parseBoards(v) { + return (v || '').split(',').map(s => s.trim()).filter(Boolean); +} + +async function load() { + const { serverUrl, token, jira } = await chrome.storage.local.get(['serverUrl', 'token', 'jira']); + if (serverUrl) urlInput.value = serverUrl; + if (token) tokenInput.value = token; + if (jira) { + if (jira.baseUrl) jUrl.value = jira.baseUrl; + if (jira.email) jEmail.value = jira.email; + if (jira.apiToken) jToken.value = jira.apiToken; + if (Array.isArray(jira.boardIds)) jBoards.value = jira.boardIds.join(', '); + } +} + +async function ensurePermission(pattern) { + try { return await chrome.permissions.request({ origins: [pattern] }); } + catch { return false; } +} + +async function save(e) { + e.preventDefault(); + const serverUrl = stripUrl(urlInput.value); + const token = tokenInput.value.trim(); + const pattern = originPattern(serverUrl); + if (!pattern) return show('error', 'Enter a valid server URL, e.g. https://forge.mycloud.dp.ua'); + if (!token) return show('error', 'Paste a sync token (starts with fg_).'); + if (!(await ensurePermission(pattern))) return show('error', 'Permission for the FORGE origin was denied.'); + + // Jira is optional; only persist + request permission when a base URL is given. + const jiraBase = stripUrl(jUrl.value); + let jira = null; + if (jiraBase) { + const jPattern = originPattern(jiraBase); + if (!jPattern) return show('error', 'Enter a valid Jira base URL, e.g. https://support.dataart.com'); + if (!(await ensurePermission(jPattern))) return show('error', 'Permission for the Jira origin was denied.'); + jira = { + baseUrl: jiraBase, + email: jEmail.value.trim(), + apiToken: jToken.value.trim(), + boardIds: parseBoards(jBoards.value), + jql: '', + }; + } + + await chrome.storage.local.set({ serverUrl, token, jira }); + show('ok', jira && jira.boardIds.length + ? 'Saved. Sync from the popup — SNOW then Jira.' + : 'Saved. You can sync from the toolbar popup now.'); +} + +async function test() { + const serverUrl = stripUrl(urlInput.value); + const pattern = originPattern(serverUrl); + if (!pattern) return show('error', 'Enter a valid server URL first.'); + if (!(await ensurePermission(pattern))) return show('error', 'Permission for that origin was denied.'); + try { + const res = await fetch(`${serverUrl}/healthz`); + if (res.ok) show('ok', 'FORGE server reachable ✓'); + else show('error', `Server responded ${res.status}.`); + } catch { + show('error', 'Could not reach the server.'); + } +} + +$('form').addEventListener('submit', save); +$('test').addEventListener('click', test); +load(); diff --git a/extension/popup.html b/extension/popup.html new file mode 100644 index 0000000..a10c49e --- /dev/null +++ b/extension/popup.html @@ -0,0 +1,35 @@ + + + + + + + +
    + + FORGE SYNC +
    + +
    Ready.
    + + + + diff --git a/extension/popup.js b/extension/popup.js new file mode 100644 index 0000000..b0e841a --- /dev/null +++ b/extension/popup.js @@ -0,0 +1,44 @@ +const $ = (id) => document.getElementById(id); +const syncBtn = $('sync'); +const statusEl = $('status'); + +function render(status) { + if (!status) { statusEl.dataset.state = 'idle'; statusEl.textContent = 'Ready.'; return; } + statusEl.dataset.state = status.state || 'idle'; + const busy = status.state === 'collecting' || status.state === 'pushing'; + statusEl.innerHTML = busy ? '' : ''; + statusEl.append(status.message || ''); + syncBtn.disabled = busy; + syncBtn.textContent = busy ? 'Syncing…' : 'Sync now'; +} + +async function init() { + const { serverUrl, token, syncStatus } = await chrome.storage.local.get(['serverUrl', 'token', 'syncStatus']); + if (!serverUrl || !token) { + render({ state: 'error', message: 'Set server URL and token in settings first.' }); + } else { + render(syncStatus); + } +} + +syncBtn.addEventListener('click', async () => { + render({ state: 'collecting', message: 'Starting…' }); + try { + const res = await chrome.runtime.sendMessage({ type: 'SYNC' }); + render(res); + } catch (err) { + render({ state: 'error', message: String(err?.message || err) }); + } +}); + +$('open-options').addEventListener('click', (e) => { + e.preventDefault(); + chrome.runtime.openOptionsPage(); +}); + +// Live-update while a sync runs in the worker. +chrome.storage.onChanged.addListener((changes, area) => { + if (area === 'local' && changes.syncStatus) render(changes.syncStatus.newValue); +}); + +init(); diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..c28e76f --- /dev/null +++ b/index.ts @@ -0,0 +1,368 @@ +import 'dotenv/config'; +import path from 'node:path'; +import express, { type Request, type Response, type NextFunction } from 'express'; +import rateLimit from 'express-rate-limit'; +import { pool, initDB, upsertTickets, attachJira, type JiraAttach } from './server/db'; +import { listTickets, getTicket, getStats } from './server/tickets'; +import { resolveToken, createToken, listTokens, revokeToken } from './server/tokens'; +import { sessionMiddleware, requireAuth, requireRole, verifyLogin } from './server/auth'; +import { listUsers, createUser, deleteUser, isRole, getUserRole, countAdmins } from './server/db'; +import { getOverview, getSlaHeatmaps, getConfig, getJiraDurations } from './server/analytics'; +import { getInsights } from './server/insights'; +import type { Ticket, TicketStatus } from './server/types'; + +const PORT = Number(process.env.PORT ?? 3000); +// Prod: __dirname is /app/dist (compiled) → client/dist is a sibling ('..'). +// Dev (tsx index.ts): __dirname is the project root → client/dist is under it ('.'). +const CLIENT_DIST = path.join(__dirname, __dirname.endsWith('dist') ? '..' : '.', 'client', 'dist'); + +if (!process.env.DATABASE_URL) { + console.error('FATAL: DATABASE_URL is required (points at the `forge` Postgres database)'); + process.exit(1); +} + +const app = express(); +app.disable('x-powered-by'); +app.set('trust proxy', 1); +app.use(express.json({ limit: '25mb' })); // sync payloads carry activity timelines +app.use(sessionMiddleware()); + +// --- Health ---------------------------------------------------------------- +app.get('/healthz', async (_req: Request, res: Response) => { + try { + await pool.query('SELECT 1'); + res.json({ ok: true }); + } catch { + res.status(503).json({ ok: false }); + } +}); + +// --- Auth ------------------------------------------------------------------ +const loginLimiter = rateLimit({ windowMs: 15 * 60_000, max: 20, standardHeaders: true, legacyHeaders: false }); + +app.post('/login', loginLimiter, async (req: Request, res: Response) => { + const { username, password } = (req.body ?? {}) as { username?: string; password?: string }; + const ok = await verifyLogin(String(username ?? ''), String(password ?? '')); + if (!ok) return res.status(401).json({ success: false, error: 'Invalid username or password' }); + // Regenerate the session id at the privilege transition (anti session-fixation). + req.session.regenerate(err => { + if (err) { console.error('session regenerate failed:', err.message); return res.status(500).json({ success: false, error: 'session_error' }); } + req.session.user = ok; + req.session.save(saveErr => { + if (saveErr) { console.error('session save failed:', saveErr.message); return res.status(500).json({ success: false, error: 'session_error' }); } + res.json({ success: true, user: ok }); + }); + }); +}); + +app.post('/logout', (req: Request, res: Response) => { + req.session.destroy(() => { + res.clearCookie('forge.sid'); + res.json({ success: true }); + }); +}); + +app.get('/api/me', (req: Request, res: Response) => { + res.json({ user: req.session?.user ?? null }); +}); + +// --- Read API (auth-gated) ------------------------------------------------- +app.get('/api/tickets', requireAuth, async (req: Request, res: Response) => { + try { + const q = req.query; + const status = q.status === 'active' || q.status === 'closed' ? (q.status as TicketStatus) : undefined; + const tickets = await listTickets({ + status, + state: typeof q.state === 'string' ? q.state : undefined, + group: typeof q.group === 'string' ? q.group : undefined, + assignee: typeof q.assignee === 'string' ? q.assignee : undefined, + q: typeof q.q === 'string' ? q.q : undefined, + }); + res.json({ tickets, count: tickets.length }); + } catch (err) { + console.error('GET /api/tickets', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +app.get('/api/tickets/:number', requireAuth, async (req: Request, res: Response) => { + try { + const t = await getTicket(String(req.params.number)); + if (!t) return res.status(404).json({ error: 'not_found' }); + res.json(t); + } catch (err) { + console.error('GET /api/tickets/:number', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +app.get('/api/stats', requireAuth, async (_req: Request, res: Response) => { + try { + res.json(await getStats()); + } catch (err) { + console.error('GET /api/stats', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +app.get('/api/analytics/overview', requireRole('pm'), async (_req: Request, res: Response) => { + try { + res.json(await getOverview()); + } catch (err) { + console.error('GET /api/analytics/overview', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +app.get('/api/analytics/sla', requireRole('pm'), async (_req: Request, res: Response) => { + try { + res.json({ metrics: await getSlaHeatmaps() }); + } catch (err) { + console.error('GET /api/analytics/sla', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +app.get('/api/analytics/jira-durations', requireRole('pm'), async (_req: Request, res: Response) => { + try { + res.json(await getJiraDurations()); + } catch (err) { + console.error('GET /api/analytics/jira-durations', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +app.get('/api/insights', requireRole('pm'), async (_req: Request, res: Response) => { + try { + res.json(await getInsights()); + } catch (err) { + console.error('GET /api/insights', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +app.get('/api/config', requireAuth, async (_req: Request, res: Response) => { + try { + res.json(await getConfig()); + } catch (err) { + console.error('GET /api/config', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +// --- Token-authed sync ingest (used by the Chrome extension) --------------- +const syncLimiter = rateLimit({ windowMs: 60_000, max: 60, standardHeaders: true, legacyHeaders: false }); + +async function requireToken(req: Request, res: Response, next: NextFunction) { + const principal = await resolveToken(req); + if (!principal) return res.status(401).json({ error: 'token_invalid' }); + next(); +} + +function s(v: unknown): string | null { + if (v == null) return null; + const str = String(v).trim(); + return str === '' ? null : str; +} +function n(v: unknown): number | null { + if (v == null || v === '') return null; + const x = Number(v); + return Number.isFinite(x) ? x : null; +} + +// Coerce an untrusted activity array into well-typed { kind, t, who } string +// entries. Prevents a non-string `t` (which the client's date parser would call +// .includes() on) from being persisted and later crashing the render. +function sanitizeActivity(v: unknown): Ticket['activity'] { + if (!Array.isArray(v)) return []; + return v + .filter((e): e is Record => !!e && typeof e === 'object') + .map(e => ({ kind: String(e.kind ?? 'comment'), t: String(e.t ?? ''), who: String(e.who ?? '') })); +} + +// Coerce an untrusted incoming record into a normalized Ticket. Drops records +// without a number. Unknown fields are ignored. +function normalizeIncoming(raw: Record): Ticket | null { + const number = s(raw.number); + if (!number) return null; + const status: TicketStatus = raw.status === 'closed' ? 'closed' : 'active'; + return { + number, + status, + state: String(raw.state ?? ''), + shortDesc: String(raw.shortDesc ?? ''), + assignedTo: s(raw.assignedTo), + assignmentGroup: s(raw.assignmentGroup), + brand: s(raw.brand), + market: s(raw.market), + businessUnit: s(raw.businessUnit), + requestedFor: s(raw.requestedFor), + openedBy: s(raw.openedBy), + openedAt: s(raw.openedAt), + openedDate: s(raw.openedDate) ?? s(raw.openedAt), + closedDate: s(raw.closedDate), + toDoAt: s(raw.toDoAt), + inUatAt: s(raw.inUatAt), + jiraKey: s(raw.jiraKey), + currencyCode: s(raw.currencyCode), + ticketYear: n(raw.ticketYear), + size: s(raw.size), + poNumber: s(raw.poNumber), + invoiced: s(raw.invoiced), + dueDate: s(raw.dueDate), + stateChangedAt: s(raw.stateChangedAt), + stateChangedBy: s(raw.stateChangedBy), + lastActivityAt: s(raw.lastActivityAt), + lastActivityBy: s(raw.lastActivityBy), + lastComment: s(raw.lastComment), + description: s(raw.description), + link: s(raw.link), + finalCost: n(raw.finalCost), + ttfrMinutes: n(raw.ttfrMinutes), + clientRespMinutes: n(raw.clientRespMinutes), + fulfillmentDate: s(raw.fulfillmentDate), + firstReplyAt: s(raw.firstReplyAt), + firstAssignedDate: s(raw.firstAssignedDate), + updatedAt: s(raw.updatedAt), + jira: (raw.jira ?? null) as Ticket['jira'], + activity: sanitizeActivity(raw.activity), + }; +} + +app.post('/api/sync', syncLimiter, requireToken, async (req: Request, res: Response) => { + try { + const body = req.body as { tickets?: unknown }; + if (!Array.isArray(body.tickets)) return res.status(400).json({ error: 'bad_payload' }); + const tickets = body.tickets + .map(r => normalizeIncoming(r as Record)) + .filter((t): t is Ticket => t !== null); + if (tickets.length === 0) return res.json({ upserted: 0 }); + const upserted = await upsertTickets(tickets); + res.json({ upserted }); + } catch (err) { + console.error('POST /api/sync', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +// Jira enrichment ingest (from the extension's Jira REST collector). Attach-only: +// updates only jira/jira_key on existing tickets, keyed by RITM number. +app.post('/api/sync/jira', syncLimiter, requireToken, async (req: Request, res: Response) => { + try { + const body = req.body as { items?: unknown }; + if (!Array.isArray(body.items)) return res.status(400).json({ error: 'bad_payload' }); + const items: JiraAttach[] = body.items + .map(r => r as Record) + .filter(r => r && typeof r.number === 'string' && (r.number as string).trim()) + .map(r => ({ + number: String(r.number).trim(), + jira: (r.jira && typeof r.jira === 'object' ? r.jira : {}) as Record, + jiraKey: typeof r.jiraKey === 'string' ? r.jiraKey : (typeof (r.jira as { key?: unknown })?.key === 'string' ? (r.jira as { key: string }).key : null), + })); + if (items.length === 0) return res.json({ matched: 0 }); + const matched = await attachJira(items); + res.json({ matched, received: items.length }); + } catch (err) { + console.error('POST /api/sync/jira', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +// --- User management (Project Leadership + Admin) -------------------------- +app.get('/api/users', requireRole('lead'), async (_req: Request, res: Response) => { + try { + res.json({ users: await listUsers() }); + } catch (err) { + console.error('GET /api/users', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +app.post('/api/users', requireRole('lead'), async (req: Request, res: Response) => { + const { username, password, role } = (req.body ?? {}) as { username?: string; password?: string; role?: string }; + const u = String(username ?? '').trim(); + const p = String(password ?? ''); + if (u.length < 2 || p.length < 6) return res.status(400).json({ error: 'invalid', message: 'Username ≥2 and password ≥6 chars required' }); + if (!isRole(role)) return res.status(400).json({ error: 'invalid_role' }); + // Only an admin may create another admin (leadership tops out at 'lead'). + if (role === 'admin' && req.session.user?.role !== 'admin') return res.status(403).json({ error: 'forbidden', message: 'Only an admin can create an admin' }); + try { + const result = await createUser(u, p, role); + if (result === 'exists') return res.status(409).json({ error: 'exists', message: 'Username already taken' }); + res.json({ user: result }); + } catch (err) { + console.error('POST /api/users', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +app.delete('/api/users/:username', requireRole('lead'), async (req: Request, res: Response) => { + const target = String(req.params.username); + const actor = req.session.user!; + if (target === actor.username) return res.status(400).json({ error: 'self', message: 'You cannot delete your own account' }); + try { + const targetRole = await getUserRole(target); + if (!targetRole) return res.status(404).json({ error: 'not_found' }); + // Only an admin may remove an admin, and never the last admin (would lock everyone out). + if (targetRole === 'admin') { + if (actor.role !== 'admin') return res.status(403).json({ error: 'forbidden', message: 'Only an admin can remove an admin' }); + if (await countAdmins() <= 1) return res.status(400).json({ error: 'last_admin', message: 'Cannot delete the last admin' }); + } + await deleteUser(target); + res.json({ success: true }); + } catch (err) { + console.error('DELETE /api/users', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +// --- API tokens (Admin only) ----------------------------------------------- +app.get('/api/tokens', requireRole('admin'), async (_req: Request, res: Response) => { + try { + res.json({ tokens: await listTokens() }); + } catch (err) { + console.error('GET /api/tokens', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +app.post('/api/tokens', requireRole('admin'), async (req: Request, res: Response) => { + try { + const label = typeof req.body?.label === 'string' && req.body.label.trim() ? req.body.label.trim() : 'sync-extension'; + const raw = await createToken(label); + res.json({ token: raw, label }); + } catch (err) { + console.error('POST /api/tokens', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +app.post('/api/tokens/:id/revoke', requireRole('admin'), async (req: Request, res: Response) => { + const id = Number(req.params.id); + if (!Number.isInteger(id)) return res.status(400).json({ error: 'invalid_id' }); + try { + await revokeToken(id); + res.json({ success: true }); + } catch (err) { + console.error('POST /api/tokens/:id/revoke', (err as Error).message); + res.status(500).json({ error: 'server_error' }); + } +}); + +// --- Static client + SPA fallback ----------------------------------------- +app.use(express.static(CLIENT_DIST)); +app.get('*', (req: Request, res: Response, next: NextFunction) => { + if (req.path.startsWith('/api/')) return next(); + res.sendFile(path.join(CLIENT_DIST, 'index.html'), err => { if (err) next(); }); +}); + +(async () => { + try { + await initDB(); + console.log('DB ready (forge)'); + } catch (err) { + console.error('initDB failed:', (err as Error).message); + process.exit(1); + } + app.listen(PORT, () => console.log(`FORGE listening on http://localhost:${PORT}`)); +})(); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..25df3b5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3555 @@ +{ + "name": "forge", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "forge", + "version": "1.0.0", + "dependencies": { + "bcryptjs": "^3.0.3", + "connect-pg-simple": "^10.0.0", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "express-rate-limit": "^8.3.2", + "express-session": "^1.19.0", + "pg": "^8.12.0" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.6", + "@types/connect-pg-simple": "^7.0.3", + "@types/express": "^5.0.6", + "@types/express-session": "^1.19.0", + "@types/node": "^25.6.0", + "@types/pg": "^8.20.0", + "concurrently": "^9.2.1", + "tsx": "^4.21.0", + "typescript": "^6.0.3", + "vitest": "^2.1.9" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.0.tgz", + "integrity": "sha512-70TeIFezKKy65LgAVyQh+w94/gjWhvPWaLaGGeMEgVrPkQhuj/M5bAYYZzIFUj9Y69oHyTm5Um/R6gcLh4A8JA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.0.tgz", + "integrity": "sha512-YC86tYIHK6M1IV+wbzO+Bxk8RCBr6ZyWYgWxUCzaZD8mc8rrFoIJDNzDrkHBYRc/wKdrsIXmm6/F7NzrAO+OrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.0.tgz", + "integrity": "sha512-oI+ECtUcli0y0fi4xpW82GdPIXdTkI8G8DSjG2LRuw09fPAGykaWYH/hXxiKuTxiAjiPSTIIuYUqof5Z2hShWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.0.tgz", + "integrity": "sha512-NwV+1s7TiKrMe4owHyKB/dTLD7ZJD0YEBEhIz+hvav1Cu1GReJjF+rsdNwjzENQeIAbE/CoNiaAc5Vz2h5DPAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.0.tgz", + "integrity": "sha512-tWtHBTu5gOPK4u4Urtk4qAHW3zZ9rQAmbssO8gp7ELvGTGI3aCiq6NqyTQ0PCIg7KbHJF2UkGDDs77YZGxfjCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.0.tgz", + "integrity": "sha512-2qPoJiwTvtHQ27NnYvTnsgk8laXWYuVmNESG8WFZBcEPKLfZ3I27qBJarjVRQtwGeYyRfq5ZowHXih9lm2BItw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.0.tgz", + "integrity": "sha512-FQwsTRvLNuHoTdICABJQfbPUSEueISGmnpT06tXTMpfprf5NiKLSXKA0A+w45wJnCmZAnzgqBwbt6ARFuyOi5w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.0.tgz", + "integrity": "sha512-BBVTXziw8mY1a4ZbWME9tZyfzqXCDPqaC7Z3heQ29p5dkvXzwL0NwelO8zLa8c3RBKvl3YTuSnBgsBhYBtwjIw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.0.tgz", + "integrity": "sha512-w2Iyy9+RqKwx3d9qWMKsJg0FfRBsY0/pXNv0mCQ3ueRvJI6+QAScfD4nrMlzFLs2HNVW6Ew+mtZfDl9b7Ew5/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.0.tgz", + "integrity": "sha512-YK++KtrFRHYE0P6/RtYEAy9t8F37znP+K03RrIuLPYOL6SVlObRumf/0OE4V/h63xL9DwkWbNssZfmA9hawuDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.0.tgz", + "integrity": "sha512-aBfOG6fP7YkkPmTqPwufRJeFyz7WPpECv9XNbnsk9+vg7rxdih0lbtEel7jcRng4LZrrmU3FfitCFyEj4BWDWg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.0.tgz", + "integrity": "sha512-LGaHEOeHNAag9VuS1Crs5DFg4RrU9MPi2nVnNJk9DTePx/B6RRYKVmrIXt2h7YOJlwjaFJ6lwtFDliZxScTLrQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.0.tgz", + "integrity": "sha512-jClvk+J0FC3b7Udvegiw5/4hErbHtmsNsQgENnKXDWtNCJXsJYZH5WURvu7imDOO38xYml24eeh5x3A04ppwCw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.0.tgz", + "integrity": "sha512-0OJlaGK+8+B777Ql5okIpD7ua5Ro9+VB9Ve0OKa28OQJZ1RbuUBVNHK/e3pr4BROqsyPl1JrPO1ZxJseCNffcA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.0.tgz", + "integrity": "sha512-Ygsx+HoNH7afwi1bTIXbnTvVnsO+zurPLSYxybV1hHFVU72OWOCl6v05ql/z0hkpAPx+DK7Kn9Bi7MayCcjLTA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.0.tgz", + "integrity": "sha512-pDQxtMGb+OvG3fLwR2OkZlSd47hW+kWg4BYMG/++sR6RqorQccwPTDsxda5hPwiIeIErAnCF9ma3SAU06bdQtQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.0.tgz", + "integrity": "sha512-0BnUG9mS8I4SSHr3XsxVhuCMEiu+rX61xxZF5vujso4LaiAGFZFxvDjg6Xn6tLPNTUAfuCvQYas4LMQMVsKRSQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.0.tgz", + "integrity": "sha512-Adu/VttB1dpPNW+FEacrZ+xVm9tFty84+RrFzsqlFaPxoJB+9XXyDGtp5dCOoBwGBIEVH0To7lExFXEx0BIF4A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.0.tgz", + "integrity": "sha512-NQ3bDvjUbFKmP23671xUlXtKmqVsUBd6M4PQCvbmNtOy06hnQIdKHy8oG/6S3R/S6He1JgPk6A5VT+prAJMYEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.0.tgz", + "integrity": "sha512-u2eDAl4+0aFvA13GxlGBtTI3SS3sdgwgtV0HyjZ0QaQVCgNE+jqNGey+GtxWiq+wxr/UycAx/OnfJzApCFamvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.0.tgz", + "integrity": "sha512-XvRb5vfW3wAZQ+ZUG21AnHHDKtNcw99eigzEhjr//NZ3u7SoBaPP0seSc7FgP7p1epAEdAoZckMW9WY/+4w70w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.0.tgz", + "integrity": "sha512-iZPmniy4kNBf5yo2RezbkYNNK5HPbXE9+g+twnbqSng7dtLEJy1SKoxiE/ni4FDacjyuZpEeb9U054N4EoKHYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.0.tgz", + "integrity": "sha512-mFBBd+LF37fnE8JnYUOH+imj0aPFPK30vpar4ehJkgnLj9sZn8ZxiRENmLtgIwxK7TC8klF6N57fxdNBwQoqOA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.0.tgz", + "integrity": "sha512-ujeqEY3B+zbGn3Z4Q03cUBG/LGWnBJncVT36WER31LcOsQk9+1dmINKKtvmmfChUvRbK1G0R8OhMWFgHgaZtAw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.0.tgz", + "integrity": "sha512-hncn90N4sOky0L2LKE5oESKLbxCPeVo4eLA2LSMoDzM+879ml4WSr+Rr4DWknNIVVvS1Hirkc9hx02W6YxS8rQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-pg-simple": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/connect-pg-simple/-/connect-pg-simple-7.0.3.tgz", + "integrity": "sha512-NGCy9WBlW2bw+J/QlLnFZ9WjoGs6tMo3LAut6mY4kK+XHzue//lpNVpAvYRpIwM969vBRAM2Re0izUvV6kt+NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/express-session": "*", + "@types/pg": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.3.tgz", + "integrity": "sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express-session": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.19.0.tgz", + "integrity": "sha512-GbypG0bog68UbOq2tSAp7SclvCUm3ha1uDi58OPRGK1NfRvCIu7Gz0M7fTGtpNG1T9a29GpuurQj9zEcT/lMXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.5.tgz", + "integrity": "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/pg": { + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.23.1.tgz", + "integrity": "sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/bcryptjs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz", + "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, + "node_modules/body-parser": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.4.tgz", + "integrity": "sha512-TZ0CEhyzvFjgtAvHTusDMgj7wNdihCh7LLLrzdUOXIhdlnL2JBBGA9eJxR24rtqgmdjh3OA3hrN1rCHj6HM8qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.9.0", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/connect-pg-simple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/connect-pg-simple/-/connect-pg-simple-10.0.0.tgz", + "integrity": "sha512-pBGVazlqiMrackzCr0eKhn4LO5trJXsOX0nQoey9wCOayh80MYtThCbq8eoLsjpiWgiok/h+1/uti9/2/Una8A==", + "license": "MIT", + "dependencies": { + "pg": "^8.12.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=22.0.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.2.tgz", + "integrity": "sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/express-rate-limit/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/express-rate-limit/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/express-session": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.19.0.tgz", + "integrity": "sha512-0csaMkGq+vaiZTmSMMGkfdCOabYv192VbytFypcvI0MANrp+4i/7yEkJ0sbAEhycQjntaKGzYfjfXQyVb7BHMA==", + "license": "MIT", + "dependencies": { + "cookie": "~0.7.2", + "cookie-signature": "~1.0.7", + "debug": "~2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.1.0", + "parseurl": "~1.3.3", + "safe-buffer": "~5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.5.0.tgz", + "integrity": "sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/pg": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.23.0.tgz", + "integrity": "sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.14.0", + "pg-pool": "^3.14.0", + "pg-protocol": "^1.16.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.4.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz", + "integrity": "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.0.tgz", + "integrity": "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", + "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.0.tgz", + "integrity": "sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.63.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.0.tgz", + "integrity": "sha512-T5vnZ2y4QqC3/4P+w2+JO+Q/OVdnPsv4XcSYJYMEn0R9/jjl5AgLwO9LAZMzP2lN71O6pypn91rB7lDstUkfrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.0", + "@rollup/rollup-android-arm64": "4.63.0", + "@rollup/rollup-darwin-arm64": "4.63.0", + "@rollup/rollup-darwin-x64": "4.63.0", + "@rollup/rollup-freebsd-arm64": "4.63.0", + "@rollup/rollup-freebsd-x64": "4.63.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.0", + "@rollup/rollup-linux-arm-musleabihf": "4.63.0", + "@rollup/rollup-linux-arm64-gnu": "4.63.0", + "@rollup/rollup-linux-arm64-musl": "4.63.0", + "@rollup/rollup-linux-loong64-gnu": "4.63.0", + "@rollup/rollup-linux-loong64-musl": "4.63.0", + "@rollup/rollup-linux-ppc64-gnu": "4.63.0", + "@rollup/rollup-linux-ppc64-musl": "4.63.0", + "@rollup/rollup-linux-riscv64-gnu": "4.63.0", + "@rollup/rollup-linux-riscv64-musl": "4.63.0", + "@rollup/rollup-linux-s390x-gnu": "4.63.0", + "@rollup/rollup-linux-x64-gnu": "4.63.0", + "@rollup/rollup-linux-x64-musl": "4.63.0", + "@rollup/rollup-openbsd-x64": "4.63.0", + "@rollup/rollup-openharmony-arm64": "4.63.0", + "@rollup/rollup-win32-arm64-msvc": "4.63.0", + "@rollup/rollup-win32-ia32-msvc": "4.63.0", + "@rollup/rollup-win32-x64-gnu": "4.63.0", + "@rollup/rollup-win32-x64-msvc": "4.63.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shell-quote": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", + "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.23.12", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.12.tgz", + "integrity": "sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "license": "MIT", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", + "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/vite-node/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", + "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.9", + "@vitest/mocker": "2.1.9", + "@vitest/pretty-format": "^2.1.9", + "@vitest/runner": "2.1.9", + "@vitest/snapshot": "2.1.9", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.9", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.9", + "@vitest/ui": "2.1.9", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1591947 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "forge", + "version": "2.3.0", + "description": "FORGE 2.0 — ServiceNow ticket analytics portal (RITM/SCTASK) with roles, PM insights, and a Chrome sync extension", + "main": "dist/index.js", + "private": true, + "scripts": { + "start": "node dist/index.js", + "build": "tsc && cp -r server/data dist/server/data && cd client && npm ci && npm run build", + "dev": "concurrently -n server,client -c blue,green \"tsx index.ts\" \"cd client && npm run dev\"", + "dev:server": "tsx index.ts", + "dev:client": "cd client && npm run dev", + "deploy": "./scripts/push-to-nas.sh", + "reseed": "tsx server/reseed.ts", + "dump-to-archives": "node scripts/dump-to-archives.mjs", + "test": "cd client && npm test && cd .. && npm run test:root", + "test:root": "vitest run -c vitest.config.ts", + "lint": "eslint . --max-warnings 0" + }, + "dependencies": { + "bcryptjs": "^3.0.3", + "connect-pg-simple": "^10.0.0", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "express-rate-limit": "^8.3.2", + "express-session": "^1.19.0", + "pg": "^8.12.0" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.6", + "@types/connect-pg-simple": "^7.0.3", + "@types/express": "^5.0.6", + "@types/express-session": "^1.19.0", + "@types/node": "^25.6.0", + "@types/pg": "^8.20.0", + "concurrently": "^9.2.1", + "tsx": "^4.21.0", + "typescript": "^6.0.3", + "vitest": "^2.1.9" + } +} diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100755 index 0000000..d63bbfd --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,353 @@ +#!/usr/bin/env bash +# +# deploy.sh — build and start the forge stack on the Synology NAS, streaming +# every stage live and ending with a clear PASS/FAIL result. +# +# forge has NO database migration step: the schema self-bootstraps in initDB() +# when the app boots; the app + bundled Postgres come up together. Build -> up +# -> health, with no migrate one-shot to wait on (unlike the utility runner). +# +# What it does (4 stages, each with a banner you can watch): +# [1/4] Pull — `git pull` (only with --pull, and only in a git repo) +# [2/4] Build — ` build` (full streaming output, not quiet) +# [3/4] Up — ` up -d --remove-orphans` +# (--remove-orphans cleans up stale containers left under +# project `forge`) +# [4/4] Health — poll the app container until Docker reports `healthy` +# (≤120s), tailing app logs; fail with +# "APP DID NOT BECOME HEALTHY" on timeout +# +# Prerequisites: +# - Docker + Compose available on the NAS. Prefers the v2 plugin +# (`docker compose`, DSM 7.2+); falls back to `docker-compose`. +# - `.env` present next to docker-compose.yml on the NAS (SESSION_SECRET + AUTH_USER + +# AUTH_PASS + POSTGRES_PASSWORD). It is gitignored and NOT +# baked into the image. +# - Run from the repo root, or from anywhere — the script cd's to its own +# parent directory (the repo root) before doing anything, so paths with +# spaces and odd CWDs are fine. +# +# How to run: +# ./scripts/deploy.sh # build + up + watch (no git pull) +# ./scripts/deploy.sh --pull # git pull first, then build + up +# ./scripts/deploy.sh --fresh # tear down stack first, then build + up +# ./scripts/deploy.sh --help # show usage +# +# Or via DSM Task Scheduler as a user-defined script (runs head-less — +# ANSI colour is auto-disabled when stdout is not a TTY): +# /volume1/docker/forge/scripts/deploy.sh --pull \ +# >> /volume1/docker/forge/logs/deploy.log 2>&1 +# +# Flags: +# --pull Run `git pull` before building (skipped by default, since you +# may deploy from a copied folder rather than a git checkout). +# --fresh Tear the stack down (`down --remove-orphans`, NEVER `-v`) BEFORE +# building, for a clean recreate. The bundled Postgres volume +# (`forge-db`) is PRESERVED — `--fresh` never passes `-v`, so ticket +# data survives. Parsed locally; never forwarded as a compose argument. +# --help Print usage and exit 0. +# +# Ownership: +# This script is the single source of truth for compose project `forge`. +# `docker compose` here adopts/recreates the very same containers a +# Container Manager GUI "Project" of that name would show — so you never +# need the GUI to deploy. See SETUP.md ("Container Manager coexistence"). +# +# Safety: +# - Idempotent: safe to re-run; `up -d` only recreates containers whose +# config/image changed. +# - No destructive ops: never runs `down -v`, volume/image prune, or +# anything that could drop data. `--fresh` runs `down --remove-orphans` +# (no `-v`) which only removes containers/networks; the forge-db volume is kept. +# - No secrets echoed. +# +# Exit codes: +# 0 deploy OK (app healthy) +# 1 precondition / build / up failure, or health timeout +# 2 usage error (bad flag) +# + +set -euo pipefail + +# --- PATH hardening (Synology-aware) -------------------------------------- +# Non-interactive SSH on DSM 7.2 ships a minimal PATH (/usr/bin:/bin:...) +# that does NOT include docker. Container Manager installs docker / +# docker-compose under these locations. Only prepend when docker is missing, +# so this is a no-op on dev/CI hosts where docker is already on PATH. +if ! command -v docker >/dev/null 2>&1; then + export PATH="/usr/local/bin:/var/packages/ContainerManager/target/usr/bin:$PATH" +fi + +# --- Resolve repo root (works regardless of CWD; tolerates spaces) -------- +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +cd "$REPO_ROOT" + +# --- Config --------------------------------------------------------------- +APP_SERVICE="app" +HEALTH_TIMEOUT_SECS=120 # max wait for app to become healthy +HEALTH_POLL_SECS=3 # gap between health polls +HOST_PORT_FALLBACK="3089" # used if we can't derive the published port + +# Prefix prepended to every docker / compose invocation. Empty on hosts where +# the current user can talk to the docker daemon directly (dev, CI); set to +# "sudo" on the Synology NAS, where docker requires root. The +# ${DOCKER_SUDO:+sudo} array idiom expands to nothing (NOT an empty arg) when +# DOCKER_SUDO is empty, so the no-sudo path is byte-for-byte unchanged. +DOCKER_SUDO="" + +# --- Flags ---------------------------------------------------------------- +# --pull and --fresh are parsed here and consumed locally; neither is ever +# forwarded to compose. (push-to-nas.sh forwards extra args verbatim to this +# script, so `npm run deploy -- --fresh` / `-- --pull` reach this loop.) +DO_PULL=0 +DO_FRESH=0 +for arg in "$@"; do + case "$arg" in + --pull) DO_PULL=1 ;; + --fresh) DO_FRESH=1 ;; + --help|-h) + sed -n '2,/^set -euo pipefail/p' "$0" | sed -e 's/^# \{0,1\}//' -e '/^set -euo pipefail/d' + exit 0 + ;; + *) + printf 'ERROR: unknown flag: %s (try --help)\n' "$arg" >&2 + exit 2 + ;; + esac +done + +# --- Colour (only on a TTY; degrade to empty strings head-less) ----------- +if [[ -t 1 ]]; then + C_RESET=$'\033[0m' + C_RED=$'\033[31m' + C_GREEN=$'\033[32m' + C_YELLOW=$'\033[33m' + C_BOLD=$'\033[1m' +else + C_RESET='' C_RED='' C_GREEN='' C_YELLOW='' C_BOLD='' +fi + +ts() { date -u +%Y-%m-%dT%H:%M:%SZ; } + +banner() { + # banner "[1/4]" "Pulling latest code" + printf '\n%s==> %s %s%s\n' "$C_BOLD" "$1" "$2" "$C_RESET" +} + +log() { printf '[deploy %s] %s\n' "$(ts)" "$*"; } +warn() { printf '%s[deploy %s] WARN: %s%s\n' "$C_YELLOW" "$(ts)" "$*" "$C_RESET" >&2; } + +# Print a FAILED banner with a stage label, then exit non-zero. +fail() { + # fail "" "" + printf '\n%s%s================================================%s\n' "$C_BOLD" "$C_RED" "$C_RESET" + printf '%s%s DEPLOY FAILED at stage: %s%s\n' "$C_BOLD" "$C_RED" "$1" "$C_RESET" + printf '%s%s %s%s\n' "$C_BOLD" "$C_RED" "$2" "$C_RESET" + printf '%s%s================================================%s\n' "$C_BOLD" "$C_RED" "$C_RESET" + exit 1 +} + +# --- Detect compose command (prefer v2 plugin, fall back to v1) ----------- +# COMPOSE is an array so quoting survives word-splitting and "docker compose" +# (two words) is handled correctly. The ${DOCKER_SUDO:+sudo} prefix is folded +# into the array so every compose call inherits root when needed; it expands +# to nothing when DOCKER_SUDO is empty. +detect_compose() { + if ${DOCKER_SUDO:+sudo} docker compose version >/dev/null 2>&1; then + COMPOSE=(${DOCKER_SUDO:+sudo} docker compose) + elif command -v docker-compose >/dev/null 2>&1; then + COMPOSE=(${DOCKER_SUDO:+sudo} docker-compose) + else + fail "preflight" "Neither 'docker compose' (v2) nor 'docker-compose' (v1) is available. Install Docker via Synology Package Center." + fi +} + +# --- Stage 0: preflight ---------------------------------------------------- +preflight() { + banner "[0/4]" "Preflight checks" + + if ! command -v docker >/dev/null 2>&1; then + fail "preflight" "docker not found on PATH (looked in /usr/local/bin and Container Manager's target dir too)." + fi + + # Determine whether docker needs root. On the Synology NAS the deploy user + # cannot reach the docker daemon directly, so we route every call through + # sudo. We only commit to sudo when we have a way to authenticate: + # - `sudo -n true` succeeds -> passwordless sudo / cached credential, OR + # - stdout is a TTY ([ -t 1 ]) -> interactive `sudo` can prompt (caller + # ran us via `ssh -t`); sudo caches it. + # With neither, an interactive prompt would hang head-less, so we bail early. + if ! docker version >/dev/null 2>&1; then + if sudo -n true >/dev/null 2>&1 || [[ -t 1 ]]; then + DOCKER_SUDO="sudo" + log "docker requires sudo on this host — you may be prompted for your password once" + else + fail "preflight" "docker requires root and no TTY/passwordless sudo is available. Run via 'ssh -t' or configure NOPASSWD sudo for docker." + fi + fi + + if [[ ! -f "$REPO_ROOT/.env" ]]; then + fail "preflight" ".env not found at $REPO_ROOT/.env — create it on the NAS (SESSION_SECRET + AUTH_USER + AUTH_PASS + POSTGRES_PASSWORD) before deploying. It is gitignored and not baked into the image." + fi + + detect_compose + log "repo root: $REPO_ROOT" + log "compose command: ${COMPOSE[*]}" + log ".env: present" + log "this script manages compose project 'forge' directly; any Container" + log "Manager GUI 'Project' of the same name is cosmetic — these are its containers." +} + +# --- Stage 1: git pull (optional) ----------------------------------------- +stage_pull() { + banner "[1/4]" "Pulling latest code" + if [[ "$DO_PULL" -ne 1 ]]; then + log "skipped (no --pull flag); deploying current working tree as-is" + return 0 + fi + if [[ ! -d "$REPO_ROOT/.git" ]]; then + warn "--pull requested but $REPO_ROOT is not a git repo; skipping pull" + return 0 + fi + if ! command -v git >/dev/null 2>&1; then + warn "--pull requested but git not found on PATH; skipping pull" + return 0 + fi + log "running git pull..." + git pull + log "git pull complete" +} + +# --- Stage 1b: optional fresh teardown (only with --fresh) ---------------- +stage_fresh() { + if [[ "$DO_FRESH" -ne 1 ]]; then + return 0 + fi + banner "[1/4]" "Fresh teardown of existing stack (--fresh)" + # NEVER pass -v: this compose HAS a named volume (forge-db) holding the ticket + # database — dropping it would wipe all data. --remove-orphans sweeps up any + # stale container lingering under project 'forge'; the volume is untouched. + log "fresh mode: tearing down existing stack (forge-db volume PRESERVED)" + "${COMPOSE[@]}" down --remove-orphans || true +} + +# --- Stage 2: build (full streaming output) ------------------------------- +stage_build() { + banner "[2/4]" "Building images (this can take a few minutes on NAS hardware)" + if ! "${COMPOSE[@]}" build; then + fail "build" "Image build failed. See the build output above." + fi + log "build complete" +} + +# --- Stage 3: up (starts app; no migrate one-shot for forge) -------------- +stage_up() { + banner "[3/4]" "Starting stack (app)" + # --remove-orphans cleans up any stale container still pinned to project + # 'forge' (e.g. left by the GUI or an old compose config). Build ran first, + # so the app keeps serving until this quick recreate — minimal downtime. + if ! "${COMPOSE[@]}" up -d --remove-orphans; then + fail "up" "'up -d' failed. See the output above." + fi +} + +# --- Stage 4: wait for app health ----------------------------------------- +stage_health() { + banner "[4/4]" "Waiting for app to become healthy (timeout ${HEALTH_TIMEOUT_SECS}s)" + + local cid + cid="$("${COMPOSE[@]}" ps -q "$APP_SERVICE" 2>/dev/null | head -n 1 || true)" + if [[ -z "$cid" ]]; then + "${COMPOSE[@]}" logs --no-color --tail 50 "$APP_SERVICE" 2>/dev/null || true + fail "health" "APP DID NOT BECOME HEALTHY — no '$APP_SERVICE' container is running. 'up' may have failed. See logs above." + fi + + # Show recent startup logs so the user sees progress while we poll. + log "recent app startup logs:" + "${COMPOSE[@]}" logs --no-color --tail 20 "$APP_SERVICE" 2>/dev/null || true + + local deadline status running polls + deadline=$(( $(date +%s) + HEALTH_TIMEOUT_SECS )) + polls=0 + + while true; do + # If the container has a healthcheck, .State.Health.Status is one of + # starting|healthy|unhealthy. If it has none, the field is empty — fall + # back to .State.Status == running. + status="$(${DOCKER_SUDO:+sudo} docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' "$cid" 2>/dev/null || echo "unknown")" + running="$(${DOCKER_SUDO:+sudo} docker inspect --format '{{.State.Running}}' "$cid" 2>/dev/null || echo "false")" + + if [[ "$status" == "healthy" ]]; then + log "app is healthy" + return 0 + fi + + if [[ "$status" == "none" && "$running" == "true" ]]; then + warn "app container has no healthcheck; treating 'running' as healthy" + return 0 + fi + + # HARD FAIL — only a TERMINAL healthcheck verdict aborts early. 'unhealthy' + # means the healthcheck retries are exhausted. We deliberately do NOT infer + # failure from running!=true: under `restart: unless-stopped`, a crash makes + # 'running' transiently false while Docker restarts the container, so we + # keep waiting (until the overall timeout) through transient states. + if [[ "$status" == "unhealthy" ]]; then + "${COMPOSE[@]}" logs --no-color --tail 50 "$APP_SERVICE" 2>/dev/null || true + fail "health" "APP IS UNHEALTHY — '$APP_SERVICE' healthcheck reported 'unhealthy' (retries exhausted). See app logs above." + fi + + if [[ "$(date +%s)" -ge "$deadline" ]]; then + "${COMPOSE[@]}" logs --no-color --tail 50 "$APP_SERVICE" 2>/dev/null || true + fail "health" "APP DID NOT BECOME HEALTHY within ${HEALTH_TIMEOUT_SECS}s (last status: ${status}/${running}). See app logs above." + fi + + # Heartbeat: emit a timestamped, status-bearing line every few polls so + # head-less logs (DSM Task Scheduler, which only flushes at exit) stay + # useful — bare dots would otherwise appear only when the script ends. + polls=$(( polls + 1 )) + if (( polls % 5 == 1 )); then + log "still waiting (status=${status}/${running})..." + fi + sleep "$HEALTH_POLL_SECS" + done +} + +# --- Derive the published host port (best effort) ------------------------- +derive_host_port() { + local port + port="$("${COMPOSE[@]}" port "$APP_SERVICE" 3000 2>/dev/null | sed -n 's/.*:\([0-9][0-9]*\)$/\1/p' | head -n 1 || true)" + if [[ -n "$port" ]]; then + printf '%s' "$port" + else + printf '%s' "$HOST_PORT_FALLBACK" + fi +} + +# --- Final OK banner ------------------------------------------------------- +success_banner() { + local host_port image + host_port="$(derive_host_port)" + image="$(${DOCKER_SUDO:+sudo} docker inspect --format '{{.Config.Image}}' "$("${COMPOSE[@]}" ps -q "$APP_SERVICE" | head -n 1)" 2>/dev/null || echo "forge-app:latest")" + + printf '\n%s%s================================================%s\n' "$C_BOLD" "$C_GREEN" "$C_RESET" + printf '%s%s DEPLOY OK%s\n' "$C_BOLD" "$C_GREEN" "$C_RESET" + printf '%s%s================================================%s\n' "$C_BOLD" "$C_GREEN" "$C_RESET" + log "app image: $image" + log "app health: healthy" + log "app URL: http://:${host_port} (LAN; or via your reverse proxy)" +} + +# --- Main ------------------------------------------------------------------ +main() { + preflight + stage_pull + stage_fresh + stage_build + stage_up + stage_health + success_banner +} + +main diff --git a/scripts/dump-to-archives.mjs b/scripts/dump-to-archives.mjs new file mode 100644 index 0000000..465e7fd --- /dev/null +++ b/scripts/dump-to-archives.mjs @@ -0,0 +1,158 @@ +// Convert a Let it Snow chrome.storage.local dump into FORGE's seed archives + +// a config bundle. Run: node scripts/dump-to-archives.mjs [path/to/storage-dump.json] +// then reload the DB: npm run reseed +// +// Outputs (server/data/): +// active_archive.json — { tickets:[sn_tickets], jira:{num:info} } (operational, live board) +// closed_archive.json — { tickets:{num:merged} } (analytics master) +// config.json — thresholds, FX, size thresholds, SLA norms, palettes +// +// The closed archive MERGES two dump sources by RITM number: +// - analytics_data.ticketsMeta (954) → analytics fields: openedBy, openedDate, +// closedDate, toDoAt, inUatAt, jiraKey, year, businessUnit, SLA minutes, cost +// - analytics_meta_cache (965) → operational fields: lastActivityAt/By, +// stateChangedAt/By, requestedFor, openedAt (datetime), _updated +// ticketsMeta wins for analytics; meta_cache fills operational gaps; union of both. +import { readFileSync, writeFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import path from 'node:path'; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const dumpPath = process.argv[2] || path.join(root, 'storage-dump.json'); +const dataDir = path.join(root, 'server', 'data'); + +const dump = JSON.parse(readFileSync(dumpPath, 'utf-8')); +const cs = dump.chromeStorageLocal ?? {}; +const wl = dump.windowLocalStorage ?? {}; + +const sn = cs.sn_tickets ?? []; +const metaCache = cs.analytics_meta_cache ?? {}; +const ticketsMeta = cs.analytics_data?.ticketsMeta ?? []; +const jiraRaw = cs.jira_status_map ?? {}; + +// --- active (unchanged) ---------------------------------------------------- +const jira = {}; +for (const [num, j] of Object.entries(jiraRaw)) { + if (j && typeof j === 'object') { + jira[num] = { status: j.status ?? null, statusChangedAt: j.statusChangedAt ?? null, + key: j.key ?? null, url: j.url ?? null, assignee: j.assignee ?? null }; + } +} + +// Enrich jira with per-status durations (ms) from the board-state snapshot, keyed +// to RITM via customfield_26001. Powers chart #17 (Jira status durations). The +// board's column order is the workflow order used to render the chart. +const boardState = cs.jira_board_state?.boardState ?? {}; +const jiraColumns = (boardState.columns ?? []).map(c => c?.name).filter(Boolean); +for (const issues of Object.values(boardState.colIssues ?? {})) { + for (const iss of (issues ?? [])) { + const ritm = iss?.fields?.customfield_26001; + if (!ritm || typeof ritm !== 'string') continue; + const sd = iss._statusDurations; + if (!sd || typeof sd !== 'object') continue; + const e = jira[ritm] ?? (jira[ritm] = { status: null, statusChangedAt: null, key: null, url: null, assignee: null }); + e.statusDurations = sd; // { statusName: milliseconds } + if (!e.key) e.key = iss.key ?? null; + if (!e.status && iss.fields?.status?.name) e.status = iss.fields.status.name; + } +} + +// --- merged closed --------------------------------------------------------- +const byNumTM = {}; +for (const t of ticketsMeta) if (t?.number) byNumTM[t.number] = t; + +const closed = {}; +const nums = new Set([...Object.keys(metaCache), ...Object.keys(byNumTM)]); +for (const num of nums) { + const mc = metaCache[num] ?? {}; + const tm = byNumTM[num] ?? {}; + closed[num] = { + // analytics (ticketsMeta wins, fall back to meta_cache) + state: tm.state ?? mc.state ?? '', + shortDesc: tm.shortDesc ?? mc.shortDesc ?? '', + assignedTo: tm.assignedTo ?? mc.assignedTo ?? null, + brand: tm.brand ?? mc.brand ?? null, + market: tm.market ?? mc.market ?? null, + businessUnit: tm.businessUnit ?? mc.businessUnit ?? null, + finalCost: tm.finalCost ?? mc.finalCost ?? null, + currencyCode: tm.currencyCode ?? mc.currencyCode ?? null, + ttfrMinutes: tm.ttfrMinutes ?? mc.ttfrMinutes ?? null, + clientRespMinutes: tm.clientRespMinutes ?? mc.clientRespMinutes ?? null, + firstReplyAt: tm.firstReplyAt ?? mc.firstReplyAt ?? null, + firstAssignedDate: tm.firstAssignedDate ?? mc.firstAssignedDate ?? null, + fulfillmentDate: tm.fulfillmentDate ?? mc.fulfillmentDate ?? null, + openedBy: tm.openedBy ?? null, + openedDate: tm.openedDate ?? null, + closedDate: tm.closedDate ?? null, + toDoAt: tm.toDoAt ?? null, + inUatAt: tm.inUatAt ?? null, + jiraKey: tm.jiraKey ?? null, + year: tm.year ?? null, + // operational (meta_cache) + requestedFor: mc.requestedFor ?? null, + openedAt: mc.openedAt ?? tm.openedDate ?? null, + stateChangedAt: mc.stateChangedAt ?? null, + stateChangedBy: mc.stateChangedBy ?? null, + lastActivityAt: mc.lastActivityAt ?? null, + lastActivityBy: mc.lastActivityBy ?? null, + _updated: mc._updated ?? null, + }; +} + +// --- config bundle --------------------------------------------------------- +const parseWl = (k, fallback) => { try { return JSON.parse(wl[k]); } catch { return fallback; } }; +const config = { + insightsThresholds: cs.insights_thresholds ?? {}, + fxRates: cs.fx_rates_cache?.rates ?? { GBP: 1, EUR: 1.2, MXN: 20 }, + sizeThresholds: parseWl('otd_cost_thresh', { XS: 120, S: 300, M: 600, L: 1200, XL: 3000, XXL: 9000 }), + norms: { + otd: parseWl('otd_day_norms', { XS: 7, S: 14, M: 30, L: 90, XL: 90, XXL: 90 }), + avgdays: parseWl('avgdays_day_norms', { XS: 7, S: 14, M: 30, L: 90, XL: 90, XXL: 90 }), + asla: parseWl('asla_day_norms', { XS: 1, S: 1, M: 1, L: 1, XL: 1, XXL: 1 }), + psla: parseWl('psla_day_norms', { XS: 3, S: 6, M: 9, L: 15, XL: 30, XXL: 30 }), + ttfr: parseWl('lisr_ttfr_norms', { XS: 24, S: 24, M: 24, L: 24, XL: 24, XXL: 24 }), + cresp: parseWl('lisr_cresp_norms', { XS: 24, S: 24, M: 24, L: 24, XL: 24, XXL: 24 }), + }, + brandColors: cs.brand_colors ?? {}, + snowColors: cs.snow_colors ?? {}, + statesOrder: cs.sn_states_order ?? [], + displayCurrency: cs.display_currency ?? 'GBP', + colleagues: String(cs.colleague_names ?? '').split(/[\n,]/).map(s => s.trim()).filter(Boolean), + latamAssignees: String(cs.latam_assignees ?? '').split(/[\n,]/).map(s => s.trim()).filter(Boolean), + jiraColumns, +}; + +// --- finance (per-ticket cost / PO / invoiced, from the SharePoint xlsx) ------ +// Column names are data-driven; map the known ones case-insensitively. +const financeRaw = cs.finance_xlsx_data?.rows ?? {}; +const cell = (row, ...names) => { + for (const k of Object.keys(row)) if (names.some(n => k.toLowerCase() === n.toLowerCase())) return row[k]; + return null; +}; +const finance = { rows: {} }; +for (const [num, row] of Object.entries(financeRaw)) { + if (!row || typeof row !== 'object') continue; + const po = cell(row, 'PO'); + finance.rows[num] = { + cost: cell(row, 'Cost'), + currency: cell(row, 'Currency'), + po: po == null ? '' : String(po).trim(), // '' = in finance but no PO; key for waiting-PO + invoiced: cell(row, 'Invoiced'), + milestone: cell(row, 'Milestone'), + state: cell(row, 'State'), + pm: cell(row, 'PM'), + }; +} + +const generatedAt = new Date().toISOString(); +writeFileSync(path.join(dataDir, 'finance.json'), JSON.stringify({ schema: 1, generatedAt, count: Object.keys(finance.rows).length, rows: finance.rows })); +writeFileSync(path.join(dataDir, 'active_archive.json'), + JSON.stringify({ schema: 2, generatedAt, count: sn.length, tickets: sn, jira })); +writeFileSync(path.join(dataDir, 'closed_archive.json'), + JSON.stringify({ schema: 2, generatedAt, count: Object.keys(closed).length, tickets: closed })); +writeFileSync(path.join(dataDir, 'config.json'), JSON.stringify(config, null, 2)); + +const overlap = Object.keys(closed).filter(n => sn.some(t => t.number === n)).length; +console.log(`active=${sn.length} closed(merged meta_cache∪ticketsMeta)=${Object.keys(closed).length} jira=${Object.keys(jira).length} overlap=${overlap} (active wins)`); +console.log(`ticketsMeta analytics rows folded in: ${Object.keys(byNumTM).length}`); +console.log('Wrote server/data/{active,closed}_archive.json + config.json — now run: npm run reseed'); diff --git a/scripts/push-to-nas.sh b/scripts/push-to-nas.sh new file mode 100755 index 0000000..52eda62 --- /dev/null +++ b/scripts/push-to-nas.sh @@ -0,0 +1,381 @@ +#!/usr/bin/env bash +# +# push-to-nas.sh — push the working tree to the Synology NAS over SSH and +# run the on-NAS deploy, streaming every stage live and +# ending with a clear PASS/FAIL result. +# +# This is the LOCAL-side counterpart to deploy.sh (which runs ON the NAS). +# It is what `npm run deploy` invokes. +# +# What it does (4 stages, each with a banner you can watch): +# [0/4] Preflight — verify rsync/ssh exist, the SSH key is present, and a +# one-shot SSH connection to the NAS succeeds (BatchMode, +# so it fails fast instead of prompting for a password) +# [1/4] Test — run the test suite (`npm test` -> vitest run) as a GATE. +# Runs BEFORE anything touches the NAS, so a red suite +# aborts the deploy fast and locally. CI-safe (vitest run, +# not watch). Skip only with SKIP_TESTS=1 (escape hatch). +# [2/4] Sync — `rsync` the working tree to $NAS_PATH on the NAS +# (delete-extraneous, but excluding build/runtime cruft +# and — critically — the NAS-local .env and backups) +# [3/4] Deploy — run `scripts/deploy.sh` ON the NAS over SSH, forwarding +# any extra args you pass (e.g. --fresh / --pull) +# +# Why identity is pinned on every SSH hop: +# In some environments (notably IDE-spawned shells such as WebStorm's npm +# runner) ssh-agent offers MANY identities. The server can hit MaxAuthTries +# and reject the connection BEFORE the correct key is tried — "Permission +# denied" even though the key is loaded. Passing an explicit `-i $NAS_KEY` +# together with `-o IdentitiesOnly=yes` makes ssh offer ONLY that one key, +# so auth is deterministic regardless of how many identities the agent has. +# This is applied to the preflight ssh, the rsync transport, AND the remote +# deploy ssh — every outbound hop. +# +# Prerequisites: +# - rsync and ssh on the local PATH (macOS/Linux ship both). +# - An SSH key that can log into the NAS as $NAS_USER (default +# ~/.ssh/id_ed25519; override with NAS_KEY). Key-based auth must already +# work — this script does not set up keys. +# - deploy.sh + docker-compose.yml + .env already present (or about to be +# rsynced) under $NAS_PATH on the NAS. NOTE: .env is intentionally NOT +# synced (it is NAS-local and gitignored); create it on the NAS once. +# +# How to run: +# ./scripts/push-to-nas.sh # sync + remote deploy +# ./scripts/push-to-nas.sh --fresh # extra args pass through to +# # deploy.sh on the NAS +# ./scripts/push-to-nas.sh --help # show usage +# +# Or simply: npm run deploy +# +# Config (override via environment): +# NAS_HOST NAS hostname/IP (default: mycloud.dp.ua) +# NAS_USER SSH user on the NAS (default: d.tkachenko) +# NAS_PORT SSH port (default: 2323) +# NAS_PATH Deploy dir on the NAS (default: /volume1/docker/forge) +# NAS_KEY SSH private key to authenticate (default: ~/.ssh/id_ed25519) +# +# Safety: +# - rsync excludes .git, node_modules, dist, the local .env, and backups, +# so we never clobber NAS-local secrets/data or push local build cruft. +# - Read-only locally; the only mutation is on the NAS via deploy.sh, which +# is itself non-destructive (no down/prune/volume drops). +# - No secrets echoed. +# +# Exit codes: +# 0 push + remote deploy OK +# 1 preflight / sync / remote-deploy failure (remote exit code propagated) +# 2 usage error (bad flag) / missing prerequisite +# + +set -euo pipefail + +# --- Resolve repo root (works regardless of CWD; tolerates spaces) -------- +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +cd "$REPO_ROOT" + +# Optional per-machine overrides. If .deploy.env exists (gitignored), load it so +# its NAS_HOST/NAS_USER/NAS_PORT/NAS_PATH/NAS_KEY win over the baked defaults +# below. Not required — the defaults already target this NAS. +if [[ -f .deploy.env ]]; then set -a; . ./.deploy.env; set +a; fi + +# --- Config (baked defaults for this NAS; override via env or .deploy.env) -- +NAS_HOST="${NAS_HOST:-mycloud.dp.ua}" +NAS_USER="${NAS_USER:-d.tkachenko}" +NAS_PORT="${NAS_PORT:-2323}" +NAS_PATH="${NAS_PATH:-/volume1/docker/forge}" +NAS_KEY="${NAS_KEY:-$HOME/.ssh/id_ed25519}" + +# --- Flags ---------------------------------------------------------------- +# Everything we don't recognise is forwarded verbatim to deploy.sh on the +# NAS (so `--fresh` and future deploy.sh flags Just Work). --help is local. +DEPLOY_ARGS=() +for arg in "$@"; do + case "$arg" in + --help|-h) + sed -n '2,/^set -euo pipefail/p' "$0" | sed -e 's/^# \{0,1\}//' -e '/^set -euo pipefail/d' + exit 0 + ;; + *) + DEPLOY_ARGS+=("$arg") + ;; + esac +done + +# --- Colour (only on a TTY; degrade to empty strings head-less) ----------- +if [[ -t 1 ]]; then + C_RESET=$'\033[0m' + C_RED=$'\033[31m' + C_GREEN=$'\033[32m' + C_YELLOW=$'\033[33m' + C_BOLD=$'\033[1m' +else + C_RESET='' C_RED='' C_GREEN='' C_YELLOW='' C_BOLD='' +fi + +ts() { date -u +%Y-%m-%dT%H:%M:%SZ; } + +banner() { + # banner "[1/3]" "Syncing files" + printf '\n%s==> %s %s%s\n' "$C_BOLD" "$1" "$2" "$C_RESET" +} + +log() { printf '[push %s] %s\n' "$(ts)" "$*"; } +warn() { printf '%s[push %s] WARN: %s%s\n' "$C_YELLOW" "$(ts)" "$*" "$C_RESET" >&2; } + +# Print a FAILED banner with a stage label, then exit non-zero. +fail() { + # fail "" "" [] + local code="${3:-1}" + printf '\n%s%s================================================%s\n' "$C_BOLD" "$C_RED" "$C_RESET" + printf '%s%s PUSH FAILED at stage: %s%s\n' "$C_BOLD" "$C_RED" "$1" "$C_RESET" + printf '%s%s %s%s\n' "$C_BOLD" "$C_RED" "$2" "$C_RESET" + printf '%s%s================================================%s\n' "$C_BOLD" "$C_RED" "$C_RESET" + exit "$code" +} + +# --- SSH options shared by every outbound hop ----------------------------- +# Pin the exact key + IdentitiesOnly so ssh offers ONLY this identity. This is +# the whole point of the script: deterministic auth regardless of how many keys +# ssh-agent holds (the WebStorm-vs-Terminal discrepancy). Kept as an array so +# the args survive quoting/word-splitting cleanly when expanded. +SSH_OPTS=(-p "$NAS_PORT" -i "$NAS_KEY" -o IdentitiesOnly=yes) + +# Single STRING form of the same pinned-key ssh command, for RSYNC_RSH only: +# a real (samba) rsync wants ONE remote-shell string, not an array. Single- +# quote the key path defensively so an odd path can't word-split. +RSYNC_RSH_CMD="ssh -p $NAS_PORT -i '$NAS_KEY' -o IdentitiesOnly=yes" + +# Transfer-hop ssh: pinned identity PLUS BatchMode so a password prompt fails +# fast instead of hanging mid-deploy. Used by the tar fallback hops. +SSH_TRANSFER=(ssh "${SSH_OPTS[@]}" -o BatchMode=yes) + +# --- Stage 0: preflight ---------------------------------------------------- +preflight() { + banner "[0/4]" "Preflight checks" + + if ! command -v rsync >/dev/null 2>&1; then + fail "preflight" "rsync not found on PATH. Install rsync (macOS: it ships by default; Linux: your package manager)." 2 + fi + if ! command -v ssh >/dev/null 2>&1; then + fail "preflight" "ssh not found on PATH." 2 + fi + + # The key MUST exist as a file before we attempt any connection — otherwise + # ssh silently falls back to agent identities and we lose the determinism + # this whole script exists to provide. + if [[ ! -f "$NAS_KEY" ]]; then + fail "preflight" "SSH key $NAS_KEY not found — set NAS_KEY or generate one (ssh-keygen -t ed25519)." 2 + fi + + log "target: $NAS_USER@$NAS_HOST:$NAS_PORT" + log "path: $NAS_PATH" + log "ssh key: $NAS_KEY" + + # Fail-fast connectivity check. BatchMode=yes => never prompt for a password + # (so a misconfigured key fails here, loudly, instead of hanging). + log "verifying SSH connectivity (pinned key, no password prompt)..." + if ! ssh "${SSH_OPTS[@]}" -o BatchMode=yes -o ConnectTimeout=8 \ + "$NAS_USER@$NAS_HOST" 'true'; then + fail "preflight" "SSH connection to $NAS_USER@$NAS_HOST:$NAS_PORT failed with key $NAS_KEY. Confirm the key is authorized on the NAS (ssh-copy-id) and the host/port are correct." 1 + fi + log "SSH connectivity OK" +} + +# --- Stage 1: test gate ---------------------------------------------------- +# Run the suite BEFORE any NAS interaction so a red build fails fast and local, +# never leaving a half-synced tree or a broken image on the NAS. `npm test` +# resolves to `cd client && npm test` -> `vitest run` (CI mode, non-watch — it +# exits, it does not hang). Headless-safe: vitest run needs no TTY. The only +# escape hatch is SKIP_TESTS=1 for emergencies; it warns loudly when used. +# No secrets are involved or echoed here. +stage_test() { + banner "[1/4]" "Running test gate (npm test)" + + if [[ "${SKIP_TESTS:-0}" == "1" ]]; then + warn "SKIP_TESTS=1 set — BYPASSING the test gate. Deploying UNTESTED code." + return 0 + fi + + if ! command -v npm >/dev/null 2>&1; then + fail "test" "npm not found on PATH — cannot run the test gate. Install Node/npm or set SKIP_TESTS=1 to bypass (not recommended)." 2 + fi + + log "running: npm test (vitest run, non-watch)" + # Run directly so the real exit code propagates; set -e would also abort, but + # this gives a clean stage-labelled failure banner instead of a bare trap. + local rc=0 + npm test || rc=$? + if [[ "$rc" -ne 0 ]]; then + fail "test" "Test suite failed (npm test exited $rc). Deploy aborted before touching the NAS. Fix the tests (or SKIP_TESTS=1 to force, not recommended)." "$rc" + fi + log "tests passed — proceeding to sync" +} + +# --- Transport detection: find a usable (NON-openrsync) rsync -------------- +# macOS now ships Apple's "openrsync" as /usr/bin/rsync. openrsync IGNORES both +# the `-e` remote-shell option AND the RSYNC_RSH env var, so our pinned ssh key +# never reaches ssh, auth falls back to (non-existent) password, and the sync +# fails. Detect that here: a usable rsync is one whose `--version` does NOT say +# "openrsync". We also probe the common Homebrew install paths in case the user +# `brew install rsync`d a real (samba) rsync. Sets $RSYNC_BIN if one is found. +detect_usable_rsync() { + RSYNC_BIN="" + local candidates=() + local path_rsync + if path_rsync="$(command -v rsync 2>/dev/null)"; then + candidates+=("$path_rsync") + fi + candidates+=(/opt/homebrew/bin/rsync /usr/local/bin/rsync) + + local cand + for cand in "${candidates[@]}"; do + [[ -x "$cand" ]] || continue + if ! "$cand" --version 2>/dev/null | head -1 | grep -qi 'openrsync'; then + RSYNC_BIN="$cand" + return 0 + fi + done + return 1 +} + +# --- Stage 2: sync the working tree (rsync if usable, else tar-over-ssh) --- +stage_sync() { + banner "[2/4]" "Syncing working tree to $NAS_USER@$NAS_HOST:$NAS_PATH" + + if detect_usable_rsync; then + sync_via_rsync + else + sync_via_tar + fi + log "sync complete" +} + +# Preferred path: a real rsync. --delete keeps the NAS tree a mirror of local; +# the excludes protect NAS-local state (.env* secrets, backups DB dumps) and +# local-only build cruft. Trailing slash on the source copies the CONTENTS of +# REPO_ROOT into NAS_PATH. RSYNC_RSH carries our pinned-key ssh (incl. BatchMode +# so it fails fast rather than hanging on a password prompt). +sync_via_rsync() { + log "using rsync at $RSYNC_BIN" + if ! RSYNC_RSH="$RSYNC_RSH_CMD -o BatchMode=yes" "$RSYNC_BIN" -av --delete \ + --exclude '.git/' \ + --exclude '._*' \ + --exclude 'node_modules/' \ + --exclude 'client/node_modules/' \ + --exclude 'dist/' \ + --exclude 'client/dist/' \ + --exclude '.env' \ + --exclude '.env.*' \ + --exclude '.deploy.env' \ + --exclude 'storage-dump.json' \ + --exclude '.idea/' \ + --exclude 'backups/' \ + --exclude 'logs/' \ + --exclude 'prototype/' \ + --exclude 'prototype.zip' \ + --exclude '.claude/' \ + --exclude 'claude_artifacts/' \ + "$REPO_ROOT/" \ + "$NAS_USER@$NAS_HOST:$NAS_PATH/"; then + fail "sync" "rsync to $NAS_HOST:$NAS_PATH failed. See rsync output above." + fi +} + +# Fallback path (e.g. macOS openrsync): stream a tar of the working tree over +# the proven pinned-key ssh and extract it on the NAS. No rsync involved, so +# the -e/RSYNC_RSH-ignoring openrsync problem is sidestepped entirely. +# +# Tradeoff: tar extraction is additive — it does NOT delete stale remote files +# the way `rsync --delete` does. Documented loudly below. +sync_via_tar() { + warn "openrsync detected (Apple's rsync ignores -e/RSYNC_RSH); using tar-over-ssh." + warn "Note: stale remote files are NOT deleted in this mode — \`brew install rsync\` to enable --delete." + + if ! "${SSH_TRANSFER[@]}" "$NAS_USER@$NAS_HOST" "mkdir -p '$NAS_PATH'"; then + fail "sync" "could not create remote dir $NAS_PATH on $NAS_HOST (tar-over-ssh)." + fi + + # Pipe local tar -> remote tar extract, capturing the exit code of BOTH sides. + # Snapshot ${PIPESTATUS[@]} into an array in the very next command on BOTH + # branches so it is read before anything overwrites it (and `set -e` never + # aborts mid-stage). + local pipe_status=() + { COPYFILE_DISABLE=1 tar --no-mac-metadata -czf - \ + --exclude='._*' \ + --exclude='./.git' \ + --exclude='./node_modules' \ + --exclude='./client/node_modules' \ + --exclude='./dist' \ + --exclude='./client/dist' \ + --exclude='./.env' \ + --exclude='./.env.*' \ + --exclude='./.deploy.env' \ + --exclude='./storage-dump.json' \ + --exclude='./.idea' \ + --exclude='./backups' \ + --exclude='./logs' \ + --exclude='./prototype' \ + --exclude='./prototype.zip' \ + --exclude='./.claude' \ + --exclude='./claude_artifacts' \ + -C "$REPO_ROOT" . \ + | "${SSH_TRANSFER[@]}" "$NAS_USER@$NAS_HOST" "tar -xzf - -C '$NAS_PATH'" ; } \ + && pipe_status=("${PIPESTATUS[@]}") \ + || pipe_status=("${PIPESTATUS[@]}") + + local tar_rc="${pipe_status[0]}" + local ssh_rc="${pipe_status[1]}" + + if [[ "$tar_rc" -ne 0 ]]; then + fail "sync" "local tar failed (exit $tar_rc) streaming working tree to $NAS_HOST." + fi + if [[ "$ssh_rc" -ne 0 ]]; then + fail "sync" "remote tar extract on $NAS_HOST failed (exit $ssh_rc) (tar-over-ssh)." + fi +} + +# --- Stage 3: run deploy.sh on the NAS ------------------------------------ +stage_deploy() { + banner "[3/4]" "Running deploy.sh on the NAS" + + # -t allocates a TTY so deploy.sh's live streaming + colour come through. + # printf %q on each forwarded arg makes the remote command robust to args + # containing spaces/quotes; the array may be empty, which is fine. + local remote_args="" + if [[ ${#DEPLOY_ARGS[@]} -gt 0 ]]; then + remote_args="$(printf ' %q' "${DEPLOY_ARGS[@]}")" + fi + + local remote_cmd + remote_cmd="cd $(printf '%q' "$NAS_PATH") && ./scripts/deploy.sh${remote_args}" + + # Run directly (not under `if ! ...`) so we can capture the REAL remote exit + # code: after `if ! cmd`, $? is the negation's status (0), not the command's. + local rc=0 + ssh -t "${SSH_OPTS[@]}" "$NAS_USER@$NAS_HOST" "$remote_cmd" || rc=$? + if [[ "$rc" -ne 0 ]]; then + fail "deploy" "Remote deploy.sh on $NAS_HOST exited non-zero (code $rc). See the deploy output above." "$rc" + fi +} + +# --- Final OK banner ------------------------------------------------------- +success_banner() { + printf '\n%s%s================================================%s\n' "$C_BOLD" "$C_GREEN" "$C_RESET" + printf '%s%s PUSH + DEPLOY OK%s\n' "$C_BOLD" "$C_GREEN" "$C_RESET" + printf '%s%s================================================%s\n' "$C_BOLD" "$C_GREEN" "$C_RESET" + log "target: $NAS_USER@$NAS_HOST:$NAS_PATH" + log "remote deploy completed successfully" +} + +# --- Main ------------------------------------------------------------------ +main() { + preflight + stage_test + stage_sync + stage_deploy + success_banner +} + +main diff --git a/server/analytics.ts b/server/analytics.ts new file mode 100644 index 0000000..dc6c0f6 --- /dev/null +++ b/server/analytics.ts @@ -0,0 +1,309 @@ +import { pool, loadConfig } from './db'; + +// The analytics engine. Fetches the ticket rows once and computes the Overall-tab +// aggregations and the PM×size SLA heatmaps in memory (966 rows — trivial). Mirrors +// the initial app's `analytics_data` derivations. All money is converted to the +// display currency (GBP) via the fixed FX rates (units per 1 GBP). + +interface Row { + number: string; status: string; state: string; assigned_to: string | null; + brand: string | null; market: string | null; business_unit: string | null; + requested_for: string | null; opened_by: string | null; + opened_date: Date | string | null; closed_date: Date | string | null; + opened_at: Date | string | null; + final_cost: string | number | null; currency_code: string | null; size: string | null; + ttfr_minutes: number | null; client_resp_minutes: number | null; + fulfillment_date: Date | string | null; first_assigned_date: Date | string | null; + to_do_at: Date | string | null; in_uat_at: Date | string | null; + ticket_year: number | null; +} + +const SIZES = ['XS', 'S', 'M', 'L', 'XL', 'XXL']; + +function ymd(v: Date | string | null): string | null { + if (v == null) return null; + if (v instanceof Date) { + return `${v.getFullYear()}-${String(v.getMonth() + 1).padStart(2, '0')}-${String(v.getDate()).padStart(2, '0')}`; + } + const s = String(v); + return s.length >= 10 ? s.slice(0, 10) : null; +} +function month(v: Date | string | null): string | null { + const d = ymd(v); + return d ? d.slice(0, 7) : null; +} +function toDate(v: Date | string | null): Date | null { + if (v == null) return null; + if (v instanceof Date) return v; + const s = String(v).includes('T') ? String(v) : String(v).replace(' ', 'T'); + const d = new Date(s); + return Number.isNaN(d.getTime()) ? null : d; +} +function daysBetween(a: Date | string | null, b: Date | string | null): number | null { + const da = toDate(a), db = toDate(b); + if (!da || !db) return null; + return (db.getTime() - da.getTime()) / 86_400_000; +} + +async function fetchRows(): Promise { + const { rows } = await pool.query(` + SELECT number, status, state, assigned_to, brand, market, business_unit, + requested_for, opened_by, opened_date, closed_date, opened_at, + final_cost, currency_code, size, ttfr_minutes, client_resp_minutes, + fulfillment_date, first_assigned_date, to_do_at, in_uat_at, ticket_year + FROM tickets + `); + return rows; +} + +function toGBP(cost: number | null, ccy: string | null, fx: Record): number | null { + if (cost == null || !(cost > 0)) return null; + const rate = fx[(ccy || 'GBP').toUpperCase()] ?? 1; + return cost / rate; +} + +function countBy(items: T[], key: (t: T) => string | null): { key: string; label: string; count: number }[] { + const m = new Map(); + for (const it of items) { + const k = key(it); + if (!k) continue; + m.set(k, (m.get(k) ?? 0) + 1); + } + return [...m.entries()].map(([k, count]) => ({ key: k, label: k, count })).sort((a, b) => b.count - a.count); +} + +export interface OverviewResponse { + totals: { total: number; active: number; closed: number }; + openedByMonth: { month: string; count: number }[]; + closedByMonth: { month: string; count: number }[]; + revenueByMonth: { month: string; count: number }[]; // count = GBP revenue + byState: { key: string; label: string; count: number }[]; + byBrand: NestedBucket[]; + byMarket: { key: string; label: string; count: number }[]; + byBusinessUnit: { key: string; label: string; count: number }[]; + byRequester: NestedBucket[]; + byRequesterShare: { key: string; label: string; count: number }[]; // full distribution for the donut + lifetime: { buckets: { key: string; label: string; count: number }[]; medianDays: number | null; avgDays: number | null; closed: number }; +} + +interface NestedBucket { key: string; label: string; count: number; children: { key: string; label: string; count: number }[]; } + +// Two-level breakdown: parent dimension → child dimension counts. +function nestedCountBy(items: Row[], parent: (r: Row) => string | null, child: (r: Row) => string | null, limit = 20): NestedBucket[] { + const m = new Map }>(); + for (const r of items) { + const p = parent(r); + if (!p) continue; + const entry = m.get(p) ?? { count: 0, kids: new Map() }; + entry.count++; + const c = child(r); + if (c) entry.kids.set(c, (entry.kids.get(c) ?? 0) + 1); + m.set(p, entry); + } + return [...m.entries()] + .sort((a, b) => b[1].count - a[1].count) + .slice(0, limit) + .map(([key, v]) => ({ + key, label: key, count: v.count, + children: [...v.kids.entries()].sort((a, b) => b[1] - a[1]).map(([k, count]) => ({ key: k, label: k, count })), + })); +} + +function bySeriesMonth(items: Row[], dateOf: (r: Row) => Date | string | null): { month: string; count: number }[] { + const m = new Map(); + for (const r of items) { + const mo = month(dateOf(r)); + if (mo) m.set(mo, (m.get(mo) ?? 0) + 1); + } + return [...m.entries()].sort((a, b) => a[0].localeCompare(b[0])).map(([month, count]) => ({ month, count })); +} + +export async function getOverview(): Promise { + const rows = await fetchRows(); + const cfg = loadConfig(); + const fx = cfg.fxRates; + const closed = rows.filter(r => r.status === 'closed'); + const active = rows.filter(r => r.status === 'active'); + + // Revenue by close-month (display currency) + const revMap = new Map(); + for (const r of closed) { + const mo = month(r.closed_date); + const gbp = toGBP(r.final_cost != null ? Number(r.final_cost) : null, r.currency_code, fx); + if (mo && gbp) revMap.set(mo, (revMap.get(mo) ?? 0) + gbp); + } + const revenueByMonth = [...revMap.entries()].sort((a, b) => a[0].localeCompare(b[0])) + .map(([month, v]) => ({ month, count: Math.round(v) })); + + // Lifetime at close (days) → 6 buckets + median/avg + const lifetimes: number[] = []; + for (const r of closed) { + const d = daysBetween(r.opened_date ?? r.opened_at, r.closed_date); + if (d != null && d >= 0) lifetimes.push(d); + } + const LB = [ + { key: '<7d', label: '< 7 days', hi: 7 }, + { key: '7-14d', label: '7–14 days', hi: 14 }, + { key: '14-31d', label: '14–31 days', hi: 31 }, + { key: '1-3m', label: '1–3 months', hi: 93 }, + { key: '3-6m', label: '3–6 months', hi: 186 }, + { key: '>6m', label: '> 6 months', hi: Infinity }, + ]; + const buckets = LB.map(b => ({ key: b.key, label: b.label, count: 0 })); + for (const d of lifetimes) { + const i = LB.findIndex(b => d < b.hi); + buckets[i === -1 ? LB.length - 1 : i].count++; + } + const sorted = [...lifetimes].sort((a, b) => a - b); + const medianDays = sorted.length ? Math.round(sorted[Math.floor(sorted.length / 2)]) : null; + const avgDays = sorted.length ? Math.round(sorted.reduce((a, b) => a + b, 0) / sorted.length) : null; + + return { + totals: { total: rows.length, active: active.length, closed: closed.length }, + openedByMonth: bySeriesMonth(rows, r => r.opened_date ?? r.opened_at), + closedByMonth: bySeriesMonth(closed, r => r.closed_date), + revenueByMonth, + byState: countBy(active, r => r.state || '—'), + byBrand: nestedCountBy(rows, r => r.brand, r => r.market), + byMarket: countBy(rows, r => r.market).slice(0, 20), + byBusinessUnit: countBy(rows, r => normalizeBU(r.business_unit)), + byRequester: nestedCountBy(rows, r => r.requested_for ?? r.opened_by, r => r.brand), + byRequesterShare: countBy(rows, r => r.requested_for ?? r.opened_by), + lifetime: { buckets, medianDays, avgDays, closed: lifetimes.length }, + }; +} + +function normalizeBU(bu: string | null): string | null { + if (!bu) return null; + const t = bu.trim(); + if (!t) return null; + // Fix the casing dupes flagged in the data (e.g. "hygiene" → "Hygiene"). + return t.charAt(0).toUpperCase() + t.slice(1); +} + +// --- SLA heatmaps (PM × size) ---------------------------------------------- +export interface SlaCell { avgDays: number | null; count: number; onTime: number; onTimePct: number | null; } +export interface SlaMetric { + key: string; title: string; unit: 'days' | 'hours'; + norms: Record; // per size, in the metric's unit + pms: string[]; // row order + sizes: string[]; // col order (XS..XXL) + grid: Record>; // grid[pm][size] + totals: Record; // per-PM total across sizes +} + +type MetricDef = { + key: string; title: string; unit: 'days' | 'hours'; normKey: string; + value: (r: Row) => number | null; // in DAYS + scope: (r: Row) => boolean; +}; + +const METRICS: MetricDef[] = [ + { key: 'ttfr', title: 'Average Time to First Reply', unit: 'hours', normKey: 'ttfr', + value: r => r.ttfr_minutes != null ? r.ttfr_minutes / 1440 : null, scope: r => r.ttfr_minutes != null }, + { key: 'cresp', title: 'Average PM Response Time', unit: 'hours', normKey: 'cresp', + value: r => r.client_resp_minutes != null ? r.client_resp_minutes / 1440 : null, scope: r => r.client_resp_minutes != null }, + { key: 'avgclose', title: 'Average Time to Close a Project', unit: 'days', normKey: 'avgdays', + value: r => daysBetween(r.opened_date ?? r.opened_at, r.closed_date), scope: r => r.status === 'closed' }, + { key: 'otd', title: 'Projects Delivered on Time', unit: 'days', normKey: 'otd', + value: r => daysBetween(r.opened_date ?? r.opened_at, r.closed_date), scope: r => r.status === 'closed' }, + { key: 'assign', title: 'Time to Assign a PM', unit: 'days', normKey: 'asla', + value: r => { const d = daysBetween(r.fulfillment_date, r.first_assigned_date); return d == null ? null : Math.max(0, d); }, scope: () => true }, + { key: 'preview', title: 'Time to Send Preview Link', unit: 'days', normKey: 'psla', + value: r => { const d = daysBetween(r.to_do_at, r.in_uat_at); return d != null && d >= 0 ? d : null; }, scope: () => true }, +]; + +function normDays(norm: number, unit: 'days' | 'hours'): number { + return unit === 'hours' ? norm / 24 : norm; +} + +export async function getSlaHeatmaps(): Promise { + const rows = await fetchRows(); + const cfg = loadConfig(); + const hidden = new Set(); // future: pm_kpi_settings.hidden + const pms = [...new Set(rows.map(r => r.assigned_to).filter((p): p is string => !!p && !hidden.has(p)))].sort(); + + return METRICS.map(def => { + const norms = (cfg.norms?.[def.normKey] ?? {}) as Record; + const grid: Record> = {}; + const totals: Record = {}; + + for (const pm of pms) { + grid[pm] = {}; + const pmRows = rows.filter(r => r.assigned_to === pm && def.scope(r)); + let tSum = 0, tN = 0, tOnTime = 0, tScored = 0; + for (const size of SIZES) { + const cellRows = pmRows.filter(r => r.size === size); + const vals = cellRows.map(def.value).filter((v): v is number => v != null && v >= 0); + const cell = cellFor(vals, norms[size], def.unit); + grid[pm][size] = cell; + tSum += vals.reduce((a, b) => a + b, 0); tN += vals.length; + if (norms[size] != null) { tOnTime += cell.onTime; tScored += vals.length; } + } + totals[pm] = { + avgDays: tN ? round2(tSum / tN) : null, count: tN, + onTime: tOnTime, onTimePct: tScored ? Math.round((tOnTime * 100) / tScored) : null, + }; + } + return { key: def.key, title: def.title, unit: def.unit, norms, pms, sizes: SIZES, grid, totals }; + }); +} + +function cellFor(valsDays: number[], normUnit: number | undefined, unit: 'days' | 'hours'): SlaCell { + if (!valsDays.length) return { avgDays: null, count: 0, onTime: 0, onTimePct: null }; + const avg = valsDays.reduce((a, b) => a + b, 0) / valsDays.length; + let onTime = 0, pct: number | null = null; + if (normUnit != null) { + const nd = normDays(normUnit, unit); + onTime = valsDays.filter(v => v <= nd).length; + pct = Math.round((onTime * 100) / valsDays.length); + } + return { avgDays: round2(avg), count: valsDays.length, onTime, onTimePct: pct }; +} +function round2(n: number): number { return Math.round(n * 100) / 100; } + +// Chart #17 — average time each Jira status is held, across all tickets that +// carry per-status durations (ms), rendered in the board's workflow column order. +// Statuses with < 2 tickets are dropped (matches the initial app). +export interface JiraDuration { status: string; avgDays: number; avgHours: number; count: number; } +export async function getJiraDurations(): Promise<{ order: string[]; rows: JiraDuration[] }> { + const cfg = loadConfig(); + const order = cfg.jiraColumns ?? []; + const { rows } = await pool.query<{ jira: { statusDurations?: Record } | null }>( + `SELECT jira FROM tickets WHERE jira ? 'statusDurations'`, + ); + const agg = new Map(); + for (const r of rows) { + const sd = r.jira?.statusDurations; + if (!sd) continue; + for (const [status, ms] of Object.entries(sd)) { + const v = Number(ms); + if (!Number.isFinite(v) || v <= 0) continue; + const a = agg.get(status) ?? { sum: 0, n: 0 }; + a.sum += v; a.n += 1; agg.set(status, a); + } + } + const result: JiraDuration[] = [...agg.entries()] + .filter(([, a]) => a.n >= 2) + .map(([status, a]) => ({ + status, + avgDays: round2(a.sum / a.n / 86_400_000), + avgHours: round2(a.sum / a.n / 3_600_000), + count: a.n, + })) + .sort((x, y) => { + const ix = order.indexOf(x.status), iy = order.indexOf(y.status); + if (ix !== -1 && iy !== -1) return ix - iy; + if (ix !== -1) return -1; + if (iy !== -1) return 1; + return y.avgDays - x.avgDays; + }); + return { order, rows: result }; +} + +export async function getConfig(): Promise> { + const { rows } = await pool.query<{ key: string; value: unknown }>('SELECT key, value FROM app_config'); + const out: Record = {}; + for (const r of rows) out[r.key] = r.value; + return out; +} diff --git a/server/auth.ts b/server/auth.ts new file mode 100644 index 0000000..1beacfb --- /dev/null +++ b/server/auth.ts @@ -0,0 +1,86 @@ +import session from 'express-session'; +import connectPgSimple from 'connect-pg-simple'; +import bcrypt from 'bcryptjs'; +import type { Request, Response, NextFunction, RequestHandler } from 'express'; +import { pool, ROLES, type Role } from './db'; + +// Session-cookie auth for the read UI (username + password), mirroring the Husky +// template. Sessions are stored in Postgres (connect-pg-simple) so they survive +// restarts and don't leak like MemoryStore. The sync ingest (/api/sync) uses its +// own bearer token and is unaffected. + +declare module 'express-session' { + interface SessionData { + user?: { username: string; role: Role }; + } +} + +const isProd = process.env.NODE_ENV === 'production'; + +export function sessionMiddleware(): RequestHandler { + const secret = process.env.SESSION_SECRET; + if (!secret) { + if (isProd) { + console.error('FATAL: SESSION_SECRET is required in production'); + process.exit(1); + } + console.warn('SESSION_SECRET unset — using an insecure dev fallback'); + } + const PgStore = connectPgSimple(session); + return session({ + store: new PgStore({ pool, tableName: 'user_sessions', createTableIfMissing: true }), + secret: secret || 'dev-insecure-secret-change-me', + resave: false, + saveUninitialized: false, + name: 'forge.sid', + cookie: { + httpOnly: true, + sameSite: 'lax', + secure: isProd, // requires HTTPS in prod (behind the reverse proxy) + maxAge: 7 * 24 * 60 * 60 * 1000, // 7 days + }, + }); +} + +// Gate for the read API. 401 (not 403) so the client drops to the login screen. +export function requireAuth(req: Request, res: Response, next: NextFunction): void { + if (req.session?.user) return next(); + res.status(401).json({ error: 'unauthenticated' }); +} + +// Gate requiring at least `min` role. 401 when unauthenticated (client → login), +// 403 when authenticated but under-privileged (permission error, stays put). +export function requireRole(min: Role): (req: Request, res: Response, next: NextFunction) => void { + const minRank = ROLES.indexOf(min); + return (req, res, next) => { + const user = req.session?.user; + if (!user) return void res.status(401).json({ error: 'unauthenticated' }); + if (ROLES.indexOf(user.role) < minRank) return void res.status(403).json({ error: 'forbidden' }); + next(); + }; +} + +// Verify a username/password against app_users. Returns {username, role} on +// success, null on any failure. Constant-time via bcrypt.compare; never logs the password. +export async function verifyLogin(username: string, password: string): Promise<{ username: string; role: Role } | null> { + if (!username || !password) return null; + try { + const { rows } = await pool.query<{ username: string; password_hash: string; role: Role }>( + 'SELECT username, password_hash, role FROM app_users WHERE username = $1', + [username], + ); + const row = rows[0]; + // Compare against a valid (never-matching) hash when the user is unknown, so + // the bcrypt work runs either way and login timing doesn't reveal whether the + // username exists. + const hash = row?.password_hash ?? '$2b$12$D.FzBg5Tc02/Jpq7efzno.0TATE/sQKIX1w4yGFz0K5qI5FRp3Qdu'; + const ok = await bcrypt.compare(password, hash); + if (!ok || !row) return null; + pool.query('UPDATE app_users SET last_login_at = NOW() WHERE username = $1', [row.username]) + .catch(err => console.error('last_login_at update failed:', (err as Error).message)); + return { username: row.username, role: row.role }; + } catch (err) { + console.error('verifyLogin error:', (err as Error).message); + return null; + } +} diff --git a/server/data/active_archive.json b/server/data/active_archive.json new file mode 100644 index 0000000..89cf7db --- /dev/null +++ b/server/data/active_archive.json @@ -0,0 +1 @@ +{"schema":2,"generatedAt":"2026-08-27T16:04:47.908Z","count":100,"tickets":[{"_updated":"2026-08-25 13:58:06","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 13:58:06 - Alesya Prolagayeva (Additional comments)\nHello, ready\n\nhttps://hkx-finish-au-dev-bf02--branch-ritm2653436-dorq4mvp.web.app/\nhttps://hkx-finish-id-dev-bf02--branch-ritm2653436-du8213k4.web.app/\nhttps://hkx-finish-nz-dev-bf02--branch-ritm2653436-a1gqjhdk.web.app/\nhttps://hkx-finish-vn-dev-bf02--branch-ritm2653436-oa6c7lfj.web.app/\nhttps://hkx-finish2-cl-dev-fe03--branch-ritm2653436-ont74dd4.web.app/\nhttps://hkx-finish-it-dev-bf02--branch-ritm2653436-yidg6wlr.web.app/\nhttps://hkx-finish-ar-dev-bf02--branch-ritm2653436-h5pysnec.web.app/\nhttps://hkx-finish-com-dev-bf02--branch-ritm2653436-yclfb21a.web.app/\n\n2026-08-21 13:07:35 - Rowena Hearn (Additional comments)\nMarket review! Pls can you share the links again. Sorry\n\n2026-07-10 12:51:12 - Alesya Prolagayeva (Additional comments)\nHi Row, done:\n\nhttps://hkx-finish-au-dev-bf02--branch-ritm2653436-8ixtll9k.web.app/\nhttps://hkx-finish-com-dev-bf02--branch-ritm2653436-d1s12dvz.web.app/\nhttps://hkx-finish-id-de","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=fe3d0aa22b2d32d49bb2fe61de91bf1b&sysparm_record_target=task&sysparm_record_row=1&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 13:58:06","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-21 13:07:35","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-10 12:51:12","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-08 11:24:36","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-08 12:07:06","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-04 11:41:40","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-03 18:15:51","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-01 16:57:02","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-29 16:30:10","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-27 12:35:16","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-27 12:35:08","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-27 12:14:16","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-27 12:13:46","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-27 12:09:37","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-27 11:56:56","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-27 11:47:08","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-26 18:50:46","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-05-26 18:50:13","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-26 18:49:54","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-18 12:08:39","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-14 13:52:32","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-11 15:27:45","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-05-08 16:51:22","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-08 11:31:29","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-22 19:28:08","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-22 10:54:55","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-20 12:56:01","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-09 10:23:18","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-08 18:51:02","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-04-07 09:18:16","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-04-07 09:18:15","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-07 09:17:56","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-01 18:10:30","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-31 14:45:57","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-31 11:07:48","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-31 11:07:24","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-31 10:51:54","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-30 14:04:04","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-27 18:45:37","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-27 18:44:47","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-18 19:20:48","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-18 15:44:32","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-18 11:10:42","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-16 18:32:32","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-12 18:37:04","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-03-12 17:41:59","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-03-12 17:41:51","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-12 17:41:09","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-12 17:17:57","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-11 15:51:02","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-09 13:08:09","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-06 15:30:09","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-05 16:04:25","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-05 16:03:22","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-05 15:17:45","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-05 14:02:16","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-03-05 13:36:52","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-04 16:20:19","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-04 11:43:54","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-04 11:37:24","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-02 16:25:27","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-02 14:51:07","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-02 12:47:23","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-02 12:38:26","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-27 16:55:33","who":"Rowena Hearn"},{"kind":"comment","t":"2026-02-25 20:43:21","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-20 17:55:37","who":"Rowena Hearn"},{"kind":"comment","t":"2026-02-19 12:54:05","who":"Rowena Hearn"},{"kind":"comment","t":"2026-02-09 14:20:02","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-04 17:11:29","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-01-30 18:21:57","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-01-30 18:14:44","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-01-30 14:48:27","who":"Rowena Hearn"},{"kind":"comment","t":"2026-01-30 11:27:39","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-01-26 16:30:47","who":"Rowena Hearn"},{"kind":"comment","t":"2026-01-26 14:06:32","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-01-13 21:11:40","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-01-08 17:33:12","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-01-06 18:27:54","who":"Rowena Hearn"},{"kind":"comment","t":"2025-12-29 18:14:03","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2025-12-18 16:50:01","who":"Rowena Hearn"},{"kind":"comment","t":"2025-12-18 14:06:35","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2025-12-10 13:58:11","who":"Rowena Hearn"},{"kind":"comment","t":"2025-12-04 13:17:11","who":"Rowena Hearn"}],"brand":"Finish","description":"Hello Alesya, \r\n\r\nThis is a ticket for ALL Finish websites on Husky X. We have some brand world updates:\r\n\r\nUpdate to the Finish brand world - Please see the new design file, here - https://www.figma.com/design/cuMKetHlBX45OdmpSaQmYL/Finish-%E2%80%93-L2-Layouts?node-id=16770-53940&p=f&t=gcggVCS8kAUY5kAN-0. Ensure you are looking at the tab titled 'New brand world adjustments'. At first (like me!) you might find it hard to see what has been done here, so I am summarising below:\r\n\r\nCorrection of colours. This has meant heavier usage of the bright blue (See Wir Helfen Ihnen) and introduction of red (Just above base of the footer). On web, red usually indicates an action, so this has been quite difficult to do.\r\n\r\nLogo updated\r\n\r\nPDP template has slightly changed with the banners featuring product benefits being slightly lengthened, and the addition of blue and red on instructions.\r\n\r\nThe changes here are subtle, so please make your way through the file and let me know if you have any questions or requested changes.\r\n\r\nCan we apply this to all websites with minimal impact? Looking to do this ASAP. Please can you let me know quote and websites that can be done.","dueDate":"2025-12-18","lastActivityAt":"2026-08-25 13:58:06","lastActivityBy":"Alesya Prolagayeva","market":"Ireland","openedAt":"2025-12-04 13:17:11","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-25 13:58:06","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2653436","shortDesc":"Finish - Brand World update","state":"Awaiting User Info"},{"_updated":"2026-08-21 14:19:44","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 14:19:44 - Alesya Prolagayeva (Additional comments)\nHello Row, it's live! Including the latest change. Please let me know if I can close the ticket\n\n2026-08-19 12:37:40 - Rowena Hearn (Additional comments)\nHello, thanks! Please can you also change 'faster drying' to 'drying' on the PDP (Benefits section)? You can push straight to live. No need for further review\n\n2026-08-18 16:55:45 - Alesya Prolagayeva (Additional comments)\nHey Row,\n\npoints 1 and 3 are ready https://hkx-finish2-uk-dev-fe03--branch-ritm2653860-vb8h24tt.web.app/\n\npoint 2 - I'm afraid we could not reproduce. But is we unerstand the request correctly this would not be a good practice to fix it (making the text smaller)\n\n2026-08-14 16:28:26 - Rowena Hearn (Additional comments)\nHello\n1. Please remove 'faster' from the 'faster drying' in the benefits section\n2. On the 'Clean Machine' card is there anyway to guarantee the words appear on their own lines within mobile? At the moment MA CHINE is split on two line","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=8e6593aefba5b298619ef3aa4eefdca7&sysparm_record_target=task&sysparm_record_row=2&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-21 14:19:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-19 12:37:41","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-18 16:55:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-14 16:28:26","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-07 19:57:56","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-03 14:49:19","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-03 13:59:30","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-03 13:48:05","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-27 18:49:58","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-27 15:24:36","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-27 14:36:15","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-24 12:13:49","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-24 12:12:28","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-20 12:48:03","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-14 12:23:07","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-07-10 18:10:10","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-10 18:09:58","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-08 11:21:16","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-28 17:43:48","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-05-22 18:12:40","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-22 18:11:47","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-04-30 19:29:56","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-04-30 19:29:54","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-30 19:29:19","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-04-22 19:38:22","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-22 19:38:05","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-09 10:24:09","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-08 18:59:14","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-08 15:51:54","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-08 12:30:15","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-27 12:51:58","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-23 18:00:40","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-13 16:27:41","who":"Rowena Hearn"},{"kind":"comment","t":"2026-02-13 17:22:03","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2025-12-18 17:19:00","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2025-12-04 18:32:32","who":"Rowena Hearn"}],"brand":"Finish","description":"MASTER WILL BE UK. \r\n\r\nThis is for the design and build of a landing page, HP banner and PDP for Finish Rinse Aid. \r\n\r\nPlease review the brief - https://rbcom.sharepoint.com/:p:/s/CGO_DigitalTeam/EaXzagsO4SFAnFsGIzWTGk0BZzZGkoB98lfMO09Y5plZ9w?e=a9iuZZ - please assign a designer, get them to go through the assets and then please can we have a call to go through the brief and any questions next week?\r\n\r\nAssets are here - https://rbcom.sharepoint.com/:f:/s/CGO_DigitalTeam/EvLZldf-cyJAtC_o18vEwgIBNkp7bMXFAJmWjy9flv70qQ?e=rpO7Ep\r\n\r\n\r\nWhile you can find all the campaign related information in the briefing documents, for the design I wanted to follow a similar approach as other Landing Pages - i.e. Key Visual → Benefits → Buy Now → Video → Full regime Key Visual.\r\n\r\nCould you share some recommendations please. Also, I am not so sure on the benefit section for additives as I see on the website they appear as icons. Could you suggest similar view and we can check with the CAP team on what works the best.\r\n\r\nThanks, Row","dueDate":"2025-12-25","lastActivityAt":"2026-08-21 14:19:45","lastActivityBy":"Alesya Prolagayeva","market":"Ireland","openedAt":"2025-12-04 18:32:32","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-21 14:19:45","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2653860","shortDesc":"Finish Canopus EPD - Rinse Aid","state":"Awaiting User Info"},{"_updated":"2026-08-26 16:50:21","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 16:50:20 - Alesya Prolagayeva (Additional comments)\nRow, we're live! Please confirm we can close the ticket\n\n2026-08-21 16:48:54 - Rowena Hearn (Additional comments)\nHello, please can you remove this disclaimer 'Finish brand is #1 global value sales in Automatic Dishwashing Category (Source: NielsenIQ RMS data).' - I can see it on mobile but not desktop\n\nCan you please make sure that on the Machine Cleaner card 'Clean Machine' appears on two lines on mobile at as many resolutions as possible. On standard mobile it's currently cutting the word MA CHINE\n\nNo need for me to check again, this can go straight to live\n\n2026-08-21 14:31:37 - Alesya Prolagayeva (Work notes)\nReason: Medical Review\n\n2026-07-27 11:45:00 - Alesya Prolagayeva (Additional comments)\nAwaiting User info\n\n2026-07-21 12:39:18 - Rowena Hearn (Additional comments)\nwith market for review. thanks\n\n2026-07-20 20:53:19 - Alesya Prolagayeva (Additional comments)\nHello Row, please find the preview link https://hkx-fini","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=b60957eefbe5b298619ef3aa4eefdcb0&sysparm_record_target=task&sysparm_record_row=3&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 16:50:21","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-21 16:48:54","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-08-21 14:31:37","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-27 11:45:01","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-21 12:39:18","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-20 20:53:19","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-13 16:08:58","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-10 17:46:42","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-07 13:34:30","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-06 19:07:51","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-06 16:37:48","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-06 16:33:22","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-02 12:48:15","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-22 13:16:17","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-21 11:23:27","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-21 10:45:25","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-05-15 16:46:01","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-15 16:45:48","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-27 18:40:52","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-22 19:39:07","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-16 10:53:10","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-10 12:33:25","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-08 12:30:45","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-31 16:09:31","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-23 18:01:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-13 16:43:27","who":"Rowena Hearn"},{"kind":"comment","t":"2026-02-13 17:22:32","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2025-12-04 18:48:25","who":"Rowena Hearn"}],"brand":"Finish","description":"MASTER WILL BE UK. \r\n\r\nThis is for the design and build of a landing page, HP banner and PDP for Finish Machine Cleaner.\r\n\r\nPlease review the brief -https://rbcom.sharepoint.com/:p:/r/sites/CGO_DigitalTeam/Shared%20Documents/04.%20Household/1.%20FINISH/Websites/2026%20Campaign%20LP%20briefs/Finish%20EPD%20-%20Chimera%20website%20brief.pptx?d=w6d457fce25a0465790ed499b09389c2f&csf=1&web=1&e=N231pN - please assign a designer, get them to go through the assets and then please can we have a call to go through the brief and any questions next week?\r\n\r\nAssets are here - https://rbcom.sharepoint.com/:f:/s/CGO_DigitalTeam/Eg9ONEuz6IxKp1m2dISBsWIBIjB0cycF4FEJGs8aqHv0mg?e=em1dlM\r\n\r\nWhile you can find all the campaign related information in the briefing documents, for the design I wanted to follow a similar approach as other Landing Pages - i.e. Key Visual → Benefits → Buy Now → Video → Full regime Key Visual.\r\n\r\nCould you share some recommendations please. Also, I am not so sure on the benefit section for additives as I see on the website they appear as icons. Could you suggest similar view and we can check with the CAP team on what works the best.\r\n\r\nThanks, Row","dueDate":"2025-12-25","lastActivityAt":"2026-08-26 16:50:21","lastActivityBy":"Alesya Prolagayeva","market":"Ireland","openedAt":"2025-12-04 18:48:25","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-26 16:50:21","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2653874","shortDesc":"Finish Chimera EPD - Machine Cleaner","state":"Awaiting User Info"},{"_updated":"2026-07-29 17:44:46","_updatedBy":"TSamoyle","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-07-29 17:44:46 - Tatyana Samoylenko (Additional comments)\nHi Rowena, the changes have been implemented. Could you please review on your end? \nhttps://hkx-finish2-uk-dev-fe03--branch-ritm2683607-6dmt61xo.web.app/finish-ultimate-plus/\n\nLooking forward to your feedback. \n\n2026-07-27 15:22:29 - Rowena Hearn (Additional comments)\nSorry, should be: Based on the local market shares of dishwasher manufacturers who recommend Finish (Based on GfK Market Intelligence: Sales Tracking data for DISHWASHERS in GREAT BRITAIN for the 12-month period ending 31.12.2025. GfK Panelmarket, Sales Units. Copyright © 2026”, Nielsen Consumer, LLC)\n\n2026-07-27 14:40:37 - Alesya Prolagayeva (Additional comments)\nHello there, waiting for the clarification about disclaimer. I received the comment in defferent ticket instead\n\n2026-07-23 17:01:48 - Alesya Prolagayeva (Additional comments)\nHi Row,\nplese could you clarify about disclaimer - we need to replace *Finish brand is #1 global value sales in Automatic","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=1b778a6133523adc26e5d042cd5c7b0b&sysparm_record_target=task&sysparm_record_row=4&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-07-29 17:44:46","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-27 15:22:29","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-27 14:40:37","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-23 17:01:48","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-13 16:12:40","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-07-13 16:12:17","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-13 16:11:59","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-08 12:02:11","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-03 11:47:52","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-22 15:55:00","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-12 18:43:53","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-09 12:35:23","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-08 19:42:01","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-03 11:22:16","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-07 15:27:36","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-05 12:30:23","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-04 19:23:57","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-22 19:33:39","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-20 11:48:37","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-10 12:32:49","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-10 09:47:53","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-09 15:37:27","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-09 14:24:39","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-08 12:29:53","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-02 16:36:11","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-02 15:36:39","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-02 15:17:05","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-02 11:49:09","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-01 18:12:16","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-30 16:35:11","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-30 14:09:11","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-23 13:46:27","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-23 13:41:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-19 11:49:27","who":"Rowena Hearn"},{"kind":"comment","t":"2026-01-07 17:05:16","who":"Rowena Hearn"}],"brand":"Finish","description":"Hello, \r\n\r\nSame as Dettol UK, we have a design here that is (almost) but not yet finalised. This will/needs to go live in February on the UK website, with one new article, and with edits to one existing article. \r\n\r\nhttps://www.figma.com/design/sk4KjrzJIGTuHOGiIdbitH/Finish?node-id=17002-17002&p=f&t=Ory9eWe8ss9z1uzx-0\r\n\r\nPlease can you quote for it?\r\n\r\nThanks, Row","dueDate":"2026-01-21","lastActivityAt":"2026-07-29 17:44:46","lastActivityBy":"Tatyana Samoylenko","market":"Ireland","openedAt":"2026-01-07 17:05:16","requestedFor":"Rowena Hearn","stateChangedAt":"2026-07-29 17:44:46","stateChangedBy":"Tatyana Samoylenko"},"number":"RITM2683607","shortDesc":"Finish UK - Hubble","state":"Awaiting User Info"},{"_updated":"2026-08-21 14:31:45","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 14:31:45 - Alesya Prolagayeva (Work notes)\nReason: Medical Review\n\n2026-07-06 20:37:23 - Alesya Prolagayeva (Additional comments)\nHello Row, finally it was all fixed.\nhttps://hkx-durex-es-dev-eabb.web.app/pages/lubricantes\npreview link.\n\nThe budget extension needed: 700 GBP. This includes (besides the changes requested by market) communication with ITnD on the bugs of HX (no alts, then problem with B+, then problem with B+ for single variant) - it all required investigation, raising tickets to OpEx, testing after tickets' Completenes. Also within this weeks we had to update the version twice, which also inluded development and qa involvment (update, test, bugfix). Let me know if you need more details\n\n2026-06-22 11:56:04 - Rowena Hearn (Additional comments)\nLet me know by how much. Let me know the ITD ticket ref, please!\n\n2026-06-16 20:45:11 - Alesya Prolagayeva (Additional comments)\nStill in progress - issue on ITnD side, raised another ticket.\n\nWill need to extend th","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=e7ac41b32b5e3a988edffb2a6e91bf57&sysparm_record_target=task&sysparm_record_row=5&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"worknote","t":"2026-08-21 14:31:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-06 20:37:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-22 11:56:04","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-16 20:45:11","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-06-09 14:05:16","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-09 14:04:59","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-22 10:45:15","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-18 12:59:31","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-05-05 14:18:13","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-05 14:18:01","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-04-28 15:55:21","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-28 15:55:06","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-28 15:54:02","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-22 19:29:24","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-22 12:19:14","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-21 19:15:17","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-20 16:45:19","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-04-12 21:20:46","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-12 21:20:35","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-23 18:09:20","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-18 19:19:31","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-03-18 18:21:43","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-18 18:21:31","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-05 15:20:16","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-05 14:19:02","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-03 18:07:44","who":"Rowena Hearn"},{"kind":"comment","t":"2026-01-14 21:49:16","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-01-14 12:34:39","who":"Rowena Hearn"}],"brand":"Durex","description":"Hello DA, \r\n\r\nTicket for the building of this landing page for Lubes on Spain - https://www.figma.com/design/WpT8uoZXLcvXqkerLrWpOR/Durex?node-id=16879-24772&t=NaKvjbvy4s70u0Ut-1\r\n\r\nWithin the same ticket, will also need ALL pack shots across 94 products to be replaced. This should include B+ images. See matrix here (As yet unpopulated, but will include links to images and Spain content for the Figma file)\r\n\r\nhttps://rbcom.sharepoint.com/:x:/r/sites/CGO_DigitalTeam/Shared%20Documents/07.%20Web%20%26%20IT%20Projects/2025/3.%20NPD%27s%20%26%20BDI%27s/Durex%20-%20Horizon/Files%20for%20build/Products%20%26%20Horizons%20Matrix.xlsx?d=wb7cb880e78a34e4f8434d8d6c004e748&csf=1&web=1&e=IACAUT\r\n\r\nPlease can you quote for this ticket with the expectation that the content will come in the next few weeks?\r\n\r\nThanks, Row","dueDate":"2026-03-31","lastActivityAt":"2026-08-21 14:31:45","lastActivityBy":"Alesya Prolagayeva","market":"Spain","openedAt":"2026-01-14 12:34:39","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-21 13:42:22","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2692105","shortDesc":"Durex ES - Horizons/Lubes BDI","state":"On hold"},{"_updated":"2026-08-19 16:46:37","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-19 16:46:37 - Alesya Prolagayeva (Additional comments)\nExpecting a new ticket with feedback from Vera Mavriki\n\n2026-08-14 19:50:25 - Alesya Prolagayeva (Additional comments)\nI'll close the ticket when Vera will raise a new one\n\n2026-07-16 11:12:30 - Alesya Prolagayeva (Work notes)\nComment from Vera Mavriki on July 15th\n\nHello Alesya,\nNice to meet you too. Isis before leaving, and also Joana, informed me about the status of the website and the following steps, so I am aware.\nRegarding the ticket, soon, i will submit a new one to proceed the process and the communication there.\nAs for the current status of the preview, i have to review the second version for the new site.\n \n\n2026-07-03 10:33:03 - Isis Braye (Inactive) (Additional comments)\nOk in this case we will do that. But can you check before closing this ticket that if there any possibility to replace the name of this ticket ? Her name is Vera Mavriki. Thanks a lot!\n\n2026-06-30 18:35:34 - Alesya Prolagayeva (Additiona","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=213703effb66be1c619ef3aa4eefdcaa&sysparm_record_target=task&sysparm_record_row=6&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-19 16:46:37","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-14 19:50:25","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-07-16 11:12:30","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-03 10:33:03","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-06-30 18:35:34","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-26 16:48:46","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-06-25 14:42:52","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-06-25 14:35:26","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-25 11:02:41","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-06-24 19:17:57","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-24 11:00:07","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-06-23 10:22:44","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-06-22 20:02:16","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-22 19:59:46","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-22 13:32:33","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-06-15 20:42:21","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-12 12:25:31","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-06-11 17:09:34","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-11 12:55:59","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-06-10 11:41:58","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-09 16:13:56","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-06-03 10:24:37","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-06-02 17:37:50","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-02 17:37:26","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-06-01 10:30:35","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-06-01 10:30:07","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-05-29 17:16:22","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-27 15:59:26","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-05-21 12:43:07","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-05-21 12:43:02","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-05-15 17:19:52","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-05-14 10:53:20","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-13 17:01:42","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-05-13 14:20:11","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-12 11:01:47","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-05-12 10:31:18","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-05-12 10:31:16","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-05-12 10:29:51","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-05-12 10:29:40","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-05-12 10:29:34","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-05-12 10:29:22","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-05-12 10:25:27","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-05-08 17:37:26","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-05-08 17:06:25","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-06 10:43:13","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-05-05 17:28:36","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-05 16:35:15","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-05-05 16:34:54","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-05-05 16:34:54","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-05-05 16:34:53","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-05-05 16:34:51","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-05-05 16:34:50","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-03-30 16:56:46","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-30 10:20:58","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-03-27 15:44:17","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-17 16:42:19","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-03-16 19:32:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-16 19:32:16","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-16 16:52:42","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-03-16 16:50:33","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-03-10 11:14:53","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-10 11:14:42","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-09 11:16:28","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-03-09 11:15:51","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-03-06 18:47:24","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-06 18:21:36","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-06 17:23:53","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-03-05 12:08:55","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-03-04 16:46:57","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-03 17:26:52","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-02-26 19:22:01","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-25 20:32:56","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-24 14:49:09","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-02-20 11:25:01","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-02-20 10:15:02","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-19 10:17:25","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-02-18 12:17:18","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-17 17:10:39","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-02-13 15:18:59","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-06 12:29:59","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-02-06 12:29:11","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-05 14:37:08","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-02-05 00:18:36","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-02 12:16:39","who":"Isis Braye (Inactive)"},{"kind":"comment","t":"2026-01-30 18:12:14","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-01-30 11:31:05","who":"Isis Braye (Inactive)"},{"kind":"worknote","t":"2026-01-29 20:10:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-01-29 20:03:22","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-01-27 12:03:03","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-01-26 13:07:13","who":"Isis Braye (Inactive)"}],"brand":"Gaviscon","description":"Hello, \r\nWe would like to launch Gviscon website for BE (Belgium) for end of March 2026. To launch it, we want to use the same website base as UK Husky X. For your information, we already opened a ticket last year (RITM2322451 - Husky 2). \r\n\r\nWhat we need to do to lauch gaviscon BE website ?\r\nWe would like to have website live end of March 2026. \r\n\r\nAlso, do we need to fill the content matrix in attachment ? If yes, can you explain us how to fill it? \r\n\r\nThanks for your help and return ! Best regards,","dueDate":"2026-03-30","lastActivityAt":"2026-08-19 16:46:37","lastActivityBy":"Alesya Prolagayeva","market":"Belgium","openedAt":"2026-01-26 13:07:13","requestedFor":"Isis Braye (Inactive)","stateChangedAt":"2026-08-19 16:46:37","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2705568","shortDesc":"Launch gaviscon website for BE","state":"Awaiting User Info"},{"_updated":"2026-08-27 14:47:58","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 14:47:58 - Alesya Prolagayeva (Work notes)\nChecking with naz.beedassy@reckitt.com\n\n2026-05-08 17:08:54 - Alesya Prolagayeva (Additional comments)\nHi Karla Bianca, please let me know if we can release the changes and close the ticket\n\n2026-04-10 10:01:53 - Alesya Prolagayeva (Work notes)\nAttachment: DA_Letterhead_DATAART_UK_Costs_RITM2715970.pdf has been attached.\n\n2026-04-10 10:00:36 - Alesya Prolagayeva (Additional comments)\nHi Karla Bianca, we removed the claim on all the sizes and scents of Dettol Laundry Cleanser (Cotton, Lavender). please confirm it works and approve the go live.\n\nI'm attaching the quote here\n\n2026-04-07 10:58:04 - Karla Bianca Parungo Valenzuela (Inactive) (Additional comments)\nHi Alesya -can you email me the quotation please so I can raise the PO? Also if you can confirm where else these will be taken down from to help justify and show the scope of the 120 GBP quotation. Thank you!\n\n2026-04-03 17:41:43 - Alesya Prolagayeva (Additional comments)\nHi K","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=1c0138da3bfe3e94fa9d2f37f4e45abf&sysparm_record_target=task&sysparm_record_row=7&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"worknote","t":"2026-08-27 14:47:58","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-08 17:08:54","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-04-10 10:01:53","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-10 10:00:36","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-07 10:58:04","who":"Karla Bianca Parungo Valenzuela (Ina..."},{"kind":"comment","t":"2026-04-03 17:41:43","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-09 19:03:46","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-03 15:14:14","who":"Karla Bianca Parungo Valenzuela (Ina..."}],"brand":"Dettol","description":"Claim is not supportable and therefore needs to be removed from the website","dueDate":"2026-02-06","lastActivityAt":"2026-08-27 14:47:58","lastActivityBy":"Alesya Prolagayeva","market":"United Kingdom","openedAt":"2026-02-03 15:14:14","requestedFor":"Karla Bianca Parungo Valenzuela (Inactive)","stateChangedAt":"2026-04-10 10:00:36","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2715970","shortDesc":"Need help to remove a claim on Dettol Laundry Sanitiser website","state":"Awaiting User Info"},{"_updated":"2026-08-25 14:51:18","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 14:51:18 - Alesya Prolagayeva (Additional comments)\nHello, https://hkx-gaviscon-es-dev-72d6.web.app/ ready\n\n2026-08-25 13:48:06 - Rowena Hearn (Additional comments)\nHello, when will these changes be made?\n\n2026-08-17 16:18:03 - Alesya Prolagayeva (Additional comments)\nRowena, FYI I see no answers yet\n\n2026-08-10 16:10:01 - Rowena Hearn (Additional comments)\nMarket will begin leaving responses\n\n2026-08-10 15:45:28 - Alesya Prolagayeva (Additional comments)\nHello Row, quick reminder on the questions in pdf - need your answers there. Thanks\n\n2026-07-31 16:10:53 - Rowena Hearn (Additional comments)\nApproved and added to the sheet\n\n2026-07-31 14:16:27 - Elizaveta Nyarko (Additional comments)\nHi Rowena,\nI hope you are doing well. \n\nCost estimation for the addtional changes is 600 GBP, please approve. \n\nBest regards, \nElizaveta \n\n2026-07-27 15:30:18 - Rowena Hearn (Additional comments)\nHello there - As per usual, the health authorities have fed back on the entire site, rather","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=2d69770d3b077290589d8c8a25e45a5a&sysparm_record_target=task&sysparm_record_row=8&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 14:51:18","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-25 13:48:06","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-17 16:18:03","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-10 16:10:01","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-10 15:45:28","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-31 16:10:53","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-31 14:16:27","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-27 15:30:18","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-17 10:34:06","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-08 11:28:37","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-16 13:47:48","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-15 18:08:16","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-15 16:57:11","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-15 11:08:09","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-07 15:22:57","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-28 16:16:17","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-28 12:53:54","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-24 12:17:16","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-23 23:05:58","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-23 12:52:56","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-22 12:09:04","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-04-22 11:47:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-22 11:46:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-10 12:41:24","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-09 13:56:36","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-08 11:15:19","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-07 19:21:28","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-19 15:38:40","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-16 17:06:28","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-09 12:30:11","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-05 16:51:26","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-27 11:51:59","who":"Rowena Hearn"},{"kind":"comment","t":"2026-02-17 11:11:56","who":"Rowena Hearn"},{"kind":"comment","t":"2026-02-17 11:11:12","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-17 11:09:24","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-12 18:53:04","who":"Rowena Hearn"}],"brand":"Gaviscon","description":"Not to be started until website on Husky X. \r\n\r\nFor this, you will be adding a Homepage banner, a Landing Page, and adding the Mixed Berry variant to x1 product page.\r\n\r\nThe content Matrix is here, please refer to \r\n'Twins Homepage banner' and 'Landing Page'\r\n\r\nhttps://rbcom.sharepoint.com/:x:/s/CGO_DigitalTeam/IQA_eViQiMRAT44s2FZUrHeJAcFjDmjnhtH7MLD2uPR-m4I?email=Alesya.Prolagayeva1%40reckitt.com&e=d1sA0e\r\n\r\nThe design file is here: \r\n\r\nYou will see there are multiple design iterations. Lendl is for established markets, and Twins is for newer markets. Some markets are launching new flavour, some are launching new format and some are launching both. The content matrix caters for this, so I hope it is clear.\r\n\r\nFor the avoidance of doubt - Spain are using TWINS, with the NEW FLAVOUR only, added on to the existing product: https://www.gaviscon.es/nuestros-productos/gaviscon-forte-suspension-oral-en-sobres/\r\n\r\nPlease put disclaimer numbers in sub-script and put the text at the bottom of the page.\r\n\r\nFor the time being, please provide cost and timeline once this is live on HX.","dueDate":"2026-02-26","lastActivityAt":"2026-08-25 14:51:18","lastActivityBy":"Alesya Prolagayeva","market":"Spain","openedAt":"2026-02-12 18:53:04","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-25 14:51:18","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2728854","shortDesc":"Gaviscon DADA - Spain","state":"Awaiting User Info"},{"_updated":"2026-08-19 16:49:22","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-08-19 16:49:22 - Alesya Prolagayeva (Additional comments)\nStill in UAT and approvals with DK - with Elia Adiel\n\n2026-07-09 11:47:23 - Alesya Prolagayeva (Additional comments)\nHello! Yes, I will, Alicia left Reckitt, I will reach out to Lucia for feedback\n\n2026-07-08 11:19:39 - Rowena Hearn (Additional comments)\nCan you let me know when Denmark is live and then you can close this ticket?\n\n2026-05-14 13:28:14 - Rowena Hearn (Additional comments)\nHello! Happy to cover all 3k for the Denmark build. UK have confirmed they won't be proceeding with this campaign. How is DK going? Who are you working with on it?\n\n2026-05-13 17:21:12 - Alesya Prolagayeva (Additional comments)\nHelllo, we spent 2K for design here. The other 3K were secured for the build on the UK. Do you wish to cover all 3K for Denmark build, and when the UK comes it will be a sepaarte budget?\n\n2026-04-20 12:39:28 - Rowena Hearn (Additional comments)\nAlesya, please use one of the Nordics website as master. I will fund the 5","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=a94d5f562b0f7e1011d9f47ebe91bfcb&sysparm_record_target=task&sysparm_record_row=9&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-19 16:49:22","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-09 11:47:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-08 11:19:39","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-14 13:28:14","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-13 17:21:13","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-20 12:39:28","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-20 11:56:08","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-03 17:21:59","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-02-16 14:02:36","who":"Rowena Hearn"}],"brand":"Vanish","description":"Design & Build on UK - DataArt","dueDate":"2026-02-27","lastActivityAt":"2026-08-19 16:49:22","lastActivityBy":"Alesya Prolagayeva","market":"United Kingdom","openedAt":"2026-02-16 14:02:36","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-19 16:49:22","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2731698","shortDesc":"Vanish - Thanos","state":"Awaiting User Info"},{"_updated":"2026-08-25 15:03:23","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 15:03:23 - Alesya Prolagayeva (Additional comments)\nHello Row, the NL - released. Statuses for all:\n\nMiddle East - please confirm we can start working, it's on HX now\nFrance - no content, please provide as soon as you can\n\nSouth Africa - BUAT, please let us now if we can push it live\nIreland - BUAT, please let us now if we can push it live\n\nthe NL - live\nthe UK - live\n\n2026-08-21 14:41:25 - Alesya Prolagayeva (Additional comments)\nHello Row, as agreed we will push NL live. Please could you check with the ME team if we can start working? It's on HX already https://www.gavisconme.com/\n\n2026-08-21 13:11:32 - Alesya Prolagayeva (Additional comments)\nto release th NL\n\n2026-08-10 16:44:03 - Alesya Prolagayeva (Additional comments)\nHello, the UK is live (released and tested within Lendl ticket).\n\nCould you pleae confirm about the NL - should we release or not\n\n2026-08-10 16:13:14 - Rowena Hearn (Additional comments)\nCan UK pls go live\n\n2026-08-10 16:10:33 - Rowena Hearn","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=b5b732a72bdffe14f1d9f268f291bfa6&sysparm_record_target=task&sysparm_record_row=10&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 15:03:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-21 14:41:26","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-21 13:11:32","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-10 16:44:03","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-10 16:13:14","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-10 16:10:33","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-07 20:11:09","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-06 11:53:09","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-25 14:42:51","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-25 13:51:15","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-25 13:46:17","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-08 17:10:28","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-07 16:06:36","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-07 15:20:32","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-29 00:39:53","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-20 12:07:11","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-10 14:04:32","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-10 14:04:12","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-26 10:21:13","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-24 11:06:08","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-23 17:09:10","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-23 17:05:33","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-19 16:54:13","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-13 12:16:16","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-04 18:46:36","who":"Rowena Hearn"}],"brand":"Gaviscon","description":"Hello there, \r\n\r\nPlease see design file here - https://www.figma.com/design/Y4lONk35u0BZlYhGkElrpX/Gaviscon-%F0%9F%8D%94-Website-Design-Library?node-id=1-20024&t=jSuYo6I0MgWYk5hm-1 - EXTREMELY MINOR change of the badge reading 'No added colourant'\r\n\r\nThis needs to be added to the following PDPs, so 7 pages in total. This will only be done when I provide translations and when all are on HX. For the time being, please provide cost estimate? :\r\n\r\nFrance \r\n\r\nhttps://www.gavisconell.fr/ \r\nExact PDP tbc\r\n\r\nIreland\r\n\r\nhttps://www.gaviscon.ie/ \r\nGaviscon Liquid Peppermint Flavour Oral Suspension | Gaviscon IE\r\n\r\nMiddle East\r\n\r\nhttps://www.gavisconme.com/\r\nGaviscon Original Liquid | Gaviscon (Both EN and AR)\r\n \r\n\r\nNetherlands\r\n\r\nhttps://www.gaviscon.nl/ \r\nhttps://www.gaviscon.nl/producten/gaviscon-pepermunt-en-anijs-suspensie/\r\n \r\n\r\nSouth Africa\r\n\r\nhttps://www.gaviscon.co.za/\r\nhttps://www.gaviscon.co.za/products/gaviscon-original/gaviscon-liquid-aniseed/\r\n \r\n\r\nUK\r\n\r\nhttps://www.gaviscon.co.uk/ \r\nGaviscon Original Liquid Bottle For Acid Reflux | Gaviscon UK","dueDate":"2026-05-01","lastActivityAt":"2026-08-25 15:03:23","lastActivityBy":"Alesya Prolagayeva","market":"United Kingdom","openedAt":"2026-03-04 18:46:36","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-25 15:03:23","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2752888","shortDesc":"Gaviscon Scarlet","state":"Awaiting User Info"},{"_updated":"2026-07-30 19:20:23","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-07-30 19:20:23 - Tatyana Samoylenko (Additional comments)\nHi Rowena, Thomas.\nI hope you're doing well. \nCould you please let me know when you expect to share the updates with us? \n\n2026-07-15 22:49:48 - Tatyana Samoylenko (Additional comments)\nThank you, Rowena, for the update. We will keep this ticket open, so there is no need to create a new one. \nWill wait for the information, then. \n\n2026-07-15 18:12:26 - Rowena Hearn (Additional comments)\nHello DataArt, just FYI I am working with Thomas on this project now. The scope will be: New products, new landing page, new articles, update to product finder. This will also be funded by me. If this ticket expires, I will raise a new one. SoW will need to include design work, too. Have given Lilit the heads up.\n\n2026-07-15 17:01:10 - Tatyana Samoylenko (Additional comments)\nThank you, Thomas, for getting back to me. \nSo, waiting for the additional details and materials from your end to proceed with this request.\n\n2026-07-15 16:15:07 -","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=51194015fbafba10beb7f55dbeefdc6f&sysparm_record_target=task&sysparm_record_row=11&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-07-30 19:20:23","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-15 22:49:48","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-15 18:12:26","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-15 17:01:10","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-15 16:15:08","who":"Thomas Britton"},{"kind":"comment","t":"2026-07-15 16:04:46","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 23:05:57","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-01 20:20:29","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-04-16 17:37:38","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-16 17:36:27","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-03 17:12:46","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-10 11:16:57","who":"Oksana Batyuk"},{"kind":"comment","t":"2026-03-09 16:32:59","who":"Thomas Britton"}],"brand":"Fybogel","description":"Fybobalance NPD associated products and articles to be added to fybo.co.uk","dueDate":"2026-12-01","lastActivityAt":"2026-07-30 19:20:23","lastActivityBy":"Tatyana Samoylenko","market":"United Kingdom","openedAt":"2026-03-09 16:32:59","requestedFor":"Thomas Britton","stateChangedAt":"2026-07-15 17:01:10","stateChangedBy":"Tatyana Samoylenko"},"number":"RITM2757697","shortDesc":"Fybobalance NPD associated products and articles to be added to fybo.co.uk","state":"Awaiting User Info"},{"_updated":"2026-08-21 14:16:20","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 14:16:20 - Tatyana Samoylenko (Work notes)\nThe state: On hold; Reason: Medical Review\n\n2026-07-10 16:57:32 - Tatyana Samoylenko (Additional comments)\nThe status is: waiting for the comments or go-live approval.\n\n2026-07-09 22:27:56 - Tatyana Samoylenko (Additional comments)\nThank you, Rowena. \n\n2026-07-09 11:11:19 - Rowena Hearn (Additional comments)\nApproved! #]\n\n2026-07-08 23:08:58 - Tatyana Samoylenko (Additional comments)\nRowena, let me share that the total cost is 1020 GBP.\nPlease let me know whether you approve it. \n\n2026-07-08 13:50:56 - Tatyana Samoylenko (Additional comments)\nHi Rowena, I'll review everything and will get back to you a bit later. \n\n2026-07-08 11:29:34 - Rowena Hearn (Additional comments)\nTatyana, I know you have been working on email directly with the Gav IT team. Please could you update me on cost here? I know there's been lots of feedback so we might have gone over.\n\n2026-06-23 15:57:40 - Tatyana Samoylenko (Additional comments)\nHi Rowena,\nIt ha","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=88ad1ca12b2f32506493fa5cf291bf66&sysparm_record_target=task&sysparm_record_row=12&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"worknote","t":"2026-08-21 14:16:20","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-10 16:57:32","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-09 22:27:56","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-09 11:11:20","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-08 23:08:58","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 13:50:57","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 11:29:34","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-23 15:57:40","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-23 13:54:16","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-23 12:03:39","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-18 15:03:58","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-11 17:11:04","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-11 16:58:44","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-11 16:53:29","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-10 12:11:23","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-10 12:05:53","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-09 15:51:35","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-09 13:57:31","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-01 18:01:20","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-03-26 19:02:49","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-26 19:01:31","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-26 10:20:14","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-23 16:16:14","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-19 16:54:30","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-13 12:19:31","who":"Rowena Hearn"},{"kind":"comment","t":"2026-03-10 12:41:14","who":"Rowena Hearn"}],"brand":"Gaviscon","description":"Hello, \r\n\r\nGaviscon Italy is in migration progress, but they can only do ONE submission to regulatory. Given this, I have an out of scope request, to please change the homepage banner on their HUSKY X instance.\r\n\r\nPlease implement the Lendl banner from this design file - https://www.figma.com/design/Y4lONk35u0BZlYhGkElrpX/Gaviscon-%F0%9F%8D%94-Website-Design-Library?node-id=1-23&t=BqklnrRJKflzdNGF-1\r\n\r\nFOR THE:\tPER I\r\nMANY SYMPTOMS:\tDIVERSI SINTOMI\r\nOF HEARTBURN & INDIGESTION: DEL REFLUSSO\r\n\r\nLink text to say: Scorpi di più\r\n\r\nTo link to: https://www.gaviscon.it/i-prodotti-gaviscon/bruciore-e-indigestione-500-mg-213-mg-325-mg/\r\n\r\nPackshot: https://rbcom.sharepoint.com/:i:/s/CGO_DigitalTeam/IQAJK__7B1yCRamnQpe3hDkYAY5LyPKOaViqtJjD9rvDx6g?e=38JDzm\r\n\r\nAlt text: Gaviscon Bruciore e indigestione","dueDate":"2026-03-17","lastActivityAt":"2026-08-21 14:16:20","lastActivityBy":"Tatyana Samoylenko","market":"Italy","openedAt":"2026-03-10 12:41:14","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-21 13:49:32","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2758917","shortDesc":"Gaviscon IT - Lendl","state":"On hold"},{"_updated":"2026-08-21 17:26:00","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 17:26:00 - Alesya Prolagayeva (Additional comments)\nWaiting for that, thank you. \n\n2026-08-20 15:58:42 - Jaime Sanchis (Additional comments)\nWe are awaiting for the confirmation on the brand, so we cannot close this ticket yet. Thanks.\n\n2026-08-19 17:18:30 - Alesya Prolagayeva (Additional comments)\nHi Jaime, thank you for your comments and summary. I'm waiting then for confirmation from your side that all the changes requested in RITM2773268 are implemented correctly and we can close this ticket. Also please provide the PO number for this ticket - 1584 EUR. We will invoice you after the ticket is closed.\n\n2026-08-19 13:21:45 - Jaime Sanchis (Additional comments)\nHi, here's the status of the three tickets:\n\nRITM2773268 (Durex Spain - Website product updates: packshots, discontinued references, and product classifications): we're waiting to resume this one on the brand's side.\n\nRITM2692105 (Durex ES - Horizons/Lubes BDI): we didn't open this one. Could you please review it car","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=f6d300392b3ffa10334bf51ef291bf6f&sysparm_record_target=task&sysparm_record_row=13&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-21 17:26:00","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-20 15:58:42","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-08-19 17:18:30","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-19 13:21:45","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-17 14:18:28","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-19 18:40:04","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-18 12:16:36","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-05-15 19:16:07","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-05-13 17:28:04","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-05-13 17:28:03","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-13 17:27:26","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-08 12:32:42","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-05-07 13:44:28","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-07 12:47:36","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-29 14:37:23","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-04-29 14:36:25","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-04-27 16:33:20","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-04-27 16:33:19","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-04-27 16:33:19","who":"Jaime Sanchis"},{"kind":"worknote","t":"2026-04-27 16:33:14","who":"Jaime Sanchis"},{"kind":"worknote","t":"2026-04-27 16:33:12","who":"Jaime Sanchis"},{"kind":"worknote","t":"2026-04-27 16:33:10","who":"Jaime Sanchis"},{"kind":"worknote","t":"2026-04-27 16:33:08","who":"Jaime Sanchis"},{"kind":"worknote","t":"2026-04-27 16:33:07","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-04-23 13:49:05","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-04-22 19:48:56","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-21 16:35:04","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-04-20 14:30:41","who":"Oksana Batyuk"},{"kind":"comment","t":"2026-04-14 18:03:16","who":"Oksana Batyuk"},{"kind":"comment","t":"2026-04-13 12:38:20","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-04-10 14:18:52","who":"Jaime Sanchis"},{"kind":"worknote","t":"2026-04-09 18:28:59","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-03-27 14:35:52","who":"Jaime Sanchis"},{"kind":"worknote","t":"2026-03-25 18:06:07","who":"Oksana Batyuk"},{"kind":"worknote","t":"2026-03-25 18:06:07","who":"Oksana Batyuk"},{"kind":"worknote","t":"2026-03-25 18:06:06","who":"Oksana Batyuk"},{"kind":"worknote","t":"2026-03-25 18:06:05","who":"Oksana Batyuk"},{"kind":"worknote","t":"2026-03-25 18:06:05","who":"Oksana Batyuk"},{"kind":"worknote","t":"2026-03-25 18:06:04","who":"Oksana Batyuk"},{"kind":"comment","t":"2026-03-25 18:05:49","who":"Oksana Batyuk"},{"kind":"comment","t":"2026-03-23 15:42:48","who":"Jaime Sanchis"}],"brand":"Durex","description":"Website updates requested for durex.es following brand team review. Changes detailed in attached PPT (prepared by the brand). Four workstreams by priority:\r\n\r\nUpdate packshots to ONE range (condoms and lubricants). Note: Global is currently working on the lubricant landing page and has requested ONE + B+ updated images - confirm whether global is already implementing this change to avoid duplication.\r\nRemove discontinued product references from the website (Sin Latex, Toys Boucheron).\r\nEnsure Conexion Total and Pastel are consistently communicated across relevant pages.\r\nCorrect product segment classifications as per attached PDF with updated product characteristics.","dueDate":"2026-03-25","lastActivityAt":"2026-08-21 17:26:00","lastActivityBy":"Alesya Prolagayeva","market":"Spain","openedAt":"2026-03-23 15:42:49","requestedFor":"Jaime Sanchis","stateChangedAt":"2026-08-21 17:26:00","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2773268","shortDesc":"Durex Spain - Website product updates: packshots, discontinued references, and product classifications","state":"Awaiting User Info"},{"_updated":"2026-08-25 16:46:59","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 16:46:59 - Alesya Prolagayeva (Additional comments)\nDiego, thank you, should I consider the previous comment as confirmation that we should proceed with work or should we wait for further approval?\n\n2026-08-25 16:37:10 - Diego Cortes De Ita (Additional comments)\nThank you for the cost breakdown, I will request the full PO\n\n2026-08-25 16:36:50 - Diego Cortes De Ita (Additional comments)\nHi Alesya. For the Anep banner, I share with you the production\n\n2026-08-25 16:36:38 - Diego Cortes De Ita (Work notes)\nAttachment: Logo-sello-anefp-2020.png has been attached.\n\n2026-08-25 15:42:02 - Alesya Prolagayeva (Additional comments)\nHi Diego, producing the anefp stamp won't cut the cost down. If we create the image on our side, it will not take much time, but as I said - we don't know if you need specific font for text, size etc. And if you need to rework it, it will cause additional efforts.\n\nCost breakdown you requested in Teams:\n\n1) Initial requirements: pdf and description in t","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=d0bf8cc0fbc8c7505ceafb037befdc91&sysparm_record_target=task&sysparm_record_row=14&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 16:46:59","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-25 16:37:11","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-08-25 16:36:50","who":"Diego Cortes De Ita"},{"kind":"worknote","t":"2026-08-25 16:36:38","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-08-25 15:42:02","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-14 19:53:54","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-08-14 19:53:48","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-08-14 19:52:55","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-10 11:44:45","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-08-10 11:42:08","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-08-10 11:35:10","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-10 11:00:41","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-08-10 11:00:37","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-07-06 20:41:02","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-09 11:14:43","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-08 15:40:54","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-06-08 15:40:31","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-06-08 11:10:15","who":"Diego Cortes De Ita"},{"kind":"worknote","t":"2026-05-15 16:06:40","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-15 16:06:22","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-05-14 17:56:01","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-05-14 17:55:31","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-05-13 17:30:03","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-07 15:14:40","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-07 11:13:43","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-05-07 11:13:33","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-04-28 13:42:35","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-24 12:10:57","who":"Diego Cortes De Ita"},{"kind":"worknote","t":"2026-04-23 23:38:12","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-23 23:37:55","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-04-22 18:26:29","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-04-22 18:26:23","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-04-20 12:24:43","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-02 17:06:01","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-03-30 17:20:51","who":"Diego Cortes De Ita"}],"brand":"Nurofen","description":"Pdf with comments included","dueDate":"2026-04-10","lastActivityAt":"2026-08-25 16:46:59","lastActivityBy":"Alesya Prolagayeva","market":"Spain","openedAt":"2026-03-30 17:20:51","requestedFor":"Diego Cortes De Ita","stateChangedAt":"2026-08-25 16:46:59","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2781739","shortDesc":"Modifications to Nurofen's online webiste","state":"Awaiting User Info"},{"_updated":"2026-08-26 17:27:37","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 DACH-NORDICS CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 17:27:37 - Alesya Prolagayeva (Additional comments)\nHi Florian, the IT&D team still doesn't have ETA for this fix. It's not a critical issue, so it has lower priority. I checked with them, when they implement the fix, DataArt would need to upgrade the website version with the newest one, and I'll need to request the budget for that from your side.\n\nWe can keep the current ticket open just to keep an eye on IT&D progress in their ticket https://dev.azure.com/RB-Group/IT_and_D_Project/_workitems/edit/890002\nOr we can close this and I will let you know in Teams chat when IT&D notifies me about the fix.\nLet me know how you wish to proceed\n\n2026-08-12 16:43:41 - Alesya Prolagayeva (Additional comments)\nFlorian, I have just pinged IT&D in the ticket https://dev.azure.com/RB-Group/IT_and_D_Project/_workitems/edit/890002\n\nI can see this bug is still in status Open/New. I asked for ETA there\n\n2026-08-07 20:18:44 - Alesya Prolagayeva (Additional comments)\nFlorian, FYI the ticket","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=4565fb842bcc8f50438cfe01fe91bf30&sysparm_record_target=task&sysparm_record_row=15&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 17:27:37","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-12 16:43:41","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-07 20:18:44","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-21 19:11:53","who":"Florian Mecking"},{"kind":"comment","t":"2026-07-15 14:56:32","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-14 14:33:09","who":"Florian Mecking"},{"kind":"comment","t":"2026-07-13 19:43:22","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-07 18:53:45","who":"Florian Mecking"},{"kind":"comment","t":"2026-07-07 18:33:56","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-07 10:53:08","who":"Florian Mecking"},{"kind":"comment","t":"2026-07-06 20:42:37","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-24 18:48:53","who":"Florian Mecking"},{"kind":"comment","t":"2026-06-24 16:49:08","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-22 19:18:27","who":"Florian Mecking"},{"kind":"comment","t":"2026-06-19 18:22:20","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-19 14:45:25","who":"Florian Mecking"},{"kind":"worknote","t":"2026-06-17 11:12:43","who":"Florian Mecking"},{"kind":"comment","t":"2026-06-17 11:12:31","who":"Florian Mecking"},{"kind":"comment","t":"2026-06-12 17:46:03","who":"Florian Mecking"},{"kind":"comment","t":"2026-06-10 09:21:20","who":"Florian Mecking"},{"kind":"comment","t":"2026-06-01 20:22:37","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-05 19:54:49","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-28 09:17:53","who":"Florian Mecking"},{"kind":"worknote","t":"2026-04-28 09:17:06","who":"Florian Mecking"},{"kind":"comment","t":"2026-04-27 11:41:24","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-24 11:28:51","who":"Florian Mecking"},{"kind":"comment","t":"2026-04-21 20:09:42","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-17 09:58:41","who":"Florian Mecking"},{"kind":"comment","t":"2026-04-17 09:48:10","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-04-17 09:47:30","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-08 17:51:58","who":"Florian Mecking"},{"kind":"comment","t":"2026-04-06 12:38:15","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-03-31 10:20:29","who":"Florian Mecking"},{"kind":"worknote","t":"2026-03-31 10:19:04","who":"Florian Mecking"},{"kind":"worknote","t":"2026-03-31 10:15:38","who":"Florian Mecking"},{"kind":"worknote","t":"2026-03-31 10:12:30","who":"Florian Mecking"},{"kind":"worknote","t":"2026-03-31 10:05:40","who":"Florian Mecking"},{"kind":"comment","t":"2026-03-31 10:04:25","who":"Florian Mecking"}],"brand":"Durex","description":"Please update the Durex DE-website according to the briefing (PPT) and use the Excel-overview as well as the images in the ZIP-file to support in updating the website. Please share the costs per segment as indicated in the briefing.","dueDate":"2026-04-30","lastActivityAt":"2026-08-26 17:27:37","lastActivityBy":"Alesya Prolagayeva","market":"Germany","openedAt":"2026-03-31 10:04:25","requestedFor":"Florian Mecking","stateChangedAt":"2026-08-26 17:27:37","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2782465","shortDesc":"Update Content on Durex DE-Website","state":"Awaiting User Info"},{"_updated":"2026-08-21 18:30:10","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 18:30:10 - Alesya Prolagayeva (Additional comments)\nHi Mina, thank you for your patience here.\n\n1. Estimated cost/effort for implementing the Excel action points\nOnly the first tab can be implemented; the second should be skipped, as all URLs in column A return a 200 status code, meaning no action is required on our end. The cost estimate for this is XS+XS (240 GBP)\n\n2. The GEO-related recommendations (attached presentation)\nWe have four points to raise before we can proceed with estimation:\n- Code examples are required for all new schemas (HowTo, Speakable, Author-related items). The schema name alone is insufficient for estimation — complexity and effort can vary significantly depending on what the final implementation is expected to look like.\n\n- A precise list of target URLs is required for all new schemas. This is critical, as it affects risk assessment, correct interpretation of the requirements, and the time needed — implementing something on 1 page versus 15","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=11a65f8afb40cb14beb7f55dbeefdc6a&sysparm_record_target=task&sysparm_record_row=16&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-21 18:30:10","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-17 11:23:33","who":"Mina Yilmaz"},{"kind":"comment","t":"2026-08-17 11:20:20","who":"Mina Yilmaz"},{"kind":"worknote","t":"2026-08-16 23:10:58","who":"Mina Yilmaz"},{"kind":"comment","t":"2026-06-24 19:54:31","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-18 11:07:56","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-16 10:24:55","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-13 00:50:54","who":"Mina Yilmaz"},{"kind":"worknote","t":"2026-04-08 18:31:51","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-08 18:26:17","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-06 12:57:57","who":"Mina Yilmaz"}],"brand":"Vanish","description":"• Please find attached the files titled “4xx Pages” and “Internal 4xx Pages.” The required actions for these files are outlined in the first rows of each document.\r\n• The code included in the file named “Vanish Organization Schema Mark-Up” needs to be added to the section of the relevant pages. This is a technical way of communicating “who we are” to search engines.\r\n• The “LEKE ÇÖZÜMLERİ” button in the header currently redirects to the homepage. However, when clicking “tümünü gör” from the dropdown list beneath it, it redirects to the “leke çıkarma” URL. These inconsistencies need to be fixed.","dueDate":"2026-04-13","lastActivityAt":"2026-08-21 18:30:10","lastActivityBy":"Alesya Prolagayeva","market":"Turkey","openedAt":"2026-04-06 12:57:57","requestedFor":"Mina Yilmaz","stateChangedAt":"2026-08-21 18:30:10","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2788964","shortDesc":"Technical SEO Changes","state":"Awaiting User Info"},{"_updated":"2026-08-19 17:22:27","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 DACH-NORDICS CORE RECKITT Marketing Web Presence","lastComment":"2026-08-19 17:22:27 - Alesya Prolagayeva (Additional comments)\n*We will proceed with this ticket after the Vanish DK Thanos and Milkyway are approved by Elia Adiel\n\n2026-08-19 17:20:43 - Alesya Prolagayeva (Additional comments)\nWe will proceed with this ticket after the Vanish DK Thanos and Milkyway are approved by Elia Adian\n\n2026-07-13 19:55:23 - Alesya Prolagayeva (Additional comments)\nEmailed to lucia.devillamuntanola@reckitt.com\n\n2026-05-11 17:08:16 - Alesya Prolagayeva (Additional comments)\nHi Alicia, sorry for delay here, the Thanos design was ready, but there were no master pages built yet. As Rowena suggested we can build the pilot Thanos page on one of your websites (to have it as master site for Thanos).\nMilkyway was already build on the UK website, so we just replicate it for NO FI and DK.\n\nPlease approve the following cost, same for each of 3 tickets (DK NO FI) for building Thanos and Milkyway:\nNO - 4100 GBP\nFI - 4100 GBP\nDK - 4100 GBP\n\n2026-05-04 16:08:57 - Alicia M","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=01b880a42bd447107379ff6fce91bf45&sysparm_record_target=task&sysparm_record_row=17&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-19 17:22:27","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-19 17:20:43","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-13 19:55:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-11 17:08:16","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-04 16:08:57","who":"Alicia Murphy (Inactive)"},{"kind":"comment","t":"2026-04-13 16:22:59","who":"Alicia Murphy (Inactive)"}],"brand":"Vanish","description":"Hello, would you please be able to update the Finnish website according to the excels provided? Please see the packshots attached as well.","dueDate":"2026-05-01","lastActivityAt":"2026-08-19 17:22:27","lastActivityBy":"Alesya Prolagayeva","market":"Denmark","openedAt":"2026-04-13 16:22:59","requestedFor":"Alicia Murphy (Inactive)","stateChangedAt":"2026-05-11 17:08:16","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2797301","shortDesc":"Finnish Website Update","state":"Awaiting User Info"},{"_updated":"2026-08-19 18:44:10","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 DACH-NORDICS CORE RECKITT Marketing Web Presence","lastComment":"2026-08-19 18:44:10 - Alesya Prolagayeva (Additional comments)\nThe comment is wrong. The ticket is in progress with Elia Adiel\n\n2026-08-19 17:21:52 - Alesya Prolagayeva (Additional comments)\n*We will proceed with this ticket after the Vanish DK Thanos and Milkyway are approved by Elia Adiel\n\n2026-08-19 17:20:59 - Alesya Prolagayeva (Additional comments)\nWe will proceed with this ticket after the Vanish DK Thanos and Milkyway are approved by Elia Adian\n\n2026-07-13 19:55:29 - Alesya Prolagayeva (Additional comments)\nEmailed to lucia.devillamuntanola@reckitt.com\n\n2026-06-30 18:48:29 - Alesya Prolagayeva (Additional comments)\nAlicia, the changes you reqeusted are ready https://hkx-vanish-dk-dev-639a--branch-ritm2797459-r11ari6w.web.app/vanish-oxi-action/\n\nLook forward to reply from your colleague after her vacation. Thank you a lot for cooperation!\n\n2026-06-25 17:05:57 - Alicia Murphy (Inactive) (Additional comments)\nHi Alesya, I have requested some changes in the excel file.\n\n2026-06-25","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=400a14603b108f1010a7c4c964e45a6e&sysparm_record_target=task&sysparm_record_row=18&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-19 18:44:10","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-19 17:21:52","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-19 17:20:59","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-13 19:55:30","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-30 18:48:29","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-25 17:05:58","who":"Alicia Murphy (Inactive)"},{"kind":"worknote","t":"2026-06-25 17:05:55","who":"Alicia Murphy (Inactive)"},{"kind":"comment","t":"2026-06-22 13:11:05","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-22 11:59:09","who":"Alicia Murphy (Inactive)"},{"kind":"comment","t":"2026-06-16 16:59:13","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-15 20:00:25","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-12 13:54:51","who":"Alicia Murphy (Inactive)"},{"kind":"worknote","t":"2026-06-12 13:54:18","who":"Alicia Murphy (Inactive)"},{"kind":"comment","t":"2026-06-01 18:12:24","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-22 12:37:13","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-18 16:10:11","who":"Alicia Murphy (Inactive)"},{"kind":"comment","t":"2026-05-11 17:08:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-04 16:07:50","who":"Alicia Murphy (Inactive)"},{"kind":"comment","t":"2026-04-17 09:55:42","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-13 17:38:34","who":"Alicia Murphy (Inactive)"}],"brand":"Vanish","description":"Hello, would you please be able to update the Danish website https://www.vanish.dk/ according to the excels provided? Please see the packshots attached as well.","dueDate":"2026-05-01","lastActivityAt":"2026-08-19 18:44:10","lastActivityBy":"Alesya Prolagayeva","market":"Denmark","openedAt":"2026-04-13 17:38:34","requestedFor":"Alicia Murphy (Inactive)","stateChangedAt":"2026-08-19 17:20:59","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2797459","shortDesc":"Danish Website Update","state":"Awaiting User Info"},{"_updated":"2026-08-27 15:33:51","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 15:33:51 - Alesya Prolagayeva (Additional comments)\nHello, implemented! Let me know what's next :)\n\nhttps://hkx-durex-fr-dev-eabb--branch-ritm2804881-3kakwss9.web.app/\nhttps://hkx-durex-fr-dev-eabb--branch-ritm2804881-3kakwss9.web.app/pages/intensity-xl\nhttps://hkx-durex-fr-dev-eabb--branch-ritm2804881-3kakwss9.web.app/pages/intensity\nhttps://hkx-durex-fr-dev-eabb--branch-ritm2804881-3kakwss9.web.app/products/intensity-extra-lubrifie-preservatifs-10-pack \n\n2026-08-27 12:12:36 - Rowena Hearn (Work notes)\nAttachment: Screenshot 2026-08-27 101201.png has been attached.\n\n2026-08-27 12:12:30 - Rowena Hearn (Additional comments)\nPoint 1 - Sorry, https://hkx-durex-fr-dev-eabb--branch-ritm2804881-3kakwss9.web.app/pages/intensity-xl and https://hkx-durex-fr-dev-eabb--branch-ritm2804881-3kakwss9.web.app/pages/intensity\n\nPoint 2 - Ingredient Supplimentaire also needs to change. Sending screen shot\n\n2026-08-27 12:00:33 - Alesya Prolagayeva (Additional comments)\nHello Row, regarding","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=5eeb1cb62b98c7d008d2f3acee91bf15&sysparm_record_target=task&sysparm_record_row=19&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 15:33:51","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-08-27 12:12:36","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-27 12:12:30","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-27 12:00:33","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-25 18:28:56","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-25 15:21:32","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-24 15:18:06","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-03 18:40:44","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-07-17 13:08:04","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-17 12:55:41","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-10 13:35:08","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-08 11:56:45","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-01 15:43:28","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-01 14:58:11","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-30 18:52:08","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-06-29 11:15:36","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-29 11:15:12","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-06-12 19:15:17","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-06-12 19:15:15","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-12 19:14:46","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-10 12:48:17","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-06-10 12:22:17","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-10 12:22:00","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-05 18:55:04","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-27 13:04:21","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-07 15:07:31","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-04-28 16:11:53","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-04-28 16:11:51","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-28 16:11:33","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-28 13:57:47","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-28 11:23:10","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-28 10:46:18","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-23 23:45:26","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-21 12:58:38","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-21 12:55:12","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-20 17:33:14","who":"Rowena Hearn"}],"brand":"Durex","description":"For completion ASAP! Copy Durex Pastel from UK on to FR website.\r\n\r\nMatrix here - https://rbcom.sharepoint.com/:x:/s/CGO_DigitalTeam/IQAaFmYRiJ0mQ5Bj7xdtqElEAXPVqGRQDYPIDoAWQyJVjkQ?e=y78uHp\r\nAll images here - https://rbcom.sharepoint.com/:f:/s/CGO_DigitalTeam/IgDafSA2TLHjT76iqhnNhKYAATPY7Zh6vY5MYFdgua5HwWw?e=pNTgcv\r\n\r\nFor completion ASAP. Pay from my budget. Let me know cost.","dueDate":"2026-04-27","lastActivityAt":"2026-08-27 15:33:51","lastActivityBy":"Alesya Prolagayeva","market":"France","openedAt":"2026-04-20 17:33:14","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-27 15:33:51","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2804881","shortDesc":"Durex FR - Pastel","state":"Awaiting User Info"},{"_updated":"2026-08-21 14:31:54","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 14:31:54 - Alesya Prolagayeva (Work notes)\nReason: Medical Review\n\n2026-08-07 20:19:59 - Alesya Prolagayeva (Additional comments)\nImplemented, link shared in Teams\n\n2026-08-05 17:34:48 - Rowena Hearn (Additional comments)\nMinor change to my original request on PLAY STRONGER swim lane:\n\n1. Change 'Partner approved! 80% of women climaxed' to '80% of women who used this product in a test achieved an orgasm^'\n2. Change '*vs Durex Originals' to '^2014 consumer test with 306 women'\n3. Add asterisk next to 'Play stronger' so it reads 'PLAY STRONGER*'\n\n2026-08-05 17:27:54 - Rowena Hearn (Additional comments)\nhttps://hkx-durex-uk-dev-eabb--branch-nold-fix-styles-tu66z4jl.web.app/\n\nHomepage banner - Below learn more, write 'Durex Sildenafil 50 mg Film-Coated Tablets. For erection problems in adult men. Ask your pharmacist if Durex Sildenafil may be suitable for you. Always read the label. RT-M-8ZB7x4.' If it can't work below, but it above 'learn more'\n\n'GET READY TO PLAY' banner on th","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=b85b9ccb3b140b1410a7c4c964e45a34&sysparm_record_target=task&sysparm_record_row=20&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"worknote","t":"2026-08-21 14:31:54","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-07 20:19:59","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-05 17:34:48","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-05 17:27:54","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-30 18:59:04","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-30 13:47:33","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-28 19:42:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-28 15:30:53","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-24 19:08:56","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-24 11:16:19","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-22 15:53:19","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-21 16:58:56","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-14 18:02:33","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-09 18:46:29","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-09 18:18:34","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-09 13:34:39","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-07 15:53:35","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-07-01 13:47:13","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-01 13:46:59","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-23 11:57:43","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-23 11:25:04","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-22 12:50:47","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-15 20:17:07","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-12 13:26:31","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-12 11:47:06","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-12 11:36:02","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-10 17:08:17","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-10 16:43:00","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-05 18:56:32","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-05 15:50:59","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-05 15:49:25","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-04 15:50:13","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-04 12:25:47","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-03 16:29:00","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-03 15:11:26","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-03 13:09:03","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-02 18:48:46","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-02 17:38:56","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-02 12:35:55","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-01 17:47:45","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-29 18:34:13","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-22 11:49:15","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-20 12:45:27","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-20 12:45:12","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-20 12:44:49","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-19 18:48:57","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-14 15:22:35","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-14 15:15:59","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-07 11:02:20","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-06 19:26:19","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-06 17:35:54","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-05-06 17:31:47","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-05-06 17:31:46","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-05-06 17:31:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-06 17:29:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-06 12:16:20","who":"Rowena Hearn"},{"kind":"comment","t":"2026-05-05 20:30:03","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-05 11:40:51","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-23 18:16:42","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-23 16:31:12","who":"Rowena Hearn"},{"kind":"comment","t":"2026-04-21 12:09:09","who":"Rowena Hearn"}],"brand":"Durex","description":"HELLO! Big, high priority project for Durex UK, relating to a new product launch in a new category. \r\n\r\nDurex is launching Sildenafil Tablets, for erectile dysfunction, and simultaneously highlighting the Durex Performance Range (Of which these are a part)\r\n\r\nDataArt Scope:\r\n\r\nUpload 20x new articles\r\n\r\n2 x homepage banners \r\n\r\nUpload 2x new PDPs (Sildenafil in 2 pack sizes)\r\n\r\nUpdate global nav (As per design)\r\n\r\n2 x new category pages\r\n\r\nPERFORMANCE BOOSTERS https://www.durex.co.uk/collections/performance-boosters\r\nERECTILE DYSFUNCTION\r\nhttps://www.durex.co.uk/collections/erecticle-dysfunction\r\n\r\n2 x new campaign pages\r\n\r\nERECTILE DYNFUNCTION\r\nhttps://www.durex.co.uk/pages/sildenafil-tablets\r\nhttps://www.durex.co.uk/pages/sildenafil-tablets/suitability-checker (IT&D will build this!)\r\nDUREX PERFORMANCE RANGE\r\nhttps://www.durex.co.uk/pages/durex-performance-range\r\n\r\nDesign is here - https://www.figma.com/design/WpT8uoZXLcvXqkerLrWpOR/Durex?node-id=19552-63&t=OBpZ8IOJiftroueg-1\r\n\r\nPlease quote and start building ASAP! This needs to go through lots of regulatory approval.\r\n\r\nMeta info, PDP info and articles to come.","dueDate":"2026-06-01","lastActivityAt":"2026-08-21 14:31:54","lastActivityBy":"Alesya Prolagayeva","market":"United Kingdom","openedAt":"2026-04-21 12:09:09","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-21 13:49:43","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2805838","shortDesc":"Durex UK - Nold/Erectile Dysfunction","state":"On hold"},{"_updated":"2026-08-19 18:44:39","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 DACH-NORDICS CORE RECKITT Marketing Web Presence","lastComment":"2026-08-19 18:44:39 - Alesya Prolagayeva (Additional comments) We will proceed with this ticket afte","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=6ebf5d13fb9443905ceafb037befdc4b&sysparm_record_target=task&sysparm_record_row=21&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-19 18:44:39","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-13 19:55:39","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-11 17:08:29","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-04 16:05:29","who":"Alicia Murphy (Inactive)"},{"kind":"comment","t":"2026-04-28 14:00:05","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-22 11:46:29","who":"Alicia Murphy (Inactive)"}],"brand":"Vanish","description":"Hello, would you please be able to update the Norwegian website https://www.vanish.no/ according to the excels provided? Please see the packshots attached as well.","dueDate":"2026-05-01","lastActivityAt":"2026-08-19 18:44:39","lastActivityBy":"Alesya Prolagayeva","market":"Denmark","openedAt":"2026-04-22 11:46:29","requestedFor":"Alicia Murphy (Inactive)","stateChangedAt":"2026-05-11 17:08:29","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2807333","shortDesc":"Norwegian Website Update","state":"Awaiting User Info"},{"_updated":"2026-08-27 13:55:18","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 12:40:57 - Martina Ridolfo (Additional comments) Hi, sorry for late reply but I just got","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=7c9df4c42ba08b14f1d9f268f291bfd7&sysparm_record_target=task&sysparm_record_row=22&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 12:40:57","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-08-27 12:40:20","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-08-27 12:40:19","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-08-27 12:40:18","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-08-27 12:40:17","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-08-27 12:40:16","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-08-27 12:40:13","who":"Martina Ridolfo"},{"kind":"comment","t":"2026-08-26 18:11:18","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-04 16:59:31","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-24 11:01:12","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-07-24 10:59:22","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-07-24 10:59:21","who":"Martina Ridolfo"},{"kind":"comment","t":"2026-07-22 17:10:48","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-07-22 15:11:44","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-07-22 15:11:43","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-07-22 15:11:41","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-07-22 15:11:40","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-07-22 15:11:38","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-07-22 15:11:37","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-07-22 15:11:35","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-07-22 15:11:34","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-07-22 15:11:33","who":"Martina Ridolfo"},{"kind":"comment","t":"2026-07-22 15:10:42","who":"Martina Ridolfo"},{"kind":"comment","t":"2026-07-22 13:03:11","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-07-22 13:03:07","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-09 18:18:40","who":"Martina Ridolfo"},{"kind":"worknote","t":"2026-07-09 18:18:37","who":"Martina Ridolfo"},{"kind":"comment","t":"2026-06-10 21:49:29","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-05 12:20:59","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-28 14:25:50","who":"Martina Ridolfo"},{"kind":"comment","t":"2026-04-28 14:07:51","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-24 17:12:42","who":"Martina Ridolfo"}],"brand":"Strepsils","description":"We renewed benagol.it website to healh authorities so we need to implement the changes requested. Please find the detail brief attached in ppt","dueDate":"2026-05-16","lastActivityAt":"2026-08-27 12:40:57","lastActivityBy":"Martina Ridolfo","market":"Italy","openedAt":"2026-04-24 17:12:42","requestedFor":"Martina Ridolfo","stateChangedAt":"2026-08-27 12:40:57","stateChangedBy":"Martina Ridolfo"},"number":"RITM2810823","shortDesc":"Benagol.it website modifications needed","state":"Work In Progress"},{"_updated":"2026-08-19 18:52:02","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-19 18:52:02 - Alesya Prolagayeva (Additional comments) Ticket is progress with the new stake","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=208547382ba40314438cfe01fe91bff0&sysparm_record_target=task&sysparm_record_row=23&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-19 18:52:02","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-12 19:16:41","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-09 11:49:21","who":"Inass Berrada (Inactive)"},{"kind":"comment","t":"2026-06-09 11:48:08","who":"Inass Berrada (Inactive)"},{"kind":"comment","t":"2026-06-08 20:41:02","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-03 19:04:22","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-02 15:12:10","who":"Inass Berrada (Inactive)"},{"kind":"comment","t":"2026-06-01 17:38:15","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-26 19:01:02","who":"Inass Berrada (Inactive)"},{"kind":"comment","t":"2026-05-22 11:38:11","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-20 18:38:15","who":"Inass Berrada (Inactive)"},{"kind":"comment","t":"2026-05-20 18:34:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-18 18:26:45","who":"Inass Berrada (Inactive)"},{"kind":"comment","t":"2026-05-18 18:15:57","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-06 11:13:58","who":"Inass Berrada (Inactive)"},{"kind":"comment","t":"2026-05-05 20:37:50","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-05 13:07:33","who":"Inass Berrada (Inactive)"},{"kind":"comment","t":"2026-04-30 11:16:52","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-27 11:02:03","who":"Inass Berrada (Inactive)"}],"brand":"Strepsils","description":"Hello, I am raising this ticket in order to estimate the costs of implementing the redirection plans and the SEO (titles and descriptions) recommandations we got in Strepsils FR website. Thank you,","dueDate":"2026-05-11","lastActivityAt":"2026-08-19 18:52:02","lastActivityBy":"Alesya Prolagayeva","market":"France","openedAt":"2026-04-27 11:02:04","requestedFor":"Inass Berrada (Inactive)","stateChangedAt":"2026-06-12 19:16:41","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2811981","shortDesc":"Strepsils Website Redirection plan and SEO changes","state":"Awaiting User Info"},{"_updated":"2026-08-27 15:59:07","_updatedBy":"MPereira9","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 15:59:07 - Maria Eduarda Alves Pereira (Work notes) Attachment: STREPSILS Laranja 16 comp","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=671a46152ba00b94334bf51ef291bf08&sysparm_record_target=task&sysparm_record_row=24&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"worknote","t":"2026-08-27 15:59:07","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-27 15:58:49","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-27 15:57:25","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-27 15:57:22","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-27 15:56:53","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-27 15:56:14","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-27 15:55:16","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-26 22:39:26","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-08-25 19:21:33","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-24 04:28:23","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-20 17:27:29","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-20 17:27:26","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-20 17:25:25","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-16 23:48:05","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-11 19:16:54","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-11 19:16:52","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-11 19:16:39","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-11 19:16:35","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-10 04:03:31","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-08-06 17:31:03","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 17:29:56","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:50:28","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:50:25","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:50:24","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:50:21","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:50:19","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:50:16","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:50:09","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:50:06","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:49:58","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:49:55","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:49:54","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:49:51","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:49:50","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:49:47","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:49:29","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:49:26","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:49:18","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:49:15","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:49:05","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:49:02","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:48:44","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:48:40","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:47:01","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:46:58","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-24 18:02:10","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-24 17:58:10","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-07-03 04:43:31","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-07-02 22:56:05","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-02 22:56:03","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-02 22:56:01","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-02 22:55:59","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-02 22:55:57","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-02 22:55:55","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-02 22:55:54","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-02 22:55:52","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-02 22:55:50","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-02 22:55:48","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-02 22:55:13","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-02 22:54:49","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-02 22:54:47","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-07-02 22:54:37","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-06-10 04:51:32","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-06-10 04:49:48","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-05-13 22:33:14","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-04-28 19:59:33","who":"Maria Eduarda Alves Pereira"}],"brand":"Strepsils","description":"Update product mockups, update product banners, add product video, update product leaflet.","dueDate":"2026-04-28","lastActivityAt":"2026-08-27 15:59:07","lastActivityBy":"Maria Eduarda Alves Pereira","market":"Brazil","openedAt":"2026-04-28 19:59:33","requestedFor":"Maria Eduarda Alves Pereira","stateChangedAt":"2026-08-27 15:57:25","stateChangedBy":"Maria Eduarda Alves Pereira"},"number":"RITM2814412","shortDesc":"Ticket for changes and updates on the strepsils website","state":"Work In Progress"},{"_updated":"2026-08-26 20:09:38","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 20:09:38 - Alesya Prolagayeva (Additional comments) Reached out in Email Re: RITM2837984","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=c15483693ba4c31810a7c4c964e45a35&sysparm_record_target=task&sysparm_record_row=25&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 20:09:38","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-08-26 20:09:00","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-08-26 20:08:11","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-12 19:18:21","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-09 11:23:34","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-05 16:06:24","who":"Lukas Markovsky"},{"kind":"comment","t":"2026-06-05 15:29:48","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-01 17:44:52","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-06-01 12:21:01","who":"Lukas Markovsky"},{"kind":"comment","t":"2026-05-20 18:16:34","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-20 18:12:40","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-20 12:43:15","who":"Lukas Markovsky"},{"kind":"comment","t":"2026-05-14 12:27:17","who":"Lukas Markovsky"},{"kind":"comment","t":"2026-05-07 13:25:21","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-05 17:03:30","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-05 10:18:25","who":"Lukas Markovsky"},{"kind":"comment","t":"2026-05-04 12:35:50","who":"Lukas Markovsky"},{"kind":"comment","t":"2026-04-30 10:23:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-04-29 18:52:21","who":"Lukas Markovsky"}],"brand":"Vanish","description":"We need to upload a finalized Terms & Conditions document (PDF, called \"pravidla.pdf\" )to the registered domain vanishakce.cz for a local CZ/SK consumer activation.\r\nThe domain will be used only for hosting this single PDF file. No website or any other content is required.\r\n\r\nIt should be: vanishakce.cz/pravidla.pdf\r\n\r\nThe activity starts in May, so I would kindly ask for prioritisation. Many thanks.","dueDate":"2026-04-30","lastActivityAt":"2026-08-26 20:09:38","lastActivityBy":"Alesya Prolagayeva","market":"Czech Republic","openedAt":"2026-04-29 18:52:21","requestedFor":"Lukas Markovsky","stateChangedAt":"2026-08-26 20:09:38","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2815706","shortDesc":"Uploading the PDF file to the website","state":"Awaiting User Info"},{"_updated":"2026-08-07 19:59:40","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 DACH-NORDICS CORE RECKITT Marketing Web Presence","lastComment":"2026-08-04 14:17:05 - Elizaveta Nyarko (Additional comments) Hi Julia, I hope you are doing well.","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=60a654db2bec8794438cfe01fe91bf5c&sysparm_record_target=task&sysparm_record_row=26&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-04 14:17:05","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-29 14:13:24","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-21 17:54:38","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-10 17:40:00","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-08 13:33:46","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-03 13:58:07","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-03 13:57:26","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-19 12:37:41","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-18 14:00:40","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-06-18 14:00:31","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-06-18 13:35:09","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-10 15:21:25","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-05 18:31:31","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-04 14:35:51","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-04 01:21:23","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-06-04 00:57:13","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-06-03 18:28:26","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-03 16:44:22","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-06-03 16:33:15","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-06-03 12:11:23","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-02 18:19:28","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-06-02 17:35:01","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-05-28 10:03:50","who":"Julia Kuzovkova"},{"kind":"worknote","t":"2026-05-26 18:32:43","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-05-26 18:29:12","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-05-26 17:30:07","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-05-26 12:37:15","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-05-25 18:46:36","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-05-22 15:50:39","who":"Julia Kuzovkova"},{"kind":"worknote","t":"2026-05-22 15:50:14","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-05-22 15:49:56","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-05-20 15:32:05","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-14 16:51:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-13 08:43:12","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-05-12 17:02:41","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-05-12 16:46:27","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-05-12 16:01:44","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-05-12 15:08:47","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-05-12 14:34:11","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-05-12 14:32:32","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-05-12 14:29:38","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-05-12 14:23:04","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-05-11 18:54:27","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-05-11 18:46:48","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-05-11 09:02:05","who":"Julia Kuzovkova"},{"kind":"comment","t":"2026-05-07 16:49:31","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-05-04 16:42:49","who":"Julia Kuzovkova"}],"brand":"Gaviscon","description":"Website changes connected to 2 new SKUs with new flavours","dueDate":"2026-05-15","lastActivityAt":"2026-08-04 14:17:05","lastActivityBy":"Elizaveta Nyarko","market":"Germany","openedAt":"2026-05-04 16:42:49","requestedFor":"Julia Kuzovkova","stateChangedAt":"2026-06-19 12:37:41","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2819523","shortDesc":"gaviscon.de - berry launch","state":"Awaiting User Info"},{"_updated":"2026-06-12 18:29:25","_updatedBy":"OBatyuk","assignedTo":"Oksana Batyuk","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-06-12 18:29:24 - Oksana Batyuk (Work notes) Attachment: DA_Letterhead_DATAART_Brazil_Cost.pdf h","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=a2a96cd3fbec8794e217fc31beefdc62&sysparm_record_target=task&sysparm_record_row=27&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"worknote","t":"2026-06-12 18:29:24","who":"Oksana Batyuk"},{"kind":"comment","t":"2026-06-03 16:29:52","who":"Carolina da Silva"},{"kind":"comment","t":"2026-05-21 15:39:06","who":"Oksana Batyuk"},{"kind":"comment","t":"2026-05-20 21:02:42","who":"Carolina da Silva"},{"kind":"comment","t":"2026-05-19 15:08:39","who":"Oksana Batyuk"},{"kind":"comment","t":"2026-05-15 23:49:31","who":"Carolina da Silva"},{"kind":"worknote","t":"2026-05-15 23:49:01","who":"Carolina da Silva"},{"kind":"worknote","t":"2026-05-15 23:48:59","who":"Carolina da Silva"},{"kind":"worknote","t":"2026-05-15 23:48:57","who":"Carolina da Silva"},{"kind":"worknote","t":"2026-05-15 23:48:54","who":"Carolina da Silva"},{"kind":"comment","t":"2026-05-15 23:48:23","who":"Carolina da Silva"},{"kind":"comment","t":"2026-05-14 19:26:45","who":"Oksana Batyuk"},{"kind":"comment","t":"2026-05-13 17:18:57","who":"Carolina da Silva"},{"kind":"comment","t":"2026-05-13 15:47:22","who":"Oksana Batyuk"},{"kind":"comment","t":"2026-05-07 16:49:46","who":"Oksana Batyuk"},{"kind":"comment","t":"2026-05-06 21:07:42","who":"Carolina da Silva"},{"kind":"comment","t":"2026-05-05 19:39:52","who":"Oksana Batyuk"},{"kind":"comment","t":"2026-05-04 18:05:59","who":"Carolina da Silva"}],"brand":"Gaviscon","description":"Make the changes as per the briefing and attached email.","dueDate":"2026-05-11","lastActivityAt":"2026-06-12 18:29:24","lastActivityBy":"Oksana Batyuk","market":"Brazil","openedAt":"2026-05-04 18:05:59","requestedFor":"Carolina da Silva","stateChangedAt":"2026-06-03 16:29:52","stateChangedBy":"Carolina da Silva"},"number":"RITM2819645","shortDesc":"Site Settings https://www.reckittsaude.com.br/","state":"Work In Progress"},{"_updated":"2026-08-27 10:10:30","_updatedBy":"FLiapodi","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 10:10:30 - Froso Liapodimitri (Additional comments) Hey Taras, Thanks for the message.","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=2339a7dcfbb0cf18beb7f55dbeefdc18&sysparm_record_target=task&sysparm_record_row=28&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 10:10:30","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-08-21 20:33:39","who":"Taras Shevchenko"},{"kind":"worknote","t":"2026-08-21 20:09:32","who":"Taras Shevchenko"},{"kind":"worknote","t":"2026-08-21 20:04:50","who":"Taras Shevchenko"},{"kind":"worknote","t":"2026-08-21 20:01:50","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-21 20:01:28","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-21 20:00:33","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-21 20:00:08","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-19 16:14:17","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-08-19 16:10:15","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-18 12:15:59","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-08-18 12:14:47","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-07-31 11:50:19","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-31 11:09:38","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-07-30 18:32:43","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-30 14:42:39","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-30 10:09:25","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-07-29 18:26:55","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-29 18:16:49","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-22 17:00:04","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-07-22 17:00:04","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-07-22 17:00:00","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-07-17 13:37:43","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-07-17 13:37:40","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-07-17 13:24:00","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-07-17 13:23:59","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-07-17 13:20:45","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-07-17 13:20:41","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-15 19:43:10","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-08 19:45:28","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-04 17:20:05","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-06-04 16:26:59","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-04 09:23:50","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-06-04 09:09:25","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-06-03 11:07:34","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-03 09:40:10","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-06-02 14:47:40","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-06-02 14:43:20","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-06-02 14:43:18","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-06-02 14:43:16","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-06-02 14:43:15","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-05-27 11:51:47","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-05-27 11:16:08","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-05-27 09:18:12","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-05-26 18:43:15","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-05-26 10:20:12","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-05-25 17:58:32","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-05-22 13:46:29","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-05-21 14:57:23","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-05-21 14:50:09","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-05-21 14:50:07","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-05-20 09:37:00","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-05-19 21:49:07","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-05-19 09:45:21","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-05-19 09:34:17","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-05-18 21:20:17","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-05-18 17:44:37","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-05-18 17:44:33","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-05-18 17:17:30","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-05-18 12:53:20","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-05-14 17:36:15","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-05-13 09:34:37","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-05-12 09:40:15","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-05-08 10:36:55","who":"Froso Liapodimitri"}],"brand":"Finish","description":"This is a ticket which is about a creation of a new consolidated microsite such as apostolikathariotita.gr that can be host more than one contests at the same time! As a reference, i will share a similar microsite from competition https://www.gematokalathi.gr/","dueDate":"2026-06-08","lastActivityAt":"2026-08-27 10:10:30","lastActivityBy":"Froso Liapodimitri","market":"Greece","openedAt":"2026-05-08 10:36:55","requestedFor":"Froso Liapodimitri","stateChangedAt":"2026-08-27 10:10:30","stateChangedBy":"Froso Liapodimitri"},"number":"RITM2824833","shortDesc":"Consolidated microsite for contests _greek market","state":"Work In Progress"},{"_updated":"2026-08-27 15:00:06","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 15:00:06 - Alesya Prolagayeva (Additional comments) Hi Jaime, thanks for PO. The preview","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=2753c6862bf4c750171af4de5e91bf36&sysparm_record_target=task&sysparm_record_row=29&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 15:00:06","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-19 13:50:43","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-08-14 19:24:57","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-24 11:39:04","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-23 12:22:08","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-17 10:29:06","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-14 13:54:33","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-14 12:58:04","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-13 20:37:29","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-15 14:59:38","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-05-13 13:41:12","who":"Jaime Sanchis"}],"brand":"Gaviscon","description":"Update meta tags (titles and descriptions) via CMS on the 15 highest-traffic pages. Implementation of Organization, Product, and FAQPage structured schemas at the template level. Finally, fixing Core Web Vitals by reserving fixed dimensions for images and pinning the cookie banner to avoid layout shifts. Any questions regarding the attached documents in the task description should be directed to the SEO Lead, Sara David sara.david@publicismedia.com.","dueDate":"2026-05-21","lastActivityAt":"2026-08-27 15:00:06","lastActivityBy":"Alesya Prolagayeva","market":"Portugal","openedAt":"2026-05-13 13:41:12","requestedFor":"Jaime Sanchis","stateChangedAt":"2026-08-27 15:00:06","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2830102","shortDesc":"SEO 2026 Phase 1 Implementation - Gaviscon (Meta tags, JSON-LD, CWV)","state":"Awaiting User Info"},{"_updated":"2026-08-27 13:09:53","_updatedBy":"JSanchis","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 13:09:53 - Jaime Sanchis (Additional comments) Ok, thanks :) 2026-08-25 17:08:05 - Alesy","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=bcf3c64a2bf4c750171af4de5e91bf35&sysparm_record_target=task&sysparm_record_row=30&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 13:09:53","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-08-25 17:08:05","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-19 13:07:05","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-08-14 19:25:58","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-24 11:38:19","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-23 12:23:00","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-17 10:25:46","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-14 13:55:39","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-14 11:50:37","who":"Jaime Sanchis"},{"kind":"worknote","t":"2026-07-14 11:50:31","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-13 20:38:42","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-15 14:59:17","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-05-13 13:43:44","who":"Jaime Sanchis"}],"brand":"Gaviscon","description":"Technical and content rebuild for the Gavidigest landing page. Requires applying 6 on-page recommendations and 6 internal-linking actions. Also includes deploying the JSON-LD Product schema with variants and applying critical Core Web Vitals fixes like pinning the cookie banner and optimizing image sizes to WebP. Any questions regarding the attached documents in the task description should be directed to the SEO Lead, Sara David sara.david@publicismedia.com.","dueDate":"2026-05-20","lastActivityAt":"2026-08-27 13:09:53","lastActivityBy":"Jaime Sanchis","market":"Portugal","openedAt":"2026-05-13 13:43:44","requestedFor":"Jaime Sanchis","stateChangedAt":"2026-08-19 13:07:05","stateChangedBy":"Jaime Sanchis"},"number":"RITM2830109","shortDesc":"SEO 2026 Phase 1 Implementation - Gavidigest (Rebuild, Schema, and CWV)","state":"Work In Progress"},{"_updated":"2026-08-27 13:07:38","_updatedBy":"JSanchis","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 13:07:38 - Jaime Sanchis (Additional comments) ok , we let Portugal know to check it. Thn","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=b8b482422b38c750171af4de5e91bfca&sysparm_record_target=task&sysparm_record_row=31&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 13:07:38","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-08-26 18:22:46","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-19 13:49:24","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-08-14 19:26:18","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-24 11:38:02","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-23 12:23:31","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-17 10:28:37","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-14 13:55:00","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-14 12:57:49","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-07-13 20:39:44","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-05-15 14:58:28","who":"Jaime Sanchis"},{"kind":"comment","t":"2026-05-13 13:47:01","who":"Jaime Sanchis"}],"brand":"Nurofen","description":"Urgent resolution of keyword cannibalization by editing content and tags on key URLs for muscle pain , fever , and flu/colds. Deployment of Product, MedicalCondition, and Organization schemas. A single template-level change to fix Core Web Vitals CLS across the entire site. Any questions regarding the attached documents in the task description should be directed to the SEO Lead, Sara David sara.david@publicismedia.com.","dueDate":"2026-05-20","lastActivityAt":"2026-08-27 13:07:38","lastActivityBy":"Jaime Sanchis","market":"Portugal","openedAt":"2026-05-13 13:47:01","requestedFor":"Jaime Sanchis","stateChangedAt":"2026-08-27 13:07:38","stateChangedBy":"Jaime Sanchis"},"number":"RITM2830118","shortDesc":"SEO 2026 Phase 1 Implementation - Nurofen (Cannibalization resolution, JSON-LD, CWV)","state":"Work In Progress"},{"_updated":"2026-08-25 17:58:34","_updatedBy":"DCasasno","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 17:58:34 - Damian Casasnovas (Additional comments) Hi Maria. Here you have the preview l","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=b8e137502b490714a4fffbc8f291bfdf&sysparm_record_target=task&sysparm_record_row=32&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 17:58:34","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-20 17:53:11","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 20:48:49","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-08-06 20:19:57","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-08-06 20:04:17","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 19:48:41","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-08-06 19:48:40","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-06 15:41:52","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:41:51","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 15:41:30","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-06 15:41:27","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-06 06:56:10","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-05 20:29:36","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-05 20:29:34","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-08-05 20:29:25","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-08-05 20:29:23","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-07-28 17:46:02","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-07-25 06:34:23","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-07-24 18:04:47","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-06-25 22:25:24","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-06-25 15:47:22","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-06-25 15:46:51","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-06-25 15:46:48","who":"Maria Eduarda Alves Pereira"},{"kind":"worknote","t":"2026-06-25 15:45:23","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-06-11 06:38:22","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-06-10 16:08:22","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-06-10 04:36:49","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-05-28 15:37:03","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-05-26 15:49:15","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-05-26 15:44:03","who":"Maria Eduarda Alves Pereira"},{"kind":"comment","t":"2026-05-21 00:11:24","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-05-20 21:30:23","who":"Maria Eduarda Alves Pereira"}],"brand":"Naldecon","description":"Update product mockups, update product banner, update video, update product leaflet","dueDate":"2026-05-20","lastActivityAt":"2026-08-25 17:58:34","lastActivityBy":"Damian Casasnovas","market":"Brazil","openedAt":"2026-05-20 21:30:23","requestedFor":"Maria Eduarda Alves Pereira","stateChangedAt":"2026-08-25 17:58:34","stateChangedBy":"Damian Casasnovas"},"number":"RITM2838194","shortDesc":"Ticket for changes and updates on the Naldecon website","state":"Awaiting User Info"},{"_updated":"2026-08-25 14:49:09","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 DACH-NORDICS CORE RECKITT Marketing Web Presence","lastComment":"2026-07-31 16:47:19 - Elizaveta Nyarko (Additional comments) Hi Emina, I hope you are doing well.","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=251751282b910f14171af4de5e91bf44&sysparm_record_target=task&sysparm_record_row=33&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-07-31 16:47:19","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-07-30 19:38:01","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-07-30 19:37:54","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-30 19:37:38","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-29 14:30:51","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-22 13:03:01","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-22 10:35:57","who":"Emina Kara"},{"kind":"comment","t":"2026-07-21 17:46:43","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-17 15:29:49","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-10 15:02:37","who":"Emina Kara"},{"kind":"comment","t":"2026-07-09 18:01:10","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-05 17:10:45","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-02 15:08:13","who":"Emina Kara"}],"brand":"Dobendan","description":"Briefing includes all DACH websites.","dueDate":"2026-06-23","lastActivityAt":"2026-07-31 16:47:19","lastActivityBy":"Elizaveta Nyarko","market":"Germany","openedAt":"2026-06-02 15:08:13","requestedFor":"Emina Kara","stateChangedAt":"2026-07-31 16:47:19","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2850791","shortDesc":"Updates for DACH websites","state":"Awaiting User Info"},{"_updated":"2026-08-21 16:22:06","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 16:22:06 - Tatyana Samoylenko (Additional comments) Hi Sophie, Happy Friday! Could yo","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=8dcd346d3b914b5451efb59704e45aff&sysparm_record_target=task&sysparm_record_row=34&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-21 16:22:06","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-19 11:44:45","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-08-19 11:44:04","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-12 22:45:27","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-10 16:11:47","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-29 15:48:46","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-23 12:48:54","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-21 13:15:09","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-08 13:53:08","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 11:33:37","who":"Sophie Blanchard"},{"kind":"comment","t":"2026-07-08 11:27:35","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-07 16:51:50","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-01 13:07:14","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-29 18:52:48","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-23 14:05:05","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-23 13:57:06","who":"Sophie Blanchard"},{"kind":"comment","t":"2026-06-23 13:53:37","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-23 11:21:39","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-23 11:10:34","who":"Sophie Blanchard"},{"kind":"comment","t":"2026-06-22 23:50:32","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-15 19:52:44","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-08 20:00:20","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-05 15:51:32","who":"Sophie Blanchard"}],"brand":"Fybogel","description":"Upload a copy of their receipt and explain in at least 100 words why they require a refund","dueDate":"2026-06-14","lastActivityAt":"2026-08-21 16:22:06","lastActivityBy":"Tatyana Samoylenko","market":"United Kingdom","openedAt":"2026-06-05 15:51:32","requestedFor":"Thomas Britton","stateChangedAt":"2026-07-21 13:15:09","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2855254","shortDesc":"Microsite for Money Back Guarantee promotion","state":"Awaiting User Info"},{"_updated":"2026-08-20 19:48:05","_updatedBy":"AMendez7","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-20 19:48:05 - Ali Méndez (Additional comments) deleted an attachment 2026-08-20 19:48:03 -","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=6cf296362b954354a4fffbc8f291bf77&sysparm_record_target=task&sysparm_record_row=35&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-20 19:48:05","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-20 19:48:03","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-20 19:47:44","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-20 19:47:20","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-20 19:27:51","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-20 19:25:16","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-20 18:30:14","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-17 19:27:30","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-08-14 22:06:05","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-14 22:05:14","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-14 22:05:12","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-14 22:05:11","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-14 22:05:09","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-14 22:05:06","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-14 22:05:04","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-14 22:04:50","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-27 17:33:33","who":"Ali Méndez"},{"kind":"comment","t":"2026-07-21 06:42:55","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-06-22 21:46:53","who":"Ali Méndez"},{"kind":"worknote","t":"2026-06-22 21:46:21","who":"Ali Méndez"},{"kind":"worknote","t":"2026-06-09 19:59:10","who":"Ali Méndez"},{"kind":"comment","t":"2026-06-09 19:16:06","who":"Ali Méndez"}],"brand":"Sico","description":"Images will be updated on the product detail page for “Piel con Piel” condoms. The PDP names will also be adjusted to improve SEO. Additionally, the header text in the articles sections will be updated, and the lower banners in the articles will be replaced with a custom image for each article.","dueDate":"2026-06-23","lastActivityAt":"2026-08-20 19:48:05","lastActivityBy":"Ali Méndez","market":"Mexico","openedAt":"2026-06-09 19:16:06","requestedFor":"Ali Méndez","stateChangedAt":"2026-08-20 18:30:14","stateChangedBy":"Ali Méndez"},"number":"RITM2858924","shortDesc":"Update Sico|Name and PDP´S","state":"Work In Progress"},{"_updated":"2026-08-26 22:59:56","_updatedBy":"AMendez7","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 22:59:56 - Ali Méndez (Additional comments) deleted an attachment 2026-08-26 22:59:53 -","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=7a8aee8d3b21039851efb59704e45a2a&sysparm_record_target=task&sysparm_record_row=36&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 22:59:56","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-26 22:59:54","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-26 22:59:47","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-26 00:06:32","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-08-20 19:22:48","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-20 19:16:29","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-20 19:16:28","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-20 19:14:34","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-20 19:14:32","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-17 19:28:01","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-17 14:30:05","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-11 20:36:00","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-11 20:35:57","who":"Ali Méndez"},{"kind":"comment","t":"2026-07-10 23:01:38","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-06-16 20:45:31","who":"Ali Méndez"}],"brand":"Harpic","description":"A comprehensive update of the Harpic brand website will be carried out, aimed at enhancing the user experience and optimizing search engine performance (SEO).\r\nKey actions:\r\n\r\nText adjustments and optimization across different site sections.\r\nIntegration of new renders in Product Detail Pages (PDPs).\r\nCreation of dedicated kit sections to improve navigation and conversion.\r\nImplementation of dynamic carousels for more engaging content presentation.\r\n\r\nSEO Optimization:\r\n\r\nInclusion of structured metadata to improve organic search visibility.\r\nEnhancement of content readability and relevance for search engines.\r\n\r\nObjective:\r\nTo elevate the user experience, streamline product exploration, and strengthen search engine visibility, ultimately driving increased traffic and conversions.","dueDate":"2026-06-30","lastActivityAt":"2026-08-26 22:59:56","lastActivityBy":"Ali Méndez","market":"Mexico","openedAt":"2026-06-16 20:45:31","requestedFor":"Ali Méndez","stateChangedAt":"2026-08-26 22:59:56","stateChangedBy":"Ali Méndez"},"number":"RITM2867288","shortDesc":"UPDATE WEBSITE","state":"Work In Progress"},{"_updated":"2026-08-20 15:31:26","_updatedBy":"AProlaga1","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-04 23:14:00 - Tatyana Samoylenko (Additional comments) Hi Anna, Thanks a lot for your respo","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=8225fe513b218710589d8c8a25e45abe&sysparm_record_target=task&sysparm_record_row=37&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-04 23:14:00","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-03 17:15:51","who":"Anna Stani"},{"kind":"comment","t":"2026-07-29 16:18:22","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-14 19:51:59","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-14 12:22:05","who":"Anna Stani"},{"kind":"comment","t":"2026-07-09 19:26:53","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 23:35:30","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-07 01:38:56","who":"Anna Stani"},{"kind":"worknote","t":"2026-07-07 01:38:38","who":"Anna Stani"},{"kind":"worknote","t":"2026-07-07 01:26:49","who":"Anna Stani"},{"kind":"comment","t":"2026-07-06 16:09:29","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-02 23:41:30","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-26 17:39:01","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-25 03:25:53","who":"Anna Stani"},{"kind":"worknote","t":"2026-06-23 13:41:57","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-23 00:18:12","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-17 16:10:22","who":"Anna Stani"}],"brand":"Finish","description":"Changes according to the new 2026 Hubble KV and portfolio, delisting of old products, updating the links and the store redirecting urls","dueDate":"2026-06-25","lastActivityAt":"2026-08-04 23:14:00","lastActivityBy":"Tatyana Samoylenko","market":"Poland","openedAt":"2026-06-17 16:10:22","requestedFor":"Anna Stani","stateChangedAt":"2026-08-03 17:15:51","stateChangedBy":"Anna Stani"},"number":"RITM2868341","shortDesc":"Finish 2026 website changes","state":"Work In Progress"},{"_updated":"2026-08-25 22:40:57","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 22:40:57 - Tatyana Samoylenko (Additional comments) Thank you, Anna! 2026-08-25 11:16:42","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=3e50f4612b69471c171af4de5e91bf96&sysparm_record_target=task&sysparm_record_row=38&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 22:40:57","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-25 11:16:42","who":"Anna Stani"},{"kind":"comment","t":"2026-08-21 16:11:57","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-21 14:49:19","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-21 13:31:03","who":"Anna Stani"},{"kind":"worknote","t":"2026-08-21 13:30:02","who":"Anna Stani"},{"kind":"worknote","t":"2026-08-21 13:30:01","who":"Anna Stani"},{"kind":"worknote","t":"2026-08-21 13:30:00","who":"Anna Stani"},{"kind":"comment","t":"2026-08-21 13:29:11","who":"Anna Stani"},{"kind":"comment","t":"2026-08-12 22:45:59","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-04 13:18:15","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-03 17:40:31","who":"Anna Stani"},{"kind":"comment","t":"2026-08-03 16:10:42","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-03 15:39:52","who":"Anna Stani"},{"kind":"comment","t":"2026-07-29 01:55:56","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 23:43:09","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-07 01:43:11","who":"Anna Stani"},{"kind":"comment","t":"2026-07-07 01:40:50","who":"Anna Stani"},{"kind":"comment","t":"2026-07-07 01:40:05","who":"Anna Stani"},{"kind":"comment","t":"2026-07-07 01:39:46","who":"Anna Stani"},{"kind":"comment","t":"2026-07-06 16:10:04","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-02 23:53:43","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-26 18:54:45","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-25 03:21:57","who":"Anna Stani"},{"kind":"comment","t":"2026-06-25 03:21:43","who":"Anna Stani"},{"kind":"comment","t":"2026-06-25 03:21:21","who":"Anna Stani"},{"kind":"comment","t":"2026-06-23 00:03:32","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-18 16:17:32","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-06-18 01:08:38","who":"Anna Stani"}],"brand":"Dettol","description":"Website update for the new portfolio packshots, delisting old products","dueDate":"2026-06-25","lastActivityAt":"2026-08-25 22:40:57","lastActivityBy":"Tatyana Samoylenko","market":"Poland","openedAt":"2026-06-18 01:08:38","requestedFor":"Anna Stani","stateChangedAt":"2026-08-25 11:16:42","stateChangedBy":"Anna Stani"},"number":"RITM2868952","shortDesc":"Website changes","state":"Work In Progress"},{"_updated":"2026-08-07 13:09:03","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-04 14:21:00 - Elizaveta Nyarko (Additional comments) Hi Rowena! I hope you are doing well.","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=c7cf2c8f3bad0710da7e789aa4e45a2d&sysparm_record_target=task&sysparm_record_row=39&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-04 14:21:00","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-31 16:31:24","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-31 14:23:52","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-31 13:05:04","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-30 20:00:26","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-24 18:55:15","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-23 16:34:19","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-23 14:44:45","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-17 12:49:13","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-10 17:38:33","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-08 17:28:37","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-08 12:00:50","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-03 15:01:36","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-07-03 15:01:28","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-03 13:45:39","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-01 13:11:37","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-25 18:14:27","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-25 17:53:11","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-25 16:28:44","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-25 16:28:19","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-25 16:10:06","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-06-25 15:20:45","who":"Rowena Hearn"},{"kind":"comment","t":"2026-06-22 16:57:05","who":"Rowena Hearn"}],"brand":"Finish","description":"Please can you create Finish Connected Sample form on PT? Content is below. This will connect to an API and data passed externally, so will provide you with a link. Can you please confirm if you can include an IBAN validator in the form (i.e., if the IBAN is incorrect, the form should display an error and prevent submission)? This will be key for the post-management of the cashbacks.\r\n\r\nTitle\r\nRECEBA 5€ DE VOLTA NA COMPRA DE UMA MÁQUINA BOSCH + FINISH\r\n\r\nSub-text\r\nParabéns pela sua nova máquina de lavar loiça Bosch!\r\n\r\nPara tornar a sua experiência ainda melhor, compre uma máquina Bosch e um produto Finish elegível, submeta os comprovativos de compra e receba 5€ de volta.\r\n\r\nPack shot to feature\r\n\r\nMáquina de lavar loiça Bosch\r\nFinish Ultimate Plus\r\nFinish Rinse Aid\r\nFinish Salt\r\nFinish Dishwasher Cleaner\r\n\r\nForm fields\r\nNome\r\nApelido\r\nEndereço de email\r\nNúmero de telefone\r\nUpload do comprovativo de compra da máquina Bosch\r\nUpload do comprovativo de compra do produto Finish\r\nData de compra\r\nIBAN\r\n\r\nConsent fields\r\n☐ Aceito receber comunicações da Reckitt sobre novidades, ofertas e promoções da marca Finish.\r\n\r\n☐ Aceito que os meus dados sejam analisados e utilizados pela Reckitt e parceiros de confiança para personalização de comunicações e campanhas.\r\n\r\n☐ Confirmo que li e aceito a Política de Privacidade e os Termos & Condições da campanha.\r\n\r\nButton label\r\nSUBMETER\r\n\r\nAdditional copy to sit on the page\r\nComo participar\r\n\r\n1. Compre uma máquina de lavar loiça Bosch e um produto Finish (acima de 12,99€).\r\n2. Preencha o formulário abaixo.\r\n3. Faça upload dos comprovativos de compra.\r\n4. Após validação, receberá 5€ diretamente na sua conta bancária.\r\n\r\nCampanha limitada ao período promocional e sujeita aos Termos & Condições. Apenas serão aceites compras realizadas em Portugal. O reembolso será efetuado após validação dos comprovativos submetidos.","dueDate":"2026-06-29","lastActivityAt":"2026-08-04 14:21:00","lastActivityBy":"Elizaveta Nyarko","market":"Portugal","openedAt":"2026-06-22 16:57:05","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-07 13:09:03","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2873041","shortDesc":"Finish Connected Sampling - PT","state":"On hold"},{"_updated":"2026-08-20 16:00:19","_updatedBy":"AProlaga1","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-08-14 12:32:01 - Tatyana Samoylenko (Additional comments) Let me add: we added the retailer lin","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=40e0c7c22b31cf109bb2fe61de91bf4f&sysparm_record_target=task&sysparm_record_row=40&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-14 12:32:01","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-14 12:24:43","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-10 18:10:48","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-10 16:23:57","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-04 17:58:25","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-04 17:17:21","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-29 01:44:04","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-23 18:04:11","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-16 19:52:57","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-16 12:01:03","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-15 15:50:47","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-15 10:55:48","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-14 23:15:16","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-09 15:40:39","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-09 11:08:52","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-09 11:07:29","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-09 11:04:04","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-07-09 10:55:54","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 23:48:49","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 12:00:09","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-02 11:12:43","who":"Rowena Hearn"}],"brand":"Dettol","description":"Cinderella campaign. Design in progress. 2000GBP\r\n\r\nWhen design is ready, DA to quote for the following:\r\n\r\n4 x updated PDPs\r\n1 x new PDP\r\nHomepage banner\r\nLanding Page\r\n\r\nGO live August 2026","dueDate":"2026-07-31","lastActivityAt":"2026-08-14 12:32:01","lastActivityBy":"Tatyana Samoylenko","market":"United Kingdom","openedAt":"2026-07-02 11:12:43","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-14 12:24:43","stateChangedBy":"Tatyana Samoylenko"},"number":"RITM2885259","shortDesc":"Dettol - Cinderella","state":"Awaiting User Info"},{"_updated":"2026-08-21 19:40:08","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 19:40:08 - Elizaveta Nyarko (Additional comments) Hi Marie, I hope you are doing well.","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=d73d7f522bf147509bb2fe61de91bf5a&sysparm_record_target=task&sysparm_record_row=41&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-21 19:40:08","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-12 15:46:51","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-11 19:20:27","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-07 12:28:18","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-03 15:24:12","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-08 14:37:53","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-03 10:14:56","who":"Marie Albert"}],"brand":"Finish","description":"PLEASE UPDATE THE FINISH WEBSITE","dueDate":"2026-07-17","lastActivityAt":"2026-08-21 19:40:08","lastActivityBy":"Elizaveta Nyarko","market":"France","openedAt":"2026-07-03 10:14:56","requestedFor":"Marie Albert","stateChangedAt":"2026-08-21 19:40:08","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2886705","shortDesc":"WEBSITE UPDATE 2026","state":"Awaiting User Info"},{"_updated":"2026-08-12 22:58:23","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-12 22:58:23 - Tatyana Samoylenko (Additional comments) Dear Giulia, Could you please provi","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=a68a88a23b394314a8d31e8693e45ad9&sysparm_record_target=task&sysparm_record_row=42&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-12 22:58:23","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-03 17:50:06","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-29 13:53:32","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-29 13:49:56","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-29 12:34:37","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-29 01:48:25","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-24 10:21:50","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-23 18:05:36","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-14 21:18:24","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-14 17:17:27","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-14 17:13:43","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-14 12:37:09","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-09 13:29:55","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-09 11:11:55","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-09 11:08:03","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 17:28:34","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-08 17:23:29","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 17:05:34","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-08 17:05:08","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-08 16:58:58","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-07-08 16:50:22","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 15:11:18","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-08 14:04:09","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 11:39:30","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-06 16:49:58","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-06 16:46:33","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-03 16:08:29","who":"Giulia Dossena"},{"kind":"comment","t":"2026-07-03 16:00:20","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-03 11:13:02","who":"Giulia Dossena"}],"brand":"Durex","description":"BAU front-end change to DataArt to add a standard Hyperlink from from [durex.co.uk] to [durex.it].","dueDate":"2026-07-10","lastActivityAt":"2026-08-12 22:58:23","lastActivityBy":"Tatyana Samoylenko","market":"Italy","openedAt":"2026-07-03 11:13:02","requestedFor":"Giulia Dossena","stateChangedAt":"2026-08-03 17:50:06","stateChangedBy":"Tatyana Samoylenko"},"number":"RITM2886815","shortDesc":"BAU front-end change to DataArt","state":"Awaiting User Info"},{"_updated":"2026-08-20 23:15:55","_updatedBy":"DCasasno","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-20 23:15:55 - Damian Casasnovas (Additional comments) Hi Larissa, The estimation for thi","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=4d3306ab3bb5c394fa9d2f37f4e45a41&sysparm_record_target=task&sysparm_record_row=43&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-20 23:15:55","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-08-19 23:20:55","who":"Vinicius Santos"},{"kind":"worknote","t":"2026-08-19 23:20:40","who":"Vinicius Santos"},{"kind":"worknote","t":"2026-08-19 23:18:56","who":"Vinicius Santos"},{"kind":"worknote","t":"2026-08-19 23:18:00","who":"Vinicius Santos"},{"kind":"comment","t":"2026-08-18 16:29:16","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-16 22:26:09","who":"Larissa Batistetti"},{"kind":"worknote","t":"2026-07-16 22:26:08","who":"Larissa Batistetti"},{"kind":"comment","t":"2026-07-16 22:25:08","who":"Larissa Batistetti"},{"kind":"worknote","t":"2026-07-16 22:25:07","who":"Larissa Batistetti"},{"kind":"comment","t":"2026-07-16 22:24:49","who":"Larissa Batistetti"},{"kind":"worknote","t":"2026-07-16 22:24:48","who":"Larissa Batistetti"},{"kind":"worknote","t":"2026-07-16 22:15:49","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-07-16 22:13:54","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-16 22:12:14","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-07-16 00:16:24","who":"Larissa Batistetti"},{"kind":"comment","t":"2026-07-16 00:15:49","who":"Larissa Batistetti"},{"kind":"worknote","t":"2026-07-16 00:15:48","who":"Larissa Batistetti"},{"kind":"comment","t":"2026-07-14 21:26:19","who":"Larissa Batistetti"},{"kind":"worknote","t":"2026-07-14 21:26:08","who":"Larissa Batistetti"},{"kind":"comment","t":"2026-07-10 22:20:40","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-07-10 22:18:20","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-06 22:34:08","who":"Larissa Batistetti"}],"brand":"Luftal","description":"We request that the Luftal website be updated to the latest version of Husky, which in this case is 12.6.1.\r\nhttps://www.luftal.com.br/\r\n\r\nFollowing the upgrade, technical implementations will be required in accordance with SEO recommendations.","dueDate":"2026-07-17","lastActivityAt":"2026-08-20 23:15:55","lastActivityBy":"Damian Casasnovas","market":"Brazil","openedAt":"2026-07-06 22:34:08","requestedFor":"Larissa Batistetti","stateChangedAt":"2026-08-20 23:15:55","stateChangedBy":"Damian Casasnovas"},"number":"RITM2889467","shortDesc":"Website upgrade and technical adjustments (SEO) | Luftal","state":"Awaiting User Info"},{"_updated":"2026-08-27 12:21:00","_updatedBy":"RHearn","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 12:21:00 - Rowena Hearn (Additional comments) yes, fine to remove 2026-08-27 12:19:45 -","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=606fcd7f3b3dcf94da7e789aa4e45aac&sysparm_record_target=task&sysparm_record_row=44&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 12:21:00","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-27 12:19:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-21 17:55:57","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-21 12:53:26","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-17 12:03:13","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-08-17 12:02:45","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-17 12:02:03","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-14 19:32:27","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-04 15:58:26","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-03 16:07:40","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-03 15:51:52","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-03 14:12:50","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-31 13:29:24","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-30 19:43:11","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-30 11:31:28","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-28 13:00:39","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-28 12:50:54","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-09 11:13:14","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-08 18:38:38","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-07 13:26:14","who":"Rowena Hearn"}],"brand":"Durex","description":"Creating a ticket here for the LGYM campaign. At present, Lilit is completing the design work, here - https://www.figma.com/design/WpT8uoZXLcvXqkerLrWpOR/Durex?node-id=20346-1397&t=vVAvc4zCfPU5MOeK-1\r\n\r\nWhen ready, I will confirm. Landing Page and Homepage banner will need to be built on UK website.","dueDate":"2026-07-28","lastActivityAt":"2026-08-27 12:21:00","lastActivityBy":"Rowena Hearn","market":"United Kingdom","openedAt":"2026-07-07 13:26:14","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-27 12:21:00","stateChangedBy":"Rowena Hearn"},"number":"RITM2890351","shortDesc":"Lube Gives You More - Durex UK","state":"Work In Progress"},{"_updated":"2026-08-27 14:51:53","_updatedBy":"FLiapodi","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 14:51:53 - Froso Liapodimitri (Additional comments) Hey! please find attached the ppt inc","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=2becbdff3b3dcfd0589d8c8a25e45a7b&sysparm_record_target=task&sysparm_record_row=45&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 14:51:53","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-08-27 14:48:33","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-08-25 11:22:58","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-25 11:14:15","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-08-25 11:07:00","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-24 09:19:01","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-08-21 16:18:17","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-17 16:43:14","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-08-17 16:38:28","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-17 15:44:14","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-08-12 23:06:59","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-06 12:20:51","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-30 11:09:33","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-30 09:26:56","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-07-29 17:33:40","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-27 16:02:36","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-07-27 13:01:42","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-21 13:42:50","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-07-17 09:49:43","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-07-17 09:25:03","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-16 20:05:29","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-16 20:04:21","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-07-16 09:56:11","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-07-16 09:56:01","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-07-15 21:03:47","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-15 15:51:26","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-13 15:22:53","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-07-13 15:22:36","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-07-13 15:22:11","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-07-13 15:21:55","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-07-13 15:21:39","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-07-13 15:21:20","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-07-13 15:21:04","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-07-13 15:20:51","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-07-13 15:20:21","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-07-13 15:18:54","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-07-13 15:18:49","who":"Froso Liapodimitri"},{"kind":"worknote","t":"2026-07-13 15:18:41","who":"Froso Liapodimitri"},{"kind":"comment","t":"2026-07-09 10:48:06","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-07-09 10:46:19","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-07-09 10:46:18","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-07 16:45:13","who":"Froso Liapodimitri"}],"brand":"Dettol","description":"i would like to update the current microsite for the upcoming context which will start 6/8/2026 until 19/8/2026. the only thing is that i need to send you an updated banner for the main screen. please see the attachment screen and share the specs of the banner in orange box!","dueDate":"2026-07-31","lastActivityAt":"2026-08-27 14:51:53","lastActivityBy":"Froso Liapodimitri","market":"Greece","openedAt":"2026-07-07 16:45:13","requestedFor":"Froso Liapodimitri","stateChangedAt":"2026-08-27 14:51:53","stateChangedBy":"Froso Liapodimitri"},"number":"RITM2890765","shortDesc":"update microsite https://www.apostolikathariotita.gr/ (next contest 6/8/2026)","state":"Work In Progress"},{"_updated":"2026-08-19 05:49:07","_updatedBy":"DCasasno","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-19 05:49:07 - Damian Casasnovas (Additional comments) We are still waiting for the final doc","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=dd30af3b3bb58394a8d31e8693e45a2e&sysparm_record_target=task&sysparm_record_row=46&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-19 05:49:07","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-14 15:16:03","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-14 14:55:39","who":"Sarah Rodrigues"},{"kind":"comment","t":"2026-07-14 05:57:42","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-13 22:50:19","who":"Sarah Rodrigues"},{"kind":"comment","t":"2026-07-09 01:43:41","who":"Sarah Rodrigues"},{"kind":"worknote","t":"2026-07-09 01:43:40","who":"Sarah Rodrigues"},{"kind":"comment","t":"2026-07-09 01:43:39","who":"Sarah Rodrigues"},{"kind":"worknote","t":"2026-07-09 01:43:36","who":"Sarah Rodrigues"},{"kind":"comment","t":"2026-07-09 01:43:35","who":"Sarah Rodrigues"},{"kind":"worknote","t":"2026-07-09 01:43:34","who":"Sarah Rodrigues"},{"kind":"worknote","t":"2026-07-09 01:43:20","who":"Sarah Rodrigues"},{"kind":"comment","t":"2026-07-09 01:42:40","who":"Sarah Rodrigues"},{"kind":"comment","t":"2026-07-09 01:41:04","who":"Sarah Rodrigues"},{"kind":"worknote","t":"2026-07-09 01:41:03","who":"Sarah Rodrigues"},{"kind":"comment","t":"2026-07-08 21:53:41","who":"Sarah Rodrigues"},{"kind":"comment","t":"2026-07-08 21:38:18","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-07 23:58:58","who":"Sarah Rodrigues"}],"brand":"Vanish","description":"Please find attached the spreadsheet containing the technical SEO recommendations for website:\r\nhttps://www.vanish.com.br/","dueDate":"2026-07-07","lastActivityAt":"2026-08-19 05:49:07","lastActivityBy":"Damian Casasnovas","market":"Brazil","openedAt":"2026-07-07 23:58:58","requestedFor":"Sarah Rodrigues","stateChangedAt":"2026-08-19 05:49:07","stateChangedBy":"Damian Casasnovas"},"number":"RITM2891219","shortDesc":"SEO technical implementations | Vanish","state":"Awaiting User Info"},{"_updated":"2026-08-26 19:00:50","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 19:00:49 - Alesya Prolagayeva (Work notes) Attachment: Strepsils FR with changes.pdf has","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=edc38a8c3b8ec794a8d31e8693e45a39&sysparm_record_target=task&sysparm_record_row=47&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"worknote","t":"2026-08-26 19:00:50","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-26 19:00:11","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-26 17:59:26","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-11 19:09:21","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-10 13:00:02","who":"Andrea Casalese"},{"kind":"comment","t":"2026-08-07 20:54:03","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-05 16:29:53","who":"Andrea Casalese"},{"kind":"comment","t":"2026-07-23 11:02:46","who":"Andrea Casalese"},{"kind":"comment","t":"2026-07-22 18:54:55","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-21 12:09:05","who":"Andrea Casalese"},{"kind":"comment","t":"2026-07-21 12:07:15","who":"Andrea Casalese"},{"kind":"comment","t":"2026-07-15 14:50:10","who":"Andrea Casalese"},{"kind":"comment","t":"2026-07-15 14:47:34","who":"Andrea Casalese"},{"kind":"comment","t":"2026-07-13 10:55:11","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-08 11:53:36","who":"Andrea Casalese"}],"brand":"Strepsils","description":"As part of the VISA renewal and following the feedback from the French Health Authorities, we need to implement the changes outlined in the attached presentation. Please note that all changes requested by the Health Authorities are MANDATORY. If any of these changes cannot be implemented, we will need to temporarily take the website offline until compliance is achieved. For this reason, we kindly ask you that these updates be treated as a priority.","dueDate":"2026-07-10","lastActivityAt":"2026-08-26 19:00:50","lastActivityBy":"Alesya Prolagayeva","market":"France","openedAt":"2026-07-08 11:53:36","requestedFor":"Andrea Casalese","stateChangedAt":"2026-08-26 17:59:26","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2891763","shortDesc":"Strepsils FR - Changes Required by Health Authorities","state":"Awaiting User Info"},{"_updated":"2026-08-26 12:16:56","_updatedBy":"astani","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 12:16:56 - Anna Stani (Additional comments) Also please, chenge the logo for the new one","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=df95eb40330a4b1426e5d042cd5c7b9c&sysparm_record_target=task&sysparm_record_row=48&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 12:16:56","who":"Anna Stani"},{"kind":"worknote","t":"2026-08-26 12:16:37","who":"Anna Stani"},{"kind":"worknote","t":"2026-08-26 12:16:34","who":"Anna Stani"},{"kind":"worknote","t":"2026-08-26 12:16:33","who":"Anna Stani"},{"kind":"worknote","t":"2026-08-26 12:14:15","who":"Anna Stani"},{"kind":"comment","t":"2026-08-26 12:14:07","who":"Anna Stani"},{"kind":"comment","t":"2026-08-26 12:14:01","who":"Anna Stani"},{"kind":"comment","t":"2026-08-25 22:45:17","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-19 18:49:40","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-14 17:59:03","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-13 19:11:56","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-13 14:27:08","who":"Anna Stani"},{"kind":"comment","t":"2026-08-12 18:12:37","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-12 16:14:33","who":"Anna Stani"},{"kind":"worknote","t":"2026-08-12 16:13:59","who":"Anna Stani"},{"kind":"worknote","t":"2026-08-12 16:13:57","who":"Anna Stani"},{"kind":"comment","t":"2026-08-08 19:38:55","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-08-08 19:25:18","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-04 13:15:00","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-03 17:54:38","who":"Anna Stani"},{"kind":"comment","t":"2026-08-03 17:41:54","who":"Anna Stani"},{"kind":"comment","t":"2026-07-29 11:13:40","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-24 20:54:43","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-24 17:09:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-17 16:43:08","who":"Anna Stani"},{"kind":"comment","t":"2026-07-17 16:43:07","who":"Anna Stani"},{"kind":"comment","t":"2026-07-17 16:43:07","who":"Anna Stani"},{"kind":"worknote","t":"2026-07-17 16:43:05","who":"Anna Stani"},{"kind":"comment","t":"2026-07-17 16:19:56","who":"Anna Stani"},{"kind":"worknote","t":"2026-07-17 16:19:52","who":"Anna Stani"},{"kind":"comment","t":"2026-07-17 14:12:15","who":"Anna Stani"},{"kind":"worknote","t":"2026-07-17 14:11:58","who":"Anna Stani"},{"kind":"comment","t":"2026-07-16 19:02:58","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-16 16:01:19","who":"Anna Stani"},{"kind":"worknote","t":"2026-07-16 16:01:10","who":"Anna Stani"},{"kind":"worknote","t":"2026-07-16 16:01:06","who":"Anna Stani"},{"kind":"comment","t":"2026-07-16 15:56:36","who":"Anna Stani"},{"kind":"comment","t":"2026-07-15 12:25:05","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-08 19:03:37","who":"Anna Stani"},{"kind":"comment","t":"2026-07-08 19:01:04","who":"Anna Stani"}],"brand":"Vanish","description":"Website update for the new portfolio packshots, delisting old products","dueDate":"2026-07-15","lastActivityAt":"2026-08-26 12:16:56","lastActivityBy":"Anna Stani","market":"Poland","openedAt":"2026-07-08 19:01:04","requestedFor":"Anna Stani","stateChangedAt":"2026-08-26 12:14:01","stateChangedBy":"Anna Stani"},"number":"RITM2892540","shortDesc":"www.Vanish.pl update","state":"Work In Progress"},{"_updated":"2026-07-27 16:11:48","_updatedBy":"DCasasno","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-07-27 16:11:48 - Damian Casasnovas (Additional comments) Hi Ali, the estimation for this ticket","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=29d05cbd3bc6c310fa9d2f37f4e45a5b&sysparm_record_target=task&sysparm_record_row=49&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-07-27 16:11:48","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-07-24 20:58:44","who":"Ali Méndez"},{"kind":"comment","t":"2026-07-24 04:17:50","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-07-23 13:13:37","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-23 13:07:08","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-23 12:58:39","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-23 12:47:02","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-23 12:40:59","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-23 12:28:38","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 20:23:51","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 20:23:40","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 19:53:26","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 19:53:14","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 19:49:05","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 19:48:47","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 19:34:32","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 19:34:23","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 19:30:18","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 19:30:03","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 19:27:12","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 19:26:56","who":"Ali Méndez"},{"kind":"comment","t":"2026-07-22 19:19:16","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 19:19:13","who":"Ali Méndez"},{"kind":"comment","t":"2026-07-22 19:18:53","who":"Ali Méndez"},{"kind":"worknote","t":"2026-07-22 19:18:49","who":"Ali Méndez"},{"kind":"comment","t":"2026-07-16 06:32:55","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-13 14:00:48","who":"Ali Méndez"}],"brand":"Strepsils","description":"In this ticket, we will update the Strepsils product renders across all sections of the website. The renders can be found in Web Factory and are also attached here.","dueDate":"2026-07-20","lastActivityAt":"2026-07-27 16:11:48","lastActivityBy":"Damian Casasnovas","market":"Mexico","openedAt":"2026-07-13 14:00:48","requestedFor":"Ali Méndez","stateChangedAt":"2026-07-24 04:17:50","stateChangedBy":"Damian Casasnovas"},"number":"RITM2897455","shortDesc":"RENDERS UPDATE | GRANEODIN","state":"Awaiting User Info"},{"_updated":"2026-08-11 11:25:16","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-11 11:25:16 - Alesya Prolagayeva (Additional comments) Hi Andra, could you please confirm yo","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=bd841c822b8a43582a99ff65d891bfe3&sysparm_record_target=task&sysparm_record_row=50&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-11 11:25:16","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-20 18:15:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-17 11:31:52","who":"Andra Chiribici"},{"kind":"comment","t":"2026-07-14 08:55:25","who":"Andra Chiribici"}],"brand":"Finish","description":"Hello, please help me unhide the following link: https://www.finish.ro/promotii/inscriere/ - we are starting a new campaign and we need the page","dueDate":"2026-07-15","lastActivityAt":"2026-08-11 11:25:16","lastActivityBy":"Alesya Prolagayeva","market":"Romania","openedAt":"2026-07-14 08:55:25","requestedFor":"Andra Chiribici","stateChangedAt":"2026-07-20 18:15:23","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2898516","shortDesc":"Unhide Finish website link","state":"Awaiting User Info"},{"_updated":"2026-08-26 13:54:59","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 DACH-NORDICS CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 13:54:59 - Elizaveta Nyarko (Additional comments) Hi Jacqueline, I hope you are doing w","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=9e2f3c463b46cb94589d8c8a25e45a8d&sysparm_record_target=task&sysparm_record_row=51&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 13:55:00","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-26 11:54:47","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-08-26 11:52:55","who":"Jacqueline Merkel"},{"kind":"comment","t":"2026-08-24 12:19:44","who":"Taras Shevchenko"},{"kind":"comment","t":"2026-07-31 12:06:28","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-07-30 11:27:14","who":"Jacqueline Merkel"},{"kind":"comment","t":"2026-07-30 11:25:40","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-07-30 11:25:38","who":"Jacqueline Merkel"},{"kind":"comment","t":"2026-07-30 11:25:28","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-07-30 11:25:26","who":"Jacqueline Merkel"},{"kind":"comment","t":"2026-07-30 11:25:07","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-07-30 11:25:05","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-07-30 11:25:00","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-07-30 11:23:53","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-07-30 11:23:25","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-07-30 11:21:30","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-07-30 11:20:15","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-07-30 11:19:03","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-07-30 11:05:35","who":"Jacqueline Merkel"},{"kind":"comment","t":"2026-07-23 15:48:05","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-14 14:13:03","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-07-14 14:12:48","who":"Jacqueline Merkel"},{"kind":"comment","t":"2026-07-14 14:12:42","who":"Jacqueline Merkel"},{"kind":"worknote","t":"2026-07-14 14:12:41","who":"Jacqueline Merkel"},{"kind":"comment","t":"2026-07-14 12:01:41","who":"Jacqueline Merkel"}],"brand":"Durex","description":"Please update DUREX CH Website, see attached briefing for that. The corresponding Excel overview and ZIP files can be found under ticket number RITM2782465 or RITM2823952.","dueDate":"2026-08-11","lastActivityAt":"2026-08-26 13:55:00","lastActivityBy":"Elizaveta Nyarko","market":"Switzerland","openedAt":"2026-07-14 12:01:41","requestedFor":"Jacqueline Merkel","stateChangedAt":"2026-08-26 11:54:47","stateChangedBy":"Jacqueline Merkel"},"number":"RITM2898840","shortDesc":"DUREX CH Website Update","state":"Work In Progress"},{"_updated":"2026-08-14 18:18:00","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-14 18:17:59 - Elizaveta Nyarko (Additional comments) Hi Eszter, I hope you are doing well.","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=430eaad6330e4bd426e5d042cd5c7bba&sysparm_record_target=task&sysparm_record_row=52&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-14 18:18:00","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-14 16:00:48","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-13 16:22:21","who":"Eszter Balogh"},{"kind":"worknote","t":"2026-08-13 16:22:00","who":"Eszter Balogh"},{"kind":"comment","t":"2026-08-13 16:04:10","who":"Eszter Balogh"},{"kind":"worknote","t":"2026-08-13 16:03:55","who":"Eszter Balogh"},{"kind":"comment","t":"2026-08-13 15:01:53","who":"Eszter Balogh"},{"kind":"comment","t":"2026-08-13 15:00:09","who":"Eszter Balogh"},{"kind":"worknote","t":"2026-08-13 13:56:42","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-13 13:55:59","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-12 18:32:52","who":"Eszter Balogh"},{"kind":"comment","t":"2026-08-12 18:32:28","who":"Eszter Balogh"},{"kind":"comment","t":"2026-08-12 18:03:22","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-10 13:57:58","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-07 13:22:08","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-06 17:06:44","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-06 14:37:11","who":"Eszter Balogh"},{"kind":"worknote","t":"2026-08-06 13:21:33","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-06 13:18:50","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-05 13:10:33","who":"Eszter Balogh"},{"kind":"comment","t":"2026-08-05 13:10:32","who":"Eszter Balogh"},{"kind":"comment","t":"2026-07-31 14:07:23","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-07-31 14:04:45","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-30 11:06:03","who":"Eszter Balogh"},{"kind":"comment","t":"2026-07-29 15:34:11","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-29 12:45:08","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-27 18:26:50","who":"Eszter Balogh"},{"kind":"worknote","t":"2026-07-27 18:21:49","who":"Eszter Balogh"},{"kind":"worknote","t":"2026-07-27 16:33:59","who":"Eszter Balogh"},{"kind":"comment","t":"2026-07-20 14:11:57","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-15 18:16:47","who":"Eszter Balogh"},{"kind":"worknote","t":"2026-07-15 18:11:25","who":"Eszter Balogh"},{"kind":"comment","t":"2026-07-15 18:10:38","who":"Eszter Balogh"},{"kind":"comment","t":"2026-07-15 14:44:37","who":"Eszter Balogh"}],"brand":"Strepsils","description":"update of the strepsils.hu website with B+ images on each product page","dueDate":"2026-08-01","lastActivityAt":"2026-08-14 18:18:00","lastActivityBy":"Elizaveta Nyarko","market":"Hungary","openedAt":"2026-07-15 14:44:37","requestedFor":"Eszter Balogh","stateChangedAt":"2026-08-14 16:00:48","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2900650","shortDesc":"HU strepsils website update with B+ images","state":"Awaiting User Info"},{"_updated":"2026-08-17 19:13:04","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-08-17 19:13:04 - Alesya Prolagayeva (Additional comments) Hello Row, do you think market can br","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=2ffc680c33da0f5826e5d042cd5c7b2b&sysparm_record_target=task&sysparm_record_row=53&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-17 19:13:04","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-23 11:14:58","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-22 19:16:48","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-20 15:50:09","who":"Rowena Hearn"}],"brand":"Finish","description":"This ticket is for the design and build of website assets for Finish UK Supernova NPD. I have already sent details to Lilit on Teams.\r\n\r\nThis is a new product for Finish, which is the most premium detergent, Finish Ultimate Diamond. In this folder, you can find key visual, email from brand team with the info in it, some of the assets extracted and a brief I have put together for website design assets in PPT - https://rbcom.sharepoint.com/:f:/s/CGO_DigitalTeam/IgBEEc3et9peTpTNj0RxwtDVAfKcyvXaZMvmpajYlCLWupU?email=Lilit.Abrahamyan%40reckitt.com&e=YsO39H\r\n\r\nBuild will be a landing page, homepage banner, new PDP, update to detergent carousel on homepage","dueDate":"2026-08-31","lastActivityAt":"2026-08-17 19:13:04","lastActivityBy":"Alesya Prolagayeva","market":"United Kingdom","openedAt":"2026-07-20 15:50:09","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-17 19:13:04","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2905228","shortDesc":"Finish UK - Supernova NPD","state":"Awaiting User Info"},{"_updated":"2026-08-27 11:43:50","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 11:43:50 - Alesya Prolagayeva (Additional comments) Hi Row, it's live! Let me know if we","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=87b0dd4c2b9ec754fda6feecf291bf65&sysparm_record_target=task&sysparm_record_row=54&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 11:43:50","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-21 17:23:28","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-21 13:00:10","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-18 12:41:59","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-17 20:01:52","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-13 13:03:56","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-13 12:38:51","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-08-13 12:38:45","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-08-13 12:38:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-11 13:54:34","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-04 15:55:46","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-28 13:16:30","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-20 18:26:18","who":"Rowena Hearn"}],"brand":"Vanish","description":"Hello, \r\n\r\nAcross Vanish, we have 3 FAQ pages. These URL's can remain as is, but can you move each question and answer on to their own URL as per the best practice guidelines. \r\n\r\nMeta title can be the full question.\r\n\r\nhttps://www.vanish.co.uk/products/stain-removers/help/\r\nhttps://www.vanish.co.uk/sustainability-faqs/\r\nhttps://www.vanish.co.uk/products/fabric-whiteners/help/\r\n\r\nThanks, Row","dueDate":"2026-07-31","lastActivityAt":"2026-08-27 11:43:50","lastActivityBy":"Alesya Prolagayeva","market":"United Kingdom","openedAt":"2026-07-20 18:26:18","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-27 11:43:50","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2905448","shortDesc":"Vanish UK - FAQ structure","state":"Awaiting User Info"},{"_updated":"2026-08-27 14:57:57","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 14:57:57 - Elizaveta Nyarko (Additional comments) Hi Row, I hope you are doing well.","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=3f2305143316839826e5d042cd5c7b3e&sysparm_record_target=task&sysparm_record_row=55&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 14:57:57","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-27 12:46:00","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-26 19:03:53","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-26 19:03:47","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-25 18:36:15","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-25 18:18:44","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-25 14:12:58","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-21 19:12:41","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-21 17:37:29","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-07 14:23:40","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-05 18:44:23","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-05 18:42:59","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-03 18:34:39","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-31 17:05:07","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-30 19:59:02","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-29 17:42:15","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-24 18:24:33","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-23 15:20:18","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-22 16:59:59","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-21 12:05:35","who":"Rowena Hearn"}],"brand":"Durex","description":"Context - We currently have a park of cash related distributors, and are developing a new version of casheless distributors. We want to make available on the Durex website the list or even a geo-localized mapping of those machines , so that consumers can relate to it to find the closest one.\r\n\r\nThis project will require design.\r\n\r\nScope/Design Requirements:\r\n- Add a new navigation item.\r\n- Add a new banner directly below the homepage hero/banner.\r\n- Create a new landing page to support the vending machine initiative.\r\n\r\nGoogle Maps Integration:\r\n- Build a custom map component that embeds Google Maps.\r\n- The component should support plotting a supplied list of geo-coordinated locations as map markers.\r\n- Location data is provided and should be configurable/manageable as the list evolves.\r\n\r\nAssets & Timing\r\n- Detailed requirements are attached and should provide sufficient information for design and development estimation to commence.\r\n- Final creative assets (ie. icons, background etc) are still pending and will be supplied separately.\r\n- The vending machine launch is planned for September, so development should begin as soon as possible to support delivery timelines.\r\n\r\nThe brief and list of vendors information can be found, here - https://rbcom.sharepoint.com/:f:/s/CGO_DigitalTeam/IgCMHIpBSMcvRIrhSfm9hYtyAeJpNEMY9cOMwluSX-nBNU4?e=jjFwqs\r\n\r\nWithin the brief, they have made a layout, but are open to this changing to keep the page in line with the Durex master design and brand world.\r\n\r\nFrance will be funding this so please provide the cost in EUR","dueDate":"2026-07-31","lastActivityAt":"2026-08-27 14:57:57","lastActivityBy":"Elizaveta Nyarko","market":"France","openedAt":"2026-07-21 12:05:35","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-25 18:18:44","stateChangedBy":"Rowena Hearn"},"number":"RITM2906334","shortDesc":"Durex FR - Vending Machine Promotion","state":"Work In Progress"},{"_updated":"2026-08-25 04:36:02","_updatedBy":"DCasasno","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 04:36:02 - Damian Casasnovas (Additional comments) Thanks Thayssa, I'll wait for the feed","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=f57363e03b9e8fd0fa9d2f37f4e45a2c&sysparm_record_target=task&sysparm_record_row=56&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 04:36:02","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-25 01:59:38","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-08-21 20:41:42","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-21 12:46:02","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-08-19 04:57:04","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-17 23:17:35","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-08-13 23:42:20","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-12 16:12:26","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-08-10 23:33:43","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-10 17:31:06","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-08-10 17:27:06","who":"Thayssa Rodrigues Soares"},{"kind":"worknote","t":"2026-08-10 17:27:03","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-08-10 17:26:55","who":"Thayssa Rodrigues Soares"},{"kind":"worknote","t":"2026-08-10 17:26:53","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-08-10 17:26:24","who":"Thayssa Rodrigues Soares"},{"kind":"worknote","t":"2026-08-10 17:26:22","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-08-10 17:24:11","who":"Thayssa Rodrigues Soares"},{"kind":"worknote","t":"2026-08-10 17:24:09","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-08-10 17:23:54","who":"Thayssa Rodrigues Soares"},{"kind":"worknote","t":"2026-08-10 17:23:52","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-08-10 17:23:51","who":"Thayssa Rodrigues Soares"},{"kind":"worknote","t":"2026-08-10 17:23:48","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-08-10 17:23:47","who":"Thayssa Rodrigues Soares"},{"kind":"worknote","t":"2026-08-10 17:23:45","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-08-08 04:34:42","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-24 20:09:46","who":"Thayssa Rodrigues Soares"},{"kind":"comment","t":"2026-07-24 19:49:00","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-24 19:46:08","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-22 18:24:21","who":"Thayssa Rodrigues Soares"}],"brand":"Finish","description":"Change the Finish Community banner to match the reference provided in the attachment. https://www.finishbrasil.com.br/cadastro/","dueDate":"2026-07-27","lastActivityAt":"2026-08-25 04:36:02","lastActivityBy":"Damian Casasnovas","market":"Brazil","openedAt":"2026-07-22 18:24:21","requestedFor":"Thayssa Rodrigues Soares","stateChangedAt":"2026-08-25 04:36:02","stateChangedBy":"Damian Casasnovas"},"number":"RITM2908793","shortDesc":"Change the banner on the Finish Community page.","state":"Awaiting User Info"},{"_updated":"2026-08-25 23:31:21","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 14:24:44 - Tatyana Samoylenko (Additional comments) Hi Margot, Happy Friday! The new","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=99e35ccd3b528310a8d31e8693e45a68&sysparm_record_target=task&sysparm_record_row=57&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-21 14:24:44","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-19 18:57:38","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-17 17:04:33","who":"Margot Schneider"},{"kind":"worknote","t":"2026-08-17 17:04:01","who":"Margot Schneider"},{"kind":"comment","t":"2026-08-17 11:45:59","who":"Margot Schneider"},{"kind":"comment","t":"2026-08-17 11:45:27","who":"Margot Schneider"},{"kind":"comment","t":"2026-08-12 15:24:43","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-12 12:38:09","who":"Margot Schneider"},{"kind":"comment","t":"2026-08-10 15:42:35","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-10 15:38:41","who":"Margot Schneider"},{"kind":"comment","t":"2026-08-10 13:08:39","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-08-10 13:08:32","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-03 15:34:50","who":"Margot Schneider"},{"kind":"comment","t":"2026-08-03 14:22:33","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-03 13:49:09","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-08-03 11:06:46","who":"Margot Schneider"},{"kind":"comment","t":"2026-08-03 11:06:38","who":"Margot Schneider"},{"kind":"comment","t":"2026-07-30 18:16:31","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-07-30 18:13:00","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-29 07:44:50","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-07-23 17:14:57","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-23 16:34:25","who":"Margot Schneider"}],"brand":"Gaviscon","description":"Additional changes on monequilibredigestif.fr website","dueDate":"2026-07-23","lastActivityAt":"2026-08-21 14:24:44","lastActivityBy":"Tatyana Samoylenko","market":"France","openedAt":"2026-07-23 16:34:25","requestedFor":"Margot Schneider","stateChangedAt":"2026-08-21 14:24:44","stateChangedBy":"Tatyana Samoylenko"},"number":"RITM2910009","shortDesc":"Changes on monequilibredigestif.fr website","state":"Awaiting User Info"},{"_updated":"2026-08-26 12:07:30","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 12:07:30 - Tatyana Samoylenko (Additional comments) The status: ON HOLD, waiting for the","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=059efc563bde8b1051efb59704e45a99&sysparm_record_target=task&sysparm_record_row=58&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 12:07:30","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-12 23:14:05","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-05 19:00:25","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-04 17:41:17","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-04 15:49:03","who":"Dalma Lisa Pettersson"},{"kind":"comment","t":"2026-08-03 19:15:44","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-28 15:08:23","who":"Dalma Lisa Pettersson"},{"kind":"comment","t":"2026-07-27 16:57:35","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-27 16:53:19","who":"Dalma Lisa Pettersson"}],"brand":"Finish","description":"Please link new landing page to the Serbian QR.","dueDate":"2026-07-28","lastActivityAt":"2026-08-26 12:07:30","lastActivityBy":"Tatyana Samoylenko","market":"Serbia","openedAt":"2026-07-27 16:53:19","requestedFor":"Dalma Lisa Pettersson","stateChangedAt":"2026-08-26 12:07:30","stateChangedBy":"Tatyana Samoylenko"},"number":"RITM2913180","shortDesc":"In machine sampling campaign landing page (Serbia)","state":"On hold"},{"_updated":"2026-08-21 19:01:28","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 DACH-NORDICS CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 19:01:28 - Elizaveta Nyarko (Additional comments) Hi Markus, I hope you are doing well.","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=b92174a62bd2cf108edffb2a6e91bffc&sysparm_record_target=task&sysparm_record_row=59&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-21 19:01:28","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-20 17:39:58","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-20 10:39:40","who":"Markus Dittel"},{"kind":"comment","t":"2026-08-19 14:55:51","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-13 14:30:03","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-10 13:24:17","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-10 12:17:54","who":"Markus Dittel"},{"kind":"worknote","t":"2026-08-07 19:23:18","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-07 19:22:16","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-07 19:22:14","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-07 19:18:37","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-05 16:52:55","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-05 14:11:59","who":"Markus Dittel"},{"kind":"comment","t":"2026-08-05 13:25:04","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-29 17:14:35","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-29 16:03:29","who":"Markus Dittel"},{"kind":"comment","t":"2026-07-29 15:50:20","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-07-28 10:33:08","who":"Markus Dittel"}],"brand":"Sagrotan","description":"Sagrotan.de Surface update see attached brieifng","dueDate":"2026-08-11","lastActivityAt":"2026-08-21 19:01:28","lastActivityBy":"Elizaveta Nyarko","market":"Germany","openedAt":"2026-07-28 10:33:08","requestedFor":"Markus Dittel","stateChangedAt":"2026-08-21 19:01:28","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2914010","shortDesc":"Sagrotan.de Surface update","state":"Awaiting User Info"},{"_updated":"2026-08-25 13:44:56","_updatedBy":"AZago","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 13:44:56 - Angela Zago (Additional comments) Hi Alesya, it looks good. Thank you 2026-08","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=1e8219ae2b9ecf10171af4de5e91bff2&sysparm_record_target=task&sysparm_record_row=60&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 13:44:56","who":"Angela Zago"},{"kind":"comment","t":"2026-08-25 13:08:07","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-25 11:38:35","who":"Angela Zago"},{"kind":"comment","t":"2026-08-21 15:03:06","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-07-28 12:58:59","who":"Angela Zago"}],"brand":"Napisan","description":"Please release the Amicasa pages related to the Cashback Multibrand 2026 promotion on amicasa.it\r\nhttps://hkx-amicasa-it-dev-1b1c.web.app/promozioni/\r\nhttps://hkx-amicasa-it-dev-1b1c.web.app/\r\nhttps://hkx-amicasa-it-dev-1b1c--branch-promo-form-wrapper-c32ytno6.web.app/cashback-multibrand-2026/","dueDate":"2026-08-20","lastActivityAt":"2026-08-25 13:44:56","lastActivityBy":"Angela Zago","market":"Italy","openedAt":"2026-07-28 12:58:59","requestedFor":"Virginia Runfola","stateChangedAt":"2026-08-25 13:44:56","stateChangedBy":"Angela Zago"},"number":"RITM2914297","shortDesc":"Cashback Multibrand promo release","state":"Work In Progress"},{"_updated":"2026-08-25 23:41:32","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 16:51:52 - Tatyana Samoylenko (Additional comments) Hi Rowena, Before closing the ticke","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=1315da323b560f50589d8c8a25e45a39&sysparm_record_target=task&sysparm_record_row=61&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 16:51:52","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-21 18:13:20","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-12 18:05:53","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-31 13:04:36","who":"Rowena Hearn"},{"kind":"comment","t":"2026-07-30 20:05:39","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-29 18:04:38","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-29 12:28:21","who":"Rowena Hearn"}],"brand":"Finish","description":"Hello there, \r\n\r\nLilit has worked on the attached designs. https://www.figma.com/design/TBnp3yN4eQDlXRwySCObZu/Finish-Connected-Sample?node-id=0-1&p=f&t=5ECBWCB1mNDnOqaU-0\r\n\r\nAcross Finish, the brand team are creating some 'How To' videos. These will be vertical and uploaded to YouTube. They are between 30 - 60 seconds each. I need a new component designed. It will need to have a title field, it will need to have 7 vertical YouTube videos in a carousel, a bit like we might show featured products, and each video will need a title on page. \r\n\r\nIn context of FCS, this would appear ABOVE FAQs on Activation Option 1 and just below the title on AO3.\r\n\r\nPlease can we get quote for design and this beginning asap?","dueDate":"2026-08-05","lastActivityAt":"2026-08-25 16:51:52","lastActivityBy":"Tatyana Samoylenko","market":"United Kingdom","openedAt":"2026-07-29 12:28:21","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-25 16:51:52","stateChangedBy":"Tatyana Samoylenko"},"number":"RITM2915693","shortDesc":"Finish Connected Sample - Design Extension","state":"Awaiting User Info"},{"_updated":"2026-08-25 21:57:30","_updatedBy":"DCasasno","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 21:57:30 - Damian Casasnovas (Additional comments) Hi Larissa, I see that those 2 referen","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=29b117b23b1a4f50fa9d2f37f4e45ab6&sysparm_record_target=task&sysparm_record_row=62&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 21:57:30","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-25 17:38:21","who":"Larissa Batistetti"},{"kind":"comment","t":"2026-08-12 20:54:44","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-03 16:49:28","who":"Larissa Batistetti"},{"kind":"worknote","t":"2026-08-03 16:48:51","who":"Larissa Batistetti"},{"kind":"comment","t":"2026-08-03 16:46:52","who":"Larissa Batistetti"},{"kind":"worknote","t":"2026-08-03 16:46:50","who":"Larissa Batistetti"},{"kind":"worknote","t":"2026-08-03 16:46:33","who":"Larissa Batistetti"},{"kind":"comment","t":"2026-08-03 16:46:01","who":"Larissa Batistetti"},{"kind":"comment","t":"2026-08-03 15:26:17","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-31 20:33:04","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-29 16:53:06","who":"Larissa Batistetti"}],"brand":"Naldecon","description":"Attached are the articles and corresponding images for the Naldecon website: https://www.naldecon.com.br/\r\n\r\nNew articles to include:\r\n- Medicamento para gripe_Dúvidas comuns\r\n- Para que serve o paracetamol\r\n- Quanto tempo dura uma gripe\r\n\r\nOptimized article to update:\r\n- Como aliviar os sintomas da gripe em minutos","dueDate":"2026-08-07","lastActivityAt":"2026-08-25 21:57:30","lastActivityBy":"Damian Casasnovas","market":"Brazil","openedAt":"2026-07-29 16:53:06","requestedFor":"Larissa Batistetti","stateChangedAt":"2026-08-25 21:57:30","stateChangedBy":"Damian Casasnovas"},"number":"RITM2916127","shortDesc":"Update articles – Naldecon website | SEO","state":"Awaiting User Info"},{"_updated":"2026-08-10 21:52:13","_updatedBy":"DCasasno","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-10 21:52:13 - Damian Casasnovas (Additional comments) Ali, changes were implemented on dev e","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=4965c5d72b16c350a4fffbc8f291bfa5&sysparm_record_target=task&sysparm_record_row=63&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-10 21:52:14","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-06 19:24:10","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-06 17:28:28","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-08-05 23:02:11","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:47:59","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:46:33","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:45:53","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:44:19","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:42:09","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:41:03","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:38:27","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:32:45","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:31:37","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:30:28","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:29:37","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:28:32","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:27:27","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-03 08:21:41","who":"Ali Méndez"},{"kind":"comment","t":"2026-07-31 23:03:21","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-07-30 19:57:00","who":"Ali Méndez"}],"brand":"Vanish","description":"The website needs to be updated with the new PRISMA product renders, and the retailer information on each PDP also needs to be updated.","dueDate":"2026-08-17","lastActivityAt":"2026-08-10 21:52:14","lastActivityBy":"Damian Casasnovas","market":"Mexico","openedAt":"2026-07-30 19:57:00","requestedFor":"Ali Méndez","stateChangedAt":"2026-08-10 21:52:14","stateChangedBy":"Damian Casasnovas"},"number":"RITM2917815","shortDesc":"VANISH|Renders and Retailers","state":"Awaiting User Info"},{"_updated":"2026-08-25 17:50:18","_updatedBy":"AZago","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 17:50:18 - Angela Zago (Additional comments) Hi Alesya, yes it was related to Santiago's","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=a7fba02b2b5a8790171af4de5e91bf9a&sysparm_record_target=task&sysparm_record_row=64&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 17:50:18","who":"Angela Zago"},{"kind":"comment","t":"2026-08-25 17:31:23","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-24 15:32:21","who":"Angela Zago"},{"kind":"worknote","t":"2026-08-24 15:29:42","who":"Angela Zago"},{"kind":"comment","t":"2026-08-18 19:19:02","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-06 17:23:56","who":"Angela Zago"},{"kind":"worknote","t":"2026-08-06 17:23:13","who":"Angela Zago"},{"kind":"comment","t":"2026-08-05 15:27:56","who":"Angela Zago"},{"kind":"comment","t":"2026-08-05 14:59:08","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-05 13:51:23","who":"Angela Zago"},{"kind":"comment","t":"2026-08-05 13:35:22","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-07-31 12:44:30","who":"Angela Zago"}],"brand":"Finish","description":"In the amicasa.it website:\r\n1. Please delete the possibility to modify the email address in the \"My personal data\" section. We need to delete the email section (Attachment: \"MyPersonalData_Email\").\r\n2. Please delete the \"Shipping addresses\" part and only keep the \"Delivery address\" (\"Indirizzi di consegna\") part in the \"Delivery Addresses\" section (Attachment: \"ShippingAddresses\").","dueDate":"2026-08-03","lastActivityAt":"2026-08-25 17:50:18","lastActivityBy":"Angela Zago","market":"Italy","openedAt":"2026-07-31 12:44:30","requestedFor":"Angela Zago","stateChangedAt":"2026-08-25 17:50:18","stateChangedBy":"Angela Zago"},"number":"RITM2918670","shortDesc":"Amicasa.it website changes","state":"Work In Progress"},{"_updated":"2026-08-27 15:46:28","_updatedBy":"SZhou6","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 15:46:28 - Sabrina Zhou (Additional comments) I apologize. Another question: are the chan","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=cb6cb1273b1e0b9051efb59704e45a78&sysparm_record_target=task&sysparm_record_row=65&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 15:46:28","who":"Sabrina Zhou"},{"kind":"comment","t":"2026-08-27 15:45:50","who":"Sabrina Zhou"},{"kind":"comment","t":"2026-08-27 15:43:43","who":"Sabrina Zhou"},{"kind":"worknote","t":"2026-08-25 18:30:43","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-08-25 18:20:45","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-25 18:14:47","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-20 11:55:11","who":"Sabrina Zhou"},{"kind":"comment","t":"2026-07-31 18:35:55","who":"Sabrina Zhou"}],"brand":"Finish","description":"You will find two briefs: \r\n1. content matrixes for Hubble, Chimera, Canopus + Patronum (I used the Hubble template but I'm expecting different visuals) \r\n2. content update on existing PDP pages \r\n\r\nI kindly ask you to provide us with a qutation before the 4th of September. \r\nI will attach in a second moment, all the assets and packshots necessary for the updates. \r\n\r\nThank you!\r\nSabrina","dueDate":"2026-10-01","lastActivityAt":"2026-08-27 15:46:28","lastActivityBy":"Sabrina Zhou","market":"Italy","openedAt":"2026-07-31 18:35:55","requestedFor":"Sabrina Zhou","stateChangedAt":"2026-08-27 15:43:43","stateChangedBy":"Sabrina Zhou"},"number":"RITM2919154","shortDesc":"Finish Website Italy Content Update | Quotation Request","state":"Work In Progress"},{"_updated":"2026-08-26 17:36:00","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 17:36:00 - Tatyana Samoylenko (Additional comments) Hi Anna, Thank you for getting back","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=3407a35c3ba6c314589d8c8a25e45a2d&sysparm_record_target=task&sysparm_record_row=66&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 17:36:00","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-26 16:45:35","who":"Anna Pasi"},{"kind":"comment","t":"2026-08-25 11:16:26","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-24 10:23:23","who":"Anna Pasi"},{"kind":"comment","t":"2026-08-19 19:01:28","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-12 23:26:29","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-04 23:28:45","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-03 10:17:03","who":"Anna Pasi"}],"brand":"Napisan","description":"Request a quotation for a redesign of the Napisan.it website, including the implementation of new sections and the addition of images, videos, and banners - in the ppt you will find comments with some info","dueDate":"2026-08-10","lastActivityAt":"2026-08-26 17:36:00","lastActivityBy":"Tatyana Samoylenko","market":"Italy","openedAt":"2026-08-03 10:17:03","requestedFor":"Anna Pasi","stateChangedAt":"2026-08-26 17:36:00","stateChangedBy":"Tatyana Samoylenko"},"number":"RITM2920220","shortDesc":"Change Website - Napisan.it","state":"Awaiting User Info"},{"_updated":"2026-08-18 19:20:50","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-18 19:20:50 - Alesya Prolagayeva (Additional comments) Hi Angela, We implemented everythi","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=e73d30342b220fd0171af4de5e91bf67&sysparm_record_target=task&sysparm_record_row=67&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-18 19:20:50","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-06 17:44:22","who":"Santiago Garcia Alvarez"},{"kind":"comment","t":"2026-08-05 19:35:53","who":"Angela Zago"},{"kind":"comment","t":"2026-08-05 19:23:55","who":"Tatyana Samoylenko"},{"kind":"worknote","t":"2026-08-05 19:23:23","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-05 14:59:45","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-04 11:12:16","who":"Angela Zago"}],"brand":"Napisan","description":"Please add the validation rules attached to the promoform https://www.amicasa.it/cashback-multibrand-2026/","dueDate":"2026-08-04","lastActivityAt":"2026-08-18 19:20:50","lastActivityBy":"Alesya Prolagayeva","market":"Italy","openedAt":"2026-08-04 11:12:17","requestedFor":"Angela Zago","stateChangedAt":"2026-08-18 19:20:50","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2921921","shortDesc":"Validation rules for Amicasa.it promo form","state":"Awaiting User Info"},{"_updated":"2026-08-25 23:32:33","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 CORPORATE Marketing Web Presence","lastComment":"2026-08-13 19:02:58 - Tatyana Samoylenko (Additional comments) Hi Julia, Thank you for your approv","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=6b084df83b62cf50a8d31e8693e45ab1&sysparm_record_target=task&sysparm_record_row=68&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-13 19:02:58","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-13 12:27:04","who":"Julia Lis"},{"kind":"comment","t":"2026-08-12 23:39:01","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-04 23:48:22","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-04 11:59:31","who":"Julia Lis"}],"brand":"Nurofen","description":"Please add a new footer link to the Nurofen Poland website, redirecting users to the Reckitt Careers page.\r\n\r\nRequirements:\r\n-Add a new footer item: Kariera\r\n-URL: https://www.reckitt.com/careers\r\n-Open link in a new browser tab.\r\n-Placement: footer navigation alongside existing corporate/footer links.","dueDate":"2026-08-17","lastActivityAt":"2026-08-13 19:02:58","lastActivityBy":"Tatyana Samoylenko","market":"Poland","openedAt":"2026-08-04 11:59:31","requestedFor":"Julia Lis","stateChangedAt":"2026-08-13 19:02:58","stateChangedBy":"Tatyana Samoylenko"},"number":"RITM2922020","shortDesc":"Career link on Nurofen website","state":"Awaiting User Info"},{"_updated":"2026-08-27 15:20:10","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 CORPORATE Marketing Web Presence","lastComment":"2026-08-27 15:20:10 - Tatyana Samoylenko (Additional comments) Thank you, Julia. We will release the","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=0fda01783be2cf50a8d31e8693e45ab6&sysparm_record_target=task&sysparm_record_row=69&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 15:20:10","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-27 14:04:37","who":"Julia Lis"},{"kind":"comment","t":"2026-08-27 13:12:50","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-25 16:34:54","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-25 15:52:52","who":"Julia Lis"},{"kind":"comment","t":"2026-08-25 15:33:31","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-18 08:17:30","who":"Taras Shevchenko"},{"kind":"comment","t":"2026-08-18 08:16:29","who":"Taras Shevchenko"},{"kind":"comment","t":"2026-08-05 00:22:25","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-04 12:11:46","who":"Julia Lis"}],"brand":"Nurofen for Children","description":"We need to create a dedicated page (or landing page section) on the website where SIL (Safety Information Leaflet) documents for our children's products will be hosted.\r\n\r\nEach product should have its own direct URL and corresponding QR code so that consumers can access the relevant SIL document by scanning the QR code on the product packaging.","dueDate":"2026-08-08","lastActivityAt":"2026-08-27 15:20:10","lastActivityBy":"Tatyana Samoylenko","market":"Poland","openedAt":"2026-08-04 12:11:46","requestedFor":"Julia Lis","stateChangedAt":"2026-08-27 14:04:37","stateChangedBy":"Julia Lis"},"number":"RITM2922061","shortDesc":"Create SIL Information Page and QR Codes for Children's Products","state":"Work In Progress"},{"_updated":"2026-08-26 18:29:39","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 18:29:39 - Elizaveta Nyarko (Additional comments) Hi Eleni, I hope you are doing well.","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=4d4d8ec53be2c790a8d31e8693e45ad0&sysparm_record_target=task&sysparm_record_row=70&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 18:29:39","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-26 18:28:28","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-25 17:56:02","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-25 16:18:29","who":"Eleni Tsatsou"},{"kind":"comment","t":"2026-08-25 13:56:37","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-24 10:30:48","who":"Eleni Tsatsou"},{"kind":"comment","t":"2026-08-20 19:30:00","who":"Taras Shevchenko"},{"kind":"comment","t":"2026-08-20 16:03:32","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-18 09:49:20","who":"Eleni Tsatsou"},{"kind":"comment","t":"2026-08-11 15:03:57","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-05 11:40:23","who":"Eleni Tsatsou"}],"brand":"Nurofen","description":"On Nurofen website, there are a few issues. A relevant file is provided below with all the relevant pages, links, issues and actions that need to take place.","dueDate":"2026-08-31","lastActivityAt":"2026-08-26 18:29:39","lastActivityBy":"Elizaveta Nyarko","market":"Greece","openedAt":"2026-08-05 11:40:23","requestedFor":"Eleni Tsatsou","stateChangedAt":"2026-08-26 18:29:39","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2923512","shortDesc":"Nurofen Website Issues","state":"Awaiting User Info"},{"_updated":"2026-08-14 15:01:45","_updatedBy":"TShevche","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-14 15:01:45 - Taras Shevchenko (Work notes) work notes 2026-08-10 13:03:38 - Mouncef Belkez","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=084656c53ba2c714da7e789aa4e45abb&sysparm_record_target=task&sysparm_record_row=71&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"worknote","t":"2026-08-14 15:01:45","who":"Taras Shevchenko"},{"kind":"comment","t":"2026-08-10 13:03:38","who":"Mouncef Belkeziz"},{"kind":"comment","t":"2026-08-06 17:12:49","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-05 12:19:39","who":"Mouncef Belkeziz"}],"brand":"Destop","description":"Publish 4 articles on the blog of Destop.fr","dueDate":"2026-08-11","lastActivityAt":"2026-08-14 15:01:45","lastActivityBy":"Taras Shevchenko","market":"France","openedAt":"2026-08-05 12:19:39","requestedFor":"Mouncef Belkeziz","stateChangedAt":"2026-08-07 13:08:30","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2923566","shortDesc":"Publish 4 articles on Destop.fr","state":"On hold"},{"_updated":"2026-08-25 11:18:06","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 11:18:06 - Tatyana Samoylenko (Additional comments) Hi Katarzyna, Got it. Waiting for","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=f3a32f113b2a4f54fa9d2f37f4e45ae5&sysparm_record_target=task&sysparm_record_row=72&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 11:18:06","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-24 12:33:23","who":"Katarzyna Majewska"},{"kind":"comment","t":"2026-08-22 20:54:07","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-19 18:05:47","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-18 10:07:33","who":"Taras Shevchenko"},{"kind":"comment","t":"2026-08-17 11:07:24","who":"Katarzyna Majewska"},{"kind":"comment","t":"2026-08-14 16:41:44","who":"Taras Shevchenko"},{"kind":"worknote","t":"2026-08-14 00:55:27","who":"Taras Shevchenko"},{"kind":"comment","t":"2026-08-12 23:42:01","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-06 12:36:26","who":"Katarzyna Majewska"}],"brand":"Gaviscon","description":"Hi :)\r\nI have a request regarding changes on Gaviscon website. We need to create QR codes that will direct to short description of our product. QR codes needs to be printed on all materials for pharmacists. They need to be able to open them as short description. We don't want them to be visible for patients on the website. If somehow we need to have it let's create new LP and add a section on the button part (close to polityka prywatności, skontaktuj się z nami, polityka plików cookie itd) We can call this section: SIL. We need to have 2 (both attached). Can i ask you for support? :)","dueDate":"2026-08-13","lastActivityAt":"2026-08-25 11:18:06","lastActivityBy":"Tatyana Samoylenko","market":"Poland","openedAt":"2026-08-06 12:36:26","requestedFor":"Katarzyna Majewska","stateChangedAt":"2026-08-25 11:18:06","stateChangedBy":"Tatyana Samoylenko"},"number":"RITM2925045","shortDesc":"Creating QR code and LP per created QR code","state":"Awaiting User Info"},{"_updated":"2026-08-27 14:36:35","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 14:36:35 - Tatyana Samoylenko (Additional comments) Hi Katarzyna, We will be happy to h","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=37bb37953b268f54fa9d2f37f4e45a90&sysparm_record_target=task&sysparm_record_row=73&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 14:36:35","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-26 10:28:17","who":"Katarzyna Majewska"},{"kind":"comment","t":"2026-08-25 22:32:41","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-20 18:32:58","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-20 12:43:16","who":"Katarzyna Majewska"},{"kind":"comment","t":"2026-08-19 18:09:20","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-18 10:07:35","who":"Taras Shevchenko"},{"kind":"comment","t":"2026-08-17 11:08:50","who":"Katarzyna Majewska"},{"kind":"comment","t":"2026-08-14 16:41:47","who":"Taras Shevchenko"},{"kind":"worknote","t":"2026-08-14 00:55:36","who":"Taras Shevchenko"},{"kind":"worknote","t":"2026-08-13 23:44:41","who":"Taras Shevchenko"},{"kind":"comment","t":"2026-08-12 23:42:23","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-06 14:21:34","who":"Katarzyna Majewska"}],"brand":"Strepsils","description":"I have a request regarding changes on Strepsils website. We need to create QR codes that will direct to short description of our product. QR codes needs to be printed on all materials for pharmacists. They need to be able to open them as short description. We don't want them to be visible for patients on the website. If somehow we need to have it let's create new LP and add a section on the button part (close to cookies, kontakt, mapa strony etc) We can call this section: SIL. We need to have QR code for every product.","dueDate":"2026-08-13","lastActivityAt":"2026-08-27 14:36:35","lastActivityBy":"Tatyana Samoylenko","market":"Poland","openedAt":"2026-08-06 14:21:34","requestedFor":"Katarzyna Majewska","stateChangedAt":"2026-08-26 10:28:17","stateChangedBy":"Katarzyna Majewska"},"number":"RITM2925211","shortDesc":"Creation of QR code and LPs at Strepsils Webstite","state":"Work In Progress"},{"_updated":"2026-08-21 14:56:47","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 14:56:47 - Alesya Prolagayeva (Additional comments) Hi Santiago, this has been released o","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=ec9bf0613baa8354da7e789aa4e45a4b&sysparm_record_target=task&sysparm_record_row=74&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-21 14:56:47","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-06 19:00:25","who":"Santiago Garcia Alvarez"}],"brand":"Multibrand","description":"Implement either a banner on top of the promo form present in https://www.amicasa.it/cashback-multibrand-2026/ or a dedicated page with the following prompt to inform the users that the promo is not ready to be used: \r\n\"Modulo temporaneamente non disponibile a causa di un intervento tecnico. Ti chiediamo di riprovare tra qualche giorno. Ci scusiamo per l'inconveniente.\"\r\nIt is critical that all the links that redirect to the promo form (Homepage and promozioni section) point to this so that the user knows that the form is temporarily not available","dueDate":"2026-08-20","lastActivityAt":"2026-08-21 14:56:47","lastActivityBy":"Alesya Prolagayeva","market":"Italy","openedAt":"2026-08-06 19:00:25","requestedFor":"Santiago Garcia Alvarez","stateChangedAt":"2026-08-21 14:56:47","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2925646","shortDesc":"Cashback Multibrand promo release - error banner","state":"Awaiting User Info"},{"_updated":"2026-08-26 18:44:02","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 18:44:02 - Alesya Prolagayeva (Additional comments) Hello Santiago, please approve the bu","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=d53e30213bea8354da7e789aa4e45aeb&sysparm_record_target=task&sysparm_record_row=75&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 18:44:02","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-25 17:24:25","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-14 18:22:37","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-06 19:11:56","who":"Santiago Garcia Alvarez"}],"brand":"Multibrand","description":"Insert the next two rules in the profile section for the following \"indirizzi di consegna\" section fields:\r\nCodice Postale: 5-digit numeric value\r\nPaese: accept only \"Italia\"","dueDate":"2026-08-14","lastActivityAt":"2026-08-26 18:44:02","lastActivityBy":"Alesya Prolagayeva","market":"Italy","openedAt":"2026-08-06 19:11:56","requestedFor":"Santiago Garcia Alvarez","stateChangedAt":"2026-08-26 18:44:02","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2925654","shortDesc":"Validation rules for Postal Code and country","state":"Awaiting User Info"},{"_updated":"2026-08-25 18:53:04","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 18:53:04 - Elizaveta Nyarko (Additional comments) Hi Mannie, Please disregard my previo","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=a1fbd9f12be283909bb2fe61de91bf63&sysparm_record_target=task&sysparm_record_row=76&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 18:53:05","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-25 18:51:46","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-25 18:51:23","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-25 14:55:13","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-17 18:06:14","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-17 16:49:34","who":"Mannie Kwan"},{"kind":"comment","t":"2026-08-14 15:31:23","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-13 17:29:11","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-13 16:00:27","who":"Mannie Kwan"},{"kind":"comment","t":"2026-08-11 18:36:22","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-11 15:37:05","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-11 11:18:36","who":"Mannie Kwan"},{"kind":"comment","t":"2026-08-07 16:00:26","who":"Mannie Kwan"}],"brand":"Nurofen","description":"Google Tag Manager has been published successfully, but the Google Ads conversion tracking tags are not firing because they are being blocked by the website's Content Security Policy (CSP). We require the relevant URLs to be whitelisted in the website CSP configuration. \r\nThe required key for whitelisting is \r\nCSP_CUSTOM_CONFIG","dueDate":"2026-08-11","lastActivityAt":"2026-08-25 18:53:05","lastActivityBy":"Elizaveta Nyarko","market":"Ireland","openedAt":"2026-08-07 16:00:26","requestedFor":"Mannie Kwan","stateChangedAt":"2026-08-17 18:06:14","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2926866","shortDesc":"CSP Whitelisting Request for Google Ads Conversion Tracking Tags (Reference: RITM2856661)","state":"Awaiting User Info"},{"_updated":"2026-08-26 17:41:55","_updatedBy":"VMavriki","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 17:41:55 - Vera Mavriki (Additional comments) thank you very much! 2026-08-25 23:28:52 -","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=f63abd793b628f94589d8c8a25e45a15&sysparm_record_target=task&sysparm_record_row=77&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 17:41:55","who":"Vera Mavriki"},{"kind":"comment","t":"2026-08-25 23:28:52","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-25 17:36:00","who":"Vera Mavriki"},{"kind":"comment","t":"2026-08-21 14:58:30","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-13 00:01:08","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-07 18:12:41","who":"Vera Mavriki"}],"brand":"Gaviscon","description":"I am replacing Isis who was working on it, with an already existing ticket : RITM2824984, however, this ticket cannot be transferred to me so I would like to create a new one, referring to the previous one, so that the additional changes can be implemented on it.","dueDate":"2026-12-10","lastActivityAt":"2026-08-26 17:41:55","lastActivityBy":"Vera Mavriki","market":"Netherlands","openedAt":"2026-08-07 18:12:41","requestedFor":"Vera Mavriki","stateChangedAt":"2026-08-25 17:36:00","stateChangedBy":"Vera Mavriki"},"number":"RITM2927137","shortDesc":"NL website migration new ticket","state":"Work In Progress"},{"_updated":"2026-08-25 18:25:09","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-25 18:25:09 - Elizaveta Nyarko (Additional comments) Hi Emma, Since this change is out o","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=eb9979362b22c3d09bb2fe61de91bff7&sysparm_record_target=task&sysparm_record_row=78&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-25 18:25:09","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-25 15:22:12","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-25 14:07:17","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-20 16:40:17","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-19 15:21:17","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-14 16:50:12","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-14 16:49:57","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-14 16:33:40","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-13 14:04:31","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-12 10:37:40","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-10 20:43:55","who":"Emma Tubertini"}],"brand":"Finish","description":"update finish FR website","dueDate":"2026-08-25","lastActivityAt":"2026-08-25 18:25:09","lastActivityBy":"Elizaveta Nyarko","market":"France","openedAt":"2026-08-10 20:43:55","requestedFor":"Emma Tubertini","stateChangedAt":"2026-08-19 15:21:17","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2928854","shortDesc":"update finish FR website","state":"Awaiting User Info"},{"_updated":"2026-08-19 19:00:28","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-19 19:00:28 - Alesya Prolagayeva (Additional comments) Hi Katarzyna, depending on the actual","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=af4b15873bee4fd4fa9d2f37f4e45aad&sysparm_record_target=task&sysparm_record_row=79&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-19 19:00:28","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-17 14:52:26","who":"Katarzyna Majewska"},{"kind":"comment","t":"2026-08-17 13:54:29","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-11 13:09:57","who":"Katarzyna Majewska"}],"brand":"Gaviscon","description":"Hi,\r\nI would like to ask if it is possible to upload on Gaviscon website kind of test. End user will answer some questions and then we would say if he/she might be having a reflux and what product can be used. If so do you have any examples? Or aprox. cost :)\r\nthanks!","dueDate":"2026-08-18","lastActivityAt":"2026-08-19 19:00:28","lastActivityBy":"Alesya Prolagayeva","market":"Poland","openedAt":"2026-08-11 13:09:57","requestedFor":"Katarzyna Majewska","stateChangedAt":"2026-08-19 19:00:28","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2929658","shortDesc":"test on the webpage","state":"Awaiting User Info"},{"_updated":"2026-08-26 04:35:11","_updatedBy":"DCasasno","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 04:35:11 - Damian Casasnovas (Additional comments) Hi Nomar Resending the estimation i","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=738aa1bf3b6e8b50a8d31e8693e45a5d&sysparm_record_target=task&sysparm_record_row=80&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 04:35:11","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-16 23:00:07","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-08-14 18:15:56","who":"Nomar Arellano"},{"kind":"comment","t":"2026-08-14 18:15:38","who":"Nomar Arellano"},{"kind":"comment","t":"2026-08-13 22:41:46","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-13 22:12:02","who":"Nomar Arellano"}],"brand":"Multibrand","description":"For all Mexico websites include in the footer the link for Reckitt Careers. Following the instrucctions in the attached power point","dueDate":"2026-08-25","lastActivityAt":"2026-08-26 04:35:11","lastActivityBy":"Damian Casasnovas","market":"Mexico","openedAt":"2026-08-13 22:12:02","requestedFor":"Nomar Arellano","stateChangedAt":"2026-08-16 23:00:07","stateChangedBy":"Damian Casasnovas"},"number":"RITM2933474","shortDesc":"Include Careers links in Mexico websites","state":"Awaiting User Info"},{"_updated":"2026-08-18 15:40:48","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-18 15:40:48 - Alesya Prolagayeva (Additional comments) Hi Mina, overall the estimate for thi","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=83ea7c192b764f108edffb2a6e91bf4a&sysparm_record_target=task&sysparm_record_row=81&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-18 15:40:48","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-18 10:34:47","who":"Mina Yilmaz"}],"brand":"Vanish","description":"We kindly request your support in linking the anchor texts identified on the Source Pages in the attached Excel file and directing them to the relevant Target Pages.","dueDate":"2026-08-18","lastActivityAt":"2026-08-18 15:40:48","lastActivityBy":"Alesya Prolagayeva","market":"Turkey","openedAt":"2026-08-18 10:34:47","requestedFor":"Mina Yilmaz","stateChangedAt":"2026-08-18 15:40:48","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2936892","shortDesc":"Website Changes","state":"Awaiting User Info"},{"_updated":"2026-08-26 18:28:05","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 18:28:05 - Elizaveta Nyarko (Additional comments) Hi Eleni, I hope you are doing well.","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=f8dead512b7acf10171af4de5e91bfc4&sysparm_record_target=task&sysparm_record_row=82&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 18:28:05","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-21 18:42:37","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-21 16:47:12","who":"Eleni Tsatsou"},{"kind":"comment","t":"2026-08-20 17:36:45","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-18 14:21:34","who":"Eleni Tsatsou"}],"brand":"Nurofen","description":"Following an SEO audit of the Nurofen website, please implement the recommendations included in the attached file. Proposed changes are highlighted in yellow, while blank cells require no action. Where URL changes are recommended, please set up a 301 redirect from the old URL to the new one to preserve SEO value and historical performance.","dueDate":"2026-09-30","lastActivityAt":"2026-08-26 18:28:05","lastActivityBy":"Elizaveta Nyarko","market":"Greece","openedAt":"2026-08-18 14:21:34","requestedFor":"Eleni Tsatsou","stateChangedAt":"2026-08-26 18:28:05","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2937327","shortDesc":"Nurofen - SEO Element Issues","state":"Awaiting User Info"},{"_updated":"2026-08-27 14:49:44","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-24 21:33:30 - Damian Casasnovas (Additional comments) Hi Maria, We checked internally to","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=9dc12b992bb68350171af4de5e91bf11&sysparm_record_target=task&sysparm_record_row=83&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-24 21:33:30","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-24 19:03:37","who":"Maria Vargas"},{"kind":"comment","t":"2026-08-18 22:43:46","who":"Camila Vargas"}],"brand":"Harpic","description":"We want to creat the new website for Harpic Colombia","dueDate":"2026-08-18","lastActivityAt":"2026-08-24 21:33:30","lastActivityBy":"Damian Casasnovas","market":"Colombia","openedAt":"2026-08-18 22:43:46","requestedFor":"Maria Vargas","stateChangedAt":"2026-08-27 14:49:44","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2937926","shortDesc":"New Website Harpic Colombia","state":"Assigned"},{"_updated":"2026-08-19 16:20:58","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-19 16:20:58 - Alesya Prolagayeva (Additional comments) Hi David, could you please confirm th","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=695483292bfa07509bb2fe61de91bf4b&sysparm_record_target=task&sysparm_record_row=84&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-19 16:20:58","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-19 15:13:39","who":"David Stefan"}],"brand":"Durex","description":"IFU File to be uploaded for Mutual and Extended Pleasure Ranges alongside all packshots update for all durex project which there are under ONE and Horizon projects","dueDate":"2026-08-28","lastActivityAt":"2026-08-19 16:20:58","lastActivityBy":"Alesya Prolagayeva","market":"Romania","openedAt":"2026-08-19 15:13:39","requestedFor":"David Stefan","stateChangedAt":"2026-08-19 16:20:58","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2938865","shortDesc":"Durex Romania website update","state":"Awaiting User Info"},{"_updated":"2026-08-21 16:21:15","_updatedBy":"RHearn","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 16:21:15 - Rowena Hearn (Additional comments) Lilit wants to start this on Mon, please ca","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=a3fd9fe12bbec3108edffb2a6e91bfee&sysparm_record_target=task&sysparm_record_row=85&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-21 16:21:15","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-20 12:07:24","who":"Rowena Hearn"},{"kind":"comment","t":"2026-08-20 11:55:43","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-19 17:05:45","who":"Rowena Hearn"}],"brand":"Vanish","description":"Hello, we are re-working all PDP's on Vanish UK. This will also mean a change in the navigation and adding a proper PLP page with category pages. We do not currently have this on Vanish.\r\n\r\nThe design is aligned (Done by Paulina, I made some changes too)\r\n\r\nFirstly, please can Lilit show us how this will look in mobile and confirm it is possible? Please provide cost for the design. \r\n\r\nI will then send complete instructions for build.\r\n\r\nNavigation - \r\nPDP - https://www.figma.com/design/mrHSuuSPUckbBSCWJoSCf1/Vanish?node-id=14009-330439&p=f&t=YHIgZ5DQ03CKXmJc-0 (See SEO changes incorp)\r\nPLP - https://www.figma.com/design/mrHSuuSPUckbBSCWJoSCf1/Vanish?node-id=14009-330438&p=f&t=YHIgZ5DQ03CKXmJc-0\r\nNav - https://www.figma.com/design/mrHSuuSPUckbBSCWJoSCf1/Vanish?node-id=14010-93863&p=f&t=YHIgZ5DQ03CKXmJc-0","dueDate":"2026-08-27","lastActivityAt":"2026-08-21 16:21:15","lastActivityBy":"Rowena Hearn","market":"United Kingdom","openedAt":"2026-08-19 17:05:45","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-20 11:55:43","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2939027","shortDesc":"Vanish PDP/PLP re-work","state":"Assigned"},{"_updated":"2026-08-19 18:28:17","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-19 18:28:17 - Alesya Prolagayeva (Additional comments) Hi Dorottya, please indicate the URLs","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=b789232533768f5026e5d042cd5c7b54&sysparm_record_target=task&sysparm_record_row=86&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-19 18:28:17","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-19 17:56:17","who":"Dorottya Nagy"}],"brand":"Durex","description":"The www.durex.hu benzocaine condoms web page update is because it does not have sufficient Instructions for Use displayed on our websites across products containing benzocaine.","dueDate":"2026-09-11","lastActivityAt":"2026-08-19 18:28:17","lastActivityBy":"Alesya Prolagayeva","market":"Hungary","openedAt":"2026-08-19 17:56:17","requestedFor":"Dorottya Nagy","stateChangedAt":"2026-08-19 18:28:17","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2939092","shortDesc":"www.durex.hu benzocaine condoms web page update","state":"Awaiting User Info"},{"_updated":"2026-08-25 12:43:39","_updatedBy":"ENyarko","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-21 20:39:41 - Damian Casasnovas (Additional comments) Hi Andres, we are aligning on which of","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=bb61300e3bfe0f50589d8c8a25e45a95&sysparm_record_target=task&sysparm_record_row=87&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-21 20:39:41","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-20 17:48:47","who":"Andres Atara"}],"brand":"Harpic","description":"new website Harpic CR, Global template: https://www.harpic.cl/.","dueDate":"2026-11-16","lastActivityAt":"2026-08-21 20:39:41","lastActivityBy":"Damian Casasnovas","market":"Costa Rica","openedAt":"2026-08-20 17:48:47","requestedFor":"Andres Atara","stateChangedAt":"2026-08-20 17:48:47","stateChangedBy":"Andres Atara"},"number":"RITM2940506","shortDesc":"new website Harpic CR","state":"Open"},{"_updated":"2026-08-26 20:05:26","_updatedBy":"AMendez7","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 20:05:26 - Ali Méndez (Additional comments) added attachment 2026-08-26 20:05:23 - Ali M","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=8e4f29023b3e4390a8d31e8693e45a9c&sysparm_record_target=task&sysparm_record_row=88&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 20:05:26","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-26 20:05:23","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-25 19:49:10","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-25 19:49:08","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-25 19:45:44","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-25 19:45:42","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-25 19:39:21","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-25 19:39:19","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-25 19:32:11","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-25 19:32:09","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-25 19:32:04","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-25 19:32:03","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-25 19:31:47","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-25 19:31:46","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-25 19:31:38","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-25 18:50:48","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-25 18:49:55","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-25 18:42:33","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-25 18:13:32","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-25 17:03:10","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-24 21:54:39","who":"Damian Casasnovas"},{"kind":"worknote","t":"2026-08-24 09:45:04","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-24 09:38:16","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 09:38:14","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-24 09:37:57","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 09:37:55","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 09:35:41","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 08:50:14","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 08:49:33","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 08:48:39","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 08:48:28","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:35:55","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:35:30","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:35:03","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:34:31","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:33:34","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:31:01","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:30:19","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:27:54","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:26:27","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:26:03","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:24:07","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:19:40","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:19:08","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:18:04","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:14:54","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:14:19","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-24 07:07:39","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-21 23:12:18","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-20 22:42:03","who":"Ali Méndez"},{"kind":"worknote","t":"2026-08-20 22:42:01","who":"Ali Méndez"},{"kind":"comment","t":"2026-08-20 22:19:01","who":"Ali Méndez"}],"brand":"Vanish","description":"The website content for vanish.com.mx needs to be updated, including replacing renders, updating banners, adjusting text, and making visual modifications.","dueDate":"2026-09-16","lastActivityAt":"2026-08-26 20:05:26","lastActivityBy":"Ali Méndez","market":"Mexico","openedAt":"2026-08-20 22:19:01","requestedFor":"Ali Méndez","stateChangedAt":"2026-08-25 18:13:32","stateChangedBy":"Ali Méndez"},"number":"RITM2940759","shortDesc":"Vanish | Update Prisma, Aries, Powder","state":"Work In Progress"},{"_updated":"2026-08-26 14:23:35","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 14:23:35 - Elizaveta Nyarko (Additional comments) Hi Bengisu, I hope you are doing well","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=cfc348972bba0b1011d9f47ebe91bf20&sysparm_record_target=task&sysparm_record_row=89&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 14:23:35","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-25 14:29:46","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-24 11:41:48","who":"Bengisu Uluyurt"}],"brand":"Finish","description":"We want to update the product packshots on the Finish Turkey website based on a revision received from global team.","dueDate":"2026-09-01","lastActivityAt":"2026-08-26 14:23:35","lastActivityBy":"Elizaveta Nyarko","market":"Turkey","openedAt":"2026-08-24 11:41:48","requestedFor":"Bengisu Uluyurt","stateChangedAt":"2026-08-25 14:29:46","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2942976","shortDesc":"Finish TK Website Packshot Revision","state":"Awaiting User Info"},{"_updated":"2026-08-26 13:46:38","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 13:46:38 - Tatyana Samoylenko (Additional comments) Hi Sara, thank you for the cost appro","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=9723bcd3fb7a0f10e217fc31beefdcdc&sysparm_record_target=task&sysparm_record_row=90&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 13:46:38","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-26 11:47:18","who":"Sara Corrêa"},{"kind":"comment","t":"2026-08-25 18:10:21","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-25 16:33:48","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-25 15:43:35","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-24 15:08:49","who":"Sara Corrêa"}],"brand":"Veet","description":"Request to update the Veet Portugal website according to the attached PowerPoint.\r\nThe presentation includes the product page links and the corresponding content updates required following the regulatory review of the Veet portfolio.\r\nPlease implement all changes detailed in the attached document.","dueDate":"2026-09-24","lastActivityAt":"2026-08-26 13:46:38","lastActivityBy":"Tatyana Samoylenko","market":"Portugal","openedAt":"2026-08-24 15:08:49","requestedFor":"Sara Corrêa","stateChangedAt":"2026-08-26 13:46:38","stateChangedBy":"Tatyana Samoylenko"},"number":"RITM2943364","shortDesc":"Veet website changes","state":"Awaiting User Info"},{"_updated":"2026-08-25 12:43:55","_updatedBy":"ENyarko","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-24 21:52:45 - Damian Casasnovas (Additional comments) Hi Nadia, I'm checking if we have a","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=153b99df2b7acb107379ff6fce91bfc9&sysparm_record_target=task&sysparm_record_row=91&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-24 21:52:45","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-24 18:03:43","who":"Nadia DiMatteo"}],"brand":"Dettol","description":"I need to make some changes to the Espadol Dettol Website in Argentina to comply with regulatory affairs","dueDate":"2026-09-16","lastActivityAt":"2026-08-24 21:52:45","lastActivityBy":"Damian Casasnovas","market":"Argentina","openedAt":"2026-08-24 18:03:43","requestedFor":"Nadia DiMatteo","stateChangedAt":"2026-08-24 18:03:43","stateChangedBy":"Nadia DiMatteo"},"number":"RITM2943697","shortDesc":"Website changes needed","state":"Open"},{"_updated":"2026-08-27 14:56:41","_updatedBy":"APossama","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 DEFAULT Marketing Web Presence","lastComment":"2026-08-27 14:56:41 - Alessia Possamai (Additional comments) It's fine as it is. Thanks Alesia 2026","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=dc46e5ebfbf283505ceafb037befdc0e&sysparm_record_target=task&sysparm_record_row=92&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 14:56:41","who":"Alessia Possamai"},{"kind":"comment","t":"2026-08-27 14:29:35","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-26 15:31:28","who":"Alessia Possamai"},{"kind":"comment","t":"2026-08-26 14:36:03","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-26 11:19:37","who":"Szymon Wozny"},{"kind":"comment","t":"2026-08-25 13:30:28","who":"Alessia Possamai"}],"brand":"","description":"Please create another section on \"concorsi e premi\" similar to the other ones with the title \"VINCI CARD TIGOTA' 2026\" and inside the blue box with the link to the terms and condition attached","dueDate":"","lastActivityAt":"2026-08-27 14:56:41","lastActivityBy":"Alessia Possamai","market":"","openedAt":"2026-08-25 13:30:28","requestedFor":"Alessia Possamai","stateChangedAt":"2026-08-27 14:56:41","stateChangedBy":"Alessia Possamai"},"number":"RITM2944926","shortDesc":"amendment on napisan website","state":"Work In Progress"},{"_updated":"2026-08-26 17:46:28","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 DEFAULT Marketing Web Presence","lastComment":"2026-08-26 17:46:28 - Alesya Prolagayeva (Additional comments) Hi Alessia, please approve the budget","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=a963d6abfb36c3505ceafb037befdca3&sysparm_record_target=task&sysparm_record_row=93&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 17:46:28","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-26 11:19:01","who":"Szymon Wozny"},{"kind":"comment","t":"2026-08-25 16:47:42","who":"Alessia Possamai"}],"brand":"","description":"Please upload the attached updated T&C for the multibrand promo of Q3 referred to RITM2871609 ticket","dueDate":"","lastActivityAt":"2026-08-26 17:46:28","lastActivityBy":"Alesya Prolagayeva","market":"","openedAt":"2026-08-25 16:47:42","requestedFor":"Alessia Possamai","stateChangedAt":"2026-08-26 17:46:28","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2945229","shortDesc":"0","state":"Awaiting User Info"},{"_updated":"2026-08-26 18:53:32","_updatedBy":"TSamoyle","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 DACH-NORDICS CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 18:53:31 - Tatyana Samoylenko (Additional comments) Hi Hector. We've reviewed the feedb","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=4a1266ab2b724350f1d9f268f291bfc0&sysparm_record_target=task&sysparm_record_row=94&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 18:53:32","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-25 22:59:27","who":"Tatyana Samoylenko"},{"kind":"comment","t":"2026-08-25 17:51:54","who":"Hector Eichenlaub"}],"brand":"Gaviscon","description":"New feedback round outside the main migration scope","dueDate":"2026-08-31","lastActivityAt":"2026-08-26 18:53:32","lastActivityBy":"Tatyana Samoylenko","market":"Switzerland","openedAt":"2026-08-25 17:51:54","requestedFor":"Hector Eichenlaub","stateChangedAt":"2026-08-26 18:53:32","stateChangedBy":"Tatyana Samoylenko"},"number":"RITM2945319","shortDesc":"Gaviscon | DACH migration - CH","state":"Awaiting User Info"},{"_updated":"2026-08-27 12:33:43","_updatedBy":"RHearn","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 UK CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 12:33:43 - Rowena Hearn (Additional comments) 1. Static list, there are 4 prior members a","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=73831e772bf2cb10438cfe01fe91bf1c&sysparm_record_target=task&sysparm_record_row=95&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 12:33:43","who":"Rowena Hearn"},{"kind":"worknote","t":"2026-08-26 19:16:25","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-26 19:16:24","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-26 19:16:24","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-26 19:14:46","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-26 14:35:08","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-26 11:26:52","who":"Rowena Hearn"}],"brand":"Strepsils","description":"The GRIP website design has now been finalised - https://grip-initiative.org/\r\n\r\nhttps://www.figma.com/design/32YPzGHOsQaAN6lqy1K1lu/GRIP?node-id=30-21460&t=wkcg0T3qhURoQUCH-1\r\n\r\nOn the existing website, we currently have the following sections:\r\n\r\nHealthcare Popup\r\nAbout Partnership\r\nPartnership Reports\r\nResources\r\nGlobal, Regional & Country Links\r\n\r\nSee here for content direction - https://rbcom.sharepoint.com/:x:/s/CGO_DigitalTeam/IQCIr-inhCJxQ6qo8793gxz0Afo3-oMpoc2ri26cV67KBDU?e=JhAn7A\r\n\r\nWithin the attached Excel file, you will find the full URL inventory and proposed plan for each page. This includes a significant number of pages that will be deleted and redirected, as well as content that will be consolidated and migrated onto a smaller number of pages within the new design.\r\n\r\nCould you please review the Excel carefully in parallel with the approved designs and prepare a cost estimate for the migration work?\r\n\r\nPlease note:\r\n\r\nMany existing pages will not be recreated and will instead be redirected.\r\nA substantial amount of content is being consolidated onto single destination pages.\r\nAny missing content required to complete the build will be provided before work begins. This includes assets such as PDFs and any other content that is not yet available within the documentation.\r\n\r\nPlease ensure your estimate reflects the actual scope of content migration, page creation, redirects, and asset implementation based on the migration plan rather than the total number of URLs currently on the site. The SOW will be funded directly by the HCP team and therefore the entity should be Reckitt Health.\r\n\r\nLet me know if anything in the migration plan is unclear. Noting the design doesn't have mobile, so if you need to factor this design work in as well, please do.","dueDate":"2026-09-16","lastActivityAt":"2026-08-27 12:33:43","lastActivityBy":"Rowena Hearn","market":"United Kingdom","openedAt":"2026-08-26 11:26:52","requestedFor":"Rowena Hearn","stateChangedAt":"2026-08-27 12:33:43","stateChangedBy":"Rowena Hearn"},"number":"RITM2946192","shortDesc":"GRIP website migration","state":"Work In Progress"},{"_updated":"2026-08-26 18:15:19","_updatedBy":"ENyarko","assignedTo":"Tatyana Samoylenko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=462e6273fbf24b505ceafb037befdcec&sysparm_record_target=task&sysparm_record_row=96&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 13:23:06","who":"Froso Liapodimitri"}],"brand":"Dettol","description":"update microsite apostolikathariotita.gr/starting date of contest: 17/9","dueDate":"2026-09-14","market":"Greece","openedAt":"2026-08-26 13:23:06","requestedFor":"Froso Liapodimitri","stateChangedAt":"2026-08-26 13:23:06","stateChangedBy":"Froso Liapodimitri"},"number":"RITM2946434","shortDesc":"update microsite apostolikathariotita.gr","state":"Open"},{"_updated":"2026-08-27 15:50:36","_updatedBy":"ENyarko","assignedTo":"Elizaveta Nyarko","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 15:50:36 - Elizaveta Nyarko (Work notes) Attachment: Strepsils ES 3.png has been attached","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=adad17bbfbb6cb50bce9faf4beefdc6a&sysparm_record_target=task&sysparm_record_row=97&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"worknote","t":"2026-08-27 15:50:36","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-27 15:50:35","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-27 15:50:34","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-27 15:49:47","who":"Elizaveta Nyarko"},{"kind":"comment","t":"2026-08-26 18:32:12","who":"Elizaveta Nyarko"},{"kind":"worknote","t":"2026-08-26 16:53:37","who":"Diego Cortes De Ita"},{"kind":"worknote","t":"2026-08-26 16:53:27","who":"Diego Cortes De Ita"},{"kind":"worknote","t":"2026-08-26 16:52:44","who":"Diego Cortes De Ita"},{"kind":"worknote","t":"2026-08-26 16:52:31","who":"Diego Cortes De Ita"},{"kind":"worknote","t":"2026-08-26 16:52:17","who":"Diego Cortes De Ita"},{"kind":"worknote","t":"2026-08-26 16:52:05","who":"Diego Cortes De Ita"},{"kind":"worknote","t":"2026-08-26 16:51:37","who":"Diego Cortes De Ita"},{"kind":"comment","t":"2026-08-26 16:50:35","who":"Diego Cortes De Ita"}],"brand":"Strepsils","description":"Update all renders in all articles in the website.","dueDate":"2026-09-11","lastActivityAt":"2026-08-27 15:50:36","lastActivityBy":"Elizaveta Nyarko","market":"Spain","openedAt":"2026-08-26 16:50:35","requestedFor":"Diego Cortes De Ita","stateChangedAt":"2026-08-27 15:49:47","stateChangedBy":"Elizaveta Nyarko"},"number":"RITM2946810","shortDesc":"Website updating","state":"Awaiting User Info"},{"_updated":"2026-08-27 14:04:10","_updatedBy":"AProlaga1","assignedTo":"Alesya Prolagayeva","assignmentGroup":"L3 EU CORE RECKITT Marketing Web Presence","lastComment":"2026-08-27 14:04:10 - Alesya Prolagayeva (Additional comments) Hi Ismena, I'm attaching the quote. C","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=948e2ff3fb3a0b50393ffcbaaeefdc2f&sysparm_record_target=task&sysparm_record_row=98&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-27 14:04:10","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-08-27 14:01:49","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-27 13:24:53","who":"Ismena Kielkowska"},{"kind":"comment","t":"2026-08-26 19:26:06","who":"Alesya Prolagayeva"},{"kind":"worknote","t":"2026-08-26 19:21:16","who":"Alesya Prolagayeva"},{"kind":"comment","t":"2026-08-26 18:04:14","who":"Ismena Kielkowska"}],"brand":"Gaviscon","description":"We are planning a significant update of the Gaviscon Ireland website and require a PDF copy of the current website for review and annotation purposes.\r\n\r\nIf possible, please provide a PDF version that includes all associated website links/hyperlinks. If this is not feasible, a standard PDF version of the website content will be sufficient.\r\n\r\nThe PDF will be used to mark up and communicate the required changes, including:\r\n\r\nRange review updates\r\nCategory updates\r\nAddition of new products\r\nRemoval of discontinued products\r\nAlignment of the Ireland website with the UK version where appropriate\r\nUpdates to essential information and content\r\n\r\nThis document will be used as the basis for the website refresh and subsequent development work.","dueDate":"2026-08-26","lastActivityAt":"2026-08-27 14:04:10","lastActivityBy":"Alesya Prolagayeva","market":"Ireland","openedAt":"2026-08-26 18:04:14","requestedFor":"Ismena Kielkowska","stateChangedAt":"2026-08-27 14:04:10","stateChangedBy":"Alesya Prolagayeva"},"number":"RITM2946948","shortDesc":"Gavison IE website update","state":"Awaiting User Info"},{"_updated":"2026-08-26 22:22:55","_updatedBy":"DCasasno","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 22:22:55 - Damian Casasnovas (Additional comments) Hi Sara, the initial estimate for this","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=1f6fb3b3fb72cb505ceafb037befdc2d&sysparm_record_target=task&sysparm_record_row=99&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 22:22:55","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-26 19:18:10","who":"Sara Nuñez"}],"brand":"Harpic","description":"We request the upgrade to the latest version of Husky for the Harpic´s webpage","dueDate":"2026-09-02","lastActivityAt":"2026-08-26 22:22:55","lastActivityBy":"Damian Casasnovas","market":"Mexico","openedAt":"2026-08-26 19:18:10","requestedFor":"Sara Nuñez","stateChangedAt":"2026-08-26 22:22:55","stateChangedBy":"Damian Casasnovas"},"number":"RITM2947066","shortDesc":"Upgrade Harpic´s latest Husky version","state":"Awaiting User Info"},{"_updated":"2026-08-26 22:12:49","_updatedBy":"DCasasno","assignedTo":"Damian Casasnovas","assignmentGroup":"L3 LATAM CORE RECKITT Marketing Web Presence","lastComment":"2026-08-26 22:12:49 - Damian Casasnovas (Additional comments) Hi Sara, the initial estimate for this","link":"https://rbassist.service-now.com/sc_req_item.do?sys_id=5542c84cfb43cb505ceafb037befdc25&sysparm_record_target=task&sysparm_record_row=100&sysparm_record_rows=198&sysparm_record_list=assignment_group%3Djavascript%3AgetMyGroups%28%29%5Eactive%3Dtrue%5EORDERBYnumber","meta":{"activity":[{"kind":"comment","t":"2026-08-26 22:12:49","who":"Damian Casasnovas"},{"kind":"comment","t":"2026-08-26 19:30:35","who":"Sara Nuñez"}],"brand":"Lysol","description":"We request the upgrade to the latest version of Husky for the Lysol´s webpage","dueDate":"2026-09-02","lastActivityAt":"2026-08-26 22:12:49","lastActivityBy":"Damian Casasnovas","market":"Mexico","openedAt":"2026-08-26 19:30:35","requestedFor":"Sara Nuñez","stateChangedAt":"2026-08-26 22:12:49","stateChangedBy":"Damian Casasnovas"},"number":"RITM2947074","shortDesc":"Upgrade Lysol´s latest Husky version","state":"Awaiting User Info"}],"jira":{"RITM2306301":{"status":"Closed","statusChangedAt":"2025-10-23T17:59:36.127+0200","key":"WFN-137","url":"https://support.dataart.com/browse/WFN-137","assignee":"Alesya Prolagayeva"},"RITM2369928":{"status":"Closed","statusChangedAt":"2025-03-25T10:57:46.157+0100","key":"WFN-186","url":"https://support.dataart.com/browse/WFN-186","assignee":"Alesya Prolagayeva"},"RITM2372804":{"status":"Closed","statusChangedAt":"2026-08-14T15:27:45.090+0200","key":"WFN-201","url":"https://support.dataart.com/browse/WFN-201","assignee":"Alesya Prolagayeva"},"RITM2432222":{"status":"Resolved","statusChangedAt":"2026-08-14T15:28:02.887+0200","key":"WFN-302","url":"https://support.dataart.com/browse/WFN-302","assignee":"Alesya Prolagayeva"},"RITM2578631":{"status":"Closed","statusChangedAt":"2026-07-21T05:32:39.390+0200","key":"WFN-513","url":"https://support.dataart.com/browse/WFN-513","assignee":"Damian Casasnovas"},"RITM2653436":{"status":"UAT","statusChangedAt":"2026-08-21T13:27:41.680+0200","key":"WFN-605","url":"https://support.dataart.com/browse/WFN-605","assignee":"Alesya Prolagayeva","statusDurations":{"Feedback Processing":347941883,"In Progress":3985446,"Ready for QA":1251611378,"Ready for UAT":4407153760,"TO DO":226306366,"UAT":13892139160}},"RITM2653860":{"status":"Released","statusChangedAt":"2026-08-21T13:42:47.980+0200","key":"WFN-582","url":"https://support.dataart.com/browse/WFN-582","assignee":"Alesya Prolagayeva","statusDurations":{"TO DO":1121578787}},"RITM2653874":{"status":"Released","statusChangedAt":"2026-08-26T15:49:10.823+0200","key":"WFN-708","url":"https://support.dataart.com/browse/WFN-708","assignee":"Alesya Prolagayeva","statusDurations":{"Content Change":295312964,"Feedback Processing":256413086,"In Development":91144564,"In Progress":1522426620,"In QA":5027606,"QA":6587,"Ready To Deploy to Prod":430409276,"Ready for QA":4164771723,"Ready for UAT":1053611061,"Released":83543127,"TO DO":1550566789,"UAT":4116977494}},"RITM2660893":{"status":"Closed","statusChangedAt":"2026-08-14T18:48:33.593+0200","key":"WFN-569","url":"https://support.dataart.com/browse/WFN-569","assignee":"Alesya Prolagayeva","statusDurations":{"Closed":2697626787,"In Development":67966,"In Progress":7797297,"Ready for QA":228602860}},"RITM2683607":{"status":"UAT","statusChangedAt":"2026-07-29T16:44:53.407+0200","key":"WFN-618","url":"https://support.dataart.com/browse/WFN-618","assignee":"Alesya Prolagayeva","statusDurations":{"Content Change":499192484,"Feedback Processing":249513600,"In Development":544283930,"In Progress":2747867757,"In QA":80183186,"QA":11637,"Ready for QA":3015646110,"Ready for UAT":3050557280,"TO DO":881473183,"UAT":2501235590}},"RITM2692105":{"status":"In Progress","statusChangedAt":"2026-08-14T15:28:24.123+0200","key":"WFN-632","url":"https://support.dataart.com/browse/WFN-632","assignee":"Alesya Prolagayeva"},"RITM2692448":{"status":"Closed","statusChangedAt":"2026-08-21T12:45:09.743+0200","key":"WFN-631","url":"https://support.dataart.com/browse/WFN-631","assignee":"Alesya Prolagayeva","statusDurations":{"Closed":526584207,"Content Change":343104066,"In Progress":2351372293,"In QA":17782401,"Live":20348033,"On Hold/Blocked":3949953,"QA":758368474,"Ready To Deploy to Prod":2489417258,"Ready for QA":2250461603,"Ready for UAT":7109220063,"TO DO":875218976,"UAT":719823266}},"RITM2695244":{"status":"Resolved","statusChangedAt":"2026-08-14T15:28:07.910+0200","key":"WFN-634","url":"https://support.dataart.com/browse/WFN-634","assignee":"Alesya Prolagayeva"},"RITM2705568":{"status":"UAT","statusChangedAt":"2026-08-21T16:37:54.077+0200","key":"WFN-833","url":"https://support.dataart.com/browse/WFN-833","assignee":"Alesya Prolagayeva"},"RITM2715970":{"status":"In Progress","statusChangedAt":"2026-08-14T15:28:00.217+0200","key":"WFN-652","url":"https://support.dataart.com/browse/WFN-652","assignee":"Alesya Prolagayeva"},"RITM2728854":{"status":"UAT","statusChangedAt":"2026-08-25T13:51:39.927+0200","key":"WFN-663","url":"https://support.dataart.com/browse/WFN-663","assignee":"Alesya Prolagayeva","statusDurations":{"Analysis":2690875804,"Content Change":46958549,"In Development":128603,"In Progress":1342245113,"In QA":523226233,"On Hold/Blocked":3573,"Ready for QA":6065193084,"Ready for UAT":359847787,"TO DO":1686985821,"UAT":2400453720}},"RITM2752888":{"status":"UAT","statusChangedAt":"2026-08-21T13:42:40.190+0200","key":"WFN-709","url":"https://support.dataart.com/browse/WFN-709","assignee":"Alesya Prolagayeva","statusDurations":{"Analysis":77277843,"Content Change":4710,"In Progress":12955816,"In QA":3470,"Ready for QA":273006017,"Ready for UAT":6307191424,"TO DO":4485926037,"UAT":523133760}},"RITM2757697":{"status":"On Hold/Blocked","statusChangedAt":"2026-07-15T21:51:25.217+0200","key":"WFN-692","url":"https://support.dataart.com/browse/WFN-692","assignee":"Tatyana Samoylenko"},"RITM2764036":{"status":"Released","statusChangedAt":"2026-08-14T12:09:51.840+0200","key":"WFN-699","url":"https://support.dataart.com/browse/WFN-699","assignee":"Oksana Batyuk"},"RITM2769988":{"status":"Waiting PO","statusChangedAt":"2026-07-22T17:43:56.653+0200","key":"WFN-707","url":"https://support.dataart.com/browse/WFN-707","assignee":"Elizaveta Nyarko"},"RITM2770001":{"status":"Waiting PO","statusChangedAt":"2026-07-22T17:44:41.953+0200","key":"WFN-706","url":"https://support.dataart.com/browse/WFN-706","assignee":"Elizaveta Nyarko"},"RITM2770518":{"status":"Waiting PO","statusChangedAt":"2026-04-21T18:44:09.850+0200","key":"WFN-705","url":"https://support.dataart.com/browse/WFN-705","assignee":"Oksana Batyuk"},"RITM2773268":{"status":"Released","statusChangedAt":"2026-08-14T12:09:56.533+0200","key":"WFN-711","url":"https://support.dataart.com/browse/WFN-711","assignee":"Alesya Prolagayeva"},"RITM2781739":{"status":"On Hold/Blocked","statusChangedAt":"2026-08-11T15:13:14.940+0200","key":"WFN-724","url":"https://support.dataart.com/browse/WFN-724","assignee":"Alina Morozova"},"RITM2782465":{"status":"Resolved","statusChangedAt":"2026-08-14T15:28:10.207+0200","key":"WFN-726","url":"https://support.dataart.com/browse/WFN-726","assignee":"Alesya Prolagayeva"},"RITM2788964":{"status":"On Hold/Blocked","statusChangedAt":"2026-08-18T06:52:12.247+0200","key":"WFN-767","url":"https://support.dataart.com/browse/WFN-767","assignee":"Taras Shevchenko","statusDurations":{"In Progress":1836,"On Hold/Blocked":705291257}},"RITM2796967":{"status":"Closed","statusChangedAt":"2026-07-15T22:28:40.137+0200","key":"WFN-777","url":"https://support.dataart.com/browse/WFN-777","assignee":"Tatyana Samoylenko"},"RITM2797301":{"status":"In Progress","statusChangedAt":"2026-08-14T15:28:24.737+0200","key":"WFN-776","url":"https://support.dataart.com/browse/WFN-776","assignee":"Alesya Prolagayeva"},"RITM2797459":{"status":"UAT","statusChangedAt":"2026-08-20T11:28:43.877+0200","key":"WFN-775","url":"https://support.dataart.com/browse/WFN-775","assignee":"Alesya Prolagayeva","statusDurations":{"Analysis":20233,"Content Change":4550,"Feedback Processing":159039814,"In Development":1566354,"In Progress":1159472211,"In QA":9960,"On Hold/Blocked":1286596623,"QA":4120,"Ready for QA":109480677,"Ready for UAT":5025529186,"TO DO":967726776,"UAT":617573713}},"RITM2804881":{"status":"Ready for UAT","statusChangedAt":"2026-08-27T14:21:28.477+0200","key":"WFN-784","url":"https://support.dataart.com/browse/WFN-784","assignee":"Alesya Prolagayeva","statusDurations":{"Analysis":15188667,"Content Change":529848686,"In Development":6093,"In Progress":3374137703,"In QA":10769557,"Live":9250,"On Hold/Blocked":4874000,"QA":16639298,"Ready for QA":2647603550,"Ready for UAT":3772664649,"TO DO":273579820,"UAT":173318937}},"RITM2805838":{"status":"Ready for UAT","statusChangedAt":"2026-08-10T10:56:14.077+0200","key":"WFN-792","url":"https://support.dataart.com/browse/WFN-792","assignee":"Alesya Prolagayeva","statusDurations":{"Closed":1734337847,"In Progress":25227,"QA":189376}},"RITM2807333":{"status":"In Progress","statusChangedAt":"2026-08-14T15:28:25.060+0200","key":"WFN-790","url":"https://support.dataart.com/browse/WFN-790","assignee":"Alesya Prolagayeva"},"RITM2810823":{"status":"UAT","statusChangedAt":"2026-08-27T12:48:45.890+0200","key":"WFN-801","url":"https://support.dataart.com/browse/WFN-801","assignee":"Alesya Prolagayeva","statusDurations":{"Content Change":23624,"Feedback Processing":639896533,"In Development":90384,"In Progress":1514064849,"In QA":12015610,"QA":19301311,"Ready for QA":552452892,"Ready for UAT":7518887474,"TO DO":89777567,"UAT":7970623}},"RITM2811981":{"status":"UAT","statusChangedAt":"2026-08-26T16:39:25.320+0200","key":"WFN-800","url":"https://support.dataart.com/browse/WFN-800","assignee":"Alesya Prolagayeva"},"RITM2812290":{"status":"Resolved","statusChangedAt":"2026-08-19T17:31:02.483+0200","key":"WFN-809","url":"https://support.dataart.com/browse/WFN-809","assignee":"Elizaveta Nyarko"},"RITM2814319":{"status":"Resolved","statusChangedAt":"2026-08-14T15:28:12.597+0200","key":"WFN-812","url":"https://support.dataart.com/browse/WFN-812","assignee":"Alesya Prolagayeva"},"RITM2815706":{"status":"In Progress","statusChangedAt":"2026-06-05T13:55:20.077+0200","key":"WFN-888","url":"https://support.dataart.com/browse/WFN-888","assignee":"Alesya Prolagayeva"},"RITM2819523":{"status":"Waiting PO","statusChangedAt":"2026-08-20T14:52:53.110+0200","key":"WFN-828","url":"https://support.dataart.com/browse/WFN-828","assignee":"Elizaveta Nyarko"},"RITM2824833":{"status":"On Hold/Blocked","statusChangedAt":"2026-08-21T19:36:11.207+0200","key":"WFN-858","url":"https://support.dataart.com/browse/WFN-858","assignee":"Taras Shevchenko"},"RITM2824984":{"status":"On Hold/Blocked","statusChangedAt":"2026-08-03T09:58:32.127+0200","key":"WFN-839","url":"https://support.dataart.com/browse/WFN-839","assignee":"Taras Shevchenko"},"RITM2830093":{"status":"Resolved","statusChangedAt":"2026-08-14T20:32:19.580+0200","key":"WFN-854","url":"https://support.dataart.com/browse/WFN-854","assignee":"Alesya Prolagayeva"},"RITM2830102":{"status":"Ready for UAT","statusChangedAt":"2026-08-27T13:57:06.663+0200","key":"WFN-853","url":"https://support.dataart.com/browse/WFN-853","assignee":"Alesya Prolagayeva"},"RITM2830109":{"status":"TO DO","statusChangedAt":"2026-08-14T15:28:33.760+0200","key":"WFN-852","url":"https://support.dataart.com/browse/WFN-852","assignee":"Alesya Prolagayeva"},"RITM2830118":{"status":"UAT","statusChangedAt":"2026-08-26T17:24:27.693+0200","key":"WFN-851","url":"https://support.dataart.com/browse/WFN-851","assignee":"Alesya Prolagayeva"},"RITM2830125":{"status":"Ready To Deploy to Prod","statusChangedAt":"2026-08-21T18:38:01.770+0200","key":"WFN-850","url":"https://support.dataart.com/browse/WFN-850","assignee":"Alesya Prolagayeva"},"RITM2843794":{"status":"Closed","statusChangedAt":"2026-07-15T22:31:08.783+0200","key":"WFN-876","url":"https://support.dataart.com/browse/WFN-876","assignee":"Tatyana Samoylenko"},"RITM2844638":{"status":"In Progress","statusChangedAt":"2026-08-14T15:28:32.137+0200","key":"WFN-877","url":"https://support.dataart.com/browse/WFN-877","assignee":"Elizaveta Nyarko"},"RITM2844884":{"status":"Closed","statusChangedAt":"2026-06-15T16:25:30.307+0200","key":"WFN-878","url":"https://support.dataart.com/browse/WFN-878","assignee":"Elizaveta Nyarko"},"RITM2847083":{"status":"In Progress","statusChangedAt":"2026-08-14T15:28:32.287+0200","key":"WFN-881","url":"https://support.dataart.com/browse/WFN-881","assignee":"Elizaveta Nyarko"},"RITM2850791":{"status":"Ready for UAT","statusChangedAt":"2026-07-31T15:33:10.697+0200","key":"WFN-1292","url":"https://support.dataart.com/browse/WFN-1292","assignee":"Elizaveta Nyarko","statusDurations":{"In QA":186415557,"On Hold/Blocked":149728480,"QA":1467909216,"TO DO":1121640020}},"RITM2851098":{"status":"Closed","statusChangedAt":"2026-07-12T00:54:46.800+0200","key":"WFN-885","url":"https://support.dataart.com/browse/WFN-885","assignee":"Tatyana Samoylenko"},"RITM2853835":{"status":"Closed","statusChangedAt":"2026-06-26T16:46:45.117+0200","key":"WFN-890","url":"https://support.dataart.com/browse/WFN-890","assignee":"Tatyana Samoylenko"},"RITM2855254":{"status":"Closed","statusChangedAt":"2026-08-12T23:07:26.793+0200","key":"WFN-1073","url":"https://support.dataart.com/browse/WFN-1073","assignee":"Tatyana Samoylenko","statusDurations":{"Closed":2421753763,"In Development":14577,"In Progress":4274473,"In QA":79623,"Live":4864,"Ready for QA":78520003,"Ready for UAT":8420,"Released":3190}},"RITM2858924":{"status":"In QA","statusChangedAt":"2026-08-26T16:28:00.577+0200","key":"WFN-1344","url":"https://support.dataart.com/browse/WFN-1344","assignee":"Mykola Lys"},"RITM2858952":{"status":"Closed","statusChangedAt":"2026-07-29T00:30:18.683+0200","key":"WFN-900","url":"https://support.dataart.com/browse/WFN-900","assignee":"Tatyana Samoylenko","statusDurations":{"Closed":2557877360,"In Progress":320573345,"In QA":27103,"Live":603176,"On Hold/Blocked":1075666522,"QA":29254020,"Ready To Deploy to Prod":525419677,"Ready for UAT":170878480,"Released":682771866,"TO DO":1223343418}},"RITM2867288":{"status":"Approval","statusChangedAt":"2026-08-25T23:10:43.077+0200","key":"WFN-1343","url":"https://support.dataart.com/browse/WFN-1343","assignee":"Nikolay Dishlevoy"},"RITM2868341":{"status":"On Hold/Blocked","statusChangedAt":"2026-08-11T15:14:44.250+0200","key":"WFN-1016","url":"https://support.dataart.com/browse/WFN-1016","assignee":"Daria Panchenko","statusDurations":{"In Development":7777,"In Progress":7850,"On Hold/Blocked":2534653393,"TO DO":762375163}},"RITM2868952":{"status":"In Progress","statusChangedAt":"2026-08-25T21:40:32.153+0200","key":"WFN-906","url":"https://support.dataart.com/browse/WFN-906","assignee":"Alina Morozova"},"RITM2869578":{"status":"Resolved","statusChangedAt":"2026-08-14T15:28:16.673+0200","key":"WFN-1019","url":"https://support.dataart.com/browse/WFN-1019","assignee":"Elizaveta Nyarko"},"RITM2873041":{"status":"On Hold/Blocked","statusChangedAt":"2026-08-04T20:00:11.950+0200","key":"WFN-1021","url":"https://support.dataart.com/browse/WFN-1021","assignee":"Elizaveta Nyarko"},"RITM2879182":{"status":"Closed","statusChangedAt":"2026-07-21T16:09:46.637+0200","key":"WFN-1325","url":"https://support.dataart.com/browse/WFN-1325","assignee":"Alesya Prolagayeva","statusDurations":{"Closed":3192707313,"Content Change":569170,"In Progress":3584910,"Ready for QA":82328497,"TO DO":16286007}},"RITM2885259":{"status":"UAT","statusChangedAt":"2026-08-25T15:37:05.473+0200","key":"WFN-1202","url":"https://support.dataart.com/browse/WFN-1202","assignee":"Tatyana Samoylenko"},"RITM2886705":{"status":"UAT","statusChangedAt":"2026-08-26T13:15:24.030+0200","key":"WFN-1078","url":"https://support.dataart.com/browse/WFN-1078","assignee":"Elizaveta Nyarko","statusDurations":{"Content Change":620270686,"In Development":3244,"In Progress":506368228,"In QA":324737,"QA":3226,"Ready for QA":137897756,"Ready for UAT":619546490,"TO DO":3914096,"UAT":92769920}},"RITM2886815":{"status":"Waiting PO","statusChangedAt":"2026-08-12T23:07:55.053+0200","key":"WFN-1178","url":"https://support.dataart.com/browse/WFN-1178","assignee":"Tatyana Samoylenko"},"RITM2889467":{"status":"Approval","statusChangedAt":"2026-08-24T19:09:46.037+0200","key":"WFN-1121","url":"https://support.dataart.com/browse/WFN-1121","assignee":"Nikolay Dishlevoy"},"RITM2890351":{"status":"UAT","statusChangedAt":"2026-08-14T18:34:56.923+0200","key":"WFN-1489","url":"https://support.dataart.com/browse/WFN-1489","assignee":"Alesya Prolagayeva","statusDurations":{"In Development":2680,"In Progress":31528144,"In QA":105895866,"QA":7084430,"Ready for QA":46669197,"Ready for UAT":8478383,"UAT":1110397027}},"RITM2890765":{"status":"Released","statusChangedAt":"2026-08-19T11:12:09.413+0200","key":"WFN-1156","url":"https://support.dataart.com/browse/WFN-1156","assignee":"Alesya Prolagayeva"},"RITM2890898":{"status":"Cancelled","statusChangedAt":"2026-07-23T17:46:31.037+0200","key":"WFN-1227","url":"https://support.dataart.com/browse/WFN-1227","assignee":"Tatyana Samoylenko"},"RITM2891219":{"status":"Analysis","statusChangedAt":"2026-07-21T04:36:26.463+0200","key":"WFN-1237","url":"https://support.dataart.com/browse/WFN-1237","assignee":"Damian Casasnovas"},"RITM2891763":{"status":"TO DO","statusChangedAt":"2026-08-26T16:05:50.840+0200","key":"WFN-1230","url":"https://support.dataart.com/browse/WFN-1230","assignee":"Alesya Prolagayeva","statusDurations":{"Closed":3374698723,"Content Change":3996,"In Progress":175136698,"In QA":5537016,"On Hold/Blocked":9836123,"Ready for QA":167212564,"TO DO":82543110}},"RITM2892540":{"status":"Ready for UAT","statusChangedAt":"2026-08-19T17:25:37.840+0200","key":"WFN-1228","url":"https://support.dataart.com/browse/WFN-1228","assignee":"Tatyana Samoylenko","statusDurations":{"TO DO":1121579207}},"RITM2897455":{"status":"Approval","statusChangedAt":"2026-07-27T15:46:40.410+0200","key":"WFN-1342","url":"https://support.dataart.com/browse/WFN-1342","assignee":"Valentina Gomez Lopera"},"RITM2898516":{"status":"TO DO","statusChangedAt":"2026-08-14T15:28:34.560+0200","key":"WFN-1270","url":"https://support.dataart.com/browse/WFN-1270","assignee":"Alesya Prolagayeva","statusDurations":{"TO DO":1121579390}},"RITM2898840":{"status":"On Hold/Blocked","statusChangedAt":"2026-07-24T18:46:21.773+0200","key":"WFN-1316","url":"https://support.dataart.com/browse/WFN-1316","assignee":"Taras Shevchenko","statusDurations":{"In Progress":222119657,"On Hold/Blocked":2952429807,"TO DO":131426}},"RITM2900650":{"status":"Ready for UAT","statusChangedAt":"2026-08-14T16:48:36.747+0200","key":"WFN-1320","url":"https://support.dataart.com/browse/WFN-1320","assignee":"Elizaveta Nyarko","statusDurations":{"Content Change":249165439,"In Development":4380,"In Progress":5836,"In QA":19114140,"On Hold/Blocked":605544765,"Ready for QA":172337414,"Ready for UAT":1185667463,"TO DO":867456183}},"RITM2903136":{"status":"Ready To Deploy to Prod","statusChangedAt":"2026-08-12T12:53:07.637+0200","key":"WFN-1605","url":"https://support.dataart.com/browse/WFN-1605","assignee":"Alina Morozova","statusDurations":{"Content Change":8792583,"In QA":2966,"Ready To Deploy to Prod":1303706313,"Ready for QA":9542394,"Ready for UAT":72659614,"TO DO":244904137,"UAT":95030050}},"RITM2905228":{"status":"Analysis","statusChangedAt":"2026-08-17T18:04:43.000+0200","key":"WFN-1667","url":"https://support.dataart.com/browse/WFN-1667","assignee":"Alesya Prolagayeva","statusDurations":{"In Progress":1976,"On Hold/Blocked":100560117}},"RITM2905448":{"status":"Released","statusChangedAt":"2026-08-27T10:44:23.860+0200","key":"WFN-1397","url":"https://support.dataart.com/browse/WFN-1397","assignee":"Alesya Prolagayeva","statusDurations":{"Content Change":2136,"In QA":2793,"Ready To Deploy to Prod":491820487,"Ready for QA":22484487,"Ready for UAT":93198424,"Released":15430090,"TO DO":151131740,"UAT":159556}},"RITM2906334":{"status":"TO DO","statusChangedAt":"2026-07-31T15:43:25.300+0200","key":"WFN-1385","url":"https://support.dataart.com/browse/WFN-1385","assignee":"Lilit Abrahamyan"},"RITM2908793":{"status":"UAT","statusChangedAt":"2026-08-16T22:39:33.783+0200","key":"WFN-1408","url":"https://support.dataart.com/browse/WFN-1408","assignee":"Damian Casasnovas"},"RITM2910009":{"status":"Ready for UAT","statusChangedAt":"2026-08-21T12:43:08.223+0200","key":"WFN-1407","url":"https://support.dataart.com/browse/WFN-1407","assignee":"Tatyana Samoylenko","statusDurations":{"In Development":2970,"In Progress":82227740,"In QA":6603,"On Hold/Blocked":936631950,"QA":4113,"Ready To Deploy to Prod":585910250,"Ready for QA":2286,"Ready for UAT":526708744,"TO DO":154010644,"UAT":212477743}},"RITM2910152":{"status":"On Hold/Blocked","statusChangedAt":"2026-08-13T12:47:52.253+0200","key":"WFN-1426","url":"https://support.dataart.com/browse/WFN-1426","assignee":"Liudmyla Kuzmenko","statusDurations":{"Content Change":43298400,"In Development":20397710,"In Progress":3038216,"In QA":68521628,"On Hold/Blocked":1217621697,"QA":5691706,"Ready To Deploy to Prod":9662744,"Ready for UAT":348203426,"Released":1434543,"TO DO":16335096,"Waiting PO":674390697}},"RITM2910789":{"status":"Ready for UAT","statusChangedAt":"2026-08-14T17:54:03.397+0200","key":"WFN-1480","url":"https://support.dataart.com/browse/WFN-1480","assignee":"Tatyana Samoylenko","statusDurations":{"Content Change":430623858,"In QA":26690,"On Hold/Blocked":197217767,"Ready for QA":23980728,"Ready for UAT":1112850553,"TO DO":138713254}},"RITM2910803":{"status":"UAT","statusChangedAt":"2026-08-25T21:36:58.557+0200","key":"WFN-1503","url":"https://support.dataart.com/browse/WFN-1503","assignee":"Tatyana Samoylenko","statusDurations":{"Approval":105641440,"Content Change":9836289,"In Development":2120,"In Progress":19693,"In QA":34806326,"On Hold/Blocked":2280,"QA":17860,"Ready for QA":479355506,"Ready for UAT":1206299476,"TO DO":103818186,"UAT":149081437}},"RITM2913180":{"status":"UAT","statusChangedAt":"2026-08-05T18:21:53.100+0200","key":"WFN-1553","url":"https://support.dataart.com/browse/WFN-1553","assignee":"Tatyana Samoylenko","statusDurations":{"Content Change":8999,"In Progress":7551,"In QA":8930,"On Hold/Blocked":4910,"Ready for QA":923851,"Ready for UAT":2759456,"UAT":1888780850}},"RITM2914010":{"status":"UAT","statusChangedAt":"2026-08-21T18:00:11.750+0200","key":"WFN-1469","url":"https://support.dataart.com/browse/WFN-1469","assignee":"Elizaveta Nyarko"},"RITM2914297":{"status":"Waiting PO","statusChangedAt":"2026-08-25T11:36:30.883+0200","key":"WFN-1642","url":"https://support.dataart.com/browse/WFN-1642","assignee":"Alesya Prolagayeva","statusDurations":{"Content Change":2814364,"In QA":5486,"On Hold/Blocked":604970506,"Ready To Deploy to Prod":16934496,"Ready for QA":5502070,"Ready for UAT":3624,"Released":408486910,"TO DO":4646200,"Waiting PO":185103067}},"RITM2915693":{"status":"On Hold/Blocked","statusChangedAt":"2026-08-12T23:13:13.027+0200","key":"WFN-1476","url":"https://support.dataart.com/browse/WFN-1476","assignee":"Tatyana Samoylenko","statusDurations":{"On Hold/Blocked":1266500923}},"RITM2916127":{"status":"UAT","statusChangedAt":"2026-08-12T19:58:08.667+0200","key":"WFN-1479","url":"https://support.dataart.com/browse/WFN-1479","assignee":"Damian Casasnovas"},"RITM2917211":{"status":"Ready for UAT","statusChangedAt":"2026-08-17T17:05:36.977+0200","key":"WFN-1529","url":"https://support.dataart.com/browse/WFN-1529","assignee":"Tatyana Samoylenko","statusDurations":{"Content Change":369146130,"In QA":461447,"Ready for QA":249389824,"Ready for UAT":856556973,"TO DO":428045356}},"RITM2917815":{"status":"UAT","statusChangedAt":"2026-08-10T20:52:41.737+0200","key":"WFN-1590","url":"https://support.dataart.com/browse/WFN-1590","assignee":"Damian Casasnovas"},"RITM2918670":{"status":"Released","statusChangedAt":"2026-08-18T17:45:54.293+0200","key":"WFN-1509","url":"https://support.dataart.com/browse/WFN-1509","assignee":"Alesya Prolagayeva","statusDurations":{"In Development":100043577,"In Progress":9993,"In QA":66836207,"On Hold/Blocked":3336,"QA":8240,"Ready To Deploy to Prod":683527567,"Ready for QA":94329647,"Ready for UAT":331001483,"Released":767747497,"TO DO":16634373,"UAT":6969333}},"RITM2918699":{"status":"Ready for UAT","statusChangedAt":"2026-08-25T17:00:40.847+0200","key":"WFN-1494","url":"https://support.dataart.com/browse/WFN-1494","assignee":"Elizaveta Nyarko","statusDurations":{"Content Change":6463309,"In QA":5914,"Ready for QA":342376744,"Ready for UAT":165653103,"TO DO":84833817}},"RITM2919154":{"status":"Analysis","statusChangedAt":"2026-08-13T10:12:43.000+0200","key":"WFN-1647","url":"https://support.dataart.com/browse/WFN-1647","assignee":"Alesya Prolagayeva","statusDurations":{}},"RITM2920220":{"status":"On Hold/Blocked","statusChangedAt":"2026-08-11T17:02:12.170+0200","key":"WFN-1556","url":"https://support.dataart.com/browse/WFN-1556","assignee":"Alina Morozova","statusDurations":{"On Hold/Blocked":1375161780}},"RITM2921921":{"status":"Closed","statusChangedAt":"2026-08-14T17:35:08.760+0200","key":"WFN-1537","url":"https://support.dataart.com/browse/WFN-1537","assignee":"Alesya Prolagayeva","statusDurations":{"In Development":10610360,"In QA":4880,"Ready To Deploy to Prod":3280,"Ready for QA":102697653,"Ready for UAT":321421677,"Released":776815483,"TO DO":16323700}},"RITM2922020":{"status":"Ready for UAT","statusChangedAt":"2026-08-13T17:33:12.947+0200","key":"WFN-1561","url":"https://support.dataart.com/browse/WFN-1561","assignee":"Tatyana Samoylenko","statusDurations":{"Content Change":3163,"In Progress":11300,"In QA":3607,"Ready for QA":13712507,"Ready for UAT":1200501003}},"RITM2922061":{"status":"Ready To Deploy to Prod","statusChangedAt":"2026-08-27T14:21:24.480+0200","key":"WFN-1564","url":"https://support.dataart.com/browse/WFN-1564","assignee":"Oleksandr Shevchenko (G.)","statusDurations":{"Content Change":11404946,"In QA":2582593,"On Hold/Blocked":618510650,"Ready To Deploy to Prod":2409470,"Ready for QA":146370644,"Ready for UAT":2957,"TO DO":16231440,"UAT":7845093}},"RITM2923512":{"status":"Ready for UAT","statusChangedAt":"2026-08-26T15:40:52.430+0200","key":"WFN-1610","url":"https://support.dataart.com/browse/WFN-1610","assignee":"Elizaveta Nyarko","statusDurations":{"Content Change":1740484,"In QA":183760,"On Hold/Blocked":757691643,"Ready for QA":90230763,"Ready for UAT":84041520,"TO DO":441007533}},"RITM2923566":{"status":"On Hold/Blocked","statusChangedAt":"2026-08-26T13:12:19.093+0200","key":"WFN-1595","url":"https://support.dataart.com/browse/WFN-1595","assignee":"Elizaveta Nyarko","statusDurations":{"In Progress":5090,"On Hold/Blocked":876167583,"TO DO":245403434}},"RITM2925045":{"status":"Approval","statusChangedAt":"2026-08-19T17:09:44.970+0200","key":"WFN-1658","url":"https://support.dataart.com/browse/WFN-1658","assignee":"Oleksandr Shevchenko (G.)","statusDurations":{"Approval":683508980}},"RITM2925211":{"status":"UAT","statusChangedAt":"2026-08-25T21:29:40.783+0200","key":"WFN-1659","url":"https://support.dataart.com/browse/WFN-1659","assignee":"Tatyana Samoylenko","statusDurations":{"Approval":69631550,"Content Change":65781743,"In QA":5797,"Ready for QA":373656750,"Ready for UAT":2946,"TO DO":24928437,"UAT":149513167}},"RITM2925564":{"status":"On Hold/Blocked","statusChangedAt":"2026-08-13T13:14:36.513+0200","key":"WFN-1644","url":"https://support.dataart.com/browse/WFN-1644","assignee":"Alesya Prolagayeva","statusDurations":{"Cancelled":1409227,"Closed":6716327,"In Progress":9773,"On Hold/Blocked":1209297490,"TO DO":3620}},"RITM2925646":{"status":"Closed","statusChangedAt":"2026-08-25T11:40:03.843+0200","key":"WFN-1645","url":"https://support.dataart.com/browse/WFN-1645","assignee":"Alesya Prolagayeva","statusDurations":{"Closed":184890107,"Content Change":87692160,"In Development":3294,"In QA":7027,"On Hold/Blocked":172572747,"Ready To Deploy to Prod":16817943,"Ready for QA":5510060,"Ready for UAT":6699,"Released":408683910,"TO DO":351103113}},"RITM2925654":{"status":"Ready for UAT","statusChangedAt":"2026-08-26T11:48:45.023+0200","key":"WFN-1646","url":"https://support.dataart.com/browse/WFN-1646","assignee":"Alesya Prolagayeva","statusDurations":{"In Development":10797,"In QA":3126,"On Hold/Blocked":930203120,"Ready for QA":77546067,"Ready for UAT":97968927,"TO DO":9043943}},"RITM2926866":{"status":"Waiting PO","statusChangedAt":"2026-08-26T13:10:50.483+0200","key":"WFN-1623","url":"https://support.dataart.com/browse/WFN-1623","assignee":"Elizaveta Nyarko","statusDurations":{"Content Change":3693,"In Development":4677,"In QA":3277,"Ready To Deploy to Prod":2763,"Ready for QA":2576,"Ready for UAT":28313,"Released":1770,"TO DO":500290240,"UAT":611341687,"Waiting PO":93043467}},"RITM2927137":{"status":"Analysis","statusChangedAt":"2026-08-10T17:40:29.000+0200","key":"WFN-1626","url":"https://support.dataart.com/browse/WFN-1626","assignee":"Daria Panchenko","statusDurations":{}},"RITM2928854":{"status":"TO DO","statusChangedAt":"2026-08-25T14:15:55.447+0200","key":"WFN-1636","url":"https://support.dataart.com/browse/WFN-1636","assignee":"Kseniia Berezenko (Getmantseva)","statusDurations":{"Content Change":22303,"In Development":6004,"In QA":3097,"On Hold/Blocked":9217,"Ready for QA":253989003,"Ready for UAT":679700360,"TO DO":186279277,"UAT":3696}},"RITM2929658":{"status":"On Hold/Blocked","statusChangedAt":"2026-08-18T08:47:58.200+0200","key":"WFN-1629","url":"https://support.dataart.com/browse/WFN-1629","assignee":"Alesya Prolagayeva","statusDurations":{"On Hold/Blocked":800015750}},"RITM2933474":{"status":"Approval","statusChangedAt":"2026-08-16T22:04:12.013+0200","key":"WFN-1661","url":"https://support.dataart.com/browse/WFN-1661","assignee":"Damian Casasnovas"},"RITM2936892":{"status":"Analysis","statusChangedAt":"2026-08-18T13:39:57.000+0200","key":"WFN-1671","url":"https://support.dataart.com/browse/WFN-1671","assignee":"Alina Morozova","statusDurations":{}},"RITM2937327":{"status":"Ready for UAT","statusChangedAt":"2026-08-26T15:40:38.473+0200","key":"WFN-1673","url":"https://support.dataart.com/browse/WFN-1673","assignee":"Elizaveta Nyarko","statusDurations":{"Content Change":7197177,"In QA":2890,"Ready for QA":85444220,"Ready for UAT":83534550,"TO DO":423279743}},"RITM2937926":{"status":"Analysis","statusChangedAt":"2026-08-24T03:42:42.000+0200","key":"WFN-1703","url":"https://support.dataart.com/browse/WFN-1703","assignee":null},"RITM2938865":{"status":"Analysis","statusChangedAt":"2026-08-19T15:13:58.000+0200","key":"WFN-1677","url":"https://support.dataart.com/browse/WFN-1677","assignee":"Alesya Prolagayeva","statusDurations":{}},"RITM2940506":{"status":"Analysis","statusChangedAt":"2026-08-24T03:30:32.000+0200","key":"WFN-1701","url":"https://support.dataart.com/browse/WFN-1701","assignee":null},"RITM2940759":{"status":"Content Change","statusChangedAt":"2026-08-25T22:25:57.430+0200","key":"WFN-1705","url":"https://support.dataart.com/browse/WFN-1705","assignee":"Valentina Gomez Lopera"},"RITM2943364":{"status":"Analysis","statusChangedAt":"2026-08-25T15:03:25.000+0200","key":"WFN-1711","url":"https://support.dataart.com/browse/WFN-1711","assignee":"Oleksandr Shevchenko (G.)","statusDurations":{}},"RITM2943697":{"status":"Analysis","statusChangedAt":"2026-08-24T20:47:58.000+0200","key":"WFN-1706","url":"https://support.dataart.com/browse/WFN-1706","assignee":null},"RITM2944926":{"status":"Ready for UAT","statusChangedAt":"2026-08-27T13:03:12.707+0200","key":"WFN-1719","url":"https://support.dataart.com/browse/WFN-1719","assignee":"Alesya Prolagayeva","statusDurations":{"Content Change":69015683,"In QA":2734,"Ready for QA":7805903,"Ready for UAT":7101243,"TO DO":2677}},"RITM2945229":{"status":"Ready for UAT","statusChangedAt":"2026-08-26T17:11:14.577+0200","key":"WFN-1722","url":"https://support.dataart.com/browse/WFN-1722","assignee":"Alesya Prolagayeva","statusDurations":{"Content Change":4414106,"In QA":6910,"Ready for QA":4016674,"Ready for UAT":78619373,"TO DO":2260}},"RITM2945319":{"status":"Analysis","statusChangedAt":"2026-08-25T21:55:01.000+0200","key":"WFN-1714","url":"https://support.dataart.com/browse/WFN-1714","assignee":"Oleksandr Shevchenko (G.)","statusDurations":{}},"RITM2946192":{"status":"Analysis","statusChangedAt":"2026-08-26T13:45:16.000+0200","key":"WFN-1721","url":"https://support.dataart.com/browse/WFN-1721","assignee":"Elizaveta Nyarko","statusDurations":{}},"RITM2946434":{"status":"Analysis","statusChangedAt":"2026-08-26T22:48:53.000+0200","key":"WFN-1732","url":"https://support.dataart.com/browse/WFN-1732","assignee":"Alina Morozova","statusDurations":{}},"RITM2946810":{"status":"Analysis","statusChangedAt":"2026-08-27T13:49:05.000+0200","key":"WFN-1737","url":"https://support.dataart.com/browse/WFN-1737","assignee":"Alina Morozova","statusDurations":{}},"RITM2946948":{"status":"Analysis","statusChangedAt":"2026-08-26T17:53:51.000+0200","key":"WFN-1727","url":"https://support.dataart.com/browse/WFN-1727","assignee":"Alesya Prolagayeva","statusDurations":{}},"RITM2947066":{"status":"Approval","statusChangedAt":"2026-08-26T21:25:12.023+0200","key":"WFN-1731","url":"https://support.dataart.com/browse/WFN-1731","assignee":null},"RITM2947074":{"status":"Approval","statusChangedAt":"2026-08-26T21:25:01.013+0200","key":"WFN-1730","url":"https://support.dataart.com/browse/WFN-1730","assignee":"Nikolay Dishlevoy"},"RITM2921027":{"status":"Analysis","statusChangedAt":null,"key":"WFN-1611","url":null,"assignee":null,"statusDurations":{}},"RITM2946810 ":{"status":"Analysis","statusChangedAt":null,"key":"WFN-1737","url":null,"assignee":null,"statusDurations":{}},"RITM2890898 ":{"status":"Cancelled","statusChangedAt":null,"key":"WFN-1227","url":null,"assignee":null,"statusDurations":{"Cancelled":3014102913}},"RITM2889117 ":{"status":"Closed","statusChangedAt":null,"key":"WFN-1181","url":null,"assignee":null,"statusDurations":{"Closed":3189510930,"Content Change":1245797,"In Progress":1625130,"Ready for QA":3964263}},"RITM2858954":{"status":"Closed","statusChangedAt":null,"key":"WFN-898","url":null,"assignee":null,"statusDurations":{"Closed":3634561900,"In Progress":264712437,"QA":28408457,"Ready To Deploy to Prod":525346826,"Ready for UAT":169319913,"Released":693542107,"TO DO":1220871757,"Waiting PO":53750190}},"CM":{"status":"Closed","statusChangedAt":null,"key":"WFN-1300","url":null,"assignee":null,"statusDurations":{"Cancelled":4177,"Closed":3599351400,"In Progress":494360}},"RITM2885403 ":{"status":"Closed","statusChangedAt":null,"key":"WFN-1077","url":null,"assignee":null,"statusDurations":{"Closed":3563903247,"In Progress":31344367,"In QA":67443,"QA":6537,"TO DO":33563283}},"RITM2867804 ":{"status":"Closed","statusChangedAt":null,"key":"WFN-1245","url":null,"assignee":null,"statusDurations":{"Closed":3217862073,"In Development":7420,"In Progress":326121393,"In QA":78270,"QA":65624,"Ready for QA":78388230,"TO DO":888450}},"[GAVISCON FR] ADP - Colon should be moves to the previous line on two pages":{"status":"Closed","statusChangedAt":null,"key":"WFN-1249","url":null,"assignee":null,"statusDurations":{"Closed":3650529273,"Content Change":6297406,"In Progress":10050,"In QA":9030,"Ready for QA":141366554}},"RITM2895339 ":{"status":"Closed","statusChangedAt":null,"key":"WFN-1264","url":null,"assignee":null,"statusDurations":{"TO DO":1121577513}},"RITM2653860 ":{"status":"Closed","statusChangedAt":null,"key":"WFN-1301","url":null,"assignee":null,"statusDurations":{"Closed":3553269847,"Content Change":2906,"In Progress":2781503,"Ready for QA":7515024}},"RITM2900288 ":{"status":"Closed","statusChangedAt":null,"key":"WFN-1313","url":null,"assignee":null,"statusDurations":{"Closed":3099353043,"In Progress":8390}},"RITM2805838 ":{"status":"Closed","statusChangedAt":null,"key":"WFN-1369","url":null,"assignee":null,"statusDurations":{"Closed":1734172353,"In Progress":7848,"QA":406236}},"[RITM2805838]":{"status":"Closed","statusChangedAt":null,"key":"WFN-1375","url":null,"assignee":null,"statusDurations":{"Closed":3109149230,"Content Change":45047,"In Progress":328476,"Ready for QA":1080547}},"RITM2882723 [Nurofen DE] Check GTM":{"status":"Closed","statusChangedAt":null,"key":"WFN-1386","url":null,"assignee":null,"statusDurations":{"Closed":3097231823,"In Progress":41880,"On Hold/Blocked":4467}},"RITM2908647":{"status":"Closed","statusChangedAt":null,"key":"WFN-1405","url":null,"assignee":null,"statusDurations":{"Closed":2698000410,"In Progress":7660,"In QA":230663977,"QA":4376}},"RITM2909862":{"status":"Closed","statusChangedAt":null,"key":"WFN-1406","url":null,"assignee":null,"statusDurations":{"Closed":2418028837,"In Progress":3710,"In QA":5600110,"QA":5560}},"RITM2886813":{"status":"Closed","statusChangedAt":null,"key":"WFN-1413","url":null,"assignee":null,"statusDurations":{"Closed":2926883457,"Content Change":2627,"In Progress":1583273,"In QA":4910,"Ready for QA":15005230}},"RITM2804881 ":{"status":"Closed","statusChangedAt":null,"key":"WFN-1414","url":null,"assignee":null,"statusDurations":{"Cancelled":10057404,"Closed":2925916173,"In Progress":3110,"QA":4070}},"RITM2850791 Updates for DACH websites":{"status":"Closed","statusChangedAt":null,"key":"WFN-1418","url":null,"assignee":null,"statusDurations":{"TO DO":1121578397}},"RITM2886705 ":{"status":"Closed","statusChangedAt":null,"key":"WFN-1511","url":null,"assignee":null,"statusDurations":{"Closed":1397707293,"In Progress":344860120,"QA":2387894}},"RITM2923722":{"status":"Closed","statusChangedAt":null,"key":"WFN-1591","url":null,"assignee":null,"statusDurations":{"Closed":611795157,"Content Change":3003,"In Progress":3663,"In QA":3216,"Live":7633707,"Ready To Deploy to Prod":6507277,"Ready for QA":1043134,"Ready for UAT":594880960,"Released":605034796}},"RITM2823952":{"status":"Closed","statusChangedAt":null,"key":"WFN-1594","url":null,"assignee":null,"statusDurations":{"Closed":1809647600,"Content Change":7090,"In Progress":3747,"In QA":5840,"Live":3754,"Ready for QA":2785976,"Released":3013}},"RITM2917818":{"status":"Closed","statusChangedAt":null,"key":"WFN-1607","url":null,"assignee":null,"statusDurations":{"Closed":1707867043,"In Progress":1217617}},"RITM2885259 ":{"status":"Closed","statusChangedAt":null,"key":"WFN-1650","url":null,"assignee":null,"statusDurations":{"In Development":12943,"In Progress":1615298636,"In QA":11536374,"On Hold/Blocked":683271030,"Ready for QA":64441783,"Ready for UAT":951691926,"TO DO":118362964,"UAT":170668477}},"RITM2797459 RITM2914084":{"status":"Closed","statusChangedAt":null,"key":"WFN-1676","url":null,"assignee":null,"statusDurations":{"Closed":700612330,"In Progress":22220227,"TO DO":46585480}},"RITM2824984 ":{"status":"On Hold/Blocked","statusChangedAt":null,"key":"WFN-839","url":null,"assignee":null,"statusDurations":{"Analysis":5766757164,"Approval":1209106640,"On Hold/Blocked":2091781823,"TO DO":22730166}},"RITM2824833 ":{"status":"On Hold/Blocked","statusChangedAt":null,"key":"WFN-858","url":null,"assignee":null,"statusDurations":{"Analysis":10455560,"In Progress":405915896,"On Hold/Blocked":2421621920,"TO DO":178454607}},"RITM2914010 ":{"status":"On Hold/Blocked","statusChangedAt":null,"key":"WFN-1471","url":null,"assignee":null,"statusDurations":{"Content Change":1517,"In Development":5420,"In QA":3397,"On Hold/Blocked":352412943,"Ready for QA":48332853,"Ready for UAT":2830,"TO DO":1179049640,"UAT":507682200}},"RITM2906334 Durex FR - Vending Machine Promotion":{"status":"TO DO","statusChangedAt":null,"key":"WFN-1385","url":null,"assignee":null,"statusDurations":{"TO DO":2330288650}}}} \ No newline at end of file diff --git a/server/data/closed_archive.json b/server/data/closed_archive.json new file mode 100644 index 0000000..d094541 --- /dev/null +++ b/server/data/closed_archive.json @@ -0,0 +1 @@ +{"schema":2,"generatedAt":"2026-08-27T16:04:47.908Z","count":966,"tickets":{"RITM2200028":{"state":"Closed Complete","shortDesc":"Campaign landing page www.finish.ro//promotii-cashback/ as main page to redirect consumers that go to www.finish.ro","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Romania","businessUnit":"Hygiene","finalCost":"150","currencyCode":"","ttfrMinutes":15629,"clientRespMinutes":1164,"firstReplyAt":"2024-09-09 12:14:24","firstAssignedDate":"2024-09-13 15:23:32","fulfillmentDate":"2024-08-29 15:45:59","openedBy":"Andrei Constantin","openedDate":"2024-08-29","closedDate":"2024-09-16","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Andrei Constantin","openedAt":"2024-08-29 15:45:54","stateChangedAt":"2024-09-16 10:50:17","stateChangedBy":"System","lastActivityAt":"2024-09-16 10:50:17","lastActivityBy":"System","_updated":"2024-09-16T05:50:16.000Z"},"RITM2202971":{"state":"Closed Complete","shortDesc":"Update Dettol Website CH (2 SKUs - Packshots and texts)","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"Switzerland","businessUnit":"Health","finalCost":"950","currencyCode":"","ttfrMinutes":5808,"clientRespMinutes":2258,"firstReplyAt":"2024-09-06 14:29:47","firstAssignedDate":"2024-09-06 14:29:47","fulfillmentDate":"2024-09-02 13:42:19","openedBy":"Mia Leimkuhler","openedDate":"2024-09-02","closedDate":"2024-10-05","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Mia Leimkuhler","openedAt":"2024-09-02 13:42:15","stateChangedAt":"2024-10-05 12:20:58","stateChangedBy":"System","lastActivityAt":"2024-09-30 09:13:11","lastActivityBy":"Mia Leimkuhler","_updated":"2025-01-30T13:31:39.000Z"},"RITM2203134":{"state":"Closed Complete","shortDesc":"Change of CR contact details","assignedTo":"Alesya Prolagayeva","brand":"Lovela","market":"Slovakia","businessUnit":"Hygiene","finalCost":"150","currencyCode":"","ttfrMinutes":11612,"clientRespMinutes":684,"firstReplyAt":"2024-09-10 17:04:03","firstAssignedDate":"2024-09-10 17:09:11","fulfillmentDate":"2024-09-02 15:32:25","openedBy":"Katerina Hadzalova","openedDate":"2024-09-02","closedDate":"2024-09-18","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-09-18T11:21:11.000Z"},"RITM2203139":{"state":"Closed Complete","shortDesc":"Change CR contact details on websites","assignedTo":"Alesya Prolagayeva","brand":"Lovela","market":"Czech Republic","businessUnit":"Hygiene","finalCost":"150","currencyCode":"","ttfrMinutes":11612,"clientRespMinutes":1381,"firstReplyAt":"2024-09-10 17:07:15","firstAssignedDate":"2024-09-10 17:08:59","fulfillmentDate":"2024-09-02 15:35:30","openedBy":"Katerina Hadzalova","openedDate":"2024-09-02","closedDate":"2024-09-18","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-09-18T11:20:54.000Z"},"RITM2204154":{"state":"Closed Complete","shortDesc":"FINISH 1P DATA on WEBSITE","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"France","businessUnit":"Hygiene","finalCost":"150","currencyCode":"","ttfrMinutes":10310,"clientRespMinutes":1525,"firstReplyAt":"2024-09-10 17:37:04","firstAssignedDate":"2024-09-10 17:12:34","fulfillmentDate":"2024-09-03 13:47:01","openedBy":"Matteo Baron","openedDate":"2024-09-03","closedDate":"2024-09-21","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-09-21T14:20:59.000Z"},"RITM2204269":{"state":"Closed Complete","shortDesc":"Game/contest page creation","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"France","businessUnit":"Hygiene","finalCost":"150","currencyCode":"","ttfrMinutes":10257,"clientRespMinutes":3115,"firstReplyAt":"2024-09-10 17:54:51","firstAssignedDate":"2024-09-12 11:33:27","fulfillmentDate":"2024-09-03 14:57:39","openedBy":"Matteo Baron","openedDate":"2024-09-03","closedDate":"2024-10-15","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-10-15T12:20:58.000Z"},"RITM2205023":{"state":"Closed Complete","shortDesc":"Telephone Number Update","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Switzerland","businessUnit":"Health","finalCost":"150","currencyCode":"","ttfrMinutes":9197,"clientRespMinutes":735,"firstReplyAt":"2024-09-10 18:07:56","firstAssignedDate":"2024-09-10 18:07:56","fulfillmentDate":"2024-09-04 08:51:40","openedBy":"Nadija Sejaric","openedDate":"2024-09-04","closedDate":"2024-10-27","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-10-27T11:21:05.000Z"},"RITM2205223":{"state":"Closed Complete","shortDesc":"Telephone Number Update","assignedTo":"Alesya Prolagayeva","brand":"Dobendan","market":"Germany","businessUnit":"Health","finalCost":"150","currencyCode":"","ttfrMinutes":9077,"clientRespMinutes":604,"firstReplyAt":"2024-09-10 18:09:58","firstAssignedDate":"2024-09-10 18:12:28","fulfillmentDate":"2024-09-04 10:53:13","openedBy":"Nadija Sejaric","openedDate":"2024-09-04","closedDate":"2024-10-15","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Nadija Sejaric","openedAt":"2024-09-04 10:53:09","stateChangedAt":"2024-10-15 13:21:06","stateChangedBy":"System","lastActivityAt":"2024-10-10 13:15:20","lastActivityBy":"Alesya Prolagayeva","_updated":"2024-10-15T08:21:06.000Z"},"RITM2205462":{"state":"Closed Complete","shortDesc":"Telephone Number Update AT","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Austria","businessUnit":"Health","finalCost":"150","currencyCode":"","ttfrMinutes":8926,"clientRespMinutes":476,"firstReplyAt":"2024-09-10 18:12:09","firstAssignedDate":"2024-09-10 18:12:18","fulfillmentDate":"2024-09-04 13:26:25","openedBy":"Nadija Sejaric","openedDate":"2024-09-04","closedDate":"2024-10-27","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-10-27T11:21:16.000Z"},"RITM2207860":{"state":"Closed Complete","shortDesc":"Gaviscon UX - Italy (Master for these changes)","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Italy","businessUnit":"Health","finalCost":"10500","currencyCode":"","ttfrMinutes":18098,"clientRespMinutes":9936,"firstReplyAt":"2024-09-19 00:13:07","firstAssignedDate":"2024-09-06 16:34:14","fulfillmentDate":"2024-09-06 10:34:59","openedBy":"Rowena Hearn","openedDate":"2024-09-06","closedDate":"2025-10-29","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-4","year":"2024","requestedFor":"","openedAt":"2024-09-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-29T10:20:55.000Z"},"RITM2208125":{"state":"Closed Complete","shortDesc":"mistake on our website","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"France","businessUnit":"Hygiene","finalCost":"1320","currencyCode":"","ttfrMinutes":6131,"clientRespMinutes":3887,"firstReplyAt":"2024-09-10 20:26:58","firstAssignedDate":"2024-09-10 20:27:03","fulfillmentDate":"2024-09-06 14:16:31","openedBy":"Matteo Baron","openedDate":"2024-09-06","closedDate":"2024-11-11","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-11-13T08:28:48.000Z"},"RITM2208891":{"state":"Closed Complete","shortDesc":"Update Dettol AT website","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"Austria","businessUnit":"Health","finalCost":"550","currencyCode":"","ttfrMinutes":2102,"clientRespMinutes":1588,"firstReplyAt":"2024-09-10 20:42:50","firstAssignedDate":"2024-09-10 20:42:50","fulfillmentDate":"2024-09-09 09:41:00","openedBy":"Mia Leimkuhler","openedDate":"2024-09-09","closedDate":"2024-10-05","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Mia Leimkuhler","openedAt":"2024-09-09 09:40:55","stateChangedAt":"2024-10-05 13:21:21","stateChangedBy":"System","lastActivityAt":"2024-09-30 09:16:59","lastActivityBy":"Mia Leimkuhler","_updated":"2025-01-30T13:35:49.000Z"},"RITM2208967":{"state":"Closed Complete","shortDesc":"Need to publish on Acquanellenostremani.it a landing page","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"1800","currencyCode":"","ttfrMinutes":16005,"clientRespMinutes":2729,"firstReplyAt":"2024-09-20 13:12:22","firstAssignedDate":"2024-09-10 20:47:21","fulfillmentDate":"2024-09-09 10:27:53","openedBy":"Mirtilla Reale","openedDate":"2024-09-09","closedDate":"2024-09-30","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-19T10:26:24.000Z"},"RITM2209369":{"state":"Closed Complete","shortDesc":"Pop up change","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Poland","businessUnit":"Hygiene","finalCost":"150","currencyCode":"","ttfrMinutes":1829,"clientRespMinutes":1553,"firstReplyAt":"2024-09-10 21:04:57","firstAssignedDate":"2024-09-10 21:05:07","fulfillmentDate":"2024-09-09 14:36:13","openedBy":"Malgorzata Szatkowska (Inactive)","openedDate":"2024-09-09","closedDate":"2024-09-16","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-10-15T12:29:22.000Z"},"RITM2209551":{"state":"Closed Complete","shortDesc":"Pubblication T&C documents and legal extract on Finishinfo.com","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"480","currencyCode":"","ttfrMinutes":1719,"clientRespMinutes":3877,"firstReplyAt":"2024-09-10 21:11:14","firstAssignedDate":"2024-09-10 21:12:07","fulfillmentDate":"2024-09-09 16:32:42","openedBy":"Alice Esposito (Inactive)","openedDate":"2024-09-09","closedDate":"2024-10-06","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:03:58.000Z"},"RITM2210228":{"state":"Closed Complete","shortDesc":"Redirect link Finish info","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"180","currencyCode":"","ttfrMinutes":1533,"clientRespMinutes":2052,"firstReplyAt":"2024-09-11 11:10:33","firstAssignedDate":"2024-09-10 21:15:27","fulfillmentDate":"2024-09-10 09:37:18","openedBy":"Sofia Pallaro","openedDate":"2024-09-10","closedDate":"2024-10-20","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:05:01.000Z"},"RITM2210774":{"state":"Closed Complete","shortDesc":"Update new contest material in microsites","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Greece","businessUnit":"Hygiene","finalCost":"4000","currencyCode":"","ttfrMinutes":1353,"clientRespMinutes":1523,"firstReplyAt":"2024-09-11 14:11:28","firstAssignedDate":"2024-09-10 21:17:25","fulfillmentDate":"2024-09-10 15:38:51","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2024-09-10","closedDate":"2024-11-26","toDoAt":"2024-09-24T14:36:14.383+0200","inUatAt":null,"jiraKey":"WFN-1","year":"2024","requestedFor":"","openedAt":"2024-09-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-11-26T13:21:09.000Z"},"RITM2211032":{"state":"Closed Complete","shortDesc":"Lysol MX Wipes Fragrances Article","assignedTo":"Alesya Prolagayeva","brand":"Lysol","market":"Mexico","businessUnit":"Hygiene","finalCost":"8000","currencyCode":"","ttfrMinutes":1042,"clientRespMinutes":3900,"firstReplyAt":"2024-09-11 12:57:20","firstAssignedDate":"2024-09-10 21:18:47","fulfillmentDate":"2024-09-10 19:35:17","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2024-09-10","closedDate":"2024-10-08","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2024-09-10 19:35:12","stateChangedAt":"2024-10-08 19:10:10","stateChangedBy":"System","lastActivityAt":"2025-09-09 20:47:37","lastActivityBy":"Damian Casasnovas","_updated":"2025-09-09T15:47:37.000Z"},"RITM2213044":{"state":"Closed Cancelled","shortDesc":"FAQ Website Intima","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Intima","market":"France","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":190,"clientRespMinutes":1274,"firstReplyAt":"2024-09-12 13:04:34","firstAssignedDate":"2024-09-13 16:48:12","fulfillmentDate":"2024-09-12 09:55:05","openedBy":"Elisa Tan","openedDate":"2024-09-12","closedDate":"2025-01-09","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-6","year":"2024","requestedFor":"Elisa Tan","openedAt":"2024-09-12 09:55:01","stateChangedAt":"2025-01-09 12:51:56","stateChangedBy":"System","lastActivityAt":"2024-11-20 11:40:21","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2025-01-09T09:51:56.000Z"},"RITM2213216":{"state":"Closed Complete","shortDesc":"Website changes for \"il nostro impegno\" section","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Italy","businessUnit":"Health","finalCost":"2520","currencyCode":"","ttfrMinutes":109,"clientRespMinutes":1881,"firstReplyAt":"2024-09-12 13:07:20","firstAssignedDate":"2024-09-13 16:49:29","fulfillmentDate":"2024-09-12 11:18:16","openedBy":"Jacopo Ghislanzoni (Inactive)","openedDate":"2024-09-12","closedDate":"2024-11-26","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:07:41.000Z"},"RITM2213392":{"state":"Closed Complete","shortDesc":"Finish TR categories structure update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Turkey","businessUnit":"Hygiene","finalCost":"950","currencyCode":"","ttfrMinutes":5741,"clientRespMinutes":3426,"firstReplyAt":"2024-09-16 13:06:35","firstAssignedDate":"2024-09-13 16:53:16","fulfillmentDate":"2024-09-12 13:25:39","openedBy":"Olga Tadrzak","openedDate":"2024-09-12","closedDate":"2025-10-21","toDoAt":"2026-08-14T15:28:26.450+0200","inUatAt":null,"jiraKey":"WFN-7","year":"2024","requestedFor":"","openedAt":"2024-09-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-21T05:20:55.000Z"},"RITM2213731":{"state":"Closed Complete","shortDesc":"Vanish Website Update","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Vanish","market":"Brazil","businessUnit":"Hygiene","finalCost":"33334","currencyCode":"","ttfrMinutes":6620,"clientRespMinutes":38490,"firstReplyAt":"2024-09-17 09:05:55","firstAssignedDate":"2024-09-13 16:57:22","fulfillmentDate":"2024-09-12 18:45:44","openedBy":"Ricardo Leonardo","openedDate":"2024-09-12","closedDate":"2024-12-30","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-8","year":"2024","requestedFor":"Ricardo Leonardo","openedAt":"2024-09-12 18:45:40","stateChangedAt":"2024-12-30 10:21:06","stateChangedBy":"System","lastActivityAt":"2025-10-31 19:29:39","lastActivityBy":"Damian Casasnovas","_updated":"2025-10-31T16:29:39.000Z"},"RITM2214864":{"state":"Closed Complete","shortDesc":"Cookie missing AirWick NL website","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Air Wick","market":"Netherlands","businessUnit":"Hygiene","finalCost":"400","currencyCode":"","ttfrMinutes":4155,"clientRespMinutes":10433,"firstReplyAt":"2024-09-16 12:45:45","firstAssignedDate":"2024-09-13 16:59:51","fulfillmentDate":"2024-09-13 15:31:03","openedBy":"Monica Quatela (Inactive)","openedDate":"2024-09-13","closedDate":"2024-11-18","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-11-18T06:21:10.000Z"},"RITM2216709":{"state":"Closed Complete","shortDesc":"Modification to durex website https://www.durex.it/","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Italy","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":1509,"clientRespMinutes":1888,"firstReplyAt":"2024-09-18 10:38:17","firstAssignedDate":"2024-09-17 12:47:48","fulfillmentDate":"2024-09-17 09:29:33","openedBy":"Jacopo Ghislanzoni (Inactive)","openedDate":"2024-09-17","closedDate":"2024-09-28","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-09-28T05:21:49.000Z"},"RITM2217257":{"state":"Closed Complete","shortDesc":"we need to update several PDP on Veet Italy website (need to update images, product descriptions...)","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Veet","market":"Italy","businessUnit":"Health","finalCost":"1236","currencyCode":"","ttfrMinutes":1113,"clientRespMinutes":1792,"firstReplyAt":"2024-09-18 10:13:53","firstAssignedDate":"2024-09-18 10:13:53","fulfillmentDate":"2024-09-17 15:41:25","openedBy":"Alice Vaccaro","openedDate":"2024-09-17","closedDate":"2024-10-17","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:08:51.000Z"},"RITM2217277":{"state":"Closed Complete","shortDesc":"At the moment some H1 are not visible in few PLP","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Veet","market":"Italy","businessUnit":"Health","finalCost":"480","currencyCode":"","ttfrMinutes":1092,"clientRespMinutes":1643,"firstReplyAt":"2024-09-18 10:11:07","firstAssignedDate":"2024-09-18 10:06:49","fulfillmentDate":"2024-09-17 15:59:17","openedBy":"Alice Vaccaro","openedDate":"2024-09-17","closedDate":"2024-09-25","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:09:46.000Z"},"RITM2222060":{"state":"Closed Complete","shortDesc":"Contact update","assignedTo":"Alesya Prolagayeva","brand":"Kukident","market":"Germany","businessUnit":"Health","finalCost":"150","currencyCode":"","ttfrMinutes":67,"clientRespMinutes":908,"firstReplyAt":"2024-09-23 11:01:49","firstAssignedDate":"2024-09-23 11:01:58","fulfillmentDate":"2024-09-23 09:54:46","openedBy":"Mia Leimkuhler","openedDate":"2024-09-23","closedDate":"2024-10-01","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Mia Leimkuhler","openedAt":"2024-09-23 09:54:39","stateChangedAt":"2024-10-01 17:21:06","stateChangedBy":"System","lastActivityAt":"2024-09-26 17:04:50","lastActivityBy":"Alesya Prolagayeva","_updated":"2024-10-01T12:21:06.000Z"},"RITM2222954":{"state":"Closed Complete","shortDesc":"Harpic MX Nueva Tapa content","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Harpic","market":"Mexico","businessUnit":"Hygiene","finalCost":"3000","currencyCode":"","ttfrMinutes":476,"clientRespMinutes":162321,"firstReplyAt":"2024-09-24 09:54:09","firstAssignedDate":"2024-09-24 09:54:09","fulfillmentDate":"2024-09-24 01:58:12","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2024-09-24","closedDate":"2024-10-08","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2024-09-24 01:58:08","stateChangedAt":"2024-10-08 17:30:16","stateChangedBy":"System","lastActivityAt":"2025-09-09 20:46:48","lastActivityBy":"Damian Casasnovas","_updated":"2025-09-09T15:46:48.000Z"},"RITM2225337":{"state":"Closed Complete","shortDesc":"Update of Strepsils Ireland website","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Ireland","businessUnit":"Health","finalCost":"2100","currencyCode":"","ttfrMinutes":1074,"clientRespMinutes":3475,"firstReplyAt":"2024-09-26 11:28:24","firstAssignedDate":"2024-09-25 17:52:06","fulfillmentDate":"2024-09-25 17:34:24","openedBy":"Josh Pillay","openedDate":"2024-09-25","closedDate":"2025-10-26","toDoAt":"2024-12-16T09:25:45.870+0100","inUatAt":"2024-11-28T09:24:40.620+0100","jiraKey":"WFN-11","year":"2024","requestedFor":"","openedAt":"2024-09-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-26T13:20:54.000Z"},"RITM2226188":{"state":"Closed Complete","shortDesc":"Lemsip Website","assignedTo":"Alesya Prolagayeva","brand":"Lemsip","market":"Ireland","businessUnit":"Health","finalCost":"400","currencyCode":"","ttfrMinutes":245,"clientRespMinutes":1346,"firstReplyAt":"2024-09-26 16:38:01","firstAssignedDate":"2024-09-26 16:22:40","fulfillmentDate":"2024-09-26 12:32:38","openedBy":"Josh Pillay","openedDate":"2024-09-26","closedDate":"2024-09-30","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-09-30T12:10:10.000Z"},"RITM2226241":{"state":"Closed Complete","shortDesc":"Veeva Code Update","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Ireland","businessUnit":"Health","finalCost":"400","currencyCode":"","ttfrMinutes":167,"clientRespMinutes":134,"firstReplyAt":"2024-09-26 15:50:12","firstAssignedDate":"2024-09-26 15:42:35","fulfillmentDate":"2024-09-26 13:03:02","openedBy":"Clarice Buonsante (Inactive)","openedDate":"2024-09-26","closedDate":"2024-10-27","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-10-27T11:21:17.000Z"},"RITM2227176":{"state":"Closed Complete","shortDesc":"Changes on PL Cillit Bang website (after Expert relaunch)","assignedTo":"Alesya Prolagayeva","brand":"Cillit","market":"Poland","businessUnit":"Hygiene","finalCost":"1800","currencyCode":"","ttfrMinutes":4696,"clientRespMinutes":3700,"firstReplyAt":"2024-09-30 15:51:45","firstAssignedDate":"2024-09-27 10:09:25","fulfillmentDate":"2024-09-27 09:35:50","openedBy":"Klaudia Domagalska (Inactive)","openedDate":"2024-09-27","closedDate":"2025-07-01","toDoAt":"2025-01-09T16:22:09.663+0100","inUatAt":"2025-01-27T13:19:03.280+0100","jiraKey":"WFN-12","year":"2024","requestedFor":"","openedAt":"2024-09-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-01T10:20:53.000Z"},"RITM2227633":{"state":"Closed Complete","shortDesc":"Update Clearasil DE-website","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Clearasil","market":"Germany","businessUnit":"Health","finalCost":"480","currencyCode":"","ttfrMinutes":3957,"clientRespMinutes":1084,"firstReplyAt":"2024-09-30 09:53:25","firstAssignedDate":"2024-09-27 16:28:05","fulfillmentDate":"2024-09-27 15:56:00","openedBy":"Florian Mecking","openedDate":"2024-09-27","closedDate":"2024-10-20","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Florian Mecking","openedAt":"2024-09-27 15:55:57","stateChangedAt":"2024-10-20 12:20:57","stateChangedBy":"System","lastActivityAt":"2024-10-15 12:17:52","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2024-10-20T07:20:57.000Z"},"RITM2228832":{"state":"Closed Complete","shortDesc":"Publish 5 articles on the website","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Vanish","market":"France","businessUnit":"Hygiene","finalCost":"480","currencyCode":"","ttfrMinutes":1332,"clientRespMinutes":47,"firstReplyAt":"2024-10-01 10:44:03","firstAssignedDate":"2024-09-30 15:26:00","fulfillmentDate":"2024-09-30 12:31:58","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2024-09-30","closedDate":"2024-11-09","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-03T09:17:38.000Z"},"RITM2228869":{"state":"Closed Complete","shortDesc":"Publish 5 articles on the website (part 2)","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Vanish","market":"France","businessUnit":"Hygiene","finalCost":"480","currencyCode":"","ttfrMinutes":1310,"clientRespMinutes":7891,"firstReplyAt":"2024-10-01 10:43:41","firstAssignedDate":"2024-09-30 15:24:40","fulfillmentDate":"2024-09-30 12:53:22","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2024-09-30","closedDate":"2024-11-04","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-09-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-03T09:18:32.000Z"},"RITM2229999":{"state":"Closed Complete","shortDesc":"Change request for FI Strepsils Website","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Finland","businessUnit":"Health","finalCost":"1320","currencyCode":"","ttfrMinutes":11359,"clientRespMinutes":36417,"firstReplyAt":"2024-10-09 08:26:17","firstAssignedDate":"2024-10-01 14:33:40","fulfillmentDate":"2024-10-01 11:07:48","openedBy":"Federico Mirandola (Inactive)","openedDate":"2024-10-01","closedDate":"2025-04-12","toDoAt":"2025-02-11T08:26:50.493+0100","inUatAt":"2024-11-28T09:25:41.133+0100","jiraKey":"WFN-13","year":"2024","requestedFor":"","openedAt":"2024-10-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-12T08:20:51.000Z"},"RITM2230038":{"state":"Closed Complete","shortDesc":"Resolve CA: Update meta titles & meta descriptions","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Resolve","market":"Canada","businessUnit":"Hygiene","finalCost":"800","currencyCode":"","ttfrMinutes":1520,"clientRespMinutes":878,"firstReplyAt":"2024-10-02 12:50:46","firstAssignedDate":"2024-10-02 12:50:46","fulfillmentDate":"2024-10-01 11:31:16","openedBy":"Nadine Evans","openedDate":"2024-10-01","closedDate":"2024-11-24","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Nadine Evans","openedAt":"2024-10-01 11:31:13","stateChangedAt":"2024-11-24 14:21:12","stateChangedBy":"System","lastActivityAt":"2024-11-13 14:13:22","lastActivityBy":"Anna Tyborska (Inactive)","_updated":"2024-11-24T11:21:12.000Z"},"RITM2230046":{"state":"Closed Complete","shortDesc":"Resolve CA: Add internal links","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Resolve","market":"Canada","businessUnit":"Hygiene","finalCost":"150","currencyCode":"","ttfrMinutes":1513,"clientRespMinutes":880,"firstReplyAt":"2024-10-02 12:46:42","firstAssignedDate":"2024-10-02 12:46:42","fulfillmentDate":"2024-10-01 11:33:40","openedBy":"Nadine Evans","openedDate":"2024-10-01","closedDate":"2024-10-26","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Nadine Evans","openedAt":"2024-10-01 11:33:37","stateChangedAt":"2024-10-26 09:21:03","stateChangedBy":"System","lastActivityAt":"2024-10-21 07:20:35","lastActivityBy":"Anna Tyborska (Inactive)","_updated":"2024-10-26T04:21:03.000Z"},"RITM2230555":{"state":"Closed Complete","shortDesc":"Changes to be implemented on igieneinsieme.it","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Napisan","market":"Italy","businessUnit":"Hygiene","finalCost":"480","currencyCode":"","ttfrMinutes":1052,"clientRespMinutes":3089,"firstReplyAt":"2024-10-02 10:26:05","firstAssignedDate":"2024-10-02 10:26:05","fulfillmentDate":"2024-10-01 16:53:55","openedBy":"Roberta Migliardi","openedDate":"2024-10-01","closedDate":"2024-11-03","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:02:18.000Z"},"RITM2231449":{"state":"Closed Complete","shortDesc":"Contact update","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Veet","market":"Austria","businessUnit":"Health","finalCost":"0","currencyCode":"","ttfrMinutes":22,"clientRespMinutes":null,"firstReplyAt":"2024-10-02 14:45:56","firstAssignedDate":"2024-10-02 14:45:56","fulfillmentDate":"2024-10-02 14:23:38","openedBy":"Mia Leimkuhler","openedDate":"2024-10-02","closedDate":"2024-10-12","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-01-30T11:36:09.000Z"},"RITM2231558":{"state":"Closed Complete","shortDesc":"Dettol AT Website Update Ella","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Dettol","market":"Austria","businessUnit":"Health","finalCost":"3120","currencyCode":"","ttfrMinutes":1151,"clientRespMinutes":4868,"firstReplyAt":"2024-10-03 10:28:17","firstAssignedDate":"2024-10-03 10:28:17","fulfillmentDate":"2024-10-02 15:17:26","openedBy":"Mia Leimkuhler","openedDate":"2024-10-02","closedDate":"2025-04-01","toDoAt":"2025-01-20T09:27:03.013+0100","inUatAt":"2025-02-28T07:40:44.637+0100","jiraKey":"WFN-15","year":"2024","requestedFor":"Mia Leimkuhler","openedAt":"2024-10-02 15:17:23","stateChangedAt":"2025-04-01 10:21:07","stateChangedBy":"System","lastActivityAt":"2025-03-27 08:53:39","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2025-04-01T05:21:06.000Z"},"RITM2231849":{"state":"Closed Complete","shortDesc":"Change redirect link","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"SBP","market":"Brazil","businessUnit":"Hygiene","finalCost":"2667","currencyCode":"","ttfrMinutes":818,"clientRespMinutes":79411,"firstReplyAt":"2024-10-03 09:30:36","firstAssignedDate":"2024-10-03 09:30:36","fulfillmentDate":"2024-10-02 19:52:46","openedBy":"Ricardo Leonardo","openedDate":"2024-10-02","closedDate":"2024-10-23","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Ricardo Leonardo","openedAt":"2024-10-02 19:52:43","stateChangedAt":"2024-10-23 17:21:15","stateChangedBy":"System","lastActivityAt":"2025-10-31 19:37:16","lastActivityBy":"Damian Casasnovas","_updated":"2025-10-31T16:37:16.000Z"},"RITM2231918":{"state":"Closed Complete","shortDesc":"FAQ content publishing","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"France","businessUnit":"Hygiene","finalCost":"1200","currencyCode":"","ttfrMinutes":645,"clientRespMinutes":3587,"firstReplyAt":"2024-10-03 09:28:24","firstAssignedDate":"2024-10-03 09:28:24","fulfillmentDate":"2024-10-02 22:43:06","openedBy":"Olga Tadrzak","openedDate":"2024-10-02","closedDate":"2024-12-18","toDoAt":"2024-11-27T17:07:51.857+0100","inUatAt":"2024-11-29T09:01:08.003+0100","jiraKey":"WFN-16","year":"2024","requestedFor":"","openedAt":"2024-10-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-18T11:21:07.000Z"},"RITM2232933":{"state":"Closed Complete","shortDesc":"'a tag read consent state before a default was set' issue","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Gaviscon","market":"Italy","businessUnit":"Health","finalCost":"144","currencyCode":"","ttfrMinutes":5282,"clientRespMinutes":5140,"firstReplyAt":"2024-10-07 09:52:00","firstAssignedDate":"2024-10-07 09:52:00","fulfillmentDate":"2024-10-03 17:50:30","openedBy":"Nicole Visentini","openedDate":"2024-10-03","closedDate":"2024-11-24","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:08:01.000Z"},"RITM2233625":{"state":"Closed Complete","shortDesc":"Please update consumer relations details on the website","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"reckitt.com","market":"Kenya","businessUnit":"Corporate","finalCost":"","currencyCode":"","ttfrMinutes":4535,"clientRespMinutes":1408,"firstReplyAt":"2024-10-07 12:57:34","firstAssignedDate":"2024-10-07 09:57:34","fulfillmentDate":"2024-10-04 09:22:43","openedBy":"Siya Mdletye (Inactive)","openedDate":"2024-10-04","closedDate":"2024-10-23","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Siya Mdletye (Inactive)","openedAt":"2024-10-04 09:22:40","stateChangedAt":"2024-10-23 09:40:17","stateChangedBy":"System","lastActivityAt":"2024-10-23 09:40:17","lastActivityBy":"System","_updated":"2024-10-23T04:40:17.000Z"},"RITM2233832":{"state":"Closed Cancelled","shortDesc":"Change domain and website update","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Strepfen","market":"Portugal","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":18670,"clientRespMinutes":691,"firstReplyAt":"2024-10-17 10:46:57","firstAssignedDate":"2024-10-17 10:46:57","fulfillmentDate":"2024-10-04 11:37:09","openedBy":"Jorge Pino (Inactive)","openedDate":"2024-10-04","closedDate":"2024-12-16","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-17","year":"2024","requestedFor":"Jorge Pino (Inactive)","openedAt":"2024-10-04 11:37:06","stateChangedAt":"2024-12-16 09:09:18","stateChangedBy":"System","lastActivityAt":"2024-12-16 09:07:11","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2024-12-16T06:09:18.000Z"},"RITM2234852":{"state":"Closed Complete","shortDesc":"Calgon Hygiene+ website section","assignedTo":"Alesya Prolagayeva","brand":"Calgon","market":"Italy","businessUnit":"Hygiene","finalCost":"144","currencyCode":"","ttfrMinutes":1411,"clientRespMinutes":1816,"firstReplyAt":"2024-10-08 10:10:29","firstAssignedDate":"2024-10-08 18:25:51","fulfillmentDate":"2024-10-07 10:39:10","openedBy":"Sofia Ferracci (Inactive)","openedDate":"2024-10-07","closedDate":"2024-11-05","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:05:34.000Z"},"RITM2237838":{"state":"Closed Complete","shortDesc":"I need to implement some modifications to website www.durex.it","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Italy","businessUnit":"Health","finalCost":"144","currencyCode":"","ttfrMinutes":1180,"clientRespMinutes":10181,"firstReplyAt":"2024-10-10 09:57:27","firstAssignedDate":"2024-10-10 09:57:27","fulfillmentDate":"2024-10-09 14:17:58","openedBy":"Jacopo Ghislanzoni (Inactive)","openedDate":"2024-10-09","closedDate":"2024-10-21","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:09:10.000Z"},"RITM2237936":{"state":"Closed Complete","shortDesc":"Website changes for Gavisconell FR","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"France","businessUnit":"Health","finalCost":"2160","currencyCode":"","ttfrMinutes":1420,"clientRespMinutes":3255,"firstReplyAt":"2024-10-10 15:25:58","firstAssignedDate":"2024-10-10 10:08:58","fulfillmentDate":"2024-10-09 15:45:45","openedBy":"Lucie Redois","openedDate":"2024-10-09","closedDate":"2025-02-18","toDoAt":"2025-01-24T11:39:22.663+0100","inUatAt":"2024-11-28T09:28:38.727+0100","jiraKey":"WFN-19","year":"2024","requestedFor":"","openedAt":"2024-10-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-18T06:40:06.000Z"},"RITM2238690":{"state":"Closed Complete","shortDesc":"Need to create the business ids of several documents to proceed with the salesforce request","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Italy","businessUnit":"Health","finalCost":"720","currencyCode":"","ttfrMinutes":380,"clientRespMinutes":2264,"firstReplyAt":"2024-10-10 17:16:00","firstAssignedDate":"2024-10-10 17:16:51","fulfillmentDate":"2024-10-10 10:55:55","openedBy":"Alice Vaccaro","openedDate":"2024-10-10","closedDate":"2024-10-20","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:07:03.000Z"},"RITM2238738":{"state":"Closed Complete","shortDesc":"Vanish BR: Content creation for 9 new pages","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Vanish","market":"Brazil","businessUnit":"Hygiene","finalCost":"29334","currencyCode":"","ttfrMinutes":1362,"clientRespMinutes":6866,"firstReplyAt":"2024-10-11 10:14:25","firstAssignedDate":"2024-10-11 10:14:25","fulfillmentDate":"2024-10-10 11:32:50","openedBy":"Nathalie Nasrallah","openedDate":"2024-10-10","closedDate":"2025-01-14","toDoAt":"2024-12-23T11:40:10.957+0100","inUatAt":"2024-11-28T09:29:36.727+0100","jiraKey":"WFN-20","year":"2024","requestedFor":"Nathalie Nasrallah","openedAt":"2024-10-10 11:32:47","stateChangedAt":"2025-01-14 11:21:07","stateChangedBy":"System","lastActivityAt":"2025-10-31 19:28:43","lastActivityBy":"Damian Casasnovas","_updated":"2025-10-31T16:28:43.000Z"},"RITM2238866":{"state":"Closed Complete","shortDesc":"mistake on our website","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"France","businessUnit":"Hygiene","finalCost":"120","currencyCode":"","ttfrMinutes":207,"clientRespMinutes":1810,"firstReplyAt":"2024-10-10 16:13:33","firstAssignedDate":"2024-10-10 15:33:47","fulfillmentDate":"2024-10-10 12:46:20","openedBy":"Matteo Baron","openedDate":"2024-10-10","closedDate":"2024-10-26","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-10-26T06:21:11.000Z"},"RITM2239027":{"state":"Closed Complete","shortDesc":"Add a new page on the Nurofen NL website","assignedTo":"Alesya Prolagayeva","brand":"Nurofen for Children","market":"Netherlands","businessUnit":"Health","finalCost":"360","currencyCode":"","ttfrMinutes":1159,"clientRespMinutes":2861,"firstReplyAt":"2024-10-11 10:21:26","firstAssignedDate":"2024-10-11 10:19:11","fulfillmentDate":"2024-10-10 15:02:47","openedBy":"Sakshi Thoke (Inactive)","openedDate":"2024-10-10","closedDate":"2024-11-05","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-18T12:42:30.000Z"},"RITM2240421":{"state":"Closed Cancelled","shortDesc":"New Look Website Cillit Bang CH","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Cillit","market":"Switzerland","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":3966,"clientRespMinutes":3451,"firstReplyAt":"2024-10-14 09:48:30","firstAssignedDate":"2024-10-14 09:48:30","fulfillmentDate":"2024-10-11 15:42:30","openedBy":"Lisa Graf","openedDate":"2024-10-11","closedDate":"2024-11-28","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-21","year":"2024","requestedFor":"Lisa Graf","openedAt":"2024-10-11 15:42:27","stateChangedAt":"2024-11-28 08:51:55","stateChangedBy":"System","lastActivityAt":"2024-11-22 11:09:10","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2024-11-28T05:51:55.000Z"},"RITM2241631":{"state":"Closed Complete","shortDesc":"update Napisan.it with one-page website to publish contest","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Napisan","market":"Italy","businessUnit":"Hygiene","finalCost":"360","currencyCode":"","ttfrMinutes":1398,"clientRespMinutes":4424,"firstReplyAt":"2024-10-15 09:58:53","firstAssignedDate":"2024-10-15 09:58:53","fulfillmentDate":"2024-10-14 10:41:22","openedBy":"Gaia Macchi (Inactive)","openedDate":"2024-10-14","closedDate":"2024-11-09","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:02:55.000Z"},"RITM2241875":{"state":"Closed Complete","shortDesc":"Add SPCs on Nurofen Website","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Nurofen","market":"Greece","businessUnit":"Health","finalCost":"600","currencyCode":"","ttfrMinutes":1237,"clientRespMinutes":5957,"firstReplyAt":"2024-10-15 09:53:29","firstAssignedDate":"2024-10-15 09:53:29","fulfillmentDate":"2024-10-14 13:16:28","openedBy":"Xanthi Skorda","openedDate":"2024-10-14","closedDate":"2024-11-24","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-11-24T11:21:02.000Z"},"RITM2241884":{"state":"Closed Complete","shortDesc":"Nurofen Website Issues","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Nurofen","market":"Greece","businessUnit":"Health","finalCost":"600","currencyCode":"","ttfrMinutes":12696,"clientRespMinutes":10580,"firstReplyAt":"2024-10-23 08:58:45","firstAssignedDate":"2024-10-22 15:06:00","fulfillmentDate":"2024-10-14 13:23:06","openedBy":"Xanthi Skorda","openedDate":"2024-10-14","closedDate":"2025-03-01","toDoAt":"2024-12-18T09:36:13.060+0100","inUatAt":"2025-01-02T11:35:30.457+0100","jiraKey":"WFN-22","year":"2024","requestedFor":"","openedAt":"2024-10-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-01T06:20:55.000Z"},"RITM2242541":{"state":"Closed Complete","shortDesc":"TEMPRA | Rappi Deeplinks","assignedTo":"Renata Probst Martínez","brand":"Tempra","market":"Mexico","businessUnit":"Health","finalCost":"N/A","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":"","firstAssignedDate":"2024-10-15 05:23:10","fulfillmentDate":"2024-10-15 05:18:13","openedBy":null,"openedDate":null,"closedDate":null,"toDoAt":null,"inUatAt":null,"jiraKey":null,"year":null,"requestedFor":"Renata Probst Martínez","openedAt":"2024-10-15 05:18:09","stateChangedAt":"2024-10-31 19:20:12","stateChangedBy":"System","lastActivityAt":"2024-10-31 19:20:12","lastActivityBy":"System","_updated":"2024-10-31T16:20:12.000Z"},"RITM2243475":{"state":"Closed Complete","shortDesc":"Contact update","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Austria","businessUnit":"Health","finalCost":"3900","currencyCode":"","ttfrMinutes":1094,"clientRespMinutes":7501,"firstReplyAt":"2024-10-16 10:34:00","firstAssignedDate":"2024-10-16 10:34:00","fulfillmentDate":"2024-10-15 16:19:55","openedBy":"Mia Leimkuhler","openedDate":"2024-10-15","closedDate":"2025-05-05","toDoAt":"2025-01-02T11:37:57.970+0100","inUatAt":"2025-03-04T09:54:56.537+0100","jiraKey":"WFN-23","year":"2024","requestedFor":"","openedAt":"2024-10-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-05T09:20:52.000Z"},"RITM2243482":{"state":"Closed Complete","shortDesc":"issue with addEventListener","assignedTo":"Krzysztof Nowakowski (Inactive)","brand":"Durex","market":"Italy","businessUnit":"Health","finalCost":"360","currencyCode":"","ttfrMinutes":1094,"clientRespMinutes":4542,"firstReplyAt":"2024-10-16 10:40:24","firstAssignedDate":"2024-10-16 10:40:24","fulfillmentDate":"2024-10-15 16:26:53","openedBy":null,"openedDate":null,"closedDate":null,"toDoAt":null,"inUatAt":null,"jiraKey":null,"year":null,"requestedFor":"Nicole Visentini","openedAt":"2024-10-15 16:26:50","stateChangedAt":"2025-02-01 15:20:54","stateChangedBy":"System","lastActivityAt":"2025-01-27 15:10:49","lastActivityBy":"Krzysztof Nowakowski (Inactive)","_updated":"2025-02-01T12:20:54.000Z"},"RITM2243662":{"state":"Closed Complete","shortDesc":"Lysol MX C&F content creation","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Lysol","market":"Mexico","businessUnit":"Hygiene","finalCost":"8400","currencyCode":"","ttfrMinutes":863,"clientRespMinutes":54016,"firstReplyAt":"2024-10-16 10:44:43","firstAssignedDate":"2024-10-16 10:44:43","fulfillmentDate":"2024-10-15 20:21:56","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2024-10-15","closedDate":"2025-01-10","toDoAt":"2024-12-23T11:34:51.727+0100","inUatAt":"2024-12-18T11:52:49.040+0100","jiraKey":"WFN-25","year":"2024","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2024-10-15 20:21:53","stateChangedAt":"2025-01-10 16:10:03","stateChangedBy":"System","lastActivityAt":"2025-09-09 20:50:20","lastActivityBy":"Damian Casasnovas","_updated":"2025-09-09T15:50:21.000Z"},"RITM2244791":{"state":"Closed Cancelled","shortDesc":"Packshot update needed due to change of artwork","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Slovenia","businessUnit":"Health","finalCost":"900","currencyCode":"","ttfrMinutes":911,"clientRespMinutes":5920,"firstReplyAt":"2024-10-17 10:02:24","firstAssignedDate":"2024-10-17 10:02:24","fulfillmentDate":"2024-10-16 18:51:49","openedBy":"Pamela Czifra","openedDate":"2024-10-16","closedDate":"2025-07-14","toDoAt":"2025-01-28T09:49:01.237+0100","inUatAt":"2025-02-07T17:31:02.000+0100","jiraKey":"WFN-26","year":"2024","requestedFor":"Pamela Czifra","openedAt":"2024-10-16 18:51:47","stateChangedAt":"2025-07-14 16:02:54","stateChangedBy":"Alesya Prolagayeva","lastActivityAt":"2025-07-18 11:23:20","lastActivityBy":"Pamela Czifra","_updated":"2025-07-18T06:23:20.000Z"},"RITM2245027":{"state":"Closed Complete","shortDesc":"Finish MX PIP articles","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Mexico","businessUnit":"Hygiene","finalCost":"6000","currencyCode":"","ttfrMinutes":463,"clientRespMinutes":75201,"firstReplyAt":"2024-10-17 09:54:16","firstAssignedDate":"2024-10-17 09:54:16","fulfillmentDate":"2024-10-17 02:10:58","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2024-10-17","closedDate":"2024-12-03","toDoAt":null,"inUatAt":"2024-11-28T14:07:53.507+0100","jiraKey":"WFN-27","year":"2024","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2024-10-17 02:10:55","stateChangedAt":"2024-12-03 16:20:08","stateChangedBy":"System","lastActivityAt":"2025-09-09 20:45:38","lastActivityBy":"Damian Casasnovas","_updated":"2025-09-09T15:45:38.000Z"},"RITM2245032":{"state":"Closed Complete","shortDesc":"Harpic MX article creation New Cap Think","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Harpic","market":"Mexico","businessUnit":"Hygiene","finalCost":"26000","currencyCode":"","ttfrMinutes":442,"clientRespMinutes":89626,"firstReplyAt":"2024-10-17 09:59:22","firstAssignedDate":"2024-10-17 09:59:22","fulfillmentDate":"2024-10-17 02:37:33","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2024-10-17","closedDate":"2024-12-03","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-28","year":"2024","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2024-10-17 02:37:30","stateChangedAt":"2024-12-03 16:30:04","stateChangedBy":"System","lastActivityAt":"2025-09-09 20:48:27","lastActivityBy":"Damian Casasnovas","_updated":"2025-09-09T15:48:27.000Z"},"RITM2245309":{"state":"Closed Complete","shortDesc":"Remove Redirect from finish.ro to finish.ro/promotii-cashback","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Romania","businessUnit":"Hygiene","finalCost":"120","currencyCode":"","ttfrMinutes":49,"clientRespMinutes":1509,"firstReplyAt":"2024-10-17 10:39:15","firstAssignedDate":"2024-10-17 10:08:00","fulfillmentDate":"2024-10-17 09:50:44","openedBy":"Andrei Constantin","openedDate":"2024-10-17","closedDate":"2024-11-06","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-11-06T06:00:17.000Z"},"RITM2245437":{"state":"Closed Complete","shortDesc":"I need to implement some modifications to website www.durex.it","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Italy","businessUnit":"Health","finalCost":"144","currencyCode":"","ttfrMinutes":5742,"clientRespMinutes":173,"firstReplyAt":"2024-10-21 10:39:38","firstAssignedDate":"2024-10-21 10:37:17","fulfillmentDate":"2024-10-17 10:57:59","openedBy":"Jacopo Ghislanzoni (Inactive)","openedDate":"2024-10-17","closedDate":"2024-10-27","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:09:27.000Z"},"RITM2245992":{"state":"Closed Complete","shortDesc":"Update Validity Period of Campaign on landing page","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Austria","businessUnit":"Hygiene","finalCost":"120","currencyCode":"","ttfrMinutes":6952,"clientRespMinutes":2378,"firstReplyAt":"2024-10-22 14:06:28","firstAssignedDate":"2024-10-21 10:39:37","fulfillmentDate":"2024-10-17 18:14:54","openedBy":"Rouven Lutz","openedDate":"2024-10-17","closedDate":"2024-10-29","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-10-29T13:20:07.000Z"},"RITM2245995":{"state":"Closed Complete","shortDesc":"Harpic MX homepage update","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Harpic","market":"Mexico","businessUnit":"Hygiene","finalCost":"6000","currencyCode":"","ttfrMinutes":38405,"clientRespMinutes":13985,"firstReplyAt":"2024-11-13 09:23:46","firstAssignedDate":"2024-10-21 10:43:04","fulfillmentDate":"2024-10-17 18:18:31","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2024-10-17","closedDate":"2024-12-03","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-29","year":"2024","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2024-10-17 18:18:28","stateChangedAt":"2024-12-03 16:30:05","stateChangedBy":"System","lastActivityAt":"2024-12-03 16:30:05","lastActivityBy":"System","_updated":"2025-03-19T19:08:34.000Z"},"RITM2247173":{"state":"Closed Complete","shortDesc":"Vanish NL Website Errors","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Netherlands","businessUnit":"Hygiene","finalCost":"300","currencyCode":"","ttfrMinutes":6824,"clientRespMinutes":4500,"firstReplyAt":"2024-10-23 10:04:46","firstAssignedDate":"2024-10-21 10:35:58","fulfillmentDate":"2024-10-18 16:21:12","openedBy":"Despoina Kamperoglou (Inactive)","openedDate":"2024-10-18","closedDate":"2025-02-01","toDoAt":"2024-12-03T14:53:58.610+0100","inUatAt":null,"jiraKey":"WFN-30","year":"2024","requestedFor":"","openedAt":"2024-10-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-01T15:20:53.000Z"},"RITM2247862":{"state":"Closed Complete","shortDesc":"Lysol CA: Implement 301 redirects","assignedTo":"Alesya Prolagayeva","brand":"Lysol","market":"Canada","businessUnit":"Hygiene","finalCost":"120","currencyCode":"","ttfrMinutes":264,"clientRespMinutes":null,"firstReplyAt":"2024-10-21 12:28:51","firstAssignedDate":"2024-10-21 10:33:25","fulfillmentDate":"2024-10-21 08:05:15","openedBy":"Nadine Evans","openedDate":"2024-10-21","closedDate":"2024-11-05","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Nadine Evans","openedAt":"2024-10-21 08:05:11","stateChangedAt":"2024-11-05 13:21:00","stateChangedBy":"System","lastActivityAt":"2024-10-31 12:24:53","lastActivityBy":"Alesya Prolagayeva","_updated":"2024-11-05T10:21:00.000Z"},"RITM2247884":{"state":"Closed Complete","shortDesc":"Lysol CA: Update internal redirected links","assignedTo":"Alesya Prolagayeva","brand":"Lysol","market":"Canada","businessUnit":"Hygiene","finalCost":"800","currencyCode":"","ttfrMinutes":424,"clientRespMinutes":null,"firstReplyAt":"2024-10-21 15:25:52","firstAssignedDate":"2024-10-21 10:30:33","fulfillmentDate":"2024-10-21 08:22:09","openedBy":"Nadine Evans","openedDate":"2024-10-21","closedDate":"2025-01-04","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-31","year":"2024","requestedFor":"Nadine Evans","openedAt":"2024-10-21 08:22:06","stateChangedAt":"2025-01-04 12:21:09","stateChangedBy":"System","lastActivityAt":"2024-12-30 08:43:05","lastActivityBy":"Anna Tyborska (Inactive)","_updated":"2025-03-11T22:29:25.000Z"},"RITM2247994":{"state":"Closed Complete","shortDesc":"Update Harpic Purpose website","assignedTo":"Alesya Prolagayeva","brand":"Harpic","market":"France","businessUnit":"Hygiene","finalCost":"2160","currencyCode":"","ttfrMinutes":4566,"clientRespMinutes":1751,"firstReplyAt":"2024-10-24 13:56:32","firstAssignedDate":"2024-10-21 10:27:59","fulfillmentDate":"2024-10-21 09:51:02","openedBy":"Pauline Laisney","openedDate":"2024-10-21","closedDate":"2025-02-24","toDoAt":"2024-12-16T09:29:41.237+0100","inUatAt":"2024-12-03T09:36:43.613+0100","jiraKey":"WFN-32","year":"2024","requestedFor":"","openedAt":"2024-10-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-24T13:21:06.000Z"},"RITM2248652":{"state":"Closed Complete","shortDesc":"Finish: Landing Zwiesel (BDI)","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Spain","businessUnit":"Hygiene","finalCost":"1200","currencyCode":"","ttfrMinutes":1191,"clientRespMinutes":1472,"firstReplyAt":"2024-10-22 12:45:01","firstAssignedDate":"2024-10-22 12:45:01","fulfillmentDate":"2024-10-21 16:54:02","openedBy":"Eva Bosch","openedDate":"2024-10-21","closedDate":"2024-11-12","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Eva Bosch","openedAt":"2024-10-21 16:53:57","stateChangedAt":"2024-11-12 10:21:37","stateChangedBy":"System","lastActivityAt":"2024-11-04 15:29:48","lastActivityBy":"Eva Bosch","_updated":"2024-11-12T07:21:37.000Z"},"RITM2249760":{"state":"Closed Complete","shortDesc":"New product page: Finish Power Essential","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Norway","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":1200,"clientRespMinutes":null,"firstReplyAt":"2024-10-23 10:05:18","firstAssignedDate":"2024-10-23 10:05:39","fulfillmentDate":"2024-10-22 14:04:59","openedBy":"Hannah Fernsebner (Inactive)","openedDate":"2024-10-22","closedDate":"2024-12-01","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-01T05:21:11.000Z"},"RITM2249787":{"state":"Closed Complete","shortDesc":"New product page: Finish Quantum","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Norway","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":1185,"clientRespMinutes":null,"firstReplyAt":"2024-10-23 10:01:51","firstAssignedDate":"2024-10-23 10:01:51","fulfillmentDate":"2024-10-22 14:17:23","openedBy":"Hannah Fernsebner (Inactive)","openedDate":"2024-10-22","closedDate":"2024-12-01","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-01T05:20:56.000Z"},"RITM2250764":{"state":"Closed Complete","shortDesc":"Insert links on the footer of the 7 Hygiene websites","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"France","businessUnit":"Hygiene","finalCost":"720","currencyCode":"","ttfrMinutes":10421,"clientRespMinutes":9159,"firstReplyAt":"2024-10-30 16:07:36","firstAssignedDate":"2024-10-24 13:33:57","fulfillmentDate":"2024-10-23 11:27:03","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2024-10-23","closedDate":"2025-03-25","toDoAt":"2025-02-19T15:30:54.170+0100","inUatAt":"2024-11-28T14:10:16.933+0100","jiraKey":"WFN-33","year":"2024","requestedFor":"","openedAt":"2024-10-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-25T12:21:24.000Z"},"RITM2250913":{"state":"Closed Complete","shortDesc":"Website edit for Turkey Strepsils - YT video edit, text edit etc.","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Turkey","businessUnit":"Health","finalCost":"720","currencyCode":"","ttfrMinutes":1504,"clientRespMinutes":2440,"firstReplyAt":"2024-10-24 14:05:49","firstAssignedDate":"2024-10-24 13:41:57","fulfillmentDate":"2024-10-23 13:02:15","openedBy":"Melike Koygun (Inactive)","openedDate":"2024-10-23","closedDate":"2024-12-08","toDoAt":"2024-11-28T14:11:12.987+0100","inUatAt":null,"jiraKey":"WFN-34","year":"2024","requestedFor":"","openedAt":"2024-10-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-08T12:21:08.000Z"},"RITM2252326":{"state":"Closed Complete","shortDesc":"Remove an outdated product from website","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Croatia","businessUnit":"Health","finalCost":"120","currencyCode":"","ttfrMinutes":1457,"clientRespMinutes":993,"firstReplyAt":"2024-10-25 16:24:02","firstAssignedDate":"2024-10-25 10:07:43","fulfillmentDate":"2024-10-24 16:06:57","openedBy":"Noemi Chrobot (Inactive)","openedDate":"2024-10-24","closedDate":"2024-11-09","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-11-09T13:21:03.000Z"},"RITM2253108":{"state":"Closed Complete","shortDesc":"I need to implement some modifications to website www.durex.it (LUBES)","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Health","finalCost":"144","currencyCode":"","ttfrMinutes":220,"clientRespMinutes":2811,"firstReplyAt":"2024-10-25 13:14:18","firstAssignedDate":"2024-10-25 10:05:04","fulfillmentDate":"2024-10-25 09:34:48","openedBy":"Jacopo Ghislanzoni (Inactive)","openedDate":"2024-10-25","closedDate":"2024-11-03","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:10:09.000Z"},"RITM2254524":{"state":"Closed Cancelled","shortDesc":"Veet Pakistan is working on taking its face-to-face classroom POME program online to ensure a wide outreach. To do this, we require creating a website where we create a platform that educates girls across Pak on personal hygiene, puberty and depilation, the first of its kind to do so.","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Pakistan","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":1732,"clientRespMinutes":2957,"firstReplyAt":"2024-10-29 15:54:53","firstAssignedDate":"2024-11-06 15:48:52","fulfillmentDate":"2024-10-28 11:03:01","openedBy":"Maha Khan","openedDate":"2024-10-28","closedDate":"2025-02-19","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-35","year":"2024","requestedFor":"Maha Khan","openedAt":"2024-10-28 11:02:58","stateChangedAt":"2025-02-19 15:33:24","stateChangedBy":"System","lastActivityAt":"2025-02-19 15:32:58","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-02-19T12:33:24.000Z"},"RITM2256277":{"state":"Closed Complete","shortDesc":"Update PDP Veet Italy site","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Veet","market":"Italy","businessUnit":"Health","finalCost":"144","currencyCode":"","ttfrMinutes":1316,"clientRespMinutes":7111,"firstReplyAt":"2024-10-30 13:57:09","firstAssignedDate":"2024-10-30 13:57:09","fulfillmentDate":"2024-10-29 16:00:49","openedBy":"Alice Vaccaro","openedDate":"2024-10-29","closedDate":"2024-11-24","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:08:26.000Z"},"RITM2256301":{"state":"Closed Complete","shortDesc":"New page creation on www.airwick.pl - new fall/winter seasonal collection to be added","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Poland","businessUnit":"Hygiene","finalCost":"1800","currencyCode":"","ttfrMinutes":1414,"clientRespMinutes":5054,"firstReplyAt":"2024-10-30 15:53:55","firstAssignedDate":"2024-10-30 12:08:27","fulfillmentDate":"2024-10-29 16:19:51","openedBy":"Ewa Musial","openedDate":"2024-10-29","closedDate":"2025-02-01","toDoAt":"2024-12-11T09:26:14.193+0100","inUatAt":"2024-11-27T20:28:03.253+0100","jiraKey":"WFN-36","year":"2024","requestedFor":"","openedAt":"2024-10-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-02T12:26:11.000Z"},"RITM2256416":{"state":"Closed Complete","shortDesc":"T&C REPLACEMENT finish-1-euro-additivi-cashback- PROLUNGAMENTO","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"144","currencyCode":"","ttfrMinutes":1200,"clientRespMinutes":2089,"firstReplyAt":"2024-10-30 13:55:03","firstAssignedDate":"2024-10-30 13:55:03","fulfillmentDate":"2024-10-29 17:55:01","openedBy":"Alice Esposito (Inactive)","openedDate":"2024-10-29","closedDate":"2024-11-17","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:03:15.000Z"},"RITM2257371":{"state":"Closed Cancelled","shortDesc":"Lysol CA: URLs Missing H1","assignedTo":"Alesya Prolagayeva","brand":"Lysol","market":"Canada","businessUnit":"Hygiene","finalCost":"600","currencyCode":"","ttfrMinutes":53,"clientRespMinutes":null,"firstReplyAt":"2024-10-30 15:26:33","firstAssignedDate":"2024-10-30 15:26:39","fulfillmentDate":"2024-10-30 14:33:59","openedBy":"Andrea Guidi","openedDate":"2024-10-30","closedDate":"2025-05-14","toDoAt":"2025-02-14T16:50:48.727+0100","inUatAt":"2025-04-14T19:08:28.830+0200","jiraKey":"WFN-37","year":"2024","requestedFor":"Andrea Guidi","openedAt":"2024-10-30 14:33:55","stateChangedAt":"2025-05-14 10:49:37","stateChangedBy":"System","lastActivityAt":"2025-05-14 10:49:11","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-05-14T05:49:37.000Z"},"RITM2257418":{"state":"Closed Cancelled","shortDesc":"Lysol CA: Update meta titles & meta descriptions","assignedTo":"Alesya Prolagayeva","brand":"Lysol","market":"Canada","businessUnit":"Hygiene","finalCost":"600","currencyCode":"","ttfrMinutes":25,"clientRespMinutes":null,"firstReplyAt":"2024-10-30 15:33:29","firstAssignedDate":"2024-10-30 15:33:29","fulfillmentDate":"2024-10-30 15:08:27","openedBy":"Andrea Guidi","openedDate":"2024-10-30","closedDate":"2025-05-14","toDoAt":"2025-02-14T16:51:45.280+0100","inUatAt":"2025-04-14T19:08:30.740+0200","jiraKey":"WFN-38","year":"2024","requestedFor":"Andrea Guidi","openedAt":"2024-10-30 15:08:23","stateChangedAt":"2025-05-14 10:48:05","stateChangedBy":"System","lastActivityAt":"2025-05-14 10:47:22","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-05-14T05:48:05.000Z"},"RITM2257443":{"state":"Closed Cancelled","shortDesc":"Resolve CA: Update Javascript-dependent internal links","assignedTo":"Alesya Prolagayeva","brand":"Resolve","market":"Canada","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":14,"clientRespMinutes":null,"firstReplyAt":"2024-10-30 15:38:15","firstAssignedDate":"2024-10-30 15:38:15","fulfillmentDate":"2024-10-30 15:23:53","openedBy":"Andrea Guidi","openedDate":"2024-10-30","closedDate":"2024-11-28","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-39","year":"2024","requestedFor":"Andrea Guidi","openedAt":"2024-10-30 15:23:50","stateChangedAt":"2024-11-28 14:27:14","stateChangedBy":"System","lastActivityAt":"2024-11-28 14:26:36","lastActivityBy":"Alesya Prolagayeva","_updated":"2024-11-28T11:27:14.000Z"},"RITM2257623":{"state":"Closed Complete","shortDesc":"Update on Finish cashback 1 euro","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"360","currencyCode":"","ttfrMinutes":990,"clientRespMinutes":5697,"firstReplyAt":"2024-10-31 10:16:46","firstAssignedDate":"2024-10-31 10:07:59","fulfillmentDate":"2024-10-30 17:46:57","openedBy":"Alice Esposito (Inactive)","openedDate":"2024-10-30","closedDate":"2024-11-17","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-10-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:03:39.000Z"},"RITM2260846":{"state":"Closed Complete","shortDesc":"Remove a logo from partenership zone - Harpic : \"A nous les toilettes\" page","assignedTo":"Alesya Prolagayeva","brand":"Harpic","market":"France","businessUnit":"Hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2899,"clientRespMinutes":3070,"firstReplyAt":"2024-11-06 15:43:23","firstAssignedDate":"2024-11-05 10:16:42","fulfillmentDate":"2024-11-04 15:24:51","openedBy":"Swann Roussel","openedDate":"2024-11-04","closedDate":"2024-11-25","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-11-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-11-25T09:21:27.000Z"},"RITM2261615":{"state":"Closed Complete","shortDesc":"Add info in nurofen.es and gaviscon.es footers","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Nurofen","market":"Spain","businessUnit":"Health","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1299,"clientRespMinutes":1262,"firstReplyAt":"2024-11-06 07:42:26","firstAssignedDate":"2024-11-05 15:00:40","fulfillmentDate":"2024-11-05 10:03:52","openedBy":"Alba Garcia","openedDate":"2024-11-05","closedDate":"2024-11-12","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Alba Garcia","openedAt":"2024-11-05 10:03:48","stateChangedAt":"2024-11-12 14:20:13","stateChangedBy":"System","lastActivityAt":"2024-11-12 14:20:13","lastActivityBy":"System","_updated":"2024-11-12T11:20:13.000Z"},"RITM2261715":{"state":"Closed Complete","shortDesc":"FAQ page Durex.es","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Spain","businessUnit":"Health","finalCost":"360","currencyCode":"EUR","ttfrMinutes":4179,"clientRespMinutes":2039,"firstReplyAt":"2024-11-08 08:36:41","firstAssignedDate":"2024-11-06 14:23:46","fulfillmentDate":"2024-11-05 10:57:38","openedBy":"Alba Garcia","openedDate":"2024-11-05","closedDate":"2024-11-27","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Alba Garcia","openedAt":"2024-11-05 10:57:34","stateChangedAt":"2024-11-27 11:21:00","stateChangedBy":"System","lastActivityAt":"2024-11-21 13:10:08","lastActivityBy":"Alba Garcia","_updated":"2024-11-27T08:21:00.000Z"},"RITM2261836":{"state":"Closed Complete","shortDesc":"CHANGE EXPECT FOR Harpic Website - size M","assignedTo":"Alesya Prolagayeva","brand":"Harpic","market":"France","businessUnit":"Hygiene","finalCost":"1080","currencyCode":"EUR","ttfrMinutes":1676,"clientRespMinutes":3378,"firstReplyAt":"2024-11-06 15:56:55","firstAssignedDate":"2024-11-05 14:41:33","fulfillmentDate":"2024-11-05 12:01:12","openedBy":"Swann Roussel","openedDate":"2024-11-05","closedDate":"2024-11-30","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-11-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-11-30T07:21:36.000Z"},"RITM2262243":{"state":"Closed Cancelled","shortDesc":"Add a website to Durex.nl","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Netherlands","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":244,"clientRespMinutes":24,"firstReplyAt":"2024-11-05 21:22:32","firstAssignedDate":"2024-11-05 21:08:22","fulfillmentDate":"2024-11-05 17:18:17","openedBy":"Capucine Bourgois","openedDate":"2024-11-05","closedDate":"2025-02-24","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-41","year":"2024","requestedFor":"Capucine Bourgois","openedAt":"2024-11-05 17:18:13","stateChangedAt":"2025-02-24 08:36:12","stateChangedBy":"System","lastActivityAt":"2025-02-24 08:35:45","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2025-02-24T05:36:12.000Z"},"RITM2262260":{"state":"Closed Cancelled","shortDesc":"Page speed changes Durex.es","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Spain","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":3778,"clientRespMinutes":4316,"firstReplyAt":"2024-11-08 08:34:12","firstAssignedDate":"2024-11-06 14:49:32","fulfillmentDate":"2024-11-05 17:35:58","openedBy":"Alba Garcia","openedDate":"2024-11-05","closedDate":"2024-12-13","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-42","year":"2024","requestedFor":"Alba Garcia","openedAt":"2024-11-05 17:35:55","stateChangedAt":"2024-12-13 07:33:34","stateChangedBy":"System","lastActivityAt":"2024-12-12 16:41:50","lastActivityBy":"Alba Garcia","_updated":"2024-12-13T04:33:34.000Z"},"RITM2262868":{"state":"Closed Complete","shortDesc":"Cillit Bang: expert update","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Cillit","market":"Spain","businessUnit":"Hygiene","finalCost":"600","currencyCode":"","ttfrMinutes":1597,"clientRespMinutes":1728,"firstReplyAt":"2024-11-07 11:45:46","firstAssignedDate":"2024-11-06 09:11:00","fulfillmentDate":"2024-11-06 09:08:57","openedBy":"Eva Bosch","openedDate":"2024-11-06","closedDate":"2024-12-10","toDoAt":"2024-11-28T08:24:54.357+0100","inUatAt":"2024-11-28T08:24:59.687+0100","jiraKey":"WFN-43","year":"2024","requestedFor":"Eva Bosch","openedAt":"2024-11-06 09:08:53","stateChangedAt":"2024-12-10 09:21:18","stateChangedBy":"System","lastActivityAt":"2024-12-02 14:54:01","lastActivityBy":"Eva Bosch","_updated":"2024-12-10T06:21:18.000Z"},"RITM2263386":{"state":"Closed Complete","shortDesc":"Change request for NO repsils websites","assignedTo":"Herman Bykanov (Inactive)","brand":"Strepsils","market":"Norway","businessUnit":"Health","finalCost":"1440","currencyCode":"GBP","ttfrMinutes":71,"clientRespMinutes":4448,"firstReplyAt":"2024-11-06 15:35:42","firstAssignedDate":"2024-11-06 15:35:42","fulfillmentDate":"2024-11-06 14:24:37","openedBy":"Federico Mirandola (Inactive)","openedDate":"2024-11-06","closedDate":"2025-04-15","toDoAt":"2025-04-03T11:57:06.447+0200","inUatAt":"2025-03-05T08:13:40.893+0100","jiraKey":"WFN-44","year":"2024","requestedFor":"","openedAt":"2024-11-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-15T05:21:04.000Z"},"RITM2264893":{"state":"Closed Complete","shortDesc":"Change external link","assignedTo":"Alesya Prolagayeva","brand":"SBP","market":"Brazil","businessUnit":"Hygiene","finalCost":"2667","currencyCode":"MXN","ttfrMinutes":1320,"clientRespMinutes":1217,"firstReplyAt":"2024-11-08 14:44:33","firstAssignedDate":"2024-11-08 14:44:33","fulfillmentDate":"2024-11-07 16:45:02","openedBy":"Ricardo Leonardo","openedDate":"2024-11-07","closedDate":"2024-11-20","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Ricardo Leonardo","openedAt":"2024-11-07 16:44:57","stateChangedAt":"2024-11-20 16:20:56","stateChangedBy":"System","lastActivityAt":"2025-10-31 19:32:29","lastActivityBy":"Damian Casasnovas","_updated":"2025-10-31T16:32:29.000Z"},"RITM2264948":{"state":"Closed Complete","shortDesc":"Veet.es website changes","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Veet","market":"Spain","businessUnit":"Health","finalCost":"1440","currencyCode":"EUR","ttfrMinutes":1445,"clientRespMinutes":528,"firstReplyAt":"2024-11-08 17:38:33","firstAssignedDate":"2024-11-08 15:51:51","fulfillmentDate":"2024-11-07 17:33:10","openedBy":"Alba Garcia","openedDate":"2024-11-07","closedDate":"2024-12-04","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-45","year":"2024","requestedFor":"Alba Garcia","openedAt":"2024-11-07 17:33:06","stateChangedAt":"2024-12-04 13:20:58","stateChangedBy":"System","lastActivityAt":"2024-11-29 11:47:32","lastActivityBy":"Alba Garcia","_updated":"2024-12-04T10:20:58.000Z"},"RITM2265049":{"state":"Closed Cancelled","shortDesc":"upload the T&C for the FINISH “VINCI GIFT CARD TIGOTA","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1020,"clientRespMinutes":8909,"firstReplyAt":"2024-11-08 14:30:22","firstAssignedDate":"2024-11-08 14:28:39","fulfillmentDate":"2024-11-07 21:30:29","openedBy":"Alice Esposito (Inactive)","openedDate":"2024-11-07","closedDate":"2024-12-03","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-46","year":"2024","requestedFor":"Alice Esposito (Inactive)","openedAt":"2024-11-07 21:30:26","stateChangedAt":"2024-12-03 17:01:18","stateChangedBy":"Alice Esposito (Inactive)","lastActivityAt":"2024-12-04 12:48:45","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2024-12-13T05:01:21.000Z"},"RITM2265123":{"state":"Closed Complete","shortDesc":"Refresh content hub lubes | Sico Mx","assignedTo":"Renata Probst Martínez","brand":"Sico","market":"Mexico","businessUnit":null,"finalCost":"","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":null,"firstAssignedDate":null,"fulfillmentDate":null,"openedBy":null,"openedDate":null,"closedDate":null,"toDoAt":null,"inUatAt":null,"jiraKey":null,"year":null,"requestedFor":"Mariana Onofre Castro","openedAt":"2024-11-08 02:25:37","stateChangedAt":"2024-12-09 22:21:00","stateChangedBy":"System","lastActivityAt":"","lastActivityBy":"","_updated":"2024-12-09T19:21:00.000Z"},"RITM2265129":{"state":"Closed Complete","shortDesc":"Develop Soft lube Landing","assignedTo":"Renata Probst Martínez","brand":"Sico","market":"Mexico","businessUnit":null,"finalCost":"","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":null,"firstAssignedDate":null,"fulfillmentDate":null,"openedBy":null,"openedDate":null,"closedDate":null,"toDoAt":null,"inUatAt":null,"jiraKey":null,"year":null,"requestedFor":"Mariana Onofre Castro","openedAt":"2024-11-08 02:46:40","stateChangedAt":"2024-12-18 22:20:58","stateChangedBy":"System","lastActivityAt":"","lastActivityBy":"","_updated":"2024-12-18T19:20:58.000Z"},"RITM2265605":{"state":"Closed Complete","shortDesc":"Website updates","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"France","businessUnit":"Hygiene","finalCost":"1080","currencyCode":"EUR","ttfrMinutes":8963,"clientRespMinutes":1144,"firstReplyAt":"2024-11-14 16:11:14","firstAssignedDate":"2024-11-08 14:25:58","fulfillmentDate":"2024-11-08 10:48:15","openedBy":"Olga Tadrzak","openedDate":"2024-11-08","closedDate":"2025-10-21","toDoAt":"2025-02-21T10:49:19.380+0100","inUatAt":"2025-02-24T11:52:19.957+0100","jiraKey":"WFN-47","year":"2024","requestedFor":"","openedAt":"2024-11-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-21T06:20:55.000Z"},"RITM2267416":{"state":"Closed Complete","shortDesc":"Finish - zwiesel page changes","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Spain","businessUnit":"Hygiene","finalCost":"120","currencyCode":"","ttfrMinutes":978,"clientRespMinutes":null,"firstReplyAt":"2024-11-12 09:16:22","firstAssignedDate":"2024-11-11 16:59:18","fulfillmentDate":"2024-11-11 16:58:07","openedBy":"Eva Bosch","openedDate":"2024-11-11","closedDate":"2024-11-17","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Eva Bosch","openedAt":"2024-11-11 16:58:03","stateChangedAt":"2024-11-17 17:21:10","stateChangedBy":"System","lastActivityAt":"2024-11-12 15:58:52","lastActivityBy":"Eva Bosch","_updated":"2024-11-17T14:21:10.000Z"},"RITM2267440":{"state":"Closed Complete","shortDesc":"Sole website change request","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Sole","market":"Italy","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1126,"clientRespMinutes":1255,"firstReplyAt":"2024-11-12 12:16:14","firstAssignedDate":"2024-11-12 12:16:14","fulfillmentDate":"2024-11-11 17:30:03","openedBy":"Estelle Pivetta (Inactive)","openedDate":"2024-11-11","closedDate":"2024-11-30","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-11-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-13T05:01:48.000Z"},"RITM2268267":{"state":"Closed Cancelled","shortDesc":"[DEMO] Update pack shots for product range on Nurofen Italy","assignedTo":"Jonathan Tyrrell (Inactive)","brand":"Nurofen","market":"Italy","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":"","firstAssignedDate":"2024-11-13 11:28:44","fulfillmentDate":"2024-11-12 12:24:06","openedBy":null,"openedDate":null,"closedDate":null,"toDoAt":null,"inUatAt":null,"jiraKey":null,"year":null,"requestedFor":"Jonathan Tyrrell (Inactive)","openedAt":"2024-11-12 12:24:03","stateChangedAt":"2025-02-13 16:32:34","stateChangedBy":"Jonathan Tyrrell (Inactive)","lastActivityAt":"2025-02-13 16:32:34","lastActivityBy":"Jonathan Tyrrell (Inactive)","_updated":"2025-02-13T13:32:34.000Z"},"RITM2268403":{"state":"Closed Complete","shortDesc":"Finish.com.tr mandatory shopify checkout upgrade // Urgent","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Turkey","businessUnit":"Hygiene","finalCost":"900","currencyCode":"GBP","ttfrMinutes":44,"clientRespMinutes":1263,"firstReplyAt":"2024-11-12 14:33:40","firstAssignedDate":"2024-11-12 14:33:40","fulfillmentDate":"2024-11-12 13:50:09","openedBy":"Aybars Ilhan","openedDate":"2024-11-12","closedDate":"2025-03-25","toDoAt":"2024-12-18T09:38:21.360+0100","inUatAt":null,"jiraKey":"WFN-49","year":"2024","requestedFor":"","openedAt":"2024-11-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-25T05:20:56.000Z"},"RITM2268588":{"state":"Closed Complete","shortDesc":"Nurofen&Gaviscon - Internal Linking","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Nurofen","market":"Spain","businessUnit":"Health","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1082,"clientRespMinutes":8635,"firstReplyAt":"2024-11-13 10:15:30","firstAssignedDate":"2024-11-13 10:15:30","fulfillmentDate":"2024-11-12 16:13:42","openedBy":"Alba Garcia","openedDate":"2024-11-12","closedDate":"2024-11-30","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"Alba Garcia","openedAt":"2024-11-12 16:13:39","stateChangedAt":"2024-11-30 09:21:12","stateChangedBy":"System","lastActivityAt":"2024-11-21 11:06:05","lastActivityBy":"Alba Garcia","_updated":"2024-11-30T06:21:12.000Z"},"RITM2269252":{"state":"Closed Complete","shortDesc":"Nurofen IL - Migration continuation","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Israel","businessUnit":"Health","finalCost":"720","currencyCode":"EUR","ttfrMinutes":7686,"clientRespMinutes":8556,"firstReplyAt":"2024-11-18 18:26:13","firstAssignedDate":"2024-11-18 18:26:13","fulfillmentDate":"2024-11-13 10:20:21","openedBy":"Rowena Hearn","openedDate":"2024-11-13","closedDate":"2025-04-16","toDoAt":"2025-01-27T18:04:49.650+0100","inUatAt":"2025-02-14T09:26:16.743+0100","jiraKey":"WFN-50","year":"2024","requestedFor":"","openedAt":"2024-11-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-16T06:20:58.000Z"},"RITM2269480":{"state":"Closed Complete","shortDesc":"Durex - Internal linking optimization & redirections","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Spain","businessUnit":"Health","finalCost":"720","currencyCode":"EUR","ttfrMinutes":8834,"clientRespMinutes":14364,"firstReplyAt":"2024-11-19 15:49:23","firstAssignedDate":"2024-11-19 15:49:23","fulfillmentDate":"2024-11-13 12:35:38","openedBy":"Alba Garcia","openedDate":"2024-11-13","closedDate":"2024-12-08","toDoAt":"2024-11-27T20:28:34.253+0100","inUatAt":null,"jiraKey":"WFN-51","year":"2024","requestedFor":"Alba Garcia","openedAt":"2024-11-13 12:35:35","stateChangedAt":"2024-12-08 15:21:07","stateChangedBy":"System","lastActivityAt":"2024-12-02 08:59:34","lastActivityBy":"Alba Garcia","_updated":"2024-12-08T12:21:06.000Z"},"RITM2269581":{"state":"Closed Cancelled","shortDesc":"Woolite PT: website update","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Woolite","market":"Portugal","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":1257,"clientRespMinutes":33134,"firstReplyAt":"2024-11-14 10:35:35","firstAssignedDate":"2024-11-13 13:40:32","fulfillmentDate":"2024-11-13 13:38:49","openedBy":"Eva Bosch","openedDate":"2024-11-13","closedDate":"2025-02-17","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-52","year":"2024","requestedFor":"Eva Bosch","openedAt":"2024-11-13 13:38:46","stateChangedAt":"2025-02-17 14:54:27","stateChangedBy":"Eva Bosch","lastActivityAt":"2025-02-17 14:54:27","lastActivityBy":"Eva Bosch","_updated":"2025-02-17T11:54:27.000Z"},"RITM2269679":{"state":"Closed Cancelled","shortDesc":"Finish - in machine sampling WG - CRO","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":174,"clientRespMinutes":null,"firstReplyAt":"2024-11-13 17:49:05","firstAssignedDate":"2024-11-13 16:32:24","fulfillmentDate":"2024-11-13 14:54:49","openedBy":"Anna Koroknay","openedDate":"2024-11-13","closedDate":"2025-02-24","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-53","year":"2024","requestedFor":"Anna Koroknay","openedAt":"2024-11-13 14:54:46","stateChangedAt":"2025-02-24 08:15:30","stateChangedBy":"System","lastActivityAt":"2025-02-24 08:15:02","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2025-02-24T05:15:30.000Z"},"RITM2269687":{"state":"Closed Cancelled","shortDesc":"Finish - in machine sampling WG - SLO","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":129155,"clientRespMinutes":null,"firstReplyAt":"2025-02-11 07:35:10","firstAssignedDate":"2024-11-13 16:33:04","fulfillmentDate":"2024-11-13 15:00:06","openedBy":"Anna Koroknay","openedDate":"2024-11-13","closedDate":"2025-02-24","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-54","year":"2024","requestedFor":"Anna Koroknay","openedAt":"2024-11-13 14:59:58","stateChangedAt":"2025-02-24 08:18:50","stateChangedBy":"System","lastActivityAt":"2025-02-24 08:17:22","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2025-02-24T05:18:50.000Z"},"RITM2269954":{"state":"Closed Cancelled","shortDesc":"pushing affiliate ID from front end to back end","assignedTo":"Aleh Dziameshchanka","brand":"Finish","market":"Poland","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":16732,"clientRespMinutes":2258,"firstReplyAt":"2024-11-25 09:58:40","firstAssignedDate":"2024-11-18 10:31:17","fulfillmentDate":"2024-11-13 19:06:45","openedBy":null,"openedDate":null,"closedDate":null,"toDoAt":null,"inUatAt":null,"jiraKey":null,"year":null,"requestedFor":"Klaudia Jablonska","openedAt":"2024-11-13 19:06:41","stateChangedAt":"2025-04-16 16:22:37","stateChangedBy":"Aleh Dziameshchanka","lastActivityAt":"2025-04-16 15:24:32","lastActivityBy":"Aleh Dziameshchanka","_updated":"2025-04-16T11:22:36.000Z"},"RITM2270715":{"state":"Closed Complete","shortDesc":"We need to change some parts of the website.","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Vanish","market":"Turkey","businessUnit":"Hygiene","finalCost":"600","currencyCode":"GBP","ttfrMinutes":5742,"clientRespMinutes":3406,"firstReplyAt":"2024-11-18 12:25:25","firstAssignedDate":"2024-11-18 10:28:57","fulfillmentDate":"2024-11-14 12:43:07","openedBy":"Kaan Soylu (Inactive)","openedDate":"2024-11-14","closedDate":"2024-12-22","toDoAt":"2024-12-02T11:17:00.023+0100","inUatAt":"2024-12-03T15:49:14.350+0100","jiraKey":"WFN-56","year":"2024","requestedFor":"","openedAt":"2024-11-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-22T05:21:19.000Z"},"RITM2270835":{"state":"Closed Complete","shortDesc":"packshot update of the strepsils.hu website for 10 SKUs","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Strepsils","market":"Hungary","businessUnit":"Health","finalCost":"300","currencyCode":"","ttfrMinutes":5807,"clientRespMinutes":1681,"firstReplyAt":"2024-11-18 15:20:21","firstAssignedDate":"2024-11-18 10:26:17","fulfillmentDate":"2024-11-14 14:33:43","openedBy":"Eszter Balogh","openedDate":"2024-11-14","closedDate":"2024-11-30","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2024","requestedFor":"","openedAt":"2024-11-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-11-30T11:21:09.000Z"},"RITM2271027":{"state":"Closed Complete","shortDesc":"migration of Strepsils webpage from html to Husky 2","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Czech Republic","businessUnit":"Health","finalCost":"7900","currencyCode":"GBP","ttfrMinutes":166629,"clientRespMinutes":166627,"firstReplyAt":"2025-03-10 09:34:50","firstAssignedDate":"2024-11-15 17:11:29","fulfillmentDate":"2024-11-14 16:26:17","openedBy":"Kateryna Trompak","openedDate":"2024-11-14","closedDate":"2025-09-17","toDoAt":"2025-03-25T15:09:06.760+0100","inUatAt":"2025-04-14T18:49:01.117+0200","jiraKey":"WFN-57","year":"2024","requestedFor":"","openedAt":"2024-11-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-17T08:20:53.000Z"},"RITM2271040":{"state":"Closed Complete","shortDesc":"migration of the Strepsils webpage from html to Husky 2","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Slovakia","businessUnit":"Health","finalCost":"7400","currencyCode":"GBP","ttfrMinutes":128119,"clientRespMinutes":null,"firstReplyAt":"2025-02-11 15:50:28","firstAssignedDate":"2024-11-15 17:11:11","fulfillmentDate":"2024-11-14 16:31:15","openedBy":"Kateryna Trompak","openedDate":"2024-11-14","closedDate":"2025-09-17","toDoAt":"2025-02-12T09:42:34.760+0100","inUatAt":"2025-04-14T19:08:44.190+0200","jiraKey":"WFN-164","year":"2024","requestedFor":"","openedAt":"2024-11-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-17T08:20:58.000Z"},"RITM2271191":{"state":"Closed Complete","shortDesc":"URGENT LEGAL CHANGES","assignedTo":"Alesya Prolagayeva","brand":"Nuromol","market":"Brazil","businessUnit":"Health","finalCost":"6667","currencyCode":"MXN","ttfrMinutes":963,"clientRespMinutes":713,"firstReplyAt":"2024-11-15 11:15:32","firstAssignedDate":"2024-11-15 11:15:32","fulfillmentDate":"2024-11-14 19:12:09","openedBy":"Ricardo Leonardo","openedDate":"2024-11-14","closedDate":"2025-01-07","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-59","year":"2024","requestedFor":"Ricardo Leonardo","openedAt":"2024-11-14 19:12:05","stateChangedAt":"2025-01-07 12:21:51","stateChangedBy":"System","lastActivityAt":"2025-10-31 19:20:47","lastActivityBy":"Damian Casasnovas","_updated":"2025-10-31T16:20:47.000Z"},"RITM2273934":{"state":"Closed Complete","shortDesc":"Nurofen FR: copy + packhoshot changes across the entire website/legal purposes","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"France","businessUnit":"Health","finalCost":"720","currencyCode":"EUR","ttfrMinutes":11638,"clientRespMinutes":919,"firstReplyAt":"2024-11-26 18:15:43","firstAssignedDate":"2024-11-20 10:19:46","fulfillmentDate":"2024-11-18 16:17:30","openedBy":"Sara Mortada (Inactive)","openedDate":"2024-11-18","closedDate":"2025-04-28","toDoAt":"2024-12-18T09:23:46.397+0100","inUatAt":"2025-01-13T11:10:46.650+0100","jiraKey":"WFN-60","year":"2024","requestedFor":"","openedAt":"2024-11-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-28T08:21:02.000Z"},"RITM2273963":{"state":"Closed Complete","shortDesc":"Correct internal linking vanish.fr","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"France","businessUnit":"Hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2676,"clientRespMinutes":3398,"firstReplyAt":"2024-11-20 13:07:44","firstAssignedDate":"2024-11-20 10:21:41","fulfillmentDate":"2024-11-18 16:32:17","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2024-11-18","closedDate":"2025-01-28","toDoAt":"2025-01-09T16:26:35.180+0100","inUatAt":"2025-01-09T19:11:35.503+0100","jiraKey":"WFN-61","year":"2024","requestedFor":"","openedAt":"2024-11-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-01-28T07:00:28.000Z"},"RITM2273966":{"state":"Closed Complete","shortDesc":"All brands - Website buy buttons","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Spain","businessUnit":"Health","finalCost":"1584","currencyCode":"EUR","ttfrMinutes":1398,"clientRespMinutes":7316,"firstReplyAt":"2024-11-19 15:51:42","firstAssignedDate":"2024-11-19 15:51:42","fulfillmentDate":"2024-11-18 16:33:28","openedBy":"Alba Garcia","openedDate":"2024-11-18","closedDate":"2025-02-16","toDoAt":"2024-11-27T20:27:40.767+0100","inUatAt":null,"jiraKey":"WFN-62","year":"2024","requestedFor":"Alba Garcia","openedAt":"2024-11-18 16:33:24","stateChangedAt":"2025-02-16 08:21:00","stateChangedBy":"System","lastActivityAt":"2025-02-11 08:11:38","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2025-02-16T05:21:00.000Z"},"RITM2274038":{"state":"Closed Complete","shortDesc":"New landing page for Cashback on Pack Air Wick - Lion project 2025","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Air Wick","market":"Italy","businessUnit":"Hygiene","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1117,"clientRespMinutes":5035,"firstReplyAt":"2024-11-19 12:03:44","firstAssignedDate":"2024-11-19 12:03:44","fulfillmentDate":"2024-11-18 17:26:30","openedBy":"Serena Puccini (Inactive)","openedDate":"2024-11-18","closedDate":"2025-03-04","toDoAt":"2024-12-09T12:33:17.597+0100","inUatAt":"2025-02-03T15:33:07.910+0100","jiraKey":"WFN-63","year":"2024","requestedFor":"","openedAt":"2024-11-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-04T05:20:53.000Z"},"RITM2274929":{"state":"Closed Cancelled","shortDesc":"Adding pages to Huskyx before migration","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"France","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":4340,"clientRespMinutes":1450,"firstReplyAt":"2024-11-22 14:03:01","firstAssignedDate":"2024-11-20 10:25:04","fulfillmentDate":"2024-11-19 13:43:14","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2024-11-19","closedDate":"2024-12-24","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-64","year":"2024","requestedFor":"Mouncef Belkeziz (Inactive)","openedAt":"2024-11-19 13:43:09","stateChangedAt":"2024-12-24 10:40:51","stateChangedBy":"System","lastActivityAt":"2024-12-24 10:40:24","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-03-18T15:30:00.000Z"},"RITM2274936":{"state":"Closed Cancelled","shortDesc":"55 pages need a new Head Title Tag","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"France","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":4356,"clientRespMinutes":672,"firstReplyAt":"2024-11-22 14:23:56","firstAssignedDate":"2024-11-20 10:26:58","fulfillmentDate":"2024-11-19 13:47:49","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2024-11-19","closedDate":"2025-01-09","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-65","year":"2024","requestedFor":"Mouncef Belkeziz (Inactive)","openedAt":"2024-11-19 13:47:46","stateChangedAt":"2025-01-09 16:27:50","stateChangedBy":"System","lastActivityAt":"2025-01-08 20:49:51","lastActivityBy":"Mouncef Belkeziz (Inactive)","_updated":"2025-01-09T13:27:50.000Z"},"RITM2275182":{"state":"Closed Complete","shortDesc":"Website URL content replacement + new URL","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Poland","businessUnit":"Hygiene","finalCost":"264","currencyCode":"EUR","ttfrMinutes":2907,"clientRespMinutes":4401,"firstReplyAt":"2024-11-21 17:16:29","firstAssignedDate":"2024-11-20 18:04:28","fulfillmentDate":"2024-11-19 16:49:25","openedBy":"Olga Tadrzak","openedDate":"2024-11-19","closedDate":"2025-01-07","toDoAt":"2024-11-28T13:11:37.057+0100","inUatAt":"2024-12-09T17:43:16.073+0100","jiraKey":"WFN-66","year":"2024","requestedFor":"","openedAt":"2024-11-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-01-07T09:22:23.000Z"},"RITM2275232":{"state":"Closed Complete","shortDesc":"Foother update","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Poland","businessUnit":"Hygiene","finalCost":"300","currencyCode":"GBP","ttfrMinutes":4132,"clientRespMinutes":1737,"firstReplyAt":"2024-11-22 14:30:11","firstAssignedDate":"2024-11-20 18:07:18","fulfillmentDate":"2024-11-19 17:37:52","openedBy":"Olga Tadrzak","openedDate":"2024-11-19","closedDate":"2025-01-21","toDoAt":"2024-11-28T13:18:01.417+0100","inUatAt":"2024-12-02T13:14:30.490+0100","jiraKey":"WFN-67","year":"2024","requestedFor":"","openedAt":"2024-11-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-01-21T08:21:40.000Z"},"RITM2275287":{"state":"Closed Cancelled","shortDesc":"Resolve CA: Update internal broken links","assignedTo":"Alesya Prolagayeva","brand":"Resolve","market":"Canada","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":4010,"clientRespMinutes":null,"firstReplyAt":"2024-11-22 13:18:06","firstAssignedDate":"2024-11-20 18:09:49","fulfillmentDate":"2024-11-19 18:28:14","openedBy":"Andrea Guidi","openedDate":"2024-11-19","closedDate":"2025-05-14","toDoAt":"2025-02-14T16:56:02.077+0100","inUatAt":"2025-02-17T16:31:23.220+0100","jiraKey":"WFN-68","year":"2024","requestedFor":"Andrea Guidi","openedAt":"2024-11-19 18:28:10","stateChangedAt":"2025-05-14 10:45:39","stateChangedBy":"System","lastActivityAt":"2025-05-14 10:45:13","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-05-14T05:45:39.000Z"},"RITM2275853":{"state":"Closed Complete","shortDesc":"Stark - Benagol Italy","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Italy","businessUnit":"Health","finalCost":"750","currencyCode":"GBP","ttfrMinutes":404,"clientRespMinutes":3189,"firstReplyAt":"2024-11-20 17:51:17","firstAssignedDate":"2024-11-20 17:51:17","fulfillmentDate":"2024-11-20 11:06:55","openedBy":"Rowena Hearn","openedDate":"2024-11-20","closedDate":"2025-10-20","toDoAt":"2024-12-04T18:58:37.003+0100","inUatAt":"2024-12-02T15:25:51.240+0100","jiraKey":"WFN-70","year":"2024","requestedFor":"","openedAt":"2024-11-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-20T14:20:53.000Z"},"RITM2275978":{"state":"Closed Complete","shortDesc":"Microsite change","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Greece","businessUnit":"Hygiene","finalCost":"600","currencyCode":"GBP","ttfrMinutes":317,"clientRespMinutes":7828,"firstReplyAt":"2024-11-20 17:39:33","firstAssignedDate":"2024-11-20 14:55:17","fulfillmentDate":"2024-11-20 12:22:55","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2024-11-20","closedDate":"2024-12-10","toDoAt":"2024-12-09T17:36:37.270+0100","inUatAt":"2024-12-02T11:17:17.140+0100","jiraKey":"WFN-71","year":"2024","requestedFor":"","openedAt":"2024-11-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-10T12:10:18.000Z"},"RITM2276156":{"state":"Closed Complete","shortDesc":"Contact forms not working properly","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Germany","businessUnit":"Health","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":7274,"clientRespMinutes":2396,"firstReplyAt":"2024-11-25 16:34:08","firstAssignedDate":"2024-11-20 17:46:59","fulfillmentDate":"2024-11-20 15:20:32","openedBy":"Steffi Pietzsch (Inactive)","openedDate":"2024-11-20","closedDate":"2025-01-21","toDoAt":"2024-12-04T18:53:10.673+0100","inUatAt":"2024-12-11T14:12:41.673+0100","jiraKey":"WFN-72","year":"2024","requestedFor":"Steffi Pietzsch (Inactive)","openedAt":"2024-11-20 15:20:27","stateChangedAt":"2025-01-21 15:20:04","stateChangedBy":"System","lastActivityAt":"2025-01-21 15:20:04","lastActivityBy":"System","_updated":"2025-01-21T12:20:04.000Z"},"RITM2276822":{"state":"Closed Complete","shortDesc":"Delete the event on Finish.com since it","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"288","currencyCode":"EUR","ttfrMinutes":1617,"clientRespMinutes":7818,"firstReplyAt":"2024-11-22 13:04:54","firstAssignedDate":"2024-11-22 13:04:54","fulfillmentDate":"2024-11-21 10:07:39","openedBy":"Alice Esposito (Inactive)","openedDate":"2024-11-21","closedDate":"2024-12-22","toDoAt":"2024-11-28T15:21:50.430+0100","inUatAt":null,"jiraKey":"WFN-73","year":"2024","requestedFor":"","openedAt":"2024-11-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-22T05:20:51.000Z"},"RITM2276961":{"state":"Closed Complete","shortDesc":"Nurofen - Fix FAQ links","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Nurofen","market":"Spain","businessUnit":"Health","finalCost":"504","currencyCode":"EUR","ttfrMinutes":5667,"clientRespMinutes":853,"firstReplyAt":"2024-11-25 09:58:13","firstAssignedDate":"2024-11-25 09:58:13","fulfillmentDate":"2024-11-21 11:31:14","openedBy":"Alba Garcia","openedDate":"2024-11-21","closedDate":"2024-12-07","toDoAt":null,"inUatAt":"2024-11-27T16:52:23.413+0100","jiraKey":"WFN-74","year":"2024","requestedFor":"Alba Garcia","openedAt":"2024-11-21 11:31:10","stateChangedAt":"2024-12-07 08:21:03","stateChangedBy":"System","lastActivityAt":"2024-11-29 10:13:16","lastActivityBy":"Alba Garcia","_updated":"2024-12-07T05:21:03.000Z"},"RITM2277074":{"state":"Closed Complete","shortDesc":"Vanish Italian Website Changes","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Vanish","market":"Italy","businessUnit":"Hygiene","finalCost":"1440","currencyCode":"EUR","ttfrMinutes":1481,"clientRespMinutes":2684,"firstReplyAt":"2024-11-22 13:24:24","firstAssignedDate":"2024-11-22 13:24:24","fulfillmentDate":"2024-11-21 12:43:17","openedBy":"Giulia Murolo","openedDate":"2024-11-21","closedDate":"2024-12-24","toDoAt":"2024-12-02T08:49:55.197+0100","inUatAt":"2024-12-05T13:34:39.480+0100","jiraKey":"WFN-75","year":"2024","requestedFor":"","openedAt":"2024-11-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-24T04:21:08.000Z"},"RITM2277362":{"state":"Closed Cancelled","shortDesc":"Update the Oh Yes! Net Zero (https://www.ohyesnetzero.co.uk/) menu and page structure.","assignedTo":"Alesya Prolagayeva","brand":"Oh Yes Net Zero","market":"United Kingdom","businessUnit":"Corporate","finalCost":"","currencyCode":"","ttfrMinutes":10017,"clientRespMinutes":null,"firstReplyAt":"2024-11-28 15:26:50","firstAssignedDate":"2024-11-28 15:26:50","fulfillmentDate":"2024-11-21 16:29:39","openedBy":"Steven Hill","openedDate":"2024-11-21","closedDate":"2025-04-22","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-76","year":"2024","requestedFor":"Steven Hill","openedAt":"2024-11-21 16:29:35","stateChangedAt":"2025-04-22 14:36:56","stateChangedBy":"System","lastActivityAt":"2025-04-07 14:21:30","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-04-22T09:36:56.000Z"},"RITM2278146":{"state":"Closed Complete","shortDesc":"Creation Promo landing page on Finishinfo.it","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":232,"clientRespMinutes":4324,"firstReplyAt":"2024-11-22 13:08:53","firstAssignedDate":"2024-11-22 13:08:53","fulfillmentDate":"2024-11-22 09:17:21","openedBy":"Federica Frascina","openedDate":"2024-11-22","closedDate":"2025-02-23","toDoAt":"2024-11-29T09:38:02.093+0100","inUatAt":"2024-12-12T11:20:22.323+0100","jiraKey":"WFN-77","year":"2024","requestedFor":"","openedAt":"2024-11-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-23T05:20:53.000Z"},"RITM2278217":{"state":"Closed Cancelled","shortDesc":"New Newsletter Pop-up for Durex.pl","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Poland","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":162,"clientRespMinutes":7027,"firstReplyAt":"2024-11-22 13:13:55","firstAssignedDate":"2024-11-22 13:13:55","fulfillmentDate":"2024-11-22 10:31:37","openedBy":"Lukasz Urzedowski","openedDate":"2024-11-22","closedDate":"2025-07-08","toDoAt":"2024-12-11T10:10:01.097+0100","inUatAt":null,"jiraKey":"WFN-78","year":"2024","requestedFor":"Lukasz Urzedowski","openedAt":"2024-11-22 10:31:34","stateChangedAt":"2025-07-08 10:59:41","stateChangedBy":"System","lastActivityAt":"2025-07-08 10:59:17","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-07-08T05:59:41.000Z"},"RITM2278492":{"state":"Closed Complete","shortDesc":"Durex - Upload PDF to landing","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Spain","businessUnit":"Health","finalCost":"144","currencyCode":"EUR","ttfrMinutes":4094,"clientRespMinutes":null,"firstReplyAt":"2024-11-25 10:58:32","firstAssignedDate":"2024-11-25 10:58:32","fulfillmentDate":"2024-11-22 14:44:40","openedBy":"Alba Garcia","openedDate":"2024-11-22","closedDate":"2024-11-29","toDoAt":"2024-11-28T15:35:26.743+0100","inUatAt":null,"jiraKey":"WFN-79","year":"2024","requestedFor":"Alba Garcia","openedAt":"2024-11-22 14:44:36","stateChangedAt":"2024-11-29 10:30:13","stateChangedBy":"System","lastActivityAt":"2024-11-29 10:30:13","lastActivityBy":"System","_updated":"2024-11-29T07:30:13.000Z"},"RITM2278580":{"state":"Closed Complete","shortDesc":"HU Finish ambassador visibility","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"120","currencyCode":"","ttfrMinutes":4032,"clientRespMinutes":581,"firstReplyAt":"2024-11-25 10:55:46","firstAssignedDate":"2024-11-25 10:55:46","fulfillmentDate":"2024-11-22 15:43:55","openedBy":"Anna Koroknay","openedDate":"2024-11-22","closedDate":"2024-12-04","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-80","year":"2024","requestedFor":"","openedAt":"2024-11-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-04T06:21:12.000Z"},"RITM2278587":{"state":"Closed Complete","shortDesc":"HU FIN website - cookie policy not working","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"120","currencyCode":"GBP","ttfrMinutes":4414,"clientRespMinutes":8101,"firstReplyAt":"2024-11-25 17:25:08","firstAssignedDate":"2024-11-25 17:24:23","fulfillmentDate":"2024-11-22 15:50:45","openedBy":"Anna Koroknay","openedDate":"2024-11-22","closedDate":"2024-12-14","toDoAt":"2024-11-28T15:39:01.167+0100","inUatAt":null,"jiraKey":"WFN-81","year":"2024","requestedFor":"","openedAt":"2024-11-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-01-20T13:45:58.000Z"},"RITM2279378":{"state":"Closed Cancelled","shortDesc":"update microsite contest changes","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Greece","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":563,"clientRespMinutes":13412,"firstReplyAt":"2024-11-25 18:01:36","firstAssignedDate":"2024-11-25 18:01:35","fulfillmentDate":"2024-11-25 08:39:00","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2024-11-25","closedDate":"2024-12-05","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-82","year":"2024","requestedFor":"Andreas Papoutsis (Inactive)","openedAt":"2024-11-25 08:38:56","stateChangedAt":"2024-12-05 16:01:18","stateChangedBy":"System","lastActivityAt":"2024-12-05 16:00:57","lastActivityBy":"Alesya Prolagayeva","_updated":"2024-12-05T13:01:18.000Z"},"RITM2279886":{"state":"Closed Cancelled","shortDesc":"Please update the CRO subpage with attached cookie-policy and activate the website","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":4487,"clientRespMinutes":null,"firstReplyAt":"2024-11-28 17:23:46","firstAssignedDate":"2024-11-28 17:23:46","fulfillmentDate":"2024-11-25 14:37:04","openedBy":"Anna Koroknay","openedDate":"2024-11-25","closedDate":"2024-12-02","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-83","year":"2024","requestedFor":"Anna Koroknay","openedAt":"2024-11-25 14:37:01","stateChangedAt":"2024-12-02 09:42:03","stateChangedBy":"System","lastActivityAt":"2024-11-29 10:29:08","lastActivityBy":"Anna Koroknay","_updated":"2024-12-02T06:42:03.000Z"},"RITM2279937":{"state":"Closed Cancelled","shortDesc":"Please add SLO subpage the enclosed cookie-policy and activate it","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":4457,"clientRespMinutes":null,"firstReplyAt":"2024-11-28 17:22:52","firstAssignedDate":"2024-11-28 17:22:52","fulfillmentDate":"2024-11-25 15:06:12","openedBy":"Anna Koroknay","openedDate":"2024-11-25","closedDate":"2024-12-02","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-84","year":"2024","requestedFor":"Anna Koroknay","openedAt":"2024-11-25 15:06:08","stateChangedAt":"2024-12-02 09:57:53","stateChangedBy":"System","lastActivityAt":"2024-11-29 09:48:18","lastActivityBy":"Anna Koroknay","_updated":"2024-12-02T06:57:53.000Z"},"RITM2279967":{"state":"Closed Cancelled","shortDesc":"Fin KOS cookie-policy","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":4432,"clientRespMinutes":77,"firstReplyAt":"2024-11-28 17:21:15","firstAssignedDate":"2024-11-28 17:21:15","fulfillmentDate":"2024-11-25 15:29:28","openedBy":"Anna Koroknay","openedDate":"2024-11-25","closedDate":"2024-11-28","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-85","year":"2024","requestedFor":"Anna Koroknay","openedAt":"2024-11-25 15:29:24","stateChangedAt":"2024-11-28 17:20:03","stateChangedBy":"System","lastActivityAt":"2024-11-28 17:21:15","lastActivityBy":"Alesya Prolagayeva","_updated":"2024-11-28T14:21:14.000Z"},"RITM2280140":{"state":"Closed Complete","shortDesc":"Integrate 4 new articles on the website","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"France","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":30,"clientRespMinutes":5075,"firstReplyAt":"2024-11-25 18:12:26","firstAssignedDate":"2024-11-25 18:12:26","fulfillmentDate":"2024-11-25 17:42:55","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2024-11-25","closedDate":"2025-02-01","toDoAt":"2025-01-08T13:44:06.723+0100","inUatAt":"2025-01-09T19:49:35.310+0100","jiraKey":"WFN-86","year":"2024","requestedFor":"","openedAt":"2024-11-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-01T15:20:51.000Z"},"RITM2280951":{"state":"Closed Cancelled","shortDesc":"i","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Italy","businessUnit":"Health","finalCost":"1440","currencyCode":"EUR","ttfrMinutes":11564,"clientRespMinutes":16207,"firstReplyAt":"2024-12-04 12:44:41","firstAssignedDate":"2024-11-28 15:50:21","fulfillmentDate":"2024-11-26 12:00:30","openedBy":"Jacopo Ghislanzoni (Inactive)","openedDate":"2024-11-26","closedDate":"2026-04-09","toDoAt":"2025-02-28T07:46:02.227+0100","inUatAt":"2025-04-09T09:44:16.130+0200","jiraKey":"WFN-90","year":"2024","requestedFor":"Jacopo Ghislanzoni (Inactive)","openedAt":"2024-11-26 12:00:16","stateChangedAt":"2026-04-09 06:18:06","stateChangedBy":"Swechcha Sharma","lastActivityAt":"2025-04-08 13:49:54","lastActivityBy":"Herman Bykanov (Inactive)","_updated":"2026-04-09T01:18:06.000Z"},"RITM2281307":{"state":"Closed Complete","shortDesc":"Vanish BR - Content creation for 1 new URL","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Brazil","businessUnit":"Hygiene","finalCost":"6000","currencyCode":"MXN","ttfrMinutes":8466,"clientRespMinutes":null,"firstReplyAt":"2024-12-02 13:24:49","firstAssignedDate":"2024-12-02 13:24:49","fulfillmentDate":"2024-11-26 16:18:25","openedBy":"Ricardo Monteiro","openedDate":"2024-11-26","closedDate":"2025-04-12","toDoAt":"2024-12-24T10:45:48.227+0100","inUatAt":"2025-01-13T14:14:07.677+0100","jiraKey":"WFN-89","year":"2024","requestedFor":"Ricardo Monteiro","openedAt":"2024-11-26 16:18:22","stateChangedAt":"2025-04-12 14:20:54","stateChangedBy":"System","lastActivityAt":"2025-04-04 08:58:01","lastActivityBy":"Anna Tyborska (Inactive)","_updated":"2025-04-12T09:20:54.000Z"},"RITM2282169":{"state":"Closed Complete","shortDesc":"Changing name of one section on website and adding new subsection page and changing Strepsils Intensive bez cukru pomarańczowy packshot","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Poland","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1733,"clientRespMinutes":1454,"firstReplyAt":"2024-11-28 17:07:31","firstAssignedDate":"2024-11-28 16:03:09","fulfillmentDate":"2024-11-27 12:14:35","openedBy":"Anna Pieczkowska","openedDate":"2024-11-27","closedDate":"2025-01-13","toDoAt":"2024-12-02T10:57:05.133+0100","inUatAt":"2024-12-04T10:31:51.643+0100","jiraKey":"WFN-92","year":"2024","requestedFor":"","openedAt":"2024-11-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-01-13T11:21:06.000Z"},"RITM2282424":{"state":"Closed Complete","shortDesc":"Gyurta Danial - YT video insertion removal","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"120","currencyCode":"","ttfrMinutes":2464,"clientRespMinutes":240,"firstReplyAt":"2024-11-29 08:39:17","firstAssignedDate":"2024-11-28 16:05:35","fulfillmentDate":"2024-11-27 15:35:42","openedBy":"Anna Koroknay","openedDate":"2024-11-27","closedDate":"2024-12-07","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-93","year":"2024","requestedFor":"","openedAt":"2024-11-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-07T08:20:52.000Z"},"RITM2287118":{"state":"Closed Complete","shortDesc":"Galieve website changes","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Denmark","businessUnit":"Health","finalCost":"600","currencyCode":"GBP","ttfrMinutes":31,"clientRespMinutes":3751,"firstReplyAt":"2024-12-03 11:05:31","firstAssignedDate":"2024-12-03 11:05:31","fulfillmentDate":"2024-12-03 10:34:17","openedBy":"Federico Mirandola (Inactive)","openedDate":"2024-12-03","closedDate":"2025-09-14","toDoAt":"2025-01-23T09:40:46.717+0100","inUatAt":"2025-02-17T19:14:54.643+0100","jiraKey":"WFN-94","year":"2024","requestedFor":"Federico Mirandola (Inactive)","openedAt":"2024-12-03 10:34:12","stateChangedAt":"2025-09-14 17:21:00","stateChangedBy":"System","lastActivityAt":"2025-09-09 16:31:13","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-09-14T12:21:00.000Z"},"RITM2287252":{"state":"Closed Complete","shortDesc":"Website changes","assignedTo":"Alesya Prolagayeva","brand":"StMarcs","market":"France","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":137,"clientRespMinutes":5664,"firstReplyAt":"2024-12-03 14:22:09","firstAssignedDate":"2024-12-03 13:14:12","fulfillmentDate":"2024-12-03 12:05:06","openedBy":"Julie Duquennoy","openedDate":"2024-12-03","closedDate":"2025-02-17","toDoAt":"2025-01-06T09:30:00.343+0100","inUatAt":"2025-01-29T14:08:58.653+0100","jiraKey":"WFN-95","year":"2024","requestedFor":"","openedAt":"2024-12-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-17T07:20:54.000Z"},"RITM2287475":{"state":"Closed Complete","shortDesc":"Error loading pages / change name","assignedTo":"Herman Bykanov (Inactive)","brand":"Durex","market":"Brazil","businessUnit":"Health","finalCost":"24000","currencyCode":"MXN","ttfrMinutes":2574,"clientRespMinutes":11779,"firstReplyAt":"2024-12-05 10:16:25","firstAssignedDate":"2024-12-05 10:16:25","fulfillmentDate":"2024-12-03 15:22:30","openedBy":"Ricardo Leonardo","openedDate":"2024-12-03","closedDate":"2025-04-09","toDoAt":"2025-02-14T11:32:00.247+0100","inUatAt":"2025-02-25T10:21:42.773+0100","jiraKey":"WFN-100","year":"2024","requestedFor":"Ricardo Leonardo","openedAt":"2024-12-03 15:22:27","stateChangedAt":"2025-04-09 19:20:54","stateChangedBy":"System","lastActivityAt":"2025-03-14 09:54:05","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2025-04-09T14:20:54.000Z"},"RITM2288252":{"state":"Closed Complete","shortDesc":"Update contest asset on brand site","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Air Wick","market":"Italy","businessUnit":"Hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2885,"clientRespMinutes":7805,"firstReplyAt":"2024-12-06 10:59:41","firstAssignedDate":"2024-12-06 10:59:41","fulfillmentDate":"2024-12-04 10:54:24","openedBy":"Serena Puccini (Inactive)","openedDate":"2024-12-04","closedDate":"2025-02-19","toDoAt":"2024-12-09T12:49:53.927+0100","inUatAt":"2024-12-20T11:43:26.063+0100","jiraKey":"WFN-102","year":"2024","requestedFor":"","openedAt":"2024-12-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-19T05:21:17.000Z"},"RITM2288481":{"state":"Closed Complete","shortDesc":"Change of texts and graphics on one subpage","assignedTo":"Alesya Prolagayeva","brand":"Lovela","market":"Poland","businessUnit":"Hygiene","finalCost":"120","currencyCode":"GBP","ttfrMinutes":329,"clientRespMinutes":953,"firstReplyAt":"2024-12-04 18:43:52","firstAssignedDate":"2024-12-04 18:43:52","fulfillmentDate":"2024-12-04 13:14:57","openedBy":"Natalia Steinert","openedDate":"2024-12-04","closedDate":"2025-01-13","toDoAt":"2024-12-04T18:44:19.187+0100","inUatAt":"2024-12-09T18:32:10.233+0100","jiraKey":"WFN-98","year":"2024","requestedFor":"","openedAt":"2024-12-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-01-13T11:20:59.000Z"},"RITM2288554":{"state":"Closed Complete","shortDesc":"Change URL, title and eliminate access to home","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Spain","businessUnit":"Health","finalCost":"720","currencyCode":"EUR","ttfrMinutes":2680,"clientRespMinutes":1173,"firstReplyAt":"2024-12-06 10:56:26","firstAssignedDate":"2024-12-06 10:56:26","fulfillmentDate":"2024-12-04 14:16:04","openedBy":"Debora De Sa Tavares (Inactive)","openedDate":"2024-12-04","closedDate":"2024-12-22","toDoAt":"2024-12-11T10:12:16.237+0100","inUatAt":null,"jiraKey":"WFN-101","year":"2024","requestedFor":"Debora De Sa Tavares (Inactive)","openedAt":"2024-12-04 14:15:59","stateChangedAt":"2024-12-22 08:20:53","stateChangedBy":"System","lastActivityAt":"2024-12-16 16:30:25","lastActivityBy":"Debora De Sa Tavares (Inactive)","_updated":"2024-12-22T05:20:53.000Z"},"RITM2288579":{"state":"Closed Complete","shortDesc":"Nurofen.ro Website | Product Search Filters","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Romania","businessUnit":"Health","finalCost":"1350","currencyCode":"GBP","ttfrMinutes":1585,"clientRespMinutes":6435,"firstReplyAt":"2024-12-05 16:59:39","firstAssignedDate":"2024-12-04 17:55:23","fulfillmentDate":"2024-12-04 14:34:37","openedBy":"Ana-Maria Mocanu (Inactive)","openedDate":"2024-12-04","closedDate":"2025-03-24","toDoAt":"2024-12-17T13:11:32.480+0100","inUatAt":"2025-02-03T11:27:03.267+0100","jiraKey":"WFN-97","year":"2024","requestedFor":"","openedAt":"2024-12-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-24T14:20:51.000Z"},"RITM2288640":{"state":"Closed Complete","shortDesc":"New T&C on a existing page","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2619,"clientRespMinutes":6135,"firstReplyAt":"2024-12-06 11:08:05","firstAssignedDate":"2024-12-06 11:08:05","fulfillmentDate":"2024-12-04 15:28:43","openedBy":"Sofia Pallaro","openedDate":"2024-12-04","closedDate":"2025-01-25","toDoAt":"2024-12-10T09:45:09.480+0100","inUatAt":"2024-12-13T17:17:44.647+0100","jiraKey":"WFN-103","year":"2024","requestedFor":"","openedAt":"2024-12-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-01-25T05:20:59.000Z"},"RITM2288653":{"state":"Closed Complete","shortDesc":"Continuing the ticket RITM2282102","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":23,"clientRespMinutes":2683,"firstReplyAt":"2024-12-04 16:06:03","firstAssignedDate":"2024-12-04 16:06:03","fulfillmentDate":"2024-12-04 15:42:46","openedBy":"Alice Esposito (Inactive)","openedDate":"2024-12-04","closedDate":"2024-12-15","toDoAt":"2024-12-04T16:10:06.143+0100","inUatAt":null,"jiraKey":"WFN-96","year":"2024","requestedFor":"","openedAt":"2024-12-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2024-12-15T09:21:12.000Z"},"RITM2288843":{"state":"Closed Complete","shortDesc":"Veja product hide","assignedTo":"Alesya Prolagayeva","brand":"Veja","market":"Brazil","businessUnit":"Hygiene","finalCost":"6667","currencyCode":"MXN","ttfrMinutes":871,"clientRespMinutes":13568,"firstReplyAt":"2024-12-05 10:10:40","firstAssignedDate":"2024-12-05 10:10:40","fulfillmentDate":"2024-12-04 19:39:26","openedBy":"Ricardo Leonardo","openedDate":"2024-12-04","closedDate":"2025-10-26","toDoAt":"2024-12-12T21:01:29.810+0100","inUatAt":"2025-01-16T09:56:48.940+0100","jiraKey":"WFN-99","year":"2024","requestedFor":"Ricardo Leonardo","openedAt":"2024-12-04 19:39:22","stateChangedAt":"2025-10-26 13:20:52","stateChangedBy":"System","lastActivityAt":"2025-10-16 22:46:49","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-10-26T10:20:52.000Z"},"RITM2289452":{"state":"Closed Complete","shortDesc":"Nurofen UK - Body Pain - WFD-625","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"United Kingdom","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":17304,"clientRespMinutes":19079,"firstReplyAt":"2024-12-17 13:23:36","firstAssignedDate":"2024-12-11 12:34:02","fulfillmentDate":"2024-12-05 12:59:44","openedBy":"Rowena Hearn","openedDate":"2024-12-05","closedDate":"2025-05-27","toDoAt":"2024-12-12T09:39:23.147+0100","inUatAt":"2025-01-09T09:37:01.897+0100","jiraKey":"WFN-109","year":"2024","requestedFor":"","openedAt":"2024-12-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-27T13:21:08.000Z"},"RITM2289951":{"state":"Closed Cancelled","shortDesc":"Upload new content","assignedTo":"","brand":"Strepsils","market":"Mexico","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":218431,"clientRespMinutes":705,"firstReplyAt":"2025-05-06 16:13:16","firstAssignedDate":"2025-05-05 14:49:17","fulfillmentDate":"2024-12-05 22:42:26","openedBy":"Mariana Onofre Castro","openedDate":"2024-12-05","closedDate":"2025-08-13","toDoAt":"2025-05-07T12:06:02.460+0200","inUatAt":null,"jiraKey":"WFN-293","year":"2024","requestedFor":"Mariana Onofre Castro","openedAt":"2024-12-05 22:42:22","stateChangedAt":"2025-08-13 08:23:43","stateChangedBy":"Mariana Onofre Castro","lastActivityAt":"2025-08-13 08:23:43","lastActivityBy":"Mariana Onofre Castro","_updated":"2025-08-13T03:23:43.000Z"},"RITM2289956":{"state":"Closed Cancelled","shortDesc":"Mobile friendly","assignedTo":"","brand":"Strepsils","market":"Mexico","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":218409,"clientRespMinutes":null,"firstReplyAt":"2025-05-06 16:23:57","firstAssignedDate":"2025-05-05 14:49:39","fulfillmentDate":"2024-12-05 23:15:12","openedBy":"Mariana Onofre Castro","openedDate":"2024-12-05","closedDate":"2025-08-13","toDoAt":"2025-06-17T09:36:46.443+0200","inUatAt":null,"jiraKey":"WFN-295","year":"2024","requestedFor":"Mariana Onofre Castro","openedAt":"2024-12-05 23:15:08","stateChangedAt":"2025-08-13 08:24:52","stateChangedBy":"Mariana Onofre Castro","lastActivityAt":"2025-08-13 08:24:52","lastActivityBy":"Mariana Onofre Castro","_updated":"2025-08-13T03:24:52.000Z"},"RITM2289960":{"state":"Closed Cancelled","shortDesc":"Develop PDP Graneodín F Spray","assignedTo":"","brand":"Strepsils","market":"Mexico","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":218401,"clientRespMinutes":null,"firstReplyAt":"2025-05-06 16:51:01","firstAssignedDate":"2025-05-05 14:50:08","fulfillmentDate":"2024-12-05 23:49:36","openedBy":"Mariana Onofre Castro","openedDate":"2024-12-05","closedDate":"2025-08-13","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-291","year":"2024","requestedFor":"Mariana Onofre Castro","openedAt":"2024-12-05 23:49:34","stateChangedAt":"2025-08-13 08:25:48","stateChangedBy":"Mariana Onofre Castro","lastActivityAt":"2025-08-13 08:25:47","lastActivityBy":"Mariana Onofre Castro","_updated":"2025-08-13T03:25:47.000Z"},"RITM2291756":{"state":"Closed Complete","shortDesc":"Durex Website: Safety Report new web link","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Durex","market":"Portugal","businessUnit":"Health","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1552,"clientRespMinutes":5875,"firstReplyAt":"2024-12-10 13:12:14","firstAssignedDate":"2024-12-10 13:12:14","fulfillmentDate":"2024-12-09 11:19:52","openedBy":"Francisco Faria (Inactive)","openedDate":"2024-12-09","closedDate":"2025-02-19","toDoAt":null,"inUatAt":"2025-02-04T15:16:45.627+0100","jiraKey":"WFN-107","year":"2024","requestedFor":"Francisco Faria (Inactive)","openedAt":"2024-12-09 11:19:48","stateChangedAt":"2025-02-19 08:21:17","stateChangedBy":"System","lastActivityAt":"2025-02-11 16:14:42","lastActivityBy":"Francisco Faria (Inactive)","_updated":"2025-02-19T05:21:17.000Z"},"RITM2292030":{"state":"Closed Complete","shortDesc":"Dobendan DE - Mockingjay","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Germany","businessUnit":"Health","finalCost":"4000","currencyCode":"GBP","ttfrMinutes":1482,"clientRespMinutes":8053,"firstReplyAt":"2024-12-10 15:51:19","firstAssignedDate":"2024-12-09 18:15:44","fulfillmentDate":"2024-12-09 15:09:34","openedBy":"Rowena Hearn","openedDate":"2024-12-09","closedDate":"2025-05-27","toDoAt":"2025-01-29T13:42:41.353+0100","inUatAt":"2025-02-10T10:11:25.537+0100","jiraKey":"WFN-106","year":"2024","requestedFor":"Rowena Hearn","openedAt":"2024-12-09 15:09:28","stateChangedAt":"2025-05-27 18:21:05","stateChangedBy":"System","lastActivityAt":"2025-05-22 17:51:03","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-09-17T04:47:57.000Z"},"RITM2293120":{"state":"Closed Complete","shortDesc":"update articles on Veet website","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Veet","market":"Italy","businessUnit":"Health","finalCost":"360","currencyCode":"EUR","ttfrMinutes":4008,"clientRespMinutes":10363,"firstReplyAt":"2024-12-13 07:16:38","firstAssignedDate":"2024-12-10 15:56:12","fulfillmentDate":"2024-12-10 12:29:06","openedBy":"Alice Vaccaro","openedDate":"2024-12-10","closedDate":"2025-02-19","toDoAt":"2024-12-17T09:57:39.313+0100","inUatAt":"2025-02-05T10:04:50.020+0100","jiraKey":"WFN-108","year":"2024","requestedFor":"","openedAt":"2024-12-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-19T05:21:20.000Z"},"RITM2294092":{"state":"Closed Complete","shortDesc":"Gaviscon UK - Article build","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"United Kingdom","businessUnit":"Health","finalCost":"3000","currencyCode":"GBP","ttfrMinutes":10057,"clientRespMinutes":5703,"firstReplyAt":"2024-12-18 10:13:44","firstAssignedDate":"2024-12-11 12:33:24","fulfillmentDate":"2024-12-11 10:36:33","openedBy":"Rowena Hearn","openedDate":"2024-12-11","closedDate":"2025-04-16","toDoAt":"2024-12-11T17:25:14.380+0100","inUatAt":"2024-12-20T17:45:22.133+0100","jiraKey":"WFN-110","year":"2024","requestedFor":"","openedAt":"2024-12-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-20T13:00:14.000Z"},"RITM2294676":{"state":"Closed Complete","shortDesc":"Artcile Addition","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1164,"clientRespMinutes":2974,"firstReplyAt":"2024-12-12 12:56:00","firstAssignedDate":"2024-12-11 17:38:30","fulfillmentDate":"2024-12-11 17:32:01","openedBy":"Xanthi Skorda","openedDate":"2024-12-11","closedDate":"2025-01-16","toDoAt":"2024-12-17T13:25:00.827+0100","inUatAt":"2024-12-18T15:29:23.657+0100","jiraKey":"WFN-111","year":"2024","requestedFor":"","openedAt":"2024-12-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-01-16T09:30:06.000Z"},"RITM2296456":{"state":"Closed Complete","shortDesc":"We want to update our product pages in our website.","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Turkey","businessUnit":"Hygiene","finalCost":"900","currencyCode":"GBP","ttfrMinutes":1922,"clientRespMinutes":4830,"firstReplyAt":"2024-12-13 16:13:35","firstAssignedDate":"2024-12-12 12:57:49","fulfillmentDate":"2024-12-12 08:11:15","openedBy":"Kaan Soylu (Inactive)","openedDate":"2024-12-12","closedDate":"2025-01-22","toDoAt":"2024-12-19T17:55:40.057+0100","inUatAt":"2025-01-08T13:50:20.697+0100","jiraKey":"WFN-112","year":"2024","requestedFor":"","openedAt":"2024-12-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-01-22T12:21:27.000Z"},"RITM2297097":{"state":"Closed Complete","shortDesc":"We want to upload new articles with their images to our website.","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Turkey","businessUnit":"Hygiene","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":8383,"clientRespMinutes":4461,"firstReplyAt":"2024-12-18 11:44:33","firstAssignedDate":"2024-12-18 11:00:58","fulfillmentDate":"2024-12-12 16:01:17","openedBy":"Kaan Soylu (Inactive)","openedDate":"2024-12-12","closedDate":"2025-01-22","toDoAt":"2024-12-20T14:33:46.797+0100","inUatAt":"2024-12-27T09:33:24.743+0100","jiraKey":"WFN-119","year":"2024","requestedFor":"","openedAt":"2024-12-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-03T08:39:53.000Z"},"RITM2297902":{"state":"Closed Cancelled","shortDesc":"Articles publishing","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Nurofen","market":"Italy","businessUnit":"Health","finalCost":"1484","currencyCode":"EUR","ttfrMinutes":7364,"clientRespMinutes":7192,"firstReplyAt":"2024-12-18 11:52:26","firstAssignedDate":"2024-12-18 11:46:49","fulfillmentDate":"2024-12-13 09:08:22","openedBy":"Sara Fierro","openedDate":"2024-12-13","closedDate":"2025-07-24","toDoAt":"2025-03-14T08:45:22.673+0100","inUatAt":"2025-06-11T10:07:20.367+0200","jiraKey":"WFN-120","year":"2024","requestedFor":"Sara Fierro","openedAt":"2024-12-13 09:08:19","stateChangedAt":"2025-07-24 20:03:30","stateChangedBy":"Sara Fierro","lastActivityAt":"2025-07-24 20:03:29","lastActivityBy":"Sara Fierro","_updated":"2025-07-24T15:03:29.000Z"},"RITM2298374":{"state":"Closed Complete","shortDesc":"Website communication Update","assignedTo":"Alesya Prolagayeva","brand":"Dobendan","market":"Germany","businessUnit":"Health","finalCost":"1320","currencyCode":"GBP","ttfrMinutes":5500,"clientRespMinutes":4776,"firstReplyAt":"2024-12-17 09:43:11","firstAssignedDate":"2024-12-17 09:43:11","fulfillmentDate":"2024-12-13 14:03:03","openedBy":"Nadija Sejaric","openedDate":"2024-12-13","closedDate":"2025-05-27","toDoAt":"2025-01-23T10:01:16.040+0100","inUatAt":"2025-02-28T08:09:00.143+0100","jiraKey":"WFN-115","year":"2024","requestedFor":"Nadija Sejaric","openedAt":"2024-12-13 14:02:58","stateChangedAt":"2025-05-27 13:21:04","stateChangedBy":"System","lastActivityAt":"2025-05-22 12:22:53","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-05-27T08:21:04.000Z"},"RITM2299463":{"state":"Closed Complete","shortDesc":"Cancel Cashback redirection","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Romania","businessUnit":"Hygiene","finalCost":"120","currencyCode":"GBP","ttfrMinutes":220,"clientRespMinutes":3057,"firstReplyAt":"2024-12-16 15:02:51","firstAssignedDate":"2024-12-16 15:02:51","fulfillmentDate":"2024-12-16 11:22:29","openedBy":"Ioana Ungureanu (Inactive)","openedDate":"2024-12-16","closedDate":"2024-12-29","toDoAt":"2024-12-17T13:27:30.100+0100","inUatAt":"2024-12-17T15:31:46.283+0100","jiraKey":"WFN-114","year":"2024","requestedFor":"","openedAt":"2024-12-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-01-09T06:30:07.000Z"},"RITM2299711":{"state":"Closed Complete","shortDesc":"Change on the site","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":2491,"clientRespMinutes":4674,"firstReplyAt":"2024-12-18 07:57:38","firstAssignedDate":"2024-12-18 07:57:38","fulfillmentDate":"2024-12-16 14:26:17","openedBy":"Maria Papagiannea","openedDate":"2024-12-16","closedDate":"2025-02-04","toDoAt":"2024-12-23T11:13:19.767+0100","inUatAt":"2024-12-24T16:07:56.943+0100","jiraKey":"WFN-118","year":"2024","requestedFor":"","openedAt":"2024-12-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-04T10:50:06.000Z"},"RITM2300059":{"state":"Closed Complete","shortDesc":"need to update and remove banner in Veet italy website","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Veet","market":"Italy","businessUnit":"Health","finalCost":"504","currencyCode":"EUR","ttfrMinutes":2301,"clientRespMinutes":3596,"firstReplyAt":"2024-12-18 07:54:06","firstAssignedDate":"2024-12-18 07:54:06","fulfillmentDate":"2024-12-16 17:32:47","openedBy":"Alice Vaccaro","openedDate":"2024-12-16","closedDate":"2025-02-19","toDoAt":"2024-12-20T07:38:35.017+0100","inUatAt":"2025-02-07T18:45:38.990+0100","jiraKey":"WFN-117","year":"2024","requestedFor":"","openedAt":"2024-12-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-19T04:21:02.000Z"},"RITM2300100":{"state":"Closed Cancelled","shortDesc":"Articles Preview and Cost Estimate","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Nurofen","market":"Italy","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":12482,"clientRespMinutes":1156,"firstReplyAt":"2024-12-25 10:09:21","firstAssignedDate":"2024-12-18 11:52:01","fulfillmentDate":"2024-12-16 18:07:52","openedBy":"Sara Fierro","openedDate":"2024-12-16","closedDate":"2025-05-13","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-125","year":"2024","requestedFor":"Sara Fierro","openedAt":"2024-12-16 18:07:49","stateChangedAt":"2025-05-13 09:40:45","stateChangedBy":"Dmitry Koziyev (Inactive)","lastActivityAt":"2025-05-13 09:40:45","lastActivityBy":"Dmitry Koziyev (Inactive)","_updated":"2025-05-13T04:40:45.000Z"},"RITM2301170":{"state":"Closed Complete","shortDesc":"Remove page","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Brazil","businessUnit":"Hygiene","finalCost":"2667","currencyCode":"MXN","ttfrMinutes":14,"clientRespMinutes":2184,"firstReplyAt":"2024-12-17 15:57:12","firstAssignedDate":"2024-12-17 15:52:28","fulfillmentDate":"2024-12-17 15:42:47","openedBy":"Ricardo Leonardo","openedDate":"2024-12-17","closedDate":"2025-01-13","toDoAt":"2024-12-17T15:56:40.737+0100","inUatAt":"2024-12-18T10:47:55.200+0100","jiraKey":"WFN-116","year":"2024","requestedFor":"Ricardo Leonardo","openedAt":"2024-12-17 15:42:44","stateChangedAt":"2025-01-13 14:21:00","stateChangedBy":"System","lastActivityAt":"2025-10-31 19:31:19","lastActivityBy":"Damian Casasnovas","_updated":"2025-10-31T16:31:19.000Z"},"RITM2301908":{"state":"Closed Complete","shortDesc":"Microsite Update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Greece","businessUnit":"Hygiene","finalCost":"600","currencyCode":"GBP","ttfrMinutes":172,"clientRespMinutes":4612,"firstReplyAt":"2024-12-18 12:07:16","firstAssignedDate":"2024-12-18 11:55:53","fulfillmentDate":"2024-12-18 09:15:42","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2024-12-18","closedDate":"2025-01-22","toDoAt":"2024-12-23T13:16:14.483+0100","inUatAt":"2025-01-02T10:19:27.893+0100","jiraKey":"WFN-121","year":"2024","requestedFor":"","openedAt":"2024-12-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-01-22T12:21:11.000Z"},"RITM2303574":{"state":"Closed Complete","shortDesc":"Update contest page text for 2025","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Air Wick","market":"Italy","businessUnit":"Hygiene","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1584,"clientRespMinutes":4361,"firstReplyAt":"2024-12-20 15:09:51","firstAssignedDate":"2024-12-20 15:09:51","fulfillmentDate":"2024-12-19 12:46:05","openedBy":"Serena Puccini (Inactive)","openedDate":"2024-12-19","closedDate":"2025-02-19","toDoAt":null,"inUatAt":"2025-01-03T09:37:47.200+0100","jiraKey":"WFN-122","year":"2024","requestedFor":"","openedAt":"2024-12-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-19T05:20:58.000Z"},"RITM2305471":{"state":"Closed Cancelled","shortDesc":"Test \"encuentra tu producto\" doesn","assignedTo":"","brand":"Strepsils","market":"Mexico","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":197033,"clientRespMinutes":null,"firstReplyAt":"2025-05-06 16:27:16","firstAssignedDate":"2025-05-05 14:50:27","fulfillmentDate":"2024-12-20 19:34:48","openedBy":"Mariana Onofre Castro","openedDate":"2024-12-20","closedDate":"2025-08-13","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-294","year":"2024","requestedFor":"Mariana Onofre Castro","openedAt":"2024-12-20 19:34:43","stateChangedAt":"2025-08-13 08:22:45","stateChangedBy":"Mariana Onofre Castro","lastActivityAt":"2025-08-13 08:22:45","lastActivityBy":"Mariana Onofre Castro","_updated":"2025-08-13T03:22:45.000Z"},"RITM2305521":{"state":"Closed Complete","shortDesc":"Update images in Soft lube","assignedTo":"Renata Probst Martínez","brand":"Sico","market":"Mexico","businessUnit":null,"finalCost":"","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":null,"firstAssignedDate":null,"fulfillmentDate":null,"openedBy":null,"openedDate":null,"closedDate":null,"toDoAt":null,"inUatAt":null,"jiraKey":null,"year":null,"requestedFor":"Mariana Onofre Castro","openedAt":"2024-12-20 21:12:44","stateChangedAt":"2025-01-08 21:20:55","stateChangedBy":"System","lastActivityAt":"","lastActivityBy":"","_updated":"2025-01-08T18:20:55.000Z"},"RITM2306265":{"state":"Closed Complete","shortDesc":"Website Changes Veet","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Veet","market":"Portugal","businessUnit":"Health","finalCost":"288","currencyCode":"EUR","ttfrMinutes":30438,"clientRespMinutes":4684,"firstReplyAt":"2025-01-13 13:59:43","firstAssignedDate":"2024-12-23 14:04:52","fulfillmentDate":"2024-12-23 10:41:33","openedBy":"Francisco Faria (Inactive)","openedDate":"2024-12-23","closedDate":"2025-10-20","toDoAt":"2025-02-03T12:50:56.890+0100","inUatAt":"2025-02-03T13:15:44.897+0100","jiraKey":"WFN-123","year":"2024","requestedFor":"Francisco Faria (Inactive)","openedAt":"2024-12-23 10:41:29","stateChangedAt":"2025-10-20 19:20:51","stateChangedBy":"System","lastActivityAt":"2025-10-01 15:43:21","lastActivityBy":"Martim Martins (Inactive)","_updated":"2025-10-20T14:20:51.000Z"},"RITM2306301":{"state":"Closed Complete","shortDesc":"Strepsils PT - WFD-1688","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"United Kingdom","businessUnit":"Health","finalCost":"0","currencyCode":"","ttfrMinutes":16037,"clientRespMinutes":12232,"firstReplyAt":"2025-01-03 14:41:28","firstAssignedDate":"2025-01-03 14:41:28","fulfillmentDate":"2024-12-23 11:25:02","openedBy":"Rowena Hearn","openedDate":"2024-12-23","closedDate":"2025-10-28","toDoAt":"2025-01-23T09:58:40.487+0100","inUatAt":"2025-01-28T10:00:07.177+0100","jiraKey":"WFN-137","year":"2024","requestedFor":"Rowena Hearn","openedAt":"2024-12-23 11:24:58","stateChangedAt":"2025-10-28 17:20:52","stateChangedBy":"System","lastActivityAt":"2025-10-23 17:58:32","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-10-28T14:20:52.000Z"},"RITM2306355":{"state":"Closed Complete","shortDesc":"Strepsils UK - WFD-1971","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"United Kingdom","businessUnit":"Health","finalCost":"200","currencyCode":"GBP","ttfrMinutes":15982,"clientRespMinutes":3971,"firstReplyAt":"2025-01-03 14:47:17","firstAssignedDate":"2025-01-03 14:47:17","fulfillmentDate":"2024-12-23 12:25:49","openedBy":"Rowena Hearn","openedDate":"2024-12-23","closedDate":"2025-09-14","toDoAt":"2025-01-03T12:19:46.453+0100","inUatAt":"2025-01-13T14:13:13.723+0100","jiraKey":"WFN-127","year":"2024","requestedFor":"","openedAt":"2024-12-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-17T04:49:24.000Z"},"RITM2306622":{"state":"Closed Complete","shortDesc":"Finish Website Urgent Fixes","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Canada","businessUnit":"Hygiene","finalCost":"600","currencyCode":"GBP","ttfrMinutes":55,"clientRespMinutes":3860,"firstReplyAt":"2024-12-23 18:06:20","firstAssignedDate":"2024-12-23 18:06:20","fulfillmentDate":"2024-12-23 17:11:51","openedBy":"Nadine Evans","openedDate":"2024-12-23","closedDate":"2025-02-01","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-124","year":"2024","requestedFor":"Nadine Evans","openedAt":"2024-12-23 17:11:48","stateChangedAt":"2025-02-01 19:20:52","stateChangedBy":"System","lastActivityAt":"2025-01-27 18:42:18","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-02-01T16:20:52.000Z"},"RITM2307106":{"state":"Closed Complete","shortDesc":"Nurofen For Children UK UX Changes","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Ireland","businessUnit":"Health","finalCost":"3600","currencyCode":"GBP","ttfrMinutes":14658,"clientRespMinutes":6763,"firstReplyAt":"2025-01-03 14:45:34","firstAssignedDate":"2025-01-03 14:45:34","fulfillmentDate":"2024-12-24 10:28:01","openedBy":"Rowena Hearn","openedDate":"2024-12-24","closedDate":"2026-01-17","toDoAt":"2025-01-20T14:03:01.490+0100","inUatAt":"2025-02-03T11:27:21.853+0100","jiraKey":"WFN-140","year":"2024","requestedFor":"","openedAt":"2024-12-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-17T14:20:51.000Z"},"RITM2312558":{"state":"Closed Complete","shortDesc":"Nurofen UK - Cold & Flu Hub","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"United Kingdom","businessUnit":"Health","finalCost":"1600","currencyCode":"GBP","ttfrMinutes":4626,"clientRespMinutes":7368,"firstReplyAt":"2025-01-09 17:10:56","firstAssignedDate":"2025-01-06 12:29:02","fulfillmentDate":"2025-01-06 12:05:01","openedBy":"Rowena Hearn","openedDate":"2025-01-06","closedDate":"2026-06-20","toDoAt":"2025-01-20T15:32:03.160+0100","inUatAt":"2025-03-17T14:51:17.600+0100","jiraKey":"WFN-129","year":"2025","requestedFor":"Rowena Hearn","openedAt":"2025-01-06 12:04:57","stateChangedAt":"2026-06-20 16:21:31","stateChangedBy":"System","lastActivityAt":"2026-06-15 15:55:55","lastActivityBy":"Rowena Hearn","_updated":"2026-06-20T11:21:30.000Z"},"RITM2314425":{"state":"Closed Complete","shortDesc":"Lysol MX image product update","assignedTo":"Alesya Prolagayeva","brand":"Lysol","market":"Mexico","businessUnit":"Hygiene","finalCost":"2400","currencyCode":"MXN","ttfrMinutes":31570,"clientRespMinutes":12953,"firstReplyAt":"2025-01-29 15:39:01","firstAssignedDate":"2025-01-29 14:10:05","fulfillmentDate":"2025-01-07 17:29:09","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2025-01-07","closedDate":"2025-04-12","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2025-01-07 17:29:06","stateChangedAt":"2025-04-12 17:21:00","stateChangedBy":"System","lastActivityAt":"2025-02-24 08:21:04","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2025-04-12T12:21:00.000Z"},"RITM2314483":{"state":"Closed Complete","shortDesc":"Vanish MX Homepage Banner change","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Mexico","businessUnit":"Hygiene","finalCost":"14400","currencyCode":"MXN","ttfrMinutes":48911,"clientRespMinutes":14899,"firstReplyAt":"2025-02-10 17:35:09","firstAssignedDate":"2025-01-29 14:11:43","fulfillmentDate":"2025-01-07 18:24:37","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2025-01-07","closedDate":"2025-03-18","toDoAt":"2025-02-10T13:18:11.760+0100","inUatAt":"2025-02-12T14:45:17.710+0100","jiraKey":"WFN-160","year":"2025","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2025-01-07 18:24:34","stateChangedAt":"2025-03-18 16:21:05","stateChangedBy":"System","lastActivityAt":"2025-03-10 10:40:12","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-03-18T13:21:05.000Z"},"RITM2314492":{"state":"Closed Complete","shortDesc":"Finish MX-Finish ES Landing Page Mirroring","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Mexico","businessUnit":"Hygiene","finalCost":"60000","currencyCode":"MXN","ttfrMinutes":48901,"clientRespMinutes":9035,"firstReplyAt":"2025-02-10 17:40:42","firstAssignedDate":"2025-01-29 14:12:00","fulfillmentDate":"2025-01-07 18:39:56","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2025-01-07","closedDate":"2025-04-01","toDoAt":"2025-02-12T09:47:08.513+0100","inUatAt":"2025-03-03T08:40:28.243+0100","jiraKey":"WFN-163","year":"2025","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2025-01-07 18:39:54","stateChangedAt":"2025-04-01 15:20:53","stateChangedBy":"System","lastActivityAt":"2025-03-10 10:42:57","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-04-01T10:20:53.000Z"},"RITM2315142":{"state":"Closed Complete","shortDesc":"Acquanellenostremani page for WWD","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"1440","currencyCode":"EUR","ttfrMinutes":11939,"clientRespMinutes":2080,"firstReplyAt":"2025-01-16 16:47:36","firstAssignedDate":"2025-01-15 17:00:53","fulfillmentDate":"2025-01-08 09:49:05","openedBy":"Mirtilla Reale","openedDate":"2025-01-08","closedDate":"2025-03-23","toDoAt":"2025-02-17T13:47:11.860+0100","inUatAt":"2025-02-25T11:31:32.737+0100","jiraKey":"WFN-174","year":"2025","requestedFor":"","openedAt":"2025-01-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-23T11:20:55.000Z"},"RITM2315836":{"state":"Closed Cancelled","shortDesc":"Replace graphic for connected sample website","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Finish","market":"Poland","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":2810,"clientRespMinutes":null,"firstReplyAt":"2025-01-10 15:23:59","firstAssignedDate":"2025-01-10 14:58:38","fulfillmentDate":"2025-01-08 16:33:57","openedBy":"Malgorzata Szatkowska (Inactive)","openedDate":"2025-01-08","closedDate":"2025-01-31","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-131","year":"2025","requestedFor":"Malgorzata Szatkowska (Inactive)","openedAt":"2025-01-08 16:33:53","stateChangedAt":"2025-01-31 16:59:46","stateChangedBy":"System","lastActivityAt":"2025-01-27 09:55:47","lastActivityBy":"Malgorzata Szatkowska (Inactive)","_updated":"2025-01-31T13:59:46.000Z"},"RITM2316047":{"state":"Closed Complete","shortDesc":"13 title tags to change","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"France","businessUnit":"Hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1166,"clientRespMinutes":4480,"firstReplyAt":"2025-01-09 16:14:53","firstAssignedDate":"2025-01-09 15:34:35","fulfillmentDate":"2025-01-08 20:48:55","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2025-01-08","closedDate":"2025-02-01","toDoAt":"2025-01-10T10:07:18.393+0100","inUatAt":"2025-01-10T16:29:38.740+0100","jiraKey":"WFN-130","year":"2025","requestedFor":"","openedAt":"2025-01-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-01T16:20:52.000Z"},"RITM2316231":{"state":"Closed Complete","shortDesc":"Vanish MX metadata & meta KW tag","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Vanish","market":"Mexico","businessUnit":"Hygiene","finalCost":"2400","currencyCode":"MXN","ttfrMinutes":10400,"clientRespMinutes":6249,"firstReplyAt":"2025-01-16 07:49:24","firstAssignedDate":"2025-01-14 10:13:35","fulfillmentDate":"2025-01-09 02:29:52","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2025-01-09","closedDate":"2025-02-19","toDoAt":"2025-01-20T09:37:23.000+0100","inUatAt":"2025-01-21T15:36:51.210+0100","jiraKey":"WFN-132","year":"2025","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2025-01-09 02:29:48","stateChangedAt":"2025-02-19 07:21:00","stateChangedBy":"System","lastActivityAt":"2025-02-11 22:08:48","lastActivityBy":"Cesar Torres Montes Garcia (Inactive)","_updated":"2025-03-18T22:45:58.000Z"},"RITM2318537":{"state":"Closed Cancelled","shortDesc":"Changes on Websites: Fullmarks and Optrex","assignedTo":"Dmitry Koziyev (Inactive)","brand":"","market":"","businessUnit":"","finalCost":"","currencyCode":"","ttfrMinutes":8663,"clientRespMinutes":9220,"firstReplyAt":"2025-01-16 16:30:29","firstAssignedDate":"2025-01-14 10:06:33","fulfillmentDate":"2025-01-10 16:07:59","openedBy":"Francisco Faria (Inactive)","openedDate":"2025-01-10","closedDate":"2025-04-16","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-168","year":"2025","requestedFor":"Francisco Faria (Inactive)","openedAt":"2025-01-10 16:07:56","stateChangedAt":"2025-04-16 14:43:23","stateChangedBy":"System","lastActivityAt":"2025-04-16 14:44:29","lastActivityBy":"Dmitry Koziyev (Inactive)","_updated":"2025-04-16T09:44:29.000Z"},"RITM2320991":{"state":"Closed Complete","shortDesc":"AirWick.es - quick changes","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Spain","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1592,"clientRespMinutes":9312,"firstReplyAt":"2025-01-15 13:07:56","firstAssignedDate":"2025-01-15 11:29:21","fulfillmentDate":"2025-01-14 10:36:05","openedBy":"Eva Bosch","openedDate":"2025-01-14","closedDate":"2025-02-08","toDoAt":"2025-01-16T09:48:02.557+0100","inUatAt":"2025-01-17T17:21:52.410+0100","jiraKey":"WFN-134","year":"2025","requestedFor":"Eva Bosch","openedAt":"2025-01-14 10:36:01","stateChangedAt":"2025-02-08 10:20:54","stateChangedBy":"System","lastActivityAt":"2025-02-03 09:18:47","lastActivityBy":"Eva Bosch","_updated":"2025-02-08T07:20:54.000Z"},"RITM2321410":{"state":"Closed Complete","shortDesc":"Nurofen RO - download button","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Romania","businessUnit":"Health","finalCost":"600","currencyCode":"GBP","ttfrMinutes":1352,"clientRespMinutes":4391,"firstReplyAt":"2025-01-15 14:20:46","firstAssignedDate":"2025-01-15 11:28:46","fulfillmentDate":"2025-01-14 15:48:51","openedBy":"Rowena Hearn","openedDate":"2025-01-14","closedDate":"2025-04-09","toDoAt":"2025-02-07T18:54:20.147+0100","inUatAt":"2025-02-11T22:38:37.913+0100","jiraKey":"WFN-133","year":"2025","requestedFor":"","openedAt":"2025-01-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-09T14:20:52.000Z"},"RITM2321583":{"state":"Closed Complete","shortDesc":"Nurofen FR Website update before we go live again","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"France","businessUnit":"Health","finalCost":"180","currencyCode":"EUR","ttfrMinutes":2677,"clientRespMinutes":2487,"firstReplyAt":"2025-01-16 14:32:00","firstAssignedDate":"2025-01-15 11:24:40","fulfillmentDate":"2025-01-14 17:55:07","openedBy":"Yara Tabet","openedDate":"2025-01-14","closedDate":"2025-04-20","toDoAt":"2024-12-18T09:23:46.397+0100","inUatAt":"2025-01-13T11:10:46.650+0100","jiraKey":"WFN-60","year":"2025","requestedFor":"","openedAt":"2025-01-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-20T14:20:54.000Z"},"RITM2322404":{"state":"Closed Complete","shortDesc":"SOLE WEBSITE CHANGE REQUEST","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Sole","market":"Italy","businessUnit":"Hygiene","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1338,"clientRespMinutes":5192,"firstReplyAt":"2025-01-16 10:09:52","firstAssignedDate":"2025-01-16 10:09:52","fulfillmentDate":"2025-01-15 11:52:05","openedBy":"Estelle Pivetta (Inactive)","openedDate":"2025-01-15","closedDate":"2025-03-04","toDoAt":"2025-01-28T09:54:02.693+0100","inUatAt":"2025-02-13T15:52:47.433+0100","jiraKey":"WFN-135","year":"2025","requestedFor":"","openedAt":"2025-01-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-04T06:21:03.000Z"},"RITM2322423":{"state":"Closed Cancelled","shortDesc":"Finish.es - Changed not planned","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Spain","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":1327,"clientRespMinutes":null,"firstReplyAt":"2025-01-16 10:11:28","firstAssignedDate":"2025-01-16 10:11:28","fulfillmentDate":"2025-01-15 12:04:17","openedBy":"Eva Bosch","openedDate":"2025-01-15","closedDate":"2025-02-13","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-136","year":"2025","requestedFor":"Eva Bosch","openedAt":"2025-01-15 12:04:13","stateChangedAt":"2025-02-13 13:45:37","stateChangedBy":"Dmitry Koziyev (Inactive)","lastActivityAt":"2025-02-11 08:42:48","lastActivityBy":"Eva Bosch","_updated":"2025-02-13T10:45:36.000Z"},"RITM2322451":{"state":"Closed Complete","shortDesc":"Gaviscon BE website: Authorities","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Belgium","businessUnit":"Health","finalCost":"2160","currencyCode":"EUR","ttfrMinutes":3053,"clientRespMinutes":13957,"firstReplyAt":"2025-01-17 15:19:41","firstAssignedDate":"2025-01-16 10:13:24","fulfillmentDate":"2025-01-15 12:26:25","openedBy":"Lia Marchetti (Inactive)","openedDate":"2025-01-15","closedDate":"2025-10-28","toDoAt":"2025-01-08T14:06:48.520+0100","inUatAt":"2025-01-17T11:14:19.157+0100","jiraKey":"WFN-128","year":"2025","requestedFor":"","openedAt":"2025-01-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-28T14:20:54.000Z"},"RITM2326512":{"state":"Closed Complete","shortDesc":"Removal of Farma2go, Farmacias Direct, and Distafarma from all retailers","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Spain","businessUnit":"Health","finalCost":"2160","currencyCode":"EUR","ttfrMinutes":108,"clientRespMinutes":467,"firstReplyAt":"2025-01-20 11:57:05","firstAssignedDate":"2025-01-20 11:22:31","fulfillmentDate":"2025-01-20 10:09:01","openedBy":"Jaime Sanchis","openedDate":"2025-01-20","closedDate":"2025-02-05","toDoAt":"2025-01-23T09:16:37.557+0100","inUatAt":null,"jiraKey":"WFN-139","year":"2025","requestedFor":"Jaime Sanchis","openedAt":"2025-01-20 10:08:58","stateChangedAt":"2025-02-05 16:21:02","stateChangedBy":"System","lastActivityAt":"2025-01-28 17:15:08","lastActivityBy":"Jaime Sanchis","_updated":"2025-02-05T13:21:02.000Z"},"RITM2327103":{"state":"Closed Cancelled","shortDesc":"SPAIN - Gaviscon UX","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"United Kingdom","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":15765,"clientRespMinutes":58,"firstReplyAt":"2025-01-31 16:14:41","firstAssignedDate":"2025-01-30 10:00:01","fulfillmentDate":"2025-01-20 17:30:10","openedBy":"Rowena Hearn","openedDate":"2025-01-20","closedDate":"2025-09-15","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-149","year":"2025","requestedFor":"Rowena Hearn","openedAt":"2025-01-20 17:30:07","stateChangedAt":"2025-09-15 18:11:54","stateChangedBy":"System","lastActivityAt":"2025-09-15 12:52:51","lastActivityBy":"Rowena Hearn","_updated":"2025-09-15T13:11:54.000Z"},"RITM2327872":{"state":"Closed Complete","shortDesc":"Vanish.es: images update Feb 2025","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Vanish","market":"Spain","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1620,"clientRespMinutes":3604,"firstReplyAt":"2025-01-22 14:35:44","firstAssignedDate":"2025-01-22 14:35:44","fulfillmentDate":"2025-01-21 11:36:00","openedBy":"Eva Bosch","openedDate":"2025-01-21","closedDate":"2025-02-15","toDoAt":"2025-01-23T09:59:59.977+0100","inUatAt":"2025-01-24T16:02:21.057+0100","jiraKey":"WFN-141","year":"2025","requestedFor":"Eva Bosch","openedAt":"2025-01-21 11:35:56","stateChangedAt":"2025-02-15 07:20:53","stateChangedBy":"System","lastActivityAt":"2025-02-05 12:11:48","lastActivityBy":"Eva Bosch","_updated":"2025-02-15T04:20:53.000Z"},"RITM2329058":{"state":"Closed Complete","shortDesc":"We need to upload new articles with their images, meta titles and meta descriptions to Vanish TR website.","assignedTo":"Herman Bykanov (Inactive)","brand":"Vanish","market":"Turkey","businessUnit":"Hygiene","finalCost":"600","currencyCode":"GBP","ttfrMinutes":1598,"clientRespMinutes":5313,"firstReplyAt":"2025-01-23 10:51:15","firstAssignedDate":"2025-01-23 10:19:58","fulfillmentDate":"2025-01-22 08:13:05","openedBy":"Kaan Soylu (Inactive)","openedDate":"2025-01-22","closedDate":"2025-07-15","toDoAt":"2025-02-07T19:07:12.057+0100","inUatAt":"2025-02-13T15:05:54.490+0100","jiraKey":"WFN-142","year":"2025","requestedFor":"","openedAt":"2025-01-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-15T12:20:52.000Z"},"RITM2329657":{"state":"Closed Complete","shortDesc":"Unfinished Edits to Website","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Durex","market":"Israel","businessUnit":"Health","finalCost":"360","currencyCode":"EUR","ttfrMinutes":6858,"clientRespMinutes":5007,"firstReplyAt":"2025-01-27 08:56:11","firstAssignedDate":"2025-01-23 10:16:31","fulfillmentDate":"2025-01-22 14:38:10","openedBy":"Adi Yona","openedDate":"2025-01-22","closedDate":"2025-06-16","toDoAt":"2025-02-05T10:13:26.697+0100","inUatAt":"2025-02-28T08:08:22.227+0100","jiraKey":"WFN-144","year":"2025","requestedFor":"","openedAt":"2025-01-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-16T10:20:52.000Z"},"RITM2330906":{"state":"Closed Cancelled","shortDesc":"404s links fixing for Vanish TR","assignedTo":"Herman Bykanov (Inactive)","brand":"Vanish","market":"Turkey","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":5551,"clientRespMinutes":null,"firstReplyAt":"2025-01-27 11:10:23","firstAssignedDate":"2025-01-27 10:32:11","fulfillmentDate":"2025-01-23 14:39:54","openedBy":"Olga Tadrzak","openedDate":"2025-01-23","closedDate":"2025-05-20","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-145","year":"2025","requestedFor":"Olga Tadrzak","openedAt":"2025-01-23 14:39:50","stateChangedAt":"2025-05-20 18:55:42","stateChangedBy":"System","lastActivityAt":"2025-05-20 18:55:16","lastActivityBy":"Herman Bykanov (Inactive)","_updated":"2025-05-20T13:55:42.000Z"},"RITM2330913":{"state":"Closed Complete","shortDesc":"Broken sub menu","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Vanish","market":"Turkey","businessUnit":"Hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":5548,"clientRespMinutes":1419,"firstReplyAt":"2025-01-27 11:13:16","firstAssignedDate":"2025-01-27 10:32:27","fulfillmentDate":"2025-01-23 14:45:04","openedBy":"Olga Tadrzak","openedDate":"2025-01-23","closedDate":"2025-03-05","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-146","year":"2025","requestedFor":"","openedAt":"2025-01-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-05T05:20:59.000Z"},"RITM2331909":{"state":"Closed Complete","shortDesc":"change on website vanish.it","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Vanish","market":"Italy","businessUnit":"Hygiene","finalCost":"1080","currencyCode":"EUR","ttfrMinutes":7038,"clientRespMinutes":2537,"firstReplyAt":"2025-01-29 08:23:39","firstAssignedDate":"2025-01-27 10:32:49","fulfillmentDate":"2025-01-24 11:05:28","openedBy":"Laura Sarotto (Inactive)","openedDate":"2025-01-24","closedDate":"2025-03-16","toDoAt":"2025-01-30T09:38:19.463+0100","inUatAt":"2025-02-05T13:33:24.513+0100","jiraKey":"WFN-147","year":"2025","requestedFor":"","openedAt":"2025-01-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-16T05:21:02.000Z"},"RITM2331948":{"state":"Closed Complete","shortDesc":"Finish.es - deactivate pop-up","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Spain","businessUnit":"Hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":68,"clientRespMinutes":65,"firstReplyAt":"2025-01-24 12:37:13","firstAssignedDate":"2025-01-24 11:34:59","fulfillmentDate":"2025-01-24 11:29:02","openedBy":"Eva Bosch","openedDate":"2025-01-24","closedDate":"2025-01-29","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-143","year":"2025","requestedFor":"Eva Bosch","openedAt":"2025-01-24 11:28:59","stateChangedAt":"2025-01-29 14:21:26","stateChangedBy":"System","lastActivityAt":"2025-01-24 13:59:32","lastActivityBy":"Eva Bosch","_updated":"2025-01-29T11:21:26.000Z"},"RITM2332362":{"state":"Closed Cancelled","shortDesc":"Articles publishing for Durex.de","assignedTo":"Herman Bykanov (Inactive)","brand":"Durex","market":"Germany","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":4170,"clientRespMinutes":3170,"firstReplyAt":"2025-01-27 14:44:44","firstAssignedDate":"2025-01-27 10:32:19","fulfillmentDate":"2025-01-24 17:14:22","openedBy":"Olga Tadrzak","openedDate":"2025-01-24","closedDate":"2025-04-29","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-148","year":"2025","requestedFor":"Olga Tadrzak","openedAt":"2025-01-24 17:14:19","stateChangedAt":"2025-04-29 11:25:05","stateChangedBy":"System","lastActivityAt":"2025-04-28 11:21:12","lastActivityBy":"Olga Tadrzak","_updated":"2025-04-29T06:25:05.000Z"},"RITM2339038":{"state":"Closed Complete","shortDesc":"Ajustes página de productos | Tempra","assignedTo":"Renata Probst Martínez","brand":"Tempra","market":"Mexico","businessUnit":null,"finalCost":"","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":null,"firstAssignedDate":null,"fulfillmentDate":null,"openedBy":null,"openedDate":null,"closedDate":null,"toDoAt":null,"inUatAt":null,"jiraKey":null,"year":null,"requestedFor":"Mariana Onofre Castro","openedAt":"2025-01-28 19:06:57","stateChangedAt":"2025-03-10 17:21:00","stateChangedBy":"System","lastActivityAt":"","lastActivityBy":"","_updated":"2025-03-10T14:21:00.000Z"},"RITM2339178":{"state":"Closed Complete","shortDesc":"Vanish MX T&Cs & Privacy Policy change","assignedTo":"Jesica Greco","brand":"Vanish","market":"Mexico","businessUnit":"Hygiene","finalCost":"2400","currencyCode":"MXN","ttfrMinutes":17950,"clientRespMinutes":771,"firstReplyAt":"2025-02-10 10:24:14","firstAssignedDate":"2025-01-29 14:11:00","fulfillmentDate":"2025-01-28 23:14:07","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2025-01-28","closedDate":"2025-03-30","toDoAt":"2025-03-25T17:11:05.977+0100","inUatAt":"2025-03-25T18:04:04.973+0100","jiraKey":"WFN-220","year":"2025","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2025-01-28 23:14:05","stateChangedAt":"2025-03-30 19:20:51","stateChangedBy":"System","lastActivityAt":"2025-03-25 18:12:40","lastActivityBy":"Jesica Greco","_updated":"2025-03-30T14:20:51.000Z"},"RITM2340331":{"state":"Closed Cancelled","shortDesc":"Dettol Website: Update and complete CMS content","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Durex","market":"Portugal","businessUnit":"Health","finalCost":"144","currencyCode":"EUR","ttfrMinutes":928,"clientRespMinutes":2707,"firstReplyAt":"2025-01-30 10:03:11","firstAssignedDate":"2025-01-30 10:03:11","fulfillmentDate":"2025-01-29 18:34:54","openedBy":"Francisco Faria (Inactive)","openedDate":"2025-01-29","closedDate":"2025-06-26","toDoAt":null,"inUatAt":"2025-02-28T07:55:23.547+0100","jiraKey":"WFN-150","year":"2025","requestedFor":"Francisco Faria (Inactive)","openedAt":"2025-01-29 18:34:51","stateChangedAt":"2025-06-26 13:18:01","stateChangedBy":"System","lastActivityAt":"2025-06-26 13:17:32","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-06-26T08:18:09.000Z"},"RITM2343198":{"state":"Closed Complete","shortDesc":"Change request for SE Strepsils website","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Strepsils","market":"Sweden","businessUnit":"Health","finalCost":"720","currencyCode":"GBP","ttfrMinutes":14329,"clientRespMinutes":3778,"firstReplyAt":"2025-02-11 17:14:28","firstAssignedDate":"2025-02-03 09:55:44","fulfillmentDate":"2025-02-01 18:25:15","openedBy":"Federico Mirandola (Inactive)","openedDate":"2025-02-01","closedDate":"2025-04-02","toDoAt":"2025-02-14T15:02:33.503+0100","inUatAt":"2025-03-03T08:39:50.067+0100","jiraKey":"WFN-166","year":"2025","requestedFor":"Federico Mirandola (Inactive)","openedAt":"2025-02-01 18:25:12","stateChangedAt":"2025-04-02 12:21:51","stateChangedBy":"System","lastActivityAt":"2025-03-27 14:08:56","lastActivityBy":"Federico Mirandola (Inactive)","_updated":"2025-04-02T07:21:50.000Z"},"RITM2343876":{"state":"Closed Complete","shortDesc":"Microsite update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Greece","businessUnit":"Hygiene","finalCost":"600","currencyCode":"GBP","ttfrMinutes":6300,"clientRespMinutes":7083,"firstReplyAt":"2025-02-07 19:15:21","firstAssignedDate":"2025-02-05 08:57:12","fulfillmentDate":"2025-02-03 10:14:56","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2025-02-03","closedDate":"2025-02-26","toDoAt":"2025-02-21T09:45:58.870+0100","inUatAt":"2025-02-18T10:33:32.643+0100","jiraKey":"WFN-151","year":"2025","requestedFor":"","openedAt":"2025-02-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-26T10:50:09.000Z"},"RITM2344486":{"state":"Closed Complete","shortDesc":"Add 5 paragraphs with links on axisting articles","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"France","businessUnit":"Hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2487,"clientRespMinutes":2381,"firstReplyAt":"2025-02-05 10:26:58","firstAssignedDate":"2025-02-05 08:59:49","fulfillmentDate":"2025-02-03 17:00:10","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2025-02-03","closedDate":"2025-02-17","toDoAt":"2025-02-05T12:37:49.207+0100","inUatAt":"2025-02-06T10:28:44.627+0100","jiraKey":"WFN-152","year":"2025","requestedFor":"","openedAt":"2025-02-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-17T09:20:58.000Z"},"RITM2344502":{"state":"Closed Cancelled","shortDesc":"Website FAQ section publishing, 1 artcile update and 1 artcile publishing","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Czech Republic","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":9976,"clientRespMinutes":null,"firstReplyAt":"2025-02-10 15:30:37","firstAssignedDate":"2025-02-05 09:56:44","fulfillmentDate":"2025-02-03 17:14:41","openedBy":"Olga Tadrzak","openedDate":"2025-02-03","closedDate":"2025-04-28","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-153","year":"2025","requestedFor":"Olga Tadrzak","openedAt":"2025-02-03 17:14:37","stateChangedAt":"2025-04-28 15:11:12","stateChangedBy":"System","lastActivityAt":"2025-04-28 11:20:45","lastActivityBy":"Olga Tadrzak","_updated":"2025-04-28T10:11:12.000Z"},"RITM2345595":{"state":"Closed Complete","shortDesc":"update privacy policy link","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Italy","businessUnit":"Health","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1487,"clientRespMinutes":3168,"firstReplyAt":"2025-02-05 13:41:12","firstAssignedDate":"2025-02-05 10:00:20","fulfillmentDate":"2025-02-04 12:54:10","openedBy":"Alice Vaccaro","openedDate":"2025-02-04","closedDate":"2025-02-17","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-154","year":"2025","requestedFor":"","openedAt":"2025-02-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-17T09:20:55.000Z"},"RITM2346364":{"state":"Closed Complete","shortDesc":"publish two articles on vanish.fr and check another one","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"France","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":4163,"clientRespMinutes":1395,"firstReplyAt":"2025-02-07 19:28:59","firstAssignedDate":"2025-02-05 11:16:05","fulfillmentDate":"2025-02-04 22:06:10","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2025-02-04","closedDate":"2025-02-23","toDoAt":"2025-02-06T10:32:45.370+0100","inUatAt":"2025-02-10T11:32:43.007+0100","jiraKey":"WFN-155","year":"2025","requestedFor":"","openedAt":"2025-02-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-23T12:20:55.000Z"},"RITM2346370":{"state":"Closed Complete","shortDesc":"Regression of unwanted 301 redirections","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"France","businessUnit":"Hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":4148,"clientRespMinutes":2966,"firstReplyAt":"2025-02-07 19:30:46","firstAssignedDate":"2025-02-05 11:16:24","fulfillmentDate":"2025-02-04 22:22:53","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2025-02-04","closedDate":"2025-02-23","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-156","year":"2025","requestedFor":"","openedAt":"2025-02-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-23T12:21:06.000Z"},"RITM2346776":{"state":"Closed Complete","shortDesc":"Durex.ro Website updates","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Romania","businessUnit":"Health","finalCost":"1920","currencyCode":"GBP","ttfrMinutes":111,"clientRespMinutes":8444,"firstReplyAt":"2025-02-05 12:05:43","firstAssignedDate":"2025-02-05 11:23:35","fulfillmentDate":"2025-02-05 10:15:11","openedBy":"Andreea Bobe","openedDate":"2025-02-05","closedDate":"2025-07-21","toDoAt":"2025-02-07T19:31:25.133+0100","inUatAt":"2025-03-17T12:09:06.990+0100","jiraKey":"WFN-157","year":"2025","requestedFor":"","openedAt":"2025-02-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-21T09:20:56.000Z"},"RITM2346976":{"state":"Closed Complete","shortDesc":"Update the headache diaries (2 versions) on the HU Nurofen page (https://www.nurofen.hu/tunetek-kezelese/gyermekeknek/fejfajasnaplo/)","assignedTo":"Alesya Prolagayeva","brand":"Nurofen for Children","market":"Hungary","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":7418,"clientRespMinutes":3515,"firstReplyAt":"2025-02-10 15:43:35","firstAssignedDate":"2025-02-06 10:00:56","fulfillmentDate":"2025-02-05 12:06:05","openedBy":"Noemi Chrobot (Inactive)","openedDate":"2025-02-05","closedDate":"2025-02-23","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-158","year":"2025","requestedFor":"","openedAt":"2025-02-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-05T13:42:25.000Z"},"RITM2348322":{"state":"Closed Complete","shortDesc":"Shutdown Strepsils French website","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"France","businessUnit":"Health","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1330,"clientRespMinutes":581,"firstReplyAt":"2025-02-07 09:49:21","firstAssignedDate":"2025-02-07 09:45:48","fulfillmentDate":"2025-02-06 11:39:05","openedBy":"Anaelle Yao","openedDate":"2025-02-06","closedDate":"2025-03-03","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-02-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-18T20:38:13.000Z"},"RITM2348593":{"state":"Closed Complete","shortDesc":"Vanish TR: Update internal broken pages (404)","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Turkey","businessUnit":"Hygiene","finalCost":"300","currencyCode":"GBP","ttfrMinutes":5819,"clientRespMinutes":null,"firstReplyAt":"2025-02-10 16:01:14","firstAssignedDate":"2025-02-07 10:10:31","fulfillmentDate":"2025-02-06 15:02:27","openedBy":"David Iwanow (Inactive)","openedDate":"2025-02-06","closedDate":"2025-03-22","toDoAt":null,"inUatAt":"2025-02-10T15:57:53.263+0100","jiraKey":"WFN-161","year":"2025","requestedFor":"","openedAt":"2025-02-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-22T09:21:03.000Z"},"RITM2348621":{"state":"Closed Complete","shortDesc":"Finish.pt - ecopunto","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Portugal","businessUnit":"hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":5779,"clientRespMinutes":122,"firstReplyAt":"2025-02-10 15:48:12","firstAssignedDate":"2025-02-07 10:05:29","fulfillmentDate":"2025-02-06 15:29:14","openedBy":"Eva Bosch","openedDate":"2025-02-06","closedDate":"2025-02-17","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-162","year":"2025","requestedFor":"Eva Bosch","openedAt":"2025-02-06 15:29:12","stateChangedAt":"2025-02-17 12:20:58","stateChangedBy":"System","lastActivityAt":"2025-02-11 09:26:28","lastActivityBy":"Eva Bosch","_updated":"2025-02-17T09:20:58.000Z"},"RITM2348658":{"state":"Closed Complete","shortDesc":"Vanish MX: Update internal broken pages (404)","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Mexico","businessUnit":"Hygiene","finalCost":"6000","currencyCode":"MXN","ttfrMinutes":5361,"clientRespMinutes":781,"firstReplyAt":"2025-02-10 09:18:33","firstAssignedDate":"2025-02-10 09:18:33","fulfillmentDate":"2025-02-06 15:58:05","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2025-02-06","closedDate":"2025-03-26","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-167","year":"2025","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2025-02-06 15:58:02","stateChangedAt":"2025-03-26 11:20:56","stateChangedBy":"System","lastActivityAt":"2025-03-20 13:58:03","lastActivityBy":"Anna Tyborska (Inactive)","_updated":"2025-03-26T08:20:56.000Z"},"RITM2349778":{"state":"Closed Complete","shortDesc":"Please deactivate a HU Finish subpage","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"120","currencyCode":"","ttfrMinutes":5404,"clientRespMinutes":1606,"firstReplyAt":"2025-02-11 07:34:28","firstAssignedDate":"2025-02-10 10:18:56","fulfillmentDate":"2025-02-07 13:30:46","openedBy":"Anna Koroknay","openedDate":"2025-02-07","closedDate":"2025-02-24","toDoAt":"2025-02-10T15:58:10.553+0100","inUatAt":"2025-02-11T09:11:00.233+0100","jiraKey":"WFN-159","year":"2025","requestedFor":"","openedAt":"2025-02-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-02-24T07:20:57.000Z"},"RITM2349980":{"state":"Closed Complete","shortDesc":"Updates of the Luftagastro website","assignedTo":"Jesica Greco","brand":"Gaviscon","market":"Brazil","businessUnit":"Health","finalCost":"2400","currencyCode":"MXN","ttfrMinutes":4055,"clientRespMinutes":2052,"firstReplyAt":"2025-02-10 11:38:29","firstAssignedDate":"2025-02-10 10:20:53","fulfillmentDate":"2025-02-07 16:03:50","openedBy":"Esther Oliveira (Inactive)","openedDate":"2025-02-07","closedDate":"2025-03-19","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"Esther Oliveira (Inactive)","openedAt":"2025-02-07 16:03:46","stateChangedAt":"2025-03-19 18:20:54","stateChangedBy":"System","lastActivityAt":"2025-03-07 15:06:22","lastActivityBy":"Esther Oliveira (Inactive)","_updated":"2025-03-19T15:20:54.000Z"},"RITM2353536":{"state":"Closed Complete","shortDesc":"Vanish MX Pink & White Powder Articles","assignedTo":"Jesica Greco","brand":"Vanish","market":"Mexico","businessUnit":"Hygiene","finalCost":"12000","currencyCode":"MXN","ttfrMinutes":8384,"clientRespMinutes":4136,"firstReplyAt":"2025-02-17 19:25:10","firstAssignedDate":"2025-02-13 14:55:44","fulfillmentDate":"2025-02-11 23:41:42","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2025-02-11","closedDate":"2025-03-18","toDoAt":"2025-03-04T09:22:11.913+0100","inUatAt":"2025-02-21T11:44:03.027+0100","jiraKey":"WFN-169","year":"2025","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2025-02-11 23:41:39","stateChangedAt":"2025-03-18 16:21:12","stateChangedBy":"System","lastActivityAt":"2025-03-11 07:14:27","lastActivityBy":"Mariana Onofre Castro","_updated":"2025-03-18T21:02:36.000Z"},"RITM2353566":{"state":"Closed Complete","shortDesc":"Vanish MX Landing Page Pink Powder","assignedTo":"Jesica Greco","brand":"Vanish","market":"Mexico","businessUnit":"Hygiene","finalCost":"12000","currencyCode":"MXN","ttfrMinutes":8298,"clientRespMinutes":4146,"firstReplyAt":"2025-02-17 19:26:19","firstAssignedDate":"2025-02-13 14:55:34","fulfillmentDate":"2025-02-12 01:08:07","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2025-02-12","closedDate":"2025-03-18","toDoAt":"2025-03-03T08:40:47.190+0100","inUatAt":"2025-03-05T15:06:39.620+0100","jiraKey":"WFN-170","year":"2025","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2025-02-12 01:08:03","stateChangedAt":"2025-03-18 16:21:02","stateChangedBy":"System","lastActivityAt":"2025-03-11 07:24:44","lastActivityBy":"Mariana Onofre Castro","_updated":"2025-03-19T17:52:52.000Z"},"RITM2353570":{"state":"Closed Complete","shortDesc":"Vanish MX Landing Page White Powder","assignedTo":"Jesica Greco","brand":"Vanish","market":"Mexico","businessUnit":"Hygiene","finalCost":"24000","currencyCode":"MXN","ttfrMinutes":8302,"clientRespMinutes":4143,"firstReplyAt":"2025-02-17 19:36:10","firstAssignedDate":"2025-02-13 14:55:18","fulfillmentDate":"2025-02-12 01:14:33","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2025-02-12","closedDate":"2025-03-18","toDoAt":"2025-03-04T09:35:24.417+0100","inUatAt":"2025-03-05T15:07:06.123+0100","jiraKey":"WFN-171","year":"2025","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2025-02-12 01:14:28","stateChangedAt":"2025-03-18 16:21:13","stateChangedBy":"System","lastActivityAt":"2025-03-11 07:14:16","lastActivityBy":"Mariana Onofre Castro","_updated":"2025-03-18T22:03:23.000Z"},"RITM2353585":{"state":"Closed Cancelled","shortDesc":"Harpic MX Landing Page Quote","assignedTo":"Jesica Greco","brand":"Harpic","market":"Mexico","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":553,"clientRespMinutes":2559,"firstReplyAt":"2025-02-12 11:27:40","firstAssignedDate":"2025-02-12 11:27:40","fulfillmentDate":"2025-02-12 02:14:31","openedBy":"Cesar Torres Montes Garcia (Inactive)","openedDate":"2025-02-12","closedDate":"2025-03-11","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-165","year":"2025","requestedFor":"Cesar Torres Montes Garcia (Inactive)","openedAt":"2025-02-12 02:14:28","stateChangedAt":"2025-03-11 13:28:38","stateChangedBy":"Jesica Greco","lastActivityAt":"2025-03-11 13:28:38","lastActivityBy":"Jesica Greco","_updated":"2025-03-11T10:28:37.000Z"},"RITM2354283":{"state":"Closed Complete","shortDesc":"Delete all Blog Pictures","assignedTo":"Herman Bykanov (Inactive)","brand":"Durex","market":"Germany","businessUnit":"Health","finalCost":"600","currencyCode":"GBP","ttfrMinutes":2754,"clientRespMinutes":6150,"firstReplyAt":"2025-02-14 10:17:28","firstAssignedDate":"2025-02-14 10:17:28","fulfillmentDate":"2025-02-12 12:23:51","openedBy":"Steffi Pietzsch (Inactive)","openedDate":"2025-02-12","closedDate":"2025-04-07","toDoAt":"2025-02-21T12:45:51.767+0100","inUatAt":"2025-03-03T08:33:36.203+0100","jiraKey":"WFN-173","year":"2025","requestedFor":"Steffi Pietzsch (Inactive)","openedAt":"2025-02-12 12:23:47","stateChangedAt":"2025-04-07 18:21:13","stateChangedBy":"System","lastActivityAt":"2025-03-27 09:01:17","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2025-04-07T13:21:13.000Z"},"RITM2354711":{"state":"Closed Complete","shortDesc":"Updates of the Luftagastro website","assignedTo":"Jesica Greco","brand":"Gaviscon","market":"Brazil","businessUnit":"Health","finalCost":"2400","currencyCode":"MXN","ttfrMinutes":7144,"clientRespMinutes":17,"firstReplyAt":"2025-02-17 17:06:05","firstAssignedDate":"2025-02-14 10:14:56","fulfillmentDate":"2025-02-12 18:02:24","openedBy":"Esther Oliveira (Inactive)","openedDate":"2025-02-12","closedDate":"2025-02-26","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"Esther Oliveira (Inactive)","openedAt":"2025-02-12 18:02:21","stateChangedAt":"2025-02-26 15:21:21","stateChangedBy":"System","lastActivityAt":"2025-02-19 13:52:41","lastActivityBy":"Jesica Greco","_updated":"2025-03-18T21:47:23.000Z"},"RITM2355895":{"state":"Closed Complete","shortDesc":"Contact update","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Germany","businessUnit":"Health","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":1030,"clientRespMinutes":7840,"firstReplyAt":"2025-02-14 10:16:16","firstAssignedDate":"2025-02-14 10:16:16","fulfillmentDate":"2025-02-13 17:06:07","openedBy":"Mia Leimkuhler","openedDate":"2025-02-13","closedDate":"2025-04-20","toDoAt":"2025-02-18T22:42:24.657+0100","inUatAt":"2025-02-27T09:50:25.907+0100","jiraKey":"WFN-172","year":"2025","requestedFor":"Mia Leimkuhler","openedAt":"2025-02-13 17:06:04","stateChangedAt":"2025-04-20 12:21:25","stateChangedBy":"System","lastActivityAt":"2025-04-14 15:43:10","lastActivityBy":"Mia Leimkuhler","_updated":"2025-04-20T07:21:25.000Z"},"RITM2356931":{"state":"Closed Complete","shortDesc":"Website optimization","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":4062,"clientRespMinutes":5483,"firstReplyAt":"2025-02-17 10:13:11","firstAssignedDate":"2025-02-17 10:13:11","fulfillmentDate":"2025-02-14 14:31:31","openedBy":"Maria Papagiannea","openedDate":"2025-02-14","closedDate":"2025-03-11","toDoAt":"2025-02-18T14:49:11.613+0100","inUatAt":"2025-02-20T16:18:40.510+0100","jiraKey":"WFN-175","year":"2025","requestedFor":"","openedAt":"2025-02-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-11T12:21:11.000Z"},"RITM2358455":{"state":"Closed Complete","shortDesc":"Biofreeze CA - articles & alt text","assignedTo":"Alesya Prolagayeva","brand":"Biofreeze","market":"Canada","businessUnit":"Health","finalCost":"600","currencyCode":"GBP","ttfrMinutes":5560,"clientRespMinutes":6553,"firstReplyAt":"2025-02-21 12:58:51","firstAssignedDate":"2025-02-18 10:08:21","fulfillmentDate":"2025-02-17 16:18:59","openedBy":"Rowena Hearn","openedDate":"2025-02-17","closedDate":"2025-04-09","toDoAt":"2025-02-21T12:56:52.437+0100","inUatAt":"2025-03-05T15:18:19.357+0100","jiraKey":"WFN-179","year":"2025","requestedFor":"","openedAt":"2025-02-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-17T04:47:24.000Z"},"RITM2359445":{"state":"Closed Complete","shortDesc":"Contact Page is Unavailable on Veet.FR","assignedTo":"Herman Bykanov (Inactive)","brand":"Veet","market":"France","businessUnit":"Health","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1825,"clientRespMinutes":1439,"firstReplyAt":"2025-02-19 20:27:03","firstAssignedDate":"2025-02-19 10:25:22","fulfillmentDate":"2025-02-18 14:01:52","openedBy":"Anaelle Yao","openedDate":"2025-02-18","closedDate":"2025-03-11","toDoAt":null,"inUatAt":"2025-02-20T10:17:32.377+0100","jiraKey":"WFN-177","year":"2025","requestedFor":"","openedAt":"2025-02-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-11T08:21:31.000Z"},"RITM2359567":{"state":"Closed Cancelled","shortDesc":"Strepsils.fr website migration","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"France","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":8367,"clientRespMinutes":16570,"firstReplyAt":"2025-02-24 11:01:23","firstAssignedDate":"2025-02-19 10:25:00","fulfillmentDate":"2025-02-18 15:34:23","openedBy":"Lyse Kimbaza (Inactive)","openedDate":"2025-02-18","closedDate":"2025-09-15","toDoAt":"2025-03-03T17:54:19.267+0100","inUatAt":"2025-02-03T11:26:43.800+0100","jiraKey":"WFN-40","year":"2025","requestedFor":"Lyse Kimbaza (Inactive)","openedAt":"2025-02-18 15:34:19","stateChangedAt":"2025-09-15 12:26:11","stateChangedBy":"System","lastActivityAt":"2025-09-15 12:25:01","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-09-15T07:26:11.000Z"},"RITM2360424":{"state":"Closed Complete","shortDesc":"Changes on 1P text","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"France","businessUnit":"Hygiene","finalCost":"720","currencyCode":"EUR","ttfrMinutes":259,"clientRespMinutes":1781,"firstReplyAt":"2025-02-19 14:26:29","firstAssignedDate":"2025-02-19 10:23:24","fulfillmentDate":"2025-02-19 10:07:45","openedBy":"Matteo Baron","openedDate":"2025-02-19","closedDate":"2025-03-18","toDoAt":"2025-03-03T17:26:15.487+0100","inUatAt":"2025-03-06T09:26:01.807+0100","jiraKey":"WFN-176","year":"2025","requestedFor":"","openedAt":"2025-02-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-18T11:21:12.000Z"},"RITM2360450":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"300","currencyCode":"GBP","ttfrMinutes":3133,"clientRespMinutes":5142,"firstReplyAt":"2025-02-21 14:36:58","firstAssignedDate":"2025-02-19 14:04:54","fulfillmentDate":"2025-02-19 10:24:31","openedBy":"Maria Papagiannea","openedDate":"2025-02-19","closedDate":"2025-04-02","toDoAt":"2025-03-03T08:39:45.143+0100","inUatAt":"2025-03-20T12:53:46.670+0100","jiraKey":"WFN-180","year":"2025","requestedFor":"","openedAt":"2025-02-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-05T08:01:52.000Z"},"RITM2360594":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1683,"clientRespMinutes":3706,"firstReplyAt":"2025-02-20 15:52:20","firstAssignedDate":"2025-02-19 14:05:15","fulfillmentDate":"2025-02-19 11:49:05","openedBy":"Maria Papagiannea","openedDate":"2025-02-19","closedDate":"2025-04-02","toDoAt":"2025-02-28T08:01:19.913+0100","inUatAt":"2025-02-28T13:43:39.773+0100","jiraKey":"WFN-181","year":"2025","requestedFor":"","openedAt":"2025-02-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-05T08:02:45.000Z"},"RITM2360633":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"health","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":1689,"clientRespMinutes":630,"firstReplyAt":"2025-02-20 16:14:53","firstAssignedDate":"2025-02-19 14:05:31","fulfillmentDate":"2025-02-19 12:05:55","openedBy":"Maria Papagiannea","openedDate":"2025-02-19","closedDate":"2025-03-11","toDoAt":null,"inUatAt":"2025-03-06T09:29:27.457+0100","jiraKey":"WFN-178","year":"2025","requestedFor":"","openedAt":"2025-02-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-11T14:21:12.000Z"},"RITM2360773":{"state":"Closed Complete","shortDesc":"Gaviscon AT Landing Page","assignedTo":"Herman Bykanov (Inactive)","brand":"Gaviscon","market":"Austria","businessUnit":"Health","finalCost":"3600","currencyCode":"GBP","ttfrMinutes":1432,"clientRespMinutes":6607,"firstReplyAt":"2025-02-20 14:06:57","firstAssignedDate":"2025-02-20 10:14:27","fulfillmentDate":"2025-02-19 14:15:11","openedBy":"Julia Kuzovkova","openedDate":"2025-02-19","closedDate":"2025-04-09","toDoAt":"2025-03-11T17:34:03.807+0100","inUatAt":"2025-03-18T11:25:52.707+0100","jiraKey":"WFN-195","year":"2025","requestedFor":"Julia Kuzovkova","openedAt":"2025-02-19 14:15:07","stateChangedAt":"2025-04-09 11:20:57","stateChangedBy":"System","lastActivityAt":"2025-04-30 16:52:35","lastActivityBy":"Herman Bykanov (Inactive)","_updated":"2025-04-30T11:52:36.000Z"},"RITM2363503":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":4330,"clientRespMinutes":333,"firstReplyAt":"2025-02-24 15:40:30","firstAssignedDate":"2025-02-24 10:23:04","fulfillmentDate":"2025-02-21 15:30:59","openedBy":"Maria Papagiannea","openedDate":"2025-02-21","closedDate":"2025-03-06","toDoAt":"2025-02-26T08:52:33.417+0100","inUatAt":"2025-03-06T09:29:24.953+0100","jiraKey":"WFN-182","year":"2025","requestedFor":"","openedAt":"2025-02-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-06T10:30:14.000Z"},"RITM2363738":{"state":"Closed Complete","shortDesc":"Ajustes en sico.com.mx","assignedTo":"Renata Probst Martínez","brand":"Sico","market":"Mexico","businessUnit":null,"finalCost":"","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":null,"firstAssignedDate":null,"fulfillmentDate":null,"openedBy":null,"openedDate":null,"closedDate":null,"toDoAt":null,"inUatAt":null,"jiraKey":null,"year":null,"requestedFor":"Mariana Onofre Castro","openedAt":"2025-02-21 19:23:56","stateChangedAt":"2025-03-19 19:20:51","stateChangedBy":"System","lastActivityAt":"","lastActivityBy":"","_updated":"2025-03-19T16:20:51.000Z"},"RITM2365861":{"state":"Closed Complete","shortDesc":"Destop website updates","assignedTo":"Herman Bykanov (Inactive)","brand":"Destop","market":"France","businessUnit":"Hygiene","finalCost":"1440","currencyCode":"EUR","ttfrMinutes":242,"clientRespMinutes":2241,"firstReplyAt":"2025-02-25 13:56:15","firstAssignedDate":"2025-02-25 10:34:42","fulfillmentDate":"2025-02-25 09:54:33","openedBy":"Lilas Ouared","openedDate":"2025-02-25","closedDate":"2025-04-01","toDoAt":"2025-02-26T13:10:44.557+0100","inUatAt":"2025-03-14T11:01:38.037+0100","jiraKey":"WFN-183","year":"2025","requestedFor":"","openedAt":"2025-02-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-01T10:40:09.000Z"},"RITM2366291":{"state":"Closed Complete","shortDesc":"Max elektro on finish.pl","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Poland","businessUnit":"Hygiene","finalCost":"720","currencyCode":"EUR","ttfrMinutes":8771,"clientRespMinutes":693,"firstReplyAt":"2025-03-03 16:16:34","firstAssignedDate":"2025-02-26 10:46:24","fulfillmentDate":"2025-02-25 14:05:45","openedBy":"Malgorzata Szatkowska (Inactive)","openedDate":"2025-02-25","closedDate":"2025-03-19","toDoAt":"2025-03-04T17:58:17.260+0100","inUatAt":"2025-03-06T15:17:35.723+0100","jiraKey":"WFN-188","year":"2025","requestedFor":"","openedAt":"2025-02-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-19T11:20:53.000Z"},"RITM2367368":{"state":"Closed Complete","shortDesc":"Finish in-machine sample CRO","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"1500","currencyCode":"GBP","ttfrMinutes":7272,"clientRespMinutes":9183,"firstReplyAt":"2025-03-03 12:50:09","firstAssignedDate":"2025-02-27 09:58:29","fulfillmentDate":"2025-02-26 11:38:33","openedBy":"Anna Koroknay","openedDate":"2025-02-26","closedDate":"2025-06-17","toDoAt":"2025-04-08T15:02:19.440+0200","inUatAt":"2025-05-02T09:20:47.260+0200","jiraKey":"WFN-207","year":"2025","requestedFor":"","openedAt":"2025-02-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-17T09:20:57.000Z"},"RITM2367378":{"state":"Closed Complete","shortDesc":"Finish in-machine sample SLO WG","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"1500","currencyCode":"GBP","ttfrMinutes":7265,"clientRespMinutes":10684,"firstReplyAt":"2025-03-03 12:50:12","firstAssignedDate":"2025-02-27 09:58:38","fulfillmentDate":"2025-02-26 11:45:35","openedBy":"Anna Koroknay","openedDate":"2025-02-26","closedDate":"2025-06-17","toDoAt":"2025-04-04T13:10:57.973+0200","inUatAt":null,"jiraKey":"WFN-208","year":"2025","requestedFor":"","openedAt":"2025-02-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-17T09:21:12.000Z"},"RITM2367658":{"state":"Closed Complete","shortDesc":"we need the copyright history of our images","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Veet","market":"Netherlands","businessUnit":"Health","finalCost":"144","currencyCode":"EUR","ttfrMinutes":47,"clientRespMinutes":2832,"firstReplyAt":"2025-02-26 16:04:47","firstAssignedDate":"2025-02-26 16:04:47","fulfillmentDate":"2025-02-26 15:18:13","openedBy":"Camille Landais (Inactive)","openedDate":"2025-02-26","closedDate":"2025-05-04","toDoAt":"2025-03-18T15:20:32.823+0100","inUatAt":null,"jiraKey":"WFN-211","year":"2025","requestedFor":"","openedAt":"2025-02-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-04T09:20:54.000Z"},"RITM2368833":{"state":"Closed Complete","shortDesc":"Wrong product description in Veet Finnish website","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Finland","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1258,"clientRespMinutes":2812,"firstReplyAt":"2025-02-28 12:10:37","firstAssignedDate":"2025-02-27 15:24:45","fulfillmentDate":"2025-02-27 15:12:43","openedBy":"Klara Johansson (Inactive)","openedDate":"2025-02-27","closedDate":"2025-05-07","toDoAt":"2025-03-18T15:13:52.853+0100","inUatAt":"2025-03-04T10:14:32.713+0100","jiraKey":"WFN-184","year":"2025","requestedFor":"Klara Johansson (Inactive)","openedAt":"2025-02-27 15:12:40","stateChangedAt":"2025-05-07 15:20:52","stateChangedBy":"System","lastActivityAt":"2025-05-02 14:31:50","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-05-07T10:20:52.000Z"},"RITM2368992":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1439,"clientRespMinutes":1673,"firstReplyAt":"2025-02-28 17:07:26","firstAssignedDate":"2025-02-28 12:54:45","fulfillmentDate":"2025-02-27 17:08:46","openedBy":"Maria Papagiannea","openedDate":"2025-02-27","closedDate":"2025-03-07","toDoAt":"2025-03-06T14:03:55.597+0100","inUatAt":"2025-03-07T15:07:27.063+0100","jiraKey":"WFN-191","year":"2025","requestedFor":"","openedAt":"2025-02-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-07T13:40:09.000Z"},"RITM2369894":{"state":"Closed Complete","shortDesc":"Greek microsite update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Greece","businessUnit":"Hygiene","finalCost":"600","currencyCode":"GBP","ttfrMinutes":7576,"clientRespMinutes":2173,"firstReplyAt":"2025-03-05 16:15:40","firstAssignedDate":"2025-02-28 15:17:10","fulfillmentDate":"2025-02-28 09:59:19","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2025-02-28","closedDate":"2025-03-31","toDoAt":"2025-03-06T10:49:09.383+0100","inUatAt":"2025-03-17T11:10:31.930+0100","jiraKey":"WFN-185","year":"2025","requestedFor":"","openedAt":"2025-02-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-31T09:20:52.000Z"},"RITM2369928":{"state":"Closed Complete","shortDesc":"Strepsils ZA - Hypercare","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Hungary","businessUnit":"Health","finalCost":"0","currencyCode":"PART","ttfrMinutes":10045,"clientRespMinutes":1140,"firstReplyAt":"2025-03-07 09:47:32","firstAssignedDate":"2025-02-28 15:15:25","fulfillmentDate":"2025-02-28 10:22:59","openedBy":"Rowena Hearn","openedDate":"2025-02-28","closedDate":"2025-03-25","toDoAt":"2025-03-04T09:16:45.660+0100","inUatAt":"2025-03-05T19:57:27.810+0100","jiraKey":"WFN-186","year":"2025","requestedFor":"","openedAt":"2025-02-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-25T10:20:57.000Z"},"RITM2369979":{"state":"Closed Complete","shortDesc":"need to create a new page on VANISH.IT with a banner i will provide you","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Vanish","market":"Italy","businessUnit":"Hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":268,"clientRespMinutes":4053,"firstReplyAt":"2025-02-28 15:28:07","firstAssignedDate":"2025-02-28 15:19:50","fulfillmentDate":"2025-02-28 11:00:12","openedBy":"Laura Sarotto (Inactive)","openedDate":"2025-02-28","closedDate":"2025-03-23","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-190","year":"2025","requestedFor":"","openedAt":"2025-02-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-23T12:20:55.000Z"},"RITM2372390":{"state":"Closed Complete","shortDesc":"Air Wick MX Spring Article","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Mexico","businessUnit":"Hygiene","finalCost":"6000","currencyCode":"MXN","ttfrMinutes":1666,"clientRespMinutes":4616,"firstReplyAt":"2025-03-05 08:15:11","firstAssignedDate":"2025-03-04 10:04:49","fulfillmentDate":"2025-03-04 04:28:47","openedBy":"Mariana Onofre Castro","openedDate":"2025-03-04","closedDate":"2025-03-31","toDoAt":"2025-03-10T12:02:42.967+0100","inUatAt":"2025-03-21T11:17:46.873+0100","jiraKey":"WFN-187","year":"2025","requestedFor":"Mariana Onofre Castro","openedAt":"2025-03-04 04:28:44","stateChangedAt":"2025-03-31 14:20:53","stateChangedBy":"System","lastActivityAt":"2025-03-25 19:37:17","lastActivityBy":"Mariana Onofre Castro","_updated":"2025-03-31T09:20:53.000Z"},"RITM2372804":{"state":"Closed Complete","shortDesc":"Destopinfos.be website not showing in search results. It is live and accessible by link or by typing the full URL in the browser, but does not appear in searches, even when searching the exact name of the website.","assignedTo":"Alesya Prolagayeva","brand":"Destop","market":"Belgium","businessUnit":"","finalCost":"","currencyCode":"","ttfrMinutes":8693,"clientRespMinutes":3064,"firstReplyAt":"2025-03-10 11:38:59","firstAssignedDate":"2025-03-10 11:38:59","fulfillmentDate":"","openedBy":"Etienne Paret (Inactive)","openedDate":"2025-03-04","closedDate":"2025-04-30","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-201","year":"2025","requestedFor":"","openedAt":"2025-03-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-30T10:21:28.000Z"},"RITM2373161":{"state":"Closed Complete","shortDesc":"Overhaul and technical improvements for All brands (Durex, Veet and Fiish)","assignedTo":"Herman Bykanov (Inactive)","brand":"Multibrand","market":"Spain","businessUnit":"Corporate","finalCost":"3024","currencyCode":"EUR","ttfrMinutes":4243,"clientRespMinutes":7361,"firstReplyAt":"2025-03-07 13:13:22","firstAssignedDate":"2025-03-05 10:15:03","fulfillmentDate":"2025-03-04 14:30:38","openedBy":"Mayrena Beltran (Inactive)","openedDate":"2025-03-04","closedDate":"2025-04-14","toDoAt":"2025-03-25T12:23:16.633+0100","inUatAt":"2025-04-07T12:05:22.707+0200","jiraKey":"WFN-212","year":"2025","requestedFor":"Mayrena Beltran (Inactive)","openedAt":"2025-03-04 14:30:35","stateChangedAt":"2025-04-14 09:20:55","stateChangedBy":"System","lastActivityAt":"2025-04-08 16:40:28","lastActivityBy":"Herman Bykanov (Inactive)","_updated":"2025-04-14T04:20:55.000Z"},"RITM2373236":{"state":"Closed Complete","shortDesc":"Finish Croatia subpage update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":4101,"clientRespMinutes":5494,"firstReplyAt":"2025-03-07 11:37:33","firstAssignedDate":"2025-03-06 15:14:41","fulfillmentDate":"2025-03-04 15:16:52","openedBy":"Anna Koroknay","openedDate":"2025-03-04","closedDate":"2025-06-10","toDoAt":"2025-05-08T15:33:36.050+0200","inUatAt":"2025-05-16T12:31:08.543+0200","jiraKey":"WFN-204","year":"2025","requestedFor":"","openedAt":"2025-03-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-10T11:20:51.000Z"},"RITM2373244":{"state":"Closed Complete","shortDesc":"Slovenia Finish subpage update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":4096,"clientRespMinutes":11900,"firstReplyAt":"2025-03-07 11:39:23","firstAssignedDate":"2025-03-06 15:14:54","fulfillmentDate":"2025-03-04 15:23:36","openedBy":"Anna Koroknay","openedDate":"2025-03-04","closedDate":"2025-06-10","toDoAt":"2025-05-08T15:59:27.773+0200","inUatAt":"2025-05-16T12:31:22.880+0200","jiraKey":"WFN-205","year":"2025","requestedFor":"","openedAt":"2025-03-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-23T04:58:20.000Z"},"RITM2373256":{"state":"Closed Complete","shortDesc":"Serbia Finish subpage update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":4093,"clientRespMinutes":17920,"firstReplyAt":"2025-03-07 11:41:19","firstAssignedDate":"2025-03-07 10:08:07","fulfillmentDate":"2025-03-04 15:28:32","openedBy":"Anna Koroknay","openedDate":"2025-03-04","closedDate":"2025-06-10","toDoAt":"2025-05-08T15:57:54.827+0200","inUatAt":"2025-05-16T12:31:25.990+0200","jiraKey":"WFN-206","year":"2025","requestedFor":"","openedAt":"2025-03-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-23T04:57:45.000Z"},"RITM2373278":{"state":"Closed Complete","shortDesc":"Kosovo Finish subpage","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":4082,"clientRespMinutes":6682,"firstReplyAt":"2025-03-07 11:37:18","firstAssignedDate":"2025-03-06 15:14:47","fulfillmentDate":"2025-03-04 15:35:34","openedBy":"Anna Koroknay","openedDate":"2025-03-04","closedDate":"2025-06-10","toDoAt":"2025-05-08T15:57:41.650+0200","inUatAt":"2025-05-16T12:31:19.870+0200","jiraKey":"WFN-203","year":"2025","requestedFor":"","openedAt":"2025-03-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-10T11:20:53.000Z"},"RITM2374773":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":2857,"clientRespMinutes":2870,"firstReplyAt":"2025-03-07 16:33:35","firstAssignedDate":"2025-03-07 10:06:47","fulfillmentDate":"2025-03-05 16:56:33","openedBy":"Maria Papagiannea","openedDate":"2025-03-05","closedDate":"2025-03-19","toDoAt":"2025-03-11T11:35:50.433+0100","inUatAt":"2025-03-11T12:01:23.290+0100","jiraKey":"WFN-193","year":"2025","requestedFor":"","openedAt":"2025-03-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-19T09:20:55.000Z"},"RITM2374822":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"300","currencyCode":"GBP","ttfrMinutes":2832,"clientRespMinutes":1707,"firstReplyAt":"2025-03-07 16:30:35","firstAssignedDate":"2025-03-07 10:06:31","fulfillmentDate":"2025-03-05 17:18:47","openedBy":"Maria Papagiannea","openedDate":"2025-03-05","closedDate":"2025-03-17","toDoAt":"2025-03-11T16:56:10.630+0100","inUatAt":"2025-03-14T16:40:57.997+0100","jiraKey":"WFN-194","year":"2025","requestedFor":"","openedAt":"2025-03-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-17T20:10:09.000Z"},"RITM2375593":{"state":"Closed Complete","shortDesc":"MikMak x Durex DE - Brand.com implementation","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Durex","market":"Germany","businessUnit":"Health","finalCost":"900","currencyCode":"GBP","ttfrMinutes":528,"clientRespMinutes":5800,"firstReplyAt":"2025-03-06 19:49:13","firstAssignedDate":"2025-03-06 14:15:20","fulfillmentDate":"2025-03-06 11:01:08","openedBy":"Joseph Tseng","openedDate":"2025-03-06","closedDate":"2025-12-28","toDoAt":"2025-03-25T14:26:18.373+0100","inUatAt":"2025-04-02T09:41:50.620+0200","jiraKey":"WFN-192","year":"2025","requestedFor":"Joseph Tseng","openedAt":"2025-03-06 11:01:05","stateChangedAt":"2025-12-28 14:20:54","stateChangedBy":"System","lastActivityAt":"2025-12-23 14:06:33","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-12-28T11:20:54.000Z"},"RITM2375953":{"state":"Closed Cancelled","shortDesc":"Create a form page to collect leads in websites","assignedTo":"Alesya Prolagayeva","brand":"Veja","market":"Brazil","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":1716,"clientRespMinutes":40135,"firstReplyAt":"2025-03-07 19:06:20","firstAssignedDate":"2025-03-07 10:00:36","fulfillmentDate":"2025-03-06 14:30:54","openedBy":"Monique Da Silva","openedDate":"2025-03-06","closedDate":"2025-09-15","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-281","year":"2025","requestedFor":"Monique Da Silva","openedAt":"2025-03-06 14:30:50","stateChangedAt":"2025-09-15 12:36:23","stateChangedBy":"System","lastActivityAt":"2025-09-15 12:35:55","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-09-15T07:36:23.000Z"},"RITM2376095":{"state":"Closed Complete","shortDesc":"Change of image in section “Hair removal products range”.","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Veet","market":"Spain","businessUnit":"Hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":8764,"clientRespMinutes":1531,"firstReplyAt":"2025-03-12 18:47:18","firstAssignedDate":"2025-03-07 10:05:19","fulfillmentDate":"2025-03-06 16:43:46","openedBy":"Mayrena Beltran (Inactive)","openedDate":"2025-03-06","closedDate":"2025-03-19","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-197","year":"2025","requestedFor":"Mayrena Beltran (Inactive)","openedAt":"2025-03-06 16:43:43","stateChangedAt":"2025-03-19 12:20:57","stateChangedBy":"System","lastActivityAt":"2025-03-13 13:25:15","lastActivityBy":"Mayrena Beltran (Inactive)","_updated":"2025-03-19T09:20:57.000Z"},"RITM2376316":{"state":"Closed Complete","shortDesc":"Inclusion of a new product and updates","assignedTo":"Jesica Greco","brand":"Luftal","market":"Brazil","businessUnit":"Health","finalCost":"2400","currencyCode":"MXN","ttfrMinutes":1320,"clientRespMinutes":3969,"firstReplyAt":"2025-03-07 19:03:00","firstAssignedDate":"2025-03-07 09:59:47","fulfillmentDate":"2025-03-06 21:03:06","openedBy":"Esther Oliveira (Inactive)","openedDate":"2025-03-06","closedDate":"2025-03-18","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"Esther Oliveira (Inactive)","openedAt":"2025-03-06 21:03:01","stateChangedAt":"2025-03-18 18:21:15","stateChangedBy":"System","lastActivityAt":"2025-03-13 15:54:44","lastActivityBy":"Jesica Greco","_updated":"2025-03-18T21:09:50.000Z"},"RITM2378963":{"state":"Closed Complete","shortDesc":"Upload of Marigold product pages","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Spain","businessUnit":"Health","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1119,"clientRespMinutes":3114,"firstReplyAt":"2025-03-11 10:13:40","firstAssignedDate":"2025-03-11 10:13:40","fulfillmentDate":"2025-03-10 15:35:10","openedBy":"Mayrena Beltran (Inactive)","openedDate":"2025-03-10","closedDate":"2025-04-09","toDoAt":"2025-03-21T09:43:51.017+0100","inUatAt":"2025-03-15T13:23:31.273+0100","jiraKey":"WFN-198","year":"2025","requestedFor":"Mayrena Beltran (Inactive)","openedAt":"2025-03-10 15:35:07","stateChangedAt":"2025-04-09 15:20:54","stateChangedBy":"System","lastActivityAt":"2025-04-04 14:44:21","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-04-09T10:20:54.000Z"},"RITM2379538":{"state":"Closed Complete","shortDesc":"Packshot update on CRO Strepsils website: https://strepsils.hr/svi-proizvodi/","assignedTo":"Herman Bykanov (Inactive)","brand":"Strepsils","market":"Croatia","businessUnit":"Health","finalCost":"300","currencyCode":"GBP","ttfrMinutes":104,"clientRespMinutes":511,"firstReplyAt":"2025-03-11 10:22:38","firstAssignedDate":"2025-03-11 10:15:10","fulfillmentDate":"2025-03-11 08:38:44","openedBy":"Noemi Chrobot (Inactive)","openedDate":"2025-03-11","closedDate":"2025-03-18","toDoAt":null,"inUatAt":"2025-03-13T09:57:59.010+0100","jiraKey":"WFN-199","year":"2025","requestedFor":"","openedAt":"2025-03-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-03-18T11:21:10.000Z"},"RITM2379993":{"state":"Closed Complete","shortDesc":"Images update for Strepsils.dk","assignedTo":"Levon Mkrtchyan (Inactive)","brand":"Strepsils","market":"Denmark","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":2857,"clientRespMinutes":2256,"firstReplyAt":"2025-03-13 13:57:58","firstAssignedDate":"2025-03-12 08:12:41","fulfillmentDate":"2025-03-11 14:21:29","openedBy":"Harry Malakis","openedDate":"2025-03-11","closedDate":"2025-03-26","toDoAt":"2025-03-12T14:23:22.873+0100","inUatAt":"2025-03-13T13:51:57.873+0100","jiraKey":"WFN-196","year":"2025","requestedFor":"Harry Malakis","openedAt":"2025-03-11 14:21:26","stateChangedAt":"2025-03-26 12:20:51","stateChangedBy":"System","lastActivityAt":"2025-03-21 11:51:15","lastActivityBy":"Levon Mkrtchyan (Inactive)","_updated":"2025-03-26T09:20:51.000Z"},"RITM2380129":{"state":"Closed Complete","shortDesc":"Nurofen - Phase 3 Body Pain","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"United Kingdom","businessUnit":"Health","finalCost":"3000","currencyCode":"GBP","ttfrMinutes":21436,"clientRespMinutes":7978,"firstReplyAt":"2025-03-26 13:10:09","firstAssignedDate":"2025-03-17 09:54:17","fulfillmentDate":"2025-03-11 15:54:41","openedBy":"Rowena Hearn","openedDate":"2025-03-11","closedDate":"2025-11-05","toDoAt":"2025-03-19T17:44:02.180+0100","inUatAt":"2025-03-26T13:11:35.563+0100","jiraKey":"WFN-214","year":"2025","requestedFor":"","openedAt":"2025-03-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-05T14:20:57.000Z"},"RITM2380217":{"state":"Closed Complete","shortDesc":"We want to create a new category and pages on Veet France website","assignedTo":"Herman Bykanov (Inactive)","brand":"Veet","market":"France","businessUnit":"Health","finalCost":"1944","currencyCode":"EUR","ttfrMinutes":2799,"clientRespMinutes":8619,"firstReplyAt":"2025-03-13 16:04:37","firstAssignedDate":"2025-03-12 09:58:10","fulfillmentDate":"2025-03-11 17:25:50","openedBy":"Camille Landais (Inactive)","openedDate":"2025-03-11","closedDate":"2025-04-14","toDoAt":"2025-03-18T11:24:01.230+0100","inUatAt":"2025-03-27T16:38:16.867+0100","jiraKey":"WFN-200","year":"2025","requestedFor":"","openedAt":"2025-03-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-14T07:20:55.000Z"},"RITM2382388":{"state":"Closed Complete","shortDesc":"HU Finish website Nielsen disclaimer adding","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1391,"clientRespMinutes":6206,"firstReplyAt":"2025-03-14 10:01:57","firstAssignedDate":"2025-03-14 10:01:57","fulfillmentDate":"2025-03-13 10:50:35","openedBy":"Anna Koroknay","openedDate":"2025-03-13","closedDate":"2025-04-09","toDoAt":"2025-03-19T09:23:31.267+0100","inUatAt":"2025-03-19T15:53:22.207+0100","jiraKey":"WFN-202","year":"2025","requestedFor":"","openedAt":"2025-03-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-09T10:20:55.000Z"},"RITM2383391":{"state":"Closed Complete","shortDesc":"Our website went live in december. IT IS A CRITICAL MATTER\r\nHowever, the website doesnt show on google, unless the exact URL is typed in","assignedTo":"Alesya Prolagayeva","brand":"Destop","market":"Belgium","businessUnit":"","finalCost":"","currencyCode":"","ttfrMinutes":30,"clientRespMinutes":542,"firstReplyAt":"2025-03-14 09:07:48","firstAssignedDate":"2025-03-14 08:42:35","fulfillmentDate":"","openedBy":"Preksha Singhvi","openedDate":"2025-03-14","closedDate":"2025-04-30","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-03-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-30T10:21:00.000Z"},"RITM2385118":{"state":"Closed Complete","shortDesc":"website optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":3919,"clientRespMinutes":5810,"firstReplyAt":"2025-03-20 08:12:26","firstAssignedDate":"2025-03-18 10:01:12","fulfillmentDate":"2025-03-17 14:53:08","openedBy":"Maria Papagiannea","openedDate":"2025-03-17","closedDate":"2025-04-06","toDoAt":"2025-03-20T10:33:36.940+0100","inUatAt":"2025-03-20T12:55:28.687+0100","jiraKey":"WFN-210","year":"2025","requestedFor":"","openedAt":"2025-03-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-06T08:20:55.000Z"},"RITM2385354":{"state":"Closed Complete","shortDesc":"Request content amends for Finish Italian website","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"3024","currencyCode":"EUR","ttfrMinutes":987,"clientRespMinutes":2614,"firstReplyAt":"2025-03-18 09:52:40","firstAssignedDate":"2025-03-18 09:29:47","fulfillmentDate":"2025-03-17 17:25:28","openedBy":"Luigi Monteleone (Inactive)","openedDate":"2025-03-17","closedDate":"2025-05-07","toDoAt":"2025-03-18T09:50:26.823+0100","inUatAt":"2025-03-26T13:11:43.617+0100","jiraKey":"WFN-209","year":"2025","requestedFor":"","openedAt":"2025-03-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-07T05:20:58.000Z"},"RITM2386789":{"state":"Closed Complete","shortDesc":"New Gavidigest tab on the Gaviscon site","assignedTo":"Herman Bykanov (Inactive)","brand":"Gaviscon","market":"Spain","businessUnit":"Health","finalCost":"2304","currencyCode":"EUR","ttfrMinutes":1229,"clientRespMinutes":129,"firstReplyAt":"2025-03-19 17:33:06","firstAssignedDate":"2025-03-19 10:13:04","fulfillmentDate":"2025-03-18 21:03:40","openedBy":"Mayrena Beltran (Inactive)","openedDate":"2025-03-18","closedDate":"2025-05-25","toDoAt":"2025-04-29T11:11:58.883+0200","inUatAt":"2025-05-09T16:47:15.437+0200","jiraKey":"WFN-226","year":"2025","requestedFor":"Mayrena Beltran (Inactive)","openedAt":"2025-03-18 21:03:37","stateChangedAt":"2025-05-25 13:20:55","stateChangedBy":"System","lastActivityAt":"2025-04-16 12:30:42","lastActivityBy":"Sara Canal","_updated":"2025-05-25T08:20:55.000Z"},"RITM2387190":{"state":"Closed Complete","shortDesc":"Durex Romania website - new subpage for mobile wallpapers","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Durex","market":"Romania","businessUnit":"Health","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":457,"clientRespMinutes":10366,"firstReplyAt":"2025-03-19 16:11:57","firstAssignedDate":"2025-03-19 10:09:49","fulfillmentDate":"2025-03-19 08:35:27","openedBy":"Robert Gavrila","openedDate":"2025-03-19","closedDate":"2025-04-20","toDoAt":"2025-03-28T11:18:27.647+0100","inUatAt":null,"jiraKey":"WFN-213","year":"2025","requestedFor":"","openedAt":"2025-03-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-20T05:20:57.000Z"},"RITM2387454":{"state":"Closed Complete","shortDesc":"Nurofen Website Issues","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Nurofen","market":"Greece","businessUnit":"Health","finalCost":"300","currencyCode":"GBP","ttfrMinutes":8790,"clientRespMinutes":1275,"firstReplyAt":"2025-03-25 13:38:52","firstAssignedDate":"2025-03-20 10:35:51","fulfillmentDate":"2025-03-19 11:08:49","openedBy":"Natalia Gkertsou (Inactive)","openedDate":"2025-03-19","closedDate":"2025-04-29","toDoAt":"2025-03-28T11:22:52.007+0100","inUatAt":"2025-04-01T18:10:53.897+0200","jiraKey":"WFN-216","year":"2025","requestedFor":"","openedAt":"2025-03-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-29T08:21:25.000Z"},"RITM2387463":{"state":"Closed Complete","shortDesc":"Pink and white powder render update | Vanish MX","assignedTo":"Jesica Greco","brand":"Vanish","market":"Mexico","businessUnit":"Hygiene","finalCost":"24000","currencyCode":"MXN","ttfrMinutes":10262,"clientRespMinutes":1670,"firstReplyAt":"2025-03-26 14:13:26","firstAssignedDate":"2025-03-20 10:18:01","fulfillmentDate":"2025-03-19 11:11:19","openedBy":"Mariana Onofre Castro","openedDate":"2025-03-19","closedDate":"2025-05-14","toDoAt":"2025-03-31T14:55:39.997+0200","inUatAt":null,"jiraKey":"WFN-227","year":"2025","requestedFor":"Mariana Onofre Castro","openedAt":"2025-03-19 11:11:11","stateChangedAt":"2025-05-14 17:20:56","stateChangedBy":"System","lastActivityAt":"2025-05-09 17:03:03","lastActivityBy":"Jesica Greco","_updated":"2025-05-14T12:20:56.000Z"},"RITM2388718":{"state":"Closed Complete","shortDesc":"Nurofen Romania Wesbite Updates","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Romania","businessUnit":"Health","finalCost":"600","currencyCode":"GBP","ttfrMinutes":295,"clientRespMinutes":1789,"firstReplyAt":"2025-03-20 15:02:41","firstAssignedDate":"2025-03-20 10:17:50","fulfillmentDate":"2025-03-20 10:07:37","openedBy":"Ana-Maria Mocanu (Inactive)","openedDate":"2025-03-20","closedDate":"2025-04-22","toDoAt":"2025-02-07T18:54:20.147+0100","inUatAt":"2025-02-11T22:38:37.913+0100","jiraKey":"WFN-133","year":"2025","requestedFor":"","openedAt":"2025-03-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-22T10:20:56.000Z"},"RITM2390273":{"state":"Closed Cancelled","shortDesc":"Adding new article on Vanish.com.tr","assignedTo":"Herman Bykanov (Inactive)","brand":"Vanish","market":"Turkey","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":5769,"clientRespMinutes":6843,"firstReplyAt":"2025-03-25 09:58:23","firstAssignedDate":"2025-03-21 09:51:35","fulfillmentDate":"2025-03-21 09:49:38","openedBy":"Berke Bekem (Inactive)","openedDate":"2025-03-21","closedDate":"2025-07-11","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-218","year":"2025","requestedFor":"Berke Bekem (Inactive)","openedAt":"2025-03-21 09:49:34","stateChangedAt":"2025-07-11 14:09:17","stateChangedBy":"System","lastActivityAt":"2025-07-11 14:08:03","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-07-11T09:09:17.000Z"},"RITM2390680":{"state":"Closed Complete","shortDesc":"Website Luftal","assignedTo":"Jesica Greco","brand":"Luftal","market":"Brazil","businessUnit":"Health","finalCost":"2667","currencyCode":"MXN","ttfrMinutes":174,"clientRespMinutes":1287,"firstReplyAt":"2025-03-21 16:52:49","firstAssignedDate":"2025-03-21 16:52:49","fulfillmentDate":"2025-03-21 13:59:02","openedBy":"Bruna Sakamoto Ferreira (Inactive)","openedDate":"2025-03-21","closedDate":"2025-04-06","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"Bruna Sakamoto Ferreira (Inactive)","openedAt":"2025-03-21 13:58:59","stateChangedAt":"2025-04-06 18:21:17","stateChangedBy":"System","lastActivityAt":"2025-04-01 17:52:41","lastActivityBy":"Jesica Greco","_updated":"2025-06-05T12:39:42.000Z"},"RITM2390885":{"state":"Closed Complete","shortDesc":"CONNECTED SAMPLES FINISH x QUANTUM","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"France","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":5582,"clientRespMinutes":1742,"firstReplyAt":"2025-03-25 13:57:59","firstAssignedDate":"2025-03-24 10:05:38","fulfillmentDate":"2025-03-21 16:56:09","openedBy":"Matteo Baron","openedDate":"2025-03-21","closedDate":"2025-04-23","toDoAt":"2025-03-26T09:45:38.267+0100","inUatAt":"2025-03-28T13:07:05.383+0100","jiraKey":"WFN-219","year":"2025","requestedFor":"","openedAt":"2025-03-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-23T09:21:15.000Z"},"RITM2391587":{"state":"Closed Complete","shortDesc":"Finish website product packshots update","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Romania","businessUnit":"Hygiene","finalCost":"1320","currencyCode":"GBP","ttfrMinutes":3015,"clientRespMinutes":10161,"firstReplyAt":"2025-03-26 10:36:54","firstAssignedDate":"2025-03-24 10:06:24","fulfillmentDate":"2025-03-24 08:22:01","openedBy":"Diana Petre (Inactive)","openedDate":"2025-03-24","closedDate":"2025-06-08","toDoAt":"2025-03-26T11:07:45.860+0100","inUatAt":"2025-04-24T17:14:43.787+0200","jiraKey":"WFN-222","year":"2025","requestedFor":"","openedAt":"2025-03-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-08T07:20:55.000Z"},"RITM2393006":{"state":"Closed Complete","shortDesc":"Changes in Water Day Landings | Finish MX","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Mexico","businessUnit":"Hygiene","finalCost":"26400","currencyCode":"MXN","ttfrMinutes":402,"clientRespMinutes":3797,"firstReplyAt":"2025-03-25 15:59:31","firstAssignedDate":"2025-03-25 10:17:52","fulfillmentDate":"2025-03-25 09:17:19","openedBy":"Mariana Onofre Castro","openedDate":"2025-03-25","closedDate":"2025-06-08","toDoAt":"2025-04-08T18:43:15.187+0200","inUatAt":"2025-04-16T12:36:05.480+0200","jiraKey":"WFN-242","year":"2025","requestedFor":"Mariana Onofre Castro","openedAt":"2025-03-25 09:17:13","stateChangedAt":"2025-06-08 12:21:11","stateChangedBy":"System","lastActivityAt":"2025-05-29 21:10:20","lastActivityBy":"Mariana Onofre Castro","_updated":"2025-06-08T07:21:11.000Z"},"RITM2393358":{"state":"Closed Cancelled","shortDesc":"Website adaptation to EAA","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Portugal","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":3046,"clientRespMinutes":null,"firstReplyAt":"2025-03-27 15:18:50","firstAssignedDate":"2025-03-26 10:19:18","fulfillmentDate":"2025-03-25 12:32:55","openedBy":"Catarina Teles","openedDate":"2025-03-25","closedDate":"2025-07-14","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-223","year":"2025","requestedFor":"Catarina Teles","openedAt":"2025-03-25 12:32:52","stateChangedAt":"2025-07-14 16:01:56","stateChangedBy":"System","lastActivityAt":"2025-07-14 16:02:20","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-07-14T11:02:20.000Z"},"RITM2393594":{"state":"Closed Complete","shortDesc":"HU Finish website Emag CTA button removing","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1175,"clientRespMinutes":2863,"firstReplyAt":"2025-03-26 10:18:40","firstAssignedDate":"2025-03-26 10:18:40","fulfillmentDate":"2025-03-25 14:43:56","openedBy":"Anna Koroknay","openedDate":"2025-03-25","closedDate":"2025-04-12","toDoAt":"2025-03-27T09:42:42.343+0100","inUatAt":"2025-03-27T23:25:17.683+0100","jiraKey":"WFN-221","year":"2025","requestedFor":"","openedAt":"2025-03-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-12T15:20:52.000Z"},"RITM2395773":{"state":"Closed Complete","shortDesc":"Update Website","assignedTo":"Alesya Prolagayeva","brand":"Dobendan","market":"Austria","businessUnit":"Health","finalCost":"1500","currencyCode":"GBP","ttfrMinutes":5921,"clientRespMinutes":6011,"firstReplyAt":"2025-03-31 13:23:24","firstAssignedDate":"2025-03-27 09:56:55","fulfillmentDate":"2025-03-27 09:42:56","openedBy":"Emina Kara","openedDate":"2025-03-27","closedDate":"2025-10-26","toDoAt":"2025-04-14T16:41:59.827+0200","inUatAt":"2025-05-22T18:01:12.500+0200","jiraKey":"WFN-224","year":"2025","requestedFor":"Emina Kara","openedAt":"2025-03-27 09:42:52","stateChangedAt":"2025-10-26 13:20:59","stateChangedBy":"System","lastActivityAt":"2025-10-07 17:52:02","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-10-26T10:20:59.000Z"},"RITM2395775":{"state":"Closed Complete","shortDesc":"Adaptation","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Switzerland","businessUnit":"Health","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":428,"clientRespMinutes":5218,"firstReplyAt":"2025-03-27 16:52:19","firstAssignedDate":"2025-03-27 09:56:57","fulfillmentDate":"2025-03-27 09:44:54","openedBy":"Emina Kara","openedDate":"2025-03-27","closedDate":"2025-10-26","toDoAt":"2025-06-25T09:52:34.413+0200","inUatAt":"2025-08-01T16:17:43.927+0200","jiraKey":"WFN-225","year":"2025","requestedFor":"Emina Kara","openedAt":"2025-03-27 09:44:49","stateChangedAt":"2025-10-26 13:20:55","stateChangedBy":"System","lastActivityAt":"2025-10-10 10:22:47","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-10-26T10:20:55.000Z"},"RITM2397565":{"state":"Closed Complete","shortDesc":"HU Finish Pepita subpage creating","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":5972,"clientRespMinutes":2811,"firstReplyAt":"2025-04-01 17:07:44","firstAssignedDate":"2025-03-28 13:39:30","fulfillmentDate":"2025-03-28 12:35:50","openedBy":"Anna Koroknay","openedDate":"2025-03-28","closedDate":"2025-10-26","toDoAt":"2025-04-04T18:44:29.007+0200","inUatAt":"2025-08-01T16:19:01.227+0200","jiraKey":"WFN-237","year":"2025","requestedFor":"","openedAt":"2025-03-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-26T10:20:53.000Z"},"RITM2399911":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1673,"clientRespMinutes":2294,"firstReplyAt":"2025-04-02 14:16:50","firstAssignedDate":"2025-04-02 11:53:09","fulfillmentDate":"2025-04-01 10:24:11","openedBy":"Maria Papagiannea","openedDate":"2025-04-01","closedDate":"2025-04-12","toDoAt":"2025-04-03T10:09:36.530+0200","inUatAt":"2025-04-03T10:13:40.887+0200","jiraKey":"WFN-232","year":"2025","requestedFor":"","openedAt":"2025-04-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-12T06:20:53.000Z"},"RITM2399917":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1667,"clientRespMinutes":2019,"firstReplyAt":"2025-04-02 14:14:40","firstAssignedDate":"2025-04-02 11:54:05","fulfillmentDate":"2025-04-01 10:28:01","openedBy":"Maria Papagiannea","openedDate":"2025-04-01","closedDate":"2025-04-12","toDoAt":null,"inUatAt":"2025-04-03T19:16:55.790+0200","jiraKey":"WFN-231","year":"2025","requestedFor":"","openedAt":"2025-04-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-12T06:20:52.000Z"},"RITM2400085":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1553,"clientRespMinutes":2029,"firstReplyAt":"2025-04-02 14:13:41","firstAssignedDate":"2025-04-02 11:54:21","fulfillmentDate":"2025-04-01 12:20:59","openedBy":"Maria Papagiannea","openedDate":"2025-04-01","closedDate":"2025-04-12","toDoAt":"2025-04-02T15:30:15.657+0200","inUatAt":"2025-04-03T19:16:54.457+0200","jiraKey":"WFN-230","year":"2025","requestedFor":"","openedAt":"2025-04-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-12T06:20:57.000Z"},"RITM2400087":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1551,"clientRespMinutes":2301,"firstReplyAt":"2025-04-02 14:14:06","firstAssignedDate":"2025-04-02 11:54:37","fulfillmentDate":"2025-04-01 12:23:23","openedBy":"Maria Papagiannea","openedDate":"2025-04-01","closedDate":"2025-04-12","toDoAt":"2025-04-02T18:09:12.127+0200","inUatAt":"2025-04-03T19:16:53.273+0200","jiraKey":"WFN-229","year":"2025","requestedFor":"","openedAt":"2025-04-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-12T06:20:54.000Z"},"RITM2400095":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1569,"clientRespMinutes":2245,"firstReplyAt":"2025-04-02 14:34:55","firstAssignedDate":"2025-04-02 11:54:57","fulfillmentDate":"2025-04-01 12:26:23","openedBy":"Maria Papagiannea","openedDate":"2025-04-01","closedDate":"2025-04-12","toDoAt":null,"inUatAt":"2025-04-03T19:16:51.443+0200","jiraKey":"WFN-228","year":"2025","requestedFor":"","openedAt":"2025-04-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-12T06:21:00.000Z"},"RITM2400193":{"state":"Closed Complete","shortDesc":"Dettol AT Website Update Ella","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"Switzerland","businessUnit":"Health","finalCost":"6000","currencyCode":"","ttfrMinutes":10181,"clientRespMinutes":6210,"firstReplyAt":"2025-04-08 15:28:30","firstAssignedDate":"2025-04-03 09:45:48","fulfillmentDate":"2025-04-01 13:47:45","openedBy":"Nina Bongartz (Inactive)","openedDate":"2025-04-01","closedDate":"2025-07-01","toDoAt":"2025-01-06T10:08:53.017+0100","inUatAt":"2024-12-20T17:45:37.290+0100","jiraKey":"WFN-18","year":"2025","requestedFor":"Nina Bongartz (Inactive)","openedAt":"2025-04-01 13:47:42","stateChangedAt":"2025-07-01 15:20:54","stateChangedBy":"System","lastActivityAt":"2025-06-26 14:49:14","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-07-01T10:20:54.000Z"},"RITM2401690":{"state":"Closed Complete","shortDesc":"Change of header on Igiene Insieme","assignedTo":"Herman Bykanov (Inactive)","brand":"Napisan","market":"Italy","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1386,"clientRespMinutes":2881,"firstReplyAt":"2025-04-03 11:41:21","firstAssignedDate":"2025-04-03 09:51:03","fulfillmentDate":"2025-04-02 12:35:52","openedBy":"Francesca Capodaglio","openedDate":"2025-04-02","closedDate":"2025-04-07","toDoAt":null,"inUatAt":"2025-04-07T09:40:47.600+0200","jiraKey":"WFN-235","year":"2025","requestedFor":"","openedAt":"2025-04-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-07T13:00:16.000Z"},"RITM2401937":{"state":"Closed Complete","shortDesc":"Fix mandatory legal footer on all HU brand pages (Nurofen, Strepsils, Gaviscon)","assignedTo":"Herman Bykanov (Inactive)","brand":"Nurofen","market":"Hungary","businessUnit":"Health","finalCost":"720","currencyCode":"GBP","ttfrMinutes":2820,"clientRespMinutes":2191,"firstReplyAt":"2025-04-04 14:04:14","firstAssignedDate":"2025-04-03 09:46:34","fulfillmentDate":"2025-04-02 15:04:18","openedBy":"Noemi Chrobot (Inactive)","openedDate":"2025-04-02","closedDate":"2025-05-03","toDoAt":"2025-04-04T15:56:37.167+0200","inUatAt":"2025-04-14T17:12:15.617+0200","jiraKey":"WFN-233","year":"2025","requestedFor":"","openedAt":"2025-04-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-03T07:20:52.000Z"},"RITM2403244":{"state":"Closed Complete","shortDesc":"Durex website traffic","assignedTo":"Aleh Dziameshchanka","brand":"Durex","market":"Greece","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":1697,"clientRespMinutes":42475,"firstReplyAt":"2025-04-04 18:20:31","firstAssignedDate":"2025-04-03 14:34:15","fulfillmentDate":"2025-04-03 14:03:47","openedBy":null,"openedDate":null,"closedDate":null,"toDoAt":null,"inUatAt":null,"jiraKey":null,"year":null,"requestedFor":"Xanthi Skorda","openedAt":"2025-04-03 14:03:43","stateChangedAt":"2025-08-11 14:20:53","stateChangedBy":"System","lastActivityAt":"2025-08-06 13:55:36","lastActivityBy":"Aleh Dziameshchanka","_updated":"2025-08-11T09:20:53.000Z"},"RITM2403293":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"300","currencyCode":"GBP","ttfrMinutes":5611,"clientRespMinutes":5439,"firstReplyAt":"2025-04-07 12:22:32","firstAssignedDate":"2025-04-07 11:26:54","fulfillmentDate":"2025-04-03 14:51:20","openedBy":"Maria Papagiannea","openedDate":"2025-04-03","closedDate":"2025-05-03","toDoAt":"2025-04-07T17:16:29.753+0200","inUatAt":"2025-04-10T17:21:38.860+0200","jiraKey":"WFN-238","year":"2025","requestedFor":"","openedAt":"2025-04-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-03T07:21:28.000Z"},"RITM2403305":{"state":"Closed Complete","shortDesc":"Update ANLT Website - Harpic France","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Harpic","market":"France","businessUnit":"Hygiene","finalCost":"504","currencyCode":"EUR","ttfrMinutes":7086,"clientRespMinutes":940,"firstReplyAt":"2025-04-08 13:05:29","firstAssignedDate":"2025-04-08 09:23:27","fulfillmentDate":"2025-04-03 15:00:06","openedBy":"Pauline Laisney","openedDate":"2025-04-03","closedDate":"2025-06-08","toDoAt":"2025-04-25T11:13:04.090+0200","inUatAt":null,"jiraKey":"WFN-239","year":"2025","requestedFor":"","openedAt":"2025-04-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-08T05:20:52.000Z"},"RITM2404510":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"540","currencyCode":"GBP","ttfrMinutes":4364,"clientRespMinutes":13341,"firstReplyAt":"2025-04-07 12:58:09","firstAssignedDate":"2025-04-07 11:26:58","fulfillmentDate":"2025-04-04 12:14:17","openedBy":"Maria Papagiannea","openedDate":"2025-04-04","closedDate":"2025-05-05","toDoAt":"2025-04-10T11:29:00.390+0200","inUatAt":null,"jiraKey":"WFN-248","year":"2025","requestedFor":"","openedAt":"2025-04-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-05T12:21:01.000Z"},"RITM2404685":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":4242,"clientRespMinutes":12143,"firstReplyAt":"2025-04-07 12:56:03","firstAssignedDate":"2025-04-07 11:27:03","fulfillmentDate":"2025-04-04 14:14:16","openedBy":"Maria Papagiannea","openedDate":"2025-04-04","closedDate":"2025-05-03","toDoAt":"2025-04-08T18:23:40.220+0200","inUatAt":null,"jiraKey":"WFN-241","year":"2025","requestedFor":"","openedAt":"2025-04-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-03T07:20:53.000Z"},"RITM2404864":{"state":"Closed Complete","shortDesc":"Strepsils Romania Website - include new product page","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Romania","businessUnit":"Health","finalCost":"300","currencyCode":"GBP","ttfrMinutes":14578,"clientRespMinutes":9064,"firstReplyAt":"2025-04-14 18:57:53","firstAssignedDate":"2025-04-09 10:12:48","fulfillmentDate":"2025-04-04 16:00:18","openedBy":"Ana-Maria Mocanu (Inactive)","openedDate":"2025-04-04","closedDate":"2025-06-29","toDoAt":"2025-04-28T15:45:44.670+0200","inUatAt":"2025-05-01T22:07:34.983+0200","jiraKey":"WFN-243","year":"2025","requestedFor":"","openedAt":"2025-04-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-29T12:20:53.000Z"},"RITM2406739":{"state":"Closed Complete","shortDesc":"need to get AA score more or equal to 75% (for site accessibility)","assignedTo":"Herman Bykanov (Inactive)","brand":"Veet","market":"Italy","businessUnit":"Health","finalCost":"864","currencyCode":"EUR","ttfrMinutes":4221,"clientRespMinutes":2019,"firstReplyAt":"2025-04-10 16:32:54","firstAssignedDate":"2025-04-09 10:21:52","fulfillmentDate":"2025-04-07 18:12:09","openedBy":"Alice Vaccaro","openedDate":"2025-04-07","closedDate":"2025-04-22","toDoAt":"2025-04-15T09:20:07.580+0200","inUatAt":null,"jiraKey":"WFN-249","year":"2025","requestedFor":"","openedAt":"2025-04-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-04-22T07:20:54.000Z"},"RITM2407251":{"state":"Closed Complete","shortDesc":"Website adaptation to EAA","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Poland","businessUnit":"Health","finalCost":"2400","currencyCode":"GBP","ttfrMinutes":23632,"clientRespMinutes":5245,"firstReplyAt":"2025-04-24 18:55:52","firstAssignedDate":"2025-04-09 10:21:43","fulfillmentDate":"2025-04-08 09:04:19","openedBy":"Lukasz Urzedowski","openedDate":"2025-04-08","closedDate":"2025-09-14","toDoAt":"2025-06-23T18:19:50.777+0200","inUatAt":null,"jiraKey":"WFN-264","year":"2025","requestedFor":"","openedAt":"2025-04-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-14T12:20:59.000Z"},"RITM2407852":{"state":"Closed Complete","shortDesc":"5 articles to be optimized and 5 to be 301 redirected","assignedTo":"Herman Bykanov (Inactive)","brand":"Vanish","market":"France","businessUnit":"Health","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1292,"clientRespMinutes":2129,"firstReplyAt":"2025-04-09 11:30:46","firstAssignedDate":"2025-04-09 10:17:50","fulfillmentDate":"2025-04-08 13:58:35","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2025-04-08","closedDate":"2025-05-03","toDoAt":"2025-04-09T10:51:54.593+0200","inUatAt":"2025-04-10T16:42:24.830+0200","jiraKey":"WFN-245","year":"2025","requestedFor":"","openedAt":"2025-04-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-03T07:21:27.000Z"},"RITM2407936":{"state":"Closed Complete","shortDesc":"4 articles to be optimized (content, title, H1, H2)","assignedTo":"Herman Bykanov (Inactive)","brand":"Vanish","market":"France","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1231,"clientRespMinutes":2156,"firstReplyAt":"2025-04-09 11:28:13","firstAssignedDate":"2025-04-09 10:20:22","fulfillmentDate":"2025-04-08 14:57:25","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2025-04-08","closedDate":"2025-05-03","toDoAt":"2025-04-10T09:19:55.753+0200","inUatAt":"2025-04-10T17:02:32.290+0200","jiraKey":"WFN-246","year":"2025","requestedFor":"","openedAt":"2025-04-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-03T06:20:55.000Z"},"RITM2408284":{"state":"Closed Complete","shortDesc":"Web Site modifications","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Harpic","market":"France","businessUnit":"Hygiene","finalCost":"1440","currencyCode":"EUR","ttfrMinutes":1328,"clientRespMinutes":10869,"firstReplyAt":"2025-04-09 16:17:11","firstAssignedDate":"2025-04-09 10:11:42","fulfillmentDate":"2025-04-08 18:08:49","openedBy":"Eglantine OLLIERIC (Inactive)","openedDate":"2025-04-08","closedDate":"2025-09-20","toDoAt":"2025-04-11T23:52:05.517+0200","inUatAt":"2025-04-29T12:23:20.397+0200","jiraKey":"WFN-247","year":"2025","requestedFor":"","openedAt":"2025-04-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-20T07:20:53.000Z"},"RITM2408820":{"state":"Closed Complete","shortDesc":"Finish ES website changes","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Spain","businessUnit":"Corporate","finalCost":"720","currencyCode":"EUR","ttfrMinutes":7808,"clientRespMinutes":2110,"firstReplyAt":"2025-04-14 19:04:29","firstAssignedDate":"2025-04-09 10:08:07","fulfillmentDate":"2025-04-09 08:56:15","openedBy":"Sara Canal","openedDate":"2025-04-09","closedDate":"2025-10-21","toDoAt":"2025-04-15T14:09:55.343+0200","inUatAt":"2025-04-16T17:31:35.927+0200","jiraKey":"WFN-244","year":"2025","requestedFor":"Sara Canal","openedAt":"2025-04-09 08:56:12","stateChangedAt":"2025-10-21 18:20:52","stateChangedBy":"System","lastActivityAt":"2025-10-16 17:37:48","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-10-21T13:20:52.000Z"},"RITM2409041":{"state":"Closed Complete","shortDesc":"New page on igiene insieme website","assignedTo":"Herman Bykanov (Inactive)","brand":"Napisan","market":"Italy","businessUnit":"Hygiene","finalCost":"1368","currencyCode":"EUR","ttfrMinutes":3305,"clientRespMinutes":null,"firstReplyAt":"2025-04-11 18:07:52","firstAssignedDate":"2025-04-11 10:12:24","fulfillmentDate":"2025-04-09 11:03:09","openedBy":"Giulia Grasso (Inactive)","openedDate":"2025-04-09","closedDate":"2025-05-03","toDoAt":"2025-04-16T10:18:37.167+0200","inUatAt":null,"jiraKey":"WFN-253","year":"2025","requestedFor":"","openedAt":"2025-04-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-03T13:20:58.000Z"},"RITM2409398":{"state":"Closed Cancelled","shortDesc":"HARPIC FR Website adaptation to EAA","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Harpic","market":"France","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":7332,"clientRespMinutes":100915,"firstReplyAt":"2025-04-14 16:56:37","firstAssignedDate":"2025-04-14 14:11:27","fulfillmentDate":"2025-04-09 14:44:34","openedBy":"Swann Roussel","openedDate":"2025-04-09","closedDate":"2025-07-22","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-251","year":"2025","requestedFor":"Swann Roussel","openedAt":"2025-04-09 14:44:30","stateChangedAt":"2025-07-22 10:30:11","stateChangedBy":"System","lastActivityAt":"2025-07-22 10:41:12","lastActivityBy":"Swann Roussel","_updated":"2025-07-22T05:41:12.000Z"},"RITM2409447":{"state":"Closed Complete","shortDesc":"Accessibility AA bugger than 75%","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Air Wick","market":"Italy","businessUnit":"Hygiene","finalCost":"2160","currencyCode":"EUR","ttfrMinutes":193,"clientRespMinutes":14543,"firstReplyAt":"2025-04-09 18:27:34","firstAssignedDate":"2025-04-09 18:27:34","fulfillmentDate":"2025-04-09 15:14:50","openedBy":"Serena Puccini (Inactive)","openedDate":"2025-04-09","closedDate":"2025-06-22","toDoAt":"2025-04-23T13:26:35.407+0200","inUatAt":null,"jiraKey":"WFN-250","year":"2025","requestedFor":"","openedAt":"2025-04-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-22T13:20:56.000Z"},"RITM2410587":{"state":"Closed Cancelled","shortDesc":"Destop website adaptation to EAA","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Destop","market":"France","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":6070,"clientRespMinutes":80376,"firstReplyAt":"2025-04-14 16:57:04","firstAssignedDate":"2025-04-14 14:11:07","fulfillmentDate":"2025-04-10 11:47:18","openedBy":"Lilas Ouared","openedDate":"2025-04-10","closedDate":"2025-07-22","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-252","year":"2025","requestedFor":"Lilas Ouared","openedAt":"2025-04-10 11:47:14","stateChangedAt":"2025-07-22 10:34:31","stateChangedBy":"System","lastActivityAt":"2025-07-22 10:34:05","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-07-22T05:34:31.000Z"},"RITM2412483":{"state":"Closed Complete","shortDesc":"Enabling Double Opt-In Durex.De","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Durex","market":"Germany","businessUnit":"Health","finalCost":"900","currencyCode":"GBP","ttfrMinutes":7444,"clientRespMinutes":9958,"firstReplyAt":"2025-04-16 19:09:27","firstAssignedDate":"2025-04-16 09:48:03","fulfillmentDate":"2025-04-11 15:05:06","openedBy":"Joseph Tseng","openedDate":"2025-04-11","closedDate":"2026-01-21","toDoAt":"2025-05-06T08:20:10.893+0200","inUatAt":"2025-06-03T11:35:38.033+0200","jiraKey":"WFN-258","year":"2025","requestedFor":"Joseph Tseng","openedAt":"2025-04-11 15:05:01","stateChangedAt":"2026-01-21 14:20:52","stateChangedBy":"System","lastActivityAt":"2026-01-16 13:22:51","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-01-21T11:20:52.000Z"},"RITM2413390":{"state":"Closed Complete","shortDesc":"Modification to www.durex to it to meet the EAA accessibilty requirement.","assignedTo":"Herman Bykanov (Inactive)","brand":"Durex","market":"Italy","businessUnit":"Health","finalCost":"1224","currencyCode":"EUR","ttfrMinutes":3280,"clientRespMinutes":3000,"firstReplyAt":"2025-04-16 16:12:05","firstAssignedDate":"2025-04-16 09:48:32","fulfillmentDate":"2025-04-14 09:31:42","openedBy":"Jacopo Ghislanzoni (Inactive)","openedDate":"2025-04-14","closedDate":"2025-05-10","toDoAt":"2025-04-17T11:28:34.400+0200","inUatAt":null,"jiraKey":"WFN-259","year":"2025","requestedFor":"","openedAt":"2025-04-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-10T07:20:53.000Z"},"RITM2413585":{"state":"Closed Complete","shortDesc":"Durex #1 claim PL website","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Poland","businessUnit":"Health","finalCost":"300","currencyCode":"GBP","ttfrMinutes":2992,"clientRespMinutes":1717,"firstReplyAt":"2025-04-16 13:19:14","firstAssignedDate":"2025-04-16 09:48:53","fulfillmentDate":"2025-04-14 11:27:27","openedBy":"Anna Pieczkowska","openedDate":"2025-04-14","closedDate":"2025-05-27","toDoAt":"2025-04-17T15:51:48.747+0200","inUatAt":null,"jiraKey":"WFN-254","year":"2025","requestedFor":"","openedAt":"2025-04-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-27T13:20:56.000Z"},"RITM2413975":{"state":"Closed Complete","shortDesc":"Contact update","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Germany","businessUnit":"Health","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":2884,"clientRespMinutes":8631,"firstReplyAt":"2025-04-16 16:17:54","firstAssignedDate":"2025-04-16 09:50:12","fulfillmentDate":"2025-04-14 16:14:02","openedBy":"Mia Leimkuhler","openedDate":"2025-04-14","closedDate":"2025-07-13","toDoAt":"2025-04-18T13:25:11.613+0200","inUatAt":null,"jiraKey":"WFN-256","year":"2025","requestedFor":"Mia Leimkuhler","openedAt":"2025-04-14 16:13:57","stateChangedAt":"2025-07-13 12:21:12","stateChangedBy":"System","lastActivityAt":"2025-07-08 11:20:48","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-07-13T07:21:12.000Z"},"RITM2414142":{"state":"Closed Complete","shortDesc":"Nurofen AT website accessibility compliance","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Austria","businessUnit":"Health","finalCost":"720","currencyCode":"GBP","ttfrMinutes":2813,"clientRespMinutes":6395,"firstReplyAt":"2025-04-16 16:54:22","firstAssignedDate":"2025-04-16 09:52:04","fulfillmentDate":"2025-04-14 18:01:21","openedBy":"Nikola Kmonickova (Inactive)","openedDate":"2025-04-14","closedDate":"2025-05-26","toDoAt":"2025-05-07T11:59:53.420+0200","inUatAt":null,"jiraKey":"WFN-257","year":"2025","requestedFor":"Nikola Kmonickova (Inactive)","openedAt":"2025-04-14 18:01:18","stateChangedAt":"2025-05-26 16:20:52","stateChangedBy":"System","lastActivityAt":"2025-05-21 16:17:00","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-05-26T11:20:52.000Z"},"RITM2414374":{"state":"Closed Complete","shortDesc":"From May 1st there will be a new Veet promo, need to update the banner in tihe veet.it site","assignedTo":"Herman Bykanov (Inactive)","brand":"Veet","market":"Italy","businessUnit":"Health","finalCost":"432","currencyCode":"EUR","ttfrMinutes":3557,"clientRespMinutes":9521,"firstReplyAt":"2025-04-17 11:21:24","firstAssignedDate":"2025-04-16 09:52:40","fulfillmentDate":"2025-04-15 00:04:02","openedBy":"Alice Vaccaro","openedDate":"2025-04-15","closedDate":"2025-06-01","toDoAt":"2025-04-23T09:43:14.323+0200","inUatAt":"2025-05-21T16:11:02.020+0200","jiraKey":"WFN-263","year":"2025","requestedFor":"","openedAt":"2025-04-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-01T12:20:52.000Z"},"RITM2414868":{"state":"Closed Complete","shortDesc":"Website change Finish","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Poland","businessUnit":"Hygiene","finalCost":"300","currencyCode":"GBP","ttfrMinutes":4575,"clientRespMinutes":2539,"firstReplyAt":"2025-04-18 15:32:32","firstAssignedDate":"2025-04-16 09:55:06","fulfillmentDate":"2025-04-15 11:17:40","openedBy":"Paulina Szewczyk","openedDate":"2025-04-15","closedDate":"2025-06-11","toDoAt":"2025-04-23T11:54:54.700+0200","inUatAt":"2025-04-25T14:53:36.427+0200","jiraKey":"WFN-255","year":"2025","requestedFor":"","openedAt":"2025-04-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-10T19:20:52.000Z"},"RITM2415286":{"state":"Closed Cancelled","shortDesc":"SSPC - Durex","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Netherlands","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":20141,"clientRespMinutes":8883,"firstReplyAt":"2025-04-29 14:58:15","firstAssignedDate":"2025-04-16 09:55:44","fulfillmentDate":"2025-04-15 15:17:39","openedBy":"Rowena Hearn","openedDate":"2025-04-15","closedDate":"2025-09-25","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-265","year":"2025","requestedFor":"Rowena Hearn","openedAt":"2025-04-15 15:17:36","stateChangedAt":"2025-09-25 11:11:07","stateChangedBy":"System","lastActivityAt":"2025-09-24 11:07:50","lastActivityBy":"Rowena Hearn","_updated":"2025-09-25T06:11:07.000Z"},"RITM2416526":{"state":"Closed Cancelled","shortDesc":"Website adaptation to EAA","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"France","businessUnit":"Hygiene","finalCost":"","currencyCode":"","ttfrMinutes":12771,"clientRespMinutes":null,"firstReplyAt":"2025-04-25 10:49:34","firstAssignedDate":"2025-04-18 10:02:06","fulfillmentDate":"2025-04-16 13:58:59","openedBy":"Louise Guilbert","openedDate":"2025-04-16","closedDate":"2025-09-09","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-266","year":"2025","requestedFor":"Louise Guilbert","openedAt":"2025-04-16 13:58:55","stateChangedAt":"2025-09-09 16:54:06","stateChangedBy":"System","lastActivityAt":"2025-07-21 17:18:48","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-09-09T11:54:19.000Z"},"RITM2416622":{"state":"Closed Complete","shortDesc":"Creation Promo landing page on finishinfo.it","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":2941,"clientRespMinutes":9765,"firstReplyAt":"2025-04-18 16:15:17","firstAssignedDate":"2025-04-18 09:55:31","fulfillmentDate":"2025-04-16 15:14:06","openedBy":"Luigi Monteleone (Inactive)","openedDate":"2025-04-16","closedDate":"2025-08-25","toDoAt":"2025-04-18T17:03:39.983+0200","inUatAt":null,"jiraKey":"WFN-260","year":"2025","requestedFor":"","openedAt":"2025-04-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-25T17:20:53.000Z"},"RITM2416734":{"state":"Closed Complete","shortDesc":"Creation Promo landing page on finishinfo.it","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Hygiene","finalCost":"360","currencyCode":"EUR","ttfrMinutes":2877,"clientRespMinutes":7702,"firstReplyAt":"2025-04-18 16:28:40","firstAssignedDate":"2025-04-18 09:55:35","fulfillmentDate":"2025-04-16 16:31:30","openedBy":"Luigi Monteleone (Inactive)","openedDate":"2025-04-16","closedDate":"2025-06-08","toDoAt":"2025-04-18T17:03:45.143+0200","inUatAt":null,"jiraKey":"WFN-262","year":"2025","requestedFor":"","openedAt":"2025-04-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-08T10:20:56.000Z"},"RITM2421222":{"state":"Closed Cancelled","shortDesc":"At Olla site in contact page - https://www.olla.com.br/contato/ - the forms is not working properly","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Brazil","businessUnit":"Health","finalCost":"","currencyCode":"","ttfrMinutes":2614,"clientRespMinutes":null,"firstReplyAt":"2025-04-24 16:23:23","firstAssignedDate":"2025-04-23 14:37:35","fulfillmentDate":"2025-04-22 20:49:20","openedBy":"Nina Salvia (Inactive)","openedDate":"2025-04-22","closedDate":"2025-07-22","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-283","year":"2025","requestedFor":"Nina Salvia (Inactive)","openedAt":"2025-04-22 20:49:16","stateChangedAt":"2025-07-22 10:36:55","stateChangedBy":"System","lastActivityAt":"2025-07-22 10:36:33","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-07-22T05:36:55.000Z"},"RITM2423653":{"state":"Closed Complete","shortDesc":"Finish | Articles Mother","assignedTo":"Jesica Greco","brand":"Finish","market":"Mexico","businessUnit":"Hygiene","finalCost":"6000","currencyCode":"MXN","ttfrMinutes":1152,"clientRespMinutes":2916,"firstReplyAt":"2025-04-25 16:34:13","firstAssignedDate":"2025-04-25 10:06:37","fulfillmentDate":"2025-04-24 21:22:29","openedBy":"Mariana Onofre Castro","openedDate":"2025-04-24","closedDate":"2025-05-19","toDoAt":"2025-05-06T16:05:17.910+0200","inUatAt":null,"jiraKey":"WFN-292","year":"2025","requestedFor":"Mariana Onofre Castro","openedAt":"2025-04-24 21:22:26","stateChangedAt":"2025-05-19 15:21:15","stateChangedBy":"System","lastActivityAt":"2025-05-13 19:29:55","lastActivityBy":"Jesica Greco","_updated":"2025-05-19T10:21:15.000Z"},"RITM2423658":{"state":"Closed Complete","shortDesc":"Vanish Mx | Update landing \"polvos\"","assignedTo":"Jesica Greco","brand":"Vanish","market":"Mexico","businessUnit":"Hygiene","finalCost":"12000","currencyCode":"MXN","ttfrMinutes":11040,"clientRespMinutes":3709,"firstReplyAt":"2025-05-02 13:28:19","firstAssignedDate":"2025-04-25 10:07:05","fulfillmentDate":"2025-04-24 21:28:25","openedBy":"Mariana Onofre Castro","openedDate":"2025-04-24","closedDate":"2025-05-14","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-276","year":"2025","requestedFor":"Mariana Onofre Castro","openedAt":"2025-04-24 21:28:21","stateChangedAt":"2025-05-14 17:20:54","stateChangedBy":"System","lastActivityAt":"2025-05-09 16:44:37","lastActivityBy":"Jesica Greco","_updated":"2025-06-05T18:49:33.000Z"},"RITM2424496":{"state":"Closed Complete","shortDesc":"Site Analytics and Tagging BAU","assignedTo":"Sam Page","brand":"Sagrotan","market":"","businessUnit":null,"finalCost":"","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":null,"firstAssignedDate":null,"fulfillmentDate":null,"openedBy":null,"openedDate":null,"closedDate":null,"toDoAt":null,"inUatAt":null,"jiraKey":null,"year":null,"requestedFor":"Lina Hardt","openedAt":"2025-04-25 12:56:11","stateChangedAt":"2025-07-19 14:21:28","stateChangedBy":"System","lastActivityAt":"2025-05-15 18:21:35","lastActivityBy":"Luccas Rosa","_updated":"2025-07-19T09:21:28.000Z"},"RITM2424775":{"state":"Closed Complete","shortDesc":"Changing an image Veet Men (we no longer have the rights)","assignedTo":"Herman Bykanov (Inactive)","brand":"Veet","market":"France","businessUnit":"Health","finalCost":"144","currencyCode":"EUR","ttfrMinutes":4326,"clientRespMinutes":1673,"firstReplyAt":"2025-04-28 16:24:41","firstAssignedDate":"2025-04-28 09:43:52","fulfillmentDate":"2025-04-25 16:19:09","openedBy":"Charlotte Palmonari (Inactive)","openedDate":"2025-04-25","closedDate":"2025-05-20","toDoAt":"2025-04-29T08:07:00.883+0200","inUatAt":"2025-04-29T14:44:30.023+0200","jiraKey":"WFN-267","year":"2025","requestedFor":"","openedAt":"2025-04-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T07:30:12.000Z"},"RITM2424798":{"state":"Closed Complete","shortDesc":"Investigation Request for accessibility compliance","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Norway","businessUnit":"Health","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":14603,"clientRespMinutes":15289,"firstReplyAt":"2025-05-05 19:58:16","firstAssignedDate":"2025-04-28 09:41:17","fulfillmentDate":"2025-04-25 16:35:32","openedBy":"Anabel Werk","openedDate":"2025-04-25","closedDate":"2025-07-01","toDoAt":"2025-06-10T11:06:28.153+0200","inUatAt":null,"jiraKey":"WFN-274","year":"2025","requestedFor":"Anabel Werk","openedAt":"2025-04-25 16:35:29","stateChangedAt":"2025-07-01 12:20:59","stateChangedBy":"System","lastActivityAt":"2025-06-25 19:14:27","lastActivityBy":"Anabel Werk","_updated":"2025-07-01T07:20:59.000Z"},"RITM2424802":{"state":"Closed Complete","shortDesc":"Investigation phase to achieve Website accessablility compliance rating","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Finland","businessUnit":"Health","finalCost":"600","currencyCode":"GBP","ttfrMinutes":14607,"clientRespMinutes":15290,"firstReplyAt":"2025-05-05 20:05:36","firstAssignedDate":"2025-04-28 09:41:46","fulfillmentDate":"2025-04-25 16:38:52","openedBy":"Anabel Werk","openedDate":"2025-04-25","closedDate":"2025-07-01","toDoAt":"2025-06-10T11:06:57.550+0200","inUatAt":null,"jiraKey":"WFN-273","year":"2025","requestedFor":"Anabel Werk","openedAt":"2025-04-25 16:38:47","stateChangedAt":"2025-07-01 12:21:01","stateChangedBy":"System","lastActivityAt":"2025-06-25 19:15:01","lastActivityBy":"Anabel Werk","_updated":"2025-07-01T07:21:01.000Z"},"RITM2424804":{"state":"Closed Complete","shortDesc":"Investigation phase to achieve Website accessablility compliance rating","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Sweden","businessUnit":"Health","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":14626,"clientRespMinutes":15285,"firstReplyAt":"2025-05-05 20:25:49","firstAssignedDate":"2025-04-28 09:41:50","fulfillmentDate":"2025-04-25 16:39:58","openedBy":"Anabel Werk","openedDate":"2025-04-25","closedDate":"2025-07-01","toDoAt":"2025-06-10T11:05:37.687+0200","inUatAt":null,"jiraKey":"WFN-272","year":"2025","requestedFor":"Anabel Werk","openedAt":"2025-04-25 16:39:54","stateChangedAt":"2025-07-01 12:20:54","stateChangedBy":"System","lastActivityAt":"2025-06-25 19:15:21","lastActivityBy":"Anabel Werk","_updated":"2025-07-01T07:20:54.000Z"},"RITM2424807":{"state":"Closed Complete","shortDesc":"Investigation phase to achieve Website accessablility compliance rating","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Denmark","businessUnit":"Health","finalCost":"600","currencyCode":"GBP","ttfrMinutes":14630,"clientRespMinutes":15285,"firstReplyAt":"2025-05-05 20:30:55","firstAssignedDate":"2025-04-28 09:41:55","fulfillmentDate":"2025-04-25 16:41:02","openedBy":"Anabel Werk","openedDate":"2025-04-25","closedDate":"2025-07-01","toDoAt":"2025-06-10T11:04:51.000+0200","inUatAt":null,"jiraKey":"WFN-271","year":"2025","requestedFor":"Anabel Werk","openedAt":"2025-04-25 16:40:59","stateChangedAt":"2025-07-01 12:20:57","stateChangedBy":"System","lastActivityAt":"2025-06-25 19:13:46","lastActivityBy":"Anabel Werk","_updated":"2025-07-01T07:20:57.000Z"},"RITM2424809":{"state":"Closed Complete","shortDesc":"Investigation Request for accessibility compliance","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Sweden","businessUnit":"Health","finalCost":"600","currencyCode":"GBP","ttfrMinutes":14651,"clientRespMinutes":15295,"firstReplyAt":"2025-05-05 20:53:19","firstAssignedDate":"2025-04-28 09:42:00","fulfillmentDate":"2025-04-25 16:42:07","openedBy":"Anabel Werk","openedDate":"2025-04-25","closedDate":"2025-07-01","toDoAt":"2025-06-10T11:04:31.573+0200","inUatAt":null,"jiraKey":"WFN-270","year":"2025","requestedFor":"Anabel Werk","openedAt":"2025-04-25 16:42:05","stateChangedAt":"2025-07-01 13:20:55","stateChangedBy":"System","lastActivityAt":"2025-06-25 19:14:04","lastActivityBy":"Anabel Werk","_updated":"2025-07-01T08:20:55.000Z"},"RITM2427594":{"state":"Closed Complete","shortDesc":"Website T&Cs not correct document - Legal Document Management System OneTrust","assignedTo":"Herman Bykanov (Inactive)","brand":"Intima","market":"France","businessUnit":"Health","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1415,"clientRespMinutes":5946,"firstReplyAt":"2025-04-30 12:35:17","firstAssignedDate":"2025-04-30 09:42:04","fulfillmentDate":"2025-04-29 13:00:16","openedBy":"Mathilda Lefevre","openedDate":"2025-04-29","closedDate":"2025-05-12","toDoAt":"2025-05-07T09:39:46.613+0200","inUatAt":"2025-05-07T09:49:36.300+0200","jiraKey":"WFN-282","year":"2025","requestedFor":"","openedAt":"2025-04-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-12T08:21:26.000Z"},"RITM2428055":{"state":"Closed Complete","shortDesc":"***Urgent: Remove image from Optrex Spain landing page","assignedTo":"Alesya Prolagayeva","brand":"Optrex","market":"Spain","businessUnit":"Health","finalCost":"360","currencyCode":"EUR","ttfrMinutes":960,"clientRespMinutes":2628,"firstReplyAt":"2025-04-30 10:27:09","firstAssignedDate":"2025-04-30 09:43:42","fulfillmentDate":"2025-04-29 18:27:07","openedBy":"Jaime Sanchis","openedDate":"2025-04-29","closedDate":"2025-05-09","toDoAt":"2025-04-30T10:07:38.247+0200","inUatAt":null,"jiraKey":"WFN-268","year":"2025","requestedFor":"Jaime Sanchis","openedAt":"2025-04-29 18:27:03","stateChangedAt":"2025-05-09 16:30:14","stateChangedBy":"System","lastActivityAt":"2025-05-09 16:30:14","lastActivityBy":"System","_updated":"2025-05-09T11:30:14.000Z"},"RITM2428594":{"state":"Closed Complete","shortDesc":"SRB in machine sampling subpage","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Hygiene","finalCost":"600","currencyCode":"GBP","ttfrMinutes":85,"clientRespMinutes":3459,"firstReplyAt":"2025-04-30 10:39:44","firstAssignedDate":"2025-04-30 09:44:11","fulfillmentDate":"2025-04-30 09:14:19","openedBy":"Anna Koroknay","openedDate":"2025-04-30","closedDate":"2025-06-11","toDoAt":"2025-05-08T15:55:04.570+0200","inUatAt":"2025-05-14T13:37:50.797+0200","jiraKey":"WFN-269","year":"2025","requestedFor":"","openedAt":"2025-04-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-10T19:20:53.000Z"},"RITM2428943":{"state":"Closed Complete","shortDesc":"Microsite updated for new contest","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Greece","businessUnit":"Hygiene","finalCost":"720","currencyCode":"GBP","ttfrMinutes":7063,"clientRespMinutes":78,"firstReplyAt":"2025-05-05 10:09:47","firstAssignedDate":"2025-05-02 09:52:49","fulfillmentDate":"2025-04-30 12:26:55","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2025-04-30","closedDate":"2025-06-11","toDoAt":"2025-05-14T10:26:22.787+0200","inUatAt":"2025-05-27T09:42:24.210+0200","jiraKey":"WFN-280","year":"2025","requestedFor":"","openedAt":"2025-04-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-11T14:20:51.000Z"},"RITM2428944":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"120","currencyCode":"GBP","ttfrMinutes":2803,"clientRespMinutes":4046,"firstReplyAt":"2025-05-02 11:10:25","firstAssignedDate":"2025-05-01 09:13:29","fulfillmentDate":"2025-04-30 12:27:21","openedBy":"Maria Papagiannea","openedDate":"2025-04-30","closedDate":"2025-05-20","toDoAt":"2025-05-06T12:33:12.210+0200","inUatAt":"2025-05-06T14:13:17.477+0200","jiraKey":"WFN-277","year":"2025","requestedFor":"","openedAt":"2025-04-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T09:21:04.000Z"},"RITM2429007":{"state":"Closed Complete","shortDesc":"Text changes","assignedTo":"Herman Bykanov (Inactive)","brand":"Napisan","market":"Italy","businessUnit":"Hygiene","finalCost":"144","currencyCode":"EUR","ttfrMinutes":225,"clientRespMinutes":null,"firstReplyAt":"2025-04-30 16:37:02","firstAssignedDate":"2025-04-30 12:53:07","fulfillmentDate":"2025-04-30 12:51:45","openedBy":"Giulia Grasso (Inactive)","openedDate":"2025-04-30","closedDate":"2025-05-05","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-275","year":"2025","requestedFor":"","openedAt":"2025-04-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-05T12:21:03.000Z"},"RITM2429138":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"300","currencyCode":"GBP","ttfrMinutes":2697,"clientRespMinutes":1954,"firstReplyAt":"2025-05-02 11:04:26","firstAssignedDate":"2025-05-01 09:13:37","fulfillmentDate":"2025-04-30 14:07:07","openedBy":"Maria Papagiannea","openedDate":"2025-04-30","closedDate":"2025-05-20","toDoAt":"2025-05-02T10:41:19.440+0200","inUatAt":"2025-05-05T13:48:49.377+0200","jiraKey":"WFN-278","year":"2025","requestedFor":"","openedAt":"2025-04-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T09:21:12.000Z"},"RITM2429297":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Health","finalCost":"300","currencyCode":"GBP","ttfrMinutes":2582,"clientRespMinutes":1950,"firstReplyAt":"2025-05-02 11:01:10","firstAssignedDate":"2025-05-01 09:13:46","fulfillmentDate":"2025-04-30 15:59:23","openedBy":"Maria Papagiannea","openedDate":"2025-04-30","closedDate":"2025-05-20","toDoAt":"2025-05-05T10:57:32.043+0200","inUatAt":"2025-05-05T14:04:35.190+0200","jiraKey":"WFN-279","year":"2025","requestedFor":"","openedAt":"2025-04-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T08:21:09.000Z"},"RITM2431147":{"state":"Closed Complete","shortDesc":"Modification to product pages","assignedTo":"Herman Bykanov (Inactive)","brand":"Durex","market":"Italy","businessUnit":"Health","finalCost":"864","currencyCode":"EUR","ttfrMinutes":4449,"clientRespMinutes":2118,"firstReplyAt":"2025-05-05 14:10:53","firstAssignedDate":"2025-05-05 09:55:15","fulfillmentDate":"2025-05-02 12:01:34","openedBy":"Jacopo Ghislanzoni (Inactive)","openedDate":"2025-05-02","closedDate":"2025-05-25","toDoAt":"2025-05-06T16:35:38.737+0200","inUatAt":"2025-05-09T16:59:07.047+0200","jiraKey":"WFN-290","year":"2025","requestedFor":"","openedAt":"2025-05-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-25T08:21:14.000Z"},"RITM2432222":{"state":"Closed Complete","shortDesc":"Durex Website Page","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":716,"clientRespMinutes":null,"firstReplyAt":"2025-05-05 21:06:50","firstAssignedDate":"2025-05-05 09:56:58","fulfillmentDate":"2025-05-05 09:11:13","openedBy":"Anastasiya Kurumus (Inactive)","openedDate":"2025-05-05","closedDate":"2025-06-11","toDoAt":"2025-05-12T14:31:51.843+0200","inUatAt":null,"jiraKey":"WFN-302","year":"2025","requestedFor":"","openedAt":"2025-05-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-10T22:20:52.000Z"},"RITM2432412":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1547,"clientRespMinutes":3737,"firstReplyAt":"2025-05-06 12:55:46","firstAssignedDate":"2025-05-06 10:19:01","fulfillmentDate":"2025-05-05 11:09:00","openedBy":"Maria Papagiannea","openedDate":"2025-05-05","closedDate":"2025-05-20","toDoAt":"2025-05-07T09:39:49.153+0200","inUatAt":null,"jiraKey":"WFN-286","year":"2025","requestedFor":"","openedAt":"2025-05-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T11:21:09.000Z"},"RITM2432423":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1543,"clientRespMinutes":3737,"firstReplyAt":"2025-05-06 12:55:53","firstAssignedDate":"2025-05-06 10:18:49","fulfillmentDate":"2025-05-05 11:12:28","openedBy":"Maria Papagiannea","openedDate":"2025-05-05","closedDate":"2025-05-20","toDoAt":"2025-05-07T09:39:50.820+0200","inUatAt":null,"jiraKey":"WFN-287","year":"2025","requestedFor":"","openedAt":"2025-05-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T10:20:52.999Z"},"RITM2432426":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1540,"clientRespMinutes":2801,"firstReplyAt":"2025-05-06 12:55:59","firstAssignedDate":"2025-05-06 10:16:59","fulfillmentDate":"2025-05-05 11:15:35","openedBy":"Maria Papagiannea","openedDate":"2025-05-05","closedDate":"2025-05-20","toDoAt":"2025-05-07T09:39:52.477+0200","inUatAt":null,"jiraKey":"WFN-288","year":"2025","requestedFor":"","openedAt":"2025-05-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T10:21:14.000Z"},"RITM2432435":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1538,"clientRespMinutes":2520,"firstReplyAt":"2025-05-06 12:56:11","firstAssignedDate":"2025-05-06 10:16:39","fulfillmentDate":"2025-05-05 11:18:06","openedBy":"Maria Papagiannea","openedDate":"2025-05-05","closedDate":"2025-05-20","toDoAt":"2025-05-07T09:39:53.960+0200","inUatAt":null,"jiraKey":"WFN-289","year":"2025","requestedFor":"","openedAt":"2025-05-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T10:20:58.000Z"},"RITM2432536":{"state":"Closed Complete","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":9978,"clientRespMinutes":2810,"firstReplyAt":"2025-05-12 10:25:58","firstAssignedDate":"2025-05-06 10:16:05","fulfillmentDate":"2025-05-05 12:08:16","openedBy":"Maria Papagiannea","openedDate":"2025-05-05","closedDate":"2025-05-20","toDoAt":"2025-05-12T08:53:49.143+0200","inUatAt":null,"jiraKey":"WFN-297","year":"2025","requestedFor":"","openedAt":"2025-05-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T10:20:54.000Z"},"RITM2432702":{"state":"Closed Cancelled","shortDesc":"Please increase the visibility for the cashback campaign by including it to our website","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":3082,"clientRespMinutes":16110,"firstReplyAt":"2025-05-07 17:17:29","firstAssignedDate":"2025-05-06 10:15:28","fulfillmentDate":"2025-05-05 13:56:02","openedBy":"Annika Brickwedde","openedDate":"2025-05-05","closedDate":"2025-07-16","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-329","year":"2025","requestedFor":"Annika Brickwedde","openedAt":"2025-05-05 13:55:59","stateChangedAt":"2025-07-16 16:11:44","stateChangedBy":"Annika Brickwedde","lastActivityAt":"2025-07-16 16:11:43","lastActivityBy":"Annika Brickwedde","_updated":"2025-07-16T11:11:43.000Z"},"RITM2432820":{"state":"Closed Cancelled","shortDesc":"Requesting changes for Vanish website.","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Belgium","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":10306,"clientRespMinutes":null,"firstReplyAt":"2025-05-12 19:06:01","firstAssignedDate":"2025-05-06 10:23:07","fulfillmentDate":"2025-05-05 15:20:31","openedBy":"Palkin Dalal","openedDate":"2025-05-05","closedDate":"2025-09-15","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-285","year":"2025","requestedFor":"Palkin Dalal","openedAt":"2025-05-05 15:20:27","stateChangedAt":"2025-09-15 11:42:53","stateChangedBy":"System","lastActivityAt":"2025-09-15 11:42:28","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-09-15T06:42:53.000Z"},"RITM2432825":{"state":"Closed Cancelled","shortDesc":"Requesting changes for Vanish website.","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Netherlands","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":10308,"clientRespMinutes":4625,"firstReplyAt":"2025-05-12 19:10:06","firstAssignedDate":"2025-05-06 10:04:34","fulfillmentDate":"2025-05-05 15:22:07","openedBy":"Palkin Dalal","openedDate":"2025-05-05","closedDate":"2025-09-15","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-284","year":"2025","requestedFor":"Palkin Dalal","openedAt":"2025-05-05 15:22:04","stateChangedAt":"2025-09-15 11:41:35","stateChangedBy":"System","lastActivityAt":"2025-09-15 11:41:10","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-09-15T06:41:35.000Z"},"RITM2433689":{"state":"Closed Cancelled","shortDesc":"Website adaptation to EAA","assignedTo":"Herman Bykanov (Inactive)","brand":"Intima","market":"France","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":11892,"clientRespMinutes":null,"firstReplyAt":"2025-05-14 16:43:25","firstAssignedDate":"2025-05-09 10:07:13","fulfillmentDate":"2025-05-06 10:31:54","openedBy":"Camille Landais (Inactive)","openedDate":"2025-05-06","closedDate":"2025-05-23","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-316","year":"2025","requestedFor":"Camille Landais (Inactive)","openedAt":"2025-05-06 10:31:50","stateChangedAt":"2025-05-23 16:23:17","stateChangedBy":"System","lastActivityAt":"2025-05-23 12:20:30","lastActivityBy":"Camille Landais (Inactive)","_updated":"2025-05-23T11:23:17.000Z"},"RITM2433702":{"state":"Closed Complete","shortDesc":"Website adaptation to EAA","assignedTo":"Herman Bykanov (Inactive)","brand":"Veet","market":"France","businessUnit":"Core Reckitt","finalCost":"864","currencyCode":"EUR","ttfrMinutes":11638,"clientRespMinutes":2546,"firstReplyAt":"2025-05-14 12:33:48","firstAssignedDate":"2025-05-09 10:08:36","fulfillmentDate":"2025-05-06 10:35:22","openedBy":"Camille Landais (Inactive)","openedDate":"2025-05-06","closedDate":"2025-05-27","toDoAt":"2025-05-15T15:27:22.513+0200","inUatAt":null,"jiraKey":"WFN-317","year":"2025","requestedFor":"","openedAt":"2025-05-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-27T12:00:11.000Z"},"RITM2435496":{"state":"Closed Complete","shortDesc":"Gaviscon.ch & Gaviscon.at link to landing page","assignedTo":"Herman Bykanov (Inactive)","brand":"Gaviscon","market":"Germany","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":7032,"clientRespMinutes":17213,"firstReplyAt":"2025-05-12 10:37:26","firstAssignedDate":"2025-05-09 10:10:30","fulfillmentDate":"2025-05-07 13:25:21","openedBy":"Julia Kuzovkova","openedDate":"2025-05-07","closedDate":"2025-07-01","toDoAt":"2025-06-12T13:22:48.683+0200","inUatAt":"2025-05-13T16:46:41.130+0200","jiraKey":"WFN-299","year":"2025","requestedFor":"","openedAt":"2025-05-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-01T12:20:55.000Z"},"RITM2435858":{"state":"Closed Complete","shortDesc":"Product Image Standardization for Durex Conexión Total Range","assignedTo":"Herman Bykanov (Inactive)","brand":"Durex","market":"Spain","businessUnit":"Core Reckitt","finalCost":"288","currencyCode":"EUR","ttfrMinutes":8269,"clientRespMinutes":2781,"firstReplyAt":"2025-05-13 10:58:26","firstAssignedDate":"2025-05-09 10:11:50","fulfillmentDate":"2025-05-07 17:09:33","openedBy":"Jaime Sanchis","openedDate":"2025-05-07","closedDate":"2025-06-08","toDoAt":"2025-05-13T16:04:17.000+0200","inUatAt":"2025-05-14T16:20:27.143+0200","jiraKey":"WFN-298","year":"2025","requestedFor":"","openedAt":"2025-05-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-08T09:21:10.000Z"},"RITM2435981":{"state":"Closed Complete","shortDesc":"Desenrolla New website articles","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"6667","currencyCode":"MXN","ttfrMinutes":6702,"clientRespMinutes":4241,"firstReplyAt":"2025-05-12 10:59:52","firstAssignedDate":"2025-05-09 10:13:11","fulfillmentDate":"2025-05-07 19:17:47","openedBy":"Bianca Oliveira (Inactive)","openedDate":"2025-05-07","closedDate":"2025-05-24","toDoAt":"2025-05-15T10:59:33.343+0200","inUatAt":"2025-05-16T14:59:14.140+0200","jiraKey":"WFN-300","year":"2025","requestedFor":"","openedAt":"2025-05-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-28T11:43:12.999Z"},"RITM2438417":{"state":"Closed Complete","shortDesc":"temporarily hide 7 articles","assignedTo":"Herman Bykanov (Inactive)","brand":"Lovela","market":"Poland","businessUnit":"Essential Home","finalCost":"2520","currencyCode":"GBP","ttfrMinutes":4162,"clientRespMinutes":1191,"firstReplyAt":"2025-05-12 12:23:01","firstAssignedDate":"2025-05-12 09:55:10","fulfillmentDate":"2025-05-09 15:01:27","openedBy":"Olga Tadrzak","openedDate":"2025-05-09","closedDate":"2025-05-24","toDoAt":"2025-05-14T09:46:02.920+0200","inUatAt":"2025-05-12T13:20:22.067+0200","jiraKey":"WFN-301","year":"2025","requestedFor":"","openedAt":"2025-05-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-24T16:20:54.000Z"},"RITM2440091":{"state":"Closed Cancelled","shortDesc":"Website Optimization","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":4354,"clientRespMinutes":null,"firstReplyAt":"2025-05-15 15:30:28","firstAssignedDate":"2025-05-14 18:39:59","fulfillmentDate":"2025-05-12 14:56:24","openedBy":"Maria Papagiannea","openedDate":"2025-05-12","closedDate":"2025-05-15","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-321","year":"2025","requestedFor":"Maria Papagiannea","openedAt":"2025-05-12 14:56:22","stateChangedAt":"2025-05-15 15:31:36","stateChangedBy":"Herman Bykanov (Inactive)","lastActivityAt":"2025-05-15 15:30:28","lastActivityBy":"Herman Bykanov (Inactive)","_updated":"2025-05-15T10:31:36.000Z"},"RITM2440159":{"state":"Closed Complete","shortDesc":"Gaviscon PT - Lower GI UX changes","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"3600","currencyCode":"EUR","ttfrMinutes":4005,"clientRespMinutes":9356,"firstReplyAt":"2025-05-15 10:17:34","firstAssignedDate":"2025-05-14 18:31:53","fulfillmentDate":"2025-05-12 15:32:36","openedBy":"Rowena Hearn","openedDate":"2025-05-12","closedDate":"2026-01-31","toDoAt":"2025-05-28T09:55:02.107+0200","inUatAt":"2025-06-16T17:20:27.167+0200","jiraKey":"WFN-320","year":"2025","requestedFor":"","openedAt":"2025-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-31T11:20:54.000Z"},"RITM2440243":{"state":"Closed Complete","shortDesc":"Arctiles removing","assignedTo":"Herman Bykanov (Inactive)","brand":"Lovela","market":"Hungary","businessUnit":"Essential Home","finalCost":"240","currencyCode":"GBP","ttfrMinutes":1325,"clientRespMinutes":624,"firstReplyAt":"2025-05-13 14:28:12","firstAssignedDate":"2025-05-12 18:03:56","fulfillmentDate":"2025-05-12 16:23:22","openedBy":"Olga Tadrzak","openedDate":"2025-05-12","closedDate":"2025-05-20","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-303","year":"2025","requestedFor":"","openedAt":"2025-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T11:21:12.000Z"},"RITM2440250":{"state":"Closed Complete","shortDesc":"Arctiles removing for Lovela RO","assignedTo":"Herman Bykanov (Inactive)","brand":"Lovela","market":"Romania","businessUnit":"Essential Home","finalCost":"240","currencyCode":"GBP","ttfrMinutes":1319,"clientRespMinutes":618,"firstReplyAt":"2025-05-13 14:25:09","firstAssignedDate":"2025-05-12 18:04:23","fulfillmentDate":"2025-05-12 16:26:18","openedBy":"Olga Tadrzak","openedDate":"2025-05-12","closedDate":"2025-05-20","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-304","year":"2025","requestedFor":"","openedAt":"2025-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T11:21:05.000Z"},"RITM2440252":{"state":"Closed Complete","shortDesc":"Arctiles removing for Lovela LV","assignedTo":"Alesya Prolagayeva","brand":"Lovela","market":"Latvia","businessUnit":"Essential Home","finalCost":"240","currencyCode":"GBP","ttfrMinutes":2348,"clientRespMinutes":136,"firstReplyAt":"2025-05-14 07:35:38","firstAssignedDate":"2025-05-12 18:04:45","fulfillmentDate":"2025-05-12 16:28:00","openedBy":"Olga Tadrzak","openedDate":"2025-05-12","closedDate":"2025-05-26","toDoAt":"2025-05-14T09:36:10.350+0200","inUatAt":"2025-05-14T21:19:15.070+0200","jiraKey":"WFN-309","year":"2025","requestedFor":"","openedAt":"2025-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-26T08:21:01.999Z"},"RITM2440257":{"state":"Closed Complete","shortDesc":"Arctiles removing for Lovela LT","assignedTo":"Alesya Prolagayeva","brand":"Lovela","market":"Lithuania","businessUnit":"Essential Home","finalCost":"240","currencyCode":"GBP","ttfrMinutes":2346,"clientRespMinutes":161,"firstReplyAt":"2025-05-14 07:35:44","firstAssignedDate":"2025-05-12 18:05:00","fulfillmentDate":"2025-05-12 16:29:50","openedBy":"Olga Tadrzak","openedDate":"2025-05-12","closedDate":"2025-05-26","toDoAt":"2025-05-14T09:36:09.260+0200","inUatAt":"2025-05-14T19:07:39.653+0200","jiraKey":"WFN-307","year":"2025","requestedFor":"","openedAt":"2025-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-26T08:21:14.000Z"},"RITM2440270":{"state":"Closed Complete","shortDesc":"Arctiles removing for Lovela EE","assignedTo":"Alesya Prolagayeva","brand":"Lovela","market":"Estonia","businessUnit":"Essential Home","finalCost":"240","currencyCode":"GBP","ttfrMinutes":2341,"clientRespMinutes":160,"firstReplyAt":"2025-05-14 07:35:53","firstAssignedDate":"2025-05-12 18:05:24","fulfillmentDate":"2025-05-12 16:35:12","openedBy":"Olga Tadrzak","openedDate":"2025-05-12","closedDate":"2025-05-26","toDoAt":"2025-05-14T09:36:12.000+0200","inUatAt":"2025-05-14T19:39:39.703+0200","jiraKey":"WFN-308","year":"2025","requestedFor":"","openedAt":"2025-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-26T08:21:07.000Z"},"RITM2440279":{"state":"Closed Complete","shortDesc":"Arctiles removing for Lovela SK","assignedTo":"Herman Bykanov (Inactive)","brand":"Lovela","market":"Slovakia","businessUnit":"Essential Home","finalCost":"240","currencyCode":"GBP","ttfrMinutes":1405,"clientRespMinutes":591,"firstReplyAt":"2025-05-13 16:03:11","firstAssignedDate":"2025-05-12 18:05:41","fulfillmentDate":"2025-05-12 16:37:58","openedBy":"Olga Tadrzak","openedDate":"2025-05-12","closedDate":"2025-05-20","toDoAt":"2025-05-13T17:07:02.283+0200","inUatAt":"2025-05-14T10:27:10.807+0200","jiraKey":"WFN-305","year":"2025","requestedFor":"","openedAt":"2025-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T11:21:01.999Z"},"RITM2440283":{"state":"Closed Complete","shortDesc":"Arctiles removing for Lovela CZ","assignedTo":"Herman Bykanov (Inactive)","brand":"Lovela","market":"Czech Republic","businessUnit":"Essential Home","finalCost":"240","currencyCode":"GBP","ttfrMinutes":1404,"clientRespMinutes":121,"firstReplyAt":"2025-05-13 16:04:54","firstAssignedDate":"2025-05-12 18:05:57","fulfillmentDate":"2025-05-12 16:40:44","openedBy":"Olga Tadrzak","openedDate":"2025-05-12","closedDate":"2025-05-20","toDoAt":null,"inUatAt":"2025-05-13T17:34:38.227+0200","jiraKey":"WFN-306","year":"2025","requestedFor":"","openedAt":"2025-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-05-20T11:21:01.999Z"},"RITM2440462":{"state":"Closed Complete","shortDesc":"Content Upload for Gaviscon Website","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Spain","businessUnit":"Core Reckitt","finalCost":"504","currencyCode":"EUR","ttfrMinutes":3824,"clientRespMinutes":2530,"firstReplyAt":"2025-05-15 10:52:42","firstAssignedDate":"2025-05-14 08:04:22","fulfillmentDate":"2025-05-12 19:09:13","openedBy":"Jaime Sanchis","openedDate":"2025-05-12","closedDate":"2025-06-04","toDoAt":"2025-05-15T12:43:41.557+0200","inUatAt":"2025-06-02T10:37:41.200+0200","jiraKey":"WFN-311","year":"2025","requestedFor":"","openedAt":"2025-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-04T13:50:06.999Z"},"RITM2441827":{"state":"Closed Complete","shortDesc":"Publish 8 articles in FR based on the UK version","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"France","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1377,"clientRespMinutes":2268,"firstReplyAt":"2025-05-14 18:12:55","firstAssignedDate":"2025-05-14 08:00:55","fulfillmentDate":"2025-05-13 19:16:20","openedBy":"Mouncef Belkeziz (Inactive)","openedDate":"2025-05-13","closedDate":"2025-06-03","toDoAt":null,"inUatAt":"2025-05-19T14:37:46.297+0200","jiraKey":"WFN-310","year":"2025","requestedFor":"","openedAt":"2025-05-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-03T08:20:58.000Z"},"RITM2442900":{"state":"Closed Complete","shortDesc":"Landing Page Creation 1P Data Gathering Festival Rock am Ring","assignedTo":"Alesya Prolagayeva","brand":"Sagrotan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":2864,"clientRespMinutes":580,"firstReplyAt":"2025-05-16 14:12:59","firstAssignedDate":"2025-05-15 09:53:49","fulfillmentDate":"2025-05-14 14:29:16","openedBy":"Annika Sexauer","openedDate":"2025-05-14","closedDate":"2025-07-13","toDoAt":"2025-05-29T10:43:48.670+0200","inUatAt":"2025-05-20T18:05:05.047+0200","jiraKey":"WFN-319","year":"2025","requestedFor":"","openedAt":"2025-05-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-13T08:20:53.999Z"},"RITM2443746":{"state":"Closed Complete","shortDesc":"Changes to be made from a regulatory standpoint on the website","assignedTo":"Alesya Prolagayeva","brand":"Calgon","market":"Belgium","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1548,"clientRespMinutes":3119,"firstReplyAt":"2025-05-16 10:07:03","firstAssignedDate":"2025-05-15 09:49:17","fulfillmentDate":"2025-05-15 08:18:58","openedBy":"Eliane Gielisse","openedDate":"2025-05-15","closedDate":"2025-06-29","toDoAt":"2025-05-16T10:05:49.013+0200","inUatAt":"2025-05-16T16:34:22.353+0200","jiraKey":"WFN-318","year":"2025","requestedFor":"","openedAt":"2025-05-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-29T14:20:52.000Z"},"RITM2444013":{"state":"Closed Complete","shortDesc":"Website Update Nurofen DE","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Germany","businessUnit":"Core Reckitt","finalCost":"1800","currencyCode":"GBP","ttfrMinutes":4997,"clientRespMinutes":5407,"firstReplyAt":"2025-05-18 22:26:45","firstAssignedDate":"2025-05-16 09:46:37","fulfillmentDate":"2025-05-15 11:09:31","openedBy":"Emina Kara","openedDate":"2025-05-15","closedDate":"2025-10-12","toDoAt":"2025-06-26T14:55:28.667+0200","inUatAt":"2025-08-13T19:49:16.127+0200","jiraKey":"WFN-325","year":"2025","requestedFor":"","openedAt":"2025-05-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-12T16:21:04.000Z"},"RITM2444028":{"state":"Closed Complete","shortDesc":"Imprint update","assignedTo":"Herman Bykanov (Inactive)","brand":"Vanish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"240","currencyCode":"GBP","ttfrMinutes":1591,"clientRespMinutes":1731,"firstReplyAt":"2025-05-16 13:50:54","firstAssignedDate":"2025-05-16 09:47:27","fulfillmentDate":"2025-05-15 11:19:54","openedBy":"Marie Topfer (Inactive)","openedDate":"2025-05-15","closedDate":"2025-06-01","toDoAt":null,"inUatAt":"2025-05-22T08:48:02.910+0200","jiraKey":"WFN-326","year":"2025","requestedFor":"","openedAt":"2025-05-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-01T10:19:14.000Z"},"RITM2444044":{"state":"Closed Complete","shortDesc":"Names of Persons in Imprint need to be changed","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"240","currencyCode":"GBP","ttfrMinutes":5742,"clientRespMinutes":11787,"firstReplyAt":"2025-05-19 11:10:32","firstAssignedDate":"2025-05-16 09:48:08","fulfillmentDate":"2025-05-15 11:28:44","openedBy":"Annika Brickwedde","openedDate":"2025-05-15","closedDate":"2025-06-01","toDoAt":null,"inUatAt":"2025-05-22T08:48:56.953+0200","jiraKey":"WFN-328","year":"2025","requestedFor":"","openedAt":"2025-05-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-01T10:17:25.000Z"},"RITM2444531":{"state":"Closed Complete","shortDesc":"Legal notice change","assignedTo":"Alesya Prolagayeva","brand":"Sagrotan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1381,"clientRespMinutes":4053,"firstReplyAt":"2025-05-16 15:42:21","firstAssignedDate":"2025-05-16 09:48:35","fulfillmentDate":"2025-05-15 16:41:42","openedBy":"Lina Hardt","openedDate":"2025-05-15","closedDate":"2025-06-07","toDoAt":null,"inUatAt":"2025-05-19T12:31:37.990+0200","jiraKey":"WFN-324","year":"2025","requestedFor":"","openedAt":"2025-05-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-07T12:20:55.000Z"},"RITM2447172":{"state":"Closed Complete","shortDesc":"Update Impressum Durex Websites DACH","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Germany","businessUnit":"Core Reckitt","finalCost":"420","currencyCode":"GBP","ttfrMinutes":411,"clientRespMinutes":3735,"firstReplyAt":"2025-05-19 17:36:55","firstAssignedDate":"2025-05-19 17:36:55","fulfillmentDate":"2025-05-19 10:45:34","openedBy":"Florian Mecking","openedDate":"2025-05-19","closedDate":"2025-06-29","toDoAt":"2025-06-03T15:19:13.327+0200","inUatAt":null,"jiraKey":"WFN-351","year":"2025","requestedFor":"","openedAt":"2025-05-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-11T14:02:03.000Z"},"RITM2448564":{"state":"Closed Complete","shortDesc":"Changes on the Veet assortment and new product pages","assignedTo":"Herman Bykanov (Inactive)","brand":"Veet","market":"France","businessUnit":"Core Reckitt","finalCost":"4680","currencyCode":"EUR","ttfrMinutes":1823,"clientRespMinutes":4467,"firstReplyAt":"2025-05-21 16:23:14","firstAssignedDate":"2025-05-20 12:39:57","fulfillmentDate":"2025-05-20 10:00:43","openedBy":"Charlotte Palmonari (Inactive)","openedDate":"2025-05-20","closedDate":"2025-06-24","toDoAt":"2025-05-21T18:22:21.093+0200","inUatAt":"2025-06-05T08:02:43.690+0200","jiraKey":"WFN-330","year":"2025","requestedFor":"","openedAt":"2025-05-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-24T12:20:56.999Z"},"RITM2448847":{"state":"Closed Complete","shortDesc":"Nurofen Poland - Body Pain & NFC","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Poland","businessUnit":"Core Reckitt","finalCost":"3000","currencyCode":"GBP","ttfrMinutes":19211,"clientRespMinutes":4176,"firstReplyAt":"2025-06-02 20:48:10","firstAssignedDate":"2025-05-21 09:50:24","fulfillmentDate":"2025-05-20 12:36:48","openedBy":"Rowena Hearn","openedDate":"2025-05-20","closedDate":"2025-10-12","toDoAt":"2025-07-14T16:28:34.667+0200","inUatAt":"2025-07-22T09:51:02.117+0200","jiraKey":"WFN-364","year":"2025","requestedFor":"","openedAt":"2025-05-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-12T16:20:56.000Z"},"RITM2448911":{"state":"Closed Complete","shortDesc":"GaviDarm DE","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Germany","businessUnit":"Core Reckitt","finalCost":"3300","currencyCode":"GBP","ttfrMinutes":18556,"clientRespMinutes":5275,"firstReplyAt":"2025-06-02 10:38:02","firstAssignedDate":"2025-05-21 09:50:08","fulfillmentDate":"2025-05-20 13:21:48","openedBy":"Rowena Hearn","openedDate":"2025-05-20","closedDate":"2026-01-18","toDoAt":"2025-06-02T18:20:47.763+0200","inUatAt":"2025-06-06T15:50:08.780+0200","jiraKey":"WFN-348","year":"2025","requestedFor":"","openedAt":"2025-05-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-18T13:20:51.000Z"},"RITM2449961":{"state":"Closed Complete","shortDesc":"Arctiles Lovela HU","assignedTo":"Herman Bykanov (Inactive)","brand":"Lovela","market":"Hungary","businessUnit":"Essential Home","finalCost":"120","currencyCode":"GBP","ttfrMinutes":94,"clientRespMinutes":null,"firstReplyAt":"2025-05-21 11:04:42","firstAssignedDate":"2025-05-21 09:48:43","fulfillmentDate":"2025-05-21 09:31:04","openedBy":"Olga Tadrzak","openedDate":"2025-05-21","closedDate":"2025-06-01","toDoAt":"2025-05-21T10:10:24.517+0200","inUatAt":null,"jiraKey":"WFN-331","year":"2025","requestedFor":"","openedAt":"2025-05-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-01T13:20:52.999Z"},"RITM2449965":{"state":"Closed Complete","shortDesc":"Articles Lovela RO","assignedTo":"Herman Bykanov (Inactive)","brand":"Lovela","market":"Romania","businessUnit":"Essential Home","finalCost":"120","currencyCode":"GBP","ttfrMinutes":92,"clientRespMinutes":null,"firstReplyAt":"2025-05-21 11:05:00","firstAssignedDate":"2025-05-21 09:48:50","fulfillmentDate":"2025-05-21 09:33:30","openedBy":"Olga Tadrzak","openedDate":"2025-05-21","closedDate":"2025-06-01","toDoAt":"2025-05-21T10:10:26.143+0200","inUatAt":null,"jiraKey":"WFN-332","year":"2025","requestedFor":"","openedAt":"2025-05-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-01T13:20:52.000Z"},"RITM2452073":{"state":"Closed Complete","shortDesc":"Nuromol Ireland website","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"1584","currencyCode":"EUR","ttfrMinutes":5419,"clientRespMinutes":2709,"firstReplyAt":"2025-05-26 11:24:02","firstAssignedDate":"2025-05-23 09:49:24","fulfillmentDate":"2025-05-22 17:04:58","openedBy":"Ismena Kielkowska","openedDate":"2025-05-22","closedDate":"2025-08-20","toDoAt":"2025-05-29T16:44:03.130+0200","inUatAt":"2025-06-02T20:53:23.243+0200","jiraKey":"WFN-337","year":"2025","requestedFor":"","openedAt":"2025-05-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-20T14:20:50.999Z"},"RITM2452104":{"state":"Closed Cancelled","shortDesc":"Implementation Guidelines Review – Canonicalisation, URL Normalisation, Meta & Link Hygiene for Nurofen.pt","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1378,"clientRespMinutes":11093,"firstReplyAt":"2025-05-23 16:39:14","firstAssignedDate":"2025-05-23 09:48:44","fulfillmentDate":"2025-05-22 17:41:08","openedBy":"Jaime Sanchis","openedDate":"2025-05-22","closedDate":"2025-10-23","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-334","year":"2025","requestedFor":"Jaime Sanchis","openedAt":"2025-05-22 17:41:05","stateChangedAt":"2025-10-23 18:17:54","stateChangedBy":"System","lastActivityAt":"2025-10-23 10:33:53","lastActivityBy":"Jaime Sanchis","_updated":"2025-10-23T13:17:54.000Z"},"RITM2452161":{"state":"Closed Complete","shortDesc":"Request content amends for Finish Italian website-->https://www.finishinfo.it/","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"2880","currencyCode":"EUR","ttfrMinutes":10001,"clientRespMinutes":14489,"firstReplyAt":"2025-05-29 16:42:57","firstAssignedDate":"2025-05-23 09:49:14","fulfillmentDate":"2025-05-22 18:01:58","openedBy":"Luigi Monteleone (Inactive)","openedDate":"2025-05-22","closedDate":"2025-08-25","toDoAt":"2025-06-25T09:25:47.793+0200","inUatAt":"2025-07-22T16:36:15.407+0200","jiraKey":"WFN-335","year":"2025","requestedFor":"","openedAt":"2025-05-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-25T18:20:59.000Z"},"RITM2452973":{"state":"Closed Complete","shortDesc":"Bathroom variant","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":4363,"clientRespMinutes":3282,"firstReplyAt":"2025-05-26 11:35:12","firstAssignedDate":"2025-05-26 09:25:32","fulfillmentDate":"2025-05-23 10:51:54","openedBy":"Maria Papagiannea","openedDate":"2025-05-23","closedDate":"2025-06-16","toDoAt":"2025-05-27T08:05:36.667+0200","inUatAt":null,"jiraKey":"WFN-336","year":"2025","requestedFor":"","openedAt":"2025-05-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-16T16:21:01.000Z"},"RITM2454318":{"state":"Closed Complete","shortDesc":"Artcile removing from Finish PL","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Poland","businessUnit":"Essential Home","finalCost":"240","currencyCode":"GBP","ttfrMinutes":1726,"clientRespMinutes":963,"firstReplyAt":"2025-05-27 15:08:47","firstAssignedDate":"2025-05-27 09:52:20","fulfillmentDate":"2025-05-26 10:23:11","openedBy":"Olga Tadrzak","openedDate":"2025-05-26","closedDate":"2025-06-16","toDoAt":"2025-05-27T17:13:19.043+0200","inUatAt":"2025-05-28T09:51:14.737+0200","jiraKey":"WFN-342","year":"2025","requestedFor":"","openedAt":"2025-05-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-16T16:21:14.999Z"},"RITM2454632":{"state":"Closed Complete","shortDesc":"Change impressum of German Kukident website","assignedTo":"Herman Bykanov (Inactive)","brand":"Kukident","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1410,"clientRespMinutes":null,"firstReplyAt":"2025-05-27 13:24:04","firstAssignedDate":"2025-05-27 09:46:50","fulfillmentDate":"2025-05-26 13:54:23","openedBy":"Miriam Obanya","openedDate":"2025-05-26","closedDate":"2025-06-22","toDoAt":"2025-05-27T11:20:44.230+0200","inUatAt":"2025-05-28T09:50:31.373+0200","jiraKey":"WFN-340","year":"2025","requestedFor":"","openedAt":"2025-05-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-22T13:20:55.000Z"},"RITM2454642":{"state":"Closed Complete","shortDesc":"Delete one sentence","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1365,"clientRespMinutes":1551,"firstReplyAt":"2025-05-27 12:43:53","firstAssignedDate":"2025-05-27 09:47:15","fulfillmentDate":"2025-05-26 13:59:18","openedBy":"Annika Brickwedde","openedDate":"2025-05-26","closedDate":"2025-06-30","toDoAt":"2025-05-27T10:32:57.750+0200","inUatAt":"2025-05-27T11:20:53.240+0200","jiraKey":"WFN-338","year":"2025","requestedFor":"","openedAt":"2025-05-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-30T07:21:06.000Z"},"RITM2454922":{"state":"Closed Complete","shortDesc":"Create new Raffle Terms & Conditions + Data Privacy Terms pages for Durex.de","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Durex","market":"Germany","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":15523,"clientRespMinutes":2184,"firstReplyAt":"2025-06-06 13:08:30","firstAssignedDate":"2025-05-27 09:47:30","fulfillmentDate":"2025-05-26 18:25:29","openedBy":"Florian Mecking","openedDate":"2025-05-26","closedDate":"2025-06-22","toDoAt":"2025-06-06T08:37:20.380+0200","inUatAt":null,"jiraKey":"WFN-343","year":"2025","requestedFor":"","openedAt":"2025-05-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-22T13:20:56.000Z"},"RITM2455009":{"state":"Closed Complete","shortDesc":"Adjustment on the Naldecon Febre Website","assignedTo":"Jesica Greco","brand":"Naldecon","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"2667","currencyCode":"MXN","ttfrMinutes":1013,"clientRespMinutes":748,"firstReplyAt":"2025-05-27 14:16:43","firstAssignedDate":"2025-05-27 09:50:42","fulfillmentDate":"2025-05-26 21:23:48","openedBy":"Brenda da Silva (Inactive)","openedDate":"2025-05-26","closedDate":"2025-08-04","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-05-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-23T07:00:57.000Z"},"RITM2455421":{"state":"Closed Complete","shortDesc":"Strepsils Romania Website - Product Disclaimer Updates","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Romania","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":238,"clientRespMinutes":3066,"firstReplyAt":"2025-05-27 12:48:10","firstAssignedDate":"2025-05-27 09:50:59","fulfillmentDate":"2025-05-27 08:50:41","openedBy":"Ana-Maria Mocanu (Inactive)","openedDate":"2025-05-27","closedDate":"2025-06-20","toDoAt":"2025-06-09T16:34:43.063+0200","inUatAt":"2025-06-11T15:00:01.700+0200","jiraKey":"WFN-339","year":"2025","requestedFor":"","openedAt":"2025-05-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-20T12:10:07.999Z"},"RITM2455452":{"state":"Closed Complete","shortDesc":"Development of Nurofen Duo Max website content","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Romania","businessUnit":"Core Reckitt","finalCost":"3840","currencyCode":"GBP","ttfrMinutes":142,"clientRespMinutes":10814,"firstReplyAt":"2025-05-27 11:31:25","firstAssignedDate":"2025-05-27 09:51:32","fulfillmentDate":"2025-05-27 09:09:51","openedBy":"Daria Brinaru","openedDate":"2025-05-27","closedDate":"2025-11-05","toDoAt":"2025-06-10T13:56:58.467+0200","inUatAt":"2025-06-20T17:37:20.823+0200","jiraKey":"WFN-341","year":"2025","requestedFor":"","openedAt":"2025-05-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-05T15:20:56.999Z"},"RITM2455735":{"state":"Closed Complete","shortDesc":"Drop down menu","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1686,"clientRespMinutes":1669,"firstReplyAt":"2025-05-28 16:10:11","firstAssignedDate":"2025-05-28 09:57:55","fulfillmentDate":"2025-05-27 12:04:43","openedBy":"Maria Papagiannea","openedDate":"2025-05-27","closedDate":"2025-06-16","toDoAt":"2025-05-29T09:39:22.987+0200","inUatAt":null,"jiraKey":"WFN-345","year":"2025","requestedFor":"","openedAt":"2025-05-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-16T16:20:55.000Z"},"RITM2455914":{"state":"Closed Complete","shortDesc":"Request to update website packshots","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Denmark","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"GBP","ttfrMinutes":1403,"clientRespMinutes":2890,"firstReplyAt":"2025-05-28 13:24:04","firstAssignedDate":"2025-05-28 09:57:50","fulfillmentDate":"2025-05-27 14:01:19","openedBy":"Alicia Murphy (Inactive)","openedDate":"2025-05-27","closedDate":"2025-10-29","toDoAt":"2025-06-05T09:38:22.053+0200","inUatAt":"2025-07-22T12:25:58.257+0200","jiraKey":"WFN-346","year":"2025","requestedFor":"","openedAt":"2025-05-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-29T11:20:52.999Z"},"RITM2457455":{"state":"Closed Complete","shortDesc":" Implementation Request for Critical SEO Fixes - Strepsils.pt Website","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"1440","currencyCode":"EUR","ttfrMinutes":2654,"clientRespMinutes":14231,"firstReplyAt":"2025-05-30 13:38:00","firstAssignedDate":"2025-05-29 09:45:31","fulfillmentDate":"2025-05-28 17:23:37","openedBy":"Jaime Sanchis","openedDate":"2025-05-28","closedDate":"2025-10-26","toDoAt":"2025-06-04T09:42:22.367+0200","inUatAt":"2025-06-10T16:32:46.660+0200","jiraKey":"WFN-347","year":"2025","requestedFor":"","openedAt":"2025-05-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-26T11:20:56.999Z"},"RITM2458784":{"state":"Closed Complete","shortDesc":"Finish | Articles Father's Day ( 2 notes)","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Mexico","businessUnit":"Essential Home","finalCost":"6000","currencyCode":"MXN","ttfrMinutes":1264,"clientRespMinutes":2054,"firstReplyAt":"2025-05-30 18:03:47","firstAssignedDate":"2025-06-02 19:22:29","fulfillmentDate":"2025-05-29 20:59:30","openedBy":"Mariana Onofre Castro","openedDate":"2025-05-29","closedDate":"2025-06-09","toDoAt":"2025-06-03T09:41:08.507+0200","inUatAt":null,"jiraKey":"WFN-349","year":"2025","requestedFor":"","openedAt":"2025-05-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-09T09:20:52.000Z"},"RITM2461598":{"state":"Closed Complete","shortDesc":"SEO Audit Recommendations Implementation - Durex.pt","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Portugal","businessUnit":"Corporate","finalCost":"1440","currencyCode":"EUR","ttfrMinutes":2431,"clientRespMinutes":15158,"firstReplyAt":"2025-06-04 10:22:13","firstAssignedDate":"2025-06-04 09:54:51","fulfillmentDate":"2025-06-02 17:51:08","openedBy":"Jaime Sanchis","openedDate":"2025-06-02","closedDate":"2025-07-14","toDoAt":"2025-06-05T13:34:21.203+0200","inUatAt":null,"jiraKey":"WFN-350","year":"2025","requestedFor":"","openedAt":"2025-06-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-14T08:20:52.000Z"},"RITM2462635":{"state":"Closed Complete","shortDesc":"Contact Update - STR CRO","assignedTo":"Herman Bykanov (Inactive)","brand":"Strepsils","market":"Croatia","businessUnit":"Core Reckitt","finalCost":"240","currencyCode":"GBP","ttfrMinutes":2914,"clientRespMinutes":3140,"firstReplyAt":"2025-06-05 14:19:56","firstAssignedDate":"2025-06-04 10:03:31","fulfillmentDate":"2025-06-03 13:46:05","openedBy":"Laszlo Kovacs (Inactive)","openedDate":"2025-06-03","closedDate":"2025-06-21","toDoAt":"2025-06-11T11:31:59.110+0200","inUatAt":"2025-06-12T15:36:35.587+0200","jiraKey":"WFN-353","year":"2025","requestedFor":"","openedAt":"2025-06-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-21T09:21:22.999Z"},"RITM2462786":{"state":"Closed Complete","shortDesc":"Section \"Promozioni\" change required","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"1080","currencyCode":"EUR","ttfrMinutes":2869,"clientRespMinutes":5137,"firstReplyAt":"2025-06-05 15:05:49","firstAssignedDate":"2025-06-05 09:39:36","fulfillmentDate":"2025-06-03 15:16:27","openedBy":"Loris Vignati","openedDate":"2025-06-03","closedDate":"2025-07-11","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-354","year":"2025","requestedFor":"","openedAt":"2025-06-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-11T08:20:50.999Z"},"RITM2462899":{"state":"Closed Complete","shortDesc":"Change date in https://www.finishinfo.it/connectedsample-redeem/","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2586,"clientRespMinutes":3105,"firstReplyAt":"2025-06-05 11:25:43","firstAssignedDate":"2025-06-04 10:04:49","fulfillmentDate":"2025-06-03 16:20:09","openedBy":"Loris Vignati","openedDate":"2025-06-03","closedDate":"2025-06-16","toDoAt":"2025-06-10T11:39:52.993+0200","inUatAt":null,"jiraKey":"WFN-355","year":"2025","requestedFor":"","openedAt":"2025-06-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-16T16:21:11.000Z"},"RITM2465011":{"state":"Closed Complete","shortDesc":"Vanish | Quiz +T&C + Powder","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"24000","currencyCode":"MXN","ttfrMinutes":8552,"clientRespMinutes":5606,"firstReplyAt":"2025-06-11 09:17:21","firstAssignedDate":"2025-06-06 09:42:59","fulfillmentDate":"2025-06-05 10:45:51","openedBy":"Mariana Onofre Castro","openedDate":"2025-06-05","closedDate":"2025-10-20","toDoAt":"2025-07-02T08:04:11.537+0200","inUatAt":"2025-07-17T12:10:29.340+0200","jiraKey":"WFN-358","year":"2025","requestedFor":"","openedAt":"2025-06-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-20T18:20:52.999Z"},"RITM2465317":{"state":"Closed Cancelled","shortDesc":"Critical SEO and Security Issues Resolution - Gaviscon.pt","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Spain","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":25819,"clientRespMinutes":20600,"firstReplyAt":"2025-06-23 12:25:34","firstAssignedDate":"2025-06-17 09:13:43","fulfillmentDate":"2025-06-05 14:06:48","openedBy":"Jaime Sanchis","openedDate":"2025-06-05","closedDate":"2025-09-18","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-377","year":"2025","requestedFor":"Jaime Sanchis","openedAt":"2025-06-05 14:06:45","stateChangedAt":"2025-09-18 16:32:52","stateChangedBy":"System","lastActivityAt":"2025-09-18 16:32:24","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-09-18T11:32:52.000Z"},"RITM2465413":{"state":"Closed Complete","shortDesc":"Nurofen AT website update","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Austria","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":8650,"clientRespMinutes":2476,"firstReplyAt":"2025-06-11 15:28:24","firstAssignedDate":"2025-06-06 09:44:01","fulfillmentDate":"2025-06-05 15:18:06","openedBy":"Emina Kara","openedDate":"2025-06-05","closedDate":"2025-09-15","toDoAt":"2025-06-24T15:16:08.627+0200","inUatAt":"2025-06-27T12:58:51.720+0200","jiraKey":"WFN-366","year":"2025","requestedFor":"","openedAt":"2025-06-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-15T10:21:01.999Z"},"RITM2465440":{"state":"Closed Incomplete","shortDesc":"Durex Microsite update","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Greece","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":5832,"clientRespMinutes":811,"firstReplyAt":"2025-06-09 16:45:33","firstAssignedDate":"2025-06-06 09:48:48","fulfillmentDate":"2025-06-05 15:33:25","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2025-06-05","closedDate":"2025-06-27","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-356","year":"2025","requestedFor":"Andreas Papoutsis (Inactive)","openedAt":"2025-06-05 15:33:21","stateChangedAt":"2025-06-27 11:09:28","stateChangedBy":"Alesya Prolagayeva","lastActivityAt":"2025-06-26 14:45:59","lastActivityBy":"Andreas Papoutsis (Inactive)","_updated":"2025-06-27T06:09:28.000Z"},"RITM2465793":{"state":"Closed Complete","shortDesc":"Banner home + Banner WWF + C&T + Fathers day | Finish MX","assignedTo":"Jesica Greco","brand":"Finish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"24000","currencyCode":"MXN","ttfrMinutes":6637,"clientRespMinutes":3740,"firstReplyAt":"2025-06-10 12:29:26","firstAssignedDate":"2025-06-06 09:47:33","fulfillmentDate":"2025-06-05 21:52:16","openedBy":"Denisse Solano Sanchez (Inactive)","openedDate":"2025-06-05","closedDate":"2025-09-27","toDoAt":"2025-06-17T16:39:54.250+0200","inUatAt":"2025-06-20T17:39:12.383+0200","jiraKey":"WFN-359","year":"2025","requestedFor":"","openedAt":"2025-06-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-27T12:20:55.000Z"},"RITM2466287":{"state":"Closed Complete","shortDesc":"Add a video on the site https://igieneinsieme.it/","assignedTo":"Herman Bykanov (Inactive)","brand":"Napisan","market":"Italy","businessUnit":"Core Reckitt","finalCost":"288","currencyCode":"EUR","ttfrMinutes":5836,"clientRespMinutes":null,"firstReplyAt":"2025-06-10 10:43:11","firstAssignedDate":"2025-06-06 09:28:17","fulfillmentDate":"2025-06-06 09:26:59","openedBy":"Giulia Grasso (Inactive)","openedDate":"2025-06-06","closedDate":"2025-06-16","toDoAt":null,"inUatAt":"2025-06-10T08:27:35.317+0200","jiraKey":"WFN-357","year":"2025","requestedFor":"","openedAt":"2025-06-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-16T16:21:07.000Z"},"RITM2466814":{"state":"Closed Complete","shortDesc":"Change e-mail address on Finish Cashback URL","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Costa Rica","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":7041,"clientRespMinutes":120,"firstReplyAt":"2025-06-11 13:06:13","firstAssignedDate":"2025-06-10 09:56:10","fulfillmentDate":"2025-06-06 15:45:09","openedBy":"Bianca Scherer","openedDate":"2025-06-06","closedDate":"2025-06-17","toDoAt":"2025-06-12T09:37:07.797+0200","inUatAt":null,"jiraKey":"WFN-365","year":"2025","requestedFor":"","openedAt":"2025-06-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-17T16:20:54.000Z"},"RITM2468403":{"state":"Closed Complete","shortDesc":"Remove videos | Harpic MX","assignedTo":"Herman Bykanov (Inactive)","brand":"Harpic","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"2400","currencyCode":"MXN","ttfrMinutes":12449,"clientRespMinutes":6260,"firstReplyAt":"2025-06-18 16:06:25","firstAssignedDate":"2025-06-18 09:26:42","fulfillmentDate":"2025-06-10 00:37:50","openedBy":"Mariana Onofre Castro","openedDate":"2025-06-10","closedDate":"2025-07-12","toDoAt":"2025-06-23T08:40:25.357+0200","inUatAt":"2025-06-23T20:03:22.263+0200","jiraKey":"WFN-380","year":"2025","requestedFor":"","openedAt":"2025-06-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-12T13:20:55.000Z"},"RITM2468443":{"state":"Closed Complete","shortDesc":"Change Banner + 2 Articles | Lysol Mx","assignedTo":"Herman Bykanov (Inactive)","brand":"Lysol","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"13200","currencyCode":"MXN","ttfrMinutes":1980,"clientRespMinutes":3890,"firstReplyAt":"2025-06-11 12:24:19","firstAssignedDate":"2025-06-10 09:57:23","fulfillmentDate":"2025-06-10 03:24:34","openedBy":"Mariana Onofre Castro","openedDate":"2025-06-10","closedDate":"2025-07-15","toDoAt":"2025-06-26T15:27:28.350+0200","inUatAt":"2025-06-13T10:25:23.377+0200","jiraKey":"WFN-361","year":"2025","requestedFor":"","openedAt":"2025-06-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-15T12:20:52.999Z"},"RITM2468732":{"state":"Closed Complete","shortDesc":"Wrong Phone Numbers for 3 landing Pages on Durex Website","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Sweden","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":139,"clientRespMinutes":2996,"firstReplyAt":"2025-06-10 11:24:55","firstAssignedDate":"2025-06-10 09:57:44","fulfillmentDate":"2025-06-10 09:05:52","openedBy":"Anabel Werk","openedDate":"2025-06-10","closedDate":"2025-06-30","toDoAt":"2025-06-10T11:24:24.870+0200","inUatAt":null,"jiraKey":"WFN-360","year":"2025","requestedFor":"","openedAt":"2025-06-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-30T08:21:05.999Z"},"RITM2469146":{"state":"Closed Complete","shortDesc":"Add Metadata (Title and metadescription) to landing: https://www.gaviscon.es/gavidigest/#productos","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Spain","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1248,"clientRespMinutes":2788,"firstReplyAt":"2025-06-11 10:08:04","firstAssignedDate":"2025-06-11 10:01:39","fulfillmentDate":"2025-06-10 13:20:04","openedBy":"Amós García","openedDate":"2025-06-10","closedDate":"2025-06-23","toDoAt":"2025-06-11T10:11:43.550+0200","inUatAt":"2025-06-12T15:07:09.833+0200","jiraKey":"WFN-362","year":"2025","requestedFor":"","openedAt":"2025-06-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-23T09:20:52.000Z"},"RITM2470677":{"state":"Closed Complete","shortDesc":"Adding new product on the website www.nurofen.bg","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Bulgaria","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1789,"clientRespMinutes":1828,"firstReplyAt":"2025-06-12 15:37:05","firstAssignedDate":"2025-06-11 10:00:49","fulfillmentDate":"2025-06-11 09:47:47","openedBy":"Irina Lozanova","openedDate":"2025-06-11","closedDate":"2025-08-19","toDoAt":"2025-08-11T11:38:12.917+0200","inUatAt":"2025-08-13T18:27:20.293+0200","jiraKey":"WFN-363","year":"2025","requestedFor":"","openedAt":"2025-06-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-19T14:20:56.999Z"},"RITM2470867":{"state":"Closed Complete","shortDesc":"ContentStack version upgrade","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"5650","currencyCode":"GBP","ttfrMinutes":63376,"clientRespMinutes":22515,"firstReplyAt":"2025-07-25 12:00:07","firstAssignedDate":"2025-06-11 16:50:10","fulfillmentDate":"2025-06-11 11:43:55","openedBy":"Rowena Hearn","openedDate":"2025-06-11","closedDate":"2025-11-05","toDoAt":"2025-06-11T16:48:28.563+0200","inUatAt":"2025-08-01T16:19:16.417+0200","jiraKey":"WFN-344","year":"2025","requestedFor":"","openedAt":"2025-06-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-05T16:20:52.999Z"},"RITM2471153":{"state":"Closed Complete","shortDesc":"Vanish Coupon Page Update","assignedTo":"Herman Bykanov (Inactive)","brand":"Vanish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"240","currencyCode":"GBP","ttfrMinutes":1438,"clientRespMinutes":1082,"firstReplyAt":"2025-06-12 14:33:25","firstAssignedDate":"2025-06-12 09:53:50","fulfillmentDate":"2025-06-11 14:35:31","openedBy":"Marie Topfer (Inactive)","openedDate":"2025-06-11","closedDate":"2025-07-07","toDoAt":"2025-06-13T10:35:13.280+0200","inUatAt":"2025-07-01T10:54:00.280+0200","jiraKey":"WFN-367","year":"2025","requestedFor":"","openedAt":"2025-06-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-07T14:20:56.000Z"},"RITM2471690":{"state":"Closed Complete","shortDesc":"Banner soft lube + Banner Piel con Piel + PDP Piel con Piel + Adjust in Product Page | Sico.com.mx","assignedTo":"Alesya Prolagayeva","brand":"Sico","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"8400","currencyCode":"MXN","ttfrMinutes":1837,"clientRespMinutes":5329,"firstReplyAt":"2025-06-13 10:18:47","firstAssignedDate":"2025-06-12 09:53:39","fulfillmentDate":"2025-06-12 03:41:31","openedBy":"Mariana Onofre Castro","openedDate":"2025-06-12","closedDate":"2025-09-01","toDoAt":"2025-06-16T20:16:01.250+0200","inUatAt":"2025-08-01T16:16:54.640+0200","jiraKey":"WFN-369","year":"2025","requestedFor":"","openedAt":"2025-06-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-01T12:20:52.999Z"},"RITM2471855":{"state":"Closed Complete","shortDesc":"2 Notes Back to School | Lysol MX","assignedTo":"Herman Bykanov (Inactive)","brand":"Lysol","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"14400","currencyCode":"MXN","ttfrMinutes":407,"clientRespMinutes":2277,"firstReplyAt":"2025-06-12 14:39:46","firstAssignedDate":"2025-06-12 09:53:23","fulfillmentDate":"2025-06-12 07:53:07","openedBy":"Mariana Onofre Castro","openedDate":"2025-06-12","closedDate":"2025-07-02","toDoAt":"2025-06-23T12:46:59.377+0200","inUatAt":"2025-06-24T16:22:32.420+0200","jiraKey":"WFN-368","year":"2025","requestedFor":"","openedAt":"2025-06-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-02T16:20:54.000Z"},"RITM2472042":{"state":"Closed Complete","shortDesc":"Carrusel banner product page + article \"antigripal\" | Tempra MX","assignedTo":"Alesya Prolagayeva","brand":"Tempra","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"18000","currencyCode":"MXN","ttfrMinutes":8738,"clientRespMinutes":5020,"firstReplyAt":"2025-06-18 11:57:04","firstAssignedDate":"2025-06-13 09:49:57","fulfillmentDate":"2025-06-12 10:18:57","openedBy":"Mariana Onofre Castro","openedDate":"2025-06-12","closedDate":"2025-08-18","toDoAt":"2025-06-23T12:48:51.217+0200","inUatAt":"2025-07-07T16:35:29.657+0200","jiraKey":"WFN-372","year":"2025","requestedFor":"","openedAt":"2025-06-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-18T09:20:54.000Z"},"RITM2472906":{"state":"Closed Complete","shortDesc":"Update product page | Finish MX","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"8400","currencyCode":"MXN","ttfrMinutes":6244,"clientRespMinutes":4999,"firstReplyAt":"2025-06-17 11:03:36","firstAssignedDate":"2025-06-13 09:50:53","fulfillmentDate":"2025-06-13 02:59:48","openedBy":"Mariana Onofre Castro","openedDate":"2025-06-13","closedDate":"2025-08-17","toDoAt":"2025-06-23T13:47:19.163+0200","inUatAt":"2025-06-24T14:13:31.770+0200","jiraKey":"WFN-376","year":"2025","requestedFor":"","openedAt":"2025-06-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-17T15:20:55.000Z"},"RITM2472929":{"state":"Closed Complete","shortDesc":"Error in ticket \"Update renders \" | Vanish MX","assignedTo":"Jesica Greco","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":4788,"clientRespMinutes":4237,"firstReplyAt":"2025-06-16 12:09:40","firstAssignedDate":"2025-06-13 09:51:27","fulfillmentDate":"2025-06-13 04:22:10","openedBy":"Mariana Onofre Castro","openedDate":"2025-06-13","closedDate":"2025-09-07","toDoAt":null,"inUatAt":"2025-06-17T09:36:06.940+0200","jiraKey":"WFN-371","year":"2025","requestedFor":"","openedAt":"2025-06-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-07T12:20:55.000Z"},"RITM2473225":{"state":"Closed Complete","shortDesc":"Durex Intensity LP on AT and CH Website","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Durex","market":"Austria","businessUnit":"Core Reckitt","finalCost":"420","currencyCode":"GBP","ttfrMinutes":8672,"clientRespMinutes":6590,"firstReplyAt":"2025-06-19 08:47:39","firstAssignedDate":"2025-06-13 09:50:31","fulfillmentDate":"2025-06-13 08:16:07","openedBy":"Florian Mecking","openedDate":"2025-06-13","closedDate":"2025-08-25","toDoAt":"2025-06-23T15:59:09.183+0200","inUatAt":"2025-07-08T09:53:33.040+0200","jiraKey":"WFN-378","year":"2025","requestedFor":"","openedAt":"2025-06-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-25T09:20:52.000Z"},"RITM2473514":{"state":"Closed Complete","shortDesc":"Update to Pandora SKUs on website","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"1800","currencyCode":"GBP","ttfrMinutes":5586,"clientRespMinutes":6026,"firstReplyAt":"2025-06-17 09:09:36","firstAssignedDate":"2025-06-16 09:42:09","fulfillmentDate":"2025-06-13 12:04:08","openedBy":"Annika Brickwedde","openedDate":"2025-06-13","closedDate":"2025-07-30","toDoAt":"2025-07-01T11:51:44.377+0200","inUatAt":"2025-07-07T12:51:18.703+0200","jiraKey":"WFN-373","year":"2025","requestedFor":"","openedAt":"2025-06-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-30T16:20:52.999Z"},"RITM2474976":{"state":"Closed Complete","shortDesc":"Icons are not visible for all","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"420","currencyCode":"GBP","ttfrMinutes":1896,"clientRespMinutes":3157,"firstReplyAt":"2025-06-17 18:29:36","firstAssignedDate":"2025-06-16 19:02:35","fulfillmentDate":"2025-06-16 10:54:06","openedBy":"Annika Brickwedde","openedDate":"2025-06-16","closedDate":"2025-07-30","toDoAt":"2025-06-20T09:42:42.547+0200","inUatAt":"2025-07-07T12:53:27.917+0200","jiraKey":"WFN-375","year":"2025","requestedFor":"","openedAt":"2025-06-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-30T16:20:52.999Z"},"RITM2477176":{"state":"Closed Complete","shortDesc":"Durex - Website Integration Terms&Conditions and Data Privacy- Send Me a Sample Campaign","assignedTo":"Herman Bykanov (Inactive)","brand":"Durex","market":"Germany","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1199,"clientRespMinutes":769,"firstReplyAt":"2025-06-18 13:57:38","firstAssignedDate":"2025-06-18 09:27:00","fulfillmentDate":"2025-06-17 17:58:27","openedBy":"Lena Lechatellier (Inactive)","openedDate":"2025-06-17","closedDate":"2025-07-01","toDoAt":null,"inUatAt":"2025-06-19T16:51:59.987+0200","jiraKey":"WFN-379","year":"2025","requestedFor":"","openedAt":"2025-06-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-01T09:20:57.999Z"},"RITM2478875":{"state":"Closed Complete","shortDesc":"Update main banner \"product page\" | Vanish","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"6000","currencyCode":"MXN","ttfrMinutes":987,"clientRespMinutes":6176,"firstReplyAt":"2025-06-19 16:40:37","firstAssignedDate":"2025-06-19 09:54:55","fulfillmentDate":"2025-06-19 00:14:00","openedBy":"Mariana Onofre Castro","openedDate":"2025-06-19","closedDate":"2025-09-09","toDoAt":"2025-06-24T12:30:35.770+0200","inUatAt":"2025-08-18T15:20:09.793+0200","jiraKey":"WFN-381","year":"2025","requestedFor":"","openedAt":"2025-06-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-09T13:20:50.999Z"},"RITM2478884":{"state":"Closed Complete","shortDesc":"New landing alliance WWF | Finish MX","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Mexico","businessUnit":"Corporate","finalCost":"36000","currencyCode":"MXN","ttfrMinutes":1981,"clientRespMinutes":5551,"firstReplyAt":"2025-06-20 10:10:40","firstAssignedDate":"2025-06-19 09:55:01","fulfillmentDate":"2025-06-19 01:10:10","openedBy":"Mariana Onofre Castro","openedDate":"2025-06-19","closedDate":"2025-08-17","toDoAt":"2025-06-23T13:04:33.467+0200","inUatAt":"2025-07-23T09:49:44.753+0200","jiraKey":"WFN-382","year":"2025","requestedFor":"","openedAt":"2025-06-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-17T14:20:50.999Z"},"RITM2480887":{"state":"Closed Complete","shortDesc":"Change in consent text of the Finish FR website","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"France","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":5503,"clientRespMinutes":1584,"firstReplyAt":"2025-06-24 11:58:21","firstAssignedDate":"2025-06-23 16:33:28","fulfillmentDate":"2025-06-20 16:15:07","openedBy":"Danae PerakisValat","openedDate":"2025-06-20","closedDate":"2025-06-27","toDoAt":"2025-06-27T10:01:07.757+0200","inUatAt":null,"jiraKey":"WFN-383","year":"2025","requestedFor":"","openedAt":"2025-06-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-27T16:10:11.000Z"},"RITM2482777":{"state":"Closed Complete","shortDesc":"Need to create an urgent landing page to be live by 1st July 2025- in a week.","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Spain","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":2615,"clientRespMinutes":null,"firstReplyAt":"2025-06-25 14:29:55","firstAssignedDate":"2025-06-24 10:11:37","fulfillmentDate":"2025-06-23 18:55:20","openedBy":"Matilde Moreira da Fonseca","openedDate":"2025-06-23","closedDate":"2025-06-30","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-06-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-06-30T13:20:52.000Z"},"RITM2482994":{"state":"Closed Complete","shortDesc":"New Landing BTS + 2 Notes | Vanish","assignedTo":"Jesica Greco","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"60000","currencyCode":"MXN","ttfrMinutes":2268,"clientRespMinutes":2527,"firstReplyAt":"2025-06-25 15:43:46","firstAssignedDate":"2025-06-24 10:12:23","fulfillmentDate":"2025-06-24 01:55:56","openedBy":"Mariana Onofre Castro","openedDate":"2025-06-24","closedDate":"2025-08-03","toDoAt":"2025-07-07T16:01:54.280+0200","inUatAt":"2025-07-11T16:49:24.723+0200","jiraKey":"WFN-391","year":"2025","requestedFor":"","openedAt":"2025-06-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-20T13:08:19.999Z"},"RITM2484425":{"state":"Closed Complete","shortDesc":"Note for Air wick site","assignedTo":"Jesica Greco","brand":"Air Wick","market":"Mexico","businessUnit":"Essential Home","finalCost":"8400","currencyCode":"MXN","ttfrMinutes":540,"clientRespMinutes":2404,"firstReplyAt":"2025-06-25 13:38:36","firstAssignedDate":"2025-06-25 10:09:27","fulfillmentDate":"2025-06-25 04:38:32","openedBy":"Rocio Arroyo Gutierrez","openedDate":"2025-06-25","closedDate":"2025-07-26","toDoAt":"2025-07-01T10:26:01.590+0200","inUatAt":"2025-07-03T11:18:28.613+0200","jiraKey":"WFN-384","year":"2025","requestedFor":"","openedAt":"2025-06-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-26T18:20:51.000Z"},"RITM2484689":{"state":"Closed Complete","shortDesc":"Durex.ro - Legalization","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Romania","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":3170,"clientRespMinutes":3121,"firstReplyAt":"2025-06-27 14:35:31","firstAssignedDate":"2025-06-26 10:01:08","fulfillmentDate":"2025-06-25 09:45:21","openedBy":"Laszlo Kovacs (Inactive)","openedDate":"2025-06-25","closedDate":"2025-07-21","toDoAt":"2025-07-02T11:32:46.633+0200","inUatAt":null,"jiraKey":"WFN-385","year":"2025","requestedFor":"","openedAt":"2025-06-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-21T09:20:57.999Z"},"RITM2486592":{"state":"Closed Complete","shortDesc":"microsite update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Greece","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":9840,"clientRespMinutes":2035,"firstReplyAt":"2025-07-03 11:21:04","firstAssignedDate":"2025-07-01 09:55:13","fulfillmentDate":"2025-06-26 15:20:57","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2025-06-26","closedDate":"2025-08-19","toDoAt":"2025-07-02T10:21:54.373+0200","inUatAt":"2025-07-03T17:19:25.167+0200","jiraKey":"WFN-387","year":"2025","requestedFor":"","openedAt":"2025-06-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-19T12:20:57.999Z"},"RITM2486681":{"state":"Closed Complete","shortDesc":"LP & Product page update on Finish.com","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Romania","businessUnit":"Core Reckitt","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":28765,"clientRespMinutes":2605,"firstReplyAt":"2025-07-16 15:57:02","firstAssignedDate":"2025-06-27 09:16:06","fulfillmentDate":"2025-06-26 16:32:01","openedBy":"Diana Petre (Inactive)","openedDate":"2025-06-26","closedDate":"2025-09-06","toDoAt":"2025-07-01T08:38:41.803+0200","inUatAt":"2025-08-20T17:17:38.010+0200","jiraKey":"WFN-386","year":"2025","requestedFor":"","openedAt":"2025-06-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-06T08:20:55.000Z"},"RITM2488850":{"state":"Closed Complete","shortDesc":"LHW Chamomile pump","assignedTo":"Herman Bykanov (Inactive)","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1643,"clientRespMinutes":2353,"firstReplyAt":"2025-07-01 12:49:14","firstAssignedDate":"2025-07-01 09:52:52","fulfillmentDate":"2025-06-30 09:26:25","openedBy":"Maria Papagiannea","openedDate":"2025-06-30","closedDate":"2025-07-12","toDoAt":"2025-07-03T09:31:53.137+0200","inUatAt":null,"jiraKey":"WFN-390","year":"2025","requestedFor":"","openedAt":"2025-06-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-12T10:21:06.000Z"},"RITM2489027":{"state":"Closed Complete","shortDesc":"Website Sanity Check","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"France","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"EUR","ttfrMinutes":4435,"clientRespMinutes":4237,"firstReplyAt":"2025-07-03 12:48:09","firstAssignedDate":"2025-07-01 09:53:17","fulfillmentDate":"2025-06-30 10:53:10","openedBy":"Lyse Kimbaza (Inactive)","openedDate":"2025-06-30","closedDate":"2025-12-03","toDoAt":"2025-07-29T15:18:57.097+0200","inUatAt":"2025-08-04T15:05:18.453+0200","jiraKey":"WFN-389","year":"2025","requestedFor":"","openedAt":"2025-06-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-03T17:20:52.000Z"},"RITM2489363":{"state":"Closed Cancelled","shortDesc":"Sanity check","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"France","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":4147,"clientRespMinutes":4137,"firstReplyAt":"2025-07-03 11:10:08","firstAssignedDate":"2025-07-01 09:53:35","fulfillmentDate":"2025-06-30 14:03:17","openedBy":"Lyse Kimbaza (Inactive)","openedDate":"2025-06-30","closedDate":"2025-10-16","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-388","year":"2025","requestedFor":"Lyse Kimbaza (Inactive)","openedAt":"2025-06-30 14:03:13","stateChangedAt":"2025-10-16 11:05:04","stateChangedBy":"System","lastActivityAt":"2025-10-16 11:04:43","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-10-16T06:05:28.000Z"},"RITM2491766":{"state":"Closed Complete","shortDesc":"PDP NUSA | Finish","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"8400","currencyCode":"MXN","ttfrMinutes":1672,"clientRespMinutes":3377,"firstReplyAt":"2025-07-03 11:28:38","firstAssignedDate":"2025-07-02 10:13:30","fulfillmentDate":"2025-07-02 07:36:52","openedBy":"Mariana Onofre Castro","openedDate":"2025-07-02","closedDate":"2025-08-17","toDoAt":"2025-07-09T11:35:11.263+0200","inUatAt":"2025-07-17T08:27:53.080+0200","jiraKey":"WFN-392","year":"2025","requestedFor":"","openedAt":"2025-07-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-17T13:20:50.999Z"},"RITM2492099":{"state":"Closed Complete","shortDesc":"Removal of delisted products and an expired video - Denmark","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Denmark","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":11784,"clientRespMinutes":2974,"firstReplyAt":"2025-07-10 15:56:36","firstAssignedDate":"2025-07-03 09:54:58","fulfillmentDate":"2025-07-02 11:32:41","openedBy":"Anabel Werk","openedDate":"2025-07-02","closedDate":"2025-08-19","toDoAt":"2025-07-07T16:49:24.340+0200","inUatAt":"2025-07-10T14:47:54.673+0200","jiraKey":"WFN-396","year":"2025","requestedFor":"","openedAt":"2025-07-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-19T12:20:52.000Z"},"RITM2492100":{"state":"Closed Complete","shortDesc":"Removal of delisted products and an expired video - Sweden","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Sweden","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":7528,"clientRespMinutes":848,"firstReplyAt":"2025-07-07 17:02:13","firstAssignedDate":"2025-07-03 09:55:11","fulfillmentDate":"2025-07-02 11:34:17","openedBy":"Anabel Werk","openedDate":"2025-07-02","closedDate":"2025-08-19","toDoAt":"2025-07-07T16:48:08.740+0200","inUatAt":"2025-07-10T13:50:51.050+0200","jiraKey":"WFN-395","year":"2025","requestedFor":"","openedAt":"2025-07-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-19T12:20:52.999Z"},"RITM2492105":{"state":"Closed Complete","shortDesc":"Removal of delisted products and an expired video - Finland","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Finland","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":7526,"clientRespMinutes":849,"firstReplyAt":"2025-07-07 17:02:03","firstAssignedDate":"2025-07-03 09:55:31","fulfillmentDate":"2025-07-02 11:35:43","openedBy":"Anabel Werk","openedDate":"2025-07-02","closedDate":"2025-08-19","toDoAt":"2025-07-07T16:49:05.380+0200","inUatAt":"2025-07-10T14:41:30.410+0200","jiraKey":"WFN-394","year":"2025","requestedFor":"","openedAt":"2025-07-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-19T12:20:56.999Z"},"RITM2492107":{"state":"Closed Complete","shortDesc":"Removal of delisted products and an expired video - Norway","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Norway","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1766,"clientRespMinutes":2978,"firstReplyAt":"2025-07-03 17:02:56","firstAssignedDate":"2025-07-03 09:56:02","fulfillmentDate":"2025-07-02 11:36:51","openedBy":"Anabel Werk","openedDate":"2025-07-02","closedDate":"2025-08-19","toDoAt":"2025-07-07T16:45:10.047+0200","inUatAt":"2025-07-10T14:37:21.327+0200","jiraKey":"WFN-393","year":"2025","requestedFor":"","openedAt":"2025-07-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-19T12:20:55.000Z"},"RITM2492850":{"state":"Closed Complete","shortDesc":"Update Impressum for Durex Websites DACH 2.0","assignedTo":"Herman Bykanov (Inactive)","brand":"Durex","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1047,"clientRespMinutes":2702,"firstReplyAt":"2025-07-03 12:07:44","firstAssignedDate":"2025-07-03 09:56:27","fulfillmentDate":"2025-07-02 18:40:48","openedBy":"Florian Mecking","openedDate":"2025-07-02","closedDate":"2025-07-15","toDoAt":"2025-07-07T09:43:41.337+0200","inUatAt":"2025-07-04T11:39:38.817+0200","jiraKey":"WFN-397","year":"2025","requestedFor":"","openedAt":"2025-07-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-15T13:20:52.000Z"},"RITM2493329":{"state":"Closed Complete","shortDesc":"Typo on website CTA","assignedTo":"Herman Bykanov (Inactive)","brand":"Nurofen","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":172,"clientRespMinutes":1848,"firstReplyAt":"2025-07-03 12:15:45","firstAssignedDate":"2025-07-03 09:56:37","fulfillmentDate":"2025-07-03 09:24:09","openedBy":"Federica Pasotti","openedDate":"2025-07-03","closedDate":"2025-07-21","toDoAt":null,"inUatAt":"2025-07-07T10:39:12.210+0200","jiraKey":"WFN-398","year":"2025","requestedFor":"","openedAt":"2025-07-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-21T08:20:52.999Z"},"RITM2494133":{"state":"Closed Complete","shortDesc":"Adaption of the impressum of the Vanish Website due to LER change","assignedTo":"Herman Bykanov (Inactive)","brand":"Vanish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1028,"clientRespMinutes":1098,"firstReplyAt":"2025-07-04 10:09:40","firstAssignedDate":"2025-07-04 10:08:47","fulfillmentDate":"2025-07-03 17:01:15","openedBy":"Svenja Sirges","openedDate":"2025-07-03","closedDate":"2025-07-19","toDoAt":"2025-07-07T09:38:05.473+0200","inUatAt":null,"jiraKey":"WFN-399","year":"2025","requestedFor":"","openedAt":"2025-07-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-19T08:20:55.000Z"},"RITM2494149":{"state":"Closed Complete","shortDesc":"Inprint Update","assignedTo":"Herman Bykanov (Inactive)","brand":"Veet","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":5252,"clientRespMinutes":3290,"firstReplyAt":"2025-07-07 08:47:51","firstAssignedDate":"2025-07-04 10:10:04","fulfillmentDate":"2025-07-03 17:16:25","openedBy":"Lena Lechatellier (Inactive)","openedDate":"2025-07-03","closedDate":"2025-07-26","toDoAt":"2025-07-07T09:40:51.737+0200","inUatAt":null,"jiraKey":"WFN-400","year":"2025","requestedFor":"","openedAt":"2025-07-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-26T08:20:58.000Z"},"RITM2494158":{"state":"Closed Complete","shortDesc":"Change Videos on Website","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Germany","businessUnit":"Core Reckitt","finalCost":"420","currencyCode":"GBP","ttfrMinutes":5240,"clientRespMinutes":2022,"firstReplyAt":"2025-07-07 08:45:37","firstAssignedDate":"2025-07-04 10:10:33","fulfillmentDate":"2025-07-03 17:26:03","openedBy":"Lena Lechatellier (Inactive)","openedDate":"2025-07-03","closedDate":"2025-08-26","toDoAt":"2025-07-07T11:17:47.123+0200","inUatAt":"2025-07-14T15:38:26.430+0200","jiraKey":"WFN-401","year":"2025","requestedFor":"","openedAt":"2025-07-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-26T12:20:52.999Z"},"RITM2495500":{"state":"Closed Complete","shortDesc":"Changes on Kukident.de Website","assignedTo":"Alesya Prolagayeva","brand":"Kukident","market":"Germany","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":4238,"clientRespMinutes":3951,"firstReplyAt":"2025-07-07 13:46:37","firstAssignedDate":"2025-07-07 09:56:41","fulfillmentDate":"2025-07-04 15:08:47","openedBy":"Miriam Obanya","openedDate":"2025-07-04","closedDate":"2025-09-20","toDoAt":"2025-08-29T11:08:56.650+0200","inUatAt":"2025-09-11T11:53:44.900+0200","jiraKey":"WFN-465","year":"2025","requestedFor":"","openedAt":"2025-07-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-20T07:20:56.000Z"},"RITM2495545":{"state":"Closed Complete","shortDesc":"Exchange Coupons on website","assignedTo":"Herman Bykanov (Inactive)","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":4348,"clientRespMinutes":4246,"firstReplyAt":"2025-07-07 16:23:52","firstAssignedDate":"2025-07-07 09:57:07","fulfillmentDate":"2025-07-04 15:55:28","openedBy":"Annika Brickwedde","openedDate":"2025-07-04","closedDate":"2025-07-27","toDoAt":"2025-07-10T16:09:39.173+0200","inUatAt":"2025-07-09T12:07:39.520+0200","jiraKey":"WFN-402","year":"2025","requestedFor":"","openedAt":"2025-07-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-27T10:20:56.999Z"},"RITM2496519":{"state":"Closed Complete","shortDesc":"An urgent legal text that should be added to the mainpage finish.com.tr","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1448,"clientRespMinutes":136,"firstReplyAt":"2025-07-08 10:23:03","firstAssignedDate":"2025-07-08 10:19:19","fulfillmentDate":"2025-07-07 10:15:17","openedBy":"Selen Akay (Inactive)","openedDate":"2025-07-07","closedDate":"2025-07-22","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-405","year":"2025","requestedFor":"","openedAt":"2025-07-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-25T08:00:55.000Z"},"RITM2496562":{"state":"Closed Complete","shortDesc":"Vanish Website changes","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Poland","businessUnit":"Core Reckitt","finalCost":"1320","currencyCode":"GBP","ttfrMinutes":3146,"clientRespMinutes":5091,"firstReplyAt":"2025-07-09 15:09:32","firstAssignedDate":"2025-07-08 10:15:29","fulfillmentDate":"2025-07-07 10:43:08","openedBy":"Klara Marzec","openedDate":"2025-07-07","closedDate":"2025-08-16","toDoAt":"2025-07-21T17:28:06.760+0200","inUatAt":"2025-07-17T19:48:36.130+0200","jiraKey":"WFN-404","year":"2025","requestedFor":"","openedAt":"2025-07-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-16T09:20:57.999Z"},"RITM2497111":{"state":"Closed Cancelled","shortDesc":"Page are not accessible","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"France","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":2874,"clientRespMinutes":1498,"firstReplyAt":"2025-07-09 15:22:55","firstAssignedDate":"2025-07-08 10:15:35","fulfillmentDate":"2025-07-07 15:28:30","openedBy":"Anaelle Yao","openedDate":"2025-07-07","closedDate":"2025-09-18","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-403","year":"2025","requestedFor":"Anaelle Yao","openedAt":"2025-07-07 15:28:26","stateChangedAt":"2025-09-18 16:34:50","stateChangedBy":"System","lastActivityAt":"2025-09-18 11:58:23","lastActivityBy":"Anaelle Yao","_updated":"2025-09-18T11:34:50.000Z"},"RITM2500487":{"state":"Closed Complete","shortDesc":"LLS + LYS LDS + SPRAY MULTIUSOS + PETS + MPC | Lysol MX","assignedTo":"Jesica Greco","brand":"Lysol","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"66000","currencyCode":"MXN","ttfrMinutes":10005,"clientRespMinutes":8760,"firstReplyAt":"2025-07-16 19:15:23","firstAssignedDate":"2025-07-10 13:44:50","fulfillmentDate":"2025-07-09 20:30:18","openedBy":"Denisse Solano Sanchez (Inactive)","openedDate":"2025-07-09","closedDate":"2025-10-26","toDoAt":"2025-08-21T14:18:58.383+0200","inUatAt":"2025-09-17T16:03:39.560+0200","jiraKey":"WFN-407","year":"2025","requestedFor":"","openedAt":"2025-07-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-26T17:20:52.000Z"},"RITM2501727":{"state":"Closed Complete","shortDesc":"Website Gavisconell FR - Visa & MOA video update","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"France","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":829,"clientRespMinutes":5846,"firstReplyAt":"2025-07-11 10:54:26","firstAssignedDate":"2025-07-11 09:54:15","fulfillmentDate":"2025-07-10 21:05:45","openedBy":"Prisca Gombert","openedDate":"2025-07-10","closedDate":"2025-09-01","toDoAt":"2025-08-12T18:05:27.833+0200","inUatAt":"2025-08-18T09:34:15.847+0200","jiraKey":"WFN-406","year":"2025","requestedFor":"","openedAt":"2025-07-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-01T15:20:51.000Z"},"RITM2502368":{"state":"Closed Complete","shortDesc":"Changes required on Nurofen.it","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":4707,"clientRespMinutes":6511,"firstReplyAt":"2025-07-14 16:42:58","firstAssignedDate":"2025-07-14 10:42:54","fulfillmentDate":"2025-07-11 10:15:34","openedBy":"Federica Pasotti","openedDate":"2025-07-11","closedDate":"2025-08-06","toDoAt":"2025-07-21T17:32:34.857+0200","inUatAt":"2025-07-22T12:18:22.730+0200","jiraKey":"WFN-408","year":"2025","requestedFor":"","openedAt":"2025-07-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-06T12:20:59.000Z"},"RITM2502854":{"state":"Closed Complete","shortDesc":"NUROFEN WEBSITE-TECH INTERNAL LINKING AUDIT","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Greece","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":14533,"clientRespMinutes":7703,"firstReplyAt":"2025-07-21 17:37:47","firstAssignedDate":"2025-07-14 10:42:47","fulfillmentDate":"2025-07-11 15:25:12","openedBy":"Foteini Sfikti (Inactive)","openedDate":"2025-07-11","closedDate":"2025-11-05","toDoAt":"2025-09-04T16:05:52.653+0200","inUatAt":null,"jiraKey":"WFN-409","year":"2025","requestedFor":"","openedAt":"2025-07-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-05T16:20:54.000Z"},"RITM2504135":{"state":"Closed Complete","shortDesc":"Change of Date","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Austria","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":457,"clientRespMinutes":6451,"firstReplyAt":"2025-07-14 16:46:01","firstAssignedDate":"2025-07-14 10:42:40","fulfillmentDate":"2025-07-14 09:09:09","openedBy":"Annika Brickwedde","openedDate":"2025-07-14","closedDate":"2025-07-30","toDoAt":"2025-07-14T12:46:06.063+0200","inUatAt":"2025-07-21T15:16:03.520+0200","jiraKey":"WFN-410","year":"2025","requestedFor":"","openedAt":"2025-07-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-07-30T17:20:52.999Z"},"RITM2504372":{"state":"Closed Complete","shortDesc":"Change Couponpage","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":10459,"clientRespMinutes":253,"firstReplyAt":"2025-07-21 17:39:12","firstAssignedDate":"2025-07-16 10:04:26","fulfillmentDate":"2025-07-14 11:19:52","openedBy":"Marie Topfer (Inactive)","openedDate":"2025-07-14","closedDate":"2025-08-19","toDoAt":null,"inUatAt":"2025-07-17T09:39:00.397+0200","jiraKey":"WFN-413","year":"2025","requestedFor":"","openedAt":"2025-07-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-20T15:30:08.000Z"},"RITM2505652":{"state":"Closed Complete","shortDesc":"Product updates Pandora SKUs","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Finish","market":"Switzerland","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":11885,"clientRespMinutes":2105,"firstReplyAt":"2025-07-23 16:48:40","firstAssignedDate":"2025-07-16 10:02:46","fulfillmentDate":"2025-07-15 10:44:00","openedBy":"Annika Brickwedde","openedDate":"2025-07-15","closedDate":"2025-09-03","toDoAt":"2025-08-21T10:53:19.000+0200","inUatAt":"2025-08-21T17:02:07.157+0200","jiraKey":"WFN-412","year":"2025","requestedFor":"","openedAt":"2025-07-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-03T13:20:54.000Z"},"RITM2506206":{"state":"Closed Complete","shortDesc":"Wrong Matching Links","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Durex","market":"Belgium","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":11593,"clientRespMinutes":3637,"firstReplyAt":"2025-07-23 16:59:12","firstAssignedDate":"2025-07-16 10:00:43","fulfillmentDate":"2025-07-15 15:46:03","openedBy":"Anaelle Yao","openedDate":"2025-07-15","closedDate":"2025-09-20","toDoAt":"2025-07-28T09:41:40.857+0200","inUatAt":"2025-07-29T09:30:33.763+0200","jiraKey":"WFN-411","year":"2025","requestedFor":"","openedAt":"2025-07-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-20T10:20:58.000Z"},"RITM2507172":{"state":"Closed Complete","shortDesc":"Addition of Product to Durex Website","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1332,"clientRespMinutes":4810,"firstReplyAt":"2025-07-17 09:56:40","firstAssignedDate":"2025-07-17 09:56:40","fulfillmentDate":"2025-07-16 11:45:08","openedBy":"Martim Martins (Inactive)","openedDate":"2025-07-16","closedDate":"2025-08-17","toDoAt":"2025-07-23T10:17:59.540+0200","inUatAt":"2025-07-28T15:05:41.940+0200","jiraKey":"WFN-421","year":"2025","requestedFor":"","openedAt":"2025-07-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-17T15:20:54.000Z"},"RITM2509124":{"state":"Closed Complete","shortDesc":"Website changes","assignedTo":"Alesya Prolagayeva","brand":"Cillit","market":"France","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":5688,"clientRespMinutes":2490,"firstReplyAt":"2025-07-21 17:44:33","firstAssignedDate":"2025-07-18 09:55:05","fulfillmentDate":"2025-07-17 18:56:34","openedBy":"Julie Duquennoy","openedDate":"2025-07-17","closedDate":"2025-09-07","toDoAt":"2025-07-22T10:02:19.033+0200","inUatAt":"2025-08-07T13:45:36.957+0200","jiraKey":"WFN-417","year":"2025","requestedFor":"","openedAt":"2025-07-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-07T08:21:07.999Z"},"RITM2509941":{"state":"Closed Complete","shortDesc":"CSP on calgon.it","assignedTo":"Alesya Prolagayeva","brand":"Calgon","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":4534,"clientRespMinutes":2363,"firstReplyAt":"2025-07-21 15:07:21","firstAssignedDate":"2025-07-21 15:07:22","fulfillmentDate":"2025-07-18 11:33:42","openedBy":"Aleh Dziameshchanka","openedDate":"2025-07-18","closedDate":"2025-08-06","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-419","year":"2025","requestedFor":"","openedAt":"2025-07-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-06T12:20:52.000Z"},"RITM2511382":{"state":"Closed Cancelled","shortDesc":"Add Pictogram","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1548,"clientRespMinutes":8360,"firstReplyAt":"2025-07-22 13:21:35","firstAssignedDate":"2025-07-21 15:11:01","fulfillmentDate":"2025-07-21 11:33:21","openedBy":"Annika Brickwedde","openedDate":"2025-07-21","closedDate":"2025-08-07","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-420","year":"2025","requestedFor":"Annika Brickwedde","openedAt":"2025-07-21 11:33:17","stateChangedAt":"2025-08-07 09:28:43","stateChangedBy":"System","lastActivityAt":"2025-08-06 14:47:34","lastActivityBy":"Annika Brickwedde","_updated":"2025-08-07T04:28:43.000Z"},"RITM2512004":{"state":"Closed Complete","shortDesc":"Creation of a new product page for Vanish Italian website","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":947,"clientRespMinutes":4032,"firstReplyAt":"2025-07-22 10:01:00","firstAssignedDate":"2025-07-22 10:01:00","fulfillmentDate":"2025-07-21 18:14:32","openedBy":"Alessandra Somaschini","openedDate":"2025-07-21","closedDate":"2025-09-21","toDoAt":"2025-07-28T11:30:25.703+0200","inUatAt":"2025-07-28T16:16:48.517+0200","jiraKey":"WFN-422","year":"2025","requestedFor":"","openedAt":"2025-07-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-21T15:20:54.000Z"},"RITM2514364":{"state":"Closed Complete","shortDesc":"New landing page for Cashback on Air Wick - National promo cashback","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"1152","currencyCode":"EUR","ttfrMinutes":1326,"clientRespMinutes":3655,"firstReplyAt":"2025-07-24 12:45:48","firstAssignedDate":"2025-07-24 10:02:19","fulfillmentDate":"2025-07-23 14:39:49","openedBy":"Mario Settembre","openedDate":"2025-07-23","closedDate":"2025-11-09","toDoAt":"2025-07-31T13:44:26.863+0200","inUatAt":"2025-08-06T13:24:33.477+0200","jiraKey":"WFN-425","year":"2025","requestedFor":"","openedAt":"2025-07-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-09T12:20:53.999Z"},"RITM2514465":{"state":"Closed Complete","shortDesc":"Sole website change request","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Sole","market":"Italy","businessUnit":"Essential Home","finalCost":"1440","currencyCode":"EUR","ttfrMinutes":18530,"clientRespMinutes":10082,"firstReplyAt":"2025-08-05 13:25:27","firstAssignedDate":"2025-07-24 10:00:02","fulfillmentDate":"2025-07-23 16:35:05","openedBy":"Estelle Pivetta (Inactive)","openedDate":"2025-07-23","closedDate":"2025-11-17","toDoAt":"2025-08-28T17:55:58.990+0200","inUatAt":"2025-08-29T16:21:15.867+0200","jiraKey":"WFN-424","year":"2025","requestedFor":"","openedAt":"2025-07-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-17T15:20:52.999Z"},"RITM2514524":{"state":"Closed Complete","shortDesc":"Update Nurofen.it website for new product launch","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Nurofen","market":"Italy","businessUnit":"Core Reckitt","finalCost":"6480","currencyCode":"EUR","ttfrMinutes":6925,"clientRespMinutes":5113,"firstReplyAt":"2025-07-28 13:13:49","firstAssignedDate":"2025-07-24 09:56:30","fulfillmentDate":"2025-07-23 17:49:13","openedBy":"Federica Pasotti","openedDate":"2025-07-23","closedDate":"2025-12-06","toDoAt":"2025-07-31T09:49:36.137+0200","inUatAt":"2025-08-11T15:26:20.243+0200","jiraKey":"WFN-423","year":"2025","requestedFor":"","openedAt":"2025-07-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-06T14:20:55.000Z"},"RITM2515461":{"state":"Closed Complete","shortDesc":"Corrections of URLs on Galieve SE","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Sweden","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":5567,"clientRespMinutes":4670,"firstReplyAt":"2025-07-28 09:56:30","firstAssignedDate":"2025-07-28 09:56:30","fulfillmentDate":"2025-07-24 13:09:34","openedBy":"Harry Malakis","openedDate":"2025-07-24","closedDate":"2025-09-03","toDoAt":"2025-08-07T09:31:19.723+0200","inUatAt":"2025-08-04T17:44:28.493+0200","jiraKey":"WFN-433","year":"2025","requestedFor":"","openedAt":"2025-07-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-03T09:20:55.000Z"},"RITM2517782":{"state":"Closed Complete","shortDesc":"Change of banner in brand website - Air Wick Italy","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":5299,"clientRespMinutes":2489,"firstReplyAt":"2025-07-31 11:58:42","firstAssignedDate":"2025-07-28 09:55:27","fulfillmentDate":"2025-07-27 19:39:24","openedBy":"Mario Settembre","openedDate":"2025-07-27","closedDate":"2025-09-07","toDoAt":"2025-07-31T13:20:20.267+0200","inUatAt":"2025-08-01T14:47:14.420+0200","jiraKey":"WFN-430","year":"2025","requestedFor":"","openedAt":"2025-07-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-07T11:20:56.000Z"},"RITM2519924":{"state":"Closed Complete","shortDesc":"Nurofen UK - New Symptom pages","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"900","currencyCode":"GBP","ttfrMinutes":10157,"clientRespMinutes":11119,"firstReplyAt":"2025-08-05 16:02:50","firstAssignedDate":"2025-07-31 11:28:53","fulfillmentDate":"2025-07-29 14:45:49","openedBy":"Rowena Hearn","openedDate":"2025-07-29","closedDate":"2026-01-17","toDoAt":"2025-09-05T12:57:07.537+0200","inUatAt":"2025-09-09T15:47:15.540+0200","jiraKey":"WFN-429","year":"2025","requestedFor":"","openedAt":"2025-07-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-17T15:20:52.999Z"},"RITM2520090":{"state":"Closed Complete","shortDesc":"Cybersecurity assessments","assignedTo":"Alesya Prolagayeva","brand":"Lovela","market":"Poland","businessUnit":"Essential Home","finalCost":"720","currencyCode":"GBP","ttfrMinutes":1436,"clientRespMinutes":1368,"firstReplyAt":"2025-07-30 16:41:47","firstAssignedDate":"2025-07-30 16:41:47","fulfillmentDate":"2025-07-29 16:45:29","openedBy":"Aleksandra Brol (Inactive)","openedDate":"2025-07-29","closedDate":"2025-11-09","toDoAt":"2025-09-25T14:29:13.307+0200","inUatAt":null,"jiraKey":"WFN-428","year":"2025","requestedFor":"","openedAt":"2025-07-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-09T15:21:16.000Z"},"RITM2520920":{"state":"Closed Complete","shortDesc":"Remove a Promo from finishinfo.it","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":257,"clientRespMinutes":15176,"firstReplyAt":"2025-07-30 15:16:10","firstAssignedDate":"2025-07-30 15:09:14","fulfillmentDate":"2025-07-30 10:59:15","openedBy":"Sofia Pallaro","openedDate":"2025-07-30","closedDate":"2025-08-25","toDoAt":null,"inUatAt":"2025-07-31T09:24:25.063+0200","jiraKey":"WFN-427","year":"2025","requestedFor":"","openedAt":"2025-07-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-25T19:20:56.999Z"},"RITM2522813":{"state":"Closed Complete","shortDesc":"Cyvbersecurity Destop.fr upgrade","assignedTo":"Alesya Prolagayeva","brand":"Destop","market":"France","businessUnit":"Essential Home","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1346,"clientRespMinutes":17498,"firstReplyAt":"2025-08-01 13:46:32","firstAssignedDate":"2025-07-31 16:17:47","fulfillmentDate":"2025-07-31 15:20:42","openedBy":"Sandrine Deplaine","openedDate":"2025-07-31","closedDate":"2025-12-03","toDoAt":"2025-10-06T17:29:49.693+0200","inUatAt":null,"jiraKey":"WFN-432","year":"2025","requestedFor":"","openedAt":"2025-07-31","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-03T17:20:50.999Z"},"RITM2522836":{"state":"Closed Complete","shortDesc":"Cybersecurity update","assignedTo":"Alesya Prolagayeva","brand":"Calgon","market":"France","businessUnit":"Essential Home","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1337,"clientRespMinutes":11557,"firstReplyAt":"2025-08-01 13:47:59","firstAssignedDate":"2025-07-31 16:16:17","fulfillmentDate":"2025-07-31 15:30:40","openedBy":"Sandrine Deplaine","openedDate":"2025-07-31","closedDate":"2025-10-21","toDoAt":"2025-08-05T16:03:47.023+0200","inUatAt":null,"jiraKey":"WFN-431","year":"2025","requestedFor":"","openedAt":"2025-07-31","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-21T08:20:52.999Z"},"RITM2525610":{"state":"Closed Complete","shortDesc":"New articles","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"France","businessUnit":"Core Reckitt","finalCost":"1440","currencyCode":"EUR","ttfrMinutes":4444,"clientRespMinutes":5444,"firstReplyAt":"2025-08-07 12:48:12","firstAssignedDate":"2025-08-05 10:19:44","fulfillmentDate":"2025-08-04 10:44:12","openedBy":"Celia Balagna (Inactive)","openedDate":"2025-08-04","closedDate":"2025-12-03","toDoAt":"2025-09-24T11:15:59.037+0200","inUatAt":"2025-10-17T13:47:56.640+0200","jiraKey":"WFN-436","year":"2025","requestedFor":"","openedAt":"2025-08-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-03T17:20:54.000Z"},"RITM2526252":{"state":"Closed Complete","shortDesc":"new Names in Impring","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1229,"clientRespMinutes":822,"firstReplyAt":"2025-08-05 14:09:14","firstAssignedDate":"2025-08-05 10:19:52","fulfillmentDate":"2025-08-04 17:39:54","openedBy":"Annika Brickwedde","openedDate":"2025-08-04","closedDate":"2025-08-17","toDoAt":null,"inUatAt":"2025-08-05T13:58:49.363+0200","jiraKey":"WFN-435","year":"2025","requestedFor":"","openedAt":"2025-08-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-17T15:20:52.999Z"},"RITM2526254":{"state":"Closed Cancelled","shortDesc":"change some page from position","assignedTo":"Alesya Prolagayeva","brand":"StMarcs","market":"France","businessUnit":"Essential Home","finalCost":"","currencyCode":"","ttfrMinutes":1227,"clientRespMinutes":null,"firstReplyAt":"2025-08-05 14:07:23","firstAssignedDate":"2025-08-05 10:03:40","fulfillmentDate":"2025-08-04 17:40:43","openedBy":"Anaelle Bienfait (Inactive)","openedDate":"2025-08-04","closedDate":"2025-09-17","toDoAt":"2025-09-10T14:59:14.230+0200","inUatAt":"2025-09-11T18:31:26.653+0200","jiraKey":"WFN-434","year":"2025","requestedFor":"Anaelle Bienfait (Inactive)","openedAt":"2025-08-04 17:40:39","stateChangedAt":"2025-09-17 19:24:41","stateChangedBy":"System","lastActivityAt":"2025-08-20 19:57:54","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-09-17T14:24:45.000Z"},"RITM2526784":{"state":"Closed Complete","shortDesc":"Update Durex DACH Websites Impressum 3.0","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":307,"clientRespMinutes":3419,"firstReplyAt":"2025-08-05 14:02:55","firstAssignedDate":"2025-08-05 14:02:55","fulfillmentDate":"2025-08-05 08:56:19","openedBy":"Florian Mecking","openedDate":"2025-08-05","closedDate":"2025-08-16","toDoAt":"2025-08-05T14:03:48.767+0200","inUatAt":null,"jiraKey":"WFN-437","year":"2025","requestedFor":"","openedAt":"2025-08-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-16T10:20:50.999Z"},"RITM2526909":{"state":"Closed Complete","shortDesc":"Change of the Impressum","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":249,"clientRespMinutes":2659,"firstReplyAt":"2025-08-05 14:15:14","firstAssignedDate":"2025-08-05 14:15:14","fulfillmentDate":"2025-08-05 10:06:35","openedBy":"Lena Lechatellier (Inactive)","openedDate":"2025-08-05","closedDate":"2025-08-25","toDoAt":"2025-08-12T18:19:51.140+0200","inUatAt":"2025-08-13T17:47:37.147+0200","jiraKey":"WFN-447","year":"2025","requestedFor":"","openedAt":"2025-08-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-25T17:21:04.000Z"},"RITM2527532":{"state":"Closed Complete","shortDesc":"Veja Brazil - Site Update New Product","assignedTo":"Alesya Prolagayeva","brand":"Veja","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"100001","currencyCode":"MXN","ttfrMinutes":2986,"clientRespMinutes":4617,"firstReplyAt":"2025-08-07 17:28:22","firstAssignedDate":"2025-08-06 09:52:16","fulfillmentDate":"2025-08-05 15:42:15","openedBy":"Jessica Vidotti","openedDate":"2025-08-05","closedDate":"2025-11-16","toDoAt":"2025-08-11T09:35:23.527+0200","inUatAt":"2025-09-08T20:00:46.513+0200","jiraKey":"WFN-438","year":"2025","requestedFor":"","openedAt":"2025-08-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-16T15:20:55.000Z"},"RITM2527633":{"state":"Closed Cancelled","shortDesc":"New eCom SKUs","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1318,"clientRespMinutes":67,"firstReplyAt":"2025-08-06 14:52:09","firstAssignedDate":"2025-08-06 09:56:43","fulfillmentDate":"2025-08-05 16:53:51","openedBy":"Annika Brickwedde","openedDate":"2025-08-05","closedDate":"2025-11-11","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-439","year":"2025","requestedFor":"Annika Brickwedde","openedAt":"2025-08-05 16:53:46","stateChangedAt":"2025-11-11 15:05:36","stateChangedBy":"System","lastActivityAt":"2025-11-11 15:04:51","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-11-11T12:05:36.000Z"},"RITM2528609":{"state":"Closed Complete","shortDesc":"Strepsils FR website","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"France","businessUnit":"Core Reckitt","finalCost":"10920","currencyCode":"EUR","ttfrMinutes":1421,"clientRespMinutes":null,"firstReplyAt":"2025-08-07 11:41:13","firstAssignedDate":"2025-08-07 11:41:14","fulfillmentDate":"2025-08-06 12:00:07","openedBy":"Marine Pupin (Inactive)","openedDate":"2025-08-06","closedDate":"2025-12-03","toDoAt":"2025-03-03T17:54:19.267+0100","inUatAt":"2025-02-03T11:26:43.800+0100","jiraKey":"WFN-40","year":"2025","requestedFor":"","openedAt":"2025-08-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-03T17:20:52.999Z"},"RITM2528710":{"state":"Closed Complete","shortDesc":"Vanish website updates","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Romania","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":1423,"clientRespMinutes":5033,"firstReplyAt":"2025-08-07 12:58:28","firstAssignedDate":"2025-08-07 12:58:28","fulfillmentDate":"2025-08-06 13:15:54","openedBy":"Diana Petre (Inactive)","openedDate":"2025-08-06","closedDate":"2025-08-25","toDoAt":"2025-08-08T09:50:49.877+0200","inUatAt":"2025-08-11T14:38:23.550+0200","jiraKey":"WFN-441","year":"2025","requestedFor":"","openedAt":"2025-08-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-08-25T17:21:05.999Z"},"RITM2528878":{"state":"Closed Cancelled","shortDesc":"Update Pandora SKUs","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Finish","market":"Austria","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1514,"clientRespMinutes":21395,"firstReplyAt":"2025-08-07 16:00:34","firstAssignedDate":"2025-08-07 12:31:48","fulfillmentDate":"2025-08-06 14:46:54","openedBy":"Annika Brickwedde","openedDate":"2025-08-06","closedDate":"2025-12-05","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-440","year":"2025","requestedFor":"Annika Brickwedde","openedAt":"2025-08-06 14:46:51","stateChangedAt":"2025-12-05 12:32:37","stateChangedBy":"System","lastActivityAt":"2025-12-04 16:42:43","lastActivityBy":"Annika Brickwedde","_updated":"2025-12-05T09:32:37.000Z"},"RITM2530168":{"state":"Closed Complete","shortDesc":"Removal of Nurofen Ultra content from Nurofen website","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Romania","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":7069,"clientRespMinutes":40,"firstReplyAt":"2025-08-12 11:29:23","firstAssignedDate":"2025-08-08 16:26:45","fulfillmentDate":"2025-08-07 13:40:42","openedBy":"Daria Brinaru","openedDate":"2025-08-07","closedDate":"2025-11-05","toDoAt":"2025-08-12T10:21:40.613+0200","inUatAt":"2025-08-12T15:57:39.707+0200","jiraKey":"WFN-443","year":"2025","requestedFor":"","openedAt":"2025-08-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-05T16:20:54.000Z"},"RITM2530362":{"state":"Closed Cancelled","shortDesc":"Lovela PL arctiles publishing","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Lovela","market":"Poland","businessUnit":"Essential Home","finalCost":"","currencyCode":"","ttfrMinutes":5378,"clientRespMinutes":342,"firstReplyAt":"2025-08-11 09:48:46","firstAssignedDate":"2025-08-08 16:25:09","fulfillmentDate":"2025-08-07 16:11:15","openedBy":"Aleksandra Brol (Inactive)","openedDate":"2025-08-07","closedDate":"2025-10-16","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-442","year":"2025","requestedFor":"Aleksandra Brol (Inactive)","openedAt":"2025-08-07 16:11:12","stateChangedAt":"2025-10-16 15:52:10","stateChangedBy":"System","lastActivityAt":"2025-10-16 12:24:50","lastActivityBy":"Olga Tadrzak","_updated":"2025-10-16T10:52:17.000Z"},"RITM2530443":{"state":"Closed Complete","shortDesc":"Las Vegas - Nurofen Poland","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Poland","businessUnit":"Core Reckitt","finalCost":"2400","currencyCode":"GBP","ttfrMinutes":6838,"clientRespMinutes":9397,"firstReplyAt":"2025-08-12 11:23:46","firstAssignedDate":"2025-08-08 17:11:35","fulfillmentDate":"2025-08-07 17:26:19","openedBy":"Rowena Hearn","openedDate":"2025-08-07","closedDate":"2025-11-05","toDoAt":"2025-08-11T10:43:35.403+0200","inUatAt":"2025-08-21T14:15:55.917+0200","jiraKey":"WFN-445","year":"2025","requestedFor":"","openedAt":"2025-08-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-05T16:20:56.999Z"},"RITM2531506":{"state":"Closed Complete","shortDesc":"Cashback changes as of 1st of Sep 25","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":4101,"clientRespMinutes":84,"firstReplyAt":"2025-08-11 09:43:20","firstAssignedDate":"2025-08-08 16:57:57","fulfillmentDate":"2025-08-08 13:22:21","openedBy":"Annika Brickwedde","openedDate":"2025-08-08","closedDate":"2025-09-13","toDoAt":"2025-08-11T13:15:04.540+0200","inUatAt":"2025-08-11T17:42:26.007+0200","jiraKey":"WFN-444","year":"2025","requestedFor":"","openedAt":"2025-08-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-13T15:20:56.000Z"},"RITM2533394":{"state":"Closed Complete","shortDesc":"WEBSITE SECTIONS NOT WORKING","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Nurofen","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1157,"clientRespMinutes":1719,"firstReplyAt":"2025-08-12 12:52:13","firstAssignedDate":"2025-08-12 09:59:35","fulfillmentDate":"2025-08-11 17:35:25","openedBy":"Federica Pasotti","openedDate":"2025-08-11","closedDate":"2025-09-09","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-448","year":"2025","requestedFor":"","openedAt":"2025-08-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-09T14:20:53.999Z"},"RITM2533675":{"state":"Closed Complete","shortDesc":"Changes in \"140 objetos\" | Lysol","assignedTo":"Jesica Greco","brand":"Lysol","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":10900,"clientRespMinutes":3541,"firstReplyAt":"2025-08-19 15:32:10","firstAssignedDate":"2025-08-13 14:49:16","fulfillmentDate":"2025-08-12 01:52:43","openedBy":"Mariana Onofre Castro","openedDate":"2025-08-12","closedDate":"2025-10-26","toDoAt":"2025-08-19T15:32:27.960+0200","inUatAt":"2025-09-08T18:37:02.400+0200","jiraKey":"WFN-452","year":"2025","requestedFor":"","openedAt":"2025-08-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-26T17:20:50.999Z"},"RITM2534462":{"state":"Closed Complete","shortDesc":"Updating Nurofen Belgium Website","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Belgium","businessUnit":"Core Reckitt","finalCost":"2880","currencyCode":"EUR","ttfrMinutes":8706,"clientRespMinutes":4687,"firstReplyAt":"2025-08-18 13:00:58","firstAssignedDate":"2025-08-13 10:24:00","fulfillmentDate":"2025-08-12 11:54:55","openedBy":"Mehmet Tolga Kara (Inactive)","openedDate":"2025-08-12","closedDate":"2026-02-21","toDoAt":"2025-09-11T15:05:50.550+0200","inUatAt":"2025-12-15T23:04:37.440+0100","jiraKey":"WFN-449","year":"2025","requestedFor":"","openedAt":"2025-08-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-02-21T10:21:04.000Z"},"RITM2534648":{"state":"Closed Cancelled","shortDesc":"Website Migration - Durex DE Website Adjustments before Go-Live","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Durex","market":"Germany","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":31608,"clientRespMinutes":55572,"firstReplyAt":"2025-09-03 12:52:19","firstAssignedDate":"2025-08-13 10:17:08","fulfillmentDate":"2025-08-12 14:04:09","openedBy":"Florian Mecking","openedDate":"2025-08-12","closedDate":"2025-12-04","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-451","year":"2025","requestedFor":"Florian Mecking","openedAt":"2025-08-12 14:04:06","stateChangedAt":"2025-12-04 14:31:24","stateChangedBy":"Alesya Prolagayeva","lastActivityAt":"2025-12-04 14:30:58","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-12-04T11:31:24.000Z"},"RITM2534726":{"state":"Closed Cancelled","shortDesc":"Visuals changes","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"France","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":3006,"clientRespMinutes":10112,"firstReplyAt":"2025-08-14 17:17:18","firstAssignedDate":"2025-08-13 10:18:17","fulfillmentDate":"2025-08-12 15:11:37","openedBy":"Celia Balagna (Inactive)","openedDate":"2025-08-12","closedDate":"2025-11-11","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-450","year":"2025","requestedFor":"Celia Balagna (Inactive)","openedAt":"2025-08-12 15:11:34","stateChangedAt":"2025-11-11 21:30:14","stateChangedBy":"System","lastActivityAt":"2025-11-11 21:29:43","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-11-11T18:30:14.000Z"},"RITM2536337":{"state":"Closed Complete","shortDesc":"Changes in home banner | Vanish","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"12000","currencyCode":"MXN","ttfrMinutes":2370,"clientRespMinutes":1701,"firstReplyAt":"2025-08-15 12:14:22","firstAssignedDate":"2025-08-14 09:57:33","fulfillmentDate":"2025-08-13 20:44:47","openedBy":"Mariana Onofre Castro","openedDate":"2025-08-13","closedDate":"2025-09-07","toDoAt":"2025-08-18T12:28:39.187+0200","inUatAt":"2025-08-19T19:18:37.087+0200","jiraKey":"WFN-453","year":"2025","requestedFor":"","openedAt":"2025-08-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-07T08:21:03.000Z"},"RITM2536419":{"state":"Closed Complete","shortDesc":"Hide pages | Vanish","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"2400","currencyCode":"MXN","ttfrMinutes":655,"clientRespMinutes":7311,"firstReplyAt":"2025-08-14 09:55:35","firstAssignedDate":"2025-08-14 09:55:35","fulfillmentDate":"2025-08-13 23:00:58","openedBy":"Mariana Onofre Castro","openedDate":"2025-08-13","closedDate":"2025-09-07","toDoAt":null,"inUatAt":"2025-08-18T17:43:55.030+0200","jiraKey":"WFN-454","year":"2025","requestedFor":"","openedAt":"2025-08-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-07T08:20:56.000Z"},"RITM2539664":{"state":"Closed Cancelled","shortDesc":"Creation of a website brief to update the Durex Belgium site with a new section dedicated to the launch of Durex Intensity.","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Belgium","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":"","firstAssignedDate":"2025-08-19 10:54:21","fulfillmentDate":"2025-08-18 14:30:30","openedBy":"Greta Podini (Inactive)","openedDate":"2025-08-18","closedDate":"2025-11-03","toDoAt":"2025-10-03T10:49:47.177+0200","inUatAt":null,"jiraKey":"WFN-455","year":"2025","requestedFor":"Greta Podini (Inactive)","openedAt":"2025-08-18 14:30:26","stateChangedAt":"2025-11-03 18:26:30","stateChangedBy":"System","lastActivityAt":"","lastActivityBy":"","_updated":"2025-11-03T15:26:30.000Z"},"RITM2539665":{"state":"Closed Complete","shortDesc":"Creation of a website brief to update the Durex Belgium site with a new section dedicated to the launch of Durex Intensity.","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Belgium","businessUnit":"Core Reckitt","finalCost":"504","currencyCode":"EUR","ttfrMinutes":1223,"clientRespMinutes":6888,"firstReplyAt":"2025-08-19 10:53:45","firstAssignedDate":"2025-08-19 10:53:45","fulfillmentDate":"2025-08-18 14:30:38","openedBy":"Greta Podini (Inactive)","openedDate":"2025-08-18","closedDate":"2025-11-08","toDoAt":"2025-10-03T10:49:47.177+0200","inUatAt":null,"jiraKey":"WFN-455","year":"2025","requestedFor":"","openedAt":"2025-08-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-08T17:20:52.999Z"},"RITM2540851":{"state":"Closed Complete","shortDesc":"Changes & Update Renders | Graneodín","assignedTo":"Damian Casasnovas","brand":"Strepsils","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"24000","currencyCode":"MXN","ttfrMinutes":66,"clientRespMinutes":5617,"firstReplyAt":"2025-08-19 11:46:12","firstAssignedDate":"2025-08-19 11:46:12","fulfillmentDate":"2025-08-19 10:40:45","openedBy":"Mariana Onofre Castro","openedDate":"2025-08-19","closedDate":"2026-02-02","toDoAt":"2025-10-15T14:12:04.043+0200","inUatAt":"2025-11-27T20:37:21.317+0100","jiraKey":"WFN-456","year":"2025","requestedFor":"","openedAt":"2025-08-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-02-02T17:21:06.000Z"},"RITM2542316":{"state":"Closed Complete","shortDesc":"microsite update","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":1659,"clientRespMinutes":2754,"firstReplyAt":"2025-08-21 14:19:38","firstAssignedDate":"2025-08-21 14:19:38","fulfillmentDate":"2025-08-20 10:40:27","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2025-08-20","closedDate":"2025-10-01","toDoAt":"2025-08-27T09:33:09.850+0200","inUatAt":"2025-09-02T12:17:19.380+0200","jiraKey":"WFN-457","year":"2025","requestedFor":"","openedAt":"2025-08-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-01T11:20:55.000Z"},"RITM2542430":{"state":"Closed Complete","shortDesc":"Maui - Strepsils PL","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Poland","businessUnit":"Core Reckitt","finalCost":"4000","currencyCode":"GBP","ttfrMinutes":1601,"clientRespMinutes":9086,"firstReplyAt":"2025-08-21 14:26:03","firstAssignedDate":"2025-08-21 14:25:30","fulfillmentDate":"2025-08-20 11:45:11","openedBy":"Rowena Hearn","openedDate":"2025-08-20","closedDate":"2026-03-28","toDoAt":"2025-08-29T18:09:23.980+0200","inUatAt":"2025-12-23T17:01:42.457+0100","jiraKey":"WFN-458","year":"2025","requestedFor":"","openedAt":"2025-08-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-28T15:20:52.000Z"},"RITM2544165":{"state":"Closed Complete","shortDesc":"Promotional Landing Page for Finish.de","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"3000","currencyCode":"GBP","ttfrMinutes":9989,"clientRespMinutes":6475,"firstReplyAt":"2025-08-28 15:29:27","firstAssignedDate":"2025-08-22 09:56:13","fulfillmentDate":"2025-08-21 17:00:11","openedBy":"Joseph Tseng","openedDate":"2025-08-21","closedDate":"2025-11-09","toDoAt":"2025-09-05T09:44:16.963+0200","inUatAt":null,"jiraKey":"WFN-474","year":"2025","requestedFor":"","openedAt":"2025-08-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-09T15:21:20.999Z"},"RITM2546198":{"state":"Closed Complete","shortDesc":"Vanish Articles | Independence Day","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"12000","currencyCode":"MXN","ttfrMinutes":1923,"clientRespMinutes":697,"firstReplyAt":"2025-08-26 18:07:42","firstAssignedDate":"2025-08-26 09:58:04","fulfillmentDate":"2025-08-25 10:04:33","openedBy":"Mariana Onofre Castro","openedDate":"2025-08-25","closedDate":"2025-09-07","toDoAt":null,"inUatAt":"2025-08-27T15:05:17.813+0200","jiraKey":"WFN-460","year":"2025","requestedFor":"","openedAt":"2025-08-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-07T09:20:59.000Z"},"RITM2546222":{"state":"Closed Complete","shortDesc":"Home Banner Mobile | Vanish","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"24000","currencyCode":"MXN","ttfrMinutes":6286,"clientRespMinutes":9557,"firstReplyAt":"2025-08-29 19:00:16","firstAssignedDate":"2025-08-26 10:53:33","fulfillmentDate":"2025-08-25 10:14:41","openedBy":"Mariana Onofre Castro","openedDate":"2025-08-25","closedDate":"2025-10-14","toDoAt":"2025-08-27T11:16:51.560+0200","inUatAt":"2025-10-03T15:17:51.773+0200","jiraKey":"WFN-461","year":"2025","requestedFor":"","openedAt":"2025-08-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-14T17:20:52.000Z"},"RITM2546697":{"state":"Closed Cancelled","shortDesc":"Technical SEO Implementation - Durex.pt Critical Issues Resolution (Post-404 Fixes)","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1529,"clientRespMinutes":19652,"firstReplyAt":"2025-08-26 17:40:02","firstAssignedDate":"2025-08-26 09:53:26","fulfillmentDate":"2025-08-25 16:11:10","openedBy":"Jaime Sanchis","openedDate":"2025-08-25","closedDate":"2025-10-28","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-459","year":"2025","requestedFor":"Jaime Sanchis","openedAt":"2025-08-25 16:11:06","stateChangedAt":"2025-10-28 11:12:00","stateChangedBy":"System","lastActivityAt":"2025-10-28 11:11:29","lastActivityBy":"Alesya Prolagayeva","_updated":"2025-10-28T08:12:00.000Z"},"RITM2550369":{"state":"Closed Complete","shortDesc":"Calgon website modifications","assignedTo":"Alesya Prolagayeva","brand":"Calgon","market":"France","businessUnit":"Essential Home","finalCost":"720","currencyCode":"EUR","ttfrMinutes":6890,"clientRespMinutes":8334,"firstReplyAt":"2025-09-02 10:16:25","firstAssignedDate":"2025-09-02 10:16:25","fulfillmentDate":"2025-08-28 15:26:35","openedBy":"Lucie Masse-Provin (Inactive)","openedDate":"2025-08-28","closedDate":"2026-03-28","toDoAt":"2025-09-05T12:58:52.877+0200","inUatAt":"2025-09-10T13:56:28.307+0200","jiraKey":"WFN-464","year":"2025","requestedFor":"","openedAt":"2025-08-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-28T15:20:53.999Z"},"RITM2550539":{"state":"Closed Complete","shortDesc":"Please upload coupon to a hidden page connected to https://www.vanish.de/coupons/.","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1014,"clientRespMinutes":2844,"firstReplyAt":"2025-08-29 10:11:12","firstAssignedDate":"2025-08-29 10:11:12","fulfillmentDate":"2025-08-28 17:17:18","openedBy":"Svenja Sirges","openedDate":"2025-08-28","closedDate":"2025-10-20","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-08-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-20T10:20:58.000Z"},"RITM2551347":{"state":"Closed Complete","shortDesc":"Update Podium Home | Finish","assignedTo":"Damian Casasnovas","brand":"Finish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"6000","currencyCode":"MXN","ttfrMinutes":571,"clientRespMinutes":2971,"firstReplyAt":"2025-08-29 18:48:07","firstAssignedDate":"2025-08-29 10:04:41","fulfillmentDate":"2025-08-29 09:17:11","openedBy":"Mariana Onofre Castro","openedDate":"2025-08-29","closedDate":"2025-10-01","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-463","year":"2025","requestedFor":"","openedAt":"2025-08-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-01T16:20:50.999Z"},"RITM2551466":{"state":"Closed Complete","shortDesc":"Updated Website ( Update PDP+ Remove pages+Change products) | Finish","assignedTo":"Jesica Greco","brand":"Finish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"36000","currencyCode":"MXN","ttfrMinutes":5375,"clientRespMinutes":5830,"firstReplyAt":"2025-09-02 04:13:17","firstAssignedDate":"2025-09-01 14:49:29","fulfillmentDate":"2025-08-29 10:38:30","openedBy":"Mariana Onofre Castro","openedDate":"2025-08-29","closedDate":"2025-11-01","toDoAt":"2025-09-30T14:31:35.720+0200","inUatAt":null,"jiraKey":"WFN-467","year":"2025","requestedFor":"","openedAt":"2025-08-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-01T11:20:55.000Z"},"RITM2552961":{"state":"Closed Complete","shortDesc":"I ask to delete this page please: https://www.durex.it/collections/promozione?srsltid=AfmBOopbrFQaERWcFd1wciaaelQGMG0Mfos3uWUGx2QZ8U1P4f8J0hGq","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2845,"clientRespMinutes":1546,"firstReplyAt":"2025-09-03 11:12:13","firstAssignedDate":"2025-09-02 10:02:45","fulfillmentDate":"2025-09-01 11:47:03","openedBy":"Franziska Boesebeck","openedDate":"2025-09-01","closedDate":"2025-11-09","toDoAt":"2025-10-28T16:21:57.257+0100","inUatAt":"2025-10-29T12:42:20.723+0100","jiraKey":"WFN-471","year":"2025","requestedFor":"","openedAt":"2025-09-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-09T15:21:07.000Z"},"RITM2553147":{"state":"Closed Complete","shortDesc":"Fixing a bug/miss-tagging instance on nurofen.ro","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Nurofen","market":"Romania","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":2754,"clientRespMinutes":12664,"firstReplyAt":"2025-09-03 11:11:29","firstAssignedDate":"2025-09-02 09:57:00","fulfillmentDate":"2025-09-01 13:17:12","openedBy":"Daria Brinaru","openedDate":"2025-09-01","closedDate":"2025-11-08","toDoAt":"2025-09-03T15:58:13.747+0200","inUatAt":"2025-09-10T17:14:34.337+0200","jiraKey":"WFN-472","year":"2025","requestedFor":"","openedAt":"2025-09-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-08T17:20:52.999Z"},"RITM2553250":{"state":"Closed Complete","shortDesc":"adding a new product page to the Hungarian Strepsils website for the new product (Stark)","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Hungary","businessUnit":"Core Reckitt","finalCost":"420","currencyCode":"GBP","ttfrMinutes":1255,"clientRespMinutes":1795,"firstReplyAt":"2025-09-02 11:26:15","firstAssignedDate":"2025-09-02 10:20:13","fulfillmentDate":"2025-09-01 14:30:56","openedBy":"Eszter Balogh","openedDate":"2025-09-01","closedDate":"2025-09-21","toDoAt":"2025-09-03T09:58:23.747+0200","inUatAt":"2025-09-05T13:01:37.960+0200","jiraKey":"WFN-469","year":"2025","requestedFor":"","openedAt":"2025-09-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-21T15:20:52.000Z"},"RITM2553355":{"state":"Closed Complete","shortDesc":"Create a product page on the CRO Strepsils website for the Stark NPD","assignedTo":"Alesya Prolagayeva","brand":"Strepfen","market":"Croatia","businessUnit":"Core Reckitt","finalCost":"420","currencyCode":"GBP","ttfrMinutes":1199,"clientRespMinutes":2334,"firstReplyAt":"2025-09-02 11:26:22","firstAssignedDate":"2025-09-02 10:18:34","fulfillmentDate":"2025-09-01 15:27:52","openedBy":"Eszter Balogh","openedDate":"2025-09-01","closedDate":"2025-09-21","toDoAt":"2025-09-03T09:58:02.493+0200","inUatAt":"2025-09-05T13:01:41.793+0200","jiraKey":"WFN-468","year":"2025","requestedFor":"","openedAt":"2025-09-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-21T15:20:56.000Z"},"RITM2554187":{"state":"Closed Complete","shortDesc":"Gaviscon RO Website Disclaimer Update","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Romania","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":2887,"clientRespMinutes":8512,"firstReplyAt":"2025-09-04 10:14:53","firstAssignedDate":"2025-09-02 11:28:48","fulfillmentDate":"2025-09-02 10:07:37","openedBy":"Ana-Maria Mocanu (Inactive)","openedDate":"2025-09-02","closedDate":"2025-12-01","toDoAt":"2025-09-02T11:32:35.017+0200","inUatAt":"2025-09-03T13:01:00.653+0200","jiraKey":"WFN-470","year":"2025","requestedFor":"","openedAt":"2025-09-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-01T14:20:52.999Z"},"RITM2554630":{"state":"Closed Complete","shortDesc":"Ingredients Bruts St Marc Website","assignedTo":"Alesya Prolagayeva","brand":"StMarcs","market":"France","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":436,"clientRespMinutes":1993,"firstReplyAt":"2025-09-02 21:41:35","firstAssignedDate":"2025-09-02 21:41:35","fulfillmentDate":"2025-09-02 14:25:57","openedBy":"Sarah Sovet","openedDate":"2025-09-02","closedDate":"2025-09-22","toDoAt":"2025-09-10T14:59:14.230+0200","inUatAt":"2025-09-11T18:31:26.653+0200","jiraKey":"WFN-434","year":"2025","requestedFor":"","openedAt":"2025-09-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-22T17:20:52.000Z"},"RITM2554783":{"state":"Closed Complete","shortDesc":"Website update Nurofen Hungary","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Hungary","businessUnit":"Core Reckitt","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":8319,"clientRespMinutes":7283,"firstReplyAt":"2025-09-08 10:30:36","firstAssignedDate":"2025-09-03 09:57:01","fulfillmentDate":"2025-09-02 15:51:30","openedBy":"Gina Boldizsar","openedDate":"2025-09-02","closedDate":"2025-10-27","toDoAt":"2025-09-10T15:10:25.817+0200","inUatAt":"2025-09-17T09:44:51.577+0200","jiraKey":"WFN-473","year":"2025","requestedFor":"","openedAt":"2025-09-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-27T09:20:52.999Z"},"RITM2556230":{"state":"Closed Complete","shortDesc":"Nurofen Croatia website update","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Croatia","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":6889,"clientRespMinutes":5361,"firstReplyAt":"2025-09-08 10:33:40","firstAssignedDate":"2025-09-04 10:07:43","fulfillmentDate":"2025-09-03 15:44:31","openedBy":"Gina Boldizsar","openedDate":"2025-09-03","closedDate":"2025-09-21","toDoAt":null,"inUatAt":"2025-09-04T11:10:56.413+0200","jiraKey":"WFN-475","year":"2025","requestedFor":"","openedAt":"2025-09-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-21T15:20:56.000Z"},"RITM2556611":{"state":"Closed Complete","shortDesc":"Update de \"Bula Ilustrada\" in Strepsils website","assignedTo":"Damian Casasnovas","brand":"Strepsils","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"6667","currencyCode":"MXN","ttfrMinutes":1169,"clientRespMinutes":3312,"firstReplyAt":"2025-09-04 17:15:23","firstAssignedDate":"2025-09-04 17:15:23","fulfillmentDate":"2025-09-03 21:45:57","openedBy":"Ana Clara De Albuquerque","openedDate":"2025-09-03","closedDate":"2025-09-24","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-09-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-24T15:20:59.999Z"},"RITM2556954":{"state":"Closed Complete","shortDesc":"Publication of 38 articles on 3 different websites","assignedTo":"Alesya Prolagayeva","brand":"reckitt.com","market":"Spain","businessUnit":"Core Reckitt","finalCost":"2880","currencyCode":"EUR","ttfrMinutes":103,"clientRespMinutes":4016,"firstReplyAt":"2025-09-04 10:12:20","firstAssignedDate":"2025-09-04 10:12:20","fulfillmentDate":"2025-09-04 08:29:08","openedBy":"Amós García","openedDate":"2025-09-04","closedDate":"2025-10-27","toDoAt":"2025-09-22T10:12:21.397+0200","inUatAt":"2025-10-06T10:55:51.303+0200","jiraKey":"WFN-476","year":"2025","requestedFor":"","openedAt":"2025-09-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-27T09:21:00.000Z"},"RITM2559996":{"state":"Closed Cancelled","shortDesc":"Fix missing YouTube link on TransAct website.","assignedTo":"Bongani Ntshangisa","brand":"Nurofen","market":"South Africa","businessUnit":"Corporate","finalCost":"","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":"","firstAssignedDate":"2025-09-08 11:05:23","fulfillmentDate":"2025-09-08 09:15:09","openedBy":null,"openedDate":null,"closedDate":null,"toDoAt":null,"inUatAt":null,"jiraKey":null,"year":null,"requestedFor":"Chandini Padayachee","openedAt":"2025-09-08 09:15:06","stateChangedAt":"2025-09-08 11:09:43","stateChangedBy":"Bongani Ntshangisa","lastActivityAt":"","lastActivityBy":"","_updated":"2025-09-08T06:09:43.000Z"},"RITM2563776":{"state":"Closed Complete","shortDesc":"Cillit bang FR website update","assignedTo":"Alesya Prolagayeva","brand":"Cillit","market":"France","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1541,"clientRespMinutes":6237,"firstReplyAt":"2025-09-11 18:15:33","firstAssignedDate":"2025-09-10 17:47:08","fulfillmentDate":"2025-09-10 16:34:18","openedBy":"Julie Duquennoy","openedDate":"2025-09-10","closedDate":"2025-09-22","toDoAt":"2025-09-11T18:11:49.053+0200","inUatAt":"2025-09-11T18:26:38.580+0200","jiraKey":"WFN-481","year":"2025","requestedFor":"","openedAt":"2025-09-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-22T15:20:51.000Z"},"RITM2563853":{"state":"Closed Complete","shortDesc":"BANNER PUBLISHING ON WEBSITE","assignedTo":"Alesya Prolagayeva","brand":"Multibrand","market":"Italy","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":10,"clientRespMinutes":2878,"firstReplyAt":"2025-09-10 17:40:17","firstAssignedDate":"2025-09-10 17:40:17","fulfillmentDate":"2025-09-10 17:30:14","openedBy":"Alessandra Bosso","openedDate":"2025-09-10","closedDate":"2025-09-23","toDoAt":"2025-09-15T09:58:56.457+0200","inUatAt":"2025-09-16T13:03:10.973+0200","jiraKey":"WFN-480","year":"2025","requestedFor":"","openedAt":"2025-09-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-09-23T11:20:56.000Z"},"RITM2564613":{"state":"Closed Complete","shortDesc":"Strepsils.cz websits - change of packshots","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Czech Republic","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":5830,"clientRespMinutes":7073,"firstReplyAt":"2025-09-15 09:57:54","firstAssignedDate":"2025-09-15 09:57:54","fulfillmentDate":"2025-09-11 08:48:21","openedBy":"Helena Hartmannova (Inactive)","openedDate":"2025-09-11","closedDate":"2026-03-11","toDoAt":"2025-09-24T12:55:19.597+0200","inUatAt":"2025-10-17T18:33:38.117+0200","jiraKey":"WFN-482","year":"2025","requestedFor":"","openedAt":"2025-09-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-11T10:20:57.999Z"},"RITM2565350":{"state":"Closed Complete","shortDesc":"New articles to be published on Strepsils website www.benagol.it","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":5296,"clientRespMinutes":7044,"firstReplyAt":"2025-09-15 09:55:59","firstAssignedDate":"2025-09-12 10:02:50","fulfillmentDate":"2025-09-11 17:40:05","openedBy":"Martina Ridolfo","openedDate":"2025-09-11","closedDate":"2025-11-09","toDoAt":"2025-09-24T13:01:24.110+0200","inUatAt":null,"jiraKey":"WFN-484","year":"2025","requestedFor":"","openedAt":"2025-09-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-09T12:21:03.000Z"},"RITM2567559":{"state":"Closed Complete","shortDesc":"Adding Durex Perfect Feel product section","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Poland","businessUnit":"Core Reckitt","finalCost":"420","currencyCode":"GBP","ttfrMinutes":3284,"clientRespMinutes":10122,"firstReplyAt":"2025-09-17 17:28:47","firstAssignedDate":"2025-09-17 17:28:47","fulfillmentDate":"2025-09-15 10:44:53","openedBy":"Anna Pieczkowska","openedDate":"2025-09-15","closedDate":"2025-11-15","toDoAt":"2025-10-02T18:17:33.810+0200","inUatAt":"2025-10-08T11:46:20.303+0200","jiraKey":"WFN-488","year":"2025","requestedFor":"","openedAt":"2025-09-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-15T12:20:52.000Z"},"RITM2572558":{"state":"Closed Complete","shortDesc":"FINISH | Holidays Articles","assignedTo":"Damian Casasnovas","brand":"Finish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"18000","currencyCode":"MXN","ttfrMinutes":10001,"clientRespMinutes":null,"firstReplyAt":"2025-09-25 16:07:48","firstAssignedDate":"2025-10-06 20:16:36","fulfillmentDate":"2025-09-18 17:27:02","openedBy":"Andrea Carias (Inactive)","openedDate":"2025-09-18","closedDate":"2025-10-25","toDoAt":"2025-09-30T17:08:16.650+0200","inUatAt":null,"jiraKey":"WFN-491","year":"2025","requestedFor":"","openedAt":"2025-09-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-25T15:20:51.000Z"},"RITM2574018":{"state":"Closed Complete","shortDesc":"Remove promo section | Vanish Mx","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"2400","currencyCode":"MXN","ttfrMinutes":5368,"clientRespMinutes":8335,"firstReplyAt":"2025-09-23 15:20:30","firstAssignedDate":"2025-09-23 15:20:30","fulfillmentDate":"2025-09-19 21:52:56","openedBy":"Mariana Onofre Castro","openedDate":"2025-09-19","closedDate":"2025-10-14","toDoAt":"2025-09-29T14:21:47.897+0200","inUatAt":"2025-09-29T16:51:55.467+0200","jiraKey":"WFN-486","year":"2025","requestedFor":"","openedAt":"2025-09-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-14T19:20:52.000Z"},"RITM2576343":{"state":"Closed Complete","shortDesc":"Website Update Card Tigotà Contest – Replace July Contest with November Edition.","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"288","currencyCode":"EUR","ttfrMinutes":1392,"clientRespMinutes":6492,"firstReplyAt":"2025-09-24 10:30:17","firstAssignedDate":"2025-09-24 10:30:17","fulfillmentDate":"2025-09-23 11:18:31","openedBy":"Lorenzo Martelli","openedDate":"2025-09-23","closedDate":"2025-11-17","toDoAt":"2025-09-25T09:59:08.153+0200","inUatAt":"2025-10-15T16:30:18.530+0200","jiraKey":"WFN-487","year":"2025","requestedFor":"","openedAt":"2025-09-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-17T14:20:59.000Z"},"RITM2576891":{"state":"Closed Complete","shortDesc":"New Coupons on Website","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":2511,"clientRespMinutes":6563,"firstReplyAt":"2025-09-25 10:26:57","firstAssignedDate":"2025-09-24 13:36:01","fulfillmentDate":"2025-09-23 16:35:55","openedBy":"Annika Brickwedde","openedDate":"2025-09-23","closedDate":"2025-10-27","toDoAt":"2025-09-25T09:48:07.073+0200","inUatAt":"2025-09-25T12:16:38.913+0200","jiraKey":"WFN-489","year":"2025","requestedFor":"","openedAt":"2025-09-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-27T09:20:56.000Z"},"RITM2577794":{"state":"Closed Complete","shortDesc":"Update Website Finish due to change of LER- Mandatory date 1st October","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1360,"clientRespMinutes":7948,"firstReplyAt":"2025-09-25 10:21:16","firstAssignedDate":"2025-09-25 10:21:16","fulfillmentDate":"2025-09-24 11:41:41","openedBy":"Lorenzo Martelli","openedDate":"2025-09-24","closedDate":"2025-10-27","toDoAt":"2025-10-02T17:57:56.577+0200","inUatAt":null,"jiraKey":"WFN-492","year":"2025","requestedFor":"","openedAt":"2025-09-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-27T10:20:57.999Z"},"RITM2577997":{"state":"Closed Complete","shortDesc":"Change of packshots + publishing of novelty","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Slovakia","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":11507,"clientRespMinutes":8479,"firstReplyAt":"2025-10-02 13:40:40","firstAssignedDate":"2025-09-25 10:15:21","fulfillmentDate":"2025-09-24 13:53:45","openedBy":"Helena Hartmannova (Inactive)","openedDate":"2025-09-24","closedDate":"2026-03-11","toDoAt":"2025-10-02T17:17:43.513+0200","inUatAt":"2025-10-06T15:13:44.113+0200","jiraKey":"WFN-490","year":"2025","requestedFor":"","openedAt":"2025-09-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-11T10:20:59.999Z"},"RITM2578368":{"state":"Closed Complete","shortDesc":"Footer change Vanish.it website and document update following legal entity change","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":978,"clientRespMinutes":3605,"firstReplyAt":"2025-09-25 10:11:59","firstAssignedDate":"2025-09-25 10:11:59","fulfillmentDate":"2025-09-24 17:54:13","openedBy":"Alessandra Somaschini","openedDate":"2025-09-24","closedDate":"2025-10-13","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-09-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-13T18:20:52.000Z"},"RITM2578484":{"state":"Closed Complete","shortDesc":"Update OPTIN Marketing for Vanish and Finish","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"26667","currencyCode":"MXN","ttfrMinutes":30129,"clientRespMinutes":25751,"firstReplyAt":"2025-10-15 18:24:43","firstAssignedDate":"2025-10-15 14:05:21","fulfillmentDate":"2025-09-24 20:15:32","openedBy":"Vinicius Santos","openedDate":"2025-09-24","closedDate":"2025-12-14","toDoAt":"2025-10-29T20:31:12.717+0100","inUatAt":null,"jiraKey":"WFN-505","year":"2025","requestedFor":"","openedAt":"2025-09-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-14T16:20:56.000Z"},"RITM2578631":{"state":"Closed Complete","shortDesc":"PICOT | Website Migration Husky X","assignedTo":"Alesya Prolagayeva","brand":"Picot","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"189000","currencyCode":"MXN","ttfrMinutes":57441,"clientRespMinutes":null,"firstReplyAt":"2025-11-03 22:08:48","firstAssignedDate":"2025-09-25 10:03:20","fulfillmentDate":"2025-09-25 01:48:21","openedBy":"Andrea Carias (Inactive)","openedDate":"2025-09-25","closedDate":"2026-04-25","toDoAt":"2025-10-14T10:35:21.437+0200","inUatAt":"2025-12-05T09:35:21.737+0100","jiraKey":"WFN-513","year":"2025","requestedFor":"","openedAt":"2025-09-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-25T17:21:04.000Z"},"RITM2578633":{"state":"Closed Complete","shortDesc":"TEMPRA | Website Migrationn Husky X","assignedTo":"Damian Casasnovas","brand":"Tempra","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":70215,"clientRespMinutes":null,"firstReplyAt":"2025-11-12 19:06:28","firstAssignedDate":"2025-10-15 14:04:33","fulfillmentDate":"2025-09-25 01:51:51","openedBy":"Andrea Carias (Inactive)","openedDate":"2025-09-25","closedDate":"2026-06-09","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-09-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-09T01:20:56.999Z"},"RITM2579351":{"state":"Closed Complete","shortDesc":"Button updates for https://www.gaviscon.es/gavidigest/","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Spain","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":10274,"clientRespMinutes":5614,"firstReplyAt":"2025-10-02 17:16:59","firstAssignedDate":"2025-09-29 10:23:32","fulfillmentDate":"2025-09-25 14:03:09","openedBy":"Amós García","openedDate":"2025-09-25","closedDate":"2025-10-27","toDoAt":"2025-10-09T09:58:39.323+0200","inUatAt":null,"jiraKey":"WFN-497","year":"2025","requestedFor":"","openedAt":"2025-09-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-27T10:20:56.000Z"},"RITM2579520":{"state":"Closed Complete","shortDesc":"Creation of new Landing page","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Spain","businessUnit":"Core Reckitt","finalCost":"504","currencyCode":"EUR","ttfrMinutes":9858,"clientRespMinutes":6302,"firstReplyAt":"2025-10-02 12:11:40","firstAssignedDate":"2025-09-29 10:15:39","fulfillmentDate":"2025-09-25 15:53:21","openedBy":"Amós García","openedDate":"2025-09-25","closedDate":"2025-10-22","toDoAt":"2025-10-02T09:58:42.800+0200","inUatAt":"2025-10-06T10:59:49.753+0200","jiraKey":"WFN-496","year":"2025","requestedFor":"","openedAt":"2025-09-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-22T17:20:55.000Z"},"RITM2579529":{"state":"Closed Complete","shortDesc":"New legal info due to LER","assignedTo":"Alesya Prolagayeva","brand":"Napisan","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":6898,"clientRespMinutes":809,"firstReplyAt":"2025-09-30 11:00:16","firstAssignedDate":"2025-09-29 10:12:07","fulfillmentDate":"2025-09-25 16:02:46","openedBy":"Ludovica Tartaglia (Inactive)","openedDate":"2025-09-25","closedDate":"2025-10-07","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-506","year":"2025","requestedFor":"","openedAt":"2025-09-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-07T09:20:59.000Z"},"RITM2579632":{"state":"Closed Complete","shortDesc":"Deactive Sagrotan Floral Coast Raffle Landingpage","assignedTo":"Alesya Prolagayeva","brand":"Sagrotan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":6830,"clientRespMinutes":9055,"firstReplyAt":"2025-09-30 10:56:15","firstAssignedDate":"2025-09-29 10:09:43","fulfillmentDate":"2025-09-25 17:06:30","openedBy":"Lina Hardt","openedDate":"2025-09-25","closedDate":"2025-11-16","toDoAt":"2025-09-30T10:41:18.083+0200","inUatAt":"2025-10-09T09:38:40.113+0200","jiraKey":"WFN-495","year":"2025","requestedFor":"","openedAt":"2025-09-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-03T11:06:48.999Z"},"RITM2579667":{"state":"Closed Complete","shortDesc":"GRANEODIN | Landing + articles Winter Plan","assignedTo":"Damian Casasnovas","brand":"Strepsils","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"30000","currencyCode":"MXN","ttfrMinutes":29366,"clientRespMinutes":9091,"firstReplyAt":"2025-10-16 02:56:25","firstAssignedDate":"2025-10-15 14:04:27","fulfillmentDate":"2025-09-25 17:30:17","openedBy":"Andrea Carias (Inactive)","openedDate":"2025-09-25","closedDate":"2025-12-22","toDoAt":"2025-10-27T17:02:03.370+0100","inUatAt":null,"jiraKey":"WFN-500","year":"2025","requestedFor":"","openedAt":"2025-09-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-22T14:20:52.000Z"},"RITM2580745":{"state":"Closed Complete","shortDesc":"Website product picture replacement.","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":8549,"clientRespMinutes":8542,"firstReplyAt":"2025-10-02 11:08:17","firstAssignedDate":"2025-09-29 10:04:45","fulfillmentDate":"2025-09-26 12:39:23","openedBy":"Berk Namti (Inactive)","openedDate":"2025-09-26","closedDate":"2026-02-15","toDoAt":"2025-09-30T10:42:06.217+0200","inUatAt":"2025-09-30T10:40:26.960+0200","jiraKey":"WFN-494","year":"2025","requestedFor":"","openedAt":"2025-09-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-02-15T08:20:50.999Z"},"RITM2581041":{"state":"Closed Complete","shortDesc":"Update Website Promotions Finish due to change of LER- Mandatory date 1st October","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"504","currencyCode":"EUR","ttfrMinutes":8381,"clientRespMinutes":2687,"firstReplyAt":"2025-10-02 11:50:29","firstAssignedDate":"2025-09-29 09:57:30","fulfillmentDate":"2025-09-26 16:09:40","openedBy":"Lorenzo Martelli","openedDate":"2025-09-26","closedDate":"2025-10-27","toDoAt":null,"inUatAt":"2025-09-29T17:19:37.313+0200","jiraKey":"WFN-493","year":"2025","requestedFor":"","openedAt":"2025-09-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-10-27T10:20:54.000Z"},"RITM2586600":{"state":"Closed Complete","shortDesc":"Tech & Internal Linking Audit & Recommendations - Sept '25 | Nurofen Website","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Greece","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":10547,"clientRespMinutes":6613,"firstReplyAt":"2025-10-09 17:45:19","firstAssignedDate":"2025-10-02 10:23:23","fulfillmentDate":"2025-10-02 09:57:56","openedBy":"Foteini Sfikti (Inactive)","openedDate":"2025-10-02","closedDate":"2025-11-22","toDoAt":"2025-10-14T10:11:17.020+0200","inUatAt":null,"jiraKey":"WFN-507","year":"2025","requestedFor":"","openedAt":"2025-10-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-22T11:20:54.000Z"},"RITM2588303":{"state":"Closed Complete","shortDesc":"Dettol UK - Laundry Sanitiser","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"1800","currencyCode":"GBP","ttfrMinutes":7326,"clientRespMinutes":6084,"firstReplyAt":"2025-10-08 18:06:56","firstAssignedDate":"2025-10-08 18:06:56","fulfillmentDate":"2025-10-03 16:01:15","openedBy":"Rowena Hearn","openedDate":"2025-10-03","closedDate":"2026-01-31","toDoAt":"2025-10-21T09:28:15.923+0200","inUatAt":"2025-10-24T16:35:32.173+0200","jiraKey":"WFN-516","year":"2025","requestedFor":"","openedAt":"2025-10-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-31T11:20:54.000Z"},"RITM2590948":{"state":"Closed Cancelled","shortDesc":"Landing page improvement","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"France","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":4790,"clientRespMinutes":5858,"firstReplyAt":"2025-10-10 18:53:27","firstAssignedDate":"2025-10-08 18:04:50","fulfillmentDate":"2025-10-07 11:03:41","openedBy":"Chaima Baj (Inactive)","openedDate":"2025-10-07","closedDate":"2026-01-08","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-509","year":"2025","requestedFor":"Chaima Baj (Inactive)","openedAt":"2025-10-07 11:03:35","stateChangedAt":"2026-01-08 16:22:06","stateChangedBy":"System","lastActivityAt":"2025-12-24 10:05:50","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-01-08T13:22:36.000Z"},"RITM2595964":{"state":"Closed Complete","shortDesc":"LuftaGastro Website","assignedTo":"Damian Casasnovas","brand":"Gaviscon","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"18000","currencyCode":"MXN","ttfrMinutes":5971,"clientRespMinutes":14380,"firstReplyAt":"2025-10-14 21:44:12","firstAssignedDate":"2025-10-15 14:02:51","fulfillmentDate":"2025-10-10 18:13:32","openedBy":"Bruna Sakamoto Ferreira (Inactive)","openedDate":"2025-10-10","closedDate":"2025-12-09","toDoAt":"2025-10-16T15:15:11.490+0200","inUatAt":null,"jiraKey":"WFN-510","year":"2025","requestedFor":"","openedAt":"2025-10-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-09T14:20:55.000Z"},"RITM2597195":{"state":"Closed Complete","shortDesc":"Vanish website updates","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Romania","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1741,"clientRespMinutes":7105,"firstReplyAt":"2025-10-14 17:06:26","firstAssignedDate":"2025-10-14 10:12:39","fulfillmentDate":"2025-10-13 12:05:19","openedBy":"Diana Petre (Inactive)","openedDate":"2025-10-13","closedDate":"2025-11-04","toDoAt":"2025-10-20T10:05:25.700+0200","inUatAt":null,"jiraKey":"WFN-512","year":"2025","requestedFor":"","openedAt":"2025-10-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-04T14:20:50.999Z"},"RITM2597767":{"state":"Closed Complete","shortDesc":"pictures replacement for some articles","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Belgium","businessUnit":"Core Reckitt","finalCost":"508","currencyCode":"EUR","ttfrMinutes":1392,"clientRespMinutes":962,"firstReplyAt":"2025-10-14 16:26:37","firstAssignedDate":"2025-10-14 16:26:37","fulfillmentDate":"2025-10-13 17:14:30","openedBy":"Greta Podini (Inactive)","openedDate":"2025-10-13","closedDate":"2025-11-04","toDoAt":"2025-10-14T09:47:31.720+0200","inUatAt":null,"jiraKey":"WFN-511","year":"2025","requestedFor":"","openedAt":"2025-10-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-04T13:20:56.999Z"},"RITM2600299":{"state":"Closed Complete","shortDesc":"greek microsite update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Greece","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":2900,"clientRespMinutes":3215,"firstReplyAt":"2025-10-17 12:03:50","firstAssignedDate":"2025-10-15 11:58:24","fulfillmentDate":"2025-10-15 11:44:05","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2025-10-15","closedDate":"2025-12-06","toDoAt":"2025-11-07T09:37:51.520+0100","inUatAt":"2025-10-23T13:58:16.643+0200","jiraKey":"WFN-514","year":"2025","requestedFor":"","openedAt":"2025-10-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-06T09:20:56.000Z"},"RITM2604895":{"state":"Closed Complete","shortDesc":"Remove Customer from Website","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Denmark","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":2930,"clientRespMinutes":1475,"firstReplyAt":"2025-10-22 11:39:25","firstAssignedDate":"2025-10-22 11:39:25","fulfillmentDate":"2025-10-20 10:49:48","openedBy":"Lucia de Villa Muntanola","openedDate":"2025-10-20","closedDate":"2025-11-04","toDoAt":null,"inUatAt":"2025-10-21T11:08:00.877+0200","jiraKey":"WFN-518","year":"2025","requestedFor":"","openedAt":"2025-10-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-04T13:20:52.000Z"},"RITM2604937":{"state":"Closed Complete","shortDesc":"Remove \"5€ Cashback\" from website","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":2895,"clientRespMinutes":8398,"firstReplyAt":"2025-10-22 11:37:37","firstAssignedDate":"2025-10-22 11:37:37","fulfillmentDate":"2025-10-20 11:22:37","openedBy":"Mia Leimkuhler","openedDate":"2025-10-20","closedDate":"2025-11-04","toDoAt":null,"inUatAt":"2025-10-22T11:37:57.990+0200","jiraKey":"WFN-517","year":"2025","requestedFor":"","openedAt":"2025-10-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-04T13:20:55.000Z"},"RITM2605003":{"state":"Closed Complete","shortDesc":"Error Product Page view Amazon Tabs Ultimate plus Fresh","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"EUR","ttfrMinutes":2842,"clientRespMinutes":4742,"firstReplyAt":"2025-10-22 11:35:40","firstAssignedDate":"2025-10-22 11:35:40","fulfillmentDate":"2025-10-20 12:13:18","openedBy":"Lorenzo Martelli","openedDate":"2025-10-20","closedDate":"2025-11-24","toDoAt":"2025-10-27T12:58:12.853+0100","inUatAt":"2025-10-22T11:13:31.020+0200","jiraKey":"WFN-520","year":"2025","requestedFor":"","openedAt":"2025-10-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-24T17:20:52.000Z"},"RITM2606213":{"state":"Closed Complete","shortDesc":"continuation of RITM2214929 and RITM2222344 Vanish MX: Content creation for 10+10 new pages","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Mexico","businessUnit":"Essential Home","finalCost":"48000","currencyCode":"MXN","ttfrMinutes":214665,"clientRespMinutes":null,"firstReplyAt":"2026-03-19 13:36:23","firstAssignedDate":"2025-10-21 12:52:13","fulfillmentDate":"2025-10-21 12:51:18","openedBy":"Alesya Prolagayeva","openedDate":"2025-10-21","closedDate":"2026-03-24","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-10-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-24T12:20:56.999Z"},"RITM2606219":{"state":"Closed Complete","shortDesc":"Continuation of RITM2275328 Harpic MX \"backend issue\"","assignedTo":"Damian Casasnovas","brand":"Harpic","market":"Mexico","businessUnit":"Essential Home","finalCost":"60000","currencyCode":"MXN","ttfrMinutes":214644,"clientRespMinutes":null,"firstReplyAt":"2026-03-19 13:23:49","firstAssignedDate":"2025-10-21 13:01:43","fulfillmentDate":"2025-10-21 12:59:24","openedBy":"Alesya Prolagayeva","openedDate":"2025-10-21","closedDate":"2026-03-24","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-10-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-24T12:20:56.000Z"},"RITM2606528":{"state":"Closed Complete","shortDesc":"Uploading of 12 articles for Strepsils and Gaviscon","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Spain","businessUnit":"Core Reckitt","finalCost":"1080","currencyCode":"EUR","ttfrMinutes":1059,"clientRespMinutes":4138,"firstReplyAt":"2025-10-22 10:31:17","firstAssignedDate":"2025-10-22 10:31:17","fulfillmentDate":"2025-10-21 16:52:17","openedBy":"Amós García","openedDate":"2025-10-21","closedDate":"2025-11-04","toDoAt":"2025-10-22T10:50:42.293+0200","inUatAt":null,"jiraKey":"WFN-519","year":"2025","requestedFor":"","openedAt":"2025-10-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-04T13:20:52.000Z"},"RITM2608006":{"state":"Closed Complete","shortDesc":"gaviscon.ch - critical claims","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Switzerland","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1051,"clientRespMinutes":18,"firstReplyAt":"2025-10-23 12:59:36","firstAssignedDate":"2025-10-23 10:02:52","fulfillmentDate":"2025-10-22 19:28:55","openedBy":"Julia Kuzovkova","openedDate":"2025-10-22","closedDate":"2025-11-22","toDoAt":"2025-10-23T15:59:30.020+0200","inUatAt":"2025-10-27T12:42:02.033+0100","jiraKey":"WFN-521","year":"2025","requestedFor":"","openedAt":"2025-10-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-22T11:20:56.000Z"},"RITM2612052":{"state":"Closed Complete","shortDesc":"Change","assignedTo":"Alesya Prolagayeva","brand":"Napisan","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1095,"clientRespMinutes":3226,"firstReplyAt":"2025-10-28 10:08:30","firstAssignedDate":"2025-10-28 10:08:30","fulfillmentDate":"2025-10-27 15:53:48","openedBy":"Alessia Possamai","openedDate":"2025-10-27","closedDate":"2025-11-17","toDoAt":"2025-10-30T10:26:00.447+0100","inUatAt":"2025-10-30T17:56:48.813+0100","jiraKey":"WFN-526","year":"2025","requestedFor":"","openedAt":"2025-10-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-17T14:20:58.000Z"},"RITM2613070":{"state":"Closed Complete","shortDesc":"[HARPIC] Website content to delete","assignedTo":"Alesya Prolagayeva","brand":"Harpic","market":"France","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1484,"clientRespMinutes":1507,"firstReplyAt":"2025-10-29 11:46:44","firstAssignedDate":"2025-10-29 10:27:46","fulfillmentDate":"2025-10-28 11:02:54","openedBy":"Jules Zamparutti (Inactive)","openedDate":"2025-10-28","closedDate":"2025-11-12","toDoAt":"2025-10-29T10:23:39.247+0100","inUatAt":"2025-10-29T13:07:44.777+0100","jiraKey":"WFN-524","year":"2025","requestedFor":"","openedAt":"2025-10-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-11-12T13:20:52.999Z"},"RITM2614656":{"state":"Closed Complete","shortDesc":"FINISH Website FR- changes","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"France","businessUnit":"Core Reckitt","finalCost":"2520","currencyCode":"EUR","ttfrMinutes":187,"clientRespMinutes":7772,"firstReplyAt":"2025-10-29 15:22:44","firstAssignedDate":"2025-10-29 15:22:44","fulfillmentDate":"2025-10-29 12:16:16","openedBy":"Servane Bedel (Inactive)","openedDate":"2025-10-29","closedDate":"2026-03-24","toDoAt":"2025-12-05T12:05:09.413+0100","inUatAt":"2026-02-18T17:16:56.563+0100","jiraKey":"WFN-531","year":"2025","requestedFor":"","openedAt":"2025-10-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-24T12:20:53.999Z"},"RITM2616204":{"state":"Closed Complete","shortDesc":"apostolikathariotita.gr update with changes","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":5915,"clientRespMinutes":4953,"firstReplyAt":"2025-11-03 16:39:33","firstAssignedDate":"2025-11-03 09:50:18","fulfillmentDate":"2025-10-30 14:04:58","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2025-10-30","closedDate":"2025-12-03","toDoAt":"2025-11-07T09:37:45.943+0100","inUatAt":"2025-11-10T17:03:11.857+0100","jiraKey":"WFN-527","year":"2025","requestedFor":"","openedAt":"2025-10-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-03T16:20:52.999Z"},"RITM2617430":{"state":"Closed Complete","shortDesc":"Updating current Raffle Subpage with new elements","assignedTo":"Alesya Prolagayeva","brand":"Sagrotan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"2700","currencyCode":"GBP","ttfrMinutes":4259,"clientRespMinutes":2703,"firstReplyAt":"2025-11-03 10:16:26","firstAssignedDate":"2025-11-03 10:16:26","fulfillmentDate":"2025-10-31 11:17:03","openedBy":"Rouven Lutz","openedDate":"2025-10-31","closedDate":"2026-04-14","toDoAt":"2026-02-16T13:58:44.447+0100","inUatAt":"2026-04-02T13:08:31.917+0200","jiraKey":"WFN-561","year":"2025","requestedFor":"","openedAt":"2025-10-31","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-14T11:21:12.000Z"},"RITM2620267":{"state":"Closed Complete","shortDesc":"HARPIC | Notes inodoro","assignedTo":"Damian Casasnovas","brand":"Harpic","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":9989,"clientRespMinutes":null,"firstReplyAt":"2025-11-10 20:40:08","firstAssignedDate":"2025-11-04 20:13:56","fulfillmentDate":"2025-11-03 22:11:27","openedBy":"Andrea Carias (Inactive)","openedDate":"2025-11-03","closedDate":"2026-02-02","toDoAt":"2025-11-10T20:56:29.100+0100","inUatAt":"2025-11-27T20:37:31.913+0100","jiraKey":"WFN-534","year":"2025","requestedFor":"","openedAt":"2025-11-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-02-02T17:20:52.999Z"},"RITM2620355":{"state":"Closed Complete","shortDesc":"TEMPRA | Ajustes landing + articulo","assignedTo":"Damian Casasnovas","brand":"Tempra","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"14400","currencyCode":"MXN","ttfrMinutes":11112,"clientRespMinutes":826,"firstReplyAt":"2025-11-11 19:05:52","firstAssignedDate":"2025-11-04 20:13:34","fulfillmentDate":"2025-11-04 01:53:31","openedBy":"Andrea Carias (Inactive)","openedDate":"2025-11-04","closedDate":"2026-02-02","toDoAt":"2025-11-20T13:04:25.317+0100","inUatAt":"2025-12-12T14:56:42.563+0100","jiraKey":"WFN-535","year":"2025","requestedFor":"","openedAt":"2025-11-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-02-02T14:20:54.000Z"},"RITM2620358":{"state":"Closed Complete","shortDesc":"VANISH | Notas","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"12000","currencyCode":"MXN","ttfrMinutes":1012,"clientRespMinutes":null,"firstReplyAt":"2025-11-04 18:53:39","firstAssignedDate":"2025-11-04 15:14:20","fulfillmentDate":"2025-11-04 02:01:19","openedBy":"Andrea Carias (Inactive)","openedDate":"2025-11-04","closedDate":"2025-12-22","toDoAt":"2025-11-04T19:35:52.423+0100","inUatAt":null,"jiraKey":"WFN-532","year":"2025","requestedFor":"","openedAt":"2025-11-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-22T18:20:50.999Z"},"RITM2630608":{"state":"Closed Complete","shortDesc":"Website update Card Tigotà Contest - Replace November contest with the December Edition","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":2597,"clientRespMinutes":1422,"firstReplyAt":"2025-11-14 11:58:40","firstAssignedDate":"2025-11-14 11:58:40","fulfillmentDate":"2025-11-12 16:41:32","openedBy":"Lorenzo Martelli","openedDate":"2025-11-12","closedDate":"2025-12-07","toDoAt":null,"inUatAt":"2025-11-19T14:01:55.273+0100","jiraKey":"WFN-547","year":"2025","requestedFor":"","openedAt":"2025-11-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-07T09:20:55.000Z"},"RITM2632314":{"state":"Closed Complete","shortDesc":"Website Luftal","assignedTo":"Damian Casasnovas","brand":"Luftal","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"9334","currencyCode":"MXN","ttfrMinutes":5606,"clientRespMinutes":4432,"firstReplyAt":"2025-11-17 18:26:28","firstAssignedDate":"2025-11-17 18:03:50","fulfillmentDate":"2025-11-13 21:00:28","openedBy":"Maria Nunes","openedDate":"2025-11-13","closedDate":"2025-12-22","toDoAt":null,"inUatAt":"2025-12-03T12:05:54.063+0100","jiraKey":"WFN-548","year":"2025","requestedFor":"","openedAt":"2025-11-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-22T14:20:52.999Z"},"RITM2636812":{"state":"Closed Complete","shortDesc":"Biocide Disclaimer Integration on Sagrotan Website Product Pages","assignedTo":"Alesya Prolagayeva","brand":"Sagrotan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1383,"clientRespMinutes":7821,"firstReplyAt":"2025-11-19 19:00:14","firstAssignedDate":"2025-11-19 09:52:31","fulfillmentDate":"2025-11-18 19:57:28","openedBy":"Lina Hardt","openedDate":"2025-11-18","closedDate":"2025-12-06","toDoAt":null,"inUatAt":"2025-11-19T13:53:53.337+0100","jiraKey":"WFN-549","year":"2025","requestedFor":"","openedAt":"2025-11-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-06T09:20:58.000Z"},"RITM2638022":{"state":"Closed Complete","shortDesc":"New landing page for Cashback / Sweepstake on Air Wick - National promo mechanic","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":165,"clientRespMinutes":4650,"firstReplyAt":"2025-11-19 19:10:04","firstAssignedDate":"2025-11-19 19:10:04","fulfillmentDate":"2025-11-19 16:24:43","openedBy":"Mario Settembre","openedDate":"2025-11-19","closedDate":"2026-01-12","toDoAt":"2025-12-17T12:00:35.083+0100","inUatAt":"2025-12-17T14:19:08.193+0100","jiraKey":"WFN-579","year":"2025","requestedFor":"","openedAt":"2025-11-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-12T17:20:52.999Z"},"RITM2640311":{"state":"Closed Complete","shortDesc":"Sole website meta title and description correction","assignedTo":"Dmitry Koziyev (Inactive)","brand":"Sole","market":"Italy","businessUnit":"Essential Home","finalCost":"504","currencyCode":"EUR","ttfrMinutes":5931,"clientRespMinutes":5265,"firstReplyAt":"2025-11-25 13:10:42","firstAssignedDate":"2025-11-21 10:36:31","fulfillmentDate":"2025-11-21 10:19:47","openedBy":"Estelle Pivetta (Inactive)","openedDate":"2025-11-21","closedDate":"2025-12-23","toDoAt":"2025-11-25T16:43:36.777+0100","inUatAt":"2025-12-05T09:34:08.473+0100","jiraKey":"WFN-552","year":"2025","requestedFor":"","openedAt":"2025-11-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-23T18:20:53.999Z"},"RITM2640436":{"state":"Closed Complete","shortDesc":"FINISH WEBSITE PACKSHOTS & SIZEZ UPDATE","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Poland","businessUnit":"Core Reckitt","finalCost":"1800","currencyCode":"GBP","ttfrMinutes":4659,"clientRespMinutes":8400,"firstReplyAt":"2025-11-24 17:30:03","firstAssignedDate":"2025-11-24 17:30:03","fulfillmentDate":"2025-11-21 11:50:55","openedBy":"Paulina Szewczyk","openedDate":"2025-11-21","closedDate":"2026-03-07","toDoAt":"2025-11-26T15:55:01.857+0100","inUatAt":null,"jiraKey":"WFN-550","year":"2025","requestedFor":"","openedAt":"2025-11-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-07T14:20:52.999Z"},"RITM2640791":{"state":"Closed Complete","shortDesc":"Dettol Wipes","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"3000","currencyCode":"GBP","ttfrMinutes":5244,"clientRespMinutes":10540,"firstReplyAt":"2025-11-25 08:45:37","firstAssignedDate":"2025-11-25 08:35:40","fulfillmentDate":"2025-11-21 17:21:25","openedBy":"Rowena Hearn","openedDate":"2025-11-21","closedDate":"2026-03-28","toDoAt":"2025-12-05T12:11:22.943+0100","inUatAt":"2025-12-17T11:58:09.193+0100","jiraKey":"WFN-553","year":"2025","requestedFor":"","openedAt":"2025-11-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-28T15:20:52.999Z"},"RITM2640848":{"state":"Closed Complete","shortDesc":"Make visible and update the landing page www.airwick.it/concorsi/air-wick-vinci-card-tigota","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":5458,"clientRespMinutes":1659,"firstReplyAt":"2025-11-25 13:11:42","firstAssignedDate":"2025-11-24 17:45:28","fulfillmentDate":"2025-11-21 18:14:07","openedBy":"Alessandra Bosso","openedDate":"2025-11-21","closedDate":"2025-12-06","toDoAt":"2025-11-25T09:50:50.967+0100","inUatAt":null,"jiraKey":"WFN-551","year":"2025","requestedFor":"","openedAt":"2025-11-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-06T12:20:58.000Z"},"RITM2643346":{"state":"Closed Complete","shortDesc":"A new title needed in finish.com.tr footer to mention our new campaign's legal agreements","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1282,"clientRespMinutes":2104,"firstReplyAt":"2025-11-26 11:07:16","firstAssignedDate":"2025-11-26 11:07:17","fulfillmentDate":"2025-11-25 13:44:58","openedBy":"Ege Yarikkaya","openedDate":"2025-11-25","closedDate":"2025-12-06","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-11-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-06T09:20:56.999Z"},"RITM2643667":{"state":"Closed Complete","shortDesc":"Durex UK - Sex Positions article","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"3400","currencyCode":"GBP","ttfrMinutes":12845,"clientRespMinutes":4366,"firstReplyAt":"2025-12-04 15:36:49","firstAssignedDate":"2025-12-04 15:36:49","fulfillmentDate":"2025-11-25 17:32:11","openedBy":"Rowena Hearn","openedDate":"2025-11-25","closedDate":"2026-04-04","toDoAt":"2026-01-22T10:19:49.010+0100","inUatAt":"2026-03-19T15:07:39.160+0100","jiraKey":"WFN-555","year":"2025","requestedFor":"","openedAt":"2025-11-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-04T09:20:56.000Z"},"RITM2643677":{"state":"Closed Cancelled","shortDesc":"Durex UK - FAQs","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":14182,"clientRespMinutes":8168,"firstReplyAt":"2025-12-05 14:07:32","firstAssignedDate":"2025-11-27 10:13:51","fulfillmentDate":"2025-11-25 17:45:23","openedBy":"Rowena Hearn","openedDate":"2025-11-25","closedDate":"2026-04-10","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-554","year":"2025","requestedFor":"Rowena Hearn","openedAt":"2025-11-25 17:45:20","stateChangedAt":"2026-04-10 08:45:50","stateChangedBy":"System","lastActivityAt":"2026-04-09 14:28:35","lastActivityBy":"Rowena Hearn","_updated":"2026-04-10T03:45:50.000Z"},"RITM2644935":{"state":"Closed Complete","shortDesc":"Changes in LuftaGastro Website","assignedTo":"Damian Casasnovas","brand":"Gaviscon","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"21647","currencyCode":"MXN","ttfrMinutes":31533,"clientRespMinutes":16433,"firstReplyAt":"2025-12-18 14:30:57","firstAssignedDate":"2025-11-27 15:32:34","fulfillmentDate":"2025-11-26 16:58:29","openedBy":"Maria Nunes","openedDate":"2025-11-26","closedDate":"2026-02-14","toDoAt":"2026-01-27T15:20:36.700+0100","inUatAt":null,"jiraKey":"WFN-559","year":"2025","requestedFor":"","openedAt":"2025-11-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-02-14T13:20:55.000Z"},"RITM2645752":{"state":"Closed Complete","shortDesc":"Strepsils IE - Urgent change","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1245,"clientRespMinutes":995,"firstReplyAt":"2025-11-28 09:56:30","firstAssignedDate":"2025-11-28 09:56:30","fulfillmentDate":"2025-11-27 13:11:19","openedBy":"Rowena Hearn","openedDate":"2025-11-27","closedDate":"2025-12-10","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-11-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-10T11:20:52.999Z"},"RITM2648689":{"state":"Closed Complete","shortDesc":"Microsite new update","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":282,"clientRespMinutes":3175,"firstReplyAt":"2025-12-01 13:26:29","firstAssignedDate":"2025-12-01 13:26:29","fulfillmentDate":"2025-12-01 08:45:03","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2025-12-01","closedDate":"2025-12-29","toDoAt":"2025-12-05T12:31:23.253+0100","inUatAt":"2025-12-23T14:47:52.257+0100","jiraKey":"WFN-556","year":"2025","requestedFor":"","openedAt":"2025-12-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-29T09:21:23.000Z"},"RITM2649475":{"state":"Closed Complete","shortDesc":"Targeting error","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"2667","currencyCode":"MXN","ttfrMinutes":2849,"clientRespMinutes":null,"firstReplyAt":"2025-12-03 16:28:38","firstAssignedDate":"2026-01-09 09:51:50","fulfillmentDate":"2025-12-01 16:59:21","openedBy":"Vinicius Santos","openedDate":"2025-12-01","closedDate":"2026-03-31","toDoAt":"2025-12-09T14:45:14.907+0100","inUatAt":null,"jiraKey":"WFN-564","year":"2025","requestedFor":"","openedAt":"2025-12-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-31T18:20:52.000Z"},"RITM2650310":{"state":"Closed Complete","shortDesc":"Creation of new article on the Durex AT website","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Austria","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":3005,"clientRespMinutes":5487,"firstReplyAt":"2025-12-04 12:27:45","firstAssignedDate":"2025-12-02 16:43:22","fulfillmentDate":"2025-12-02 10:22:52","openedBy":"Lena Lechatellier (Inactive)","openedDate":"2025-12-02","closedDate":"2026-01-12","toDoAt":"2025-12-18T20:03:03.777+0100","inUatAt":"2025-12-04T13:38:16.830+0100","jiraKey":"WFN-557","year":"2025","requestedFor":"","openedAt":"2025-12-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-12T17:20:54.000Z"},"RITM2650845":{"state":"Closed Complete","shortDesc":"Pelease udate Vanish Coupon","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":111,"clientRespMinutes":10409,"firstReplyAt":"2025-12-02 17:00:57","firstAssignedDate":"2025-12-02 17:00:57","fulfillmentDate":"2025-12-02 15:10:29","openedBy":"Mia Leimkuhler","openedDate":"2025-12-02","closedDate":"2026-01-19","toDoAt":null,"inUatAt":"2025-12-12T09:46:17.600+0100","jiraKey":"WFN-562","year":"2025","requestedFor":"","openedAt":"2025-12-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-19T10:20:51.000Z"},"RITM2651963":{"state":"Closed Complete","shortDesc":"new variant addition to product page","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Sweden","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1315,"clientRespMinutes":1896,"firstReplyAt":"2025-12-04 09:50:05","firstAssignedDate":"2025-12-04 09:50:05","fulfillmentDate":"2025-12-03 11:54:52","openedBy":"Jacopo Sartor","openedDate":"2025-12-03","closedDate":"2026-01-20","toDoAt":"2025-12-16T15:28:29.577+0100","inUatAt":"2025-12-17T11:45:57.797+0100","jiraKey":"WFN-565","year":"2025","requestedFor":"","openedAt":"2025-12-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-20T13:20:56.999Z"},"RITM2652652":{"state":"Closed Complete","shortDesc":"Update Finish portolio","assignedTo":"Damian Casasnovas","brand":"Finish","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1381,"clientRespMinutes":3016,"firstReplyAt":"2025-12-04 18:29:45","firstAssignedDate":"2025-12-04 18:14:41","fulfillmentDate":"2025-12-03 19:28:28","openedBy":"Fernanda Yara","openedDate":"2025-12-03","closedDate":"2026-02-24","toDoAt":"2026-01-14T15:15:21.030+0100","inUatAt":"2026-01-27T15:17:20.497+0100","jiraKey":"WFN-558","year":"2025","requestedFor":"","openedAt":"2025-12-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-02-24T16:20:52.999Z"},"RITM2653436":{"state":"Awaiting User Info","shortDesc":"Finish - Brand World update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"10300","currencyCode":"GBP","ttfrMinutes":20209,"clientRespMinutes":4191,"firstReplyAt":"2025-12-18 13:06:35","firstAssignedDate":"2025-12-05 12:02:31","fulfillmentDate":"2025-12-04 12:17:15","openedBy":"Rowena Hearn","openedDate":"2025-12-04","closedDate":"","toDoAt":"2026-01-13T12:24:07.227+0100","inUatAt":"2026-02-04T16:08:30.510+0100","jiraKey":"WFN-605","year":"2025","requestedFor":"","openedAt":"2025-12-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T09:58:05.999Z"},"RITM2653860":{"state":"Awaiting User Info","shortDesc":"Finish Canopus EPD - Rinse Aid","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"5000","currencyCode":"GBP","ttfrMinutes":20086,"clientRespMinutes":5787,"firstReplyAt":"2025-12-18 16:19:00","firstAssignedDate":"2025-12-05 11:53:16","fulfillmentDate":"2025-12-04 17:32:35","openedBy":"Rowena Hearn","openedDate":"2025-12-04","closedDate":"","toDoAt":"2026-03-20T09:56:59.063+0100","inUatAt":"2026-07-13T10:58:53.810+0200","jiraKey":"WFN-582","year":"2025","requestedFor":"","openedAt":"2025-12-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T10:19:44.000Z"},"RITM2653874":{"state":"Awaiting User Info","shortDesc":"Finish Chimera EPD - Machine Cleaner","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"5000","currencyCode":"GBP","ttfrMinutes":102154,"clientRespMinutes":7938,"firstReplyAt":"2026-02-13 16:22:32","firstAssignedDate":"2025-12-05 11:53:52","fulfillmentDate":"2025-12-04 17:48:29","openedBy":"Rowena Hearn","openedDate":"2025-12-04","closedDate":"","toDoAt":"2026-03-23T12:31:23.053+0100","inUatAt":"2026-04-27T17:41:19.320+0200","jiraKey":"WFN-708","year":"2025","requestedFor":"","openedAt":"2025-12-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T12:50:21.000Z"},"RITM2653885":{"state":"Closed Cancelled","shortDesc":"GRIP website updates","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":56011,"clientRespMinutes":5684,"firstReplyAt":"2026-01-12 15:35:42","firstAssignedDate":"2026-01-12 10:31:35","fulfillmentDate":"2025-12-04 18:04:19","openedBy":"Andy Watson","openedDate":"2025-12-04","closedDate":"2026-01-20","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-621","year":"2025","requestedFor":"Andy Watson","openedAt":"2025-12-04 18:04:15","stateChangedAt":"2026-01-20 11:32:33","stateChangedBy":"System","lastActivityAt":"2026-01-20 11:32:09","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-01-20T08:32:33.000Z"},"RITM2657627":{"state":"Closed Complete","shortDesc":"FINISH website IT / Promo FINISH TI PREMIA","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1887,"clientRespMinutes":1190,"firstReplyAt":"2025-12-10 18:33:14","firstAssignedDate":"2025-12-10 14:37:53","fulfillmentDate":"2025-12-09 11:06:19","openedBy":"Loris Vignati","openedDate":"2025-12-09","closedDate":"2026-02-01","toDoAt":"2026-01-14T11:20:35.037+0100","inUatAt":null,"jiraKey":"WFN-566","year":"2025","requestedFor":"","openedAt":"2025-12-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-02-01T09:20:56.999Z"},"RITM2659186":{"state":"Closed Cancelled","shortDesc":"[MOCK RECALL] Information for patients upload on website","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Poland","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":"","firstAssignedDate":"2025-12-10 14:40:48","fulfillmentDate":"2025-12-10 12:43:35","openedBy":"Paulina Bartnik","openedDate":"2025-12-10","closedDate":"2025-12-10","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-567","year":"2025","requestedFor":"Paulina Bartnik","openedAt":"2025-12-10 12:43:30","stateChangedAt":"2025-12-10 18:23:55","stateChangedBy":"System","lastActivityAt":"","lastActivityBy":"","_updated":"2025-12-10T15:23:55.000Z"},"RITM2659263":{"state":"Closed Complete","shortDesc":"microsite contest update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Greece","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":1365,"clientRespMinutes":1514,"firstReplyAt":"2025-12-11 12:06:54","firstAssignedDate":"2025-12-10 18:25:16","fulfillmentDate":"2025-12-10 13:21:47","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2025-12-10","closedDate":"2026-01-31","toDoAt":"2026-01-06T09:42:51.957+0100","inUatAt":"2026-01-06T10:15:10.060+0100","jiraKey":"WFN-568","year":"2025","requestedFor":"","openedAt":"2025-12-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-31T11:20:52.000Z"},"RITM2660893":{"state":"Closed Complete","shortDesc":"Strefen - Strepsils UK","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"3940","currencyCode":"GBP","ttfrMinutes":7318,"clientRespMinutes":7247,"firstReplyAt":"2025-12-16 18:26:31","firstAssignedDate":"2025-12-12 10:15:28","fulfillmentDate":"2025-12-11 16:28:44","openedBy":"Rowena Hearn","openedDate":"2025-12-11","closedDate":"2026-08-14","toDoAt":"2026-07-20T19:56:45.163+0200","inUatAt":"2026-07-27T11:14:14.433+0200","jiraKey":"WFN-1337","year":"2025","requestedFor":"","openedAt":"2025-12-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-14T15:48:16.000Z"},"RITM2660971":{"state":"Closed Cancelled","shortDesc":"Dettol - FAQs","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":18337,"clientRespMinutes":null,"firstReplyAt":"2025-12-24 10:46:54","firstAssignedDate":"2025-12-12 10:15:19","fulfillmentDate":"2025-12-11 17:09:36","openedBy":"Rowena Hearn","openedDate":"2025-12-11","closedDate":"2026-06-12","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-570","year":"2025","requestedFor":"Rowena Hearn","openedAt":"2025-12-11 17:09:31","stateChangedAt":"2026-06-12 17:43:31","stateChangedBy":"System","lastActivityAt":"2026-06-12 12:08:46","lastActivityBy":"Rowena Hearn","_updated":"2026-06-12T12:43:31.000Z"},"RITM2664452":{"state":"Closed Complete","shortDesc":"Update on Durex PT Website","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"864","currencyCode":"EUR","ttfrMinutes":4272,"clientRespMinutes":2523,"firstReplyAt":"2025-12-16 16:35:28","firstAssignedDate":"2025-12-16 10:43:50","fulfillmentDate":"2025-12-13 17:23:10","openedBy":"Martim Martins (Inactive)","openedDate":"2025-12-13","closedDate":"2026-01-26","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2025","requestedFor":"","openedAt":"2025-12-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-26T09:20:59.000Z"},"RITM2665072":{"state":"Closed Complete","shortDesc":"Impressum Update","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Germany","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":36525,"clientRespMinutes":10794,"firstReplyAt":"2026-01-09 19:13:12","firstAssignedDate":"2026-01-09 19:13:12","fulfillmentDate":"2025-12-15 10:27:55","openedBy":"Daniela Paul","openedDate":"2025-12-15","closedDate":"2026-03-01","toDoAt":"2026-01-12T11:38:58.910+0100","inUatAt":null,"jiraKey":"WFN-622","year":"2025","requestedFor":"","openedAt":"2025-12-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-01T10:26:11.000Z"},"RITM2665823":{"state":"Closed Complete","shortDesc":"Change content of website","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"420","currencyCode":"GBP","ttfrMinutes":39857,"clientRespMinutes":551,"firstReplyAt":"2026-01-12 10:27:31","firstAssignedDate":"2026-01-12 10:27:31","fulfillmentDate":"2025-12-15 18:10:05","openedBy":"Claudia Lee","openedDate":"2025-12-15","closedDate":"2026-05-12","toDoAt":"2026-03-05T17:36:34.807+0100","inUatAt":"2026-03-06T09:34:49.970+0100","jiraKey":"WFN-682","year":"2025","requestedFor":"","openedAt":"2025-12-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-12T12:21:02.000Z"},"RITM2666783":{"state":"Closed Complete","shortDesc":"We need to add a retailer to the Durex NL website, specifically on the page dedicated to retailers.","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Netherlands","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":3103,"clientRespMinutes":1357,"firstReplyAt":"2025-12-18 15:36:57","firstAssignedDate":"2025-12-17 10:06:34","fulfillmentDate":"2025-12-16 11:53:38","openedBy":"Greta Podini (Inactive)","openedDate":"2025-12-16","closedDate":"2026-01-18","toDoAt":"2025-12-18T15:34:07.300+0100","inUatAt":null,"jiraKey":"WFN-581","year":"2025","requestedFor":"","openedAt":"2025-12-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-18T12:20:52.000Z"},"RITM2667872":{"state":"Closed Complete","shortDesc":"A New Landing Page Implementation for finish.com.tr","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"1800","currencyCode":"GBP","ttfrMinutes":1809,"clientRespMinutes":7099,"firstReplyAt":"2025-12-18 15:19:41","firstAssignedDate":"2025-12-17 10:04:43","fulfillmentDate":"2025-12-17 09:11:00","openedBy":"Ege Yarikkaya","openedDate":"2025-12-17","closedDate":"2025-12-29","toDoAt":"2025-12-22T09:42:30.147+0100","inUatAt":null,"jiraKey":"WFN-580","year":"2025","requestedFor":"","openedAt":"2025-12-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2025-12-29T09:20:58.000Z"},"RITM2672537":{"state":"Closed Cancelled","shortDesc":"removing some content nedeed on finish.com.tr","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":269,"clientRespMinutes":2942,"firstReplyAt":"2025-12-22 14:17:08","firstAssignedDate":"2025-12-22 14:17:08","fulfillmentDate":"2025-12-22 09:48:40","openedBy":"Ege Yarikkaya","openedDate":"2025-12-22","closedDate":"2026-02-10","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-600","year":"2025","requestedFor":"Ege Yarikkaya","openedAt":"2025-12-22 09:48:36","stateChangedAt":"2026-02-10 10:14:39","stateChangedBy":"System","lastActivityAt":"2026-02-10 10:14:18","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-02-10T07:14:39.000Z"},"RITM2681700":{"state":"Closed Complete","shortDesc":"Removal of promo pages from Air Wick website","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":3073,"clientRespMinutes":2438,"firstReplyAt":"2026-01-08 16:04:04","firstAssignedDate":"2026-01-07 18:22:23","fulfillmentDate":"2026-01-06 12:50:42","openedBy":"Mario Settembre","openedDate":"2026-01-06","closedDate":"2026-01-20","toDoAt":"2026-01-08T13:01:48.037+0100","inUatAt":"2026-01-09T10:12:29.077+0100","jiraKey":"WFN-616","year":"2026","requestedFor":"","openedAt":"2026-01-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-20T09:20:53.999Z"},"RITM2683499":{"state":"Closed Complete","shortDesc":"Dettol UK - Zofia","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"4000","currencyCode":"GBP","ttfrMinutes":63486,"clientRespMinutes":8607,"firstReplyAt":"2026-02-20 17:33:38","firstAssignedDate":"2026-01-07 18:36:07","fulfillmentDate":"2026-01-07 15:27:46","openedBy":"Rowena Hearn","openedDate":"2026-01-07","closedDate":"2026-08-07","toDoAt":"2026-02-23T19:57:28.163+0100","inUatAt":"2026-07-27T10:59:35.467+0200","jiraKey":"WFN-619","year":"2026","requestedFor":"","openedAt":"2026-01-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-07T16:01:14.999Z"},"RITM2683534":{"state":"Closed Complete","shortDesc":"Website Coupons Q1","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1466,"clientRespMinutes":5964,"firstReplyAt":"2026-01-08 16:05:21","firstAssignedDate":"2026-01-07 18:26:30","fulfillmentDate":"2026-01-07 15:39:54","openedBy":"Annika Brickwedde","openedDate":"2026-01-07","closedDate":"2026-01-19","toDoAt":null,"inUatAt":"2026-01-09T10:12:19.633+0100","jiraKey":"WFN-617","year":"2026","requestedFor":"","openedAt":"2026-01-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-19T10:20:52.999Z"},"RITM2683607":{"state":"Awaiting User Info","shortDesc":"Finish UK - Hubble","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"3000","currencyCode":"GBP","ttfrMinutes":107796,"clientRespMinutes":8409,"firstReplyAt":"2026-03-23 12:41:23","firstAssignedDate":"2026-01-07 18:33:59","fulfillmentDate":"2026-01-07 16:05:20","openedBy":"Rowena Hearn","openedDate":"2026-01-07","closedDate":"","toDoAt":"2026-03-23T12:35:29.193+0100","inUatAt":"2026-07-13T17:49:02.273+0200","jiraKey":"WFN-618","year":"2026","requestedFor":"","openedAt":"2026-01-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-29T13:44:46.000Z"},"RITM2684495":{"state":"Closed Complete","shortDesc":"One section of the Lovela website needs to be updated. It concerns the WOŚP tab. Could you please help and provide instructions on what exactly I need to do in order to update the content? https://www.lovela.pl/wosp/","assignedTo":"Alesya Prolagayeva","brand":"Lovela","market":"Poland","businessUnit":"Essential Home","finalCost":"600","currencyCode":"GBP","ttfrMinutes":342,"clientRespMinutes":1746,"firstReplyAt":"2026-01-08 16:01:19","firstAssignedDate":"2026-01-08 16:01:19","fulfillmentDate":"2026-01-08 10:19:07","openedBy":"Judyta Chrzuszcz","openedDate":"2026-01-08","closedDate":"2026-04-25","toDoAt":"2026-01-13T14:44:16.680+0100","inUatAt":"2026-03-26T17:05:24.200+0100","jiraKey":"WFN-623","year":"2026","requestedFor":"","openedAt":"2026-01-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-25T08:21:39.000Z"},"RITM2684682":{"state":"Closed Complete","shortDesc":"New landing page for Cashback on Air Wick - National promo mechanic","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1318,"clientRespMinutes":1301,"firstReplyAt":"2026-01-09 09:49:48","firstAssignedDate":"2026-01-08 15:33:49","fulfillmentDate":"2026-01-08 11:51:59","openedBy":"Mario Settembre","openedDate":"2026-01-08","closedDate":"2026-04-05","toDoAt":"2026-01-15T10:21:16.897+0100","inUatAt":"2026-01-16T16:31:15.787+0100","jiraKey":"WFN-620","year":"2026","requestedFor":"","openedAt":"2026-01-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-05T12:20:54.000Z"},"RITM2686514":{"state":"Closed Complete","shortDesc":"Urgent Request: Upload of Durex Q1 Contest Regulation to Promo Page","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":435,"clientRespMinutes":1364,"firstReplyAt":"2026-01-09 19:16:21","firstAssignedDate":"2026-01-09 19:16:21","fulfillmentDate":"2026-01-09 12:01:03","openedBy":"Rebecca Molle (Inactive)","openedDate":"2026-01-09","closedDate":"2026-01-20","toDoAt":"2026-01-14T12:19:10.417+0100","inUatAt":null,"jiraKey":"WFN-629","year":"2026","requestedFor":"","openedAt":"2026-01-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-20T14:20:56.999Z"},"RITM2686839":{"state":"Closed Cancelled","shortDesc":"Quotation for changing a banner on Veet.it","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Italy","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":263,"clientRespMinutes":2093,"firstReplyAt":"2026-01-09 19:24:17","firstAssignedDate":"2026-01-09 19:24:17","fulfillmentDate":"2026-01-09 15:01:15","openedBy":"Francesca Capodaglio","openedDate":"2026-01-09","closedDate":"2026-01-30","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-624","year":"2026","requestedFor":"Francesca Capodaglio","openedAt":"2026-01-09 15:01:11","stateChangedAt":"2026-01-30 10:23:41","stateChangedBy":"System","lastActivityAt":"2026-01-29 10:25:28","lastActivityBy":"Francesca Capodaglio","_updated":"2026-01-30T07:23:41.000Z"},"RITM2687085":{"state":"Closed Complete","shortDesc":"Cillti BAng page add and small revisions","assignedTo":"Alesya Prolagayeva","brand":"Cillit","market":"United Kingdom","businessUnit":"Essential Home","finalCost":"300","currencyCode":"GBP","ttfrMinutes":19774,"clientRespMinutes":7829,"firstReplyAt":"2026-01-23 10:51:48","firstAssignedDate":"2026-01-22 12:37:24","fulfillmentDate":"2026-01-09 17:17:56","openedBy":"Annie Sweet","openedDate":"2026-01-09","closedDate":"2026-04-26","toDoAt":"2026-01-30T10:22:41.920+0100","inUatAt":"2026-02-02T15:33:56.043+0100","jiraKey":"WFN-639","year":"2026","requestedFor":"","openedAt":"2026-01-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-26T15:20:55.000Z"},"RITM2688718":{"state":"Closed Complete","shortDesc":"GEL IMAGES PRODUCT PAGE","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"504","currencyCode":"EUR","ttfrMinutes":85,"clientRespMinutes":null,"firstReplyAt":"2026-01-12 13:14:11","firstAssignedDate":"2026-01-12 13:14:11","fulfillmentDate":"2026-01-12 11:49:34","openedBy":"Rebecca Molle (Inactive)","openedDate":"2026-01-12","closedDate":"2026-03-28","toDoAt":"2026-01-15T09:52:04.950+0100","inUatAt":null,"jiraKey":"WFN-628","year":"2026","requestedFor":"","openedAt":"2026-01-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-28T15:20:55.000Z"},"RITM2690554":{"state":"Closed Complete","shortDesc":"Upload new pdf","assignedTo":"Alesya Prolagayeva","brand":"Napisan","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":227,"clientRespMinutes":1237,"firstReplyAt":"2026-01-13 16:37:35","firstAssignedDate":"2026-01-13 16:37:35","fulfillmentDate":"2026-01-13 12:50:54","openedBy":"Alessia Possamai","openedDate":"2026-01-13","closedDate":"2026-01-20","toDoAt":"2026-01-14T10:03:12.893+0100","inUatAt":null,"jiraKey":"WFN-625","year":"2026","requestedFor":"","openedAt":"2026-01-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-01-20T08:20:56.000Z"},"RITM2690924":{"state":"Closed Complete","shortDesc":"HOME PAGE CONTENT UPDATE DURE.IT","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"1224","currencyCode":"EUR","ttfrMinutes":1098,"clientRespMinutes":6203,"firstReplyAt":"2026-01-14 10:07:30","firstAssignedDate":"2026-01-14 10:07:30","fulfillmentDate":"2026-01-13 15:49:58","openedBy":"Rebecca Molle (Inactive)","openedDate":"2026-01-13","closedDate":"2026-03-28","toDoAt":"2026-01-14T10:23:55.627+0100","inUatAt":null,"jiraKey":"WFN-626","year":"2026","requestedFor":"","openedAt":"2026-01-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-28T15:20:50.999Z"},"RITM2691816":{"state":"Closed Complete","shortDesc":"Calgon Impressum Update","assignedTo":"Alesya Prolagayeva","brand":"Calgon","market":"Germany","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":554,"clientRespMinutes":911,"firstReplyAt":"2026-01-14 18:13:44","firstAssignedDate":"2026-01-14 10:09:19","fulfillmentDate":"2026-01-14 09:00:15","openedBy":"Milena Desch","openedDate":"2026-01-14","closedDate":"2026-01-21","toDoAt":"2026-01-14T10:14:00.260+0100","inUatAt":null,"jiraKey":"WFN-627","year":"2026","requestedFor":"","openedAt":"2026-01-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-01T10:25:02.000Z"},"RITM2692105":{"state":"On hold","shortDesc":"Durex ES - Horizons/Lubes BDI","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Spain","businessUnit":"Core Reckitt","finalCost":"3000","currencyCode":"GBP","ttfrMinutes":555,"clientRespMinutes":9858,"firstReplyAt":"2026-01-14 20:49:16","firstAssignedDate":"2026-01-14 20:49:16","fulfillmentDate":"2026-01-14 11:34:45","openedBy":"Rowena Hearn","openedDate":"2026-01-14","closedDate":"","toDoAt":"2026-03-05T13:19:18.330+0100","inUatAt":"2026-03-19T08:16:36.420+0100","jiraKey":"WFN-632","year":"2026","requestedFor":"","openedAt":"2026-01-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T10:31:45.000Z"},"RITM2692391":{"state":"Closed Complete","shortDesc":"ADD REDCARE BUY BOTTOM (in addition to AMAZON)","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"504","currencyCode":"EUR","ttfrMinutes":229,"clientRespMinutes":11002,"firstReplyAt":"2026-01-14 18:40:22","firstAssignedDate":"2026-01-14 18:24:59","fulfillmentDate":"2026-01-14 14:51:38","openedBy":"Rebecca Molle (Inactive)","openedDate":"2026-01-14","closedDate":"2026-03-28","toDoAt":"2026-01-16T09:40:35.130+0100","inUatAt":null,"jiraKey":"WFN-630","year":"2026","requestedFor":"","openedAt":"2026-01-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-28T15:20:55.000Z"},"RITM2692448":{"state":"Closed Complete","shortDesc":"Durex UK - Pastel","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"3200","currencyCode":"GBP","ttfrMinutes":309,"clientRespMinutes":6464,"firstReplyAt":"2026-01-14 20:43:53","firstAssignedDate":"2026-01-14 20:36:00","fulfillmentDate":"2026-01-14 15:34:40","openedBy":"Rowena Hearn","openedDate":"2026-01-14","closedDate":"2026-08-21","toDoAt":"2026-02-06T10:27:23.357+0100","inUatAt":"2026-07-30T11:07:50.697+0200","jiraKey":"WFN-631","year":"2026","requestedFor":"","openedAt":"2026-01-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T09:43:08.000Z"},"RITM2695077":{"state":"Closed Complete","shortDesc":"New variant addition to product page","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Denmark","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":4576,"clientRespMinutes":10456,"firstReplyAt":"2026-01-19 15:45:51","firstAssignedDate":"2026-01-16 18:26:46","fulfillmentDate":"2026-01-16 11:30:12","openedBy":"Imaan Riaz (Inactive)","openedDate":"2026-01-16","closedDate":"2026-03-01","toDoAt":"2026-01-19T17:52:54.747+0100","inUatAt":null,"jiraKey":"WFN-635","year":"2026","requestedFor":"","openedAt":"2026-01-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-01T17:20:55.000Z"},"RITM2695244":{"state":"Closed Complete","shortDesc":"High Priority - Kraven - Vanish UK","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"3000","currencyCode":"GBP","ttfrMinutes":4626,"clientRespMinutes":3540,"firstReplyAt":"2026-01-19 18:23:50","firstAssignedDate":"2026-01-16 18:26:05","fulfillmentDate":"2026-01-16 13:17:40","openedBy":"Rowena Hearn","openedDate":"2026-01-16","closedDate":"2026-04-28","toDoAt":"2026-01-20T09:36:42.807+0100","inUatAt":"2026-02-18T14:18:14.973+0100","jiraKey":"WFN-634","year":"2026","requestedFor":"","openedAt":"2026-01-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-28T19:21:01.000Z"},"RITM2695574":{"state":"Closed Complete","shortDesc":"K-Y website amends required","assignedTo":"Alesya Prolagayeva","brand":"K-Y","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":4210,"clientRespMinutes":3419,"firstReplyAt":"2026-01-19 15:15:51","firstAssignedDate":"2026-01-16 18:20:18","fulfillmentDate":"2026-01-16 17:05:46","openedBy":"Areeba Imtiaz","openedDate":"2026-01-16","closedDate":"2026-03-10","toDoAt":"2026-01-22T09:36:27.720+0100","inUatAt":null,"jiraKey":"WFN-633","year":"2026","requestedFor":"","openedAt":"2026-01-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-10T13:20:59.000Z"},"RITM2695637":{"state":"Closed Complete","shortDesc":"Update of 2 banners | Graneodín","assignedTo":"Damian Casasnovas","brand":"Strepsils","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"2400","currencyCode":"MXN","ttfrMinutes":8444,"clientRespMinutes":null,"firstReplyAt":"2026-01-22 14:44:06","firstAssignedDate":"2026-01-19 19:08:41","fulfillmentDate":"2026-01-16 17:59:40","openedBy":"Monica Cano (Inactive)","openedDate":"2026-01-16","closedDate":"2026-03-01","toDoAt":null,"inUatAt":"2026-01-28T19:16:35.920+0100","jiraKey":"WFN-638","year":"2026","requestedFor":"","openedAt":"2026-01-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-01T16:20:52.999Z"},"RITM2700012":{"state":"Closed Cancelled","shortDesc":"Product Display Optimization for the “Tutti i prodotti ” section but also for the other section","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":8696,"clientRespMinutes":null,"firstReplyAt":"2026-01-27 10:53:41","firstAssignedDate":"2026-01-21 11:48:34","fulfillmentDate":"2026-01-21 09:57:36","openedBy":"Rebecca Molle (Inactive)","openedDate":"2026-01-21","closedDate":"2026-03-31","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-636","year":"2026","requestedFor":"Rebecca Molle (Inactive)","openedAt":"2026-01-21 09:57:33","stateChangedAt":"2026-03-31 15:22:05","stateChangedBy":"System","lastActivityAt":"2026-01-27 10:53:41","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-03-31T10:22:11.000Z"},"RITM2700578":{"state":"Closed Complete","shortDesc":"Durex Retailer Addition on NL Durex website","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Netherlands","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":2741,"clientRespMinutes":3645,"firstReplyAt":"2026-01-23 13:05:05","firstAssignedDate":"2026-01-22 10:23:45","fulfillmentDate":"2026-01-21 15:24:31","openedBy":"Valeria Bonannella (Inactive)","openedDate":"2026-01-21","closedDate":"2026-03-28","toDoAt":"2026-01-23T09:41:33.810+0100","inUatAt":null,"jiraKey":"WFN-637","year":"2026","requestedFor":"","openedAt":"2026-01-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-28T16:20:52.999Z"},"RITM2704542":{"state":"Closed Cancelled","shortDesc":"Integration of new retailers and e pharma website to product pages","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"France","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":4101,"clientRespMinutes":null,"firstReplyAt":"2026-01-26 15:45:55","firstAssignedDate":"2026-01-26 13:03:44","fulfillmentDate":"2026-01-23 19:25:28","openedBy":"Anaelle Yao","openedDate":"2026-01-23","closedDate":"2026-03-31","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-642","year":"2026","requestedFor":"Anaelle Yao","openedAt":"2026-01-23 19:25:25","stateChangedAt":"2026-03-31 15:23:41","stateChangedBy":"System","lastActivityAt":"2026-03-23 17:32:28","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-03-31T10:23:41.000Z"},"RITM2705313":{"state":"Closed Complete","shortDesc":"microsite update change","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Greece","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":2909,"clientRespMinutes":13990,"firstReplyAt":"2026-01-28 09:53:56","firstAssignedDate":"2026-01-26 13:01:46","fulfillmentDate":"2026-01-26 09:25:10","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2026-01-26","closedDate":"2026-03-04","toDoAt":"2026-02-09T15:44:38.350+0100","inUatAt":"2026-02-19T11:15:30.970+0100","jiraKey":"WFN-641","year":"2026","requestedFor":"","openedAt":"2026-01-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-04T12:21:20.999Z"},"RITM2705568":{"state":"Awaiting User Info","shortDesc":"Launch gaviscon website for BE","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Belgium","businessUnit":"Core Reckitt","finalCost":"8200","currencyCode":"EUR","ttfrMinutes":1376,"clientRespMinutes":5957,"firstReplyAt":"2026-01-27 11:03:03","firstAssignedDate":"2026-01-26 13:00:23","fulfillmentDate":"2026-01-26 12:07:17","openedBy":"Isis Braye (Inactive)","openedDate":"2026-01-26","closedDate":"","toDoAt":"2026-06-12T17:47:15.310+0200","inUatAt":"2026-06-10T11:01:10.837+0200","jiraKey":"WFN-833","year":"2026","requestedFor":"","openedAt":"2026-01-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T12:46:37.000Z"},"RITM2705595":{"state":"Closed Complete","shortDesc":"Website update Card Tigotà Contest - Add March Edition","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":168,"clientRespMinutes":4620,"firstReplyAt":"2026-01-26 15:19:09","firstAssignedDate":"2026-01-26 12:58:52","fulfillmentDate":"2026-01-26 12:31:11","openedBy":"Lorenzo Martelli","openedDate":"2026-01-26","closedDate":"2026-03-10","toDoAt":"2026-01-27T09:52:36.070+0100","inUatAt":"2026-02-18T09:49:53.663+0100","jiraKey":"WFN-640","year":"2026","requestedFor":"","openedAt":"2026-01-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-10T13:20:59.000Z"},"RITM2706782":{"state":"Closed Complete","shortDesc":"microsite update change","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Greece","businessUnit":"Core Reckitt","finalCost":"2400","currencyCode":"GBP","ttfrMinutes":2030,"clientRespMinutes":4961,"firstReplyAt":"2026-01-28 19:47:01","firstAssignedDate":"2026-01-27 10:22:46","fulfillmentDate":"2026-01-27 09:57:15","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2026-01-27","closedDate":"2026-03-04","toDoAt":"2026-02-09T17:36:19.183+0100","inUatAt":null,"jiraKey":"WFN-644","year":"2026","requestedFor":"","openedAt":"2026-01-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-04T12:21:36.000Z"},"RITM2707257":{"state":"Closed Complete","shortDesc":"Please update DE Dobendan website according to brief","assignedTo":"Alesya Prolagayeva","brand":"Dobendan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":115,"clientRespMinutes":3108,"firstReplyAt":"2026-01-27 16:00:01","firstAssignedDate":"2026-01-27 16:00:01","fulfillmentDate":"2026-01-27 14:05:12","openedBy":"Emina Kara","openedDate":"2026-01-27","closedDate":"2026-04-25","toDoAt":"2026-02-02T17:13:27.460+0100","inUatAt":"2026-02-02T17:21:32.207+0100","jiraKey":"WFN-648","year":"2026","requestedFor":"","openedAt":"2026-01-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-25T08:20:56.000Z"},"RITM2708592":{"state":"Closed Complete","shortDesc":"Veet Warnings Update","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1349,"clientRespMinutes":3565,"firstReplyAt":"2026-01-29 10:19:42","firstAssignedDate":"2026-01-28 14:41:02","fulfillmentDate":"2026-01-28 11:50:44","openedBy":"Areeba Imtiaz","openedDate":"2026-01-28","closedDate":"2026-02-14","toDoAt":"2026-01-29T10:19:47.903+0100","inUatAt":"2026-01-29T18:29:09.910+0100","jiraKey":"WFN-646","year":"2026","requestedFor":"","openedAt":"2026-01-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-02-14T16:20:52.999Z"},"RITM2710648":{"state":"Closed Complete","shortDesc":"Gaviscon Romania Website update - DADA launch","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Romania","businessUnit":"Core Reckitt","finalCost":"1320","currencyCode":"GBP","ttfrMinutes":1139,"clientRespMinutes":3604,"firstReplyAt":"2026-01-30 10:04:25","firstAssignedDate":"2026-01-30 10:04:25","fulfillmentDate":"2026-01-29 15:05:16","openedBy":"Ana-Maria Mocanu (Inactive)","openedDate":"2026-01-29","closedDate":"2026-06-17","toDoAt":"2026-03-16T18:38:07.947+0100","inUatAt":null,"jiraKey":"WFN-647","year":"2026","requestedFor":"","openedAt":"2026-01-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-17T15:21:10.000Z"},"RITM2714190":{"state":"Closed Complete","shortDesc":"Gel text update in Durex.it","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":296,"clientRespMinutes":18843,"firstReplyAt":"2026-02-02 19:52:37","firstAssignedDate":"2026-02-02 19:52:37","fulfillmentDate":"2026-02-02 14:56:53","openedBy":"Rebecca Molle (Inactive)","openedDate":"2026-02-02","closedDate":"2026-03-28","toDoAt":"2026-02-03T09:48:01.503+0100","inUatAt":"2026-02-05T09:42:52.180+0100","jiraKey":"WFN-649","year":"2026","requestedFor":"","openedAt":"2026-02-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-28T16:20:54.000Z"},"RITM2714776":{"state":"Closed Complete","shortDesc":"New variant addition to product page","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Finland","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":10957,"clientRespMinutes":6322,"firstReplyAt":"2026-02-10 10:41:19","firstAssignedDate":"2026-02-09 17:59:29","fulfillmentDate":"2026-02-02 20:03:55","openedBy":"Imaan Riaz (Inactive)","openedDate":"2026-02-02","closedDate":"2026-03-02","toDoAt":"2026-08-14T15:28:19.003+0200","inUatAt":null,"jiraKey":"WFN-653","year":"2026","requestedFor":"","openedAt":"2026-02-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-02T18:20:59.000Z"},"RITM2715500":{"state":"Closed Complete","shortDesc":"We want to add a page dedicated to : #1 World’s Condom","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":13218,"clientRespMinutes":37615,"firstReplyAt":"2026-02-12 15:17:05","firstAssignedDate":"2026-02-09 18:01:28","fulfillmentDate":"2026-02-03 10:59:33","openedBy":"Rebecca Molle (Inactive)","openedDate":"2026-02-03","closedDate":"2026-03-16","toDoAt":"2026-02-13T12:51:39.950+0100","inUatAt":"2026-02-16T09:40:06.660+0100","jiraKey":"WFN-654","year":"2026","requestedFor":"","openedAt":"2026-02-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-16T13:20:55.000Z"},"RITM2715970":{"state":"Awaiting User Info","shortDesc":"Need help to remove a claim on Dettol Laundry Sanitiser website","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":8870,"clientRespMinutes":null,"firstReplyAt":"2026-02-09 18:03:46","firstAssignedDate":"2026-02-05 10:46:55","fulfillmentDate":"2026-02-03 14:14:19","openedBy":"Karla Bianca Parungo Valenzuela (Inactive)","openedDate":"2026-02-03","closedDate":"","toDoAt":"2026-02-05T13:43:15.787+0100","inUatAt":"2026-02-06T22:30:55.007+0100","jiraKey":"WFN-652","year":"2026","requestedFor":"","openedAt":"2026-02-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-08T13:08:54.000Z"},"RITM2717480":{"state":"Closed Complete","shortDesc":"Website amend","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":7595,"clientRespMinutes":3591,"firstReplyAt":"2026-02-09 18:07:46","firstAssignedDate":"2026-02-05 10:44:24","fulfillmentDate":"2026-02-04 11:33:22","openedBy":"Chaimaa Amisnau","openedDate":"2026-02-04","closedDate":"2026-03-01","toDoAt":"2026-02-05T13:44:26.657+0100","inUatAt":"2026-02-05T19:00:21.140+0100","jiraKey":"WFN-651","year":"2026","requestedFor":"","openedAt":"2026-02-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-01T17:20:55.000Z"},"RITM2717681":{"state":"Closed Complete","shortDesc":"Remove section in website","assignedTo":"Alesya Prolagayeva","brand":"Napisan","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":7493,"clientRespMinutes":4480,"firstReplyAt":"2026-02-09 18:11:22","firstAssignedDate":"2026-02-05 09:56:45","fulfillmentDate":"2026-02-04 13:18:09","openedBy":"Alessia Possamai","openedDate":"2026-02-04","closedDate":"2026-03-01","toDoAt":"2026-02-05T13:58:57.853+0100","inUatAt":"2026-02-06T11:53:25.617+0100","jiraKey":"WFN-650","year":"2026","requestedFor":"","openedAt":"2026-02-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-01T17:20:56.000Z"},"RITM2719165":{"state":"Closed Complete","shortDesc":"Open 3 pages on PROMO section on Durex.it","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"EUR","ttfrMinutes":10297,"clientRespMinutes":null,"firstReplyAt":"2026-02-12 15:05:06","firstAssignedDate":"2026-02-09 18:15:02","fulfillmentDate":"2026-02-05 11:28:39","openedBy":"Rebecca Molle (Inactive)","openedDate":"2026-02-05","closedDate":"2026-03-01","toDoAt":"2026-02-13T13:55:20.060+0100","inUatAt":null,"jiraKey":"WFN-655","year":"2026","requestedFor":"","openedAt":"2026-02-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-01T17:20:54.000Z"},"RITM2719655":{"state":"Closed Complete","shortDesc":"Airwick UK Competition T&Cs Webpage Creation","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"United Kingdom","businessUnit":"Essential Home","finalCost":"300","currencyCode":"GBP","ttfrMinutes":6893,"clientRespMinutes":5342,"firstReplyAt":"2026-02-10 10:31:09","firstAssignedDate":"2026-02-09 18:17:35","fulfillmentDate":"2026-02-05 15:37:52","openedBy":"Kawai Chueng (Inactive)","openedDate":"2026-02-05","closedDate":"2026-03-01","toDoAt":"2026-02-11T09:36:37.440+0100","inUatAt":null,"jiraKey":"WFN-656","year":"2026","requestedFor":"","openedAt":"2026-02-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-01T17:20:52.000Z"},"RITM2728696":{"state":"Closed Complete","shortDesc":"Savers - Product Buy Now Links","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1162,"clientRespMinutes":3332,"firstReplyAt":"2026-02-13 11:41:50","firstAssignedDate":"2026-02-13 11:41:50","fulfillmentDate":"2026-02-12 16:19:36","openedBy":"Jasmine Clarke-Terrelonge (Inactive)","openedDate":"2026-02-12","closedDate":"2026-03-04","toDoAt":"2026-02-20T16:28:00.690+0100","inUatAt":"2026-02-23T11:41:09.443+0100","jiraKey":"WFN-658","year":"2026","requestedFor":"","openedAt":"2026-02-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-04T12:21:13.000Z"},"RITM2728779":{"state":"Closed Complete","shortDesc":"exchange coupon","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":6796,"clientRespMinutes":3717,"firstReplyAt":"2026-02-17 10:18:11","firstAssignedDate":"2026-02-13 10:08:18","fulfillmentDate":"2026-02-12 17:02:00","openedBy":"Annika Brickwedde","openedDate":"2026-02-12","closedDate":"2026-04-15","toDoAt":"2026-02-26T18:24:23.623+0100","inUatAt":"2026-02-13T13:58:06.260+0100","jiraKey":"WFN-657","year":"2026","requestedFor":"","openedAt":"2026-02-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-15T06:21:43.000Z"},"RITM2728854":{"state":"Awaiting User Info","shortDesc":"Gaviscon DADA - Spain","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Spain","businessUnit":"Core Reckitt","finalCost":"3200","currencyCode":"GBP","ttfrMinutes":6736,"clientRespMinutes":8800,"firstReplyAt":"2026-02-17 10:09:24","firstAssignedDate":"2026-02-13 13:49:50","fulfillmentDate":"2026-02-12 17:53:07","openedBy":"Rowena Hearn","openedDate":"2026-02-12","closedDate":"","toDoAt":"2026-03-05T15:09:35.663+0100","inUatAt":"2026-03-19T15:07:29.410+0100","jiraKey":"WFN-663","year":"2026","requestedFor":"","openedAt":"2026-02-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T10:51:18.000Z"},"RITM2729621":{"state":"Closed Cancelled","shortDesc":"Veet X Rossmann Sommer Gewinnspiel 2026","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Germany","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":312,"clientRespMinutes":3263,"firstReplyAt":"2026-02-13 14:02:52","firstAssignedDate":"2026-02-13 14:02:52","fulfillmentDate":"2026-02-13 08:51:25","openedBy":"Kyra Rinck","openedDate":"2026-02-13","closedDate":"2026-03-09","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-662","year":"2026","requestedFor":"Kyra Rinck","openedAt":"2026-02-13 08:51:21","stateChangedAt":"2026-03-09 16:16:18","stateChangedBy":"Kyra Rinck","lastActivityAt":"2026-03-09 16:16:18","lastActivityBy":"Kyra Rinck","_updated":"2026-03-09T13:16:17.000Z"},"RITM2729872":{"state":"Closed Complete","shortDesc":"Coupon Website Pic Update","assignedTo":"Alesya Prolagayeva","brand":"Sagrotan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":5666,"clientRespMinutes":2860,"firstReplyAt":"2026-02-17 09:58:15","firstAssignedDate":"2026-02-13 11:59:49","fulfillmentDate":"2026-02-13 11:32:21","openedBy":"Markus Dittel","openedDate":"2026-02-13","closedDate":"2026-03-09","toDoAt":null,"inUatAt":"2026-02-17T14:39:07.380+0100","jiraKey":"WFN-659","year":"2026","requestedFor":"","openedAt":"2026-02-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-09T11:20:52.000Z"},"RITM2730604":{"state":"Closed Complete","shortDesc":"Notas C&F | Lysol","assignedTo":"Jesica Greco","brand":"Lysol","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"26400","currencyCode":"MXN","ttfrMinutes":8498,"clientRespMinutes":16863,"firstReplyAt":"2026-02-19 18:53:15","firstAssignedDate":"2026-02-18 14:27:38","fulfillmentDate":"2026-02-13 21:15:19","openedBy":"Monica Cano (Inactive)","openedDate":"2026-02-13","closedDate":"2026-04-12","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-667","year":"2026","requestedFor":"","openedAt":"2026-02-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-12T18:21:17.000Z"},"RITM2731621":{"state":"Closed Complete","shortDesc":"Airwick Page Removal","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"United Kingdom","businessUnit":"Essential Home","finalCost":"120","currencyCode":"GBP","ttfrMinutes":2804,"clientRespMinutes":3406,"firstReplyAt":"2026-02-18 10:57:54","firstAssignedDate":"2026-02-16 23:24:06","fulfillmentDate":"2026-02-16 12:13:59","openedBy":"Kawai Chueng (Inactive)","openedDate":"2026-02-16","closedDate":"2026-03-09","toDoAt":"2026-02-18T11:27:25.063+0100","inUatAt":null,"jiraKey":"WFN-661","year":"2026","requestedFor":"","openedAt":"2026-02-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-09T14:20:54.000Z"},"RITM2731695":{"state":"Closed Complete","shortDesc":"Vanish - Milkyway","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"5000","currencyCode":"GBP","ttfrMinutes":60717,"clientRespMinutes":7174,"firstReplyAt":"2026-03-30 17:57:57","firstAssignedDate":"2026-02-16 23:01:52","fulfillmentDate":"2026-02-16 13:01:23","openedBy":"Rowena Hearn","openedDate":"2026-02-16","closedDate":"2026-06-20","toDoAt":"2026-03-27T18:47:24.750+0100","inUatAt":"2026-06-03T17:46:20.520+0200","jiraKey":"WFN-722","year":"2026","requestedFor":"","openedAt":"2026-02-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-20T16:21:16.000Z"},"RITM2731698":{"state":"Awaiting User Info","shortDesc":"Vanish - Thanos","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"5000","currencyCode":"GBP","ttfrMinutes":66379,"clientRespMinutes":56970,"firstReplyAt":"2026-04-03 16:21:59","firstAssignedDate":"2026-02-23 13:12:53","fulfillmentDate":"2026-02-16 13:02:39","openedBy":"Rowena Hearn","openedDate":"2026-02-16","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-02-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T12:49:22.000Z"},"RITM2731972":{"state":"Closed Complete","shortDesc":"Brief Durex FR Website - Expired picture + delete \"nouveau\" mention","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"France","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"EUR","ttfrMinutes":2621,"clientRespMinutes":3075,"firstReplyAt":"2026-02-18 11:28:27","firstAssignedDate":"2026-02-16 23:08:38","fulfillmentDate":"2026-02-16 15:47:33","openedBy":"Sara Do Vale Afonso (Inactive)","openedDate":"2026-02-16","closedDate":"2026-04-07","toDoAt":"2026-02-20T16:24:51.193+0100","inUatAt":"2026-02-26T14:41:37.627+0100","jiraKey":"WFN-660","year":"2026","requestedFor":"","openedAt":"2026-02-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-07T14:20:52.999Z"},"RITM2733079":{"state":"Closed Complete","shortDesc":"Change of pharmacy name and linking to the pharmacy website with Gaviscon products.","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Poland","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1263,"clientRespMinutes":18751,"firstReplyAt":"2026-02-18 11:32:29","firstAssignedDate":"2026-02-18 11:32:29","fulfillmentDate":"2026-02-17 14:29:29","openedBy":"Michalina Pakulska","openedDate":"2026-02-17","closedDate":"2026-07-27","toDoAt":"2026-04-03T13:42:21.553+0200","inUatAt":null,"jiraKey":"WFN-729","year":"2026","requestedFor":"","openedAt":"2026-02-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-27T10:59:01.000Z"},"RITM2733433":{"state":"Closed Complete","shortDesc":"BANNER PUBLISHING ON WEBSITE","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":3803,"clientRespMinutes":2521,"firstReplyAt":"2026-02-20 09:32:43","firstAssignedDate":"2026-02-18 11:36:44","fulfillmentDate":"2026-02-17 18:09:56","openedBy":"Alessandra Bosso","openedDate":"2026-02-17","closedDate":"2026-03-03","toDoAt":"2026-02-20T17:52:55.710+0100","inUatAt":null,"jiraKey":"WFN-664","year":"2026","requestedFor":"","openedAt":"2026-02-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-03T17:20:52.999Z"},"RITM2734222":{"state":"Closed Complete","shortDesc":"Change Private Noticy for Cillit Bang DE Website","assignedTo":"Alesya Prolagayeva","brand":"Cillit","market":"Germany","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2736,"clientRespMinutes":1593,"firstReplyAt":"2026-02-20 09:31:30","firstAssignedDate":"2026-02-19 09:24:59","fulfillmentDate":"2026-02-18 11:55:43","openedBy":"Lisa Graf","openedDate":"2026-02-18","closedDate":"2026-03-28","toDoAt":"2026-02-19T10:38:37.863+0100","inUatAt":"2026-02-19T15:15:38.363+0100","jiraKey":"WFN-665","year":"2026","requestedFor":"","openedAt":"2026-02-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-28T16:20:52.000Z"},"RITM2734488":{"state":"Closed Complete","shortDesc":"Delete link to YT video","assignedTo":"Alesya Prolagayeva","brand":"Napisan","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2576,"clientRespMinutes":2980,"firstReplyAt":"2026-02-20 09:40:35","firstAssignedDate":"2026-02-20 09:40:35","fulfillmentDate":"2026-02-18 14:44:44","openedBy":"Alessia Possamai","openedDate":"2026-02-18","closedDate":"2026-04-14","toDoAt":"2026-02-19T10:38:40.200+0100","inUatAt":"2026-03-06T09:34:28.333+0100","jiraKey":"WFN-666","year":"2026","requestedFor":"","openedAt":"2026-02-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-14T07:21:09.000Z"},"RITM2734754":{"state":"Closed Complete","shortDesc":"Add another section under PRODOTTI in the sitemap od Durex.it","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":8182,"clientRespMinutes":null,"firstReplyAt":"2026-02-24 10:12:52","firstAssignedDate":"2026-02-20 09:42:11","fulfillmentDate":"2026-02-18 17:50:39","openedBy":"Rebecca Molle (Inactive)","openedDate":"2026-02-18","closedDate":"2026-03-16","toDoAt":"2026-02-20T14:28:31.970+0100","inUatAt":null,"jiraKey":"WFN-669","year":"2026","requestedFor":"","openedAt":"2026-02-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-16T13:20:56.999Z"},"RITM2736348":{"state":"Closed Complete","shortDesc":"Remove Section | Vanish","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"2400","currencyCode":"MXN","ttfrMinutes":87,"clientRespMinutes":null,"firstReplyAt":"2026-02-19 20:01:56","firstAssignedDate":"2026-02-19 19:11:48","fulfillmentDate":"2026-02-19 18:35:29","openedBy":"Monica Cano (Inactive)","openedDate":"2026-02-19","closedDate":"2026-04-15","toDoAt":null,"inUatAt":"2026-02-26T18:05:57.567+0100","jiraKey":"WFN-668","year":"2026","requestedFor":"","openedAt":"2026-02-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-15T17:20:52.999Z"},"RITM2737573":{"state":"Fulfilled","shortDesc":"I need the Air Wick website in PSD format.","assignedTo":"Damian Casasnovas","brand":"Air Wick","market":"Brazil","businessUnit":"Essential Home","finalCost":"","currencyCode":"","ttfrMinutes":6029,"clientRespMinutes":10023,"firstReplyAt":"2026-02-24 18:02:23","firstAssignedDate":"2026-03-03 10:17:13","fulfillmentDate":"2026-02-20 13:33:53","openedBy":"Caroline Cruz (Inactive)","openedDate":"2026-02-20","closedDate":"2026-07-16","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-02-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-16T02:14:51.000Z"},"RITM2740349":{"state":"Closed Complete","shortDesc":"Cillit Bang Website Blog Articles","assignedTo":"Alesya Prolagayeva","brand":"Cillit","market":"Germany","businessUnit":"Essential Home","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1291,"clientRespMinutes":2451,"firstReplyAt":"2026-02-24 14:11:32","firstAssignedDate":"2026-02-24 09:50:32","fulfillmentDate":"2026-02-23 16:40:07","openedBy":"Lisa Graf","openedDate":"2026-02-23","closedDate":"2026-04-25","toDoAt":"2026-03-03T14:19:13.693+0100","inUatAt":"2026-03-17T11:22:14.827+0100","jiraKey":"WFN-670","year":"2026","requestedFor":"","openedAt":"2026-02-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-25T08:21:19.000Z"},"RITM2740400":{"state":"Closed Cancelled","shortDesc":"We would like to create a website for Nurofen in Switzerland. As a base we could use the Austrian Website and localize it accordingly to Switzerland.","assignedTo":"Oksana Batyuk","brand":"Nurofen","market":"Switzerland","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":4170,"clientRespMinutes":null,"firstReplyAt":"2026-02-26 14:28:44","firstAssignedDate":"2026-02-24 09:52:17","fulfillmentDate":"2026-02-23 16:58:54","openedBy":"Helene Schoof","openedDate":"2026-02-23","closedDate":"2026-04-03","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-671","year":"2026","requestedFor":"Helene Schoof","openedAt":"2026-02-23 16:58:51","stateChangedAt":"2026-04-03 17:53:21","stateChangedBy":"System","lastActivityAt":"2026-04-02 16:50:19","lastActivityBy":"Helene Schoof","_updated":"2026-04-03T12:53:21.000Z"},"RITM2741891":{"state":"Closed Complete","shortDesc":"Update Datenschutzhinweis Calgon","assignedTo":"Oksana Batyuk","brand":"Calgon","market":"Germany","businessUnit":"Essential Home","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1284,"clientRespMinutes":3654,"firstReplyAt":"2026-02-25 12:00:49","firstAssignedDate":"2026-02-24 17:38:35","fulfillmentDate":"2026-02-24 14:37:06","openedBy":"Milena Desch","openedDate":"2026-02-24","closedDate":"2026-04-08","toDoAt":"2026-02-25T15:40:29.983+0100","inUatAt":null,"jiraKey":"WFN-673","year":"2026","requestedFor":"","openedAt":"2026-02-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-08T15:20:52.999Z"},"RITM2741982":{"state":"Closed Complete","shortDesc":"Privacy Notice Update","assignedTo":"Oksana Batyuk","brand":"Air Wick","market":"Germany","businessUnit":"Essential Home","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1421,"clientRespMinutes":1836,"firstReplyAt":"2026-02-25 15:12:50","firstAssignedDate":"2026-02-24 17:42:54","fulfillmentDate":"2026-02-24 15:32:03","openedBy":"Daniela Paul","openedDate":"2026-02-24","closedDate":"2026-03-07","toDoAt":"2026-02-25T10:43:23.670+0100","inUatAt":null,"jiraKey":"WFN-674","year":"2026","requestedFor":"","openedAt":"2026-02-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-07T12:20:52.000Z"},"RITM2742596":{"state":"Closed Complete","shortDesc":"Ajuste Logo Amazon","assignedTo":"Damian Casasnovas","brand":"Finish","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"978","currencyCode":"MXN","ttfrMinutes":977,"clientRespMinutes":1162,"firstReplyAt":"2026-02-25 15:01:20","firstAssignedDate":"2026-02-25 14:56:37","fulfillmentDate":"2026-02-24 22:44:05","openedBy":"Lucas Jose da Silva Junior","openedDate":"2026-02-24","closedDate":"2026-03-09","toDoAt":"2026-02-25T18:24:36.717+0100","inUatAt":"2026-03-03T17:32:04.213+0100","jiraKey":"WFN-676","year":"2026","requestedFor":"","openedAt":"2026-02-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-03-09T17:20:52.999Z"},"RITM2743145":{"state":"Closed Cancelled","shortDesc":"GRIP Website Migration - Husky X","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":204382,"clientRespMinutes":12918,"firstReplyAt":"2026-07-17 09:37:00","firstAssignedDate":"2026-02-25 16:29:44","fulfillmentDate":"2026-02-25 10:14:55","openedBy":"Rowena Hearn","openedDate":"2026-02-25","closedDate":"2026-07-17","toDoAt":"2026-08-14T15:28:32.613+0200","inUatAt":null,"jiraKey":"WFN-677","year":"2026","requestedFor":"Rowena Hearn","openedAt":"2026-02-25 10:14:52","stateChangedAt":"2026-07-17 09:40:34","stateChangedBy":"System","lastActivityAt":"2026-07-17 09:37:00","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-07-17T04:40:34.000Z"},"RITM2743335":{"state":"Closed Complete","shortDesc":"Add Legal T&Cs","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"United Kingdom","businessUnit":"Essential Home","finalCost":"3000","currencyCode":"GBP","ttfrMinutes":2812,"clientRespMinutes":4497,"firstReplyAt":"2026-02-27 10:51:28","firstAssignedDate":"2026-02-25 15:27:48","fulfillmentDate":"2026-02-25 11:59:43","openedBy":"Annie Sweet","openedDate":"2026-02-25","closedDate":"2026-05-19","toDoAt":"2026-03-03T12:41:59.977+0100","inUatAt":"2026-03-13T11:19:55.907+0100","jiraKey":"WFN-675","year":"2026","requestedFor":"","openedAt":"2026-02-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-19T20:21:01.000Z"},"RITM2746785":{"state":"Closed Complete","shortDesc":"Finish.hu - update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":166,"clientRespMinutes":1024,"firstReplyAt":"2026-02-27 13:04:14","firstAssignedDate":"2026-02-27 11:33:18","fulfillmentDate":"2026-02-27 10:18:30","openedBy":"Dalma Lisa Pettersson","openedDate":"2026-02-27","closedDate":"2026-04-25","toDoAt":null,"inUatAt":"2026-03-05T16:40:15.843+0100","jiraKey":"WFN-678","year":"2026","requestedFor":"","openedAt":"2026-02-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-25T08:21:23.000Z"},"RITM2746992":{"state":"Closed Incomplete","shortDesc":"New website for Durex purpose activities","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":70,"clientRespMinutes":9620,"firstReplyAt":"2026-02-27 13:40:07","firstAssignedDate":"2026-02-27 13:40:07","fulfillmentDate":"2026-02-27 12:29:46","openedBy":"Carola D Alessandro","openedDate":"2026-02-27","closedDate":"2026-08-19","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"Carola D Alessandro","openedAt":"2026-02-27 12:29:43","stateChangedAt":"2026-08-19 15:51:26","stateChangedBy":"System","lastActivityAt":"2026-08-19 15:50:39","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-08-19T10:51:26.000Z"},"RITM2747727":{"state":"Closed Complete","shortDesc":"Lysol | Update PDPs","assignedTo":"Damian Casasnovas","brand":"Lysol","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":64614,"clientRespMinutes":104242,"firstReplyAt":"2026-04-13 18:05:08","firstAssignedDate":"2026-04-20 11:02:03","fulfillmentDate":"2026-02-27 20:10:48","openedBy":"Monica Cano (Inactive)","openedDate":"2026-02-27","closedDate":"2026-07-29","toDoAt":null,"inUatAt":"2026-06-26T19:26:53.910+0200","jiraKey":"WFN-689","year":"2026","requestedFor":"","openedAt":"2026-02-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-29T01:26:33.000Z"},"RITM2748815":{"state":"Closed Complete","shortDesc":"microsite update as per attached brief","assignedTo":"Oksana Batyuk","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":420,"clientRespMinutes":1539,"firstReplyAt":"2026-03-02 15:50:07","firstAssignedDate":"2026-03-02 13:37:29","fulfillmentDate":"2026-03-02 08:50:12","openedBy":"Andreas Papoutsis (Inactive)","openedDate":"2026-03-02","closedDate":"2026-04-08","toDoAt":"2026-03-04T19:21:36.897+0100","inUatAt":null,"jiraKey":"WFN-679","year":"2026","requestedFor":"","openedAt":"2026-03-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-08T15:20:52.000Z"},"RITM2750787":{"state":"Closed Cancelled","shortDesc":"Nurofen website small changes - OOS for UAT","assignedTo":"Oksana Batyuk","brand":"Nurofen","market":"France","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":295,"clientRespMinutes":1419,"firstReplyAt":"2026-03-03 16:41:21","firstAssignedDate":"2026-03-03 12:37:15","fulfillmentDate":"2026-03-03 11:46:02","openedBy":"Constance de Taillac (Inactive)","openedDate":"2026-03-03","closedDate":"2026-03-13","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-680","year":"2026","requestedFor":"Constance de Taillac (Inactive)","openedAt":"2026-03-03 11:45:58","stateChangedAt":"2026-03-13 16:18:15","stateChangedBy":"System","lastActivityAt":"2026-03-12 15:53:29","lastActivityBy":"Constance de Taillac (Inactive)","_updated":"2026-03-13T13:18:15.000Z"},"RITM2751209":{"state":"Closed Complete","shortDesc":"Calgon.it changes","assignedTo":"Alesya Prolagayeva","brand":"Calgon","market":"Italy","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1310,"clientRespMinutes":1459,"firstReplyAt":"2026-03-04 13:44:31","firstAssignedDate":"2026-03-03 16:45:26","fulfillmentDate":"2026-03-03 15:54:32","openedBy":"Sofia Ferracci (Inactive)","openedDate":"2026-03-03","closedDate":"2026-04-15","toDoAt":"2026-03-10T09:17:25.373+0100","inUatAt":"2026-03-13T17:31:40.033+0100","jiraKey":"WFN-681","year":"2026","requestedFor":"","openedAt":"2026-03-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-15T06:21:29.000Z"},"RITM2752521":{"state":"Closed Complete","shortDesc":"Change Impressum Calgon DE","assignedTo":"Oksana Batyuk","brand":"Calgon","market":"Germany","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1258,"clientRespMinutes":3260,"firstReplyAt":"2026-03-05 10:28:39","firstAssignedDate":"2026-03-05 09:49:56","fulfillmentDate":"2026-03-04 13:31:07","openedBy":"Milena Desch","openedDate":"2026-03-04","closedDate":"2026-04-08","toDoAt":null,"inUatAt":"2026-03-05T14:55:51.140+0100","jiraKey":"WFN-683","year":"2026","requestedFor":"","openedAt":"2026-03-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-14T20:15:47.000Z"},"RITM2752528":{"state":"Closed Complete","shortDesc":"Cillit Bang Website Impressum","assignedTo":"Alesya Prolagayeva","brand":"Cillit","market":"Germany","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1250,"clientRespMinutes":3329,"firstReplyAt":"2026-03-05 10:27:54","firstAssignedDate":"2026-03-05 09:52:11","fulfillmentDate":"2026-03-04 13:37:30","openedBy":"Lisa Graf","openedDate":"2026-03-04","closedDate":"2026-04-25","toDoAt":null,"inUatAt":"2026-03-05T14:55:53.410+0100","jiraKey":"WFN-684","year":"2026","requestedFor":"","openedAt":"2026-03-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-25T08:21:47.000Z"},"RITM2752881":{"state":"Closed Complete","shortDesc":"Veet Website Banner on Homepage","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":978,"clientRespMinutes":2924,"firstReplyAt":"2026-03-05 09:56:12","firstAssignedDate":"2026-03-05 09:56:12","fulfillmentDate":"2026-03-04 17:38:37","openedBy":"Areeba Imtiaz","openedDate":"2026-03-04","closedDate":"2026-05-03","toDoAt":null,"inUatAt":"2026-04-08T09:35:12.567+0200","jiraKey":"WFN-685","year":"2026","requestedFor":"","openedAt":"2026-03-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-03T09:21:13.000Z"},"RITM2752888":{"state":"Awaiting User Info","shortDesc":"Gaviscon Scarlet","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"2400","currencyCode":"GBP","ttfrMinutes":27259,"clientRespMinutes":5748,"firstReplyAt":"2026-03-23 16:05:33","firstAssignedDate":"2026-03-05 14:42:37","fulfillmentDate":"2026-03-04 17:46:40","openedBy":"Rowena Hearn","openedDate":"2026-03-04","closedDate":"","toDoAt":"2026-04-14T10:43:14.873+0200","inUatAt":"2026-08-21T13:42:40.190+0200","jiraKey":"WFN-709","year":"2026","requestedFor":"","openedAt":"2026-03-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T11:03:23.000Z"},"RITM2753767":{"state":"Closed Complete","shortDesc":"Adding changes to Durex PL website","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Poland","businessUnit":"Core Reckitt","finalCost":"1320","currencyCode":"GBP","ttfrMinutes":1587,"clientRespMinutes":7265,"firstReplyAt":"2026-03-06 13:50:21","firstAssignedDate":"2026-03-05 18:14:33","fulfillmentDate":"2026-03-05 11:23:41","openedBy":"Anna Pieczkowska","openedDate":"2026-03-05","closedDate":"2026-05-09","toDoAt":"2026-03-11T15:58:09.840+0100","inUatAt":"2026-03-25T18:06:42.687+0100","jiraKey":"WFN-688","year":"2026","requestedFor":"","openedAt":"2026-03-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-09T16:21:22.000Z"},"RITM2754143":{"state":"Closed Incomplete","shortDesc":"Durex PT Website Update","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":7363,"clientRespMinutes":2377,"firstReplyAt":"2026-03-10 18:11:44","firstAssignedDate":"2026-03-05 18:12:47","fulfillmentDate":"2026-03-05 15:29:02","openedBy":"Martim Martins (Inactive)","openedDate":"2026-03-05","closedDate":"2026-08-19","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-687","year":"2026","requestedFor":"Martim Martins (Inactive)","openedAt":"2026-03-05 15:28:58","stateChangedAt":"2026-08-19 16:24:44","stateChangedBy":"System","lastActivityAt":"2026-08-19 16:24:06","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-08-19T11:24:44.000Z"},"RITM2754149":{"state":"Closed Cancelled","shortDesc":"Durex Tomorrowland landing page","assignedTo":"Oksana Batyuk","brand":"Durex","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1343,"clientRespMinutes":952,"firstReplyAt":"2026-03-06 13:54:43","firstAssignedDate":"2026-03-05 18:10:47","fulfillmentDate":"2026-03-05 15:32:14","openedBy":"Areeba Imtiaz","openedDate":"2026-03-05","closedDate":"2026-04-03","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-686","year":"2026","requestedFor":"Areeba Imtiaz","openedAt":"2026-03-05 15:32:09","stateChangedAt":"2026-04-03 11:45:00","stateChangedBy":"System","lastActivityAt":"2026-03-19 15:15:55","lastActivityBy":"Areeba Imtiaz","_updated":"2026-04-03T06:45:00.000Z"},"RITM2755698":{"state":"Closed Complete","shortDesc":"the publication of the money‑back participation form on Vanish TR’s official website","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":7336,"clientRespMinutes":1538,"firstReplyAt":"2026-03-11 16:30:53","firstAssignedDate":"2026-03-10 10:11:09","fulfillmentDate":"2026-03-06 14:15:26","openedBy":"Mina Yilmaz","openedDate":"2026-03-06","closedDate":"2026-07-27","toDoAt":"2026-04-06T15:09:09.570+0200","inUatAt":null,"jiraKey":"WFN-690","year":"2026","requestedFor":"","openedAt":"2026-03-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-27T13:55:24.000Z"},"RITM2756045":{"state":"Closed Cancelled","shortDesc":"Set Up Raffle Page for Sagrotan Laundry Sanitizer","assignedTo":"Oksana Batyuk","brand":"Sagrotan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":5283,"clientRespMinutes":1482,"firstReplyAt":"2026-03-10 10:25:38","firstAssignedDate":"2026-03-10 10:13:08","fulfillmentDate":"2026-03-06 18:22:36","openedBy":"Rouven Lutz","openedDate":"2026-03-06","closedDate":"2026-03-19","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-691","year":"2026","requestedFor":"Rouven Lutz","openedAt":"2026-03-06 18:22:32","stateChangedAt":"2026-03-19 17:50:05","stateChangedBy":"Rouven Lutz","lastActivityAt":"2026-03-19 17:50:05","lastActivityBy":"Rouven Lutz","_updated":"2026-03-19T14:50:04.000Z"},"RITM2757697":{"state":"Awaiting User Info","shortDesc":"Fybobalance NPD associated products and articles to be added to fybo.co.uk","assignedTo":"Tatyana Samoylenko","brand":"Fybogel","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1124,"clientRespMinutes":46,"firstReplyAt":"2026-03-10 10:16:57","firstAssignedDate":"2026-03-10 10:15:04","fulfillmentDate":"2026-03-09 15:33:02","openedBy":"Thomas Britton","openedDate":"2026-03-09","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-692","year":"2026","requestedFor":"","openedAt":"2026-03-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-30T15:20:23.000Z"},"RITM2758917":{"state":"On hold","shortDesc":"Gaviscon IT - Lendl","assignedTo":"Tatyana Samoylenko","brand":"Gaviscon","market":"Italy","businessUnit":"Core Reckitt","finalCost":"1020","currencyCode":"GBP","ttfrMinutes":18935,"clientRespMinutes":3393,"firstReplyAt":"2026-03-23 15:16:14","firstAssignedDate":"2026-03-11 15:17:43","fulfillmentDate":"2026-03-10 11:41:17","openedBy":"Rowena Hearn","openedDate":"2026-03-10","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-03-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T10:16:20.000Z"},"RITM2759785":{"state":"Closed Complete","shortDesc":"Picot | Revamp","assignedTo":"Damian Casasnovas","brand":"Picot","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":14127,"clientRespMinutes":20977,"firstReplyAt":"2026-03-20 16:27:27","firstAssignedDate":"2026-03-10 21:15:48","fulfillmentDate":"2026-03-10 21:00:37","openedBy":"Monica Cano (Inactive)","openedDate":"2026-03-10","closedDate":"2026-08-06","toDoAt":"2026-05-04T14:38:28.957+0200","inUatAt":"2026-07-21T05:30:15.817+0200","jiraKey":"WFN-693","year":"2026","requestedFor":"","openedAt":"2026-03-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-06T00:34:00.000Z"},"RITM2760635":{"state":"Closed Complete","shortDesc":"Changes on finish website","assignedTo":"Oksana Batyuk","brand":"Finish","market":"Romania","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":2956,"clientRespMinutes":5165,"firstReplyAt":"2026-03-13 14:42:14","firstAssignedDate":"2026-03-12 08:46:14","fulfillmentDate":"2026-03-11 13:26:35","openedBy":"Andra Chiribici","openedDate":"2026-03-11","closedDate":"2026-04-08","toDoAt":"2026-03-13T16:24:55.783+0100","inUatAt":"2026-03-24T14:20:15.073+0100","jiraKey":"WFN-694","year":"2026","requestedFor":"","openedAt":"2026-03-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-18T06:24:20.000Z"},"RITM2761068":{"state":"Closed Complete","shortDesc":"Microsite on veet.de for Raffle","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"Germany","businessUnit":"Core Reckitt","finalCost":"2520","currencyCode":"GBP","ttfrMinutes":2824,"clientRespMinutes":4245,"firstReplyAt":"2026-03-13 16:27:10","firstAssignedDate":"2026-03-12 08:47:46","fulfillmentDate":"2026-03-11 17:22:51","openedBy":"Annika Brickwedde","openedDate":"2026-03-11","closedDate":"2026-05-31","toDoAt":"2026-03-20T10:39:59.347+0100","inUatAt":"2026-04-02T13:39:09.417+0200","jiraKey":"WFN-697","year":"2026","requestedFor":"","openedAt":"2026-03-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-31T14:21:26.000Z"},"RITM2762368":{"state":"Closed Complete","shortDesc":"Updating a section of the landing page of the Finish UK website for a competition.","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"3000","currencyCode":"GBP","ttfrMinutes":1734,"clientRespMinutes":4475,"firstReplyAt":"2026-03-13 16:33:36","firstAssignedDate":"2026-03-12 14:52:25","fulfillmentDate":"2026-03-12 11:39:23","openedBy":"Mahnur Ali","openedDate":"2026-03-12","closedDate":"2026-07-01","toDoAt":"2026-03-30T12:28:07.350+0200","inUatAt":null,"jiraKey":"WFN-695","year":"2026","requestedFor":"","openedAt":"2026-03-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-01T10:21:37.000Z"},"RITM2762886":{"state":"Closed Complete","shortDesc":"microsite update change","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":1372,"clientRespMinutes":3894,"firstReplyAt":"2026-03-13 15:05:44","firstAssignedDate":"2026-03-13 14:53:14","fulfillmentDate":"2026-03-12 16:13:19","openedBy":"Froso Liapodimitri","openedDate":"2026-03-12","closedDate":"2026-04-27","toDoAt":"2026-03-17T11:14:34.343+0100","inUatAt":null,"jiraKey":"WFN-696","year":"2026","requestedFor":"","openedAt":"2026-03-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-27T08:21:33.000Z"},"RITM2763984":{"state":"Closed Complete","shortDesc":"AT Sagrotan Website Update","assignedTo":"Alesya Prolagayeva","brand":"Sagrotan","market":"Austria","businessUnit":"Core Reckitt","finalCost":"3000","currencyCode":"GBP","ttfrMinutes":6178,"clientRespMinutes":3304,"firstReplyAt":"2026-03-17 17:49:13","firstAssignedDate":"2026-03-13 16:34:13","fulfillmentDate":"2026-03-13 10:50:54","openedBy":"Nina Bongartz (Inactive)","openedDate":"2026-03-13","closedDate":"2026-04-26","toDoAt":"2026-03-25T16:25:03.657+0100","inUatAt":null,"jiraKey":"WFN-698","year":"2026","requestedFor":"","openedAt":"2026-03-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-26T16:21:05.000Z"},"RITM2764036":{"state":"Closed Complete","shortDesc":"Impressum Update","assignedTo":"Oksana Batyuk","brand":"Air Wick","market":"Germany","businessUnit":"Essential Home","finalCost":"","currencyCode":"","ttfrMinutes":7332,"clientRespMinutes":1172,"firstReplyAt":"2026-03-18 13:40:52","firstAssignedDate":"2026-03-13 16:37:21","fulfillmentDate":"2026-03-13 11:28:31","openedBy":"Daniela Paul","openedDate":"2026-03-13","closedDate":"2026-04-06","toDoAt":"2026-03-16T17:09:40.047+0100","inUatAt":"2026-03-18T17:44:15.320+0100","jiraKey":"WFN-699","year":"2026","requestedFor":"","openedAt":"2026-03-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-06T17:20:53.999Z"},"RITM2764435":{"state":"Closed Complete","shortDesc":"Finish RO site changes","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Romania","businessUnit":"Core Reckitt","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":4366,"clientRespMinutes":2971,"firstReplyAt":"2026-03-16 16:07:03","firstAssignedDate":"2026-03-13 16:39:26","fulfillmentDate":"2026-03-13 15:21:36","openedBy":"Andra Chiribici","openedDate":"2026-03-13","closedDate":"2026-05-03","toDoAt":"2026-03-23T09:53:11.333+0100","inUatAt":"2026-03-25T17:10:54.657+0100","jiraKey":"WFN-700","year":"2026","requestedFor":"","openedAt":"2026-03-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-03T09:21:16.000Z"},"RITM2764526":{"state":"Closed Complete","shortDesc":"Update Imprint + Coupon Upload","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":6909,"clientRespMinutes":5108,"firstReplyAt":"2026-03-18 11:43:29","firstAssignedDate":"2026-03-13 16:48:31","fulfillmentDate":"2026-03-13 16:34:19","openedBy":"Mia Leimkuhler","openedDate":"2026-03-13","closedDate":"2026-04-25","toDoAt":"2026-03-19T16:38:21.090+0100","inUatAt":"2026-03-20T16:32:29.247+0100","jiraKey":"WFN-701","year":"2026","requestedFor":"","openedAt":"2026-03-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-25T08:21:26.000Z"},"RITM2765966":{"state":"Closed Cancelled","shortDesc":"Important action required! Finish participation form is not working","assignedTo":"Oksana Batyuk","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":193,"clientRespMinutes":105,"firstReplyAt":"2026-03-16 18:02:56","firstAssignedDate":"2026-03-16 14:55:29","fulfillmentDate":"2026-03-16 14:49:49","openedBy":"Mia Leimkuhler","openedDate":"2026-03-16","closedDate":"2026-04-08","toDoAt":"2026-03-24T09:36:23.107+0100","inUatAt":null,"jiraKey":"WFN-702","year":"2026","requestedFor":"Mia Leimkuhler","openedAt":"2026-03-16 14:49:45","stateChangedAt":"2026-04-08 13:45:16","stateChangedBy":"System","lastActivityAt":"2026-04-08 13:36:58","lastActivityBy":"Mia Leimkuhler","_updated":"2026-04-08T08:45:16.000Z"},"RITM2769988":{"state":"Awaiting User Info","shortDesc":"lovela.pl website we want to modify Privacy, Cookie and T&C pages as well as footer","assignedTo":"Elizaveta Nyarko","brand":"Lovela","market":"Poland","businessUnit":"Essential Home","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1451,"clientRespMinutes":5608,"firstReplyAt":"2026-03-20 10:43:04","firstAssignedDate":"2026-03-19 17:18:01","fulfillmentDate":"2026-03-19 10:31:40","openedBy":"Rafal Chwesiuk","openedDate":"2026-03-19","closedDate":"","toDoAt":"2026-05-13T16:06:33.413+0200","inUatAt":"2026-06-17T19:25:47.477+0200","jiraKey":"WFN-707","year":"2026","requestedFor":"","openedAt":"2026-03-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-03T15:59:19.000Z"},"RITM2770001":{"state":"Awaiting User Info","shortDesc":"airwick.pl website we want to modify Privacy, Cookie and T&C pages as well as footer","assignedTo":"Elizaveta Nyarko","brand":"Air Wick","market":"Poland","businessUnit":"Essential Home","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1447,"clientRespMinutes":5683,"firstReplyAt":"2026-03-20 10:42:52","firstAssignedDate":"2026-03-19 17:17:52","fulfillmentDate":"2026-03-19 10:35:28","openedBy":"Rafal Chwesiuk","openedDate":"2026-03-19","closedDate":"","toDoAt":"2026-05-13T16:06:28.230+0200","inUatAt":"2026-05-20T09:47:54.783+0200","jiraKey":"WFN-706","year":"2026","requestedFor":"","openedAt":"2026-03-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-03T15:59:51.000Z"},"RITM2770500":{"state":"Closed Complete","shortDesc":"Finish Spain - Blog content optimization (existing articles)","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Spain","businessUnit":"Corporate","finalCost":"720","currencyCode":"EUR","ttfrMinutes":5620,"clientRespMinutes":4854,"firstReplyAt":"2026-03-23 14:04:13","firstAssignedDate":"2026-03-19 16:27:45","fulfillmentDate":"2026-03-19 16:24:14","openedBy":"Jaime Sanchis","openedDate":"2026-03-19","closedDate":"2026-04-26","toDoAt":"2026-03-25T17:15:23.900+0100","inUatAt":"2026-04-01T17:36:31.803+0200","jiraKey":"WFN-704","year":"2026","requestedFor":"","openedAt":"2026-03-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-26T16:21:06.000Z"},"RITM2770518":{"state":"Closed Complete","shortDesc":"Vanish Spain - Blog content optimization (existing articles)","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Spain","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"EUR","ttfrMinutes":5611,"clientRespMinutes":4847,"firstReplyAt":"2026-03-23 14:08:31","firstAssignedDate":"2026-03-19 17:20:50","fulfillmentDate":"2026-03-19 16:37:29","openedBy":"Jaime Sanchis","openedDate":"2026-03-19","closedDate":"2026-04-26","toDoAt":"2026-03-25T17:30:59.777+0100","inUatAt":"2026-03-31T14:42:23.527+0200","jiraKey":"WFN-705","year":"2026","requestedFor":"","openedAt":"2026-03-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-26T16:21:26.000Z"},"RITM2773268":{"state":"Awaiting User Info","shortDesc":"Durex Spain - Website product updates: packshots, discontinued references, and product classifications","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Spain","businessUnit":"Core Reckitt","finalCost":"1584","currencyCode":"EUR","ttfrMinutes":3023,"clientRespMinutes":8412,"firstReplyAt":"2026-03-25 17:05:49","firstAssignedDate":"2026-03-23 18:11:36","fulfillmentDate":"2026-03-23 14:42:52","openedBy":"Jaime Sanchis","openedDate":"2026-03-23","closedDate":"","toDoAt":"2026-05-08T14:53:33.537+0200","inUatAt":"2026-05-15T17:30:56.440+0200","jiraKey":"WFN-711","year":"2026","requestedFor":"","openedAt":"2026-03-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T13:26:00.000Z"},"RITM2773271":{"state":"Closed Complete","shortDesc":"Modification on Finish website","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1613,"clientRespMinutes":9728,"firstReplyAt":"2026-03-24 17:37:09","firstAssignedDate":"2026-03-23 18:15:11","fulfillmentDate":"2026-03-23 14:44:32","openedBy":"Sabrina Zhou","openedDate":"2026-03-23","closedDate":"2026-05-12","toDoAt":"2026-03-27T09:46:22.693+0100","inUatAt":"2026-04-01T19:41:40.337+0200","jiraKey":"WFN-712","year":"2026","requestedFor":"","openedAt":"2026-03-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-12T11:21:01.999Z"},"RITM2774184":{"state":"Closed Complete","shortDesc":"Coupon Update Finish","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":757,"clientRespMinutes":5053,"firstReplyAt":"2026-03-24 22:19:37","firstAssignedDate":"2026-03-24 15:23:25","fulfillmentDate":"2026-03-24 09:42:43","openedBy":"Mia Leimkuhler","openedDate":"2026-03-24","closedDate":"2026-04-13","toDoAt":"2026-03-25T12:50:07.707+0100","inUatAt":"2026-03-26T17:05:35.983+0100","jiraKey":"WFN-713","year":"2026","requestedFor":"","openedAt":"2026-03-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-13T15:21:18.000Z"},"RITM2775046":{"state":"Closed Complete","shortDesc":"Nurofen See My Pain page refresh","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"1320","currencyCode":"GBP","ttfrMinutes":2368,"clientRespMinutes":3006,"firstReplyAt":"2026-03-26 09:07:06","firstAssignedDate":"2026-03-24 22:23:58","fulfillmentDate":"2026-03-24 17:39:32","openedBy":"Charlotte Mizen","openedDate":"2026-03-24","closedDate":"2026-04-25","toDoAt":"2026-03-27T18:44:02.523+0100","inUatAt":"2026-04-02T10:43:29.823+0200","jiraKey":"WFN-714","year":"2026","requestedFor":"","openedAt":"2026-03-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-25T08:21:46.000Z"},"RITM2775089":{"state":"Closed Complete","shortDesc":"Update Banner and Terms & Conditions on Air Wick - National promo","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":4375,"clientRespMinutes":2983,"firstReplyAt":"2026-03-27 19:14:07","firstAssignedDate":"2026-03-24 22:26:59","fulfillmentDate":"2026-03-24 18:18:47","openedBy":"Roberta Migliardi","openedDate":"2026-03-24","closedDate":"2026-04-25","toDoAt":"2026-03-30T13:24:31.650+0200","inUatAt":null,"jiraKey":"WFN-716","year":"2026","requestedFor":"","openedAt":"2026-03-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-25T09:21:22.999Z"},"RITM2775098":{"state":"Closed Complete","shortDesc":"Remove Banner from Air Wick Website","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2288,"clientRespMinutes":5915,"firstReplyAt":"2026-03-26 08:37:38","firstAssignedDate":"2026-03-24 22:26:33","fulfillmentDate":"2026-03-24 18:29:42","openedBy":"Roberta Migliardi","openedDate":"2026-03-24","closedDate":"2026-04-04","toDoAt":"2026-03-25T18:38:51.887+0100","inUatAt":"2026-03-26T13:52:22.597+0100","jiraKey":"WFN-715","year":"2026","requestedFor":"","openedAt":"2026-03-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-04T15:20:52.000Z"},"RITM2775828":{"state":"Closed Cancelled","shortDesc":"Vestacy Corporate Website Improvements","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Netherlands","businessUnit":"Essential Home","finalCost":"","currencyCode":"","ttfrMinutes":151764,"clientRespMinutes":null,"firstReplyAt":"2026-07-08 21:23:40","firstAssignedDate":"2026-03-25 12:43:50","fulfillmentDate":"2026-03-25 11:00:07","openedBy":"Cemre Antmen","openedDate":"2026-03-25","closedDate":"2026-07-15","toDoAt":"2026-08-14T15:28:32.740+0200","inUatAt":null,"jiraKey":"WFN-717","year":"2026","requestedFor":"Cemre Antmen","openedAt":"2026-03-25 11:00:03","stateChangedAt":"2026-07-15 14:44:09","stateChangedBy":"System","lastActivityAt":"2026-07-15 14:43:19","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-07-15T09:44:09.000Z"},"RITM2776272":{"state":"Closed Complete","shortDesc":"Vestacy Corporate Website Content Updates","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Netherlands","businessUnit":"Essential Home","finalCost":"1080","currencyCode":"EUR","ttfrMinutes":9889,"clientRespMinutes":null,"firstReplyAt":"2026-04-01 13:04:53","firstAssignedDate":"2026-03-25 16:17:48","fulfillmentDate":"2026-03-25 15:15:38","openedBy":"Cemre Antmen","openedDate":"2026-03-25","closedDate":"2026-06-08","toDoAt":"2026-04-21T17:31:31.450+0200","inUatAt":null,"jiraKey":"WFN-720","year":"2026","requestedFor":"","openedAt":"2026-03-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-08T17:20:55.000Z"},"RITM2776337":{"state":"Closed Complete","shortDesc":"Website publishing","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":3079,"clientRespMinutes":1149,"firstReplyAt":"2026-03-27 19:19:23","firstAssignedDate":"2026-03-26 08:31:33","fulfillmentDate":"2026-03-25 16:00:54","openedBy":"Paola Cioffi (Inactive)","openedDate":"2026-03-25","closedDate":"2026-04-13","toDoAt":"2026-03-30T13:27:28.783+0200","inUatAt":null,"jiraKey":"WFN-719","year":"2026","requestedFor":"","openedAt":"2026-03-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-13T15:21:11.999Z"},"RITM2778039":{"state":"Closed Complete","shortDesc":"Sole website picture update","assignedTo":"Alesya Prolagayeva","brand":"Sole","market":"Italy","businessUnit":"Essential Home","finalCost":"720","currencyCode":"EUR","ttfrMinutes":1272,"clientRespMinutes":3603,"firstReplyAt":"2026-03-27 15:18:48","firstAssignedDate":"2026-03-27 11:38:15","fulfillmentDate":"2026-03-26 18:06:41","openedBy":"Sara Campanini","openedDate":"2026-03-26","closedDate":"2026-04-26","toDoAt":"2026-03-31T14:40:41.897+0200","inUatAt":"2026-04-01T18:01:54.190+0200","jiraKey":"WFN-721","year":"2026","requestedFor":"","openedAt":"2026-03-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-26T16:21:10.000Z"},"RITM2779719":{"state":"Closed Complete","shortDesc":"Website spelling error","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":133,"clientRespMinutes":8479,"firstReplyAt":"2026-03-27 19:25:44","firstAssignedDate":"2026-03-30 09:29:46","fulfillmentDate":"2026-03-27 17:13:06","openedBy":"Charlotte Mizen","openedDate":"2026-03-27","closedDate":"2026-04-26","toDoAt":"2026-03-30T09:29:30.860+0200","inUatAt":"2026-04-01T16:40:16.267+0200","jiraKey":"WFN-723","year":"2026","requestedFor":"","openedAt":"2026-03-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-26T16:21:22.000Z"},"RITM2781186":{"state":"Closed Complete","shortDesc":"Need to update claims on the Finish UK website as they are currently incorrect.","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":3044,"clientRespMinutes":2966,"firstReplyAt":"2026-04-01 13:51:59","firstAssignedDate":"2026-04-01 13:51:59","fulfillmentDate":"2026-03-30 11:07:36","openedBy":"Mahnur Ali","openedDate":"2026-03-30","closedDate":"2026-07-01","toDoAt":"2026-04-14T21:31:10.827+0200","inUatAt":null,"jiraKey":"WFN-772","year":"2026","requestedFor":"","openedAt":"2026-03-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-01T10:21:26.000Z"},"RITM2781323":{"state":"Closed Complete","shortDesc":"Durex IT - Instructions for Use","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":2935,"clientRespMinutes":5597,"firstReplyAt":"2026-04-01 13:12:44","firstAssignedDate":"2026-03-30 13:29:22","fulfillmentDate":"2026-03-30 12:18:00","openedBy":"Rowena Hearn","openedDate":"2026-03-30","closedDate":"2026-04-28","toDoAt":"2026-04-01T13:46:22.387+0200","inUatAt":"2026-04-09T15:32:38.837+0200","jiraKey":"WFN-718","year":"2026","requestedFor":"","openedAt":"2026-03-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-28T19:21:03.000Z"},"RITM2781739":{"state":"Awaiting User Info","shortDesc":"Modifications to Nurofen's online webiste","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Spain","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":4305,"clientRespMinutes":2115,"firstReplyAt":"2026-04-02 16:06:01","firstAssignedDate":"2026-04-01 09:23:24","fulfillmentDate":"2026-03-30 16:20:54","openedBy":"Diego Cortes De Ita","openedDate":"2026-03-30","closedDate":"","toDoAt":"2026-05-07T14:15:34.470+0200","inUatAt":"2026-06-08T18:57:17.360+0200","jiraKey":"WFN-724","year":"2026","requestedFor":"","openedAt":"2026-03-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T12:46:59.000Z"},"RITM2781763":{"state":"Closed Complete","shortDesc":"Durex Tomorrowland Raffles Form","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"4200","currencyCode":"GBP","ttfrMinutes":9846,"clientRespMinutes":4362,"firstReplyAt":"2026-04-06 12:45:09","firstAssignedDate":"2026-04-01 09:25:10","fulfillmentDate":"2026-03-30 16:39:14","openedBy":"Areeba Imtiaz","openedDate":"2026-03-30","closedDate":"2026-06-08","toDoAt":"2026-04-17T08:46:31.870+0200","inUatAt":"2026-05-15T08:27:23.010+0200","jiraKey":"WFN-725","year":"2026","requestedFor":"","openedAt":"2026-03-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-08T17:21:36.000Z"},"RITM2782465":{"state":"Awaiting User Info","shortDesc":"Update Content on Durex DE-Website","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Germany","businessUnit":"Core Reckitt","finalCost":"3200","currencyCode":"GBP","ttfrMinutes":8794,"clientRespMinutes":9335,"firstReplyAt":"2026-04-06 11:38:15","firstAssignedDate":"2026-04-01 12:22:34","fulfillmentDate":"2026-03-31 09:04:28","openedBy":"Florian Mecking","openedDate":"2026-03-31","closedDate":"","toDoAt":"2026-06-10T11:10:34.683+0200","inUatAt":"2026-06-10T14:55:13.383+0200","jiraKey":"WFN-726","year":"2026","requestedFor":"","openedAt":"2026-03-31","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T13:27:36.999Z"},"RITM2783232":{"state":"Closed Cancelled","shortDesc":"New NPD integration in already existing website: https://www.fybo.co.uk/","assignedTo":"Alesya Prolagayeva","brand":"Fybogel","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":4185,"clientRespMinutes":961,"firstReplyAt":"2026-04-03 12:43:06","firstAssignedDate":"2026-04-01 12:33:12","fulfillmentDate":"2026-03-31 14:58:19","openedBy":"Chaimaa Amisnau","openedDate":"2026-03-31","closedDate":"2026-04-16","toDoAt":"2026-08-14T15:28:32.857+0200","inUatAt":null,"jiraKey":"WFN-728","year":"2026","requestedFor":"Chaimaa Amisnau","openedAt":"2026-03-31 14:58:16","stateChangedAt":"2026-04-16 16:38:06","stateChangedBy":"System","lastActivityAt":"2026-04-09 10:32:02","lastActivityBy":"Chaimaa Amisnau","_updated":"2026-04-16T11:38:06.000Z"},"RITM2783397":{"state":"Closed Complete","shortDesc":"Remove webpage – https://www.dettol.co.uk/purpose/sustainability-efforts/","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1226,"clientRespMinutes":1531,"firstReplyAt":"2026-04-01 13:00:10","firstAssignedDate":"2026-04-01 12:27:15","fulfillmentDate":"2026-03-31 16:33:49","openedBy":"Naz Beedassy","openedDate":"2026-03-31","closedDate":"2026-05-10","toDoAt":"2026-04-01T13:49:07.540+0200","inUatAt":"2026-04-01T15:47:23.140+0200","jiraKey":"WFN-727","year":"2026","requestedFor":"","openedAt":"2026-03-31","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-10T16:21:05.000Z"},"RITM2784412":{"state":"Closed Complete","shortDesc":"Dettol Nigeria plans to run hospital activations nationwide, with digital data collection as a core component. A form similar to the shared example is needed, integrated with CRM and CCDP, to capture key user details including name, contact information, location, and pregnancy timing.","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"Nigeria","businessUnit":"Core Reckitt","finalCost":"1000","currencyCode":"GBP","ttfrMinutes":2896,"clientRespMinutes":5707,"firstReplyAt":"2026-04-03 11:42:51","firstAssignedDate":"2026-04-03 11:42:51","fulfillmentDate":"2026-04-01 11:27:10","openedBy":"David Jemirin","openedDate":"2026-04-01","closedDate":"2026-07-27","toDoAt":"2026-05-28T17:41:34.620+0200","inUatAt":null,"jiraKey":"WFN-847","year":"2026","requestedFor":"","openedAt":"2026-04-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-27T15:35:43.000Z"},"RITM2785114":{"state":"Closed Complete","shortDesc":"Privacy Email Changes for all Vestacy Websites","assignedTo":"Alesya Prolagayeva","brand":"Multibrand","market":"Netherlands","businessUnit":"Essential Home","finalCost":"2880","currencyCode":"EUR","ttfrMinutes":2566,"clientRespMinutes":1580,"firstReplyAt":"2026-04-03 11:59:16","firstAssignedDate":"2026-04-02 10:31:11","fulfillmentDate":"2026-04-01 17:13:28","openedBy":"Cemre Antmen","openedDate":"2026-04-01","closedDate":"2026-08-07","toDoAt":"2026-04-07T14:55:39.670+0200","inUatAt":"2026-05-11T10:05:03.730+0200","jiraKey":"WFN-731","year":"2026","requestedFor":"","openedAt":"2026-04-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-07T08:32:34.000Z"},"RITM2785234":{"state":"Closed Complete","shortDesc":"FINISH FR WEBSITE ISSUE","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"France","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":989,"clientRespMinutes":2166,"firstReplyAt":"2026-04-02 10:51:05","firstAssignedDate":"2026-04-02 10:13:23","fulfillmentDate":"2026-04-01 18:22:16","openedBy":"Marie Albert","openedDate":"2026-04-01","closedDate":"2026-04-25","toDoAt":"2026-08-14T15:28:29.660+0200","inUatAt":null,"jiraKey":"WFN-730","year":"2026","requestedFor":"","openedAt":"2026-04-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-25T09:21:29.000Z"},"RITM2786387":{"state":"Closed Complete","shortDesc":"Dettol Website Issues","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":20090,"clientRespMinutes":8347,"firstReplyAt":"2026-04-16 10:16:33","firstAssignedDate":"2026-04-02 15:41:28","fulfillmentDate":"2026-04-02 11:26:39","openedBy":"Despoina Chronopoulou","openedDate":"2026-04-02","closedDate":"2026-07-28","toDoAt":"2026-04-22T11:02:55.363+0200","inUatAt":null,"jiraKey":"WFN-732","year":"2026","requestedFor":"","openedAt":"2026-04-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-28T07:19:32.999Z"},"RITM2786705":{"state":"Closed Cancelled","shortDesc":"Durex Website Issues","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Greece","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":8835,"clientRespMinutes":null,"firstReplyAt":"2026-04-08 17:37:02","firstAssignedDate":"2026-04-02 15:41:35","fulfillmentDate":"2026-04-02 14:22:21","openedBy":"Xanthi Skorda","openedDate":"2026-04-02","closedDate":"2026-07-09","toDoAt":"2026-08-14T15:28:32.970+0200","inUatAt":null,"jiraKey":"WFN-733","year":"2026","requestedFor":"Xanthi Skorda","openedAt":"2026-04-02 14:22:18","stateChangedAt":"2026-07-09 10:53:38","stateChangedBy":"System","lastActivityAt":"2026-07-09 10:53:15","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-07-09T05:53:38.000Z"},"RITM2787021":{"state":"Closed Complete","shortDesc":"Please remove \"Aumenta l’idratazione e il comfort per un esperienza sessuale senza interruzioni\" from the following product description pages: - https://www.durex.it/products/durex-real-feel-gel-lubrificante - https://www.durex.it/products/durex-eternal-connection-gel-lubrificante","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":5453,"clientRespMinutes":2640,"firstReplyAt":"2026-04-06 12:08:32","firstAssignedDate":"2026-04-03 09:58:55","fulfillmentDate":"2026-04-02 17:15:23","openedBy":"Franziska Boesebeck","openedDate":"2026-04-02","closedDate":"2026-05-19","toDoAt":"2026-04-03T13:55:51.923+0200","inUatAt":null,"jiraKey":"WFN-735","year":"2026","requestedFor":"","openedAt":"2026-04-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-19T11:21:16.000Z"},"RITM2787152":{"state":"Work In Progress","shortDesc":"Website update | new content","assignedTo":"Damian Casasnovas","brand":"Multibrand","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"13333","currencyCode":"MXN","ttfrMinutes":147,"clientRespMinutes":35953,"firstReplyAt":"2026-04-02 22:24:57","firstAssignedDate":"2026-04-02 21:51:35","fulfillmentDate":"2026-04-02 19:57:42","openedBy":"Larissa Batistetti","openedDate":"2026-04-02","closedDate":"2026-05-01","toDoAt":"2026-04-10T12:26:28.707+0200","inUatAt":"2026-04-23T16:57:18.267+0200","jiraKey":"WFN-734","year":"2026","requestedFor":"","openedAt":"2026-04-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-27T18:45:20.000Z"},"RITM2788964":{"state":"Awaiting User Info","shortDesc":"Technical SEO Changes","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":3208,"clientRespMinutes":5542,"firstReplyAt":"2026-04-08 17:26:17","firstAssignedDate":"2026-04-06 12:08:57","fulfillmentDate":"2026-04-06 11:58:01","openedBy":"Mina Yilmaz","openedDate":"2026-04-06","closedDate":"","toDoAt":"2026-08-14T15:28:33.097+0200","inUatAt":null,"jiraKey":"WFN-767","year":"2026","requestedFor":"","openedAt":"2026-04-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T14:30:10.000Z"},"RITM2789176":{"state":"Closed Complete","shortDesc":"microsite update change - contest 30/4-13/5","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":5438,"clientRespMinutes":8907,"firstReplyAt":"2026-04-10 09:18:29","firstAssignedDate":"2026-04-06 17:40:25","fulfillmentDate":"2026-04-06 14:40:13","openedBy":"Froso Liapodimitri","openedDate":"2026-04-06","closedDate":"2026-06-08","toDoAt":"2026-04-15T21:03:49.603+0200","inUatAt":"2026-05-13T18:01:30.630+0200","jiraKey":"WFN-768","year":"2026","requestedFor":"","openedAt":"2026-04-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-08T17:21:25.000Z"},"RITM2790608":{"state":"Closed Incomplete","shortDesc":"Update of websites","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"France","businessUnit":"Essential Home","finalCost":"","currencyCode":"","ttfrMinutes":1591,"clientRespMinutes":17746,"firstReplyAt":"2026-04-08 16:51:30","firstAssignedDate":"2026-04-08 15:58:48","fulfillmentDate":"2026-04-07 14:20:36","openedBy":"Carla Moyal (Inactive)","openedDate":"2026-04-07","closedDate":"2026-08-18","toDoAt":"2026-05-05T19:05:56.560+0200","inUatAt":null,"jiraKey":"WFN-769","year":"2026","requestedFor":"Carla Moyal (Inactive)","openedAt":"2026-04-07 14:20:33","stateChangedAt":"2026-08-18 16:19:33","stateChangedBy":"System","lastActivityAt":"2026-08-07 13:34:54","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-08-18T11:19:33.000Z"},"RITM2791866":{"state":"Closed Complete","shortDesc":"Update of Hungarian Gaviscon website with Double Action range","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Hungary","businessUnit":"Core Reckitt","finalCost":"1800","currencyCode":"GBP","ttfrMinutes":1614,"clientRespMinutes":4826,"firstReplyAt":"2026-04-09 14:07:33","firstAssignedDate":"2026-04-08 15:59:12","fulfillmentDate":"2026-04-08 11:13:16","openedBy":"Eszter Balogh","openedDate":"2026-04-08","closedDate":"2026-06-03","toDoAt":"2026-05-14T15:28:37.660+0200","inUatAt":"2026-05-27T10:40:02.700+0200","jiraKey":"WFN-770","year":"2026","requestedFor":"","openedAt":"2026-04-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-03T15:21:17.000Z"},"RITM2793419":{"state":"Closed Complete","shortDesc":"Landing Page Berry Campaign","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":5708,"clientRespMinutes":1946,"firstReplyAt":"2026-04-13 11:07:18","firstAssignedDate":"2026-04-13 11:07:18","fulfillmentDate":"2026-04-09 11:59:41","openedBy":"Roberta Ramponi","openedDate":"2026-04-09","closedDate":"2026-08-10","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-855","year":"2026","requestedFor":"","openedAt":"2026-04-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-10T12:09:58.000Z"},"RITM2793460":{"state":"Closed Complete","shortDesc":"Create a new page within the promo section (https://www.durex.it/blogs/promo)","assignedTo":"Elizaveta Nyarko","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1874,"clientRespMinutes":5798,"firstReplyAt":"2026-04-10 19:29:39","firstAssignedDate":"2026-04-10 13:53:15","fulfillmentDate":"2026-04-09 12:15:25","openedBy":"Franziska Boesebeck","openedDate":"2026-04-09","closedDate":"2026-05-25","toDoAt":"2026-04-28T10:16:12.910+0200","inUatAt":null,"jiraKey":"WFN-778","year":"2026","requestedFor":"","openedAt":"2026-04-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-25T08:21:16.000Z"},"RITM2794004":{"state":"Closed Complete","shortDesc":"Correcting errors & missing links","assignedTo":"Tatyana Samoylenko","brand":"Air Wick","market":"Netherlands","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1213,"clientRespMinutes":3990,"firstReplyAt":"2026-04-10 13:33:16","firstAssignedDate":"2026-04-10 13:16:54","fulfillmentDate":"2026-04-09 17:20:39","openedBy":"Pamela White","openedDate":"2026-04-09","closedDate":"2026-05-09","toDoAt":"2026-04-15T13:49:06.303+0200","inUatAt":null,"jiraKey":"WFN-773","year":"2026","requestedFor":"","openedAt":"2026-04-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-09T12:21:22.999Z"},"RITM2796967":{"state":"Closed Complete","shortDesc":"Durex ES - Fix Amazon buy buttons to link to individual product pages","assignedTo":"Tatyana Samoylenko","brand":"Durex","market":"Spain","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"EUR","ttfrMinutes":5623,"clientRespMinutes":1404,"firstReplyAt":"2026-04-17 09:33:54","firstAssignedDate":"2026-04-15 09:28:50","fulfillmentDate":"2026-04-13 11:51:04","openedBy":"Jaime Sanchis","openedDate":"2026-04-13","closedDate":"2026-05-06","toDoAt":"2026-04-17T09:50:36.423+0200","inUatAt":"2026-04-21T14:19:29.953+0200","jiraKey":"WFN-777","year":"2026","requestedFor":"","openedAt":"2026-04-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-06T17:21:07.000Z"},"RITM2797301":{"state":"Awaiting User Info","shortDesc":"Finnish Website Update","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Denmark","businessUnit":"Core Reckitt","finalCost":"1932","currencyCode":"GBP","ttfrMinutes":40365,"clientRespMinutes":10139,"firstReplyAt":"2026-05-11 16:08:16","firstAssignedDate":"2026-04-15 16:09:44","fulfillmentDate":"2026-04-13 15:23:02","openedBy":"Alicia Murphy (Inactive)","openedDate":"2026-04-13","closedDate":"","toDoAt":"2026-06-12T10:04:12.270+0200","inUatAt":"2026-06-22T12:47:22.407+0200","jiraKey":"WFN-776","year":"2026","requestedFor":"","openedAt":"2026-04-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T13:22:26.999Z"},"RITM2797459":{"state":"Awaiting User Info","shortDesc":"Danish Website Update","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Denmark","businessUnit":"Core Reckitt","finalCost":"1934","currencyCode":"GBP","ttfrMinutes":5297,"clientRespMinutes":5550,"firstReplyAt":"2026-04-17 08:55:42","firstAssignedDate":"2026-04-15 15:30:35","fulfillmentDate":"2026-04-13 16:38:37","openedBy":"Alicia Murphy (Inactive)","openedDate":"2026-04-13","closedDate":"","toDoAt":"2026-05-11T16:11:09.733+0200","inUatAt":"2026-07-27T17:06:23.573+0200","jiraKey":"WFN-775","year":"2026","requestedFor":"","openedAt":"2026-04-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T14:44:09.999Z"},"RITM2797647":{"state":"Closed Complete","shortDesc":"Technical implementations","assignedTo":"Damian Casasnovas","brand":"Veja","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":212,"clientRespMinutes":26759,"firstReplyAt":"2026-04-13 22:46:20","firstAssignedDate":"2026-04-15 15:27:56","fulfillmentDate":"2026-04-13 19:14:11","openedBy":"Larissa Batistetti","openedDate":"2026-04-13","closedDate":"2026-06-29","toDoAt":null,"inUatAt":"2026-04-24T16:23:40.797+0200","jiraKey":"WFN-798","year":"2026","requestedFor":"","openedAt":"2026-04-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-29T20:20:56.000Z"},"RITM2800195":{"state":"Closed Cancelled","shortDesc":"Homepage Update of the Harpic website","assignedTo":"Alesya Prolagayeva","brand":"Harpic","market":"France","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":2527,"clientRespMinutes":4557,"firstReplyAt":"2026-04-17 08:57:01","firstAssignedDate":"2026-04-15 15:27:39","fulfillmentDate":"2026-04-15 14:50:31","openedBy":"Shreyash Goenka (Inactive)","openedDate":"2026-04-15","closedDate":"2026-06-30","toDoAt":"2026-08-14T15:28:33.227+0200","inUatAt":null,"jiraKey":"WFN-774","year":"2026","requestedFor":"Shreyash Goenka (Inactive)","openedAt":"2026-04-15 14:50:28","stateChangedAt":"2026-06-30 17:51:07","stateChangedBy":"System","lastActivityAt":"2026-06-30 17:50:41","lastActivityBy":"Alesya Prolagayeva","_updated":"2026-06-30T12:51:07.000Z"},"RITM2800530":{"state":"Closed Complete","shortDesc":"Technical implementations","assignedTo":"Damian Casasnovas","brand":"Multibrand","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":90642,"clientRespMinutes":50212,"firstReplyAt":"2026-06-17 17:43:38","firstAssignedDate":"2026-05-07 14:10:43","fulfillmentDate":"2026-04-15 19:01:12","openedBy":"Larissa Batistetti","openedDate":"2026-04-15","closedDate":"2026-07-08","toDoAt":"2026-04-23T16:55:25.297+0200","inUatAt":"2026-07-29T04:14:15.247+0200","jiraKey":"WFN-799","year":"2026","requestedFor":"","openedAt":"2026-04-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-08T15:20:51.000Z"},"RITM2801809":{"state":"Closed Complete","shortDesc":"replacement of a document","assignedTo":"Elizaveta Nyarko","brand":"reckitt.com","market":"Italy","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":5844,"clientRespMinutes":200,"firstReplyAt":"2026-04-20 19:12:37","firstAssignedDate":"2026-04-17 08:57:43","fulfillmentDate":"2026-04-16 17:49:07","openedBy":"Michela Mariano","openedDate":"2026-04-16","closedDate":"2026-06-30","toDoAt":"2026-04-20T11:43:14.040+0200","inUatAt":"2026-04-20T16:55:35.070+0200","jiraKey":"WFN-779","year":"2026","requestedFor":"","openedAt":"2026-04-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-30T12:21:05.999Z"},"RITM2804126":{"state":"Closed Complete","shortDesc":"Brief Durex FR Website - Deployment of improvements on the website","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"France","businessUnit":"Core Reckitt","finalCost":"1440","currencyCode":"EUR","ttfrMinutes":3002,"clientRespMinutes":6668,"firstReplyAt":"2026-04-22 11:53:37","firstAssignedDate":"2026-04-20 11:51:49","fulfillmentDate":"2026-04-20 09:51:29","openedBy":"Sara Do Vale Afonso (Inactive)","openedDate":"2026-04-20","closedDate":"2026-07-14","toDoAt":"2026-04-23T22:25:41.050+0200","inUatAt":"2026-05-11T15:54:30.847+0200","jiraKey":"WFN-781","year":"2026","requestedFor":"","openedAt":"2026-04-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-14T08:21:50.000Z"},"RITM2804266":{"state":"Fulfilled","shortDesc":"Update Product Pages on Durex","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"France","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":1821,"clientRespMinutes":2445,"firstReplyAt":"2026-04-21 17:38:48","firstAssignedDate":"2026-04-20 11:46:22","fulfillmentDate":"2026-04-20 11:17:57","openedBy":"Anaelle Yao","openedDate":"2026-04-20","closedDate":"2026-07-13","toDoAt":"2026-05-14T13:59:42.173+0200","inUatAt":"2026-04-21T15:21:47.047+0200","jiraKey":"WFN-780","year":"2026","requestedFor":"","openedAt":"2026-04-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-13T16:16:21.999Z"},"RITM2804786":{"state":"Closed Cancelled","shortDesc":"Nurofen Website Issues","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Greece","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1670,"clientRespMinutes":139,"firstReplyAt":"2026-04-21 19:34:41","firstAssignedDate":"2026-04-21 10:00:04","fulfillmentDate":"2026-04-20 15:44:45","openedBy":"Eleni Tsatsou","openedDate":"2026-04-20","closedDate":"2026-05-08","toDoAt":"2026-08-14T15:28:33.367+0200","inUatAt":null,"jiraKey":"WFN-782","year":"2026","requestedFor":"Eleni Tsatsou","openedAt":"2026-04-20 15:44:42","stateChangedAt":"2026-05-08 16:34:21","stateChangedBy":"System","lastActivityAt":"2026-08-05 09:09:05","lastActivityBy":"Eleni Tsatsou","_updated":"2026-08-05T04:09:05.000Z"},"RITM2804851":{"state":"Closed Complete","shortDesc":"General Website Update Denmark","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Denmark","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":2618,"clientRespMinutes":6273,"firstReplyAt":"2026-04-22 11:52:23","firstAssignedDate":"2026-04-21 10:13:12","fulfillmentDate":"2026-04-20 16:14:34","openedBy":"Alicia Murphy (Inactive)","openedDate":"2026-04-20","closedDate":"2026-06-30","toDoAt":"2026-05-05T19:13:29.120+0200","inUatAt":"2026-05-12T12:45:54.083+0200","jiraKey":"WFN-783","year":"2026","requestedFor":"","openedAt":"2026-04-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-30T11:21:37.000Z"},"RITM2804881":{"state":"Work In Progress","shortDesc":"Durex FR - Pastel","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"France","businessUnit":"Core Reckitt","finalCost":"2000","currencyCode":"GBP","ttfrMinutes":1162,"clientRespMinutes":8239,"firstReplyAt":"2026-04-21 11:55:12","firstAssignedDate":"2026-04-21 10:18:16","fulfillmentDate":"2026-04-20 16:33:17","openedBy":"Rowena Hearn","openedDate":"2026-04-20","closedDate":"","toDoAt":"2026-05-05T19:24:57.400+0200","inUatAt":"2026-08-25T13:20:30.000+0200","jiraKey":"WFN-784","year":"2026","requestedFor":"","openedAt":"2026-04-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T14:28:56.000Z"},"RITM2804992":{"state":"Closed Complete","shortDesc":"Destope Website Updates","assignedTo":"Alesya Prolagayeva","brand":"Destop","market":"France","businessUnit":"Essential Home","finalCost":"508","currencyCode":"EUR","ttfrMinutes":995,"clientRespMinutes":6570,"firstReplyAt":"2026-04-21 10:23:01","firstAssignedDate":"2026-04-21 10:23:01","fulfillmentDate":"2026-04-20 17:47:43","openedBy":"Giovanna Marino (Inactive)","openedDate":"2026-04-20","closedDate":"2026-08-19","toDoAt":"2026-04-22T19:01:04.437+0200","inUatAt":"2026-05-22T10:49:57.083+0200","jiraKey":"WFN-788","year":"2026","requestedFor":"","openedAt":"2026-04-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T13:26:02.000Z"},"RITM2805752":{"state":"Closed Complete","shortDesc":"UPDATES TO VANISH UK WEBPAGES","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"GBP","ttfrMinutes":3604,"clientRespMinutes":4418,"firstReplyAt":"2026-04-23 22:32:57","firstAssignedDate":"2026-04-22 12:53:03","fulfillmentDate":"2026-04-21 10:28:45","openedBy":"Rosie Huggon","openedDate":"2026-04-21","closedDate":"2026-05-25","toDoAt":"2026-04-28T19:02:48.067+0200","inUatAt":"2026-05-05T16:56:39.750+0200","jiraKey":"WFN-791","year":"2026","requestedFor":"","openedAt":"2026-04-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-25T13:21:38.000Z"},"RITM2805838":{"state":"On hold","shortDesc":"Durex UK - Nold/Erectile Dysfunction","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"6000","currencyCode":"GBP","ttfrMinutes":20661,"clientRespMinutes":7339,"firstReplyAt":"2026-05-05 19:30:03","firstAssignedDate":"2026-04-22 12:54:28","fulfillmentDate":"2026-04-21 11:09:12","openedBy":"Rowena Hearn","openedDate":"2026-04-21","closedDate":"","toDoAt":"2026-04-23T09:50:09.140+0200","inUatAt":"2026-05-22T10:49:39.953+0200","jiraKey":"WFN-792","year":"2026","requestedFor":"","openedAt":"2026-04-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T10:31:54.000Z"},"RITM2807333":{"state":"Awaiting User Info","shortDesc":"Norwegian Website Update","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Denmark","businessUnit":"Core Reckitt","finalCost":"1934","currencyCode":"GBP","ttfrMinutes":8774,"clientRespMinutes":10143,"firstReplyAt":"2026-04-28 13:00:05","firstAssignedDate":"2026-04-22 12:02:44","fulfillmentDate":"2026-04-22 10:46:32","openedBy":"Alicia Murphy (Inactive)","openedDate":"2026-04-22","closedDate":"","toDoAt":"2026-06-12T10:04:19.900+0200","inUatAt":"2026-06-22T12:49:15.607+0200","jiraKey":"WFN-790","year":"2026","requestedFor":"","openedAt":"2026-04-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T14:44:39.000Z"},"RITM2807438":{"state":"Closed Complete","shortDesc":"General Website Update Norway","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Denmark","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":11497,"clientRespMinutes":4854,"firstReplyAt":"2026-04-30 11:13:38","firstAssignedDate":"2026-04-22 11:56:47","fulfillmentDate":"2026-04-22 11:37:11","openedBy":"Alicia Murphy (Inactive)","openedDate":"2026-04-22","closedDate":"2026-07-01","toDoAt":"2026-05-05T19:32:32.140+0200","inUatAt":"2026-05-12T13:22:39.493+0200","jiraKey":"WFN-789","year":"2026","requestedFor":"","openedAt":"2026-04-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-01T10:21:16.999Z"},"RITM2807477":{"state":"Closed Complete","shortDesc":"Durex Non-Conformance - UK & FR","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":11472,"clientRespMinutes":9061,"firstReplyAt":"2026-04-30 11:09:04","firstAssignedDate":"2026-04-22 13:00:29","fulfillmentDate":"2026-04-22 11:57:22","openedBy":"Rowena Hearn","openedDate":"2026-04-22","closedDate":"2026-06-10","toDoAt":"2026-04-28T10:16:01.353+0200","inUatAt":"2026-05-27T11:03:42.543+0200","jiraKey":"WFN-793","year":"2026","requestedFor":"","openedAt":"2026-04-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-10T12:23:17.000Z"},"RITM2807959":{"state":"Closed Complete","shortDesc":"Addition of Vanish Money Back Guarantee to Vanish Homepage","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":1106,"clientRespMinutes":1689,"firstReplyAt":"2026-04-23 10:48:57","firstAssignedDate":"2026-04-23 10:48:57","fulfillmentDate":"2026-04-22 16:23:01","openedBy":"Rosie Huggon","openedDate":"2026-04-22","closedDate":"2026-06-21","toDoAt":"2026-05-22T09:57:00.360+0200","inUatAt":"2026-05-25T09:37:50.597+0200","jiraKey":"WFN-860","year":"2026","requestedFor":"","openedAt":"2026-04-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-21T17:21:04.000Z"},"RITM2808030":{"state":"Closed Complete","shortDesc":"URGENT: Finish Turkey","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1553,"clientRespMinutes":157,"firstReplyAt":"2026-04-23 18:53:02","firstAssignedDate":"2026-04-23 10:49:14","fulfillmentDate":"2026-04-22 16:59:48","openedBy":"Rowena Hearn","openedDate":"2026-04-22","closedDate":"2026-05-05","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-04-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-05T08:21:52.000Z"},"RITM2808841":{"state":"Closed Complete","shortDesc":"Urgent: Finish Sweden re-direct","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Sweden","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":124,"clientRespMinutes":10,"firstReplyAt":"2026-04-23 12:35:54","firstAssignedDate":"2026-04-23 10:49:19","fulfillmentDate":"2026-04-23 10:32:06","openedBy":"Rowena Hearn","openedDate":"2026-04-23","closedDate":"2026-04-28","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-04-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-04-28T12:21:14.000Z"},"RITM2810301":{"state":"Closed Complete","shortDesc":"Impressum Update","assignedTo":"Alesya Prolagayeva","brand":"Calgon","market":"Germany","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":5926,"clientRespMinutes":2515,"firstReplyAt":"2026-04-28 13:03:54","firstAssignedDate":"2026-04-27 10:16:09","fulfillmentDate":"2026-04-24 10:18:09","openedBy":"Milena Desch","openedDate":"2026-04-24","closedDate":"2026-06-30","toDoAt":"2026-06-16T16:07:27.063+0200","inUatAt":"2026-04-28T14:03:44.840+0200","jiraKey":"WFN-802","year":"2026","requestedFor":"","openedAt":"2026-04-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-30T11:21:37.000Z"},"RITM2810684":{"state":"Closed Complete","shortDesc":"Website update - Headache diary","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Hungary","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":7474,"clientRespMinutes":4431,"firstReplyAt":"2026-04-29 19:06:00","firstAssignedDate":"2026-04-27 10:18:47","fulfillmentDate":"2026-04-24 14:31:53","openedBy":"Gina Boldizsar","openedDate":"2026-04-24","closedDate":"2026-05-19","toDoAt":"2026-04-27T17:42:58.963+0200","inUatAt":null,"jiraKey":"WFN-803","year":"2026","requestedFor":"","openedAt":"2026-04-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-19T13:20:59.000Z"},"RITM2810744":{"state":"Closed Complete","shortDesc":"Finish HU, SI, HR","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Core Reckitt","finalCost":"400","currencyCode":"GBP","ttfrMinutes":4054,"clientRespMinutes":null,"firstReplyAt":"2026-04-27 10:53:14","firstAssignedDate":"2026-04-27 10:53:14","fulfillmentDate":"2026-04-24 15:19:06","openedBy":"Rowena Hearn","openedDate":"2026-04-24","closedDate":"2026-05-03","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-04-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-03T10:21:28.999Z"},"RITM2810823":{"state":"Awaiting User Info","shortDesc":"Benagol.it website modifications needed","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Italy","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"EUR","ttfrMinutes":5575,"clientRespMinutes":11170,"firstReplyAt":"2026-04-28 13:07:51","firstAssignedDate":"2026-04-27 10:12:40","fulfillmentDate":"2026-04-24 16:12:48","openedBy":"Martina Ridolfo","openedDate":"2026-04-24","closedDate":"","toDoAt":"2026-04-29T18:46:53.083+0200","inUatAt":"2026-07-13T19:03:54.367+0200","jiraKey":"WFN-801","year":"2026","requestedFor":"","openedAt":"2026-04-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T14:11:18.000Z"},"RITM2811981":{"state":"Awaiting User Info","shortDesc":"Strepsils Website Redirection plan and SEO changes","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"France","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"EUR","ttfrMinutes":4335,"clientRespMinutes":5500,"firstReplyAt":"2026-04-30 10:16:52","firstAssignedDate":"2026-04-27 10:10:57","fulfillmentDate":"2026-04-27 10:02:08","openedBy":"Inass Berrada (Inactive)","openedDate":"2026-04-27","closedDate":"","toDoAt":"2026-05-07T13:55:18.773+0200","inUatAt":"2026-08-26T16:39:25.320+0200","jiraKey":"WFN-800","year":"2026","requestedFor":"","openedAt":"2026-04-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T14:52:02.000Z"},"RITM2811998":{"state":"Closed Complete","shortDesc":"IFU regulatory update​","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Sweden","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1622,"clientRespMinutes":3092,"firstReplyAt":"2026-04-28 13:10:31","firstAssignedDate":"2026-04-27 10:36:01","fulfillmentDate":"2026-04-27 10:08:36","openedBy":"Hye Sun Lim","openedDate":"2026-04-27","closedDate":"2026-05-07","toDoAt":null,"inUatAt":"2026-04-29T13:59:19.107+0200","jiraKey":"WFN-807","year":"2026","requestedFor":"","openedAt":"2026-04-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-07T10:44:17.000Z"},"RITM2812003":{"state":"Closed Complete","shortDesc":"IFU regulatory update","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Denmark","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1620,"clientRespMinutes":4502,"firstReplyAt":"2026-04-28 13:11:03","firstAssignedDate":"2026-04-27 10:34:26","fulfillmentDate":"2026-04-27 10:11:06","openedBy":"Hye Sun Lim","openedDate":"2026-04-27","closedDate":"2026-05-07","toDoAt":null,"inUatAt":"2026-04-29T13:59:14.517+0200","jiraKey":"WFN-806","year":"2026","requestedFor":"","openedAt":"2026-04-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-07T10:45:19.000Z"},"RITM2812005":{"state":"Closed Complete","shortDesc":"IFU regulatory update","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Norway","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1619,"clientRespMinutes":4502,"firstReplyAt":"2026-04-28 13:11:26","firstAssignedDate":"2026-04-27 10:32:44","fulfillmentDate":"2026-04-27 10:12:21","openedBy":"Hye Sun Lim","openedDate":"2026-04-27","closedDate":"2026-05-12","toDoAt":null,"inUatAt":"2026-04-29T13:59:08.243+0200","jiraKey":"WFN-805","year":"2026","requestedFor":"","openedAt":"2026-04-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-12T11:21:25.000Z"},"RITM2812007":{"state":"Closed Complete","shortDesc":"IFU regulatory update","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Finland","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1618,"clientRespMinutes":4503,"firstReplyAt":"2026-04-28 13:11:51","firstAssignedDate":"2026-04-27 10:31:49","fulfillmentDate":"2026-04-27 10:13:25","openedBy":"Hye Sun Lim","openedDate":"2026-04-27","closedDate":"2026-05-12","toDoAt":null,"inUatAt":"2026-04-29T13:58:53.850+0200","jiraKey":"WFN-804","year":"2026","requestedFor":"","openedAt":"2026-04-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-12T11:21:30.000Z"},"RITM2812250":{"state":"Closed Complete","shortDesc":"General Website Update Finland","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Denmark","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":4160,"clientRespMinutes":5969,"firstReplyAt":"2026-04-30 10:11:50","firstAssignedDate":"2026-04-28 13:12:14","fulfillmentDate":"2026-04-27 12:51:37","openedBy":"Alicia Murphy (Inactive)","openedDate":"2026-04-27","closedDate":"2026-06-30","toDoAt":"2026-05-05T17:17:06.027+0200","inUatAt":"2026-05-12T16:21:50.063+0200","jiraKey":"WFN-808","year":"2026","requestedFor":"","openedAt":"2026-04-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-30T11:21:38.000Z"},"RITM2812290":{"state":"Closed Complete","shortDesc":"Update renders of packs on S&S web","assignedTo":"Elizaveta Nyarko","brand":"Strepsils","market":"Spain","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":11828,"clientRespMinutes":5622,"firstReplyAt":"2026-05-05 18:18:30","firstAssignedDate":"2026-04-28 13:15:41","fulfillmentDate":"2026-04-27 13:11:01","openedBy":"Diego Cortes De Ita","openedDate":"2026-04-27","closedDate":"2026-08-26","toDoAt":"2026-04-29T20:02:52.220+0200","inUatAt":"2026-05-04T13:17:20.670+0200","jiraKey":"WFN-809","year":"2026","requestedFor":"","openedAt":"2026-04-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T10:07:13.000Z"},"RITM2812433":{"state":"Closed Complete","shortDesc":"Change text in URL FINISH","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1647,"clientRespMinutes":1329,"firstReplyAt":"2026-04-28 17:43:45","firstAssignedDate":"2026-04-28 13:19:28","fulfillmentDate":"2026-04-27 14:16:22","openedBy":"Loris Vignati","openedDate":"2026-04-27","closedDate":"2026-05-10","toDoAt":"2026-04-28T13:25:00.667+0200","inUatAt":"2026-04-29T09:39:15.410+0200","jiraKey":"WFN-810","year":"2026","requestedFor":"","openedAt":"2026-04-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-10T17:21:01.000Z"},"RITM2812590":{"state":"Closed Complete","shortDesc":"Finish website change code QR","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Poland","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1296,"clientRespMinutes":797,"firstReplyAt":"2026-04-28 13:28:40","firstAssignedDate":"2026-04-28 13:28:40","fulfillmentDate":"2026-04-27 15:52:34","openedBy":"Klara Marzec","openedDate":"2026-04-27","closedDate":"2026-06-08","toDoAt":"2026-05-05T15:07:19.560+0200","inUatAt":null,"jiraKey":"WFN-827","year":"2026","requestedFor":"","openedAt":"2026-04-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-08T18:20:56.999Z"},"RITM2813698":{"state":"Closed Complete","shortDesc":"Urgent: Finish Connected Sampling - CZ & SK","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Czech Republic","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":116,"clientRespMinutes":10379,"firstReplyAt":"2026-04-28 13:32:44","firstAssignedDate":"2026-04-28 13:32:44","fulfillmentDate":"2026-04-28 11:36:56","openedBy":"Rowena Hearn","openedDate":"2026-04-28","closedDate":"2026-05-12","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-04-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-12T11:21:07.000Z"},"RITM2814319":{"state":"Closed Complete","shortDesc":"Action Required from IMEX for Performa SKU PDPs on website","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Belgium","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":10246,"clientRespMinutes":null,"firstReplyAt":"2026-05-05 20:13:50","firstAssignedDate":"2026-04-29 13:15:31","fulfillmentDate":"2026-04-28 17:27:37","openedBy":"Valeria Bonannella (Inactive)","openedDate":"2026-04-28","closedDate":"2026-08-14","toDoAt":"2026-04-29T13:17:45.593+0200","inUatAt":null,"jiraKey":"WFN-812","year":"2026","requestedFor":"","openedAt":"2026-04-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-14T15:20:30.000Z"},"RITM2814322":{"state":"Closed Complete","shortDesc":"Finish - Urgent Work (Divya & Clare","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Poland","businessUnit":"Core Reckitt","finalCost":"240","currencyCode":"GBP","ttfrMinutes":94,"clientRespMinutes":501,"firstReplyAt":"2026-04-28 19:03:47","firstAssignedDate":"2026-04-29 13:28:44","fulfillmentDate":"2026-04-28 17:30:20","openedBy":"Rowena Hearn","openedDate":"2026-04-28","closedDate":"2026-05-12","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"Rowena Hearn","openedAt":"2026-04-28 17:30:17","stateChangedAt":"2026-05-12 14:21:04","stateChangedBy":"System","lastActivityAt":"2026-05-06 11:18:22","lastActivityBy":"Rowena Hearn","_updated":"2026-05-12T11:21:04.000Z"},"RITM2814327":{"state":"Closed Complete","shortDesc":"Action Required from IMEX Performa SKU PDP addition","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Belgium","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":10241,"clientRespMinutes":null,"firstReplyAt":"2026-05-05 20:13:04","firstAssignedDate":"2026-04-29 13:21:13","fulfillmentDate":"2026-04-28 17:32:28","openedBy":"Valeria Bonannella (Inactive)","openedDate":"2026-04-28","closedDate":"2026-08-14","toDoAt":"2026-04-29T13:19:45.080+0200","inUatAt":null,"jiraKey":"WFN-813","year":"2026","requestedFor":"","openedAt":"2026-04-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-14T15:21:05.000Z"},"RITM2814334":{"state":"Closed Complete","shortDesc":"Action Required from IMEX Performa SKU PDP addition","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Netherlands","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":10237,"clientRespMinutes":null,"firstReplyAt":"2026-05-05 20:12:25","firstAssignedDate":"2026-04-29 13:37:54","fulfillmentDate":"2026-04-28 17:35:29","openedBy":"Valeria Bonannella (Inactive)","openedDate":"2026-04-28","closedDate":"2026-08-13","toDoAt":"2026-04-29T13:39:04.393+0200","inUatAt":null,"jiraKey":"WFN-814","year":"2026","requestedFor":"","openedAt":"2026-04-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-13T16:00:44.000Z"},"RITM2814412":{"state":"Awaiting User Info","shortDesc":"Ticket for changes and updates on the strepsils website","assignedTo":"Damian Casasnovas","brand":"Strepsils","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":21754,"clientRespMinutes":4464,"firstReplyAt":"2026-05-13 21:33:14","firstAssignedDate":"2026-05-05 20:14:38","fulfillmentDate":"2026-04-28 18:59:36","openedBy":"Maria Eduarda Alves Pereira","openedDate":"2026-04-28","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":null,"openedAt":"2026-04-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T18:39:26.999Z"},"RITM2814432":{"state":"Closed Complete","shortDesc":"Changes on Impressum needed","assignedTo":"Tatyana Samoylenko","brand":"Air Wick","market":"Germany","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":8503,"clientRespMinutes":133,"firstReplyAt":"2026-05-04 17:05:31","firstAssignedDate":"2026-04-29 13:10:00","fulfillmentDate":"2026-04-28 19:22:35","openedBy":"Daniela Paul","openedDate":"2026-04-28","closedDate":"2026-05-16","toDoAt":"2026-04-29T20:05:19.047+0200","inUatAt":null,"jiraKey":"WFN-811","year":"2026","requestedFor":"","openedAt":"2026-04-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-16T14:21:01.999Z"},"RITM2815186":{"state":"Closed Complete","shortDesc":"Additional Vanish Webpage Image Update","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":9113,"clientRespMinutes":931,"firstReplyAt":"2026-05-05 20:16:23","firstAssignedDate":"2026-04-29 13:58:06","fulfillmentDate":"2026-04-29 12:23:33","openedBy":"Rosie Huggon","openedDate":"2026-04-29","closedDate":"2026-05-25","toDoAt":"2026-05-07T13:32:11.133+0200","inUatAt":"2026-05-12T16:37:28.003+0200","jiraKey":"WFN-815","year":"2026","requestedFor":"","openedAt":"2026-04-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-25T14:21:16.000Z"},"RITM2815387":{"state":"Closed Complete","shortDesc":"Additional information - Durex website","assignedTo":"Elizaveta Nyarko","brand":"Durex","market":"Greece","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":8858,"clientRespMinutes":2108,"firstReplyAt":"2026-05-05 18:04:40","firstAssignedDate":"2026-04-30 09:32:48","fulfillmentDate":"2026-04-29 14:26:35","openedBy":"Xanthi Skorda","openedDate":"2026-04-29","closedDate":"2026-06-01","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-816","year":"2026","requestedFor":"","openedAt":"2026-04-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-01T12:20:59.000Z"},"RITM2815673":{"state":"Closed Cancelled","shortDesc":"Update landing page for -> https://durex-tomorrowland.ro/","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Romania","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":964,"clientRespMinutes":5881,"firstReplyAt":"2026-04-30 09:25:44","firstAssignedDate":"2026-04-30 09:25:44","fulfillmentDate":"2026-04-29 17:21:59","openedBy":"David Stefan","openedDate":"2026-04-29","closedDate":"2026-05-14","toDoAt":"2026-08-14T15:28:33.493+0200","inUatAt":null,"jiraKey":"WFN-819","year":"2026","requestedFor":"David Stefan","openedAt":"2026-04-29 17:21:56","stateChangedAt":"2026-05-14 15:41:20","stateChangedBy":"System","lastActivityAt":"2026-05-11 10:40:46","lastActivityBy":"David Stefan","_updated":"2026-05-14T10:41:20.000Z"},"RITM2815706":{"state":"Awaiting User Info","shortDesc":"Uploading the PDF file to the website","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Czech Republic","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":931,"clientRespMinutes":4124,"firstReplyAt":"2026-04-30 09:23:45","firstAssignedDate":"2026-04-30 09:23:45","fulfillmentDate":"2026-04-29 17:52:26","openedBy":"Lukas Markovsky","openedDate":"2026-04-29","closedDate":"","toDoAt":"2026-06-04T13:11:49.880+0200","inUatAt":null,"jiraKey":"WFN-888","year":"2026","requestedFor":"","openedAt":"2026-04-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T16:09:37.999Z"},"RITM2815905":{"state":"Closed Complete","shortDesc":"Technical implementations | SEO","assignedTo":"Damian Casasnovas","brand":"Naldecon","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1287,"clientRespMinutes":5851,"firstReplyAt":"2026-04-30 19:10:56","firstAssignedDate":"2026-04-30 16:57:37","fulfillmentDate":"2026-04-29 21:44:14","openedBy":"Larissa Batistetti","openedDate":"2026-04-29","closedDate":"2026-08-08","toDoAt":"2026-07-14T05:02:02.850+0200","inUatAt":"2026-07-17T15:12:00.773+0200","jiraKey":"WFN-817","year":"2026","requestedFor":"","openedAt":"2026-04-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-08T00:24:25.000Z"},"RITM2816324":{"state":"Closed Complete","shortDesc":"Request to add 3 new detailed product pages for Gaviscon on RO HCP website","assignedTo":"Oksana Batyuk","brand":"Gaviscon","market":"Romania","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":7751,"clientRespMinutes":7434,"firstReplyAt":"2026-05-05 18:55:35","firstAssignedDate":"2026-05-04 19:43:37","fulfillmentDate":"2026-04-30 09:44:45","openedBy":"Alexandra Tonescu","openedDate":"2026-04-30","closedDate":"2026-08-10","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-04-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-10T07:45:53.999Z"},"RITM2816826":{"state":"Closed Complete","shortDesc":"HU Finish in machine sampling Pepita","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"NO","ttfrMinutes":1304,"clientRespMinutes":4208,"firstReplyAt":"2026-05-01 11:57:54","firstAssignedDate":"2026-04-30 17:07:27","fulfillmentDate":"2026-04-30 14:13:42","openedBy":"Anna Koroknay","openedDate":"2026-04-30","closedDate":"2026-06-10","toDoAt":null,"inUatAt":"2026-05-06T15:25:03.663+0200","jiraKey":"WFN-826","year":"2026","requestedFor":"","openedAt":"2026-04-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-10T12:21:21.000Z"},"RITM2817226":{"state":"Fulfilled","shortDesc":"New landing page for Cashback on Air Wick - National promo cashback","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":5329,"clientRespMinutes":10493,"firstReplyAt":"2026-05-04 10:56:43","firstAssignedDate":"2026-05-04 10:45:49","fulfillmentDate":"2026-04-30 18:07:25","openedBy":"Roberta Migliardi","openedDate":"2026-04-30","closedDate":"2026-07-17","toDoAt":"2026-05-22T17:34:56.953+0200","inUatAt":"2026-05-27T14:30:19.607+0200","jiraKey":"WFN-870","year":"2026","requestedFor":"","openedAt":"2026-04-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-17T07:08:42.000Z"},"RITM2817342":{"state":"Closed Complete","shortDesc":"Website updates | SEO articles","assignedTo":"Damian Casasnovas","brand":"Multibrand","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":92,"clientRespMinutes":25782,"firstReplyAt":"2026-04-30 22:16:55","firstAssignedDate":"2026-04-30 22:16:55","fulfillmentDate":"2026-04-30 20:45:24","openedBy":"Larissa Batistetti","openedDate":"2026-04-30","closedDate":"2026-07-07","toDoAt":"2026-05-11T15:46:47.620+0200","inUatAt":"2026-07-21T05:01:22.737+0200","jiraKey":"WFN-818","year":"2026","requestedFor":"","openedAt":"2026-04-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-07T00:20:54.000Z"},"RITM2819092":{"state":"Closed Complete","shortDesc":"Website Publishing","assignedTo":"Tatyana Samoylenko","brand":"Cillit","market":"Germany","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2971,"clientRespMinutes":null,"firstReplyAt":"2026-05-06 13:13:05","firstAssignedDate":"2026-05-04 13:29:40","fulfillmentDate":"2026-05-04 11:42:17","openedBy":"Agnes Nikolaidis","openedDate":"2026-05-04","closedDate":"2026-05-31","toDoAt":"2026-05-20T09:48:55.310+0200","inUatAt":null,"jiraKey":"WFN-822","year":"2026","requestedFor":"","openedAt":"2026-05-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-31T12:21:13.000Z"},"RITM2819094":{"state":"Closed Complete","shortDesc":"Website Publishing","assignedTo":"Tatyana Samoylenko","brand":"Air Wick","market":"Germany","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2968,"clientRespMinutes":null,"firstReplyAt":"2026-05-06 13:12:13","firstAssignedDate":"2026-05-04 13:22:58","fulfillmentDate":"2026-05-04 11:44:41","openedBy":"Agnes Nikolaidis","openedDate":"2026-05-04","closedDate":"2026-05-31","toDoAt":"2026-05-14T09:46:30.647+0200","inUatAt":null,"jiraKey":"WFN-821","year":"2026","requestedFor":"","openedAt":"2026-05-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-31T12:21:13.000Z"},"RITM2819099":{"state":"Closed Complete","shortDesc":"Website Publishing","assignedTo":"Tatyana Samoylenko","brand":"Calgon","market":"Germany","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2950,"clientRespMinutes":3237,"firstReplyAt":"2026-05-06 12:57:15","firstAssignedDate":"2026-05-04 13:16:47","fulfillmentDate":"2026-05-04 11:47:17","openedBy":"Agnes Nikolaidis","openedDate":"2026-05-04","closedDate":"2026-05-31","toDoAt":"2026-05-14T09:46:28.163+0200","inUatAt":null,"jiraKey":"WFN-820","year":"2026","requestedFor":"","openedAt":"2026-05-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-31T12:21:31.000Z"},"RITM2819523":{"state":"Awaiting User Info","shortDesc":"gaviscon.de - berry launch","assignedTo":"Elizaveta Nyarko","brand":"Gaviscon","market":"Germany","businessUnit":"Core Reckitt","finalCost":"5640","currencyCode":"GBP","ttfrMinutes":4327,"clientRespMinutes":1582,"firstReplyAt":"2026-05-07 15:49:31","firstAssignedDate":"2026-05-04 16:04:20","fulfillmentDate":"2026-05-04 15:42:52","openedBy":"Julia Kuzovkova","openedDate":"2026-05-04","closedDate":"","toDoAt":"2026-08-20T14:43:34.867+0200","inUatAt":"2026-05-19T16:56:44.297+0200","jiraKey":"WFN-828","year":"2026","requestedFor":"","openedAt":"2026-05-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-07T15:59:40.000Z"},"RITM2819645":{"state":"Work In Progress","shortDesc":"Site Settings https://www.reckittsaude.com.br/","assignedTo":"Oksana Batyuk","brand":"Gaviscon","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1534,"clientRespMinutes":2277,"firstReplyAt":"2026-05-05 18:39:52","firstAssignedDate":"2026-05-04 19:54:36","fulfillmentDate":"2026-05-04 17:06:03","openedBy":"Carolina da Silva","openedDate":"2026-05-04","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-05-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-12T14:29:24.999Z"},"RITM2820709":{"state":"Closed Complete","shortDesc":"Change Products on Website Zulia & jordan","assignedTo":"Elizaveta Nyarko","brand":"Veet","market":"Germany","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":409,"clientRespMinutes":3680,"firstReplyAt":"2026-05-05 20:19:29","firstAssignedDate":"2026-05-05 20:20:01","fulfillmentDate":"2026-05-05 13:30:33","openedBy":"Annika Brickwedde","openedDate":"2026-05-05","closedDate":"2026-06-17","toDoAt":"2026-05-18T13:04:23.657+0200","inUatAt":"2026-05-26T18:09:03.387+0200","jiraKey":"WFN-834","year":"2026","requestedFor":"","openedAt":"2026-05-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-23T10:48:43.000Z"},"RITM2821020":{"state":"Closed Complete","shortDesc":"SGN.de Update","assignedTo":"Tatyana Samoylenko","brand":"Sagrotan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"GBP","ttfrMinutes":1496,"clientRespMinutes":1390,"firstReplyAt":"2026-05-06 17:02:06","firstAssignedDate":"2026-05-05 20:21:54","fulfillmentDate":"2026-05-05 16:06:24","openedBy":"Markus Dittel","openedDate":"2026-05-05","closedDate":"2026-07-01","toDoAt":"2026-05-18T11:15:51.483+0200","inUatAt":"2026-05-15T12:50:42.993+0200","jiraKey":"WFN-831","year":"2026","requestedFor":"","openedAt":"2026-05-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-01T15:21:10.000Z"},"RITM2821170":{"state":"Closed Complete","shortDesc":"Latest Nurofen GPG report","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":206,"clientRespMinutes":3412,"firstReplyAt":"2026-05-05 20:49:59","firstAssignedDate":"2026-05-07 09:58:37","fulfillmentDate":"2026-05-05 17:23:50","openedBy":"Laura Dangerfield","openedDate":"2026-05-05","closedDate":"2026-08-07","toDoAt":"2026-05-05T20:53:19.020+0200","inUatAt":null,"jiraKey":"WFN-830","year":"2026","requestedFor":"","openedAt":"2026-05-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-07T16:30:27.000Z"},"RITM2821578":{"state":"Closed Complete","shortDesc":"Access to Search Console account for destop.fr","assignedTo":"Alesya Prolagayeva","brand":"Destop","market":"France","businessUnit":"Essential Home","finalCost":"","currencyCode":"NO","ttfrMinutes":456,"clientRespMinutes":null,"firstReplyAt":"2026-05-06 13:03:59","firstAssignedDate":"2026-05-06 13:03:59","fulfillmentDate":"2026-05-06 05:27:37","openedBy":"Mouncef Belkeziz","openedDate":"2026-05-06","closedDate":"2026-05-12","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-05-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-12T10:21:27.999Z"},"RITM2821712":{"state":"Closed Complete","shortDesc":"Hide Finish competition website","assignedTo":"Tatyana Samoylenko","brand":"Finish","market":"Romania","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":285,"clientRespMinutes":1858,"firstReplyAt":"2026-05-06 13:05:04","firstAssignedDate":"2026-05-06 09:55:18","fulfillmentDate":"2026-05-06 08:19:43","openedBy":"Andra Chiribici","openedDate":"2026-05-06","closedDate":"2026-06-02","toDoAt":"2026-05-13T13:39:57.257+0200","inUatAt":null,"jiraKey":"WFN-832","year":"2026","requestedFor":"","openedAt":"2026-05-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-02T07:21:21.000Z"},"RITM2823715":{"state":"Closed Cancelled","shortDesc":"Product finder quiz - update","assignedTo":"Elizaveta Nyarko","brand":"Nurofen","market":"Hungary","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":11356,"clientRespMinutes":5835,"firstReplyAt":"2026-05-15 11:11:26","firstAssignedDate":"2026-05-11 13:57:12","fulfillmentDate":"2026-05-07 13:55:45","openedBy":"Gina Boldizsar","openedDate":"2026-05-07","closedDate":"2026-06-03","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-835","year":"2026","requestedFor":"Gina Boldizsar","openedAt":"2026-05-07 13:55:42","stateChangedAt":"2026-06-03 17:09:14","stateChangedBy":"System","lastActivityAt":"2026-06-02 13:55:28","lastActivityBy":"Gina Boldizsar","_updated":"2026-06-03T12:09:14.000Z"},"RITM2823952":{"state":"Closed Complete","shortDesc":"Website Update AT","assignedTo":"Elizaveta Nyarko","brand":"Durex","market":"Austria","businessUnit":"Core Reckitt","finalCost":"2040","currencyCode":"GBP","ttfrMinutes":5869,"clientRespMinutes":2991,"firstReplyAt":"2026-05-11 18:00:49","firstAssignedDate":"2026-05-11 13:59:57","fulfillmentDate":"2026-05-07 16:11:49","openedBy":"Jacqueline Merkel","openedDate":"2026-05-07","closedDate":"2026-08-17","toDoAt":"2026-05-13T14:49:25.580+0200","inUatAt":"2026-06-19T15:59:41.680+0200","jiraKey":"WFN-836","year":"2026","requestedFor":"","openedAt":"2026-05-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-17T09:09:58.000Z"},"RITM2824344":{"state":"Closed Complete","shortDesc":"Updates Sico","assignedTo":"Damian Casasnovas","brand":"Sico","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":129905,"clientRespMinutes":120041,"firstReplyAt":"2026-08-06 03:38:55","firstAssignedDate":"2026-05-14 16:17:19","fulfillmentDate":"2026-05-07 22:34:19","openedBy":"Ali Méndez","openedDate":"2026-05-07","closedDate":"2026-08-06","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-05-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-06T00:38:55.000Z"},"RITM2824833":{"state":"Work In Progress","shortDesc":"Consolidated microsite for contests _greek market","assignedTo":"Tatyana Samoylenko","brand":"Finish","market":"Greece","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":5703,"clientRespMinutes":2523,"firstReplyAt":"2026-05-12 08:40:15","firstAssignedDate":"2026-05-11 13:59:52","fulfillmentDate":"2026-05-08 09:36:59","openedBy":"Froso Liapodimitri","openedDate":"2026-05-08","closedDate":"","toDoAt":"2026-08-19T15:07:41.040+0200","inUatAt":null,"jiraKey":"WFN-858","year":"2026","requestedFor":null,"openedAt":"2026-05-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-27T06:10:30.000Z"},"RITM2824984":{"state":"Closed Incomplete","shortDesc":"Cost estimates of adding a new menu to NL Gaviscon website","assignedTo":"Tatyana Samoylenko","brand":"Gaviscon","market":"Netherlands","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":5628,"clientRespMinutes":8997,"firstReplyAt":"2026-05-12 08:50:52","firstAssignedDate":"2026-05-11 13:57:43","fulfillmentDate":"2026-05-08 11:02:51","openedBy":"Isis Braye (Inactive)","openedDate":"2026-05-08","closedDate":"2026-08-08","toDoAt":"2026-05-28T09:47:04.797+0200","inUatAt":null,"jiraKey":"WFN-839","year":"2026","requestedFor":"Isis Braye (Inactive)","openedAt":"2026-05-08 11:02:48","stateChangedAt":"2026-08-08 18:17:07","stateChangedBy":"System","lastActivityAt":"2026-08-07 13:59:56","lastActivityBy":"Tatyana Samoylenko","_updated":"2026-08-08T13:17:48.000Z"},"RITM2824993":{"state":"Closed Complete","shortDesc":"Change of Impressum - https://www.cillitbang.de/impressum/","assignedTo":"Elizaveta Nyarko","brand":"Cillit","market":"Germany","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":5958,"clientRespMinutes":13783,"firstReplyAt":"2026-05-12 14:30:58","firstAssignedDate":"2026-05-11 13:59:17","fulfillmentDate":"2026-05-08 11:13:08","openedBy":"Lisa Graf","openedDate":"2026-05-08","closedDate":"2026-08-07","toDoAt":"2026-05-15T11:00:31.423+0200","inUatAt":"2026-06-16T16:07:21.397+0200","jiraKey":"WFN-838","year":"2026","requestedFor":"","openedAt":"2026-05-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-07T15:50:24.000Z"},"RITM2826690":{"state":"Closed Complete","shortDesc":"Change front banner and banner on the section \"Bad\"","assignedTo":"Elizaveta Nyarko","brand":"Cillit","market":"Germany","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1575,"clientRespMinutes":9387,"firstReplyAt":"2026-05-12 14:18:35","firstAssignedDate":"2026-05-11 13:59:35","fulfillmentDate":"2026-05-11 12:03:13","openedBy":"Lisa Graf","openedDate":"2026-05-11","closedDate":"2026-08-07","toDoAt":"2026-05-19T09:41:52.047+0200","inUatAt":"2026-06-17T17:01:19.433+0200","jiraKey":"WFN-837","year":"2026","requestedFor":"","openedAt":"2026-05-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-07T15:51:12.000Z"},"RITM2827030":{"state":"Closed Complete","shortDesc":"Update new T&C for promotion May 2025","assignedTo":"Tatyana Samoylenko","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1585,"clientRespMinutes":1412,"firstReplyAt":"2026-05-12 17:42:31","firstAssignedDate":"2026-05-12 16:33:40","fulfillmentDate":"2026-05-11 15:17:15","openedBy":"Sabrina Zhou","openedDate":"2026-05-11","closedDate":"2026-05-27","toDoAt":"2026-05-13T10:03:37.553+0200","inUatAt":null,"jiraKey":"WFN-840","year":"2026","requestedFor":"","openedAt":"2026-05-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-27T14:21:18.000Z"},"RITM2827085":{"state":"Closed Complete","shortDesc":"Remove section containing a dead link","assignedTo":"Tatyana Samoylenko","brand":"Nurofen","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":4294,"clientRespMinutes":1070,"firstReplyAt":"2026-05-14 15:16:00","firstAssignedDate":"2026-05-12 13:24:01","fulfillmentDate":"2026-05-11 15:42:12","openedBy":"Jasmine Clarke-Terrelonge (Inactive)","openedDate":"2026-05-11","closedDate":"2026-05-27","toDoAt":"2026-05-14T16:15:06.477+0200","inUatAt":"2026-05-18T13:37:34.637+0200","jiraKey":"WFN-846","year":"2026","requestedFor":"","openedAt":"2026-05-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-05-27T14:21:11.000Z"},"RITM2828970":{"state":"Closed Complete","shortDesc":"Remove Banner from Air Wick Website","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":1175,"clientRespMinutes":9183,"firstReplyAt":"2026-05-13 12:14:49","firstAssignedDate":"2026-05-12 17:50:42","fulfillmentDate":"2026-05-12 16:39:49","openedBy":"Roberta Migliardi","openedDate":"2026-05-12","closedDate":"2026-06-13","toDoAt":"2026-05-14T22:15:17.610+0200","inUatAt":"2026-05-22T18:57:58.060+0200","jiraKey":"WFN-844","year":"2026","requestedFor":"","openedAt":"2026-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-13T17:21:12.000Z"},"RITM2829017":{"state":"Closed Complete","shortDesc":"Update legal notes on promotional banner – Air Wick contest page","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"144","currencyCode":"EUR","ttfrMinutes":14394,"clientRespMinutes":4922,"firstReplyAt":"2026-05-22 17:14:44","firstAssignedDate":"2026-05-13 10:17:49","fulfillmentDate":"2026-05-12 17:20:46","openedBy":"Roberta Migliardi","openedDate":"2026-05-12","closedDate":"2026-06-13","toDoAt":"2026-05-22T17:18:08.993+0200","inUatAt":"2026-05-22T18:49:11.487+0200","jiraKey":"WFN-843","year":"2026","requestedFor":"","openedAt":"2026-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-13T11:21:41.000Z"},"RITM2829098":{"state":"Closed Complete","shortDesc":"Old images on Napisan.it","assignedTo":"Alesya Prolagayeva","brand":"Napisan","market":"Italy","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":4118,"clientRespMinutes":8453,"firstReplyAt":"2026-05-15 14:59:48","firstAssignedDate":"2026-05-13 10:13:41","fulfillmentDate":"2026-05-12 18:22:04","openedBy":"Anna Pasi","openedDate":"2026-05-12","closedDate":"2026-06-21","toDoAt":"2026-05-15T16:44:00.313+0200","inUatAt":"2026-06-10T23:55:09.293+0200","jiraKey":"WFN-842","year":"2026","requestedFor":"","openedAt":"2026-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-21T17:21:20.999Z"},"RITM2829274":{"state":"Closed Complete","shortDesc":"FINISH BANNER UPDATE","assignedTo":"Damian Casasnovas","brand":"Finish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":4241,"clientRespMinutes":38,"firstReplyAt":"2026-05-15 20:33:50","firstAssignedDate":"2026-05-13 10:07:17","fulfillmentDate":"2026-05-12 21:53:22","openedBy":"Ali Méndez","openedDate":"2026-05-12","closedDate":"2026-07-07","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-05-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-07T19:20:59.000Z"},"RITM2829646":{"state":"Closed Complete","shortDesc":"microsite update apostolikathariotita.gr 11/6-24/6","assignedTo":"Alesya Prolagayeva","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":30955,"clientRespMinutes":7080,"firstReplyAt":"2026-06-03 20:45:58","firstAssignedDate":"2026-05-13 10:03:40","fulfillmentDate":"2026-05-13 08:51:12","openedBy":"Froso Liapodimitri","openedDate":"2026-05-13","closedDate":"2026-07-12","toDoAt":"2026-05-13T13:40:23.007+0200","inUatAt":"2026-06-08T17:42:38.033+0200","jiraKey":"WFN-841","year":"2026","requestedFor":"","openedAt":"2026-05-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-12T15:20:56.000Z"},"RITM2830093":{"state":"Closed Complete","shortDesc":"SEO 2026 Phase 1 Implementation - Durex (JSON-LD Schemas and CWV)","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"508","currencyCode":"EUR","ttfrMinutes":88257,"clientRespMinutes":31937,"firstReplyAt":"2026-07-13 19:35:50","firstAssignedDate":"2026-05-15 14:12:09","fulfillmentDate":"2026-05-13 12:38:27","openedBy":"Jaime Sanchis","openedDate":"2026-05-13","closedDate":"2026-08-25","toDoAt":"2026-07-17T13:57:33.597+0200","inUatAt":"2026-07-23T16:55:43.707+0200","jiraKey":"WFN-854","year":"2026","requestedFor":"","openedAt":"2026-05-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T13:06:28.000Z"},"RITM2830102":{"state":"Work In Progress","shortDesc":"SEO 2026 Phase 1 Implementation - Gaviscon (Meta tags, JSON-LD, CWV)","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":88256,"clientRespMinutes":65162,"firstReplyAt":"2026-07-13 19:37:29","firstAssignedDate":"2026-05-15 14:11:38","fulfillmentDate":"2026-05-13 12:41:15","openedBy":"Jaime Sanchis","openedDate":"2026-05-13","closedDate":"","toDoAt":"2026-07-17T13:56:31.043+0200","inUatAt":null,"jiraKey":"WFN-853","year":"2026","requestedFor":"","openedAt":"2026-05-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T09:50:42.999Z"},"RITM2830109":{"state":"Work In Progress","shortDesc":"SEO 2026 Phase 1 Implementation - Gavidigest (Rebuild, Schema, and CWV)","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":88255,"clientRespMinutes":46425,"firstReplyAt":"2026-07-13 19:38:42","firstAssignedDate":"2026-05-15 14:02:26","fulfillmentDate":"2026-05-13 12:43:47","openedBy":"Jaime Sanchis","openedDate":"2026-05-13","closedDate":"","toDoAt":"2026-08-14T15:28:33.760+0200","inUatAt":null,"jiraKey":"WFN-852","year":"2026","requestedFor":"","openedAt":"2026-05-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T13:08:04.999Z"},"RITM2830118":{"state":"Awaiting User Info","shortDesc":"SEO 2026 Phase 1 Implementation - Nurofen (Cannibalization resolution, JSON-LD, CWV)","assignedTo":"Alesya Prolagayeva","brand":"Nurofen","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":88253,"clientRespMinutes":46894,"firstReplyAt":"2026-07-13 19:39:44","firstAssignedDate":"2026-05-15 13:59:12","fulfillmentDate":"2026-05-13 12:47:04","openedBy":"Jaime Sanchis","openedDate":"2026-05-13","closedDate":"","toDoAt":"2026-07-17T13:57:09.070+0200","inUatAt":"2026-08-26T17:24:27.693+0200","jiraKey":"WFN-851","year":"2026","requestedFor":"","openedAt":"2026-05-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T14:22:46.000Z"},"RITM2830124":{"state":"Closed Cancelled","shortDesc":"SEO 2026 Phase 1 Implementation - Strepfen (Shared Infrastructure and Meta tags)","assignedTo":"Alesya Prolagayeva","brand":"Strepfen","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":88253,"clientRespMinutes":85307,"firstReplyAt":"2026-07-13 19:43:52","firstAssignedDate":"2026-05-15 13:57:42","fulfillmentDate":"2026-05-13 12:50:29","openedBy":"Jaime Sanchis","openedDate":"2026-05-13","closedDate":"2026-07-23","toDoAt":"2026-08-14T15:28:33.620+0200","inUatAt":null,"jiraKey":"WFN-849","year":"2026","requestedFor":"Jaime Sanchis","openedAt":"2026-05-13 12:50:26","stateChangedAt":"2026-07-23 17:28:56","stateChangedBy":"Alesya Prolagayeva","lastActivityAt":"2026-07-23 11:21:41","lastActivityBy":"Jaime Sanchis","_updated":"2026-07-23T12:28:56.000Z"},"RITM2830125":{"state":"Awaiting User Info","shortDesc":"SEO 2026 Phase 1 Implementation - Strepsils (Critical Risk Resolution and Schema)","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"508","currencyCode":"EUR","ttfrMinutes":88251,"clientRespMinutes":33812,"firstReplyAt":"2026-07-13 19:42:52","firstAssignedDate":"2026-05-15 13:51:19","fulfillmentDate":"2026-05-13 12:52:22","openedBy":"Jaime Sanchis","openedDate":"2026-05-13","closedDate":"","toDoAt":"2026-07-17T13:57:19.737+0200","inUatAt":"2026-08-07T11:47:57.080+0200","jiraKey":"WFN-850","year":"2026","requestedFor":"","openedAt":"2026-05-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T14:14:34.999Z"},"RITM2830311":{"state":"Closed Complete","shortDesc":"Veet Home Page Money Back Guarantee Banner needs updating of T&Cs","assignedTo":"Alesya Prolagayeva","brand":"Veet","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":2812,"clientRespMinutes":3668,"firstReplyAt":"2026-05-15 13:44:16","firstAssignedDate":"2026-05-15 13:44:16","fulfillmentDate":"2026-05-13 14:52:17","openedBy":"Areeba Imtiaz","openedDate":"2026-05-13","closedDate":"2026-07-28","toDoAt":"2026-06-24T11:57:31.283+0200","inUatAt":"2026-06-25T13:15:53.377+0200","jiraKey":"WFN-1022","year":"2026","requestedFor":"","openedAt":"2026-05-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-28T07:48:13.999Z"},"RITM2830636":{"state":"Closed Complete","shortDesc":"REDIRECTION LINK TO ADD - BIOFREEZE PURCHASE - FR","assignedTo":"Alesya Prolagayeva","brand":"Biofreeze","market":"France","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":6827,"clientRespMinutes":2076,"firstReplyAt":"2026-05-18 11:39:47","firstAssignedDate":"2026-05-15 13:39:49","fulfillmentDate":"2026-05-13 17:53:04","openedBy":"Lorelei Charroin","openedDate":"2026-05-13","closedDate":"2026-06-27","toDoAt":"2026-05-15T20:36:21.117+0200","inUatAt":null,"jiraKey":"WFN-848","year":"2026","requestedFor":"","openedAt":"2026-05-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-27T16:21:22.000Z"},"RITM2834863":{"state":"Closed Complete","shortDesc":"We are updating the connected sample page with the new information.","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Romania","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"GBP","ttfrMinutes":1291,"clientRespMinutes":4054,"firstReplyAt":"2026-05-19 13:24:14","firstAssignedDate":"2026-05-18 17:10:51","fulfillmentDate":"2026-05-18 15:52:50","openedBy":"Andra Chiribici","openedDate":"2026-05-18","closedDate":"2026-07-12","toDoAt":"2026-05-28T11:36:24.880+0200","inUatAt":"2026-06-09T13:30:37.797+0200","jiraKey":"WFN-859","year":"2026","requestedFor":"","openedAt":"2026-05-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-12T08:21:07.000Z"},"RITM2835045":{"state":"Closed Complete","shortDesc":"Durex CH-Website - Create PDP for Intensity Extra Feucht","assignedTo":"Tatyana Samoylenko","brand":"Durex","market":"Switzerland","businessUnit":"Core Reckitt","finalCost":"1140","currencyCode":"GBP","ttfrMinutes":889,"clientRespMinutes":682,"firstReplyAt":"2026-05-19 08:59:08","firstAssignedDate":"2026-05-18 18:21:09","fulfillmentDate":"2026-05-18 18:10:39","openedBy":"Florian Mecking","openedDate":"2026-05-18","closedDate":"2026-06-20","toDoAt":"2026-05-21T21:22:23.880+0200","inUatAt":"2026-05-29T13:04:52.857+0200","jiraKey":"WFN-857","year":"2026","requestedFor":"","openedAt":"2026-05-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-20T16:21:13.000Z"},"RITM2836383":{"state":"Closed Complete","shortDesc":"Integration of a new product on our website and change of URL","assignedTo":"Tatyana Samoylenko","brand":"Gaviscon","market":"France","businessUnit":"Core Reckitt","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":2759,"clientRespMinutes":952,"firstReplyAt":"2026-05-21 14:17:20","firstAssignedDate":"2026-05-20 16:59:37","fulfillmentDate":"2026-05-19 16:18:07","openedBy":"Margot Schneider","openedDate":"2026-05-19","closedDate":"2026-07-23","toDoAt":"2026-05-21T20:50:38.043+0200","inUatAt":"2026-07-23T16:18:49.890+0200","jiraKey":"WFN-862","year":"2026","requestedFor":"","openedAt":"2026-05-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-23T11:18:43.000Z"},"RITM2836456":{"state":"Closed Complete","shortDesc":"Finish Re-Directs","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":3848,"clientRespMinutes":10751,"firstReplyAt":"2026-05-22 09:30:10","firstAssignedDate":"2026-05-21 17:02:45","fulfillmentDate":"2026-05-19 17:22:21","openedBy":"Rowena Hearn","openedDate":"2026-05-19","closedDate":"2026-08-07","toDoAt":"2026-05-22T09:58:17.563+0200","inUatAt":"2026-07-07T17:38:46.973+0200","jiraKey":"WFN-869","year":"2026","requestedFor":"","openedAt":"2026-05-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-07T16:32:45.000Z"},"RITM2837144":{"state":"Closed Complete","shortDesc":"Landing page update","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Czech Republic","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":2864,"clientRespMinutes":14686,"firstReplyAt":"2026-05-22 09:27:57","firstAssignedDate":"2026-05-20 17:02:57","fulfillmentDate":"2026-05-20 09:43:48","openedBy":"Anezka Faltova","openedDate":"2026-05-20","closedDate":"2026-06-30","toDoAt":"2026-05-22T17:15:52.857+0200","inUatAt":null,"jiraKey":"WFN-864","year":"2026","requestedFor":"","openedAt":"2026-05-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-30T12:21:20.000Z"},"RITM2837217":{"state":"Closed Complete","shortDesc":"Durex UK - FAQs","assignedTo":"Elizaveta Nyarko","brand":"Durex","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"2800","currencyCode":"GBP","ttfrMinutes":20703,"clientRespMinutes":5172,"firstReplyAt":"2026-06-03 19:09:10","firstAssignedDate":"2026-05-21 17:02:50","fulfillmentDate":"2026-05-20 10:06:28","openedBy":"Rowena Hearn","openedDate":"2026-05-20","closedDate":"2026-08-04","toDoAt":"2026-05-22T09:40:38.110+0200","inUatAt":"2026-07-07T17:41:30.603+0200","jiraKey":"WFN-868","year":"2026","requestedFor":"","openedAt":"2026-05-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-04T10:18:24.000Z"},"RITM2837521":{"state":"Closed Complete","shortDesc":"PDP update","assignedTo":"Tatyana Samoylenko","brand":"Durex","market":"Czech Republic","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1534,"clientRespMinutes":817,"firstReplyAt":"2026-05-21 14:28:20","firstAssignedDate":"2026-05-20 17:02:31","fulfillmentDate":"2026-05-20 12:54:28","openedBy":"Kateryna Trompak","openedDate":"2026-05-20","closedDate":"2026-06-14","toDoAt":"2026-05-26T17:58:11.987+0200","inUatAt":"2026-05-27T10:02:25.277+0200","jiraKey":"WFN-866","year":"2026","requestedFor":"","openedAt":"2026-05-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-14T15:21:14.000Z"},"RITM2837530":{"state":"Closed Complete","shortDesc":"PDP update","assignedTo":"Tatyana Samoylenko","brand":"Durex","market":"Slovakia","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1532,"clientRespMinutes":1696,"firstReplyAt":"2026-05-21 14:28:09","firstAssignedDate":"2026-05-20 17:04:07","fulfillmentDate":"2026-05-20 12:56:18","openedBy":"Kateryna Trompak","openedDate":"2026-05-20","closedDate":"2026-06-14","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-05-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-14T15:21:20.000Z"},"RITM2838149":{"state":"Closed Complete","shortDesc":"FINISH | UPDATES","assignedTo":"Damian Casasnovas","brand":"Finish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":41816,"clientRespMinutes":10336,"firstReplyAt":"2026-06-18 20:40:57","firstAssignedDate":"2026-05-21 11:35:50","fulfillmentDate":"2026-05-20 19:45:28","openedBy":"Ali Méndez","openedDate":"2026-05-20","closedDate":"2026-07-07","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-05-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-07T19:20:59.000Z"},"RITM2838194":{"state":"Awaiting User Info","shortDesc":"Ticket for changes and updates on the Naldecon website","assignedTo":"Damian Casasnovas","brand":"Naldecon","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":161,"clientRespMinutes":5057,"firstReplyAt":"2026-05-20 23:11:24","firstAssignedDate":"2026-05-20 23:11:33","fulfillmentDate":"2026-05-20 20:30:26","openedBy":"Maria Eduarda Alves Pereira","openedDate":"2026-05-20","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-05-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T13:58:34.000Z"},"RITM2838574":{"state":"Closed Complete","shortDesc":"Integrate Durex Performa IFU on PDPs on DACH Websites","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Germany","businessUnit":"Core Reckitt","finalCost":"420","currencyCode":"GBP","ttfrMinutes":215,"clientRespMinutes":3619,"firstReplyAt":"2026-05-21 12:13:54","firstAssignedDate":"2026-05-21 11:11:16","fulfillmentDate":"2026-05-21 08:39:06","openedBy":"Florian Mecking","openedDate":"2026-05-21","closedDate":"2026-06-08","toDoAt":"2026-05-21T12:06:13.720+0200","inUatAt":"2026-05-27T10:19:52.520+0200","jiraKey":"WFN-861","year":"2026","requestedFor":"","openedAt":"2026-05-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-08T07:21:14.999Z"},"RITM2838881":{"state":"Closed Complete","shortDesc":"Finish in machine sampling","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Hungary","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":20,"clientRespMinutes":null,"firstReplyAt":"2026-05-21 11:37:07","firstAssignedDate":"2026-05-21 11:37:07","fulfillmentDate":"2026-05-21 11:17:34","openedBy":"Anna Koroknay","openedDate":"2026-05-21","closedDate":"2026-06-01","toDoAt":"2026-05-21T11:40:34.220+0200","inUatAt":"2026-05-22T11:42:20.677+0200","jiraKey":"WFN-863","year":"2026","requestedFor":"","openedAt":"2026-05-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-01T08:20:53.999Z"},"RITM2839037":{"state":"Closed Complete","shortDesc":"Modify Landing Page QR Code","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":5791,"clientRespMinutes":10242,"firstReplyAt":"2026-05-25 13:12:32","firstAssignedDate":"2026-05-21 16:30:24","fulfillmentDate":"2026-05-21 12:41:11","openedBy":"Loris Vignati","openedDate":"2026-05-21","closedDate":"2026-06-08","toDoAt":"2026-05-22T09:58:10.183+0200","inUatAt":"2026-05-25T09:58:12.170+0200","jiraKey":"WFN-867","year":"2026","requestedFor":"","openedAt":"2026-05-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-08T18:21:03.000Z"},"RITM2839373":{"state":"Closed Complete","shortDesc":"Durex Lubes Sampling Survey Form","assignedTo":"Elizaveta Nyarko","brand":"Durex","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"3900","currencyCode":"GBP","ttfrMinutes":1018,"clientRespMinutes":4837,"firstReplyAt":"2026-05-22 09:01:31","firstAssignedDate":"2026-05-22 09:01:31","fulfillmentDate":"2026-05-21 16:03:15","openedBy":"Areeba Imtiaz","openedDate":"2026-05-21","closedDate":"2026-07-17","toDoAt":"2026-06-18T09:33:36.270+0200","inUatAt":"2026-07-07T11:30:41.447+0200","jiraKey":"WFN-896","year":"2026","requestedFor":"","openedAt":"2026-05-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-17T12:19:08.000Z"},"RITM2840575":{"state":"Closed Incomplete","shortDesc":"FINISH FR WEBSITE","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"France","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"EUR","ttfrMinutes":4225,"clientRespMinutes":3720,"firstReplyAt":"2026-05-25 10:25:13","firstAssignedDate":"2026-05-22 12:19:53","fulfillmentDate":"2026-05-22 11:59:58","openedBy":"Marie Albert","openedDate":"2026-05-22","closedDate":"2026-07-28","toDoAt":"2026-06-03T09:27:58.650+0200","inUatAt":"2026-06-12T13:44:00.087+0200","jiraKey":"WFN-872","year":"2026","requestedFor":"Marie Albert","openedAt":"2026-05-22 11:59:55","stateChangedAt":"2026-07-28 13:55:19","stateChangedBy":"Marie Albert","lastActivityAt":"2026-07-28 13:55:19","lastActivityBy":"Marie Albert","_updated":"2026-07-28T08:55:19.000Z"},"RITM2840828":{"state":"Closed Complete","shortDesc":"Finish Spain - Connected Sampling","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Spain","businessUnit":"Core Reckitt","finalCost":"240","currencyCode":"GBP","ttfrMinutes":4472,"clientRespMinutes":2281,"firstReplyAt":"2026-05-25 17:07:19","firstAssignedDate":"2026-05-25 10:11:35","fulfillmentDate":"2026-05-22 14:35:46","openedBy":"Rowena Hearn","openedDate":"2026-05-22","closedDate":"2026-06-17","toDoAt":"2026-05-25T10:15:38.890+0200","inUatAt":"2026-06-03T16:23:29.533+0200","jiraKey":"WFN-871","year":"2026","requestedFor":"","openedAt":"2026-05-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-17T16:21:00.000Z"},"RITM2841266":{"state":"Closed Complete","shortDesc":"UPDATE LANDING | GRANEODIN","assignedTo":"Damian Casasnovas","brand":"Strepsils","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":4220,"clientRespMinutes":22997,"firstReplyAt":"2026-05-25 20:14:49","firstAssignedDate":"2026-05-25 20:14:49","fulfillmentDate":"2026-05-22 21:54:38","openedBy":"Ali Méndez","openedDate":"2026-05-22","closedDate":"2026-08-06","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-05-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-06T00:27:34.000Z"},"RITM2841954":{"state":"Closed Complete","shortDesc":"copyright infringement on napisan.it","assignedTo":"Alesya Prolagayeva","brand":"Napisan","market":"Italy","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":13,"clientRespMinutes":107,"firstReplyAt":"2026-05-25 10:03:24","firstAssignedDate":"2026-05-25 10:03:24","fulfillmentDate":"2026-05-25 09:50:17","openedBy":"Anna Pasi","openedDate":"2026-05-25","closedDate":"2026-06-01","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-05-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-01T14:20:55.000Z"},"RITM2842808":{"state":"Closed Complete","shortDesc":"Update Lysol LDS","assignedTo":"Damian Casasnovas","brand":"Lysol","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":32826,"clientRespMinutes":null,"firstReplyAt":"2026-06-17 21:30:43","firstAssignedDate":"2026-05-27 03:45:09","fulfillmentDate":"2026-05-26 02:24:31","openedBy":"Mariana Onofre Castro","openedDate":"2026-05-26","closedDate":"2026-07-06","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-05-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-06T14:21:01.000Z"},"RITM2843413":{"state":"Closed Complete","shortDesc":"URL change - Veet Ruffle","assignedTo":"Tatyana Samoylenko","brand":"Veet","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":38,"clientRespMinutes":278,"firstReplyAt":"2026-05-26 12:30:00","firstAssignedDate":"2026-05-26 12:17:43","fulfillmentDate":"2026-05-26 11:51:38","openedBy":"Hanna Nill","openedDate":"2026-05-26","closedDate":"2026-06-08","toDoAt":"2026-05-26T12:19:42.103+0200","inUatAt":null,"jiraKey":"WFN-874","year":"2026","requestedFor":"","openedAt":"2026-05-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-08T12:21:16.000Z"},"RITM2843742":{"state":"Fulfilled","shortDesc":"Dettol Website Issues","assignedTo":"Tatyana Samoylenko","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"GBP","ttfrMinutes":1311,"clientRespMinutes":5869,"firstReplyAt":"2026-05-27 12:50:17","firstAssignedDate":"2026-05-26 15:58:34","fulfillmentDate":"2026-05-26 14:59:16","openedBy":"Despoina Chronopoulou","openedDate":"2026-05-26","closedDate":"2026-07-15","toDoAt":"2026-05-27T15:29:13.187+0200","inUatAt":"2026-06-09T12:25:32.617+0200","jiraKey":"WFN-876","year":"2026","requestedFor":"","openedAt":"2026-05-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-15T10:26:41.000Z"},"RITM2843752":{"state":"Closed Complete","shortDesc":"GTM update blocked - Requires HX packages update to 11.25.3","assignedTo":"Alesya Prolagayeva","brand":"Multibrand","market":"Canada","businessUnit":"Essential Home","finalCost":"288","currencyCode":"EUR","ttfrMinutes":105387,"clientRespMinutes":null,"firstReplyAt":"2026-08-07 19:33:29","firstAssignedDate":"2026-05-26 16:18:45","fulfillmentDate":"2026-05-26 15:06:37","openedBy":"Cemre Antmen","openedDate":"2026-05-26","closedDate":"2026-08-07","toDoAt":"2026-05-27T09:37:37.693+0200","inUatAt":null,"jiraKey":"WFN-875","year":"2026","requestedFor":"","openedAt":"2026-05-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-07T14:34:13.000Z"},"RITM2843794":{"state":"Closed Complete","shortDesc":"Dettol Website Issues","assignedTo":"Tatyana Samoylenko","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1282,"clientRespMinutes":6807,"firstReplyAt":"2026-05-27 12:50:38","firstAssignedDate":"2026-05-26 15:58:54","fulfillmentDate":"2026-05-26 15:28:32","openedBy":"Despoina Chronopoulou","openedDate":"2026-05-26","closedDate":"2026-06-22","toDoAt":"2026-05-27T15:29:13.187+0200","inUatAt":"2026-06-09T12:25:32.617+0200","jiraKey":"WFN-876","year":"2026","requestedFor":"","openedAt":"2026-05-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-22T13:22:21.999Z"},"RITM2844638":{"state":"Closed Complete","shortDesc":"regulatory update on veet.pl","assignedTo":"Elizaveta Nyarko","brand":"Veet","market":"Poland","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":352,"clientRespMinutes":null,"firstReplyAt":"2026-05-27 16:08:03","firstAssignedDate":"2026-05-27 14:46:13","fulfillmentDate":"2026-05-27 10:15:59","openedBy":"Anna Migut (Inactive)","openedDate":"2026-05-27","closedDate":"2026-08-25","toDoAt":"2026-05-28T13:27:29.750+0200","inUatAt":"2026-05-28T15:05:25.197+0200","jiraKey":"WFN-877","year":"2026","requestedFor":"","openedAt":"2026-05-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T09:19:48.000Z"},"RITM2844884":{"state":"Closed Complete","shortDesc":"Coupon Removal Vanish Website","assignedTo":"Elizaveta Nyarko","brand":"Vanish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1398,"clientRespMinutes":203,"firstReplyAt":"2026-05-28 12:25:36","firstAssignedDate":"2026-05-27 15:00:07","fulfillmentDate":"2026-05-27 13:07:44","openedBy":"Mia Leimkuhler","openedDate":"2026-05-27","closedDate":"2026-06-08","toDoAt":"2026-05-27T16:32:59.730+0200","inUatAt":"2026-05-27T18:50:45.420+0200","jiraKey":"WFN-878","year":"2026","requestedFor":"","openedAt":"2026-05-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-11T09:59:43.999Z"},"RITM2847083":{"state":"Closed Complete","shortDesc":"Website publishing","assignedTo":"Elizaveta Nyarko","brand":"Durex","market":"Spain","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":486,"clientRespMinutes":null,"firstReplyAt":"2026-05-29 18:02:53","firstAssignedDate":"2026-05-29 16:17:59","fulfillmentDate":"2026-05-29 09:57:22","openedBy":"Ignacio Andres Moreno","openedDate":"2026-05-29","closedDate":"2026-08-26","toDoAt":"2026-07-22T17:54:44.683+0200","inUatAt":null,"jiraKey":"WFN-881","year":"2026","requestedFor":"","openedAt":"2026-05-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T08:41:06.999Z"},"RITM2847147":{"state":"Closed Complete","shortDesc":"Update in machine sampling campaign landing page (Slovenia)","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Slovenia","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":4707,"clientRespMinutes":1985,"firstReplyAt":"2026-06-01 17:00:41","firstAssignedDate":"2026-05-29 11:44:40","fulfillmentDate":"2026-05-29 10:33:47","openedBy":"Dalma Lisa Pettersson","openedDate":"2026-05-29","closedDate":"2026-06-17","toDoAt":"2026-06-03T21:04:03.830+0200","inUatAt":"2026-05-29T15:11:17.863+0200","jiraKey":"WFN-880","year":"2026","requestedFor":"","openedAt":"2026-05-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-17T16:21:01.999Z"},"RITM2847414":{"state":"Closed Complete","shortDesc":"Durex PT - IFU","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":205,"clientRespMinutes":537,"firstReplyAt":"2026-05-29 17:15:57","firstAssignedDate":"2026-05-29 15:13:57","fulfillmentDate":"2026-05-29 13:51:03","openedBy":"Rowena Hearn","openedDate":"2026-05-29","closedDate":"2026-06-13","toDoAt":"2026-05-29T17:15:38.597+0200","inUatAt":"2026-06-02T10:39:52.940+0200","jiraKey":"WFN-882","year":"2026","requestedFor":"","openedAt":"2026-05-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-13T11:22:09.000Z"},"RITM2847824":{"state":"Closed Complete","shortDesc":"UPDATE LEGAL FOOTER | SICO","assignedTo":"Damian Casasnovas","brand":"Sico","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"2400","currencyCode":"MXN","ttfrMinutes":88,"clientRespMinutes":7637,"firstReplyAt":"2026-05-29 21:20:13","firstAssignedDate":"2026-05-29 21:20:13","fulfillmentDate":"2026-05-29 19:52:17","openedBy":"Ali Méndez","openedDate":"2026-05-29","closedDate":"2026-06-09","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-05-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-09T02:21:03.000Z"},"RITM2847858":{"state":"Closed Complete","shortDesc":"Reckitt Saude portal settings","assignedTo":"Elizaveta Nyarko","brand":"Strepsils","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"6667","currencyCode":"MXN","ttfrMinutes":6958,"clientRespMinutes":2377,"firstReplyAt":"2026-06-03 17:07:46","firstAssignedDate":"2026-06-02 12:17:55","fulfillmentDate":"2026-05-29 21:09:44","openedBy":"Carolina da Silva","openedDate":"2026-05-29","closedDate":"2026-08-14","toDoAt":"2026-07-31T15:43:48.720+0200","inUatAt":"2026-06-23T10:16:39.563+0200","jiraKey":"WFN-887","year":"2026","requestedFor":"","openedAt":"2026-05-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-14T14:41:11.000Z"},"RITM2849528":{"state":"Closed Complete","shortDesc":"finish.com.tr Transition","assignedTo":"Tatyana Samoylenko","brand":"Finish","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"2400","currencyCode":"GBP","ttfrMinutes":1729,"clientRespMinutes":1597,"firstReplyAt":"2026-06-02 22:19:32","firstAssignedDate":"2026-06-02 12:19:02","fulfillmentDate":"2026-06-01 17:30:46","openedBy":"Bengisu Uluyurt","openedDate":"2026-06-01","closedDate":"2026-07-31","toDoAt":"2026-07-02T17:15:30.973+0200","inUatAt":"2026-07-01T16:27:35.990+0200","jiraKey":"WFN-1036","year":"2026","requestedFor":"","openedAt":"2026-06-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-31T11:05:25.000Z"},"RITM2850436":{"state":"Closed Complete","shortDesc":"Change to connected sampling landing page","assignedTo":"Tatyana Samoylenko","brand":"Finish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1534,"clientRespMinutes":4472,"firstReplyAt":"2026-06-03 12:34:22","firstAssignedDate":"2026-06-02 12:19:23","fulfillmentDate":"2026-06-02 11:00:41","openedBy":"Chloe Whitehead","openedDate":"2026-06-02","closedDate":"2026-08-21","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-06-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T13:22:39.000Z"},"RITM2850791":{"state":"Awaiting User Info","shortDesc":"Updates for DACH websites","assignedTo":"Elizaveta Nyarko","brand":"Dobendan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"1320","currencyCode":"GBP","ttfrMinutes":4443,"clientRespMinutes":5127,"firstReplyAt":"2026-06-05 16:10:45","firstAssignedDate":"2026-06-02 22:25:57","fulfillmentDate":"2026-06-02 14:08:17","openedBy":"Emina Kara","openedDate":"2026-06-02","closedDate":"","toDoAt":"2026-07-22T18:09:20.553+0200","inUatAt":"2026-07-31T15:33:10.697+0200","jiraKey":"WFN-1292","year":"2026","requestedFor":"","openedAt":"2026-06-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T10:49:09.000Z"},"RITM2851098":{"state":"Closed Complete","shortDesc":"Change Products on Website Zulia & jordan","assignedTo":"Tatyana Samoylenko","brand":"Veet","market":"Switzerland","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1336,"clientRespMinutes":550,"firstReplyAt":"2026-06-03 15:38:32","firstAssignedDate":"2026-06-02 22:26:08","fulfillmentDate":"2026-06-02 17:22:39","openedBy":"Annika Brickwedde","openedDate":"2026-06-02","closedDate":"2026-07-14","toDoAt":"2026-06-08T17:30:43.683+0200","inUatAt":"2026-06-17T17:44:29.993+0200","jiraKey":"WFN-885","year":"2026","requestedFor":"","openedAt":"2026-06-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-14T08:21:58.000Z"},"RITM2852919":{"state":"Closed Complete","shortDesc":"MIGRATION | TEMPRA","assignedTo":"Damian Casasnovas","brand":"Tempra","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":46922,"clientRespMinutes":41871,"firstReplyAt":"2026-07-06 14:22:42","firstAssignedDate":"2026-07-06 18:03:09","fulfillmentDate":"2026-06-04 00:20:19","openedBy":"Ali Méndez","openedDate":"2026-06-04","closedDate":"2026-07-27","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-06-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T00:24:08.999Z"},"RITM2853431":{"state":"Closed Complete","shortDesc":"We need to hide the following links","assignedTo":"Tatyana Samoylenko","brand":"Fullmarks","market":"Spain","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":281,"clientRespMinutes":1420,"firstReplyAt":"2026-06-04 16:09:10","firstAssignedDate":"2026-06-04 12:10:54","fulfillmentDate":"2026-06-04 11:28:41","openedBy":"Julia Castane","openedDate":"2026-06-04","closedDate":"2026-06-28","toDoAt":"2026-06-04T18:02:44.870+0200","inUatAt":"2026-06-05T12:11:35.170+0200","jiraKey":"WFN-889","year":"2026","requestedFor":"","openedAt":"2026-06-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-28T10:21:27.999Z"},"RITM2853516":{"state":"Closed Complete","shortDesc":"Request to remove a banner from the homepage carousel for HCP RO","assignedTo":"Elizaveta Nyarko","brand":"Strepsils","market":"Romania","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1743,"clientRespMinutes":332,"firstReplyAt":"2026-06-05 17:09:56","firstAssignedDate":"2026-06-04 12:14:47","fulfillmentDate":"2026-06-04 12:07:23","openedBy":"Alexandra Tonescu","openedDate":"2026-06-04","closedDate":"2026-06-14","toDoAt":"2026-06-11T11:29:31.667+0200","inUatAt":null,"jiraKey":"WFN-893","year":"2026","requestedFor":"","openedAt":"2026-06-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-10T07:46:36.000Z"},"RITM2853835":{"state":"Closed Complete","shortDesc":"Publish a new webpage with T&Cs of Purchase: Cillit Bang, Calgon and Airwick","assignedTo":"Tatyana Samoylenko","brand":"Cillit","market":"United Kingdom","businessUnit":"Essential Home","finalCost":"360","currencyCode":"GBP","ttfrMinutes":63,"clientRespMinutes":1988,"firstReplyAt":"2026-06-04 16:34:12","firstAssignedDate":"2026-06-04 16:17:42","fulfillmentDate":"2026-06-04 15:31:36","openedBy":"Cynthia Nwagbara","openedDate":"2026-06-04","closedDate":"2026-07-01","toDoAt":"2026-06-04T18:02:53.137+0200","inUatAt":"2026-06-09T12:33:10.073+0200","jiraKey":"WFN-890","year":"2026","requestedFor":"","openedAt":"2026-06-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-01T14:21:04.000Z"},"RITM2853868":{"state":"Closed Complete","shortDesc":"Finish SE and NO - High Priority","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Sweden","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":1541,"clientRespMinutes":3477,"firstReplyAt":"2026-06-05 17:33:01","firstAssignedDate":"2026-06-05 09:22:38","fulfillmentDate":"2026-06-04 15:52:32","openedBy":"Rowena Hearn","openedDate":"2026-06-04","closedDate":"2026-07-28","toDoAt":"2026-06-05T09:25:28.520+0200","inUatAt":"2026-06-05T17:58:09.267+0200","jiraKey":"WFN-891","year":"2026","requestedFor":"","openedAt":"2026-06-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-28T08:25:44.000Z"},"RITM2855254":{"state":"Awaiting User Info","shortDesc":"Microsite for Money Back Guarantee promotion","assignedTo":"Tatyana Samoylenko","brand":"Fybogel","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":4569,"clientRespMinutes":null,"firstReplyAt":"2026-06-08 19:00:20","firstAssignedDate":"2026-06-08 10:29:06","fulfillmentDate":"2026-06-05 14:51:35","openedBy":"Sophie Blanchard","openedDate":"2026-06-05","closedDate":"","toDoAt":"2026-07-08T12:51:33.497+0200","inUatAt":"2026-07-29T14:34:13.217+0200","jiraKey":"WFN-1073","year":"2026","requestedFor":"","openedAt":"2026-06-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T12:22:06.000Z"},"RITM2855444":{"state":"Closed Complete","shortDesc":"Durex Intensity - ES IFU's","assignedTo":"Elizaveta Nyarko","brand":"Durex","market":"Spain","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":4216,"clientRespMinutes":571,"firstReplyAt":"2026-06-08 15:28:37","firstAssignedDate":"2026-06-08 11:53:41","fulfillmentDate":"2026-06-05 17:12:30","openedBy":"Rowena Hearn","openedDate":"2026-06-05","closedDate":"2026-06-14","toDoAt":"2026-06-08T14:45:09.620+0200","inUatAt":"2026-06-08T16:25:09.783+0200","jiraKey":"WFN-894","year":"2026","requestedFor":"","openedAt":"2026-06-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-14T14:21:10.000Z"},"RITM2856321":{"state":"Closed Complete","shortDesc":"Sagrotan.de Webiste from November 25","assignedTo":"Tatyana Samoylenko","brand":"Sagrotan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":477,"clientRespMinutes":142,"firstReplyAt":"2026-06-08 19:12:02","firstAssignedDate":"2026-06-08 19:01:33","fulfillmentDate":"2026-06-08 11:14:52","openedBy":"Rouven Lutz","openedDate":"2026-06-08","closedDate":"2026-06-20","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-06-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-20T16:21:30.000Z"},"RITM2858270":{"state":"Closed Complete","shortDesc":"DETTOL WEBSITE CHANGES","assignedTo":"Tatyana Samoylenko","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"540","currencyCode":"GBP","ttfrMinutes":394,"clientRespMinutes":1873,"firstReplyAt":"2026-06-09 18:41:07","firstAssignedDate":"2026-06-09 14:28:42","fulfillmentDate":"2026-06-09 12:07:24","openedBy":"Elpida Sideri","openedDate":"2026-06-09","closedDate":"2026-07-12","toDoAt":"2026-06-15T15:51:48.177+0200","inUatAt":"2026-06-16T15:56:23.630+0200","jiraKey":"WFN-895","year":"2026","requestedFor":"","openedAt":"2026-06-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-12T19:20:56.999Z"},"RITM2858924":{"state":"Work In Progress","shortDesc":"Update Sico|Name and PDP´S","assignedTo":"Damian Casasnovas","brand":"Sico","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"36000","currencyCode":"MXN","ttfrMinutes":59727,"clientRespMinutes":4162,"firstReplyAt":"2026-07-21 05:42:55","firstAssignedDate":"2026-07-10 17:52:01","fulfillmentDate":"2026-06-09 18:16:10","openedBy":"Ali Méndez","openedDate":"2026-06-09","closedDate":"","toDoAt":"2026-08-20T17:18:58.273+0200","inUatAt":null,"jiraKey":"WFN-1344","year":"2026","requestedFor":"","openedAt":"2026-06-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-20T15:48:04.999Z"},"RITM2858948":{"state":"Fulfilled","shortDesc":"FINISH (finish.es) · 301 redirects for broken backlinks","assignedTo":"Tatyana Samoylenko","brand":"Finish","market":"Spain","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2496,"clientRespMinutes":1122,"firstReplyAt":"2026-06-11 12:17:45","firstAssignedDate":"2026-06-10 12:06:55","fulfillmentDate":"2026-06-09 18:41:35","openedBy":"Jaime Sanchis","openedDate":"2026-06-09","closedDate":"2026-07-16","toDoAt":"2026-06-17T16:47:21.427+0200","inUatAt":"2026-06-15T17:44:59.423+0200","jiraKey":"WFN-897","year":"2026","requestedFor":"","openedAt":"2026-06-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-16T09:03:55.000Z"},"RITM2858951":{"state":"Fulfilled","shortDesc":"DUREX (durex.es) · 301 redirects for broken backlinks","assignedTo":"Tatyana Samoylenko","brand":"Durex","market":"Spain","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2495,"clientRespMinutes":4824,"firstReplyAt":"2026-06-11 12:18:07","firstAssignedDate":"2026-06-10 12:10:57","fulfillmentDate":"2026-06-09 18:43:24","openedBy":"Jaime Sanchis","openedDate":"2026-06-09","closedDate":"2026-07-16","toDoAt":"2026-06-17T15:59:58.600+0200","inUatAt":"2026-06-15T17:45:03.437+0200","jiraKey":"WFN-899","year":"2026","requestedFor":"","openedAt":"2026-06-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-16T10:12:35.999Z"},"RITM2858952":{"state":"Closed Complete","shortDesc":"VANISH (vanish.es) · 301 redirects for broken backlinks","assignedTo":"Tatyana Samoylenko","brand":"Vanish","market":"Spain","businessUnit":"Corporate","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2493,"clientRespMinutes":6920,"firstReplyAt":"2026-06-11 12:18:22","firstAssignedDate":"2026-06-10 12:12:38","fulfillmentDate":"2026-06-09 18:44:59","openedBy":"Jaime Sanchis","openedDate":"2026-06-09","closedDate":"2026-07-29","toDoAt":"2026-06-17T17:13:00.813+0200","inUatAt":"2026-06-15T17:45:02.333+0200","jiraKey":"WFN-900","year":"2026","requestedFor":"","openedAt":"2026-06-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-28T21:27:49.000Z"},"RITM2858954":{"state":"Fulfilled","shortDesc":"GAVISCON (gaviscon.es) · 301 redirects for broken backlinks","assignedTo":"Tatyana Samoylenko","brand":"Gaviscon","market":"Spain","businessUnit":"Corporate","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2492,"clientRespMinutes":1148,"firstReplyAt":"2026-06-11 12:18:31","firstAssignedDate":"2026-06-10 12:09:25","fulfillmentDate":"2026-06-09 18:46:29","openedBy":"Jaime Sanchis","openedDate":"2026-06-09","closedDate":"2026-07-16","toDoAt":"2026-06-17T16:47:01.170+0200","inUatAt":"2026-06-15T17:45:01.257+0200","jiraKey":"WFN-898","year":"2026","requestedFor":"","openedAt":"2026-06-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-16T10:27:55.000Z"},"RITM2858956":{"state":"Fulfilled","shortDesc":"NUROFEN (nurofen.es) · 301 redirects for broken backlinks","assignedTo":"Tatyana Samoylenko","brand":"Nurofen","market":"Spain","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":2491,"clientRespMinutes":1452,"firstReplyAt":"2026-06-11 12:18:41","firstAssignedDate":"2026-06-10 12:14:48","fulfillmentDate":"2026-06-09 18:48:06","openedBy":"Jaime Sanchis","openedDate":"2026-06-09","closedDate":"2026-07-16","toDoAt":"2026-06-17T16:57:09.423+0200","inUatAt":"2026-06-15T17:45:05.040+0200","jiraKey":"WFN-901","year":"2026","requestedFor":"","openedAt":"2026-06-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-16T10:31:33.000Z"},"RITM2862159":{"state":"Closed Complete","shortDesc":"URGENT - VISA NUMBER UPDATE NUROFEN","assignedTo":"Elizaveta Nyarko","brand":"Nurofen","market":"France","businessUnit":"Core Reckitt","finalCost":"504","currencyCode":"EUR","ttfrMinutes":1616,"clientRespMinutes":377,"firstReplyAt":"2026-06-12 16:58:54","firstAssignedDate":"2026-06-11 15:00:10","fulfillmentDate":"2026-06-11 14:02:29","openedBy":"Constance de Taillac (Inactive)","openedDate":"2026-06-11","closedDate":"2026-07-08","toDoAt":"2026-06-12T09:11:52.270+0200","inUatAt":"2026-07-01T13:05:05.420+0200","jiraKey":"WFN-902","year":"2026","requestedFor":"","openedAt":"2026-06-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-08T10:22:04.999Z"},"RITM2864741":{"state":"Closed Complete","shortDesc":"Remove of the form Finish Ailesine Sen de Katıl! from all the pages.","assignedTo":"Elizaveta Nyarko","brand":"Finish","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":420,"clientRespMinutes":2044,"firstReplyAt":"2026-06-15 16:05:38","firstAssignedDate":"2026-06-15 16:01:43","fulfillmentDate":"2026-06-15 09:05:37","openedBy":"Bengisu Uluyurt","openedDate":"2026-06-15","closedDate":"2026-07-15","toDoAt":"2026-06-19T18:42:40.447+0200","inUatAt":"2026-06-23T17:44:43.313+0200","jiraKey":"WFN-904","year":"2026","requestedFor":"","openedAt":"2026-06-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-15T09:21:24.000Z"},"RITM2866277":{"state":"Closed Complete","shortDesc":"Please add a symptoms banner on polish version of Gaviscon website","assignedTo":"Tatyana Samoylenko","brand":"Gaviscon","market":"Poland","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":263,"clientRespMinutes":395,"firstReplyAt":"2026-06-16 14:30:21","firstAssignedDate":"2026-06-16 10:27:37","fulfillmentDate":"2026-06-16 10:07:22","openedBy":"Katarzyna Majewska","openedDate":"2026-06-16","closedDate":"2026-07-29","toDoAt":"2026-07-01T14:52:12.797+0200","inUatAt":"2026-07-06T12:33:14.953+0200","jiraKey":"WFN-1020","year":"2026","requestedFor":"","openedAt":"2026-06-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-29T06:29:19.000Z"},"RITM2866301":{"state":"Closed Complete","shortDesc":"Change of emails and company names for Vestacy websites","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Netherlands","businessUnit":"Essential Home","finalCost":"2880","currencyCode":"EUR","ttfrMinutes":32342,"clientRespMinutes":2572,"firstReplyAt":"2026-07-08 21:26:57","firstAssignedDate":"2026-06-16 19:42:08","fulfillmentDate":"2026-06-16 10:25:28","openedBy":"Cemre Antmen","openedDate":"2026-06-16","closedDate":"2026-08-07","toDoAt":"2026-06-16T17:18:35.240+0200","inUatAt":"2026-07-24T14:57:28.863+0200","jiraKey":"WFN-905","year":"2026","requestedFor":"","openedAt":"2026-06-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-07T08:29:22.999Z"},"RITM2867288":{"state":"Work In Progress","shortDesc":"UPDATE WEBSITE","assignedTo":"Damian Casasnovas","brand":"Harpic","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":34696,"clientRespMinutes":7883,"firstReplyAt":"2026-07-10 22:01:38","firstAssignedDate":"2026-07-10 17:52:13","fulfillmentDate":"2026-06-16 19:45:36","openedBy":"Ali Méndez","openedDate":"2026-06-16","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1343","year":"2026","requestedFor":null,"openedAt":"2026-06-16","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T18:59:56.000Z"},"RITM2867804":{"state":"Closed Complete","shortDesc":"Vestacy Corporate Websites Improvements","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Netherlands","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":30950,"clientRespMinutes":null,"firstReplyAt":"2026-07-08 21:33:22","firstAssignedDate":"2026-06-19 11:00:55","fulfillmentDate":"2026-06-17 09:43:24","openedBy":"Cemre Antmen","openedDate":"2026-06-17","closedDate":"2026-08-07","toDoAt":"2026-07-09T11:24:58.863+0200","inUatAt":"2026-07-27T10:31:17.363+0200","jiraKey":"WFN-1013","year":"2026","requestedFor":"","openedAt":"2026-06-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-07T07:29:42.000Z"},"RITM2868341":{"state":"Work In Progress","shortDesc":"Finish 2026 website changes","assignedTo":"Tatyana Samoylenko","brand":"Finish","market":"Poland","businessUnit":"Core Reckitt","finalCost":"3600","currencyCode":"GBP","ttfrMinutes":7688,"clientRespMinutes":1824,"firstReplyAt":"2026-06-22 23:18:12","firstAssignedDate":"2026-06-19 11:01:03","fulfillmentDate":"2026-06-17 15:10:25","openedBy":"Anna Stani","openedDate":"2026-06-17","closedDate":"","toDoAt":"2026-07-20T11:10:49.767+0200","inUatAt":null,"jiraKey":"WFN-1324","year":"2026","requestedFor":"","openedAt":"2026-06-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-20T11:31:25.999Z"},"RITM2868952":{"state":"Work In Progress","shortDesc":"Website changes","assignedTo":"Tatyana Samoylenko","brand":"Dettol","market":"Poland","businessUnit":"Core Reckitt","finalCost":"1140","currencyCode":"GBP","ttfrMinutes":909,"clientRespMinutes":1185,"firstReplyAt":"2026-06-18 15:17:32","firstAssignedDate":"2026-06-18 09:26:02","fulfillmentDate":"2026-06-18 00:08:41","openedBy":"Anna Stani","openedDate":"2026-06-18","closedDate":"","toDoAt":"2026-06-25T10:24:52.447+0200","inUatAt":"2026-07-08T22:40:22.380+0200","jiraKey":"WFN-906","year":"2026","requestedFor":"","openedAt":"2026-06-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T18:40:56.999Z"},"RITM2869403":{"state":"Closed Complete","shortDesc":"Finish Landing page","assignedTo":"Elizaveta Nyarko","brand":"Finish","market":"Germany","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"GBP","ttfrMinutes":232,"clientRespMinutes":2563,"firstReplyAt":"2026-06-18 13:54:15","firstAssignedDate":"2026-06-18 13:13:46","fulfillmentDate":"2026-06-18 10:02:24","openedBy":"Mia Leimkuhler","openedDate":"2026-06-18","closedDate":"2026-07-13","toDoAt":"2026-06-24T18:19:39.080+0200","inUatAt":"2026-07-02T12:44:50.507+0200","jiraKey":"WFN-907","year":"2026","requestedFor":"","openedAt":"2026-06-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-13T10:20:52.999Z"},"RITM2869578":{"state":"Closed Complete","shortDesc":"New bumper removal","assignedTo":"Elizaveta Nyarko","brand":"Nurofen","market":"Germany","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1564,"clientRespMinutes":753,"firstReplyAt":"2026-06-19 13:44:39","firstAssignedDate":"2026-06-18 13:15:01","fulfillmentDate":"2026-06-18 11:40:30","openedBy":"Svenja Sirges","openedDate":"2026-06-18","closedDate":"2026-06-29","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1019","year":"2026","requestedFor":"","openedAt":"2026-06-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-06-29T12:21:04.000Z"},"RITM2871482":{"state":"Closed Complete","shortDesc":"Upgrade website | Naldecon","assignedTo":"Damian Casasnovas","brand":"Naldecon","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"13333","currencyCode":"MXN","ttfrMinutes":7589,"clientRespMinutes":5531,"firstReplyAt":"2026-06-24 22:44:36","firstAssignedDate":"2026-07-02 21:49:51","fulfillmentDate":"2026-06-19 16:15:55","openedBy":"Larissa Batistetti","openedDate":"2026-06-19","closedDate":"2026-08-08","toDoAt":"2026-07-03T17:11:14.617+0200","inUatAt":"2026-07-17T14:58:25.830+0200","jiraKey":"WFN-1080","year":"2026","requestedFor":"","openedAt":"2026-06-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-08T00:22:50.000Z"},"RITM2873041":{"state":"On hold","shortDesc":"Finish Connected Sampling - PT","assignedTo":"Elizaveta Nyarko","brand":"Finish","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"3000","currencyCode":"GBP","ttfrMinutes":4273,"clientRespMinutes":4156,"firstReplyAt":"2026-06-25 15:10:06","firstAssignedDate":"2026-06-23 10:21:32","fulfillmentDate":"2026-06-22 15:57:08","openedBy":"Rowena Hearn","openedDate":"2026-06-22","closedDate":"","toDoAt":"2026-07-08T12:50:29.447+0200","inUatAt":null,"jiraKey":"WFN-1021","year":"2026","requestedFor":"","openedAt":"2026-06-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-07T09:09:03.000Z"},"RITM2874971":{"state":"Closed Complete","shortDesc":"Raffle is over, we need banner","assignedTo":"Tatyana Samoylenko","brand":"Veet","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":4349,"clientRespMinutes":1737,"firstReplyAt":"2026-06-26 17:57:27","firstAssignedDate":"2026-06-24 22:20:02","fulfillmentDate":"2026-06-23 17:28:17","openedBy":"Annika Brickwedde","openedDate":"2026-06-23","closedDate":"2026-07-15","toDoAt":"2026-07-01T09:38:50.957+0200","inUatAt":"2026-07-01T14:23:23.183+0200","jiraKey":"WFN-1024","year":"2026","requestedFor":"","openedAt":"2026-06-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-15T09:21:26.999Z"},"RITM2879182":{"state":"Closed Complete","shortDesc":"update microsite https://www.durexdiagonismos.gr/ for contest 23/7-6/8","assignedTo":"Tatyana Samoylenko","brand":"Durex","market":"Greece","businessUnit":"Core Reckitt","finalCost":"1800","currencyCode":"GBP","ttfrMinutes":4063,"clientRespMinutes":1510,"firstReplyAt":"2026-06-29 09:59:28","firstAssignedDate":"2026-06-26 16:51:17","fulfillmentDate":"2026-06-26 14:16:03","openedBy":"Froso Liapodimitri","openedDate":"2026-06-26","closedDate":"2026-08-25","toDoAt":"2026-07-20T11:36:58.053+0200","inUatAt":null,"jiraKey":"WFN-1325","year":"2026","requestedFor":"","openedAt":"2026-06-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T13:08:54.000Z"},"RITM2879292":{"state":"Closed Complete","shortDesc":"Veet Home Page Money Back Guarantee Banner needs updating of T&Cs","assignedTo":"Tatyana Samoylenko","brand":"Veet","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":3974,"clientRespMinutes":1906,"firstReplyAt":"2026-06-29 10:13:53","firstAssignedDate":"2026-06-26 16:51:57","fulfillmentDate":"2026-06-26 16:00:21","openedBy":"Navya Mohan","openedDate":"2026-06-26","closedDate":"2026-08-03","toDoAt":"2026-08-12T23:06:04.220+0200","inUatAt":null,"jiraKey":"WFN-1044","year":"2026","requestedFor":"","openedAt":"2026-06-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-03T12:20:04.000Z"},"RITM2880261":{"state":"Closed Complete","shortDesc":"Add new banner for CPD course – Reckitt Professional RO","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Romania","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1903,"clientRespMinutes":8485,"firstReplyAt":"2026-06-30 17:25:12","firstAssignedDate":"2026-06-30 14:50:09","fulfillmentDate":"2026-06-29 09:42:11","openedBy":"Alexandra Tonescu","openedDate":"2026-06-29","closedDate":"2026-08-04","toDoAt":"2026-07-20T11:12:24.383+0200","inUatAt":"2026-07-13T18:57:40.407+0200","jiraKey":"WFN-1062","year":"2026","requestedFor":"","openedAt":"2026-06-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-04T10:53:40.000Z"},"RITM2880757":{"state":"Closed Complete","shortDesc":"Update in machine sampling campaign landing page (Croatia)","assignedTo":"Tatyana Samoylenko","brand":"Finish","market":"Croatia","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":4505,"clientRespMinutes":803,"firstReplyAt":"2026-07-02 17:01:03","firstAssignedDate":"2026-06-29 15:06:25","fulfillmentDate":"2026-06-29 13:56:21","openedBy":"Dalma Lisa Pettersson","openedDate":"2026-06-29","closedDate":"2026-08-04","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-06-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-04T12:36:38.000Z"},"RITM2881065":{"state":"Closed Complete","shortDesc":"Nurofen Duo HU website update","assignedTo":"Elizaveta Nyarko","brand":"Nurofen","market":"Hungary","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":2965,"clientRespMinutes":38,"firstReplyAt":"2026-07-01 18:24:30","firstAssignedDate":"2026-06-30 14:48:45","fulfillmentDate":"2026-06-29 16:59:47","openedBy":"Gina Boldizsar","openedDate":"2026-06-29","closedDate":"2026-07-31","toDoAt":"2026-07-03T16:02:54.823+0200","inUatAt":"2026-07-06T10:56:24.773+0200","jiraKey":"WFN-1063","year":"2026","requestedFor":"","openedAt":"2026-06-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-31T10:25:33.000Z"},"RITM2882723":{"state":"Closed Complete","shortDesc":"Nurofen DE","assignedTo":"Elizaveta Nyarko","brand":"Nurofen","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":11260,"clientRespMinutes":721,"firstReplyAt":"2026-07-08 12:45:04","firstAssignedDate":"2026-06-30 17:45:48","fulfillmentDate":"2026-06-30 17:05:17","openedBy":"Rowena Hearn","openedDate":"2026-06-30","closedDate":"2026-07-20","toDoAt":"2026-07-22T18:40:15.780+0200","inUatAt":null,"jiraKey":"WFN-1386","year":"2026","requestedFor":"","openedAt":"2026-06-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-20T10:07:45.000Z"},"RITM2883835":{"state":"Fulfilled","shortDesc":"Re-adding an STP banner on the Reckitt Professional RO platform","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"Romania","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1517,"clientRespMinutes":4983,"firstReplyAt":"2026-07-02 12:00:09","firstAssignedDate":"2026-07-01 12:25:53","fulfillmentDate":"2026-07-01 10:43:31","openedBy":"Alexandra Tonescu","openedDate":"2026-07-01","closedDate":"2026-07-13","toDoAt":null,"inUatAt":"2026-07-01T16:14:55.600+0200","jiraKey":"WFN-1071","year":"2026","requestedFor":"","openedAt":"2026-07-01","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-13T16:20:50.000Z"},"RITM2885259":{"state":"Awaiting User Info","shortDesc":"Dettol - Cinderella","assignedTo":"Tatyana Samoylenko","brand":"Dettol","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"5000","currencyCode":"GBP","ttfrMinutes":9396,"clientRespMinutes":1365,"firstReplyAt":"2026-07-08 22:48:49","firstAssignedDate":"2026-07-02 10:43:10","fulfillmentDate":"2026-07-02 10:12:47","openedBy":"Rowena Hearn","openedDate":"2026-07-02","closedDate":"","toDoAt":"2026-07-27T09:16:17.403+0200","inUatAt":"2026-08-25T15:37:05.473+0200","jiraKey":"WFN-1202","year":"2026","requestedFor":"","openedAt":"2026-07-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-20T12:00:19.000Z"},"RITM2885403":{"state":"Closed Complete","shortDesc":"Gaviscon UK - Lendl","assignedTo":"Tatyana Samoylenko","brand":"Gaviscon","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"1500","currencyCode":"GBP","ttfrMinutes":9314,"clientRespMinutes":4311,"firstReplyAt":"2026-07-08 22:51:25","firstAssignedDate":"2026-07-02 17:35:42","fulfillmentDate":"2026-07-02 11:37:12","openedBy":"Rowena Hearn","openedDate":"2026-07-02","closedDate":"2026-08-19","toDoAt":"2026-07-16T18:37:13.927+0200","inUatAt":null,"jiraKey":"WFN-1267","year":"2026","requestedFor":"","openedAt":"2026-07-02","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T14:41:32.000Z"},"RITM2886705":{"state":"Awaiting User Info","shortDesc":"WEBSITE UPDATE 2026","assignedTo":"Elizaveta Nyarko","brand":"Finish","market":"France","businessUnit":"Core Reckitt","finalCost":"1584","currencyCode":"EUR","ttfrMinutes":7463,"clientRespMinutes":null,"firstReplyAt":"2026-07-08 13:37:53","firstAssignedDate":"2026-07-03 09:43:27","fulfillmentDate":"2026-07-03 09:15:00","openedBy":"Marie Albert","openedDate":"2026-07-03","closedDate":"","toDoAt":"2026-07-31T16:02:48.667+0200","inUatAt":"2026-08-10T11:37:12.203+0200","jiraKey":"WFN-1510","year":"2026","requestedFor":"","openedAt":"2026-07-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T15:40:08.000Z"},"RITM2886813":{"state":"Closed Complete","shortDesc":"Dettol UK - FAQ","assignedTo":"Elizaveta Nyarko","brand":"Dettol","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"1560","currencyCode":"GBP","ttfrMinutes":257,"clientRespMinutes":1190,"firstReplyAt":"2026-07-03 14:28:16","firstAssignedDate":"2026-07-03 10:31:50","fulfillmentDate":"2026-07-03 10:11:23","openedBy":"Rowena Hearn","openedDate":"2026-07-03","closedDate":"2026-08-11","toDoAt":"2026-07-08T12:50:08.887+0200","inUatAt":"2026-07-13T16:56:46.377+0200","jiraKey":"WFN-1079","year":"2026","requestedFor":"","openedAt":"2026-07-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-11T11:22:21.000Z"},"RITM2886815":{"state":"Awaiting User Info","shortDesc":"BAU front-end change to DataArt","assignedTo":"Tatyana Samoylenko","brand":"Durex","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":287,"clientRespMinutes":3026,"firstReplyAt":"2026-07-03 15:00:20","firstAssignedDate":"2026-07-03 14:58:07","fulfillmentDate":"2026-07-03 10:13:07","openedBy":"Giulia Dossena","openedDate":"2026-07-03","closedDate":"","toDoAt":"2026-07-13T17:57:21.467+0200","inUatAt":"2026-07-08T22:52:38.677+0200","jiraKey":"WFN-1178","year":"2026","requestedFor":"","openedAt":"2026-07-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-12T18:58:22.999Z"},"RITM2887547":{"state":"Closed Complete","shortDesc":"Upgrade website | Vanish","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"13333","currencyCode":"MXN","ttfrMinutes":3997,"clientRespMinutes":23884,"firstReplyAt":"2026-07-06 14:15:05","firstAssignedDate":"2026-07-06 11:00:07","fulfillmentDate":"2026-07-03 19:38:10","openedBy":"Sarah Rodrigues","openedDate":"2026-07-03","closedDate":"2026-08-10","toDoAt":"2026-07-14T05:08:24.070+0200","inUatAt":"2026-07-21T04:56:34.997+0200","jiraKey":"WFN-1120","year":"2026","requestedFor":"","openedAt":"2026-07-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-10T17:41:39.000Z"},"RITM2889117":{"state":"Closed Complete","shortDesc":"Finish AT BIPA Landingpage","assignedTo":"Elizaveta Nyarko","brand":"Finish","market":"Austria","businessUnit":"Core Reckitt","finalCost":"600","currencyCode":"GBP","ttfrMinutes":3289,"clientRespMinutes":1320,"firstReplyAt":"2026-07-08 22:59:57","firstAssignedDate":"2026-07-07 10:49:19","fulfillmentDate":"2026-07-06 16:11:25","openedBy":"Mia Leimkuhler","openedDate":"2026-07-06","closedDate":"2026-08-06","toDoAt":"2026-07-20T14:17:58.260+0200","inUatAt":"2026-07-22T18:02:44.330+0200","jiraKey":"WFN-1327","year":"2026","requestedFor":"","openedAt":"2026-07-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-06T12:58:46.000Z"},"RITM2889467":{"state":"Awaiting User Info","shortDesc":"Website upgrade and technical adjustments (SEO) | Luftal","assignedTo":"Damian Casasnovas","brand":"Luftal","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":5747,"clientRespMinutes":25045,"firstReplyAt":"2026-07-10 21:20:40","firstAssignedDate":"2026-07-07 05:28:07","fulfillmentDate":"2026-07-06 21:34:13","openedBy":"Larissa Batistetti","openedDate":"2026-07-06","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1121","year":"2026","requestedFor":"","openedAt":"2026-07-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-20T19:15:55.000Z"},"RITM2889470":{"state":"Closed Complete","shortDesc":"Upgrade website | Veja","assignedTo":"Damian Casasnovas","brand":"Veja","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":473,"clientRespMinutes":19827,"firstReplyAt":"2026-07-07 05:32:52","firstAssignedDate":"2026-07-07 05:32:52","fulfillmentDate":"2026-07-06 21:40:11","openedBy":"Larissa Batistetti","openedDate":"2026-07-06","closedDate":"2026-08-08","toDoAt":"2026-07-14T05:09:02.437+0200","inUatAt":"2026-07-31T19:30:20.253+0200","jiraKey":"WFN-1122","year":"2026","requestedFor":"","openedAt":"2026-07-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-08T00:16:50.999Z"},"RITM2889474":{"state":"Closed Complete","shortDesc":"Upgrade website | Desenrolla","assignedTo":"Damian Casasnovas","brand":"Multibrand","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"20000","currencyCode":"MXN","ttfrMinutes":481,"clientRespMinutes":14052,"firstReplyAt":"2026-07-07 05:45:36","firstAssignedDate":"2026-07-07 05:45:36","fulfillmentDate":"2026-07-06 21:44:33","openedBy":"Larissa Batistetti","openedDate":"2026-07-06","closedDate":"2026-08-19","toDoAt":"2026-07-14T05:09:32.277+0200","inUatAt":"2026-07-27T21:38:59.003+0200","jiraKey":"WFN-1123","year":"2026","requestedFor":"","openedAt":"2026-07-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T13:17:35.000Z"},"RITM2890351":{"state":"Work In Progress","shortDesc":"Lube Gives You More - Durex UK","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"2800","currencyCode":"GBP","ttfrMinutes":1752,"clientRespMinutes":10253,"firstReplyAt":"2026-07-08 17:38:38","firstAssignedDate":"2026-07-08 17:23:29","fulfillmentDate":"2026-07-07 12:26:17","openedBy":"Rowena Hearn","openedDate":"2026-07-07","closedDate":"","toDoAt":"2026-08-13T09:06:03.420+0200","inUatAt":"2026-08-14T18:34:56.923+0200","jiraKey":"WFN-1489","year":"2026","requestedFor":"","openedAt":"2026-07-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T13:55:57.000Z"},"RITM2890765":{"state":"Awaiting User Info","shortDesc":"update microsite https://www.apostolikathariotita.gr/ (next contest 6/8/2026)","assignedTo":"Tatyana Samoylenko","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"900","currencyCode":"GBP","ttfrMinutes":2523,"clientRespMinutes":3170,"firstReplyAt":"2026-07-09 09:48:06","firstAssignedDate":"2026-07-07 16:03:37","fulfillmentDate":"2026-07-07 15:45:17","openedBy":"Froso Liapodimitri","openedDate":"2026-07-07","closedDate":"","toDoAt":"2026-07-17T11:53:35.613+0200","inUatAt":null,"jiraKey":"WFN-1156","year":"2026","requestedFor":"","openedAt":"2026-07-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T07:22:57.999Z"},"RITM2890898":{"state":"Closed Cancelled","shortDesc":"Finish in machine sampling landing page for Serbia","assignedTo":"Tatyana Samoylenko","brand":"Finish","market":"Serbia","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":"","firstAssignedDate":"2026-07-10 17:56:01","fulfillmentDate":"2026-07-07 17:00:54","openedBy":"Dalma Lisa Pettersson","openedDate":"2026-07-07","closedDate":"2026-07-14","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1227","year":"2026","requestedFor":"Dalma Lisa Pettersson","openedAt":"2026-07-07 17:00:50","stateChangedAt":"2026-07-14 15:58:56","stateChangedBy":"Dalma Lisa Pettersson","lastActivityAt":"2026-07-14 15:58:56","lastActivityBy":"Dalma Lisa Pettersson","_updated":"2026-07-14T10:58:56.000Z"},"RITM2891219":{"state":"Awaiting User Info","shortDesc":"SEO technical implementations | Vanish","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1299,"clientRespMinutes":3852,"firstReplyAt":"2026-07-08 20:38:18","firstAssignedDate":"2026-07-08 18:36:57","fulfillmentDate":"2026-07-07 22:59:01","openedBy":"Sarah Rodrigues","openedDate":"2026-07-07","closedDate":"","toDoAt":"2026-07-14T05:10:12.547+0200","inUatAt":null,"jiraKey":"WFN-1237","year":"2026","requestedFor":"","openedAt":"2026-07-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T01:49:06.999Z"},"RITM2891763":{"state":"Awaiting User Info","shortDesc":"Strepsils FR - Changes Required by Health Authorities","assignedTo":"Alesya Prolagayeva","brand":"Strepsils","market":"France","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":7142,"clientRespMinutes":11443,"firstReplyAt":"2026-07-13 09:55:11","firstAssignedDate":"2026-07-10 17:54:56","fulfillmentDate":"2026-07-08 10:53:40","openedBy":"Andrea Casalese","openedDate":"2026-07-08","closedDate":"","toDoAt":"2026-08-26T16:05:50.840+0200","inUatAt":null,"jiraKey":"WFN-1230","year":"2026","requestedFor":"","openedAt":"2026-07-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T15:00:49.999Z"},"RITM2892540":{"state":"Work In Progress","shortDesc":"www.Vanish.pl update","assignedTo":"Tatyana Samoylenko","brand":"Vanish","market":"Poland","businessUnit":"Core Reckitt","finalCost":"1620","currencyCode":"GBP","ttfrMinutes":9684,"clientRespMinutes":3617,"firstReplyAt":"2026-07-15 11:25:05","firstAssignedDate":"2026-07-10 17:54:46","fulfillmentDate":"2026-07-08 18:01:07","openedBy":"Anna Stani","openedDate":"2026-07-08","closedDate":"","toDoAt":"2026-08-14T15:28:34.147+0200","inUatAt":null,"jiraKey":"WFN-1260","year":"2026","requestedFor":"","openedAt":"2026-07-08","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T08:16:56.000Z"},"RITM2892820":{"state":"Closed Complete","shortDesc":"Updates to Website Articles and Images (Mockups)","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"89334","currencyCode":"MXN","ttfrMinutes":17142,"clientRespMinutes":12397,"firstReplyAt":"2026-07-20 22:30:52","firstAssignedDate":"2026-07-10 17:52:26","fulfillmentDate":"2026-07-09 00:48:33","openedBy":"Sarah Rodrigues","openedDate":"2026-07-09","closedDate":"2026-08-10","toDoAt":"2026-07-21T04:29:03.460+0200","inUatAt":"2026-08-06T15:23:34.327+0200","jiraKey":"WFN-1238","year":"2026","requestedFor":"","openedAt":"2026-07-09","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-10T17:48:49.000Z"},"RITM2895339":{"state":"Closed Complete","shortDesc":"Dettol UK - Legacy content correction","assignedTo":"Tatyana Samoylenko","brand":"Dettol","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"1200","currencyCode":"GBP","ttfrMinutes":8911,"clientRespMinutes":2469,"firstReplyAt":"2026-07-16 17:07:28","firstAssignedDate":"2026-07-10 17:54:24","fulfillmentDate":"2026-07-10 12:36:23","openedBy":"Rowena Hearn","openedDate":"2026-07-10","closedDate":"2026-08-19","toDoAt":"2026-07-31T15:45:17.457+0200","inUatAt":null,"jiraKey":"WFN-1508","year":"2026","requestedFor":"","openedAt":"2026-07-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T14:39:08.000Z"},"RITM2897455":{"state":"Awaiting User Info","shortDesc":"RENDERS UPDATE | GRANEODIN","assignedTo":"Damian Casasnovas","brand":"Strepsils","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":3872,"clientRespMinutes":1979,"firstReplyAt":"2026-07-16 05:32:55","firstAssignedDate":"2026-07-13 17:23:07","fulfillmentDate":"2026-07-13 13:00:52","openedBy":"Ali Méndez","openedDate":"2026-07-13","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1342","year":"2026","requestedFor":"","openedAt":"2026-07-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-27T12:11:48.000Z"},"RITM2898516":{"state":"Awaiting User Info","shortDesc":"Unhide Finish website link","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Romania","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":9200,"clientRespMinutes":4724,"firstReplyAt":"2026-07-20 17:15:23","firstAssignedDate":"2026-07-14 17:16:23","fulfillmentDate":"2026-07-14 07:55:28","openedBy":"Andra Chiribici","openedDate":"2026-07-14","closedDate":"","toDoAt":"2026-08-14T15:28:34.560+0200","inUatAt":null,"jiraKey":"WFN-1270","year":"2026","requestedFor":"","openedAt":"2026-07-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-11T07:25:16.000Z"},"RITM2898840":{"state":"Work In Progress","shortDesc":"DUREX CH Website Update","assignedTo":"Elizaveta Nyarko","brand":"Durex","market":"Switzerland","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":13186,"clientRespMinutes":4886,"firstReplyAt":"2026-07-23 14:48:05","firstAssignedDate":"2026-07-14 17:16:43","fulfillmentDate":"2026-07-14 11:01:45","openedBy":"Jacqueline Merkel","openedDate":"2026-07-14","closedDate":"","toDoAt":"2026-07-24T18:41:40.477+0200","inUatAt":null,"jiraKey":"WFN-1316","year":"2026","requestedFor":"","openedAt":"2026-07-14","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T09:54:59.000Z"},"RITM2900288":{"state":"Closed Complete","shortDesc":"Add two Tesco online links to the Vanish Turbo product page.","assignedTo":"Elizaveta Nyarko","brand":"Vanish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":3271,"clientRespMinutes":3649,"firstReplyAt":"2026-07-17 16:55:48","firstAssignedDate":"2026-07-15 14:42:09","fulfillmentDate":"2026-07-15 10:24:26","openedBy":"Rosie Huggon","openedDate":"2026-07-15","closedDate":"2026-08-17","toDoAt":"2026-07-22T17:21:57.473+0200","inUatAt":"2026-07-22T17:22:26.707+0200","jiraKey":"WFN-1313","year":"2026","requestedFor":"","openedAt":"2026-07-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-17T14:13:16.000Z"},"RITM2900547":{"state":"Closed Complete","shortDesc":"changes GaviDarm packshots & B+ images","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":10419,"clientRespMinutes":2724,"firstReplyAt":"2026-07-22 18:13:21","firstAssignedDate":"2026-07-15 14:42:24","fulfillmentDate":"2026-07-15 12:34:49","openedBy":"Emina Kara","openedDate":"2026-07-15","closedDate":"2026-07-28","toDoAt":"2026-07-22T16:07:06.703+0200","inUatAt":"2026-07-27T17:50:36.147+0200","jiraKey":"WFN-1305","year":"2026","requestedFor":"","openedAt":"2026-07-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-07-28T09:04:59.000Z"},"RITM2900650":{"state":"Awaiting User Info","shortDesc":"HU strepsils website update with B+ images","assignedTo":"Elizaveta Nyarko","brand":"Strepsils","market":"Hungary","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"GBP","ttfrMinutes":7167,"clientRespMinutes":2198,"firstReplyAt":"2026-07-20 13:11:57","firstAssignedDate":"2026-07-15 14:42:38","fulfillmentDate":"2026-07-15 13:44:41","openedBy":"Eszter Balogh","openedDate":"2026-07-15","closedDate":"","toDoAt":"2026-07-29T11:37:47.587+0200","inUatAt":"2026-08-12T16:49:43.857+0200","jiraKey":"WFN-1320","year":"2026","requestedFor":"","openedAt":"2026-07-15","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-14T14:18:00.000Z"},"RITM2903136":{"state":"Work In Progress","shortDesc":"New Banner Request for EM Cashback on Air Wick - National promo cashback","assignedTo":"Alesya Prolagayeva","brand":"Air Wick","market":"Italy","businessUnit":"Essential Home","finalCost":"360","currencyCode":"EUR","ttfrMinutes":404,"clientRespMinutes":13527,"firstReplyAt":"2026-07-17 16:08:35","firstAssignedDate":"2026-07-17 16:08:35","fulfillmentDate":"2026-07-17 09:24:30","openedBy":"Roberta Migliardi","openedDate":"2026-07-17","closedDate":"","toDoAt":"2026-08-07T13:10:55.893+0200","inUatAt":"2026-08-11T10:29:17.587+0200","jiraKey":"WFN-1605","year":"2026","requestedFor":"","openedAt":"2026-07-17","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T14:53:08.999Z"},"RITM2905228":{"state":"Awaiting User Info","shortDesc":"Finish UK - Supernova NPD","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":3087,"clientRespMinutes":36478,"firstReplyAt":"2026-07-22 18:16:48","firstAssignedDate":"2026-07-21 11:40:13","fulfillmentDate":"2026-07-20 14:50:14","openedBy":"Rowena Hearn","openedDate":"2026-07-20","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1667","year":"2026","requestedFor":"","openedAt":"2026-07-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-17T15:13:04.000Z"},"RITM2905448":{"state":"Work In Progress","shortDesc":"Vanish UK - FAQ structure","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"2200","currencyCode":"GBP","ttfrMinutes":11210,"clientRespMinutes":7760,"firstReplyAt":"2026-07-28 12:16:30","firstAssignedDate":"2026-07-21 11:39:16","fulfillmentDate":"2026-07-20 17:26:22","openedBy":"Rowena Hearn","openedDate":"2026-07-20","closedDate":"","toDoAt":"2026-08-18T15:57:44.237+0200","inUatAt":"2026-08-21T18:04:43.817+0200","jiraKey":"WFN-1397","year":"2026","requestedFor":"","openedAt":"2026-07-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T13:23:28.000Z"},"RITM2906334":{"state":"Work In Progress","shortDesc":"Durex FR - Vending Machine Promotion","assignedTo":"Elizaveta Nyarko","brand":"Durex","market":"France","businessUnit":"Core Reckitt","finalCost":"6240","currencyCode":"EUR","ttfrMinutes":3075,"clientRespMinutes":3182,"firstReplyAt":"2026-07-23 14:20:18","firstAssignedDate":"2026-07-21 11:44:58","fulfillmentDate":"2026-07-21 11:05:39","openedBy":"Rowena Hearn","openedDate":"2026-07-21","closedDate":"","toDoAt":"2026-07-31T15:43:25.300+0200","inUatAt":null,"jiraKey":"WFN-1385","year":"2026","requestedFor":"","openedAt":"2026-07-21","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T15:03:53.000Z"},"RITM2908647":{"state":"Closed Complete","shortDesc":"Update Website Biocide Disclaimer","assignedTo":"Elizaveta Nyarko","brand":"Sagrotan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"720","currencyCode":"GBP","ttfrMinutes":1467,"clientRespMinutes":1487,"firstReplyAt":"2026-07-23 15:55:06","firstAssignedDate":"2026-07-23 11:32:59","fulfillmentDate":"2026-07-22 15:28:34","openedBy":"Rouven Lutz","openedDate":"2026-07-22","closedDate":"2026-07-29","toDoAt":"2026-07-24T13:45:14.493+0200","inUatAt":"2026-07-28T13:19:30.683+0200","jiraKey":"WFN-1405","year":"2026","requestedFor":"","openedAt":"2026-07-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-13T09:15:13.000Z"},"RITM2908793":{"state":"Awaiting User Info","shortDesc":"Change the banner on the Finish Community page.","assignedTo":"Damian Casasnovas","brand":"Finish","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":2962,"clientRespMinutes":4223,"firstReplyAt":"2026-07-24 18:46:08","firstAssignedDate":"2026-07-23 11:28:19","fulfillmentDate":"2026-07-22 17:24:24","openedBy":"Thayssa Rodrigues Soares","openedDate":"2026-07-22","closedDate":"","toDoAt":"2026-08-12T15:49:04.577+0200","inUatAt":"2026-08-13T22:46:39.563+0200","jiraKey":"WFN-1408","year":"2026","requestedFor":"","openedAt":"2026-07-22","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T00:36:01.999Z"},"RITM2909862":{"state":"Closed Complete","shortDesc":"3 changes on Strepsils website PL","assignedTo":"Tatyana Samoylenko","brand":"Strepsils","market":"Poland","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":8209,"clientRespMinutes":251,"firstReplyAt":"2026-07-29 06:43:45","firstAssignedDate":"2026-07-23 15:36:57","fulfillmentDate":"2026-07-23 13:55:10","openedBy":"Katarzyna Majewska","openedDate":"2026-07-23","closedDate":"2026-08-11","toDoAt":"2026-07-29T14:57:32.220+0200","inUatAt":null,"jiraKey":"WFN-1453","year":"2026","requestedFor":"","openedAt":"2026-07-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-11T20:00:54.000Z"},"RITM2910009":{"state":"Awaiting User Info","shortDesc":"Changes on monequilibredigestif.fr website","assignedTo":"Tatyana Samoylenko","brand":"Gaviscon","market":"France","businessUnit":"Core Reckitt","finalCost":"504","currencyCode":"EUR","ttfrMinutes":8110,"clientRespMinutes":2716,"firstReplyAt":"2026-07-29 06:44:50","firstAssignedDate":"2026-07-23 16:14:57","fulfillmentDate":"2026-07-23 15:34:28","openedBy":"Margot Schneider","openedDate":"2026-07-23","closedDate":"","toDoAt":"2026-08-14T15:28:35.857+0200","inUatAt":null,"jiraKey":"WFN-1457","year":"2026","requestedFor":"","openedAt":"2026-07-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T19:31:20.999Z"},"RITM2910029":{"state":"Closed Complete","shortDesc":"Changes in Luftagastro Website","assignedTo":"Damian Casasnovas","brand":"Gaviscon","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"2667","currencyCode":"MXN","ttfrMinutes":7989,"clientRespMinutes":934,"firstReplyAt":"2026-07-29 04:55:19","firstAssignedDate":"2026-07-27 13:10:39","fulfillmentDate":"2026-07-23 15:46:09","openedBy":"Maria Nunes","openedDate":"2026-07-23","closedDate":"2026-08-13","toDoAt":"2026-08-11T04:10:04.700+0200","inUatAt":"2026-08-11T13:54:27.137+0200","jiraKey":"WFN-1452","year":"2026","requestedFor":"","openedAt":"2026-07-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-13T19:49:23.000Z"},"RITM2910152":{"state":"On hold","shortDesc":"Air Wick Kerzen Aktion","assignedTo":"Tatyana Samoylenko","brand":"Air Wick","market":"Germany","businessUnit":"Essential Home","finalCost":"504","currencyCode":"EUR","ttfrMinutes":8271,"clientRespMinutes":1178,"firstReplyAt":"2026-07-29 10:58:12","firstAssignedDate":"2026-07-27 13:12:12","fulfillmentDate":"2026-07-23 17:07:20","openedBy":"Gayatri Biswas","openedDate":"2026-07-23","closedDate":"","toDoAt":"2026-07-30T17:58:18.087+0200","inUatAt":"2026-07-31T18:10:21.607+0200","jiraKey":"WFN-1426","year":"2026","requestedFor":"","openedAt":"2026-07-23","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T19:47:19.000Z"},"RITM2910789":{"state":"Awaiting User Info","shortDesc":"Air Wick Website Change","assignedTo":"Tatyana Samoylenko","brand":"Air Wick","market":"Poland","businessUnit":"Essential Home","finalCost":"2700","currencyCode":"GBP","ttfrMinutes":4617,"clientRespMinutes":1402,"firstReplyAt":"2026-07-27 13:09:53","firstAssignedDate":"2026-07-27 13:09:53","fulfillmentDate":"2026-07-24 08:13:19","openedBy":"Katarzyna Różańska","openedDate":"2026-07-24","closedDate":"","toDoAt":"2026-08-10T17:22:08.550+0200","inUatAt":null,"jiraKey":"WFN-1499","year":"2026","requestedFor":"","openedAt":"2026-07-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T19:31:44.000Z"},"RITM2910803":{"state":"Awaiting User Info","shortDesc":"changes on the website Lovela.pl","assignedTo":"Tatyana Samoylenko","brand":"Lovela","market":"Poland","businessUnit":"Essential Home","finalCost":"540","currencyCode":"GBP","ttfrMinutes":4602,"clientRespMinutes":1542,"firstReplyAt":"2026-07-27 13:08:20","firstAssignedDate":"2026-07-27 13:08:20","fulfillmentDate":"2026-07-24 08:26:47","openedBy":"Katarzyna Różańska","openedDate":"2026-07-24","closedDate":"","toDoAt":"2026-08-04T16:07:30.040+0200","inUatAt":null,"jiraKey":"WFN-1505","year":"2026","requestedFor":"","openedAt":"2026-07-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T13:32:43.999Z"},"RITM2913180":{"state":"On hold","shortDesc":"In machine sampling campaign landing page (Serbia)","assignedTo":"Tatyana Samoylenko","brand":"Finish","market":"Serbia","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":4,"clientRespMinutes":4500,"firstReplyAt":"2026-07-27 15:57:35","firstAssignedDate":"2026-07-29 16:53:16","fulfillmentDate":"2026-07-27 15:53:27","openedBy":"Dalma Lisa Pettersson","openedDate":"2026-07-27","closedDate":"","toDoAt":"2026-08-05T17:19:59.403+0200","inUatAt":"2026-08-05T18:21:53.100+0200","jiraKey":"WFN-1553","year":"2026","requestedFor":"","openedAt":"2026-07-27","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T08:07:30.000Z"},"RITM2914010":{"state":"Awaiting User Info","shortDesc":"Sagrotan.de Surface update","assignedTo":"Elizaveta Nyarko","brand":"Sagrotan","market":"Germany","businessUnit":"Core Reckitt","finalCost":"1020","currencyCode":"GBP","ttfrMinutes":1757,"clientRespMinutes":180,"firstReplyAt":"2026-07-29 14:50:20","firstAssignedDate":"2026-07-28 12:14:26","fulfillmentDate":"2026-07-28 09:33:12","openedBy":"Markus Dittel","openedDate":"2026-07-28","closedDate":"","toDoAt":"2026-08-06T11:18:00.687+0200","inUatAt":null,"jiraKey":"WFN-1470","year":"2026","requestedFor":"","openedAt":"2026-07-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T15:01:27.999Z"},"RITM2914297":{"state":"Work In Progress","shortDesc":"Cashback Multibrand promo release","assignedTo":"Alesya Prolagayeva","brand":"Napisan","market":"Italy","businessUnit":"Core Reckitt","finalCost":"144","currencyCode":"EUR","ttfrMinutes":34684,"clientRespMinutes":null,"firstReplyAt":"2026-08-21 14:03:06","firstAssignedDate":"2026-07-28 12:42:33","fulfillmentDate":"2026-07-28 11:59:03","openedBy":"Angela Zago","openedDate":"2026-07-28","closedDate":"","toDoAt":"2026-08-13T09:47:07.227+0200","inUatAt":"2026-08-20T13:26:05.853+0200","jiraKey":"WFN-1642","year":"2026","requestedFor":"","openedAt":"2026-07-28","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T09:44:56.000Z"},"RITM2915693":{"state":"Awaiting User Info","shortDesc":"Finish Connected Sample - Design Extension","assignedTo":"Tatyana Samoylenko","brand":"Finish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"240","currencyCode":"GBP","ttfrMinutes":336,"clientRespMinutes":11630,"firstReplyAt":"2026-07-29 17:04:38","firstAssignedDate":"2026-07-29 12:10:06","fulfillmentDate":"2026-07-29 11:28:26","openedBy":"Rowena Hearn","openedDate":"2026-07-29","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1476","year":"2026","requestedFor":"","openedAt":"2026-07-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T19:41:32.000Z"},"RITM2915757":{"state":"Closed Incomplete","shortDesc":"FCS - Egypt","assignedTo":"Elizaveta Nyarko","brand":"Finish","market":"Egypt","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":2970,"clientRespMinutes":null,"firstReplyAt":"2026-07-31 13:28:18","firstAssignedDate":"2026-07-29 16:53:25","fulfillmentDate":"2026-07-29 11:58:50","openedBy":"Rowena Hearn","openedDate":"2026-07-29","closedDate":"2026-08-21","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"Rowena Hearn","openedAt":"2026-07-29 11:58:46","stateChangedAt":"2026-08-21 12:23:39","stateChangedBy":"Elizaveta Nyarko","lastActivityAt":"2026-08-21 12:23:29","lastActivityBy":"Elizaveta Nyarko","_updated":"2026-08-21T07:23:39.000Z"},"RITM2916127":{"state":"Awaiting User Info","shortDesc":"Update articles – Naldecon website | SEO","assignedTo":"Damian Casasnovas","brand":"Naldecon","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"9334","currencyCode":"MXN","ttfrMinutes":3100,"clientRespMinutes":6734,"firstReplyAt":"2026-07-31 19:33:04","firstAssignedDate":"2026-07-29 16:38:49","fulfillmentDate":"2026-07-29 15:53:10","openedBy":"Larissa Batistetti","openedDate":"2026-07-29","closedDate":"","toDoAt":"2026-08-03T21:24:26.057+0200","inUatAt":"2026-08-12T19:58:08.667+0200","jiraKey":"WFN-1479","year":"2026","requestedFor":"","openedAt":"2026-07-29","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T17:57:30.000Z"},"RITM2917211":{"state":"On hold","shortDesc":"update AirWick.pl","assignedTo":"Tatyana Samoylenko","brand":"Air Wick","market":"Poland","businessUnit":"Essential Home","finalCost":"600","currencyCode":"GBP","ttfrMinutes":6105,"clientRespMinutes":1032,"firstReplyAt":"2026-08-03 18:10:46","firstAssignedDate":"2026-07-30 12:58:35","fulfillmentDate":"2026-07-30 12:25:54","openedBy":"Katarzyna Różańska","openedDate":"2026-07-30","closedDate":"","toDoAt":"2026-08-05T14:14:54.220+0200","inUatAt":"2026-08-17T17:05:36.977+0200","jiraKey":"WFN-1529","year":"2026","requestedFor":"","openedAt":"2026-07-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T14:20:09.000Z"},"RITM2917361":{"state":"Closed Complete","shortDesc":"close form","assignedTo":"Elizaveta Nyarko","brand":"Durex","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":286,"clientRespMinutes":null,"firstReplyAt":"2026-07-30 18:44:50","firstAssignedDate":"2026-07-30 15:05:48","fulfillmentDate":"2026-07-30 13:58:38","openedBy":"Shreya Agarwal","openedDate":"2026-07-30","closedDate":"2026-08-11","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-07-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-11T11:20:39.000Z"},"RITM2917815":{"state":"Awaiting User Info","shortDesc":"VANISH|Renders and Retailers","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"8400","currencyCode":"MXN","ttfrMinutes":1626,"clientRespMinutes":5908,"firstReplyAt":"2026-07-31 22:03:21","firstAssignedDate":"2026-07-30 22:38:08","fulfillmentDate":"2026-07-30 18:57:03","openedBy":"Ali Méndez","openedDate":"2026-07-30","closedDate":"","toDoAt":"2026-08-05T22:27:22.997+0200","inUatAt":"2026-08-10T20:52:41.737+0200","jiraKey":"WFN-1590","year":"2026","requestedFor":"","openedAt":"2026-07-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-10T17:52:13.000Z"},"RITM2917818":{"state":"Closed Complete","shortDesc":"Inclusion of a video lesson on the Reckitt Saúde portal","assignedTo":"Elizaveta Nyarko","brand":"Strepsils","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"5334","currencyCode":"MXN","ttfrMinutes":9759,"clientRespMinutes":3641,"firstReplyAt":"2026-08-06 13:42:09","firstAssignedDate":"2026-07-30 22:38:20","fulfillmentDate":"2026-07-30 19:03:22","openedBy":"Carolina da Silva","openedDate":"2026-07-30","closedDate":"2026-08-14","toDoAt":"2026-08-10T11:29:32.703+0200","inUatAt":null,"jiraKey":"WFN-1607","year":"2026","requestedFor":"","openedAt":"2026-07-30","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-14T14:41:57.000Z"},"RITM2918670":{"state":"Work In Progress","shortDesc":"Amicasa.it website changes","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":7251,"clientRespMinutes":6859,"firstReplyAt":"2026-08-05 12:35:22","firstAssignedDate":"2026-07-31 12:00:37","fulfillmentDate":"2026-07-31 11:44:35","openedBy":"Angela Zago","openedDate":"2026-07-31","closedDate":"","toDoAt":"2026-08-03T16:49:42.697+0200","inUatAt":"2026-08-05T12:34:58.460+0200","jiraKey":"WFN-1509","year":"2026","requestedFor":"","openedAt":"2026-07-31","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T13:50:18.000Z"},"RITM2918699":{"state":"Work In Progress","shortDesc":"AirWick.pl - reeds","assignedTo":"Elizaveta Nyarko","brand":"Air Wick","market":"Poland","businessUnit":"Essential Home","finalCost":"600","currencyCode":"GBP","ttfrMinutes":123,"clientRespMinutes":1209,"firstReplyAt":"2026-07-31 14:04:03","firstAssignedDate":"2026-07-31 12:36:27","fulfillmentDate":"2026-07-31 12:01:25","openedBy":"Katarzyna Różańska","openedDate":"2026-07-31","closedDate":"","toDoAt":"2026-08-14T15:28:36.160+0200","inUatAt":null,"jiraKey":"WFN-1496","year":"2026","requestedFor":null,"openedAt":"2026-07-31","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-27T05:36:32.000Z"},"RITM2919154":{"state":"Awaiting User Info","shortDesc":"Finish Website Italy Content Update | Quotation Request","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":35979,"clientRespMinutes":7580,"firstReplyAt":"2026-08-25 17:14:47","firstAssignedDate":"2026-08-04 12:26:05","fulfillmentDate":"2026-07-31 17:35:58","openedBy":"Sabrina Zhou","openedDate":"2026-07-31","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1647","year":"2026","requestedFor":"","openedAt":"2026-07-31","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T14:30:42.999Z"},"RITM2920220":{"state":"Awaiting User Info","shortDesc":"Change Website - Napisan.it","assignedTo":"Tatyana Samoylenko","brand":"Napisan","market":"Italy","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":2232,"clientRespMinutes":772,"firstReplyAt":"2026-08-04 22:28:45","firstAssignedDate":"2026-08-04 12:26:21","fulfillmentDate":"2026-08-03 09:17:09","openedBy":"Anna Pasi","openedDate":"2026-08-03","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1556","year":"2026","requestedFor":"","openedAt":"2026-08-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T13:36:00.000Z"},"RITM2921027":{"state":"Closed Complete","shortDesc":"Finish CZ - GA","assignedTo":"Elizaveta Nyarko","brand":"Finish","market":"Czech Republic","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":11384,"clientRespMinutes":30,"firstReplyAt":"2026-08-11 14:04:35","firstAssignedDate":"2026-08-04 12:26:54","fulfillmentDate":"2026-08-03 16:20:27","openedBy":"Rowena Hearn","openedDate":"2026-08-03","closedDate":"2026-08-21","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1611","year":"2026","requestedFor":"","openedAt":"2026-08-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T14:55:16.999Z"},"RITM2921314":{"state":"Closed Complete","shortDesc":"Vanish H1 Visible","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"5334","currencyCode":"MXN","ttfrMinutes":2516,"clientRespMinutes":5006,"firstReplyAt":"2026-08-05 15:20:35","firstAssignedDate":"2026-08-05 04:44:20","fulfillmentDate":"2026-08-03 21:24:32","openedBy":"Sarah Rodrigues","openedDate":"2026-08-03","closedDate":"2026-08-10","toDoAt":"2026-08-05T22:23:40.710+0200","inUatAt":"2026-08-06T15:23:54.873+0200","jiraKey":"WFN-1568","year":"2026","requestedFor":"","openedAt":"2026-08-03","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-10T17:46:37.000Z"},"RITM2921921":{"state":"Awaiting User Info","shortDesc":"Validation rules for Amicasa.it promo form","assignedTo":"Alesya Prolagayeva","brand":"Napisan","market":"Italy","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1667,"clientRespMinutes":18705,"firstReplyAt":"2026-08-05 13:59:45","firstAssignedDate":"2026-08-04 11:57:57","fulfillmentDate":"2026-08-04 10:12:21","openedBy":"Angela Zago","openedDate":"2026-08-04","closedDate":"","toDoAt":"2026-08-05T12:36:46.797+0200","inUatAt":null,"jiraKey":"WFN-1537","year":"2026","requestedFor":"","openedAt":"2026-08-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-18T15:20:50.000Z"},"RITM2922020":{"state":"Awaiting User Info","shortDesc":"Career link on Nurofen website","assignedTo":"Tatyana Samoylenko","brand":"Nurofen","market":"Poland","businessUnit":"Corporate","finalCost":"120","currencyCode":"GBP","ttfrMinutes":709,"clientRespMinutes":396,"firstReplyAt":"2026-08-04 22:48:22","firstAssignedDate":"2026-08-04 12:27:29","fulfillmentDate":"2026-08-04 10:59:34","openedBy":"Julia Lis","openedDate":"2026-08-04","closedDate":"","toDoAt":"2026-08-13T13:44:22.370+0200","inUatAt":"2026-08-13T17:33:12.947+0200","jiraKey":"WFN-1561","year":"2026","requestedFor":"","openedAt":"2026-08-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T19:32:33.000Z"},"RITM2922061":{"state":"Work In Progress","shortDesc":"Create SIL Information Page and QR Codes for Children's Products","assignedTo":"Tatyana Samoylenko","brand":"Nurofen for Children","market":"Poland","businessUnit":"Corporate","finalCost":"430","currencyCode":"GBP","ttfrMinutes":731,"clientRespMinutes":42,"firstReplyAt":"2026-08-04 23:22:25","firstAssignedDate":"2026-08-04 12:41:49","fulfillmentDate":"2026-08-04 11:11:50","openedBy":"Julia Lis","openedDate":"2026-08-04","closedDate":"","toDoAt":"2026-08-25T11:07:26.807+0200","inUatAt":null,"jiraKey":"WFN-1564","year":"2026","requestedFor":"","openedAt":"2026-08-04","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T19:29:58.000Z"},"RITM2923512":{"state":"Awaiting User Info","shortDesc":"Nurofen Website Issues","assignedTo":"Elizaveta Nyarko","brand":"Nurofen","market":"Greece","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":8844,"clientRespMinutes":1666,"firstReplyAt":"2026-08-11 14:03:57","firstAssignedDate":"2026-08-05 14:09:20","fulfillmentDate":"2026-08-05 10:40:28","openedBy":"Eleni Tsatsou","openedDate":"2026-08-05","closedDate":"","toDoAt":"2026-08-20T11:34:49.890+0200","inUatAt":"2026-08-26T15:40:52.430+0200","jiraKey":"WFN-1610","year":"2026","requestedFor":"","openedAt":"2026-08-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T14:29:39.000Z"},"RITM2923566":{"state":"On hold","shortDesc":"Publish 4 articles on Destop.fr","assignedTo":"Elizaveta Nyarko","brand":"Destop","market":"France","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1733,"clientRespMinutes":null,"firstReplyAt":"2026-08-06 16:12:49","firstAssignedDate":"2026-08-05 14:17:08","fulfillmentDate":"2026-08-05 11:19:43","openedBy":"Mouncef Belkeziz","openedDate":"2026-08-05","closedDate":"","toDoAt":"2026-08-14T15:28:37.843+0200","inUatAt":null,"jiraKey":"WFN-1597","year":"2026","requestedFor":"","openedAt":"2026-08-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-14T11:01:45.000Z"},"RITM2923722":{"state":"Closed Complete","shortDesc":"Visa update","assignedTo":"Tatyana Samoylenko","brand":"Gaviscon","market":"Romania","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":1371,"clientRespMinutes":458,"firstReplyAt":"2026-08-06 11:44:49","firstAssignedDate":"2026-08-05 14:10:20","fulfillmentDate":"2026-08-05 12:53:24","openedBy":"Daria Brinaru","openedDate":"2026-08-05","closedDate":"2026-08-20","toDoAt":"2026-08-06T11:33:09.037+0200","inUatAt":"2026-08-06T11:50:42.053+0200","jiraKey":"WFN-1591","year":"2026","requestedFor":"","openedAt":"2026-08-05","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-20T10:07:06.000Z"},"RITM2925045":{"state":"Awaiting User Info","shortDesc":"Creating QR code and LP per created QR code","assignedTo":"Tatyana Samoylenko","brand":"Gaviscon","market":"Poland","businessUnit":"Core Reckitt","finalCost":"240","currencyCode":"GBP","ttfrMinutes":9306,"clientRespMinutes":1372,"firstReplyAt":"2026-08-12 22:42:01","firstAssignedDate":"2026-08-06 12:11:08","fulfillmentDate":"2026-08-06 11:36:30","openedBy":"Katarzyna Majewska","openedDate":"2026-08-06","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1658","year":"2026","requestedFor":"","openedAt":"2026-08-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T07:18:06.000Z"},"RITM2925211":{"state":"Work In Progress","shortDesc":"Creation of QR code and LPs at Strepsils Webstite","assignedTo":"Tatyana Samoylenko","brand":"Strepsils","market":"Poland","businessUnit":"Core Reckitt","finalCost":"420","currencyCode":"GBP","ttfrMinutes":9201,"clientRespMinutes":864,"firstReplyAt":"2026-08-12 22:42:23","firstAssignedDate":"2026-08-07 11:36:17","fulfillmentDate":"2026-08-06 13:21:38","openedBy":"Katarzyna Majewska","openedDate":"2026-08-06","closedDate":"","toDoAt":"2026-08-20T12:30:05.110+0200","inUatAt":"2026-08-25T21:29:40.783+0200","jiraKey":"WFN-1659","year":"2026","requestedFor":"","openedAt":"2026-08-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T06:28:17.000Z"},"RITM2925564":{"state":"Work In Progress","shortDesc":"Please check the consents from mobile + style adjustment","assignedTo":"Alesya Prolagayeva","brand":"Finish","market":"Italy","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":11556,"clientRespMinutes":1827,"firstReplyAt":"2026-08-14 17:31:52","firstAssignedDate":"2026-08-07 11:35:10","fulfillmentDate":"2026-08-06 16:55:48","openedBy":"Angela Zago","openedDate":"2026-08-06","closedDate":"","toDoAt":"2026-08-13T13:14:26.740+0200","inUatAt":null,"jiraKey":"WFN-1644","year":"2026","requestedFor":"","openedAt":"2026-08-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T14:53:42.000Z"},"RITM2925590":{"state":"Closed Complete","shortDesc":"450g Pages Corrections","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Brazil","businessUnit":"Core Reckitt","finalCost":"2667","currencyCode":"MXN","ttfrMinutes":1360,"clientRespMinutes":4568,"firstReplyAt":"2026-08-07 16:02:58","firstAssignedDate":"2026-08-07 11:35:29","fulfillmentDate":"2026-08-06 17:22:44","openedBy":"Sarah Rodrigues","openedDate":"2026-08-06","closedDate":"2026-08-10","toDoAt":"2026-08-07T16:07:50.930+0200","inUatAt":null,"jiraKey":"WFN-1606","year":"2026","requestedFor":"","openedAt":"2026-08-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-10T17:39:25.000Z"},"RITM2925646":{"state":"Awaiting User Info","shortDesc":"Cashback Multibrand promo release - error banner","assignedTo":"Alesya Prolagayeva","brand":"Multibrand","market":"Italy","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":21356,"clientRespMinutes":null,"firstReplyAt":"2026-08-21 13:56:47","firstAssignedDate":"2026-08-07 11:35:43","fulfillmentDate":"2026-08-06 18:00:29","openedBy":"Santiago Garcia Alvarez","openedDate":"2026-08-06","closedDate":"","toDoAt":"2026-08-13T10:06:46.890+0200","inUatAt":"2026-08-20T13:27:57.677+0200","jiraKey":"WFN-1645","year":"2026","requestedFor":"","openedAt":"2026-08-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T10:56:47.000Z"},"RITM2925654":{"state":"Awaiting User Info","shortDesc":"Validation rules for Postal Code and country","assignedTo":"Alesya Prolagayeva","brand":"Multibrand","market":"Italy","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":11471,"clientRespMinutes":null,"firstReplyAt":"2026-08-14 17:22:37","firstAssignedDate":"2026-08-07 11:36:09","fulfillmentDate":"2026-08-06 18:11:59","openedBy":"Santiago Garcia Alvarez","openedDate":"2026-08-06","closedDate":"","toDoAt":"2026-08-25T11:45:21.090+0200","inUatAt":"2026-08-26T11:48:45.023+0200","jiraKey":"WFN-1646","year":"2026","requestedFor":"","openedAt":"2026-08-06","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T14:44:01.999Z"},"RITM2926866":{"state":"Awaiting User Info","shortDesc":"CSP Whitelisting Request for Google Ads Conversion Tracking Tags (Reference: RITM2856661)","assignedTo":"Elizaveta Nyarko","brand":"Nurofen","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"360","currencyCode":"EUR","ttfrMinutes":5737,"clientRespMinutes":141,"firstReplyAt":"2026-08-11 14:37:05","firstAssignedDate":"2026-08-07 18:29:29","fulfillmentDate":"2026-08-07 15:00:31","openedBy":"Mannie Kwan","openedDate":"2026-08-07","closedDate":"","toDoAt":"2026-08-13T16:22:51.487+0200","inUatAt":"2026-08-19T11:21:44.263+0200","jiraKey":"WFN-1623","year":"2026","requestedFor":"","openedAt":"2026-08-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T14:53:04.000Z"},"RITM2927137":{"state":"Work In Progress","shortDesc":"NL website migration new ticket","assignedTo":"Tatyana Samoylenko","brand":"Gaviscon","market":"Netherlands","businessUnit":"Core Reckitt","finalCost":"2800","currencyCode":"EUR","ttfrMinutes":7548,"clientRespMinutes":353,"firstReplyAt":"2026-08-12 23:01:08","firstAssignedDate":"2026-08-07 18:30:00","fulfillmentDate":"2026-08-07 17:12:45","openedBy":"Vera Mavriki","openedDate":"2026-08-07","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1626","year":"2026","requestedFor":"","openedAt":"2026-08-07","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T13:41:55.000Z"},"RITM2928717":{"state":"Closed Complete","shortDesc":"Request Website Update Quote","assignedTo":"Elizaveta Nyarko","brand":"Nurofen","market":"France","businessUnit":"Core Reckitt","finalCost":"504","currencyCode":"EUR","ttfrMinutes":2605,"clientRespMinutes":95,"firstReplyAt":"2026-08-12 12:52:44","firstAssignedDate":"2026-08-11 10:27:35","fulfillmentDate":"2026-08-10 17:27:31","openedBy":"Emma Degouy","openedDate":"2026-08-10","closedDate":"2026-08-26","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-08-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T15:22:50.000Z"},"RITM2928854":{"state":"Awaiting User Info","shortDesc":"update finish FR website","assignedTo":"Elizaveta Nyarko","brand":"Finish","market":"France","businessUnit":"Core Reckitt","finalCost":"1008","currencyCode":"EUR","ttfrMinutes":2274,"clientRespMinutes":null,"firstReplyAt":"2026-08-12 09:37:40","firstAssignedDate":"2026-08-11 10:29:19","fulfillmentDate":"2026-08-10 19:43:58","openedBy":"Emma Tubertini","openedDate":"2026-08-10","closedDate":"","toDoAt":"2026-08-14T15:54:40.993+0200","inUatAt":"2026-08-25T14:15:24.157+0200","jiraKey":"WFN-1636","year":"2026","requestedFor":"","openedAt":"2026-08-10","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T14:25:09.000Z"},"RITM2929658":{"state":"Awaiting User Info","shortDesc":"test on the webpage","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Poland","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":8685,"clientRespMinutes":3128,"firstReplyAt":"2026-08-17 12:54:29","firstAssignedDate":"2026-08-11 13:56:39","fulfillmentDate":"2026-08-11 12:10:00","openedBy":"Katarzyna Majewska","openedDate":"2026-08-11","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1629","year":"2026","requestedFor":"","openedAt":"2026-08-11","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T15:00:28.000Z"},"RITM2931244":{"state":"Closed Complete","shortDesc":"Security Issue","assignedTo":"Tatyana Samoylenko","brand":"Veet","market":"Germany","businessUnit":"Core Reckitt","finalCost":"120","currencyCode":"GBP","ttfrMinutes":17,"clientRespMinutes":1264,"firstReplyAt":"2026-08-12 10:43:45","firstAssignedDate":"2026-08-12 10:43:45","fulfillmentDate":"2026-08-12 10:27:04","openedBy":"Annika Brickwedde","openedDate":"2026-08-12","closedDate":"2026-08-21","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-08-12","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T19:19:11.000Z"},"RITM2933474":{"state":"Awaiting User Info","shortDesc":"Include Careers links in Mexico websites","assignedTo":"Damian Casasnovas","brand":"Multibrand","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":30,"clientRespMinutes":3164,"firstReplyAt":"2026-08-13 21:41:46","firstAssignedDate":"2026-08-14 15:19:34","fulfillmentDate":"2026-08-13 21:12:06","openedBy":"Nomar Arellano","openedDate":"2026-08-13","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1661","year":"2026","requestedFor":"","openedAt":"2026-08-13","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T00:35:10.999Z"},"RITM2936892":{"state":"Awaiting User Info","shortDesc":"Website Changes","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":306,"clientRespMinutes":null,"firstReplyAt":"2026-08-18 14:40:48","firstAssignedDate":"2026-08-18 11:25:31","fulfillmentDate":"2026-08-18 09:34:51","openedBy":"Mina Yilmaz","openedDate":"2026-08-18","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1671","year":"2026","requestedFor":"","openedAt":"2026-08-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-18T11:40:48.000Z"},"RITM2937327":{"state":"Awaiting User Info","shortDesc":"Nurofen - SEO Element Issues","assignedTo":"Elizaveta Nyarko","brand":"Nurofen","market":"Greece","businessUnit":"Core Reckitt","finalCost":"300","currencyCode":"GBP","ttfrMinutes":3075,"clientRespMinutes":115,"firstReplyAt":"2026-08-20 16:36:45","firstAssignedDate":"2026-08-18 13:53:44","fulfillmentDate":"2026-08-18 13:21:37","openedBy":"Eleni Tsatsou","openedDate":"2026-08-18","closedDate":"","toDoAt":"2026-08-25T14:38:34.810+0200","inUatAt":"2026-08-26T15:40:38.473+0200","jiraKey":"WFN-1673","year":"2026","requestedFor":"","openedAt":"2026-08-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T14:28:05.000Z"},"RITM2937926":{"state":"Open","shortDesc":"New Website Harpic Colombia","assignedTo":"Alesya Prolagayeva","brand":"Harpic","market":"Colombia","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":8570,"clientRespMinutes":150,"firstReplyAt":"2026-08-24 20:33:30","firstAssignedDate":"2026-08-21 10:14:05","fulfillmentDate":"2026-08-18 21:43:49","openedBy":"Camila Vargas","openedDate":"2026-08-18","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1703","year":"2026","requestedFor":"","openedAt":"2026-08-18","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-24T17:33:30.000Z"},"RITM2938865":{"state":"Awaiting User Info","shortDesc":"Durex Romania website update","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Romania","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":67,"clientRespMinutes":null,"firstReplyAt":"2026-08-19 15:20:58","firstAssignedDate":"2026-08-19 15:20:58","fulfillmentDate":"2026-08-19 14:13:44","openedBy":"David Stefan","openedDate":"2026-08-19","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1677","year":"2026","requestedFor":"","openedAt":"2026-08-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T12:20:57.999Z"},"RITM2939027":{"state":"Assigned","shortDesc":"Vanish PDP/PLP re-work","assignedTo":"Alesya Prolagayeva","brand":"Vanish","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1130,"clientRespMinutes":null,"firstReplyAt":"2026-08-20 10:55:43","firstAssignedDate":"2026-08-20 10:55:43","fulfillmentDate":"2026-08-19 16:05:49","openedBy":"Rowena Hearn","openedDate":"2026-08-19","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-08-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-21T12:21:15.000Z"},"RITM2939092":{"state":"Awaiting User Info","shortDesc":"www.durex.hu benzocaine condoms web page update","assignedTo":"Alesya Prolagayeva","brand":"Durex","market":"Hungary","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":32,"clientRespMinutes":null,"firstReplyAt":"2026-08-19 17:28:17","firstAssignedDate":"2026-08-19 17:28:17","fulfillmentDate":"2026-08-19 16:56:21","openedBy":"Dorottya Nagy","openedDate":"2026-08-19","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-08-19","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-19T14:28:17.000Z"},"RITM2940506":{"state":"Open","shortDesc":"new website Harpic CR","assignedTo":"Alesya Prolagayeva","brand":"Harpic","market":"Costa Rica","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1611,"clientRespMinutes":null,"firstReplyAt":"2026-08-21 19:39:41","firstAssignedDate":"2026-08-25 11:43:40","fulfillmentDate":"2026-08-20 16:48:50","openedBy":"Andres Atara","openedDate":"2026-08-20","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1701","year":"2026","requestedFor":"","openedAt":"2026-08-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T08:43:39.000Z"},"RITM2940759":{"state":"Work In Progress","shortDesc":"Vanish | Update Prisma, Aries, Powder","assignedTo":"Damian Casasnovas","brand":"Vanish","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":5736,"clientRespMinutes":5713,"firstReplyAt":"2026-08-24 20:54:39","firstAssignedDate":"2026-08-25 03:12:02","fulfillmentDate":"2026-08-20 21:19:04","openedBy":"Ali Méndez","openedDate":"2026-08-20","closedDate":"","toDoAt":"2026-08-25T22:25:51.890+0200","inUatAt":null,"jiraKey":"WFN-1705","year":"2026","requestedFor":"","openedAt":"2026-08-20","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T16:05:26.000Z"},"RITM2942976":{"state":"Awaiting User Info","shortDesc":"Finish TK Website Packshot Revision","assignedTo":"Elizaveta Nyarko","brand":"Finish","market":"Turkey","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":1608,"clientRespMinutes":null,"firstReplyAt":"2026-08-25 13:29:46","firstAssignedDate":"2026-08-25 11:44:35","fulfillmentDate":"2026-08-24 10:41:51","openedBy":"Bengisu Uluyurt","openedDate":"2026-08-24","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-08-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T10:23:34.999Z"},"RITM2943364":{"state":"Awaiting User Info","shortDesc":"Veet website changes","assignedTo":"Tatyana Samoylenko","brand":"Veet","market":"Portugal","businessUnit":"Core Reckitt","finalCost":"420","currencyCode":"GBP","ttfrMinutes":1475,"clientRespMinutes":119,"firstReplyAt":"2026-08-25 14:43:35","firstAssignedDate":"2026-08-25 11:44:13","fulfillmentDate":"2026-08-24 14:08:52","openedBy":"Sara Corrêa","openedDate":"2026-08-24","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1711","year":"2026","requestedFor":"","openedAt":"2026-08-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T09:46:38.000Z"},"RITM2943697":{"state":"Open","shortDesc":"Website changes needed","assignedTo":"Damian Casasnovas","brand":"Dettol","market":"Argentina","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":229,"clientRespMinutes":null,"firstReplyAt":"2026-08-24 20:52:45","firstAssignedDate":"2026-08-25 11:43:55","fulfillmentDate":"2026-08-24 17:03:47","openedBy":"Nadia DiMatteo","openedDate":"2026-08-24","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1706","year":"2026","requestedFor":"","openedAt":"2026-08-24","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-25T08:43:55.000Z"},"RITM2944926":{"state":"Work In Progress","shortDesc":"amendment on napisan website","assignedTo":"Alesya Prolagayeva","brand":"","market":"","businessUnit":"","finalCost":"","currencyCode":"","ttfrMinutes":1309,"clientRespMinutes":null,"firstReplyAt":"2026-08-26 10:19:37","firstAssignedDate":"2026-08-26 10:20:46","fulfillmentDate":"2026-08-25 12:30:31","openedBy":"Alessia Possamai","openedDate":"2026-08-25","closedDate":"","toDoAt":"2026-08-26T15:42:45.710+0200","inUatAt":null,"jiraKey":"WFN-1719","year":"2026","requestedFor":"","openedAt":"2026-08-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T11:31:28.000Z"},"RITM2945229":{"state":"Awaiting User Info","shortDesc":"0","assignedTo":"Alesya Prolagayeva","brand":"","market":"","businessUnit":"","finalCost":"","currencyCode":"","ttfrMinutes":1111,"clientRespMinutes":null,"firstReplyAt":"2026-08-26 10:19:01","firstAssignedDate":"2026-08-26 10:20:59","fulfillmentDate":"2026-08-25 15:47:45","openedBy":"Alessia Possamai","openedDate":"2026-08-25","closedDate":"","toDoAt":"2026-08-26T14:50:34.627+0200","inUatAt":"2026-08-26T17:11:14.577+0200","jiraKey":"WFN-1722","year":"2026","requestedFor":"","openedAt":"2026-08-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T13:46:28.000Z"},"RITM2945319":{"state":"Awaiting User Info","shortDesc":"Gaviscon | DACH migration - CH","assignedTo":"Tatyana Samoylenko","brand":"Gaviscon","market":"Switzerland","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":308,"clientRespMinutes":null,"firstReplyAt":"2026-08-25 21:59:27","firstAssignedDate":"2026-08-25 17:14:00","fulfillmentDate":"2026-08-25 16:51:57","openedBy":"Hector Eichenlaub","openedDate":"2026-08-25","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1714","year":"2026","requestedFor":"","openedAt":"2026-08-25","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T14:53:32.000Z"},"RITM2946192":{"state":"Awaiting User Info","shortDesc":"GRIP website migration","assignedTo":"Elizaveta Nyarko","brand":"Strepsils","market":"United Kingdom","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":188,"clientRespMinutes":null,"firstReplyAt":"2026-08-26 13:35:08","firstAssignedDate":"2026-08-26 11:33:23","fulfillmentDate":"2026-08-26 10:26:55","openedBy":"Rowena Hearn","openedDate":"2026-08-26","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1721","year":"2026","requestedFor":"","openedAt":"2026-08-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T15:16:25.000Z"},"RITM2946810":{"state":"Work In Progress","shortDesc":"Website updating","assignedTo":"Elizaveta Nyarko","brand":"Strepsils","market":"Spain","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":102,"clientRespMinutes":null,"firstReplyAt":"2026-08-26 17:32:12","firstAssignedDate":"2026-08-26 17:15:51","fulfillmentDate":"2026-08-26 15:50:38","openedBy":"Diego Cortes De Ita","openedDate":"2026-08-26","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":null,"year":"2026","requestedFor":"","openedAt":"2026-08-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T14:32:11.999Z"},"RITM2946948":{"state":"Awaiting User Info","shortDesc":"Gavison IE website update","assignedTo":"Alesya Prolagayeva","brand":"Gaviscon","market":"Ireland","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":82,"clientRespMinutes":null,"firstReplyAt":"2026-08-26 18:26:06","firstAssignedDate":"2026-08-26 17:16:03","fulfillmentDate":"2026-08-26 17:04:18","openedBy":"Ismena Kielkowska","openedDate":"2026-08-26","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1727","year":"2026","requestedFor":"","openedAt":"2026-08-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T15:26:06.000Z"},"RITM2947066":{"state":"Awaiting User Info","shortDesc":"Upgrade Harpic´s latest Husky version","assignedTo":"Damian Casasnovas","brand":"Harpic","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":185,"clientRespMinutes":null,"firstReplyAt":"2026-08-26 21:22:55","firstAssignedDate":"2026-08-26 21:22:55","fulfillmentDate":"2026-08-26 18:18:13","openedBy":"Sara Nuñez","openedDate":"2026-08-26","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1731","year":"2026","requestedFor":"","openedAt":"2026-08-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T18:22:55.000Z"},"RITM2947074":{"state":"Awaiting User Info","shortDesc":"Upgrade Lysol´s latest Husky version","assignedTo":"Damian Casasnovas","brand":"Lysol","market":"Mexico","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":162,"clientRespMinutes":null,"firstReplyAt":"2026-08-26 21:12:49","firstAssignedDate":"2026-08-26 21:12:49","fulfillmentDate":"2026-08-26 18:30:38","openedBy":"Sara Nuñez","openedDate":"2026-08-26","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1730","year":"2026","requestedFor":"","openedAt":"2026-08-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":"2026-08-26T18:12:49.000Z"},"RITM2946434":{"state":"Open","shortDesc":"update microsite apostolikathariotita.gr","assignedTo":"Tatyana Samoylenko","brand":"Dettol","market":"Greece","businessUnit":"Core Reckitt","finalCost":"","currencyCode":"","ttfrMinutes":null,"clientRespMinutes":null,"firstReplyAt":"","firstAssignedDate":"2026-08-26 17:15:19","fulfillmentDate":"2026-08-26 12:23:09","openedBy":"Froso Liapodimitri","openedDate":"2026-08-26","closedDate":"","toDoAt":null,"inUatAt":null,"jiraKey":"WFN-1732","year":"2026","requestedFor":null,"openedAt":"2026-08-26","stateChangedAt":null,"stateChangedBy":null,"lastActivityAt":null,"lastActivityBy":null,"_updated":null}}} \ No newline at end of file diff --git a/server/data/config.json b/server/data/config.json new file mode 100644 index 0000000..dcc05d0 --- /dev/null +++ b/server/data/config.json @@ -0,0 +1,180 @@ +{ + "insightsThresholds": { + "assigned": 2, + "awaiting": 5, + "customerReplied": 1, + "hold": 5, + "jiraStuck": 7, + "jiraUAT": 7, + "lifetime": 90, + "noChase": 5, + "unassigned": 1, + "waitingPo1": 7, + "waitingPo2": 14, + "waitingPo3": 18, + "wip": 7 + }, + "fxRates": { + "EUR": 1.2, + "GBP": 1, + "MXN": 20 + }, + "sizeThresholds": { + "XS": 120, + "S": 300, + "M": 600, + "L": 1200, + "XL": 3000, + "XXL": 9000 + }, + "norms": { + "otd": { + "XS": 7, + "S": 14, + "M": 30, + "L": 90, + "XL": 90, + "XXL": 90 + }, + "avgdays": { + "XS": 7, + "S": 14, + "M": 30, + "L": 90, + "XL": 90, + "XXL": 90 + }, + "asla": { + "XS": 1, + "S": 1, + "M": 1, + "L": 1, + "XL": 1, + "XXL": 1 + }, + "psla": { + "XS": 3, + "S": 6, + "M": 9, + "L": 15, + "XL": 30, + "XXL": 30 + }, + "ttfr": { + "XS": 24, + "S": 24, + "M": 24, + "L": 24, + "XL": 24, + "XXL": 24 + }, + "cresp": { + "XS": 24, + "S": 24, + "M": 24, + "L": 24, + "XL": 24, + "XXL": 24 + } + }, + "brandColors": { + "air": "#40248f", + "airwick": "#72248f", + "amicasa": "#6d248f", + "biofreeze": "#4d248f", + "calgon": "#8f2424", + "cillit": "#24868f", + "clearasil": "#8f4424", + "destop": "#37248f", + "dettol": "#248f4b", + "dobendan": "#248f5f", + "durex": "#568f24", + "finish": "#8d248f", + "fullmarks": "#69248f", + "fybogel": "#8f5924", + "gaviscon": "#248f81", + "harpic": "#8f2469", + "intima": "#608f24", + "k": "#428f24", + "kukident": "#8f2489", + "lemsip": "#8f8424", + "lovela": "#30248f", + "luftal": "#2e8f24", + "lysol": "#248f46", + "multibrand": "#68248f", + "naldecon": "#8f244f", + "napisan": "#648f24", + "nurofen": "#62248f", + "nuromol": "#368f24", + "oh": "#24578f", + "optrex": "#8f6024", + "picot": "#86248f", + "reckitt.com": "#8f2524", + "resolve": "#248f2b", + "ritm2653436": "#8f6624", + "sagrotan": "#8f2474", + "sbp": "#248f5f", + "sico": "#8f2476", + "sole": "#24378f", + "stmarcs": "#49248f", + "strepfen": "#70248f", + "strepsils": "#8f245b", + "tempra": "#8f2466", + "vanish": "#748f24", + "veet": "#24528f", + "veja": "#8f2436", + "woolite": "#8f248d" + }, + "snowColors": { + "activityField": "#eff1e0", + "activityHeader": "#ccccf5", + "assignedToField": "#ddffe1", + "requesterComment": "#efdcee", + "stateField": "#ffd666", + "workNotes": "#e1d3b8" + }, + "statesOrder": [ + "1", + "-5", + "2", + "3", + "5", + "6", + "8", + "4", + "7", + "12", + "9", + "10", + "13" + ], + "displayCurrency": "GBP", + "colleagues": [ + "Alesya Prolagayeva", + "Elizaveta Nyarko", + "Tatyana Samoylenko", + "Oksana Batyuk", + "Taras Shevchenko", + "Herman Bykanov (Inactive)", + "Levon Mkrtchyan (Inactive)", + "Dmitry Koziyev (Inactive)" + ], + "latamAssignees": [ + "Damian Casasnovas", + "Jesica Greco" + ], + "jiraColumns": [ + "Analysis", + "Approval", + "TO DO", + "On Hold/Blocked", + "In Progress", + "Ready for UAT", + "UAT", + "Ready To Deploy to Prod", + "Released", + "Waiting PO", + "Closed", + "Cancelled" + ] +} \ No newline at end of file diff --git a/server/data/finance.json b/server/data/finance.json new file mode 100644 index 0000000..b14502b --- /dev/null +++ b/server/data/finance.json @@ -0,0 +1 @@ +{"schema":1,"generatedAt":"2026-08-27T16:04:47.908Z","count":860,"rows":{"RITM2200028":{"cost":"150","currency":"","po":"4503603496","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127072&milestoneId=129305","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2202971":{"cost":"950","currency":"","po":"4503833447","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=149890","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2203134":{"cost":"150","currency":"","po":"4503615661","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127071&milestoneId=125166","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2203139":{"cost":"150","currency":"","po":"4503598063","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127035&milestoneId=125168","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2204154":{"cost":"150","currency":"","po":"4503803035","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=125201","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2204269":{"cost":"150","currency":"","po":"4503803035","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=125200","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2205023":{"cost":"150","currency":"","po":"4503310624","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127069&milestoneId=125171","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2205223":{"cost":"150","currency":"","po":"4503310632","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=125840","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2205462":{"cost":"150","currency":"","po":"4503310626","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127068&milestoneId=125175","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2207860":{"cost":"10500","currency":"","po":"OTC 4503804667","invoiced":"","milestone":"https://pmaccounting.dataart.com/Project?projectId=127109","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2208125":{"cost":"1320","currency":"","po":"4503803035","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=125199","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2208891":{"cost":"550","currency":"","po":"4503307916","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127068&milestoneId=125457","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2208967":{"cost":"1800","currency":"EUR","po":"4503341726","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=126237","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2209369":{"cost":"150","currency":"","po":"4503813376","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=133263","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2209551":{"cost":"480","currency":"","po":"4503660046","invoiced":"Not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=125184","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2210228":{"cost":"180","currency":"","po":"4503660046","invoiced":"Not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=125185","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2210774":{"cost":"4000","currency":"","po":"4503751938","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=125150","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2211032":{"cost":"8000","currency":"","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=146342","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2213216":{"cost":"2520","currency":"","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=125125","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2213392":{"cost":"950","currency":"","po":"4504050123","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127209&milestoneId=126124","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2213731":{"cost":"33334","currency":"","po":"4503812984","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128192&milestoneId=132374","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2214864":{"cost":"400","currency":"","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128248&milestoneId=133627","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2216709":{"cost":"","currency":"","po":"-","invoiced":"-","milestone":"Cancelled ticket","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2217257":{"cost":"1236","currency":"","po":"4503341825","invoiced":"No","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=125235","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2217277":{"cost":"480","currency":"","po":"4503341825","invoiced":"No","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=125236","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2222060":{"cost":"150","currency":"","po":"4503833447","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=149893","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2222954":{"cost":"3000","currency":"","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=133630","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2225337":{"cost":"2100","currency":"","po":"4503803974","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130637&milestoneId=148518","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2226188":{"cost":"400","currency":"","po":"4503803979","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130637&milestoneId=148516","state":"","pm":"Alesya Prolagayeva"},"RITM2226241":{"cost":"400","currency":"","po":"4503803980","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130637&milestoneId=148517","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2227176":{"cost":"1800","currency":"","po":"4504091208","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=133413&milestoneId=158802","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2227633":{"cost":"480","currency":"","po":"4503812728","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=125847","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2228832":{"cost":"480","currency":"","po":"4503826155","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=159354","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2228869":{"cost":"480","currency":"","po":"4503826155","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=159355","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2229999":{"cost":"1320","currency":"","po":"4503338677; 4503430659","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=135379","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2230038":{"cost":"800","currency":"","po":"4503789083","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127913&milestoneId=148498","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2230046":{"cost":"150","currency":"","po":"4503789083","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127913&milestoneId=148489","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2230555":{"cost":"480","currency":"","po":"4503341726","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=125231","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2231449":{"cost":"0","currency":"","po":"","invoiced":"-","milestone":"no actual work done there","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2231558":{"cost":"3120","currency":"","po":"4503315470; 4503465294","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127068&milestoneId=125503","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2231849":{"cost":"2667","currency":"","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128192&milestoneId=132372","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2231918":{"cost":"1200","currency":"","po":"4503806820","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=150786","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2232933":{"cost":"144","currency":"","po":"4503341825","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=125123","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2233625":{"cost":"","currency":"","po":"-","invoiced":"-","milestone":"Canceled","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2234852":{"cost":"144","currency":"","po":"4503341726","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=125195","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2237838":{"cost":"144","currency":"","po":"4503341825","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=125233","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2237936":{"cost":"2160","currency":"","po":"4503330038","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127084&milestoneId=125196","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2238690":{"cost":"720","currency":"","po":"4503341825","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=125197","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2238738":{"cost":"29334","currency":"","po":"4503812984","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128192&milestoneId=132374","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2238866":{"cost":"120","currency":"","po":"4503803035","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=125198","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2239027":{"cost":"360","currency":"EUR","po":"4504120630","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128247&milestoneId=160080","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2241631":{"cost":"360","currency":"","po":"4503341726","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=125232","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2241875":{"cost":"600","currency":"","po":"4503666863","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=125142","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2241884":{"cost":"600","currency":"","po":"4503666863","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=125237","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2242541":{"cost":"N/A","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Renata Probst Martínez"},"RITM2243475":{"cost":"3900","currency":"","po":"4503311807","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=147971","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2243662":{"cost":"8400","currency":"","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=133301","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2245027":{"cost":"6000","currency":"","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=133636","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2245032":{"cost":"26000","currency":"","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=133637","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2245309":{"cost":"120","currency":"","po":"4503603496","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127072&milestoneId=129306","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2245437":{"cost":"144","currency":"","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=125234","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2245992":{"cost":"120","currency":"","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=148960","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2245995":{"cost":"6000","currency":"","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=133644","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2247173":{"cost":"300","currency":"","po":"4504132035","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128247&milestoneId=160705","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2247862":{"cost":"120","currency":"","po":"4503789083","invoiced":"old one was 4503396323","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127913&milestoneId=148494","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2247884":{"cost":"800","currency":"","po":"4503789083","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127913&milestoneId=148500","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2247994":{"cost":"2160","currency":"","po":"4503504073","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=125206","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2248652":{"cost":"1200","currency":"","po":"4503266524","invoiced":"-","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126963&milestoneId=125225","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2249760":{"cost":"","currency":"","po":"","invoiced":"-","milestone":"","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2249787":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2250764":{"cost":"720","currency":"","po":"4503826155","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=159356","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2250913":{"cost":"720","currency":"","po":"4504049918","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127193&milestoneId=126196","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2252326":{"cost":"120","currency":"","po":"4503731414","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=133645","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2253108":{"cost":"144","currency":"","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=125207","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2256277":{"cost":"144","currency":"","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=125124","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2256301":{"cost":"1800","currency":"","po":"4504098565","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=133413&milestoneId=158801","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2256416":{"cost":"144","currency":"","po":"4503341726","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=125138","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2257623":{"cost":"360","currency":"","po":"4503341726","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=125139","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2260846":{"cost":"144","currency":"EUR","po":"4503504073","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=125205","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2261615":{"cost":"360","currency":"EUR","po":"4503444868","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=125162","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2261715":{"cost":"360","currency":"EUR","po":"4503444868","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=125227","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2261836":{"cost":"1080","currency":"EUR","po":"4503504073","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=125204","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2262868":{"cost":"600","currency":"","po":"4503266524","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126963&milestoneId=125096","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2263386":{"cost":"1440","currency":"GBP","po":"4503430399","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=147369","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2264893":{"cost":"2667","currency":"MXN","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128192&milestoneId=132373","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2264948":{"cost":"1440","currency":"EUR","po":"4503320394","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=125226","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2265123":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Renata Probst Martínez"},"RITM2265129":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Renata Probst Martínez"},"RITM2265605":{"cost":"1080","currency":"EUR","po":"4503806820","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=150789","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2267416":{"cost":"120","currency":"","po":"4503266524","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126963&milestoneId=125161","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2267440":{"cost":"360","currency":"EUR","po":"4503341726","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=125167","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2268403":{"cost":"900","currency":"GBP","po":"4504050123","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127209&milestoneId=128258","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2268588":{"cost":"360","currency":"EUR","po":"4503444868","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=125230","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2269252":{"cost":"720","currency":"EUR","po":"4503761224","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127737&milestoneId=128992","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2269480":{"cost":"720","currency":"EUR","po":"4503320394","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=125345","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2270715":{"cost":"600","currency":"GBP","po":"4504048977","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127209&milestoneId=125290","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2270835":{"cost":"300","currency":"","po":"4503731415","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=125292","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2271027":{"cost":"7900","currency":"GBP","po":"4503323194","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127375&milestoneId=125913","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2271040":{"cost":"7400","currency":"GBP","po":"4503323194","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127375&milestoneId=135368","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2271191":{"cost":"6667","currency":"MXN","po":"4503814048","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128193&milestoneId=132378","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2273934":{"cost":"720","currency":"EUR","po":"4503802664","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127084&milestoneId=125473","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2273963":{"cost":"144","currency":"EUR","po":"4503826155","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=159357","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2273966":{"cost":"1584","currency":"EUR","po":"4503320394","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=125346","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2274038":{"cost":"720","currency":"EUR","po":"4503341726","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=125333","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2275182":{"cost":"264","currency":"EUR","po":"4503824156","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=133260","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2275232":{"cost":"300","currency":"GBP","po":"4503824156","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=133261","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2275853":{"cost":"750","currency":"GBP (600 + 150 from silktide )","po":"OTC 4503804667","invoiced":"","milestone":"https://pmaccounting.dataart.com/Project?projectId=127109","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2275978":{"cost":"600","currency":"GBP","po":"4503761346","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=125445","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2276156":{"cost":"1200","currency":"GBP","po":"4503331745","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=125849","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2276822":{"cost":"288","currency":"EUR","po":"4503341726","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=125364","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2276961":{"cost":"504","currency":"EUR","po":"4503320394","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=125447","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2277074":{"cost":"1440","currency":"EUR","po":"4503341726","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=125369","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2278146":{"cost":"360","currency":"EUR","po":"4503341726","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=125367","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2278492":{"cost":"144","currency":"EUR","po":"4503320394","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=125439","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2278580":{"cost":"120","currency":"","po":"4503540183","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=125381","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2278587":{"cost":"120","currency":"GBP","po":"4503540183","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=125441","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2280140":{"cost":"360","currency":"EUR","po":"4503826155","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=159358","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2281307":{"cost":"6000","currency":"MXN","po":"4503812984","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128192&milestoneId=132240","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2282169":{"cost":"120","currency":"GBP","po":"4503815375","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126962&milestoneId=125464","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2282424":{"cost":"120","currency":"","po":"4503540183","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=125463","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2287118":{"cost":"600","currency":"GBP","po":"4503391975","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=129108","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2287252":{"cost":"360","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=129109","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2287475":{"cost":"24000","currency":"MXN","po":"4503429910","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128193&milestoneId=132141","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2288252":{"cost":"144","currency":"EUR","po":"4503341726","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=126244","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2288481":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=133259","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2288554":{"cost":"720","currency":"EUR","po":"4503739198","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=126130","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2288579":{"cost":"1350","currency":"GBP","po":"4503425210","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=129159","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2288640":{"cost":"144","currency":"EUR","po":"4503341726","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=126138","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2288653":{"cost":"360","currency":"EUR","po":"4503341726","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=126197","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2288843":{"cost":"6667","currency":"MXN","po":"4503769137","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128192&milestoneId=133646","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2289452":{"cost":"","currency":"","po":"old wfd ticket, no CE","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2289951":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"","pm":""},"RITM2289956":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"","pm":""},"RITM2289960":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"","pm":""},"RITM2291756":{"cost":"360","currency":"EUR","po":"4503386995","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127028&milestoneId=129036","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2292030":{"cost":"4000","currency":"GBP","po":"OTC 4503804667","invoiced":"","milestone":"https://pmaccounting.dataart.com/Project?projectId=127109","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2293120":{"cost":"360","currency":"EUR","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=126195","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2294092":{"cost":"3000","currency":"'+300 GBP to take from silktide","po":"OTC 4503804667 (300gbp) 4503802365 (3000gbp)","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131056&milestoneId=148328","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2294676":{"cost":"120","currency":"GBP","po":"4503666863","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=126236","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2296456":{"cost":"900","currency":"GBP","po":"4504048977","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127209&milestoneId=128814","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2297097":{"cost":"1200","currency":"GBP","po":"4504048977","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127209&milestoneId=128815","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2298374":{"cost":"1320","currency":"GBP","po":"4503833447","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=149898","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2299463":{"cost":"120","currency":"GBP","po":"4503601932","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127072&milestoneId=126562","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2299711":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=126597","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2300059":{"cost":"504","currency":"EUR","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=126596","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2301170":{"cost":"2667","currency":"MXN","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128192&milestoneId=132375","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2301908":{"cost":"600","currency":"GBP","po":"4503761346","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=128819","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2303574":{"cost":"720","currency":"EUR","po":"4503346526","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=128706","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2305471":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"","pm":""},"RITM2305521":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Renata Probst Martínez"},"RITM2306265":{"cost":"288","currency":"EUR","po":"4503387005 4503712489","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127028&milestoneId=129037","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2306301":{"cost":"0","currency":"0","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2306355":{"cost":"200","currency":"GBP","po":"OTC 4503804667","invoiced":"","milestone":"https://pmaccounting.dataart.com/Project?projectId=127109","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2306622":{"cost":"600","currency":"GBP","po":"4503789083","invoiced":"-","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127913&milestoneId=148502","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2307106":{"cost":"3600","currency":"600GBP (to take from silktide OTC 2024) + 3000GBP (to take from Nurofen ...of multi symptom comms OTC 2025)","po":"OTC 4503804667 (600gbp) 4503802364 (3000gbp)","invoiced":"","milestone":"https://pmaccounting.dataart.com/Project?projectId=127109","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2312558":{"cost":"1600","currency":"GBP","po":"OTC 4503802364","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128037&milestoneId=129811","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2314425":{"cost":"2400","currency":"MXN","po":"4503573626","invoiced":"-","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=132280","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2314483":{"cost":"14400","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=131112","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2314492":{"cost":"60000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=131379","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2315142":{"cost":"1440","currency":"EUR","po":"4503660046","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=129155","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2316047":{"cost":"144","currency":"EUR","po":"4503826155","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=159359","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2316231":{"cost":"2400","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=131110","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2320991":{"cost":"360","currency":"EUR","po":"4503378263","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126963&milestoneId=129162","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2321410":{"cost":"600","currency":"GBP","po":"4503471337","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=129160","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2321583":{"cost":"180","currency":"EUR","po":"4503802664","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127084&milestoneId=132455","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2322404":{"cost":"720","currency":"EUR","po":"4503418405","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=128902","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2322451":{"cost":"2160","currency":"EUR","po":"4503760586","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128249&milestoneId=133649","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2326512":{"cost":"2160","currency":"EUR","po":"4503388032","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=128873","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2327872":{"cost":"360","currency":"EUR","po":"4503401090","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126963&milestoneId=128903","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2329058":{"cost":"600","currency":"GBP","po":"4504048977","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127209&milestoneId=128893","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2329657":{"cost":"360","currency":"EUR","po":"4503540181","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127737&milestoneId=129114","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2330913":{"cost":"144","currency":"EUR","po":"4504048977","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127209&milestoneId=129165","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2331909":{"cost":"1080","currency":"EUR","po":"4503392059","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=129157","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2331948":{"cost":"144","currency":"EUR","po":"4503401090","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126963&milestoneId=128914","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2339038":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Renata Probst Martínez"},"RITM2339178":{"cost":"2400","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=133300","state":"Closed Complete","pm":"Jesica Greco"},"RITM2343198":{"cost":"720","currency":"GBP","po":"4503430399","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=135374","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2343876":{"cost":"600","currency":"GBP","po":"4503761346","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=134131","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2344486":{"cost":"144","currency":"EUR","po":"4503826155","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=159360","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2345595":{"cost":"144","currency":"EUR","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=134133","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2346364":{"cost":"360","currency":"EUR","po":"4503826155","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=159361","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2346370":{"cost":"144","currency":"EUR","po":"4503826155","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=159362","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2346776":{"cost":"1920","currency":"GBP","po":"4503603119","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=132916","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2346976":{"cost":"120","currency":"GBP","po":"4503731415","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=134135","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2348322":{"cost":"144","currency":"EUR","po":"4503802662","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127084&milestoneId=131111","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2348593":{"cost":"300","currency":"GBP","po":"4504048977","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127209&milestoneId=134136","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2348621":{"cost":"144","currency":"EUR","po":"4503465570","invoiced":"-","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127029&milestoneId=131254","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2348658":{"cost":"6000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=134138","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2349778":{"cost":"120","currency":"","po":"4503731354","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=130001","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2349980":{"cost":"2400","currency":"MXN","po":"4503439866","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128193&milestoneId=131083","state":"Closed Complete","pm":"Jesica Greco"},"RITM2353536":{"cost":"12000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=131107","state":"Closed Complete","pm":"Jesica Greco"},"RITM2353566":{"cost":"12000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=131108","state":"Closed Complete","pm":"Jesica Greco"},"RITM2353570":{"cost":"24000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=131109","state":"Closed Complete","pm":"Jesica Greco"},"RITM2354283":{"cost":"600","currency":"GBP","po":"4503418491","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=130305","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2354711":{"cost":"2400","currency":"MXN","po":"4503426522","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128193&milestoneId=130807","state":"Closed Complete","pm":"Jesica Greco"},"RITM2355895":{"cost":"1200","currency":"GBP","po":"4503468626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=131983","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2356931":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=129980","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2358455":{"cost":"600","currency":"GBP","po":"OTC 4503804667","invoiced":"","milestone":"https://pmaccounting.dataart.com/Project?projectId=127109","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2359445":{"cost":"144","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127084&milestoneId=130085","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2360424":{"cost":"720","currency":"EUR","po":"4503803035","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=130149","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2360450":{"cost":"300","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=131401","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2360594":{"cost":"300","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=130304","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2360633":{"cost":"1200","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=145095","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2360773":{"cost":"3600","currency":"GBP","po":"4503790857","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127069&milestoneId=149434","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2363503":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=145091","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2363738":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Renata Probst Martínez"},"RITM2365861":{"cost":"1440","currency":"EUR","po":"4503500866","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=131477","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2366291":{"cost":"720","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=133257","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2367368":{"cost":"1500","currency":"GBP","po":"4503513461","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=133273","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2367378":{"cost":"1500","currency":"GBP","po":"4503506296","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=133274","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2367658":{"cost":"144","currency":"EUR","po":"4503526062","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128247&milestoneId=131078","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2368833":{"cost":"120","currency":"GBP","po":"4504079523","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=159236","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2368992":{"cost":"300","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=145094","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2369894":{"cost":"600","currency":"GBP","po":"4503761346","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=134192","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2369928":{"cost":"0","currency":"Part of localization project","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2369979":{"cost":"144","currency":"EUR","po":"4503443212","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=131077","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2372390":{"cost":"6000","currency":"MXN","po":"4503722100","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=133299","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2372804":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2373161":{"cost":"3024","currency":"EUR","po":"4503473054","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=131080","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2373236":{"cost":"1200","currency":"GBP","po":"4503506088","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=133275","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2373244":{"cost":"1200","currency":"GBP","po":"4503506294","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=133276","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2373256":{"cost":"1200","currency":"GBP","po":"4503513462","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=133277","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2373278":{"cost":"1200","currency":"GBP","po":"4503506295","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=133278","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2374773":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=145093","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2374822":{"cost":"300","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=145092","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2375593":{"cost":"900","currency":"GBP","po":"4503653806","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=132396","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2376095":{"cost":"144","currency":"EUR","po":"4503526392","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=131246","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2376316":{"cost":"2400","currency":"MXN","po":"4503458351","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128193&milestoneId=131082","state":"Closed Complete","pm":"Jesica Greco"},"RITM2378963":{"cost":"360","currency":"EUR","po":"4503454077","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=131245","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2379538":{"cost":"300","currency":"GBP","po":"4503731414","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=130926","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2379993":{"cost":"120","currency":"GBP","po":"4503450065","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=131161","state":"Closed Complete","pm":"Levon Mkrtchyan (Inactive)"},"RITM2380129":{"cost":"3000","currency":"GBP","po":"OTC 4503804667","invoiced":"","milestone":"https://pmaccounting.dataart.com/Project?projectId=127109","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2380217":{"cost":"1944","currency":"EUR ","po":"4503499091","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=146196","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2382388":{"cost":"120","currency":"GBP","po":"4503461300","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=131280","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2383391":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2385118":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=131626","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2385354":{"cost":"3024","currency":"EUR","po":"4503660046","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=132158","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2386789":{"cost":"2304","currency":"EUR","po":"4503473058","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=131400","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2387190":{"cost":"1200","currency":"GBP","po":"4503540184","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=132399","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2387454":{"cost":"300","currency":"GBP","po":"4503666863","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=132397","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2387463":{"cost":"24000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=132688","state":"Closed Complete","pm":"Jesica Greco"},"RITM2388718":{"cost":"600","currency":"GBP","po":"4503471338","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=132161","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2390680":{"cost":"2667","currency":"MXN","po":"4503458484","invoiced":"","milestone":"","state":"Closed Complete","pm":"Jesica Greco"},"RITM2390885":{"cost":"360","currency":"EUR","po":"4503803035","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=132497","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2391587":{"cost":"1320","currency":"GBP","po":"4503513879","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127072&milestoneId=131476","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2393006":{"cost":"26400","currency":"MXN","po":"4503492505","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=132320","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2393594":{"cost":"300","currency":"GBP","po":"4503731354","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=132287","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2395773":{"cost":"1500","currency":"GBP","po":"4503790859","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127068&milestoneId=132412","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2395775":{"cost":"1200","currency":"GBP","po":"4503790859","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127068&milestoneId=149435","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2397565":{"cost":"1200","currency":"GBP","po":"4503506089","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=132160","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2399911":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=132140","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2399917":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=132139","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2400085":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=132138","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2400087":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=132137","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2400095":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=132136","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2400193":{"cost":"6000","currency":"","po":"4503315469, 4503315468","invoiced":"old ticket is RITM2237913","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127069&milestoneId=125505","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2401690":{"cost":"360","currency":"EUR","po":"4503660050","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=132285","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2401937":{"cost":"720","currency":"GBP","po":"4503731415","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=132667","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2403293":{"cost":"300","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=132666","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2403305":{"cost":"504","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=134223","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2404510":{"cost":"540","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=133225","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2404685":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=132665","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2404864":{"cost":"300","currency":"GBP","po":"4503504098","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=132686","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2406739":{"cost":"864","currency":"EUR","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=132493","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2407251":{"cost":"2400","currency":"GBP","po":"4503820073","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126962&milestoneId=134705","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2407852":{"cost":"360","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=134267","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2407936":{"cost":"360","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=132655","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2408284":{"cost":"1440","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=132395","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2408820":{"cost":"720","currency":"EUR","po":"4503498150","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126963&milestoneId=132452","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2409041":{"cost":"1368","currency":"EUR","po":"4503505653","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=132699","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2409447":{"cost":"2160","currency":"EUR","po":"4503659692","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=134268","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2412483":{"cost":"900","currency":"GBP","po":"4503833447","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=149891","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2413390":{"cost":"1224","currency":"EUR","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=133000","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2413585":{"cost":"300","currency":"GBP","po":"4503533621","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126962&milestoneId=133267","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2413975":{"cost":"1200","currency":"GBP","po":"4503833447","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=149896","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2414142":{"cost":"720","currency":"GBP","po":"4503531074","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127068&milestoneId=133388","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2414374":{"cost":"432","currency":"EUR","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=134271","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2414868":{"cost":"300","currency":"GBP","po":"4503813376","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=134272","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2416622":{"cost":"360","currency":"EUR","po":"4503641947","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=134273","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2416734":{"cost":"360","currency":"EUR","po":"4503660046","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=134020","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2423653":{"cost":"6000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=133207","state":"Closed Complete","pm":"Jesica Greco"},"RITM2423658":{"cost":"12000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=134274","state":"Closed Complete","pm":"Jesica Greco"},"RITM2424496":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Sam Page"},"RITM2424775":{"cost":"144","currency":"EUR","po":"4503526157","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127084&milestoneId=133006","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2424798":{"cost":"1200","currency":"GBP","po":"4503579167","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127066&milestoneId=134275","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2424802":{"cost":"600","currency":"GBP","po":"4503579167","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127065&milestoneId=134276","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2424804":{"cost":"1200","currency":"GBP","po":"4503579167","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=148134","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2424807":{"cost":"600","currency":"GBP","po":"4503579167","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=134278","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2424809":{"cost":"600","currency":"GBP","po":"4503579166","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=148135","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2427594":{"cost":"144","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127084&milestoneId=133229","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2428055":{"cost":"360","currency":"EUR","po":"4503515175","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=133297","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2428594":{"cost":"600","currency":"GBP","po":"4503513460","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=133387","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2428943":{"cost":"720","currency":"GBP","po":"4503761346","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=132999","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2428944":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=132996","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2429007":{"cost":"144","currency":"EUR","po":"4503660049","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=134280","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2429138":{"cost":"300","currency":"GBP ","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=132997","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2429297":{"cost":"300","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=132998","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2431147":{"cost":"864","currency":"EUR","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=133555","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2432222":{"cost":"600","currency":"GBP","po":"4503531358","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127193&milestoneId=133596","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2432412":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=133221","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2432423":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=133222","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2432426":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=133223","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2432435":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=133224","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2432536":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=133457","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2433702":{"cost":"864","currency":"EUR","po":"4503541781","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=147883","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2435496":{"cost":"600","currency":"GBP","po":"4503790859","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127068&milestoneId=149436","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2435858":{"cost":"288","currency":"EUR","po":"4503526392 4503562930","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=134282","state":"Closed Complete","pm":"4503526392"},"RITM2435981":{"cost":"6667","currency":"MXN","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128193&milestoneId=133600","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2438417":{"cost":"2520","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=133536","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2440159":{"cost":"3600","currency":"EUR","po":"4503598700","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127028&milestoneId=133707","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2440243":{"cost":"240","currency":"GBP","po":"4503739189","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=133532","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2440250":{"cost":"240","currency":"GBP","po":"4503601932","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127072&milestoneId=133533","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2440252":{"cost":"240","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=133585","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2440257":{"cost":"240","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=133584","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2440270":{"cost":"240","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=133583","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2440279":{"cost":"240","currency":"GBP","po":"4503615661","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127071&milestoneId=133534","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2440283":{"cost":"240","currency":"GBP","po":"4503598063","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127035&milestoneId=133535","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2440462":{"cost":"504","currency":"EUR","po":"4503531744","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=133597","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2441827":{"cost":"720","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=133471","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2442900":{"cost":"600","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=135492","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2443746":{"cost":"144","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128251&milestoneId=133601","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2444013":{"cost":"1800","currency":"GBP ","po":"4503790878","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=134973","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2444028":{"cost":"240","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=134977","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2444044":{"cost":"240","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=134978","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2444531":{"cost":"120","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=135002","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2447172":{"cost":"420","currency":"GBP","po":"4503570009","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=134706","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2448564":{"cost":"4680","currency":"EUR ","po":"4503571272","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=147884","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2448847":{"cost":"3000","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126962&milestoneId=135694","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2448911":{"cost":"3300","currency":"GBP","po":"4503790858","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=133893","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2449961":{"cost":"120","currency":"GBP","po":"4503739192","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=133682","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2449965":{"cost":"120","currency":"GBP","po":"4503601932","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127072&milestoneId=133683","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2452073":{"cost":"1584","currency":"EUR","po":"4503612212","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130637&milestoneId=148172","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2452161":{"cost":"2880","currency":"EUR","po":"4503660046","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=135012","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2452973":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=133875","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2454318":{"cost":"240","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=133878","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2454632":{"cost":"120","currency":"GBP","po":"4503833447","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=149894","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2454642":{"cost":"120","currency":"gbp","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=134715","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2454922":{"cost":"300","currency":"GBP","po":"4503570008","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=134565","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2455009":{"cost":"2667","currency":"MXN","po":"4503615098","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128193&milestoneId=135028","state":"Closed Complete","pm":"Jesica Greco"},"RITM2455421":{"cost":"300","currency":"GBP","po":"4503540615","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=135032","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2455452":{"cost":"3840","currency":"GBP","po":"4503731416","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=134299","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2455735":{"cost":"120","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=133876","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2455914":{"cost":"720","currency":"GBP","po":"4503954862","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129269&milestoneId=135035","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2457455":{"cost":"1440","currency":"EUR","po":"4503598714","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127028&milestoneId=134094","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2458784":{"cost":"6000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=134093","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2461598":{"cost":"1440","currency":"EUR","po":"4503584257","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127028&milestoneId=135038","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2462635":{"cost":"240","currency":"GBP","po":"4503731414","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=134449","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2462786":{"cost":"1080","currency":"EUR","po":"4503660046","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=134599","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2462899":{"cost":"144","currency":"EUR","po":"4503660046","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=134600","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2465011":{"cost":"24000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=134786","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2465413":{"cost":"600","currency":"GBP","po":"4503790859","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127068&milestoneId=134791","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2465793":{"cost":"24000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=134602","state":"Closed Complete","pm":"Jesica Greco"},"RITM2466287":{"cost":"288","currency":"EUR","po":"4503774399","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=134297","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2466814":{"cost":"120","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=134794","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2468403":{"cost":"2400","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=135065","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2468443":{"cost":"13200","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129041&milestoneId=135607","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2468732":{"cost":"120","currency":"gbp","po":"4503605112","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=135697","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2469146":{"cost":"144","currency":"EUR","po":"4503590645","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=134459","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2470677":{"cost":"300","currency":"GBP","po":"4503645055","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=144940","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2470867":{"cost":"5650","currency":"GBP","po":"OTC 4503802364","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128037&milestoneId=148326","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2471153":{"cost":"240","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=134795","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2471690":{"cost":"8400","currency":"MXN","po":"4503584616","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129041&milestoneId=134792","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2471855":{"cost":"14400","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=134796","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2472042":{"cost":"18000","currency":"MXN","po":"4503566793","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129041&milestoneId=134797","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2472906":{"cost":"8400","currency":"MXN ","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=135066","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2472929":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Jesica Greco"},"RITM2473225":{"cost":"420","currency":"GBP","po":"4503653807","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127069&milestoneId=145045","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2473514":{"cost":"1800","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=134603","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2474976":{"cost":"420","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=135139","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2477176":{"cost":"300","currency":"GBP","po":"4503572270","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=135140","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2478875":{"cost":"6000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=135143","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2478884":{"cost":"36000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=135146","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2480887":{"cost":"360","currency":"EUR","po":"4503803035","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=135153","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2482777":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2482994":{"cost":"60000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=145055","state":"Closed Complete","pm":"Jesica Greco"},"RITM2484425":{"cost":"8400","currency":"MXN","po":"4503600449","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=145056","state":"Closed Complete","pm":"Jesica Greco"},"RITM2484689":{"cost":"600","currency":"GBP","po":"4503731416","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=135728","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2486592":{"cost":"600","currency":"GBP","po":"4503761346","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=144941","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2486681":{"cost":"1200","currency":"GBP","po":"4503586394","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127072&milestoneId=145057","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2488850":{"cost":"300","currency":"GBP","po":"4503666829","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=145090","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2489027":{"cost":"720","currency":"EUR","po":"4503633225","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127084&milestoneId=144636","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2491766":{"cost":"8400","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=144913","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2492099":{"cost":"300","currency":"gbp","po":"4503622043","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=144244","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2492100":{"cost":"300","currency":"gbp","po":"4503622043","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=144244","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2492105":{"cost":"300","currency":"gbp","po":"4503622043","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=144244","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2492107":{"cost":"300","currency":"gbp","po":"4503622043","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=144244","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2492850":{"cost":"120","currency":"GBP","po":"4503593908","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=135608","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2493329":{"cost":"360","currency":"EUR","po":"4503607355","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=135727","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2494133":{"cost":"120","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=135664","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2494149":{"cost":"120","currency":"GBP","po":"4503614081","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=136087","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2494158":{"cost":"420","currency":"GBP","po":"4503614080","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=136086","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2495500":{"cost":"300","currency":"GBP","po":"4503833447","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=149895","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2495545":{"cost":"300","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=145060","state":"Closed Complete","pm":"Herman Bykanov (Inactive)"},"RITM2496519":{"cost":"300","currency":"GBP","po":"4503609194","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127209&milestoneId=135752","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2496562":{"cost":"1320","currency":"GBP","po":"4503635201","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=144247","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2500487":{"cost":"66000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129041&milestoneId=145061","state":"Closed Complete","pm":"Jesica Greco"},"RITM2501727":{"cost":"360","currency":"EUR","po":"4503636429","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127084&milestoneId=144874","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2502368":{"cost":"360","currency":"EUR","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=144435","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2502854":{"cost":"","currency":"","po":"4503741619","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=147286","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2504135":{"cost":"300","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=148959","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2504372":{"cost":"120","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=144942","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2505652":{"cost":"120","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=148958","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2506206":{"cost":"360","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128249&milestoneId=145063","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2507172":{"cost":"360","currency":"EUR","po":"4503636968","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127028&milestoneId=144891","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2509124":{"cost":"360","currency":"EUR","po":"4503675468","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=145064","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2509941":{"cost":"144","currency":"EUR","po":"4503623708","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=144246","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2512004":{"cost":"360","currency":"EUR","po":"4503641947","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=144893","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2514364":{"cost":"1152","currency":"EUR","po":"4503659692","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=145065","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2514465":{"cost":"1440","currency":"EUR","po":"4503772688","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=147982","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2514524":{"cost":"6480","currency":"EUR","po":"4503795033","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=145066","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2515461":{"cost":"300","currency":"GBP","po":"4503660347","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=145067","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2517782":{"cost":"360","currency":"EUR","po":"4503659692","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=145068","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2519924":{"cost":"900","currency":"GBP","po":"OTC 4503802364","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128037&milestoneId=148326","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2520090":{"cost":"720","currency":"GBP","po":"4504090710","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=133413&milestoneId=158798","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2520920":{"cost":"144","currency":"EUR","po":"4503660046","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=144306","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2522813":{"cost":"720","currency":"EUR","po":"4503833193","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=145069","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2522836":{"cost":"720","currency":"EUR","po":"4503833193","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=145070","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2525610":{"cost":"1440","currency":"EUR","po":"4503803830","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=150790","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2526252":{"cost":"120","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=144917","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2526784":{"cost":"120","currency":"GBP","po":"4503635396","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=144873","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2526909":{"cost":"120","currency":"GBP","po":"4503833447","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=149897","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2527532":{"cost":"100001","currency":"MXN","po":"4503769137","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128192&milestoneId=145072","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2528609":{"cost":"10920","currency":"EUR (see details in RITM2261853)","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2528710":{"cost":"600","currency":"GBP","po":"4503639102","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127072&milestoneId=144892","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2530168":{"cost":"120","currency":"GBP","po":"4503650778","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=145022","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2530443":{"cost":"2400","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126962&milestoneId=145073","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2531506":{"cost":"120","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=145074","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2533394":{"cost":"144","currency":"EUR","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=145075","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2533675":{"cost":"","currency":"","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=134786","state":"Closed Complete","pm":"Jesica Greco"},"RITM2534462":{"cost":"2880","currency":"EUR","po":"4504120736","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128249&milestoneId=148025","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2536337":{"cost":"12000","currency":"MXN","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=145077","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2536419":{"cost":"2400","currency":"MXN","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=145076","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2539665":{"cost":"504","currency":"EUR","po":"4503735824","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128247&milestoneId=147613","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2540851":{"cost":"24000","currency":"MXN","po":"4503742316","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129041&milestoneId=147342","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2542316":{"cost":"600","currency":"GBP","po":"4503761346","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=146359","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2542430":{"cost":"4000","currency":"GBP","po":"OTC 4503804667","invoiced":"","milestone":"https://pmaccounting.dataart.com/Project?projectId=127109","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2544165":{"cost":"3000","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=147744","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2546198":{"cost":"12000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=146347","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2546222":{"cost":"24000","currency":"MXN","po":"4503573626","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128191&milestoneId=134786","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2550369":{"cost":"720","currency":"EUR","po":"4503675277","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=145933","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2550539":{"cost":"120","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=147125","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2551347":{"cost":"6000","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2551466":{"cost":"36000","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Jesica Greco"},"RITM2552961":{"cost":"144","currency":"EUR","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=147745","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2553147":{"cost":"600","currency":"GBP","po":"4503731416","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=147002","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2553250":{"cost":"420","currency":"GBP","po":"4503689084","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=146047","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2553355":{"cost":"420","currency":"GBP","po":"4503689085","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=146046","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2554187":{"cost":"120","currency":"GBP","po":"4503684686","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=145956","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2554630":{"cost":"360","currency":"EUR","po":"4503681991","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=145938","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2554783":{"cost":"1200","currency":"GBP","po":"4503689083","invoiced":"not invoiced","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=146074","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2556230":{"cost":"120","currency":"GBP","po":"4503689082","invoiced":"invoiced, not paid","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=146045","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2556611":{"cost":"6667","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2556954":{"cost":"2880","currency":"EUR","po":"4503717529","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=147177","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2563776":{"cost":"144","currency":"EUR","po":"4503689440","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=146069","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2563853":{"cost":"360","currency":"EUR","po":"4503691352","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=146044","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2564613":{"cost":"300","currency":"GBP","po":"4503701764","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127375&milestoneId=158861","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2565350":{"cost":"360","currency":"EUR","po":"4503341825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=147724","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2567559":{"cost":"420","currency":"GBP","po":"4503737968","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126962&milestoneId=147285","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2572558":{"cost":"18000","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2574018":{"cost":"2400","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2576343":{"cost":"288","currency":"EUR","po":"4503739403 4503776737","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=148064","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2576891":{"cost":"120","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=147260","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2577794":{"cost":"720","currency":"EUR","po":"4503739403","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=147785","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2577997":{"cost":"300","currency":"GBP","po":"4503714935","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127375&milestoneId=158862","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2578368":{"cost":"144","currency":"EUR","po":"4503719161","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=147983","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2578484":{"cost":"26667","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2578631":{"cost":"189000","currency":"MXN","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129041&milestoneId=148000","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2578633":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2579351":{"cost":"360","currency":"EUR","po":"4503730644","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=147178","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2579520":{"cost":"504","currency":"EUR","po":"4503717533","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=147179","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2579529":{"cost":"360","currency":"EUR","po":"4503774398","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=146560","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2579632":{"cost":"120","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=147974","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2579667":{"cost":"30000","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2580745":{"cost":"600","currency":"GBP","po":"4503712329","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127193&milestoneId=153014","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2581041":{"cost":"504","currency":"EUR","po":"4503739403","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=147784","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2586600":{"cost":"600","currency":"GBP","po":"4503815038","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=148034","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2588303":{"cost":"1800","currency":"GBP","po":"OTC 4503779984","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130641&milestoneId=147985","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2595964":{"cost":"18000","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2597195":{"cost":"300","currency":"GBP","po":"4503735540","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127072&milestoneId=147419","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2597767":{"cost":"508","currency":"EUR","po":"4503735807","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128249&milestoneId=147418","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2600299":{"cost":"600","currency":"GBP","po":"4503815038","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=149002","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2604895":{"cost":"120","currency":"GBP","po":"4503955004","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129269&milestoneId=147417","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2604937":{"cost":"120","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=147416","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2605003":{"cost":"720","currency":"EUR","po":"4503776737","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=147975","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2606213":{"cost":"48000","currency":"24000+24000 MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2606219":{"cost":"60000","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2606528":{"cost":"1080","currency":"EUR","po":"4503741246","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=147415","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2608006":{"cost":"300","currency":"GBP","po":"4503790857","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127069&milestoneId=148035","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2612052":{"cost":"144","currency":"EUR","po":"4503770774","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=147980","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2613070":{"cost":"144","currency":"EUR","po":"4503759660","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=147976","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2614656":{"cost":"2520","currency":"EUR","po":"4503817720 4503902178","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=158370","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2616204":{"cost":"600","currency":"GBP","po":"4503815038","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=148576","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2617430":{"cost":"2700","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2620267":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2620355":{"cost":"14400","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2620358":{"cost":"12000","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2630608":{"cost":"360","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=148577","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2632314":{"cost":"9334","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2636812":{"cost":"120","currency":"GBP","po":"4503806443","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129267&milestoneId=148578","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2638022":{"cost":"360","currency":"EUR","po":"4503841874","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=150944","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2640311":{"cost":"504","currency":"EUR","po":"4503810629","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=148579","state":"Closed Complete","pm":"Dmitry Koziyev (Inactive)"},"RITM2640436":{"cost":"1800","currency":"GBP","po":"4503824603","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=158598","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2640791":{"cost":"3000","currency":"GBP","po":"OTC 4503779984","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130641&milestoneId=148582","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2640848":{"cost":"360","currency":"EUR","po":"4503788954","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=148329","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2643346":{"cost":"300","currency":"GBP (360 EUR)","po":"4503791910","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127193&milestoneId=148583","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2643667":{"cost":"3400","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2644935":{"cost":"21647","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2645752":{"cost":"120","currency":"GBP (OTC Self care)","po":"OTC 4503757967","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2648689":{"cost":"600","currency":"GBP","po":"4503815038","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=148585","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2649475":{"cost":"2667","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2650310":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127068&milestoneId=155459","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2650845":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=155457","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2651963":{"cost":"120","currency":"GBP","po":"4504139930","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129269&milestoneId=158347","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2652652":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2653436":{"cost":"10300","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130843&milestoneId=149114","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2653860":{"cost":"5000","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130843&milestoneId=149114","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2653874":{"cost":"5000","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130843&milestoneId=149114","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2657627":{"cost":"360","currency":"EUR","po":"4503867511","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=152930","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2659263":{"cost":"600","currency":"GBP","po":"4503815038","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=153441","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2660893":{"cost":"3940","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130738&milestoneId=148890","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2664452":{"cost":"864","currency":"EUR","po":"4503859288","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=151627","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2665072":{"cost":"144","currency":"EUR","po":"4503953915","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131693&milestoneId=151972","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2665823":{"cost":"420","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=155233","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2666783":{"cost":"144","currency":"EUR","po":"4504122022","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128247&milestoneId=157105","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2667872":{"cost":"1800","currency":"GBP","po":"4503830399","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127193&milestoneId=153013","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2681700":{"cost":"144","currency":"EUR","po":"4504057812","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=157106","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2683499":{"cost":"4000","currency":"GBP","po":"4503779984","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130641&milestoneId=149111","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2683534":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=157107","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2683607":{"cost":"3000","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2684495":{"cost":"600","currency":"GBP","po":"4504059814","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=133413&milestoneId=159363","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2684682":{"cost":"144","currency":"EUR","po":"4504057817","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=152931","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2686514":{"cost":"360","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=157108","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2687085":{"cost":"300","currency":"GBP","po":"4503917942","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131876&milestoneId=155257","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2688718":{"cost":"504","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=155453","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2690554":{"cost":"144","currency":"EUR","po":"4504164222","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=155451","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2690924":{"cost":"1224","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=155450","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2691816":{"cost":"144","currency":"EUR","po":"4504078089","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131693&milestoneId=155449","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2692105":{"cost":"3000","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130833&milestoneId=148841","state":"On hold","pm":"Alesya Prolagayeva"},"RITM2692391":{"cost":"504","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=155448","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2692448":{"cost":"3200","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2695077":{"cost":"600","currency":"GBP","po":"4504094648","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129269&milestoneId=157432","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2695244":{"cost":"3000","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130843&milestoneId=149114","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2695574":{"cost":"600","currency":"GBP","po":"4503889396","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=152909","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2695637":{"cost":"2400","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2700578":{"cost":"360","currency":"EUR","po":"4504119324","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128247&milestoneId=155447","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2705313":{"cost":"600","currency":"GBP","po":"4503871438","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=153442","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2705568":{"cost":"8200","currency":"EUR","po":"4504121449","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128249&milestoneId=155446","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2705595":{"cost":"360","currency":"EUR","po":"Sofiia","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=154030","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2706782":{"cost":"2400","currency":"GBP","po":"4503915869","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127077&milestoneId=153443","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2707257":{"cost":"120","currency":"GBP","po":"4504072395","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=155445","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2708592":{"cost":"120","currency":"GBP","po":"4503889397","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=152908","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2710648":{"cost":"1320","currency":"GBP","po":"4503938129","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=153449","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2714190":{"cost":"360","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=155444","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2714776":{"cost":"300","currency":"GBP","po":"4504094647","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129269&milestoneId=157431","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2715500":{"cost":"360","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=155443","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2715970":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=157109","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2717480":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=155256","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2717681":{"cost":"144","currency":"EUR","po":"4503867510","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=155442","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2719165":{"cost":"720","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=155441","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2719655":{"cost":"300","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131876&milestoneId=155255","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2728696":{"cost":"300","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=155254","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2728779":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=155440","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2728854":{"cost":"3200","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130738&milestoneId=148890","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2729872":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=155439","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2730604":{"cost":"26400","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Jesica Greco"},"RITM2731621":{"cost":"120","currency":"GBP","po":"4503911114","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131876&milestoneId=155253","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2731695":{"cost":"5000","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130843&milestoneId=149114","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2731698":{"cost":"5000","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130843&milestoneId=149114","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2731972":{"cost":"720","currency":"EUR","po":"4503953944","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=155139","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2733079":{"cost":"120","currency":"GBP","po":"4504109451","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126962&milestoneId=159239","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2733433":{"cost":"360","currency":"EUR","po":"4503913822","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=155438","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2734222":{"cost":"144","currency":"EUR","po":"4504076584","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131693&milestoneId=155437","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2734488":{"cost":"144","currency":"EUR","po":"4503896675","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=155231","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2734754":{"cost":"144","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=155436","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2736348":{"cost":"2400","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2737573":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Fulfilled","pm":"Damian Casasnovas"},"RITM2740349":{"cost":"720","currency":"EUR","po":"4503954123","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131693&milestoneId=157110","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2741891":{"cost":"720","currency":"EUR","po":"4503952218","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131693&milestoneId=157111","state":"Closed Complete","pm":"Oksana Batyuk"},"RITM2741982":{"cost":"720","currency":"EUR","po":"4503953920","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131693&milestoneId=154985","state":"Closed Complete","pm":"Oksana Batyuk"},"RITM2742596":{"cost":"978","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2743335":{"cost":"3000","currency":"GBP","po":"","invoiced":"","milestone":"http://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131876&milestoneId=157430","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2746785":{"cost":"300","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=155230","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2747727":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2748815":{"cost":"600","currency":"","po":"4503958190","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=155263","state":"Closed Complete","pm":"Oksana Batyuk"},"RITM2751209":{"cost":"360","currency":"EUR","po":"4503927787","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=154179","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2752521":{"cost":"360","currency":"EUR","po":"4503952219","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131693&milestoneId=157113","state":"Closed Complete","pm":"Oksana Batyuk"},"RITM2752528":{"cost":"360","currency":"EUR","po":"4503954123","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131693&milestoneId=157114","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2752881":{"cost":"600","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=157115","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2752888":{"cost":"2400","currency":"GBP","po":"OTC","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2753767":{"cost":"1320","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126962&milestoneId=154519","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2755698":{"cost":"600","currency":"GBP","po":"4504047419","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127209&milestoneId=160079","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2757697":{"cost":"","currency":"","po":"OTC","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2758917":{"cost":"1020","currency":"GBP","po":"OTC 4503757967","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130738&milestoneId=148890","state":"On hold","pm":"Tatyana Samoylenko"},"RITM2759785":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2760635":{"cost":"600","currency":"GBP","po":"4503952828","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=155232","state":"Closed Complete","pm":"Oksana Batyuk"},"RITM2761068":{"cost":"2520","currency":"GBP","po":"4504028315","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=154990","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2762368":{"cost":"3000","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=154987","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2762886":{"cost":"600","currency":"GBP","po":"4503958190","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=154994","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2763984":{"cost":"3000","currency":"GBP","po":"4503967376","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127068&milestoneId=155260","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2764036":{"cost":"144","currency":"","po":"4503953922","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131693&milestoneId=154984","state":"Closed Complete","pm":"Oksana Batyuk"},"RITM2764435":{"cost":"1200","currency":"GBP","po":"4503997330","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127072&milestoneId=160748","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2764526":{"cost":"300","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=154650","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2769988":{"cost":"720","currency":"EUR (to be paid centrally, Cemre)","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=132563&milestoneId=157116","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2770001":{"cost":"720","currency":"EUR (to be paid centrally, Cemre)","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=132563&milestoneId=157117","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2770500":{"cost":"720","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=154972","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2770518":{"cost":"720","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=155265","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2773268":{"cost":"1584","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=157118","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2773271":{"cost":"360","currency":"EUR","po":"4503974366","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=154992","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2774184":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=155435","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2775046":{"cost":"1320","currency":"GBP","po":"4503976952","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=155243","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2775089":{"cost":"360","currency":"EUR","po":"4503976784","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=155264","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2775098":{"cost":"144","currency":"EUR","po":"4503956956","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=154484","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2776272":{"cost":"1080","currency":"EUR","po":"4504062947","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=132563&milestoneId=157119","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2776337":{"cost":"360","currency":"EUR","po":"4503971187","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=159399","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2778039":{"cost":"720","currency":"EUR","po":"4503990052","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=154975","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2779719":{"cost":"120","currency":"","po":"4503993202","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=155242","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2781186":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=155242","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2781323":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130833&milestoneId=148841","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2781739":{"cost":"360","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=157120","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2781763":{"cost":"4200","currency":"GBP","po":"4504050696","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=158327","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2782465":{"cost":"3200","currency":"GBP","po":"4503973332 (1800 GBP), 4503992943 (800 GBP), 4504113692 (600 GBP)","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=157121","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2783397":{"cost":"120","currency":"GBP","po":"4503995605","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=158326","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2784412":{"cost":"1000","currency":"GBP","po":"4504070805","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=133456&milestoneId=158491","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2785114":{"cost":"2880","currency":"EUR","po":"4504062947","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=132563&milestoneId=157124","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2785234":{"cost":"144","currency":"EUR","po":"4503968095","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=155140","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2786387":{"cost":"1200","currency":"GBP","po":"4504105612","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=157128","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2787021":{"cost":"144","currency":"EUR","po":"4504018845","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=158313","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2787152":{"cost":"13333","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Damian Casasnovas"},"RITM2788964":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2789176":{"cost":"600","currency":"GBP","po":"4504040549","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=157129","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2791866":{"cost":"1800","currency":"GBP","po":"4504012459","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=158321","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2793419":{"cost":"120","currency":"GBP","po":"4504072300","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=160778","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2793460":{"cost":"144","currency":"EUR","po":"4504027045","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=158312","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2794004":{"cost":"144","currency":"EUR","po":"4504062947","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=132563&milestoneId=155911","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2796967":{"cost":"720","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126961&milestoneId=155999","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2797301":{"cost":"1932","currency":"GBP","po":"4504064552","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129269&milestoneId=158786","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2797459":{"cost":"1934","currency":"GBP","po":"4504064553","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129269&milestoneId=158787","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2797647":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2801809":{"cost":"","currency":"","po":"4504078467","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2804126":{"cost":"1440","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=157125","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2804266":{"cost":"360","currency":"EUR","po":"4504100025","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=159745","state":"Fulfilled","pm":"Alesya Prolagayeva"},"RITM2804851":{"cost":"600","currency":"GBP","po":"4504062958","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129269&milestoneId=158782","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2804881":{"cost":"2000","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Alesya Prolagayeva"},"RITM2804992":{"cost":"508","currency":"EUR","po":"4504115908","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127074&milestoneId=160113","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2805752":{"cost":"720","currency":"GBP","po":"4504032316","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=158325","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2805838":{"cost":"6000","currency":"GBP","po":"OTC","invoiced":"","milestone":"","state":"On hold","pm":"Alesya Prolagayeva"},"RITM2807333":{"cost":"1934","currency":"GBP","po":"4504064551","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129269&milestoneId=158785","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2807438":{"cost":"600","currency":"GBP","po":"4504062965","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129269&milestoneId=158783","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2807477":{"cost":"120","currency":"GBP","po":"OTC","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2807959":{"cost":"600","currency":"GBP","po":"4504066366","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=158324","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2808030":{"cost":"300","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2808841":{"cost":"120","currency":"GBP","po":"OTC","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2810301":{"cost":"144","currency":"EUR","po":"4504020633","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131693&milestoneId=157123","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2810684":{"cost":"120","currency":"GBP","po":"4504012460","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127212&milestoneId=158320","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2810744":{"cost":"400","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2810823":{"cost":"720","currency":"EUR","po":"4504116640","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=158317","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2811981":{"cost":"720","currency":"EUR","po":"4504136861","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=157126","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2811998":{"cost":"120","currency":"GBP","po":"4504013059","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=161069","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2812003":{"cost":"120","currency":"GBP","po":"4504013059","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=161069","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2812005":{"cost":"120","currency":"GBP","po":"4504013059","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=161069","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2812007":{"cost":"120","currency":"GBP","po":"4504013059","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127063&milestoneId=161069","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2812250":{"cost":"600","currency":"GBP","po":"4504062978","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=129269&milestoneId=158784","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2812290":{"cost":"144","currency":"EUR","po":"4504162492","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2812433":{"cost":"144","currency":"EUR","po":"4504001331","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=158311","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2812590":{"cost":"300","currency":"GBP","po":"4504017177","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=159320","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2813698":{"cost":"300","currency":"GBP","po":"OTC 4503802364","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2814319":{"cost":"","currency":"","po":"4504149084","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128249&milestoneId=160900","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2814322":{"cost":"240","currency":"GBP","po":"OTC 4503802364","invoiced":"Yes","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128037&milestoneId=148326","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2814327":{"cost":"","currency":"","po":"4504149083","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128247&milestoneId=160899","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2814334":{"cost":"144","currency":"EUR","po":"4504118567","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128247&milestoneId=160884","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2814412":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Damian Casasnovas"},"RITM2814432":{"cost":"144","currency":"EUR","po":"4504014702","invoiced":"","milestone":"Milestone","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2815186":{"cost":"300","currency":"GBP","po":"4504030543","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=158323","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2815387":{"cost":"120","currency":"GBP","po":"4504021278","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=156761","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2815706":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Alesya Prolagayeva"},"RITM2815905":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2816324":{"cost":"600","currency":"GBP","po":"4504022649","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=160747","state":"Closed Complete","pm":"Oksana Batyuk"},"RITM2816826":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2817226":{"cost":"360","currency":"EUR","po":"4504054118","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=158330","state":"Fulfilled","pm":"Alesya Prolagayeva"},"RITM2817342":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2819092":{"cost":"144","currency":"EUR","po":"4504076584","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131693&milestoneId=157415","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2819094":{"cost":"144","currency":"EUR","po":"4504062947","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131693&milestoneId=157414","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2819099":{"cost":"144","currency":"EUR","po":"4504062947","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=132563&milestoneId=160737","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2819523":{"cost":"5640","currency":"GBP","po":"4504072300","invoiced":"","milestone":"Link","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2819645":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Oksana Batyuk"},"RITM2820709":{"cost":"600","currency":"GBP","po":"4504056340","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2821020":{"cost":"720","currency":"GBP","po":"4504075662","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=158427","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2821170":{"cost":"300","currency":"GBP","po":"4504124274","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=158322","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2821578":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2821712":{"cost":"120","currency":"GBP","po":"4504041802","invoiced":"","milestone":"Link ","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2823952":{"cost":"2040","currency":"GBP","po":"4504138132\n4504034826","invoiced":"","milestone":"Link ","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2824344":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2824833":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2824993":{"cost":"144","currency":"EUR","po":"4504076584","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2826690":{"cost":"144","currency":"EUR","po":"4504076584","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2827030":{"cost":"144","currency":"EUR","po":"4504036275","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=157023","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2827085":{"cost":"120","currency":"GBP","po":"4504029153","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=157233","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2828970":{"cost":"144","currency":"EUR","po":"4504054116","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=158315","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2829017":{"cost":"144","currency":"EUR","po":"4504054115","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127060&milestoneId=158314","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2829098":{"cost":"360","currency":"EUR","po":"4504041052","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=158316","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2829274":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2829646":{"cost":"","currency":"","po":"4504081678","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=161009","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2830093":{"cost":"508","currency":"EUR","po":"4504151167","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127028&milestoneId=161214","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2830102":{"cost":"","currency":"","po":"4504152668","invoiced":"","milestone":"","state":"Work In Progress","pm":"Alesya Prolagayeva"},"RITM2830109":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Alesya Prolagayeva"},"RITM2830118":{"cost":"","currency":"","po":"4504152668","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127028&milestoneId=161252","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2830125":{"cost":"508","currency":"EUR","po":"4504152668","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127028&milestoneId=161251","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2830311":{"cost":"120","currency":"GBP","po":"4504112918","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=160111","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2830636":{"cost":"144","currency":"EUR","po":"4504028853","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127084&milestoneId=158331","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2834863":{"cost":"720","currency":"GBP","po":"4504081723","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2835045":{"cost":"1140","currency":"GBP","po":"4504034828","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=158523","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2836383":{"cost":"1200","currency":"GBP (CGO budget)","po":"OTC 4503757967","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130738&milestoneId=148890","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2836456":{"cost":"1200","currency":"GBP","po":"OTC 4503802364","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128037&milestoneId=148326","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2837144":{"cost":"300","currency":"GBP","po":"4504089533","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127035&milestoneId=159576","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2837217":{"cost":"2800","currency":"GBP","po":"OTC","invoiced":"","milestone":"","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2837521":{"cost":"120","currency":"GBP","po":"4504057183","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127375&milestoneId=158425","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2837530":{"cost":"120","currency":"GBP","po":"4504057183","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127375&milestoneId=158426","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2838149":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2838194":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Damian Casasnovas"},"RITM2838574":{"cost":"420","currency":"GBP","po":"4504034825","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=158329","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2838881":{"cost":"120","currency":"GBP","po":"4504039939","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=160895","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2839037":{"cost":"144","currency":"EUR","po":"4504039042","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=158310","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2839373":{"cost":"3900","currency":"GBP","po":"4504102732","invoiced":"","milestone":"Link ","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2840828":{"cost":"240","currency":"GBP","po":"OTC 4503802364","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=128037&milestoneId=148326","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2841266":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2841954":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2842808":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2843413":{"cost":"120","currency":"GBP","po":"4504046629","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=157941","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2843742":{"cost":"720","currency":"GBP","po":"4504105612","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=159682","state":"Fulfilled","pm":"Tatyana Samoylenko"},"RITM2843752":{"cost":"288","currency":"EUR","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2843794":{"cost":"","currency":"","po":"4504105612","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=159682","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2844638":{"cost":"120","currency":"GBP","po":"4504158055","invoiced":"","milestone":"Link ","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2844884":{"cost":"120","currency":"GBP","po":"4504047161","invoiced":"","milestone":"Link ","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2847083":{"cost":"144","currency":"EUR","po":"4504162390","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2847147":{"cost":"120","currency":"GBP","po":"4504049756","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=160893","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2847414":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2847824":{"cost":"2400","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2847858":{"cost":"6667","currency":"MXN","po":"4504068881","invoiced":"","milestone":"Link ","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2849528":{"cost":"2400","currency":"GBP","po":"4504072196","invoiced":"","milestone":"Link ","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2850436":{"cost":"120","currency":"GBP","po":"4504152476","invoiced":"","milestone":"Link ","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2850791":{"cost":"1320","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2851098":{"cost":"","currency":"","po":"4504077426","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127069&milestoneId=159697","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2853431":{"cost":"144","currency":"EUR","po":"4504070400","invoiced":"","milestone":"Link ","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2853516":{"cost":"120","currency":"GBP","po":"4504057378","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2853835":{"cost":"360","currency":"GBP","po":"4504072464","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131876&milestoneId=160894","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2853868":{"cost":"300","currency":"GBP","po":"OTC","invoiced":"","milestone":"","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2855254":{"cost":"600","currency":"GBP (+additional 600 GBP for version upgrade, confirm who funds)","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=159675","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2855444":{"cost":"","currency":"","po":"OTC4503802364","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2856321":{"cost":"","currency":"","po":"No cost requried","invoiced":"","milestone":"","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2858270":{"cost":"540","currency":"GBP","po":"4504095206","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=159694","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2858948":{"cost":"144","currency":"EUR","po":"4504107369","invoiced":"","milestone":"","state":"Fulfilled","pm":"Tatyana Samoylenko"},"RITM2858951":{"cost":"144","currency":"EUR","po":"4504107369","invoiced":"","milestone":"","state":"Fulfilled","pm":"Tatyana Samoylenko"},"RITM2858952":{"cost":"144","currency":"EUR","po":"4504107369","invoiced":"","milestone":"Link ","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2858954":{"cost":"144","currency":"EUR","po":"4504107369","invoiced":"","milestone":"","state":"Fulfilled","pm":"Tatyana Samoylenko"},"RITM2858956":{"cost":"144","currency":"EUR","po":"4504107369","invoiced":"","milestone":"","state":"Fulfilled","pm":"Tatyana Samoylenko"},"RITM2862159":{"cost":"504","currency":"EUR","po":"4504080104\n4504090949","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2864741":{"cost":"600","currency":"GBP","po":"4504072195","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2866277":{"cost":"300","currency":"GBP","po":"4504109662","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126962&milestoneId=159688","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2866301":{"cost":"2880","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=132563&milestoneId=160875","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2867804":{"cost":"360","currency":"EUR","po":"4504062947","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=132563&milestoneId=160707","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2868341":{"cost":"3600","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=160706","state":"Work In Progress","pm":"Tatyana Samoylenko"},"RITM2868952":{"cost":"1140","currency":"GBP","po":"4504097011","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=126962&milestoneId=159691","state":"Work In Progress","pm":"Tatyana Samoylenko"},"RITM2869403":{"cost":"720","currency":"GBP","po":"4504074837 4504151443","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2869578":{"cost":"","currency":"","po":"4504076452","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2873041":{"cost":"3000","currency":"GBP","po":"","invoiced":"","milestone":"","state":"On hold","pm":"Elizaveta Nyarko"},"RITM2874971":{"cost":"120","currency":"GBP","po":"4504099936","invoiced":"","milestone":"","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2879182":{"cost":"1800","currency":"GBP","po":"4504126501","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2879292":{"cost":"300","currency":"GBP","po":"4504133055","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=131047&milestoneId=161067","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2880261":{"cost":"120","currency":"GBP","po":"4504087565","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2880757":{"cost":"300","currency":"GBP","po":"4504092714","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127211&milestoneId=159744","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2881065":{"cost":"300","currency":"GBP","po":"4504091078","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2882723":{"cost":"120","currency":"GBP","po":"OTC4503757967","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2883835":{"cost":"120","currency":"GBP","po":"4504092668","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127070&milestoneId=159509","state":"Fulfilled","pm":"Alesya Prolagayeva"},"RITM2885259":{"cost":"5000","currency":"GBP","po":"OTC","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=133609&milestoneId=160109","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2885403":{"cost":"1500","currency":"GBP","po":"OTC 4503757967","invoiced":"","milestone":"","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2886705":{"cost":"1584","currency":"EUR","po":"4504133130","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2886813":{"cost":"1560","currency":"GBP","po":"4503779984","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2886815":{"cost":"144","currency":"EUR","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127061&milestoneId=159681","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2887547":{"cost":"13333","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2889117":{"cost":"600","currency":"GBP","po":"4504118956","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2889467":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Damian Casasnovas"},"RITM2889470":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2889474":{"cost":"20000","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2890351":{"cost":"2800","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Alesya Prolagayeva"},"RITM2890765":{"cost":"900","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127076&milestoneId=161066","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2891219":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Damian Casasnovas"},"RITM2891763":{"cost":"360","currency":"EUR","po":"4504136886","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=130325&milestoneId=160873","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2892540":{"cost":"1620","currency":"GBP","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127032&milestoneId=161068","state":"Work In Progress","pm":"Tatyana Samoylenko"},"RITM2892820":{"cost":"89334","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2895339":{"cost":"1200","currency":"GBP","po":"OTC 4503779984","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2897455":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Damian Casasnovas"},"RITM2898516":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2898840":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Elizaveta Nyarko"},"RITM2900288":{"cost":"120","currency":"GBP","po":"4504140670","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2900547":{"cost":"120","currency":"GBP","po":"4504121184","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=127067&milestoneId=160112","state":"Closed Complete","pm":"Alesya Prolagayeva"},"RITM2900650":{"cost":"720","currency":"GBP","po":"4504138998","invoiced":"","milestone":"Link","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2903136":{"cost":"360","currency":"EUR","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Alesya Prolagayeva"},"RITM2905228":{"cost":"","currency":"","po":"","invoiced":"","milestone":"https://pmaccounting.dataart.com/Milestone/EditMilestone?projectId=133848&milestoneId=160110","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2905448":{"cost":"2200","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Alesya Prolagayeva"},"RITM2906334":{"cost":"6240","currency":"EUR","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Elizaveta Nyarko"},"RITM2908647":{"cost":"720","currency":"GBP","po":"4504117495","invoiced":"","milestone":"","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2908793":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Damian Casasnovas"},"RITM2909862":{"cost":"300","currency":"GBP","po":"4504139726","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2910009":{"cost":"504","currency":"EUR","po":"4504148719","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2910029":{"cost":"2667","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2910152":{"cost":"504","currency":"EUR","po":"4504145950","invoiced":"","milestone":"","state":"On hold","pm":"Tatyana Samoylenko"},"RITM2910789":{"cost":"2700","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2910803":{"cost":"540","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2913180":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"","state":"On hold","pm":"Tatyana Samoylenko"},"RITM2914010":{"cost":"1020","currency":"GBP","po":"4504154871","invoiced":"","milestone":"Link","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2914297":{"cost":"144","currency":"EUR","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Alesya Prolagayeva"},"RITM2915693":{"cost":"240","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2916127":{"cost":"9334","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Damian Casasnovas"},"RITM2917211":{"cost":"600","currency":"GBP","po":"","invoiced":"","milestone":"","state":"On hold","pm":"Tatyana Samoylenko"},"RITM2917361":{"cost":"120","currency":"GBP","po":"4504142186","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2917815":{"cost":"8400","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Damian Casasnovas"},"RITM2917818":{"cost":"5334","currency":"MXN","po":"4504148112","invoiced":"","milestone":"","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2918670":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Alesya Prolagayeva"},"RITM2918699":{"cost":"600","currency":"GBP","po":"4504144408","invoiced":"","milestone":"Link","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2919154":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2920220":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2921027":{"cost":"120","currency":"GBP","po":"4503808256","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2921314":{"cost":"5334","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2921921":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2922020":{"cost":"120","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2922061":{"cost":"430","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Tatyana Samoylenko"},"RITM2923512":{"cost":"","currency":"","po":"4504162321","invoiced":"","milestone":"Link","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2923566":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"On hold","pm":"Elizaveta Nyarko"},"RITM2923722":{"cost":"120","currency":"GBP","po":"4504144277","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2925045":{"cost":"240","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2925211":{"cost":"420","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Tatyana Samoylenko"},"RITM2925564":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Alesya Prolagayeva"},"RITM2925590":{"cost":"2667","currency":"MXN","po":"","invoiced":"","milestone":"","state":"Closed Complete","pm":"Damian Casasnovas"},"RITM2925646":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2925654":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2926866":{"cost":"360","currency":"EUR","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2927137":{"cost":"2800","currency":"EUR","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Tatyana Samoylenko"},"RITM2928717":{"cost":"504","currency":"EUR","po":"4504152360","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Elizaveta Nyarko"},"RITM2928854":{"cost":"1008","currency":"EUR","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2929658":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2931244":{"cost":"120","currency":"GBP","po":"4504158614","invoiced":"","milestone":"Link","state":"Closed Complete","pm":"Tatyana Samoylenko"},"RITM2933474":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Damian Casasnovas"},"RITM2936892":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2937327":{"cost":"300","currency":"GBP","po":"4504158029","invoiced":"","milestone":"Link","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2937926":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Open","pm":"Alesya Prolagayeva"},"RITM2938865":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2939027":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Assigned","pm":"Alesya Prolagayeva"},"RITM2939092":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2940506":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Open","pm":"Alesya Prolagayeva"},"RITM2940759":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Damian Casasnovas"},"RITM2942976":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2943364":{"cost":"420","currency":"GBP","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2943697":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Open","pm":"Damian Casasnovas"},"RITM2944926":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Alesya Prolagayeva"},"RITM2945229":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"},"RITM2945319":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Tatyana Samoylenko"},"RITM2946192":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Elizaveta Nyarko"},"RITM2946434":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Open","pm":"Tatyana Samoylenko"},"RITM2946810":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Work In Progress","pm":"Elizaveta Nyarko"},"RITM2946948":{"cost":"","currency":"","po":"","invoiced":"","milestone":"","state":"Awaiting User Info","pm":"Alesya Prolagayeva"}}} \ No newline at end of file diff --git a/server/db.ts b/server/db.ts new file mode 100644 index 0000000..f5ed082 --- /dev/null +++ b/server/db.ts @@ -0,0 +1,630 @@ +import { Pool } from 'pg'; +import fs from 'node:fs'; +import path from 'node:path'; +import type { Ticket, TicketStatus } from './types'; + +// Single shared pool. DATABASE_URL points at the `forge` Postgres database; the +// schema self-bootstraps in initDB() on boot (no ORM, no migrations), mirroring +// the Husky template's approach. +export const pool = new Pool({ connectionString: process.env.DATABASE_URL }); + +export async function initDB(): Promise { + await pool.query(` + CREATE TABLE IF NOT EXISTS tickets ( + number TEXT PRIMARY KEY, + status TEXT NOT NULL, + state TEXT NOT NULL DEFAULT '', + short_desc TEXT NOT NULL DEFAULT '', + assigned_to TEXT, + assignment_group TEXT, + brand TEXT, + market TEXT, + business_unit TEXT, + requested_for TEXT, + opened_at TIMESTAMPTZ, + due_date DATE, + state_changed_at TIMESTAMPTZ, + state_changed_by TEXT, + last_activity_at TIMESTAMPTZ, + last_activity_by TEXT, + last_comment TEXT, + description TEXT, + link TEXT, + final_cost NUMERIC, + ttfr_minutes INTEGER, + client_resp_minutes INTEGER, + fulfillment_date TIMESTAMPTZ, + first_reply_at TIMESTAMPTZ, + first_assigned_date TIMESTAMPTZ, + updated_at TIMESTAMPTZ, + jira JSONB, + activity JSONB NOT NULL DEFAULT '[]'::jsonb, + synced_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ) + `); + await pool.query(`CREATE INDEX IF NOT EXISTS tickets_status_idx ON tickets (status)`); + await pool.query(`CREATE INDEX IF NOT EXISTS tickets_state_idx ON tickets (state)`); + await pool.query(`CREATE INDEX IF NOT EXISTS tickets_group_idx ON tickets (assignment_group)`); + + // Analytics columns (additive — never changes an existing column's shape). + for (const col of [ + 'currency_code TEXT', 'opened_by TEXT', 'opened_date DATE', 'closed_date DATE', + 'to_do_at TIMESTAMPTZ', 'in_uat_at TIMESTAMPTZ', 'jira_key TEXT', + 'ticket_year INTEGER', 'size TEXT', + 'po_number TEXT', 'invoiced TEXT', + ]) { + await pool.query(`ALTER TABLE tickets ADD COLUMN IF NOT EXISTS ${col}`); + } + await pool.query(`CREATE INDEX IF NOT EXISTS tickets_year_idx ON tickets (ticket_year)`); + await pool.query(`CREATE INDEX IF NOT EXISTS tickets_closed_date_idx ON tickets (closed_date)`); + + // Key/value config (SLA norms, thresholds, FX, size thresholds, palettes). + await pool.query(` + CREATE TABLE IF NOT EXISTS app_config ( + key TEXT PRIMARY KEY, + value JSONB NOT NULL, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ) + `); + + await pool.query(` + CREATE TABLE IF NOT EXISTS api_tokens ( + id SERIAL PRIMARY KEY, + token_id TEXT UNIQUE NOT NULL, + token_hash TEXT UNIQUE NOT NULL, + label TEXT NOT NULL DEFAULT '', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + last_used_at TIMESTAMPTZ, + revoked BOOLEAN NOT NULL DEFAULT false, + expires_at TIMESTAMPTZ + ) + `); + + await pool.query(` + CREATE TABLE IF NOT EXISTS app_users ( + id SERIAL PRIMARY KEY, + username TEXT UNIQUE NOT NULL, + password_hash TEXT NOT NULL, + role TEXT NOT NULL DEFAULT 'viewer', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + last_login_at TIMESTAMPTZ + ) + `); + // Existing deployments: add the role column (defaults viewer for prior rows). + await pool.query(`ALTER TABLE app_users ADD COLUMN IF NOT EXISTS role TEXT NOT NULL DEFAULT 'viewer'`); + + await seedUser(); + await seedConfig(); + await seedFromArchives(); +} + +// --- Config (SLA norms / thresholds / FX / size / palettes) ---------------- +export interface ForgeConfig { + insightsThresholds: Record; + fxRates: Record; + sizeThresholds: Record; + norms: Record>; + brandColors: Record; + snowColors: Record; + statesOrder: string[]; + displayCurrency: string; + colleagues: string[]; + latamAssignees: string[]; + jiraColumns: string[]; +} + +const DEFAULT_CONFIG: ForgeConfig = { + insightsThresholds: {}, + fxRates: { GBP: 1, EUR: 1.2, MXN: 20 }, + sizeThresholds: { XS: 120, S: 300, M: 600, L: 1200, XL: 3000, XXL: 9000 }, + norms: {}, + brandColors: {}, + snowColors: {}, + statesOrder: [], + displayCurrency: 'GBP', + colleagues: [], + latamAssignees: [], + jiraColumns: [], +}; + +let _config: ForgeConfig | null = null; +export function loadConfig(): ForgeConfig { + if (_config) return _config; + let cfg: ForgeConfig; + try { + const raw = JSON.parse(fs.readFileSync(path.join(__dirname, 'data', 'config.json'), 'utf-8')); + cfg = { ...DEFAULT_CONFIG, ...raw }; + } catch { + cfg = DEFAULT_CONFIG; + } + _config = cfg; + return cfg; +} + +async function seedConfig(): Promise { + const cfg = loadConfig(); + for (const [key, value] of Object.entries(cfg)) { + await pool.query( + `INSERT INTO app_config (key, value) VALUES ($1, $2) + ON CONFLICT (key) DO UPDATE SET value = $2, updated_at = NOW()`, + [key, JSON.stringify(value)], + ); + } +} + +// Convert a cost to GBP and map to a t-shirt size (largest nominal that fits, +// the chart path used by the initial app). Zero/absent cost → null ("no cost"). +const SIZE_ORDER = ['XS', 'S', 'M', 'L', 'XL', 'XXL']; +export function sizeOf(finalCost: number | null, currencyCode: string | null, cfg: ForgeConfig): string | null { + if (finalCost == null || !(finalCost > 0)) return null; + const rate = cfg.fxRates[(currencyCode || 'GBP').toUpperCase()] ?? 1; // units per 1 GBP + const gbp = finalCost / rate; + const th = cfg.sizeThresholds; + let best = 'XS'; // largest nominal ≤ gbp, capped at XXL; sub-XS cost still reads XS + for (const s of SIZE_ORDER) if (gbp >= (th[s] ?? Infinity)) best = s; + return best; +} + +// Seed the single login account from AUTH_USER/AUTH_PASS on first boot. If the +// user already exists its password is left untouched (change it in the DB, or +// delete the row and reboot to re-seed). No-op when the env vars are unset. +async function seedUser(): Promise { + const username = process.env.AUTH_USER; + const password = process.env.AUTH_PASS; + if (!username || !password) { + console.warn('AUTH_USER/AUTH_PASS unset — no login account seeded (read API will reject all logins)'); + return; + } + const { rows } = await pool.query('SELECT 1 FROM app_users WHERE username = $1', [username]); + if (rows.length > 0) { + // Bootstrap account is always admin (fixes the default 'viewer' for pre-role rows). + await pool.query(`UPDATE app_users SET role='admin' WHERE username=$1 AND role<>'admin'`, [username]); + return; + } + const bcrypt = await import('bcryptjs'); + const hash = await bcrypt.hash(password, 12); + await pool.query('INSERT INTO app_users (username, password_hash, role) VALUES ($1, $2, $3)', [username, hash, 'admin']); + console.log(`Seeded admin account: ${username}`); +} + +// --- User management (Project Leadership / Admin) -------------------------- +export type Role = 'viewer' | 'pm' | 'lead' | 'admin'; +export const ROLES: Role[] = ['viewer', 'pm', 'lead', 'admin']; +export function isRole(v: unknown): v is Role { + return typeof v === 'string' && (ROLES as string[]).includes(v); +} + +export interface AppUser { id: number; username: string; role: Role; createdAt: string | null; lastLoginAt: string | null; } + +export async function listUsers(): Promise { + const { rows } = await pool.query( + `SELECT id, username, role, created_at, last_login_at FROM app_users ORDER BY username`, + ); + return rows.map(r => ({ + id: r.id, username: r.username, role: r.role, + createdAt: r.created_at instanceof Date ? r.created_at.toISOString() : r.created_at, + lastLoginAt: r.last_login_at instanceof Date ? r.last_login_at.toISOString() : r.last_login_at, + })); +} + +// Create a user. Returns 'exists' if the username is taken, else the new user. +export async function createUser(username: string, password: string, role: Role): Promise { + const bcrypt = await import('bcryptjs'); + const hash = await bcrypt.hash(password, 12); + try { + const { rows } = await pool.query( + `INSERT INTO app_users (username, password_hash, role) VALUES ($1, $2, $3) + RETURNING id, username, role, created_at, last_login_at`, + [username, hash, role], + ); + const r = rows[0]; + return { id: r.id, username: r.username, role: r.role, + createdAt: r.created_at instanceof Date ? r.created_at.toISOString() : r.created_at, lastLoginAt: null }; + } catch (err) { + if ((err as { code?: string }).code === '23505') return 'exists'; // unique violation + throw err; + } +} + +export async function countAdmins(): Promise { + const { rows } = await pool.query<{ n: string }>(`SELECT count(*)::text AS n FROM app_users WHERE role = 'admin'`); + return Number(rows[0]?.n ?? '0'); +} + +export async function getUserRole(username: string): Promise { + const { rows } = await pool.query<{ role: Role }>(`SELECT role FROM app_users WHERE username = $1`, [username]); + return rows[0]?.role ?? null; +} + +// Delete a user AND purge their active sessions (connect-pg-simple stores the +// session as JSON in user_sessions.sess), so a removed user is logged out at once +// instead of keeping their cached role for the cookie's lifetime. +export async function deleteUser(username: string): Promise { + await pool.query(`DELETE FROM app_users WHERE username = $1`, [username]); + await pool.query(`DELETE FROM user_sessions WHERE (sess -> 'user' ->> 'username') = $1`, [username]) + .catch(err => console.error('session purge failed:', (err as Error).message)); +} + +// --- Empty helpers --------------------------------------------------------- +function ts(v: unknown): string | null { + if (v == null) return null; + const s = String(v).trim(); + return s === '' ? null : s; +} +function num(v: unknown): number | null { + if (v == null || v === '') return null; + const n = Number(v); + return Number.isFinite(n) ? n : null; +} + +// Derive the calendar year from the best available opened date. +function yearOf(...vals: (string | null)[]): number | null { + for (const v of vals) { + if (v) { const y = Number(String(v).slice(0, 4)); if (y > 2000 && y < 3000) return y; } + } + return null; +} + +// Reshape a raw active-archive record into a normalized Ticket. +function fromActive(r: Record, cfg: ForgeConfig): Ticket { + const meta = (r.meta ?? {}) as Record; + const finalCost = num(meta.finalCost); + const currencyCode = ts(meta.currencyCode); + return { + number: String(r.number), + status: 'active', + state: String(r.state ?? ''), + shortDesc: String(r.shortDesc ?? ''), + assignedTo: ts(r.assignedTo), + assignmentGroup: ts(r.assignmentGroup), + brand: ts(meta.brand), + market: ts(meta.market), + businessUnit: ts(meta.businessUnit), + requestedFor: ts(meta.requestedFor), + openedBy: null, + openedAt: ts(meta.openedAt), + openedDate: ts(meta.openedAt), + closedDate: null, + toDoAt: null, + inUatAt: null, + jiraKey: null, + currencyCode, + ticketYear: yearOf(ts(meta.openedAt)), + size: sizeOf(finalCost, currencyCode, cfg), + poNumber: null, + invoiced: null, + dueDate: ts(meta.dueDate), + stateChangedAt: ts(meta.stateChangedAt), + stateChangedBy: ts(meta.stateChangedBy), + lastActivityAt: ts(meta.lastActivityAt), + lastActivityBy: ts(meta.lastActivityBy), + lastComment: ts(r.lastComment), + description: ts(meta.description), + link: ts(r.link), + finalCost, + ttfrMinutes: null, + clientRespMinutes: null, + fulfillmentDate: null, + firstReplyAt: null, + firstAssignedDate: null, + updatedAt: ts(r._updated), + jira: null, + activity: Array.isArray(meta.activity) ? (meta.activity as Ticket['activity']) : [], + }; +} + +function fromClosed(number: string, r: Record, cfg: ForgeConfig): Ticket { + const finalCost = num(r.finalCost); + const currencyCode = ts(r.currencyCode); + return { + number, + status: 'closed', + state: String(r.state ?? ''), + shortDesc: String(r.shortDesc ?? ''), + assignedTo: ts(r.assignedTo), + assignmentGroup: ts(r.assignmentGroup), + brand: ts(r.brand), + market: ts(r.market), + businessUnit: ts(r.businessUnit), + requestedFor: ts(r.requestedFor), + openedBy: ts(r.openedBy), + openedAt: ts(r.openedAt), + openedDate: ts(r.openedDate) ?? ts(r.openedAt), + closedDate: ts(r.closedDate), + toDoAt: ts(r.toDoAt), + inUatAt: ts(r.inUatAt), + jiraKey: ts(r.jiraKey), + currencyCode, + ticketYear: (num(r.year) ?? yearOf(ts(r.closedDate), ts(r.openedDate), ts(r.openedAt))), + size: sizeOf(finalCost, currencyCode, cfg), + poNumber: null, + invoiced: null, + dueDate: null, + stateChangedAt: ts(r.stateChangedAt), + stateChangedBy: ts(r.stateChangedBy), + lastActivityAt: ts(r.lastActivityAt), + lastActivityBy: ts(r.lastActivityBy), + lastComment: null, + description: null, + link: null, + finalCost, + ttfrMinutes: num(r.ttfrMinutes), + clientRespMinutes: num(r.clientRespMinutes), + fulfillmentDate: ts(r.fulfillmentDate), + firstReplyAt: ts(r.firstReplyAt), + firstAssignedDate: ts(r.firstAssignedDate), + updatedAt: ts(r._updated), + jira: null, + activity: [], + }; +} + +// Build the normalized ticket list from the bundled JSON archives. Jira info +// (keyed by ticket number) is attached to BOTH active and closed tickets. +// +// Order matters: closed first, then active. A ticket number can appear in both +// archives (a still-open request whose analytics row was also cached); upsert +// applies later entries last, so putting active last makes the live active +// board win over the stale closed snapshot. +// Finance rows keyed by ticket number: cost / currency / PO / invoiced. +interface FinanceRow { cost?: unknown; currency?: unknown; po?: unknown; invoiced?: unknown; } +function loadFinance(dir: string): Record { + try { + return (JSON.parse(fs.readFileSync(path.join(dir, 'finance.json'), 'utf-8')).rows ?? {}) as Record; + } catch { return {}; } +} + +// Enrich a ticket from its finance row: fill missing cost/currency (recomputing +// size), and set the PO number ('' = in finance with no PO yet) + invoiced flag. +function applyFinance(t: Ticket, fin: FinanceRow | undefined, cfg: ForgeConfig): void { + if (!fin) return; + t.poNumber = fin.po == null ? null : String(fin.po); + t.invoiced = ts(fin.invoiced); + if (t.finalCost == null) { + const c = num(fin.cost); + if (c != null) { + t.finalCost = c; + if (!t.currencyCode) t.currencyCode = ts(fin.currency); + t.size = sizeOf(t.finalCost, t.currencyCode, cfg); + } + } +} + +function loadArchiveTickets(): Ticket[] { + const dir = path.join(__dirname, 'data'); + const cfg = loadConfig(); + const finance = loadFinance(dir); + const activeTickets: Ticket[] = []; + const closedTickets: Ticket[] = []; + let jira: Record = {}; + + try { + const active = JSON.parse(fs.readFileSync(path.join(dir, 'active_archive.json'), 'utf-8')); + jira = (active.jira ?? {}) as Record; + for (const raw of active.tickets ?? []) { + const t = fromActive(raw as Record, cfg); + const j = (jira[t.number] as { key?: string | null }) ?? null; + t.jira = j; + if (j?.key) t.jiraKey = j.key; + applyFinance(t, finance[t.number], cfg); + activeTickets.push(t); + } + } catch (err) { + console.warn('seed: active archive skipped —', (err as Error).message); + } + + try { + const closed = JSON.parse(fs.readFileSync(path.join(dir, 'closed_archive.json'), 'utf-8')); + const map = (closed.tickets ?? {}) as Record>; + for (const [number, raw] of Object.entries(map)) { + const t = fromClosed(number, raw, cfg); + const j = (jira[number] as { key?: string | null }) ?? null; + t.jira = j; + if (!t.jiraKey && j?.key) t.jiraKey = j.key; + applyFinance(t, finance[number], cfg); + closedTickets.push(t); + } + } catch (err) { + console.warn('seed: closed archive skipped —', (err as Error).message); + } + + return [...closedTickets, ...activeTickets]; +} + +// One-time seed: if the tickets table is empty, load the bundled JSON archives. +// Idempotent via upsert, so a redeploy never duplicates. Skipped silently once +// the table has rows (real syncs from the extension take over). +async function seedFromArchives(): Promise { + const { rows } = await pool.query<{ n: string }>(`SELECT count(*)::text AS n FROM tickets`); + if (Number(rows[0]?.n ?? '0') > 0) return; + + const tickets = loadArchiveTickets(); + if (tickets.length === 0) return; + await upsertTickets(tickets); + console.log(`Seeded ${tickets.length} tickets from bundled archives`); +} + +// Replace all tickets with a fresh load from the archives. Used by the reseed +// CLI (server/reseed.ts) to reload after regenerating the archives from a dump. +export async function reseedFromArchives(): Promise { + const tickets = loadArchiveTickets(); + await pool.query('TRUNCATE tickets'); + await upsertTickets(tickets); + return tickets.length; +} + +// Attach-only Jira enrichment: update ONLY the `jira` JSONB (merged) and `jira_key` +// on tickets that already exist, keyed by RITM number. Never touches +// status/state/assignee/activity (see ADR — a Jira payload must not ride the +// clobbering ticket upsert). Returns how many existing tickets matched. +export interface JiraAttach { number: string; jira: Record; jiraKey?: string | null; } +export async function attachJira(items: JiraAttach[]): Promise { + if (items.length === 0) return 0; + const client = await pool.connect(); + try { + await client.query('BEGIN'); + let matched = 0; + for (const it of items) { + const { rowCount } = await client.query( + `UPDATE tickets + SET jira = COALESCE(jira, '{}'::jsonb) || $2::jsonb, + jira_key = COALESCE($3, jira_key), + synced_at = NOW() + WHERE number = $1`, + [it.number, JSON.stringify(it.jira ?? {}), it.jiraKey ?? null], + ); + matched += rowCount ?? 0; + } + await client.query('COMMIT'); + return matched; + } catch (err) { + await client.query('ROLLBACK'); + throw err; + } finally { + client.release(); + } +} + +// Upsert a batch of tickets by number. Used by both the seed and the sync +// ingest endpoint. Runs in a single transaction. +export async function upsertTickets(tickets: Ticket[]): Promise { + const client = await pool.connect(); + try { + await client.query('BEGIN'); + for (const t of tickets) { + await client.query( + `INSERT INTO tickets ( + number, status, state, short_desc, assigned_to, assignment_group, + brand, market, business_unit, requested_for, opened_at, due_date, + state_changed_at, state_changed_by, last_activity_at, last_activity_by, + last_comment, description, link, final_cost, ttfr_minutes, + client_resp_minutes, fulfillment_date, first_reply_at, first_assigned_date, + updated_at, jira, activity, + currency_code, opened_by, opened_date, closed_date, to_do_at, in_uat_at, + jira_key, ticket_year, size, po_number, invoiced, synced_at + ) VALUES ( + $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20, + $21,$22,$23,$24,$25,$26,$27,$28, + $29,$30,$31,$32,$33,$34,$35,$36,$37,$38,$39, NOW() + ) + -- Non-destructive: the sync collector sends a thin payload (state, assignee, + -- group, timestamps). For the rich fields it omits (brand/market/description/ + -- lastComment/jira/analytics), COALESCE keeps the existing value when the + -- incoming one is NULL, so a real sync never nulls seeded richness. Activity + -- is kept unless the incoming payload actually carries entries. + ON CONFLICT (number) DO UPDATE SET + status=EXCLUDED.status, state=EXCLUDED.state, short_desc=EXCLUDED.short_desc, + assigned_to=EXCLUDED.assigned_to, assignment_group=EXCLUDED.assignment_group, + opened_at=COALESCE(EXCLUDED.opened_at, tickets.opened_at), + due_date=COALESCE(EXCLUDED.due_date, tickets.due_date), + state_changed_at=COALESCE(EXCLUDED.state_changed_at, tickets.state_changed_at), + state_changed_by=COALESCE(EXCLUDED.state_changed_by, tickets.state_changed_by), + last_activity_at=EXCLUDED.last_activity_at, last_activity_by=EXCLUDED.last_activity_by, + last_comment=COALESCE(EXCLUDED.last_comment, tickets.last_comment), + description=COALESCE(EXCLUDED.description, tickets.description), + link=COALESCE(EXCLUDED.link, tickets.link), + brand=COALESCE(EXCLUDED.brand, tickets.brand), + market=COALESCE(EXCLUDED.market, tickets.market), + business_unit=COALESCE(EXCLUDED.business_unit, tickets.business_unit), + requested_for=COALESCE(EXCLUDED.requested_for, tickets.requested_for), + final_cost=COALESCE(EXCLUDED.final_cost, tickets.final_cost), + ttfr_minutes=COALESCE(EXCLUDED.ttfr_minutes, tickets.ttfr_minutes), + client_resp_minutes=COALESCE(EXCLUDED.client_resp_minutes, tickets.client_resp_minutes), + fulfillment_date=COALESCE(EXCLUDED.fulfillment_date, tickets.fulfillment_date), + first_reply_at=COALESCE(EXCLUDED.first_reply_at, tickets.first_reply_at), + first_assigned_date=COALESCE(EXCLUDED.first_assigned_date, tickets.first_assigned_date), + updated_at=EXCLUDED.updated_at, + jira=COALESCE(EXCLUDED.jira, tickets.jira), + activity=CASE WHEN jsonb_array_length(EXCLUDED.activity) > 0 + THEN EXCLUDED.activity ELSE tickets.activity END, + currency_code=COALESCE(EXCLUDED.currency_code, tickets.currency_code), + opened_by=COALESCE(EXCLUDED.opened_by, tickets.opened_by), + opened_date=COALESCE(EXCLUDED.opened_date, tickets.opened_date), + closed_date=COALESCE(EXCLUDED.closed_date, tickets.closed_date), + to_do_at=COALESCE(EXCLUDED.to_do_at, tickets.to_do_at), + in_uat_at=COALESCE(EXCLUDED.in_uat_at, tickets.in_uat_at), + jira_key=COALESCE(EXCLUDED.jira_key, tickets.jira_key), + ticket_year=COALESCE(EXCLUDED.ticket_year, tickets.ticket_year), + size=COALESCE(EXCLUDED.size, tickets.size), + po_number=COALESCE(EXCLUDED.po_number, tickets.po_number), + invoiced=COALESCE(EXCLUDED.invoiced, tickets.invoiced), + synced_at=NOW()`, + [ + t.number, t.status, t.state, t.shortDesc, t.assignedTo, t.assignmentGroup, + t.brand, t.market, t.businessUnit, t.requestedFor, t.openedAt, t.dueDate, + t.stateChangedAt, t.stateChangedBy, t.lastActivityAt, t.lastActivityBy, + t.lastComment, t.description, t.link, t.finalCost, t.ttfrMinutes, + t.clientRespMinutes, t.fulfillmentDate, t.firstReplyAt, t.firstAssignedDate, + t.updatedAt, t.jira ? JSON.stringify(t.jira) : null, JSON.stringify(t.activity ?? []), + t.currencyCode, t.openedBy, t.openedDate, t.closedDate, t.toDoAt, t.inUatAt, + t.jiraKey, t.ticketYear, t.size, t.poNumber, t.invoiced, + ], + ); + } + await client.query('COMMIT'); + return tickets.length; + } catch (err) { + await client.query('ROLLBACK'); + throw err; + } finally { + client.release(); + } +} + +// Map a DB row back to the wire Ticket shape. +export function rowToTicket(r: Record): Ticket { + const iso = (v: unknown) => (v instanceof Date ? v.toISOString() : (v as string | null)); + // DATE columns come back as a JS Date at LOCAL midnight; toISOString() would + // shift the calendar day under a non-UTC offset. Emit YYYY-MM-DD from local parts. + const dateOnly = (v: unknown): string | null => { + if (v == null) return null; + if (v instanceof Date) { + const y = v.getFullYear(); + const m = String(v.getMonth() + 1).padStart(2, '0'); + const d = String(v.getDate()).padStart(2, '0'); + return `${y}-${m}-${d}`; + } + return String(v); + }; + return { + number: r.number as string, + status: r.status as TicketStatus, + state: (r.state as string) ?? '', + shortDesc: (r.short_desc as string) ?? '', + assignedTo: (r.assigned_to as string) ?? null, + assignmentGroup: (r.assignment_group as string) ?? null, + brand: (r.brand as string) ?? null, + market: (r.market as string) ?? null, + businessUnit: (r.business_unit as string) ?? null, + requestedFor: (r.requested_for as string) ?? null, + openedBy: (r.opened_by as string) ?? null, + openedAt: iso(r.opened_at), + openedDate: dateOnly(r.opened_date), + closedDate: dateOnly(r.closed_date), + toDoAt: iso(r.to_do_at), + inUatAt: iso(r.in_uat_at), + jiraKey: (r.jira_key as string) ?? null, + currencyCode: (r.currency_code as string) ?? null, + ticketYear: r.ticket_year != null ? Number(r.ticket_year) : null, + size: (r.size as string) ?? null, + poNumber: (r.po_number as string) ?? null, + invoiced: (r.invoiced as string) ?? null, + dueDate: dateOnly(r.due_date), + stateChangedAt: iso(r.state_changed_at), + stateChangedBy: (r.state_changed_by as string) ?? null, + lastActivityAt: iso(r.last_activity_at), + lastActivityBy: (r.last_activity_by as string) ?? null, + lastComment: (r.last_comment as string) ?? null, + description: (r.description as string) ?? null, + link: (r.link as string) ?? null, + finalCost: r.final_cost != null ? Number(r.final_cost) : null, + ttfrMinutes: r.ttfr_minutes != null ? Number(r.ttfr_minutes) : null, + clientRespMinutes: r.client_resp_minutes != null ? Number(r.client_resp_minutes) : null, + fulfillmentDate: iso(r.fulfillment_date), + firstReplyAt: iso(r.first_reply_at), + firstAssignedDate: iso(r.first_assigned_date), + updatedAt: iso(r.updated_at), + jira: (r.jira as Ticket['jira']) ?? null, + activity: (r.activity as Ticket['activity']) ?? [], + }; +} diff --git a/server/insights.ts b/server/insights.ts new file mode 100644 index 0000000..019b2a7 --- /dev/null +++ b/server/insights.ts @@ -0,0 +1,175 @@ +import { pool, rowToTicket, loadConfig } from './db'; +import type { Ticket } from './types'; + +// PM Insights: the problem/alert KPIs over the ACTIVE backlog, mirroring the +// initial app's insights-button.js. Each group carries its full list plus the +// "problematic" subset (what drives the alert counts and revenue-at-risk). + +const DAY = 86_400_000; +function daysSince(v: string | null): number | null { + if (!v) return null; + const iso = v.includes('T') ? v : v.replace(' ', 'T'); + const d = new Date(iso); + return Number.isNaN(d.getTime()) ? null : (Date.now() - d.getTime()) / DAY; +} +function gbp(t: Ticket, fx: Record): number { + if (t.finalCost == null || !(t.finalCost > 0)) return 0; + const rate = fx[(t.currencyCode || 'GBP').toUpperCase()] ?? 1; + return t.finalCost / rate; +} + +function isColleague(name: string | null, colleagues: Set): boolean { + return !!name && colleagues.has(name.trim().toLowerCase()); +} +function isAwaitingAgency(t: Ticket, colleagues: Set): boolean { + if (!/progress/i.test(t.state)) return false; + if (colleagues.size > 0) return !isColleague(t.lastActivityBy, colleagues); + return !!t.lastActivityBy && t.lastActivityBy === t.requestedFor; +} + +// Jira breached: linked, non-terminal Jira whose status has aged past its threshold. +function jiraBreached(t: Ticket, thr: Record): boolean { + const status = t.jira?.status; + if (!status) return false; + if (/closed|resolved|done|cancel|released|live/i.test(status)) return false; + const age = daysSince(t.jira?.statusChangedAt ?? null); + if (age == null) return false; + const limit = /waiting.?po/i.test(status) ? (thr.waitingPo1 ?? 7) + : /uat/i.test(status) ? (thr.jiraUAT ?? 7) + : (thr.jiraStuck ?? 7); + return age >= limit; +} +function clientOwed(t: Ticket, colleagues: Set): boolean { + if (isColleague(t.lastActivityBy, colleagues)) return false; + const age = daysSince(t.lastActivityAt); + return age != null && age >= 1; +} + +export interface InsightTicket { + number: string; shortDesc: string; assignedTo: string | null; + brand: string | null; market: string | null; state: string; + days: number | null; link: string | null; jiraStatus: string | null; costGbp: number; +} +export interface AlertGroup { key: string; label: string; count: number; problematic: number; tickets: InsightTicket[]; } +export interface PmRow { pm: string; tickets: number; revenue: number; alerts: number; revAtRisk: number; } +export interface InsightsResponse { + totalAlerts: number; + revAtRisk: number; + groups: AlertGroup[]; + waitingPo: { count: number; revenue: number; levels: { l1: number; l2: number; l3: number } }; + pms: PmRow[]; + generatedAt: string; +} + +async function fetchActive(): Promise { + const { rows } = await pool.query('SELECT * FROM tickets WHERE status = $1', ['active']); + return rows.map(rowToTicket); +} + +function toInsightTicket(t: Ticket, days: number | null, fx: Record): InsightTicket { + return { + number: t.number, shortDesc: t.shortDesc, assignedTo: t.assignedTo, + brand: t.brand, market: t.market, state: t.state, + days: days != null ? Math.floor(days) : null, link: t.link, + jiraStatus: t.jira?.status ?? null, costGbp: Math.round(gbp(t, fx)), + }; +} + +export async function getInsights(): Promise { + const tickets = await fetchActive(); + const cfg = loadConfig(); + const thr = cfg.insightsThresholds ?? {}; + const fx = cfg.fxRates ?? { GBP: 1 }; + const colleagues = new Set((cfg.colleagues ?? []).map(c => c.trim().toLowerCase())); + + const problematic = new Set(); // ticket numbers flagged by any SN-alert group + const groups: AlertGroup[] = []; + + const push = (key: string, label: string, members: Ticket[], isProb: (t: Ticket) => boolean, daysOf: (t: Ticket) => number | null, countProbTowardTotal = true) => { + const list = members.map(t => ({ t, prob: isProb(t), days: daysOf(t) })); + const probList = list.filter(x => x.prob); + if (countProbTowardTotal) probList.forEach(x => problematic.add(x.t.number)); + groups.push({ + key, label, count: members.length, problematic: probList.length, + tickets: list.sort((a, b) => (b.days ?? 0) - (a.days ?? 0)).map(x => toInsightTicket(x.t, x.days, fx)), + }); + }; + + const active = tickets; + const lifetimeOf = (t: Ticket) => daysSince(t.openedAt); + const inStateOf = (t: Ticket) => daysSince(t.stateChangedAt); + const sinceTouch = (t: Ticket) => daysSince(t.lastActivityAt); + + push('unassigned', 'Unassigned', + active.filter(t => !t.assignedTo), + t => (lifetimeOf(t) ?? 0) >= (thr.unassigned ?? 1), lifetimeOf); + + push('assigned', 'Open / Assigned', + active.filter(t => t.assignedTo && /open|new|assigned/i.test(t.state) && !/progress|hold|awaiting|closed/i.test(t.state)), + t => (inStateOf(t) ?? 0) >= (thr.assigned ?? 2), inStateOf); + + push('hold', 'On Hold', + active.filter(t => /on.?hold/i.test(t.state)), + t => (inStateOf(t) ?? 0) >= (thr.hold ?? 5) || jiraBreached(t, thr) || clientOwed(t, colleagues), inStateOf); + + const wip = active.filter(t => /progress/i.test(t.state) && !isAwaitingAgency(t, colleagues)); + push('wipStalled', 'WIP — Jira stalled', + wip.filter(t => t.jira?.status), + t => jiraBreached(t, thr), t => daysSince(t.jira?.statusChangedAt ?? null)); + push('wipNoJira', 'WIP — no Jira link', + wip.filter(t => !t.jira?.status), + () => true, inStateOf); + + push('replied', 'Customer replied', + active.filter(t => isAwaitingAgency(t, colleagues)), + t => (sinceTouch(t) ?? 0) >= (thr.customerReplied ?? 1) || jiraBreached(t, thr), sinceTouch); + + push('awaiting', 'Awaiting customer info', + active.filter(t => /awaiting/i.test(t.state)), + t => (inStateOf(t) ?? 0) >= (thr.awaiting ?? 5) || jiraBreached(t, thr), inStateOf); + + // Informational groups (not counted toward Total Alerts / rev-at-risk) + push('lifetime', 'Lifetime monsters (≥90d)', + active.filter(t => (lifetimeOf(t) ?? 0) >= (thr.lifetime ?? 90)), + () => true, lifetimeOf, false); + push('inactive', 'Inactive requester', + active.filter(t => /\(inactive\)/i.test(t.requestedFor ?? '')), + () => true, lifetimeOf, false); + + // Waiting PO: Jira "Waiting PO" or a finance row with a blank PO (still delivered). + const waiting = active.filter(t => /waiting.?po/i.test(t.jira?.status ?? '') || t.poNumber === ''); + const poAge = (t: Ticket) => daysSince(t.stateChangedAt) ?? 0; + const levels = { l1: 0, l2: 0, l3: 0 }; + for (const t of waiting) { + const a = poAge(t); + if (a >= (thr.waitingPo3 ?? 18)) levels.l3++; + else if (a >= (thr.waitingPo2 ?? 14)) levels.l2++; + else if (a >= (thr.waitingPo1 ?? 7)) levels.l1++; + } + const waitingRevenue = Math.round(waiting.reduce((s, t) => s + gbp(t, fx), 0)); + + // Per-PM roll-up + const pmMap = new Map(); + for (const t of active) { + const pm = t.assignedTo ?? 'Unassigned'; + const row = pmMap.get(pm) ?? { pm, tickets: 0, revenue: 0, alerts: 0, revAtRisk: 0 }; + row.tickets++; + row.revenue += gbp(t, fx); + if (problematic.has(t.number)) { row.alerts++; row.revAtRisk += gbp(t, fx); } + pmMap.set(pm, row); + } + const pms = [...pmMap.values()] + .map(r => ({ ...r, revenue: Math.round(r.revenue), revAtRisk: Math.round(r.revAtRisk) })) + .sort((a, b) => b.alerts - a.alerts || b.revAtRisk - a.revAtRisk); + + const revAtRisk = Math.round([...problematic].reduce((s, num) => s + gbp(active.find(t => t.number === num)!, fx), 0)); + + return { + totalAlerts: problematic.size, + revAtRisk, + groups, + waitingPo: { count: waiting.length, revenue: waitingRevenue, levels }, + pms, + generatedAt: new Date().toISOString(), + }; +} diff --git a/server/mint-token.ts b/server/mint-token.ts new file mode 100644 index 0000000..e5409f0 --- /dev/null +++ b/server/mint-token.ts @@ -0,0 +1,19 @@ +import 'dotenv/config'; +import { pool, initDB } from './db'; +import { createToken } from './tokens'; + +// CLI: mint a sync token for the Chrome extension without going through the +// HTTP endpoint. Usage: npx tsx server/mint-token.ts "my laptop" +(async () => { + if (!process.env.DATABASE_URL) { + console.error('DATABASE_URL is required'); + process.exit(1); + } + const label = process.argv.slice(2).join(' ') || 'sync-extension'; + await initDB(); + const raw = await createToken(label); + console.log('\nSync token (shown once — paste it into the extension options):\n'); + console.log(' ' + raw + '\n'); + console.log(`label: ${label}`); + await pool.end(); +})(); diff --git a/server/reseed.ts b/server/reseed.ts new file mode 100644 index 0000000..ea23a70 --- /dev/null +++ b/server/reseed.ts @@ -0,0 +1,17 @@ +import 'dotenv/config'; +import { pool, initDB, reseedFromArchives } from './db'; + +// CLI: reload the tickets table from server/data/*.json, replacing whatever is +// there. Use after regenerating the archives (e.g. from a Let it Snow storage +// dump via scripts/dump-to-archives.mjs). Destructive: TRUNCATEs tickets first. +// npx tsx server/reseed.ts (or: npm run reseed) +(async () => { + if (!process.env.DATABASE_URL) { + console.error('DATABASE_URL is required'); + process.exit(1); + } + await initDB(); + const n = await reseedFromArchives(); + console.log(`Reseeded ${n} tickets from server/data archives`); + await pool.end(); +})(); diff --git a/server/tickets.ts b/server/tickets.ts new file mode 100644 index 0000000..f89a533 --- /dev/null +++ b/server/tickets.ts @@ -0,0 +1,57 @@ +import { pool, rowToTicket } from './db'; +import type { Ticket, TicketFilters, StatsResponse } from './types'; + +// List tickets with optional filters. Text search spans number + short desc + +// assignee. Ordered newest-activity-first so the operational board is useful. +export async function listTickets(f: TicketFilters): Promise { + const where: string[] = []; + const params: unknown[] = []; + const add = (sql: string, val: unknown) => { params.push(val); where.push(sql.replace('$?', `$${params.length}`)); }; + + if (f.status) add('status = $?', f.status); + if (f.state) add('state = $?', f.state); + if (f.group) add('assignment_group = $?', f.group); + if (f.assignee) add('assigned_to = $?', f.assignee); + if (f.q) { + params.push(`%${f.q.toLowerCase()}%`); + const p = `$${params.length}`; + where.push(`(lower(number) LIKE ${p} OR lower(short_desc) LIKE ${p} OR lower(coalesce(assigned_to,'')) LIKE ${p})`); + } + + const sql = ` + SELECT * FROM tickets + ${where.length ? 'WHERE ' + where.join(' AND ') : ''} + ORDER BY last_activity_at DESC NULLS LAST, number DESC + LIMIT 2000 + `; + const { rows } = await pool.query(sql, params); + return rows.map(rowToTicket); +} + +export async function getTicket(number: string): Promise { + const { rows } = await pool.query(`SELECT * FROM tickets WHERE number = $1`, [number]); + return rows[0] ? rowToTicket(rows[0]) : null; +} + +export async function getStats(): Promise { + const [totals, byState, byGroup, byAssignee] = await Promise.all([ + pool.query<{ status: string; n: string }>(`SELECT status, count(*)::text AS n FROM tickets GROUP BY status`), + pool.query<{ state: string; n: string }>( + `SELECT state, count(*)::text AS n FROM tickets WHERE status='active' GROUP BY state ORDER BY count(*) DESC`), + pool.query<{ g: string; n: string }>( + `SELECT coalesce(assignment_group,'—') AS g, count(*)::text AS n FROM tickets WHERE status='active' GROUP BY g ORDER BY count(*) DESC`), + pool.query<{ a: string; n: string }>( + `SELECT coalesce(assigned_to,'—') AS a, count(*)::text AS n FROM tickets WHERE status='active' GROUP BY a ORDER BY count(*) DESC LIMIT 20`), + ]); + + const active = Number(totals.rows.find(r => r.status === 'active')?.n ?? '0'); + const closed = Number(totals.rows.find(r => r.status === 'closed')?.n ?? '0'); + return { + total: active + closed, + active, + closed, + byState: byState.rows.map(r => ({ state: r.state || '—', count: Number(r.n) })), + byGroup: byGroup.rows.map(r => ({ group: r.g, count: Number(r.n) })), + byAssignee: byAssignee.rows.map(r => ({ assignee: r.a, count: Number(r.n) })), + }; +} diff --git a/server/tokens.test.ts b/server/tokens.test.ts new file mode 100644 index 0000000..ff421de --- /dev/null +++ b/server/tokens.test.ts @@ -0,0 +1,26 @@ +import { describe, it, expect } from 'vitest'; +import { mintToken, parseToken, sha256Hex } from './tokens'; + +describe('token format', () => { + it('mints a fg_ token that parses back to a secret whose hash matches', () => { + const t = mintToken(); + expect(t.raw.startsWith('fg_')).toBe(true); + const parsed = parseToken(t.raw); + expect(parsed).not.toBeNull(); + expect(parsed!.tokenId).toBe(t.tokenId); + expect(sha256Hex(parsed!.secret)).toBe(t.tokenHash); + }); + + it('rejects malformed tokens', () => { + expect(parseToken('nope')).toBeNull(); + expect(parseToken('fg_short')).toBeNull(); + expect(parseToken('')).toBeNull(); + }); + + it('parses ids/secrets that contain underscores (base64url)', () => { + // Fixed-offset parsing must not split on the first underscore. + const t = mintToken(); + const parsed = parseToken(t.raw)!; + expect(`fg_${parsed.tokenId}_${parsed.secret}`).toBe(t.raw); + }); +}); diff --git a/server/tokens.ts b/server/tokens.ts new file mode 100644 index 0000000..05bc97e --- /dev/null +++ b/server/tokens.ts @@ -0,0 +1,110 @@ +import crypto from 'node:crypto'; +import type { Request } from 'express'; +import { pool } from './db'; + +// API tokens for the Chrome sync extension. Format: fg__. +// Only the SHA-256 of the secret is stored; token_id is a non-secret locator. +// Mirrors the Husky template's scheme (see its ADR), trimmed to what the sync +// route needs. The raw token is shown ONCE at mint time and never logged. + +const PREFIX = 'fg_'; +const ID_BYTES = 9; // ~12 url-safe chars +const SECRET_BYTES = 32; // 256-bit secret +const ID_LEN = Math.ceil((ID_BYTES * 4) / 3); // base64url unpadded → 12 +const TTL_DAYS = 180; + +export function sha256Hex(input: string): string { + return crypto.createHash('sha256').update(input).digest('hex'); +} + +export interface MintedToken { raw: string; tokenId: string; tokenHash: string; } + +export function mintToken(): MintedToken { + const tokenId = crypto.randomBytes(ID_BYTES).toString('base64url'); + const secret = crypto.randomBytes(SECRET_BYTES).toString('base64url'); + return { raw: `${PREFIX}${tokenId}_${secret}`, tokenId, tokenHash: sha256Hex(secret) }; +} + +// Fixed-length id, so parse by offset (base64url maps `/`→`_`, so first-`_` +// splitting would truncate ids containing an underscore). +export function parseToken(raw: string): { tokenId: string; secret: string } | null { + if (!raw.startsWith(PREFIX)) return null; + const rest = raw.slice(PREFIX.length); + if (rest.length <= ID_LEN || rest[ID_LEN] !== '_') return null; + const tokenId = rest.slice(0, ID_LEN); + const secret = rest.slice(ID_LEN + 1); + if (!tokenId || !secret) return null; + return { tokenId, secret }; +} + +export function bearerFromRequest(req: Request): string | null { + const auth = req.headers.authorization; + if (typeof auth === 'string' && auth.startsWith('Bearer ')) { + const t = auth.slice('Bearer '.length).trim(); + if (t) return t; + } + const x = req.headers['x-api-token']; + if (typeof x === 'string' && x.trim()) return x.trim(); + return null; +} + +// Resolve a presented bearer token to its token_id, or null (missing / malformed +// / unknown / revoked / expired). Never throws on auth failure; never logs the +// token. Best-effort last_used_at bump on success. +export async function resolveToken(req: Request): Promise<{ tokenId: string } | null> { + const raw = bearerFromRequest(req); + if (!raw) return null; + const parsed = parseToken(raw); + if (!parsed) return null; + try { + const { rows } = await pool.query<{ id: number; token_hash: string }>( + `SELECT id, token_hash FROM api_tokens + WHERE token_id = $1 AND revoked = false + AND (expires_at IS NULL OR expires_at > NOW())`, + [parsed.tokenId], + ); + const row = rows[0]; + if (!row) return null; + const presented = Buffer.from(sha256Hex(parsed.secret)); + const stored = Buffer.from(row.token_hash); + if (presented.length !== stored.length || !crypto.timingSafeEqual(presented, stored)) return null; + pool.query(`UPDATE api_tokens SET last_used_at = NOW() WHERE id = $1`, [row.id]) + .catch(err => console.error('api_tokens last_used_at update failed:', (err as Error).message)); + return { tokenId: parsed.tokenId }; + } catch (err) { + console.error('resolveToken error:', (err as Error).message); + return null; + } +} + +// Mint + persist a token. Returns the raw token to show the user once. +export async function createToken(label: string): Promise { + const t = mintToken(); + await pool.query( + `INSERT INTO api_tokens (token_id, token_hash, label, expires_at) + VALUES ($1, $2, $3, NOW() + ($4 || ' days')::interval)`, + [t.tokenId, t.tokenHash, label || 'sync-extension', String(TTL_DAYS)], + ); + return t.raw; +} + +export interface TokenInfo { + id: number; tokenId: string; label: string; + createdAt: string | null; lastUsedAt: string | null; expiresAt: string | null; revoked: boolean; +} +const iso = (v: unknown) => (v instanceof Date ? v.toISOString() : (v as string | null)); + +export async function listTokens(): Promise { + const { rows } = await pool.query( + `SELECT id, token_id, label, created_at, last_used_at, expires_at, revoked + FROM api_tokens ORDER BY created_at DESC`, + ); + return rows.map(r => ({ + id: r.id, tokenId: r.token_id, label: r.label, + createdAt: iso(r.created_at), lastUsedAt: iso(r.last_used_at), expiresAt: iso(r.expires_at), revoked: r.revoked, + })); +} + +export async function revokeToken(id: number): Promise { + await pool.query(`UPDATE api_tokens SET revoked = true WHERE id = $1`, [id]); +} diff --git a/server/types.ts b/server/types.ts new file mode 100644 index 0000000..04e4db3 --- /dev/null +++ b/server/types.ts @@ -0,0 +1,81 @@ +// Shared server types. The client mirrors the wire shape in client/src/types. + +export type TicketStatus = 'active' | 'closed'; + +export interface ActivityEntry { + kind: 'comment' | 'worknote' | string; + t: string; + who: string; +} + +export interface JiraInfo { + status?: string; + statusChangedAt?: string; + key?: string | null; + url?: string | null; + assignee?: string | null; + statusDurations?: Record; // status → milliseconds (chart #17) + movements?: { at: string; who?: string; from?: string; to?: string }[]; +} + +// One normalized ticket row, covering both the active (operational) and closed +// (analytics) ServiceNow archives. Nullable fields are simply absent in one of +// the two source shapes. +export interface Ticket { + number: string; + status: TicketStatus; + state: string; + shortDesc: string; + assignedTo: string | null; + assignmentGroup: string | null; + brand: string | null; + market: string | null; + businessUnit: string | null; + requestedFor: string | null; + openedBy: string | null; + openedAt: string | null; + openedDate: string | null; + closedDate: string | null; + toDoAt: string | null; + inUatAt: string | null; + jiraKey: string | null; + currencyCode: string | null; + ticketYear: number | null; + size: string | null; + poNumber: string | null; // '' = in finance but no PO yet; null = not in finance + invoiced: string | null; + dueDate: string | null; + stateChangedAt: string | null; + stateChangedBy: string | null; + lastActivityAt: string | null; + lastActivityBy: string | null; + lastComment: string | null; + description: string | null; + link: string | null; + finalCost: number | null; + ttfrMinutes: number | null; + clientRespMinutes: number | null; + fulfillmentDate: string | null; + firstReplyAt: string | null; + firstAssignedDate: string | null; + updatedAt: string | null; + jira: JiraInfo | null; + activity: ActivityEntry[]; +} + +export interface TicketFilters { + status?: TicketStatus; + state?: string; + group?: string; + assignee?: string; + q?: string; +} + +export interface StatsResponse { + total: number; + active: number; + closed: number; + byState: { state: string; count: number }[]; + byGroup: { group: string; count: number }[]; + byAssignee: { assignee: string; count: number }[]; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..4703853 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "CommonJS", + "lib": ["ES2020", "ES2021.String"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "./dist", + "rootDir": ".", + "resolveJsonModule": true + }, + "include": ["index.ts", "server/**/*.ts"], + "exclude": ["node_modules", "client", "dist", "extension", "**/*.test.ts"] +} diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..49a4cbb --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineConfig, configDefaults } from 'vitest/config'; + +export default defineConfig({ + test: { + environment: 'node', + include: ['server/**/*.{test,spec}.ts'], + exclude: [...configDefaults.exclude, '**/._*'], + pool: 'forks', + poolOptions: { forks: { singleFork: true } }, + }, +});