Skip to main content

Service Report #007 New

Date: 2026-01-13

Under Development

This service report is currently under development and not ready for testing. For the latest MoM (2026-01-06), please check Service Report #006 instead.


Feature Overview

#FeatureIssueTypeStatus
1Project Settings Create Button FixInternalBug Fix🔍 In Review
2Project Settings Role Comparison DocsInternalDocumentation🔍 In Review
3Version CentralizationInternalEnhancement🔍 In Review
4User Invitation FlowInternalEnhancement🔍 In Review
5Project Registration Optional CommandsInternalEnhancement🔍 In Review

1. Project Settings Create Button Fix

Source: Internal Request Thai Name: แก้ไขปุ่ม "สร้าง" ในหน้า Project Settings ให้ตรงกับ Worker Registry

Description: Fixed the Create button styling in Project Settings to match the Worker Registry pattern. The button was using mat-button (text button) instead of mat-flat-button (filled green button).

Location: Tools > กำหนดค่า > Project Settings > List View

Before/After

BeforeAfter
mat-button (text only, no background)mat-flat-button (green background)
No iconadd icon

Files Modified

FileChange
project-setting-list-toolbar.component.tsAdded MatIconModule import, changed to mat-flat-button with add icon
.claude/rules/angular.mdAdded "Create Button Standard (List Toolbar)" section

Golden Rule Added

A new golden rule was added to Angular guidelines for consistent create button styling:

ElementValue
Directivemat-flat-button (green background)
Iconadd
i18n Key@@common.create or feature-specific

What to Test

#Test CaseStatus
1Open Project Settings → Verify green "สร้าง" button with add icon Pending
2Compare with Worker Registry → Buttons should look identical Pending

2. Project Settings Role Comparison Docs

Source: Internal Request Thai Name: เพิ่มเอกสารเปรียบเทียบสิทธิ์ระหว่าง Purchasing และ Work Owner

Description: Added detailed role comparison documentation for Project Settings feature, clarifying the differences between Purchasing and Work Owner roles.

Location: Docs Site > Features > Project Settings

Role Comparison Summary

CapabilityPurchasingWork Owner
View all projects
Create new projects
Edit all projects (own only)
Delete projects
Edit PO fields (PO.No, Duration, Period) (read-only)
Edit PR.No

Work Owner Restrictions

RestrictionDescription
No Create buttonButton is hidden for Work Owner role
Edit own projects onlyCannot edit projects owned by others
PO fields read-onlyPO.No, Duration, Period are disabled
No Delete actionDelete option is not available
PR.No is editableThis is the only PO-related field Work Owner can edit

Files Modified

FileChange
docs/docs/features/project-setting.mdAdded "Role Comparison: Purchasing vs Work Owner" section

What to Test

#Test CaseStatus
1View documentation at Features > Project Settings Pending
2Verify role comparison table is accurate Pending

3. Version Centralization

Source: Internal Request Thai Name: รวมศูนย์การจัดการ Version เป็นแหล่งเดียว

Description: Centralized version management to use frontend/package.json as the single source of truth. Previously, the version was duplicated in 5 environment files and hardcoded in the docs site.

Location: Frontend + Docs Site

Architecture

Single Source of Truth

frontend/package.json (version: "2025.10.1.0-preview29")

├─→ version.helper.ts → APP_VERSION constant
│ ↓
│ ├─→ about.component.ts
│ ├─→ login.component.ts
│ └─→ home.component.ts

└─→ docs/scripts/sync-version.js (prebuild hook)

└─→ docs/docs/index.md (auto-updated)

Changes Summary

AreaBeforeAfter
package.json0.0.0 (unused)2025.10.1.0-preview29
Environment filesappVersion in 5 filesRemoved (using helper)
Componentsenvironment.appVersionAPP_VERSION from helper
Docs indexHardcoded versionAuto-synced from package.json
Service reportsVersion lines in headersRemoved

Files Created

FileDescription
frontend/src/app/shared/helpers/version.helper.tsExports APP_VERSION from package.json
docs/scripts/sync-version.jsSyncs version to docs index page

Files Modified

FileChange
frontend/package.jsonUpdated version to 2025.10.1.0-preview29
frontend/tsconfig.jsonAdded resolveJsonModule: true
frontend/src/environments/environment.tsRemoved appVersion
frontend/src/environments/environment.dev.tsRemoved appVersion
frontend/src/environments/environment.development.tsRemoved appVersion
frontend/src/environments/environment.thaiscada.tsRemoved appVersion
frontend/src/environments/environment.neosyntax.tsRemoved appVersion
frontend/src/app/features/tools/about/about.component.tsUse APP_VERSION
frontend/src/app/features/auth/login/login.component.tsUse APP_VERSION
frontend/src/app/features/home/home.component.tsUse APP_VERSION
docs/package.jsonAdded sync-version, prestart, prebuild scripts
docs/docs/service-reports/report-001.mdRemoved version line
docs/docs/service-reports/report-002.mdRemoved version line
docs/docs/service-reports/report-003.mdRemoved version line
docs/docs/service-reports/report-004.mdRemoved version line
docs/docs/service-reports/report-005.mdRemoved version line
docs/docs/service-reports/report-006.mdRemoved version line

Version Bump Process (New)

When bumping version:

  1. Update frontend/package.json version field (single source of truth)
  2. Add new section to docs/docs/release-notes.md
  3. Docs index page updates automatically on build via sync-version.js

What to Test

#Test CaseStatus
1Build frontend → Verify About page shows correct version Pending
2Build docs → Verify index page shows correct version Pending
3Run npm run start in docs → Verify sync-version runs Pending
4Change package.json version → Rebuild → Verify all updated Pending

4. User Invitation Flow

Source: Internal Request Thai Name: ระบบเชิญผู้ใช้งานด้วยอีเมลที่กำหนดเอง (Thai/English)

Description: Custom invitation emails replacing Keycloak default emails. The application now controls the invitation email content with bilingual Thai/English support.

Location: User Settings > Send Invitation + /accept-invitation page

Architecture

Admin clicks "Send Invitation"

Backend creates invitation token in DB (72h TTL)

Backend sends custom bilingual email via Mailpit

User clicks link → /accept-invitation?token=xxx

User sets password → Keycloak account created

Files Created

FileDescription
Domain/Users/UserInvitation.csEntity for invitation tokens
Application/Contracts/IUserInvitationService.csService interface
Infrastructure/Services/UserInvitationService.csService implementation
WebApi/Features/Invitations/ValidateInvitationEndpoint.csGET /api/invitations/validate/{token}
WebApi/Features/Invitations/AcceptInvitationEndpoint.csPOST /api/invitations/accept
assets/templates/emails/user-invitation.htmlBilingual email template
frontend/src/app/features/auth/accept-invitation/*Frontend components (3 files)

Files Modified

FileChange
WebApi/Features/Users/SendInvitationEndpoint.csUse IUserInvitationService instead of Keycloak direct
Infrastructure/Keycloak/KeycloakUserAdminService.csAdded CreateAccountWithPasswordAsync()
frontend/src/app/features/auth/auth.routes.tsAdded accept-invitation route
frontend/src/locale/messages.jsonAdded acceptInvitation.* keys
frontend/src/locale/messages.en.jsonAdded English translations

What to Test

#Test CaseStatus
1Send invitation from User Settings Pending
2Check Mailpit for bilingual email Pending
3Click link → verify accept-invitation page Pending
4Set password → login with new credentials Pending
5Re-send invitation → verify old token invalidated Pending

5. Project Registration Optional Commands

Source: Internal Request Thai Name: ข้ามขั้นตอน Purchasing Review เมื่อมีเลข PO

Description: Skip Purchasing review step when project already has a PO Number. This allows projects with existing PO to go directly to contractor without Purchasing review.

Location: Project Registration Workflow

Architecture

Project has PO Number?
↓ Yes ↓ No
Skip to Contractor → Go through Purchasing
(RequestPreWorkProcedures (ReviewProjectDataByPurchasing)
FormDirect)

Files Created

FileDescription
Domain/Workflows/OptionalCommandConfig.csConfiguration for optional commands
Domain/Workflows/SkipConditionType.csEnum for skip conditions (HasPurchaseOrderNo, etc.)
Application/Contracts/ISkipConditionEvaluator.csEvaluator interface
Infrastructure/Services/SkipConditionEvaluator.csEvaluator implementation

Files Modified

FileChange
Application/Services/TaskCommandService.csFilter commands based on skip conditions
Domain/Workflows/ProjectRegistrationWorkflow.csHandle RequestPreWorkProceduresFormDirect command
Frontend task-command componentDisplay optional commands with confirmation

What to Test

#Test CaseStatus
1Create project WITH PO Number → should show skip option Pending
2Create project WITHOUT PO Number → should require Purchasing review Pending
3Confirm skip option → verify workflow proceeds to contractor Pending