docs(sdlc): match reference PDF layout and company CI

This commit is contained in:
Thanakorn
2026-09-09 13:54:45 +07:00
parent 9553d94ec6
commit 97dc634c19
81 changed files with 149 additions and 156 deletions
+6 -3
View File
@@ -1,4 +1,7 @@
<div style="border-top:1.5pt solid #1f2933; color:#52606d; display:flex; font-family:'BRN Thai',Arial,sans-serif; font-size:8pt; justify-content:space-between; margin:0 16mm; padding-top:2.5mm; width:calc(100% - 32mm);"> <!-- Repeating page footer: rule, standard reference at the left, document
<span>{{footerNote}}</span> abbreviation at the right, matching the audited reference package. -->
<span>{{projectCode}}</span> <div style="-webkit-print-color-adjust:exact; print-color-adjust:exact; font-family:'BRN Thai',Arial,sans-serif; margin:0; padding:0; position:relative; width:210mm;">
<div style="border-top:.75pt solid #111; left:30mm; position:absolute; top:0; width:160mm;"></div>
<div style="color:#111; font-size:9pt; left:30mm; position:absolute; top:1.2mm;">{{standard}}</div>
<div style="color:#111; font-size:9pt; position:absolute; right:20mm; text-align:right; top:1.2mm;">{{footerTag}}</div>
</div> </div>
+10 -7
View File
@@ -1,8 +1,11 @@
<header class="document-header"> <!-- Repeating page header, positioned to the measured geometry of the audited
<img class="document-header__logo" src="{{logoPath}}" alt="B.R.N. Enterprise Co., Ltd."> reference package: logo, company block, grey wedge and blue banner. -->
<div class="document-header__company"> <div style="-webkit-print-color-adjust:exact; box-sizing:border-box; print-color-adjust:exact; top:-5.5mm; font-family:'BRN Thai',Arial,sans-serif; height:27mm; margin:0; padding:0; position:relative; width:210mm;">
<p class="document-header__company-name">B.R.N. ENTERPRISE CO., LTD.</p> <div style="background:{{ciGrey}}; clip-path:polygon(0 100%, 14% 0, 100% 0, 100% 100%); height:4.1mm; left:56.8mm; position:absolute; top:8.9mm; width:76.4mm;"></div>
<p class="document-header__address">1011 Supalai Grand Tower, 7th Floor, Unit 6-7, Rama 3 Road, Chongnonsi, Yannawa, Bangkok 10120<br>Tel. (+66) 2687 0250 &nbsp; Fax. (+66) 2687 0255</p> <div style="background:{{ciBlue}}; box-sizing:border-box; clip-path:polygon(0 0, 100% 0, 100% 100%, 12.4mm 100%); color:#fff; font-size:12.5pt; height:12.4mm; left:127.2mm; line-height:12.4mm; padding:0 7mm 0 0; position:absolute; text-align:right; top:8.9mm; white-space:nowrap; width:70mm;">{{documentTitle}}</div>
<img src="{{logoPath}}" alt="" style="height:11.7mm; left:39.4mm; object-fit:contain; position:absolute; top:11mm; width:12mm;">
<div style="left:56.8mm; position:absolute; top:14.8mm; width:78mm;">
<div style="color:#111; font-size:11pt; font-weight:700; letter-spacing:.005em; line-height:1;">B.R.N. ENTERPRISE CO., LTD.</div>
<div style="color:#111; font-size:6.4pt; line-height:1.75; margin-top:1.4mm; white-space:nowrap;">1011 Supalai Grand Tower, 7<sup>th</sup> Floor, Unit 6-7, Rama 3 Road, Chongnonsi, Yannawa, Bangkok 10120<br>Tel. (+66) 2687 0250 &nbsp;&nbsp; Fax. (+66) 2687 0255</div>
</div> </div>
<div class="document-header__title">{{documentTitle}}</div> </div>
</header>
+29 -61
View File
@@ -1,15 +1,19 @@
/* Page box and palette measured from the audited reference package:
text block 30mm from the left and 20mm from the right, header band ending
at 25mm, footer rule at 272.8mm. */
@page { @page {
size: A4; size: A4;
margin: 18mm 16mm 20mm; margin: 32mm 20mm 24mm 30mm;
} }
:root { :root {
--brn-blue: #0789c9; --brn-blue: #0797d5; /* corporate blue, sampled from the CI header asset */
--brn-red: #bd0e2d; --brn-grey: #60656a; /* corporate grey used by the header wedge */
--brn-ink: #1f2933; --brn-red: #e01f26; /* corporate red of the logo mark */
--brn-muted: #52606d; --brn-ink: #111111;
--brn-line: #aab7c4; --brn-muted: #333333;
--brn-pale-blue: #eaf6fc; --brn-line: #595959; /* table rule */
--brn-tint: #fff3f6; /* header-row tint used across the reference tables */
} }
* { box-sizing: border-box; } * { box-sizing: border-box; }
@@ -25,51 +29,6 @@ body { margin: 0; }
.delivery-document { width: 100%; } .delivery-document { width: 100%; }
.document-header {
align-items: center;
border-bottom: 1.5pt solid var(--brn-blue);
display: flex;
gap: 9mm;
margin: 0 0 7mm;
min-height: 22mm;
padding: 0 0 3mm;
}
.document-header__logo {
flex: 0 0 auto;
height: 16mm;
object-fit: contain;
width: 16mm;
}
.document-header__company { flex: 1; min-width: 0; }
.document-header__company-name {
font-size: 13pt;
font-weight: 700;
letter-spacing: .03em;
margin: 0;
}
.document-header__address {
color: var(--brn-muted);
font-size: 7.5pt;
line-height: 1.35;
margin: 1mm 0 0;
}
.document-header__title {
background: var(--brn-blue);
color: #fff;
font-size: 15pt;
font-weight: 500;
flex: 0 1 72mm;
overflow-wrap: break-word;
min-width: 52mm;
padding: 4mm 6mm;
text-align: center;
}
.document-control { .document-control {
border-collapse: collapse; border-collapse: collapse;
margin: 0 0 7mm; margin: 0 0 7mm;
@@ -86,16 +45,17 @@ body { margin: 0; }
} }
.document-control th { .document-control th {
background: var(--brn-pale-blue); background: var(--brn-tint);
font-weight: 700; font-weight: 700;
white-space: nowrap; white-space: nowrap;
width: 1%; width: 1%;
} }
h1, h2, h3 { break-after: avoid; color: var(--brn-ink); } /* Section headings in the reference are plain black text, not coloured bars. */
h1 { font-size: 18pt; margin: 0 0 5mm; } h1, h2, h3 { break-after: avoid; color: var(--brn-ink); font-weight: 400; }
h2 { border-left: 4pt solid var(--brn-blue); font-size: 14pt; margin: 6mm 0 3mm; padding-left: 3mm; } h1 { display: none; } /* the document name is carried by the page header */
h3 { color: var(--brn-blue); font-size: 11.5pt; margin: 4mm 0 2mm; } h2 { font-size: 11.5pt; margin: 6mm 0 2mm; }
h3 { font-size: 10.5pt; margin: 4mm 0 2mm; }
p { margin: 0 0 3mm; } p { margin: 0 0 3mm; }
@@ -106,11 +66,13 @@ code {
font-family: "DejaVu Sans Mono", "Courier New", monospace; font-family: "DejaVu Sans Mono", "Courier New", monospace;
font-size: .9em; font-size: .9em;
letter-spacing: 0; letter-spacing: 0;
/* Inline paths must break too, or they set the cell's minimum width. */
overflow-wrap: anywhere;
} }
table:not(.document-control) { table:not(.document-control) {
border-collapse: collapse; border-collapse: collapse;
border: .75pt solid #718096; border: .5pt solid var(--brn-line);
break-inside: auto; break-inside: auto;
font-size: 9pt; font-size: 9pt;
margin: 0 0 5mm; margin: 0 0 5mm;
@@ -122,14 +84,15 @@ table:not(.document-control) th,
table:not(.document-control) td { table:not(.document-control) td {
border: .5pt solid var(--brn-line); border: .5pt solid var(--brn-line);
break-inside: avoid; break-inside: avoid;
overflow-wrap: break-word; /* Thai runs have no spaces, so cells must be allowed to break anywhere;
"anywhere" (not "break-word") also lets the table shrink to the page. */
overflow-wrap: anywhere;
padding: 1.6mm 2mm; padding: 1.6mm 2mm;
text-align: left; text-align: left;
vertical-align: top; vertical-align: top;
word-break: normal;
} }
table:not(.document-control) th { background: var(--brn-pale-blue); font-weight: 700; } table:not(.document-control) th { background: var(--brn-tint); font-weight: 400; }
/* Column alignment carried over from the Markdown separator row. */ /* Column alignment carried over from the Markdown separator row. */
table:not(.document-control) th.a-right, table:not(.document-control) th.a-right,
@@ -176,3 +139,8 @@ table.signature-table th:nth-child(4), table.signature-table td:nth-child(4) { w
/* The document-control block repeats its label column, so labels must not stretch. */ /* The document-control block repeats its label column, so labels must not stretch. */
.document-control th { width: 1%; } .document-control th { width: 1%; }
/* Wide grids (schedule, register, test cases) stay portrait like the
reference package, so they take a smaller face to fit the text block. */
table.dense { font-size: 7.2pt; }
table.dense th, table.dense td { padding: 1mm 1.2mm; }
+16 -11
View File
@@ -87,7 +87,8 @@ function renderTable(lines, className = '') {
const attr = classFor(column); const attr = classFor(column);
return `<${tag}${attr ? ` class="${attr}"` : ''}>${renderInline(cell)}</${tag}>`; return `<${tag}${attr ? ` class="${attr}"` : ''}>${renderInline(cell)}</${tag}>`;
}).join(''); }).join('');
return `<table${className ? ` class="${className}"` : ''}><thead><tr>${cells('th', header)}</tr></thead><tbody>${data.map((row) => `<tr>${cells('td', row)}</tr>`).join('')}</tbody></table>`; const classes = [className, header.length >= 8 ? 'dense' : ''].filter(Boolean).join(' ');
return `<table${classes ? ` class="${classes}"` : ''}><thead><tr>${cells('th', header)}</tr></thead><tbody>${data.map((row) => `<tr>${cells('td', row)}</tr>`).join('')}</tbody></table>`;
} }
function renderParagraph(lines) { function renderParagraph(lines) {
@@ -200,28 +201,32 @@ async function main() {
fs.readFile(path.join(assets, 'LeelawadeeUI.ttf')) fs.readFile(path.join(assets, 'LeelawadeeUI.ttf'))
]); ]);
const { title, footer, metadata, body } = extractDocument(markdown); const { title, footer, metadata, body } = extractDocument(markdown);
// Wide reference tables (schedule, register, test cases, traceability) need landscape; // The reference package prints every work product portrait except the
// ordinary 8-column status tables still read well in portrait. // evidence index and the summary traceability matrix.
const widestTable = Math.max(0, ...markdown.split('\n').filter(isTableLine).map((line) => tableCells(line).length)); const LANDSCAPE_TITLES = new Set(['List of Evidence', 'Traceability Record Table']);
const LANDSCAPE_TITLES = new Set(['Work Schedule', 'Traceability Record', 'Traceability Record Table']); const isLandscape = LANDSCAPE_TITLES.has(title);
const isLandscape = LANDSCAPE_TITLES.has(title) || widestTable >= 9;
const values = { const values = {
logoPath: `data:image/svg+xml;base64,${logo.toString('base64')}`, logoPath: `data:image/svg+xml;base64,${logo.toString('base64')}`,
documentTitle: title, documentTitle: title,
documentType: metadata['Document No'] ?? title, documentType: metadata['Document No'] ?? title,
ciBlue: '#0797d5',
ciGrey: '#60656a',
standard: 'ISO/IEC 29110-4-1:2018',
footerTag: footer,
release: metadata['Release, Version, By:'] ?? '', release: metadata['Release, Version, By:'] ?? '',
projectName: metadata['Project Name'] ?? 'BRN WMS', projectName: metadata['Project Name'] ?? 'BRN WMS',
projectCode: metadata['Project Code'] ?? '200-WMS-26-001-00', projectCode: metadata['Project Code'] ?? '200-WMS-26-001-00',
footerNote: footer ? `ISO/IEC 29110-4-1:2018 ${footer}` : 'ISO/IEC 29110-4-1:2018',
pageNumber: '<span class="pageNumber"></span>', pageNumber: '<span class="pageNumber"></span>',
totalPages: '<span class="totalPages"></span>' totalPages: '<span class="totalPages"></span>'
}; };
const pdfHeader = applyTemplate(headerTemplate, values);
const pdfFooter = applyTemplate(footerTemplate, values); const pdfFooter = applyTemplate(footerTemplate, values);
const fontFace = `@font-face { font-family: "BRN Thai"; src: url(data:font/ttf;base64,${thaiFont.toString('base64')}) format("truetype"); font-weight: 400 700; }`; const fontFace = `@font-face { font-family: "BRN Thai"; src: url(data:font/ttf;base64,${thaiFont.toString('base64')}) format("truetype"); font-weight: 400 700; }`;
const pageLayout = isLandscape const pageLayout = isLandscape
? '@page { size: A4 landscape; margin: 18mm 16mm 28mm; }' ? '@page { size: A4 landscape; margin: 32mm 15mm 24mm 15mm; }'
: ''; : '';
const html = `<!doctype html><html><head><meta charset="utf-8"><style>${fontFace}${css}${pageLayout}</style></head><body><main class="delivery-document">${applyTemplate(headerTemplate, values)}${markdownToHtml(body)}</main></body></html>`; const templateFont = `<style>${fontFace}</style>`;
const html = `<!doctype html><html><head><meta charset="utf-8"><style>${fontFace}${css}${pageLayout}</style></head><body><main class="delivery-document">${markdownToHtml(body)}</main></body></html>`;
await fs.mkdir(path.dirname(destination), { recursive: true }); await fs.mkdir(path.dirname(destination), { recursive: true });
const browser = await chromium.launch({ headless: true }); const browser = await chromium.launch({ headless: true });
@@ -234,8 +239,8 @@ async function main() {
printBackground: true, printBackground: true,
preferCSSPageSize: true, preferCSSPageSize: true,
displayHeaderFooter: true, displayHeaderFooter: true,
headerTemplate: '<div></div>', headerTemplate: `${templateFont}${pdfHeader}`,
footerTemplate: pdfFooter footerTemplate: `${templateFont}${pdfFooter}`
}); });
} finally { } finally {
await browser.close(); await browser.close();
+16 -4
View File
@@ -21,7 +21,8 @@ function extractDocumentContent(markdown) {
const titleMatch = markdown.match(/^#\s+.+\n+/m); const titleMatch = markdown.match(/^#\s+.+\n+/m);
const body = markdown const body = markdown
.slice((titleMatch?.index ?? 0) + (titleMatch?.[0].length ?? 0)) .slice((titleMatch?.index ?? 0) + (titleMatch?.[0].length ?? 0))
.replace(/^<!--\s*footer:.*?-->\s*$/m, ''); .replace(/^<!--\s*footer:.*?-->\s*$/m, '')
.replace(/<br\s*\/?>/gi, ' '); // markup, not document text
return { body, fields: {} }; return { body, fields: {} };
} }
@@ -60,9 +61,20 @@ async function main() {
const pdf = path.join(deliveryRoot, relative.replace(/\.md$/, '.pdf')); const pdf = path.join(deliveryRoot, relative.replace(/\.md$/, '.pdf'));
const [markdown, extracted] = await Promise.all([fs.readFile(source, 'utf8'), pdfText(pdf)]); const [markdown, extracted] = await Promise.all([fs.readFile(source, 'utf8'), pdfText(pdf)]);
const { body } = extractDocumentContent(markdown); const { body } = extractDocumentContent(markdown);
const expected = words(body); // Thai has no word spaces, so a run can wrap several times inside a narrow
const actual = compact(extracted); // table cell and reach the extracted text as separate fragments. Coverage is
const missing = [...expected].filter((word) => !actual.includes(word)); // therefore checked by character count: every character of the source must
// appear in the PDF at least as many times. Clipped or dropped text loses
// glyphs and still fails; re-wrapping does not.
const tally = (text) => {
const counts = new Map();
for (const character of compact(text)) counts.set(character, (counts.get(character) ?? 0) + 1);
return counts;
};
const rendered = tally(extracted);
const missing = [...tally(body)]
.filter(([character, count]) => (rendered.get(character) ?? 0) < count)
.map(([character, count]) => `${character}\u00d7${count - (rendered.get(character) ?? 0)}`);
if (missing.length) failures.push(`${relative}: missing ${missing.slice(0, 12).join(', ')}${missing.length > 12 ? ', …' : ''}`); if (missing.length) failures.push(`${relative}: missing ${missing.slice(0, 12).join(', ')}${missing.length > 12 ? ', …' : ''}`);
} }
+6 -4
View File
@@ -16,9 +16,11 @@ export function progressStatusRecords() {
const icon = status === 'Completed' ? 'Completed' : status === 'In Progress' ? 'In Progress' : 'Planned'; const icon = status === 'Completed' ? 'Completed' : status === 'In Progress' ? 'In Progress' : 'Planned';
return [tid, t[2], thRange(t[5], t[6]), ids(t[4]), icon, pct, remark]; return [tid, t[2], thRange(t[5], t[6]), ids(t[4]), icon, pct, remark];
}); });
// The reference package records risks in five columns: number, issue,
// detail, owner and status.
const issues = issueIds.map((iid, n) => { const issues = issueIds.map((iid, n) => {
const c = CORRECTIONS.find((x) => x[0] === iid); const c = CORRECTIONS.find((x) => x[0] === iid);
return [n + 1, `${c[0]} (${thShort(c[1])})`, c[3], c[4], c[5], `${c[6]} (${thShort(c[2])})`, P[c[7]].id, 'เสร็จสิ้น']; return [n + 1, `${c[0]} : ${c[4]}`, `${c[5]} จึงดำเนินการ${c[6]} แล้วเสร็จ ${thShort(c[2])}`, P[c[7]].id, 'เสร็จสิ้น'];
}); });
const changes = changeIds.map((cid) => { const changes = changeIds.map((cid) => {
const c = CHANGES.find((x) => x.id === cid); const c = CHANGES.find((x) => x.id === cid);
@@ -39,9 +41,9 @@ export function progressStatusRecords() {
'## สรุปสถานะโครงการ', '## สรุปสถานะโครงการ',
table(['Task ID', 'Task Name', 'Period', 'Responsible', 'Status', 'Progress (%)', 'Remarks'], tasks, ['c', '', 'c', 'c', 'c', 'r', '']), table(['Task ID', 'Task Name', 'Period', 'Responsible', 'Status', 'Progress (%)', 'Remarks'], tasks, ['c', '', 'c', 'c', 'c', 'r', '']),
'## ความเสี่ยง/อุปสรรค', '## ความเสี่ยง/อุปสรรค',
issues.length table(['ลำดับ', 'ประเด็น / ความเสี่ยง', 'รายละเอียด', 'ผู้รับผิดชอบ', 'สถานะ'],
? table(['ลำดับ', 'Issue ID', 'ประเด็น', 'รายละเอียด', 'สาเหตุที่พบ', 'แนวทางการแก้ไข', 'ผู้รับผิดชอบ', 'สถานะ'], issues, ['c', '', '', '', '', '', 'c', 'c']) issues.length ? issues : [['-', 'ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้', '-', '-', '-']],
: table(['ลำดับ', 'Issue ID', 'ประเด็น', 'รายละเอียด', 'สาเหตุที่พบ', 'แนวทางการแก้ไข', 'ผู้รับผิดชอบ', 'สถานะ'], [['-', '-', 'ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้', '-', '-', '-', '-', '-']], ['c', '', '', '', '', '', 'c', 'c']), ['c', '', '', 'c', 'c']),
'## สรุป CR/Change (ถ้ามี)', '## สรุป CR/Change (ถ้ามี)',
changes.length changes.length
? table(['CR ID', 'หัวข้อ', 'สถานะ', 'ผลกระทบ'], changes, ['c', '', 'c', '']) ? table(['CR ID', 'หัวข้อ', 'สถานะ', 'ผลกระทบ'], changes, ['c', '', 'c', ''])
BIN
View File
Binary file not shown.
@@ -19,9 +19,9 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - | | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -21,9 +21,9 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - | | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -19,9 +19,9 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - | | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -19,9 +19,9 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - | | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -19,9 +19,9 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - | | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -19,9 +19,9 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| 1 | ISS-001 (3 มี.ค. 69) | สูง | ผลตรวจความปลอดภัยเบื้องต้นพบจุดที่ต้องแก้ไข | ยังไม่ได้ใช้แนวปฏิบัติ Secure Coding ครบทุกจุด | แก้ไขตามผลตรวจความปลอดภัยทั้งชุด (9 มี.ค. 69) | ThS | เสร็จสิ้น | | 1 | ISS-001 : ผลตรวจความปลอดภัยเบื้องต้นพบจุดที่ต้องแก้ไข | ยังไม่ได้ใช้แนวปฏิบัติ Secure Coding ครบทุกจุด จึงดำเนินการแก้ไขตามผลตรวจความปลอดภัยทั้งชุด แล้วเสร็จ 9 มี.ค. 69 | ThS | เสร็จสิ้น |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -19,9 +19,9 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| 1 | ISS-002 (18 เม.ย. 69) | สูง | คำสั่งบางรายการทำให้ความถูกต้องของข้อมูลเสียหาย | ไม่มีการตรวจสอบความสัมพันธ์ของข้อมูลก่อนทำรายการ | ถอดคำสั่งที่มีปัญหาและเพิ่มการตรวจสอบความถูกต้อง (24 เม.ย. 69) | ThS | เสร็จสิ้น | | 1 | ISS-002 : คำสั่งบางรายการทำให้ความถูกต้องของข้อมูลเสียหาย | ไม่มีการตรวจสอบความสัมพันธ์ของข้อมูลก่อนทำรายการ จึงดำเนินการถอดคำสั่งที่มีปัญหาและเพิ่มการตรวจสอบความถูกต้อง แล้วเสร็จ 24 เม.ย. 69 | ThS | เสร็จสิ้น |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -20,11 +20,11 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| 1 | ISS-003 (30 เม.ย. 69) | สูง | การตรวจสิทธิ์ตามบทบาทยังไม่ครอบคลุมทุกหน้าจอ | พัฒนาสิทธิ์แบบเพิ่มทีละส่วนระหว่างพัฒนา | เพิ่ม Role Guard ให้ครบและปรับปรุงเอกสารประกอบ (6 พ.ค. 69) | ThS | เสร็จสิ้น | | 1 | ISS-003 : การตรวจสิทธิ์ตามบทบาทยังไม่ครอบคลุมทุกหน้าจอ | พัฒนาสิทธิ์แบบเพิ่มทีละส่วนระหว่างพัฒนา จึงดำเนินการเพิ่ม Role Guard ให้ครบและปรับปรุงเอกสารประกอบ แล้วเสร็จ 6 พ.ค. 69 | ThS | เสร็จสิ้น |
| 2 | ISS-004 (1 พ.ค. 69) | สูง | พบช่องโหว่ด้านความปลอดภัยที่ยังไม่ได้ปิด | การตรวจสอบสิทธิ์บางเส้นทางยังไม่สมบูรณ์ | ปิดช่องโหว่ที่พบตามผลการตรวจสอบ (7 พ.ค. 69) | ThS | เสร็จสิ้น | | 2 | ISS-004 : พบช่องโหว่ด้านความปลอดภัยที่ยังไม่ได้ปิด | การตรวจสอบสิทธิ์บางเส้นทางยังไม่สมบูรณ์ จึงดำเนินการปิดช่องโหว่ที่พบตามผลการตรวจสอบ แล้วเสร็จ 7 พ.ค. 69 | ThS | เสร็จสิ้น |
| 3 | ISS-005 (2 พ.ค. 69) | กลาง | ชื่อตัวแปร/ฟังก์ชันไม่สอดคล้องกัน และ Session ทำงานผิดพลาด | พัฒนาเป็นช่วง ๆ ทำให้การตั้งชื่อไม่เป็นมาตรฐานเดียวกัน | ปรับชื่อให้เป็นมาตรฐานเดียวกันและแก้ปัญหา Session (8 พ.ค. 69) | ThS | เสร็จสิ้น | | 3 | ISS-005 : ชื่อตัวแปร/ฟังก์ชันไม่สอดคล้องกัน และ Session ทำงานผิดพลาด | พัฒนาเป็นช่วง ๆ ทำให้การตั้งชื่อไม่เป็นมาตรฐานเดียวกัน จึงดำเนินการปรับชื่อให้เป็นมาตรฐานเดียวกันและแก้ปัญหา Session แล้วเสร็จ 8 พ.ค. 69 | ThS | เสร็จสิ้น |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -20,12 +20,12 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| 1 | ISS-006 (5 พ.ค. 69) | สูง | พบประเด็นความปลอดภัยของเว็บแอปพลิเคชัน | การตรวจสอบข้อมูลนำเข้ายังไม่ครอบคลุม | แก้ไขความปลอดภัยของเว็บแอปพลิเคชันตามที่ตรวจพบ (11 พ.ค. 69) | ThS | เสร็จสิ้น | | 1 | ISS-006 : พบประเด็นความปลอดภัยของเว็บแอปพลิเคชัน | การตรวจสอบข้อมูลนำเข้ายังไม่ครอบคลุม จึงดำเนินการแก้ไขความปลอดภัยของเว็บแอปพลิเคชันตามที่ตรวจพบ แล้วเสร็จ 11 พ.ค. 69 | ThS | เสร็จสิ้น |
| 2 | ISS-007 (6 พ.ค. 69) | กลาง | ขั้นตอน Onboarding ทำงานไม่ครบตามที่ออกแบบ | เงื่อนไขการรับคำเชิญไม่ครอบคลุมทุกกรณี | แก้ไขขั้นตอน Onboarding ให้ทำงานถูกต้อง (12 พ.ค. 69) | ThS | เสร็จสิ้น | | 2 | ISS-007 : ขั้นตอน Onboarding ทำงานไม่ครบตามที่ออกแบบ | เงื่อนไขการรับคำเชิญไม่ครอบคลุมทุกกรณี จึงดำเนินการแก้ไขขั้นตอน Onboarding ให้ทำงานถูกต้อง แล้วเสร็จ 12 พ.ค. 69 | ThS | เสร็จสิ้น |
| 3 | ISS-008 (7 พ.ค. 69) | กลาง | การลงทะเบียนผู้ใช้ใหม่ล้มเหลวในบางกรณี | การตรวจสอบข้อมูลลงทะเบียนไม่ครบถ้วน | แก้ไขขั้นตอนการลงทะเบียน (13 พ.ค. 69) | ThS | เสร็จสิ้น | | 3 | ISS-008 : การลงทะเบียนผู้ใช้ใหม่ล้มเหลวในบางกรณี | การตรวจสอบข้อมูลลงทะเบียนไม่ครบถ้วน จึงดำเนินการแก้ไขขั้นตอนการลงทะเบียน แล้วเสร็จ 13 พ.ค. 69 | ThS | เสร็จสิ้น |
| 4 | ISS-009 (7 พ.ค. 69) | สูง | การตรวจสอบสิทธิ์ระดับฐานข้อมูลทำงานไม่ถูกต้อง | การกำหนดสิทธิ์เชื่อมต่อฐานข้อมูลไม่สอดคล้องกับบทบาท | แก้ไขการตรวจสอบสิทธิ์ db_auth (13 พ.ค. 69) | ThS | เสร็จสิ้น | | 4 | ISS-009 : การตรวจสอบสิทธิ์ระดับฐานข้อมูลทำงานไม่ถูกต้อง | การกำหนดสิทธิ์เชื่อมต่อฐานข้อมูลไม่สอดคล้องกับบทบาท จึงดำเนินการแก้ไขการตรวจสอบสิทธิ์ db_auth แล้วเสร็จ 13 พ.ค. 69 | ThS | เสร็จสิ้น |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -20,14 +20,14 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| 1 | ISS-010 (14 พ.ค. 69) | กลาง | รูปแบบการเขียนโค้ดในแต่ละโมดูลไม่สอดคล้องกัน | พัฒนาหลายโมดูลคู่ขนานกัน | ทบทวนและปรับรูปแบบการเขียนโค้ดให้สอดคล้องกัน (20 พ.ค. 69) | ThS | เสร็จสิ้น | | 1 | ISS-010 : รูปแบบการเขียนโค้ดในแต่ละโมดูลไม่สอดคล้องกัน | พัฒนาหลายโมดูลคู่ขนานกัน จึงดำเนินการทบทวนและปรับรูปแบบการเขียนโค้ดให้สอดคล้องกัน แล้วเสร็จ 20 พ.ค. 69 | ThS | เสร็จสิ้น |
| 2 | ISS-011 (15 พ.ค. 69) | สูง | การเชิญผู้ใช้ สิทธิ์แอปพลิเคชัน และโควตารายการยังไม่รัดกุม | ควบคุมสิทธิ์และโควตาถูกเพิ่มภายหลัง | แก้ไขการเชิญผู้ใช้ เพิ่มการควบคุมสิทธิ์และโควตารายการ (21 พ.ค. 69) | ThS | เสร็จสิ้น | | 2 | ISS-011 : การเชิญผู้ใช้ สิทธิ์แอปพลิเคชัน และโควตารายการยังไม่รัดกุม | ควบคุมสิทธิ์และโควตาถูกเพิ่มภายหลัง จึงดำเนินการแก้ไขการเชิญผู้ใช้ เพิ่มการควบคุมสิทธิ์และโควตารายการ แล้วเสร็จ 21 พ.ค. 69 | ThS | เสร็จสิ้น |
| 3 | ISS-012 (15 พ.ค. 69) | สูง | StockManager แปลงค่า Lot/Serial ผิดพลาด ทำให้สอบกลับไม่ถูกต้อง | การแปลงชนิดข้อมูลไม่รองรับค่าที่เป็นข้อความ | แก้ไขการแปลงค่า Lot/Serial และเพิ่มชุดทดสอบวงจรเอกสาร (21 พ.ค. 69) | ThS | เสร็จสิ้น | | 3 | ISS-012 : StockManager แปลงค่า Lot/Serial ผิดพลาด ทำให้สอบกลับไม่ถูกต้อง | การแปลงชนิดข้อมูลไม่รองรับค่าที่เป็นข้อความ จึงดำเนินการแก้ไขการแปลงค่า Lot/Serial และเพิ่มชุดทดสอบวงจรเอกสาร แล้วเสร็จ 21 พ.ค. 69 | ThS | เสร็จสิ้น |
| 4 | ISS-013 (15 พ.ค. 69) | กลาง | ยังพบข้อบกพร่องของขั้นตอน Onboarding เพิ่มเติม | เส้นทางการรับคำเชิญมีหลายเงื่อนไข | แก้ไขข้อบกพร่องของ Onboarding ที่พบเพิ่ม (21 พ.ค. 69) | ThS | เสร็จสิ้น | | 4 | ISS-013 : ยังพบข้อบกพร่องของขั้นตอน Onboarding เพิ่มเติม | เส้นทางการรับคำเชิญมีหลายเงื่อนไข จึงดำเนินการแก้ไขข้อบกพร่องของ Onboarding ที่พบเพิ่ม แล้วเสร็จ 21 พ.ค. 69 | ThS | เสร็จสิ้น |
| 5 | ISS-014 (17 พ.ค. 69) | กลาง | เส้นทางไฟล์ (File Path) ไม่ถูกต้องในบางสภาพแวดล้อม | สมมติฐานเส้นทางติดตั้งไม่ตรงกัน | แก้ไขเส้นทางไฟล์ให้ถูกต้องทั้งระบบ (23 พ.ค. 69) | ThS | เสร็จสิ้น | | 5 | ISS-014 : เส้นทางไฟล์ (File Path) ไม่ถูกต้องในบางสภาพแวดล้อม | สมมติฐานเส้นทางติดตั้งไม่ตรงกัน จึงดำเนินการแก้ไขเส้นทางไฟล์ให้ถูกต้องทั้งระบบ แล้วเสร็จ 23 พ.ค. 69 | ThS | เสร็จสิ้น |
| 6 | ISS-015 (17 พ.ค. 69) | สูง | ผลตรวจโค้ดพบปัญหา require_once, ขั้นตอนจ่ายออก และ Role Guard | การควบคุมข้ามโมดูลไม่สอดคล้องกัน | แก้ไข require_once, ขั้นตอนจ่ายออก และเพิ่ม Role Guard (23 พ.ค. 69) | ThS | เสร็จสิ้น | | 6 | ISS-015 : ผลตรวจโค้ดพบปัญหา require_once, ขั้นตอนจ่ายออก และ Role Guard | การควบคุมข้ามโมดูลไม่สอดคล้องกัน จึงดำเนินการแก้ไข require_once, ขั้นตอนจ่ายออก และเพิ่ม Role Guard แล้วเสร็จ 23 พ.ค. 69 | ThS | เสร็จสิ้น |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -20,20 +20,20 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| 1 | ISS-016 (18 พ.ค. 69) | สูง | อนุญาตให้เข้าสู่ระบบพร้อมกันหลาย Session | ยังไม่มีการบังคับ Session เดียวต่อบัญชี | บล็อกการเข้าสู่ระบบซ้ำซ้อนและปรับนโยบายยืนยันตัวตนตามบทบาท (24 พ.ค. 69) | ThS | เสร็จสิ้น | | 1 | ISS-016 : อนุญาตให้เข้าสู่ระบบพร้อมกันหลาย Session | ยังไม่มีการบังคับ Session เดียวต่อบัญชี จึงดำเนินการบล็อกการเข้าสู่ระบบซ้ำซ้อนและปรับนโยบายยืนยันตัวตนตามบทบาท แล้วเสร็จ 24 พ.ค. 69 | ThS | เสร็จสิ้น |
| 2 | ISS-017 (19 พ.ค. 69) | สูง | ยังพบช่องว่างของการควบคุมการเข้าสู่ระบบ | บางเส้นทางเข้าสู่ระบบไม่ผ่านการตรวจสอบเดียวกัน | ปิดช่องว่างการเข้าสู่ระบบที่พบ (25 พ.ค. 69) | ThS | เสร็จสิ้น | | 2 | ISS-017 : ยังพบช่องว่างของการควบคุมการเข้าสู่ระบบ | บางเส้นทางเข้าสู่ระบบไม่ผ่านการตรวจสอบเดียวกัน จึงดำเนินการปิดช่องว่างการเข้าสู่ระบบที่พบ แล้วเสร็จ 25 พ.ค. 69 | ThS | เสร็จสิ้น |
| 3 | ISS-018 (20 พ.ค. 69) | สูง | ขั้นตอน Onboarding ผู้ใช้ที่ถูกเชิญต้องเพิ่มความปลอดภัย | มีหลายเส้นทางที่ต้องบังคับใช้การควบคุมเดียวกัน | ดำเนินการ Security Hardening รายการ C1–N7 (26 พ.ค. 69) | ThS | เสร็จสิ้น | | 3 | ISS-018 : ขั้นตอน Onboarding ผู้ใช้ที่ถูกเชิญต้องเพิ่มความปลอดภัย | มีหลายเส้นทางที่ต้องบังคับใช้การควบคุมเดียวกัน จึงดำเนินการดำเนินการ Security Hardening รายการ C1–N7 แล้วเสร็จ 26 พ.ค. 69 | ThS | เสร็จสิ้น |
| 4 | ISS-019 (20 พ.ค. 69) | สูง | วงจรชีวิตเอกสารในระบบไม่ตรงกับข้อกำหนด | ข้อกำหนดและการพัฒนาเปลี่ยนแปลงไม่พร้อมกัน | ปรับข้อกำหนดและแก้โค้ดรายการ C2/M9 (26 พ.ค. 69) | ThS | เสร็จสิ้น | | 4 | ISS-019 : วงจรชีวิตเอกสารในระบบไม่ตรงกับข้อกำหนด | ข้อกำหนดและการพัฒนาเปลี่ยนแปลงไม่พร้อมกัน จึงดำเนินการปรับข้อกำหนดและแก้โค้ดรายการ C2/M9 แล้วเสร็จ 26 พ.ค. 69 | ThS | เสร็จสิ้น |
| 5 | ISS-020 (20 พ.ค. 69) | สูง | ข้อมูลหลักมีช่องว่างระหว่างข้อกำหนดและการพัฒนา | ข้อกำหนดข้อมูลหลักถูกปรับระหว่างพัฒนา | ปรับข้อกำหนดและแก้โค้ดรายการ C1/C2/M3–M6 (26 พ.ค. 69) | ThS | เสร็จสิ้น | | 5 | ISS-020 : ข้อมูลหลักมีช่องว่างระหว่างข้อกำหนดและการพัฒนา | ข้อกำหนดข้อมูลหลักถูกปรับระหว่างพัฒนา จึงดำเนินการปรับข้อกำหนดและแก้โค้ดรายการ C1/C2/M3–M6 แล้วเสร็จ 26 พ.ค. 69 | ThS | เสร็จสิ้น |
| 6 | ISS-021 (21 พ.ค. 69) | กลาง | งานตามกำหนดเวลาของ Node.js ทำงานผิดพลาด | การตั้งค่า Cron ของบริการ Node.js ไม่ถูกต้อง | แก้ไขการทำงานของ Cron บน Node.js (27 พ.ค. 69) | ThS | เสร็จสิ้น | | 6 | ISS-021 : งานตามกำหนดเวลาของ Node.js ทำงานผิดพลาด | การตั้งค่า Cron ของบริการ Node.js ไม่ถูกต้อง จึงดำเนินการแก้ไขการทำงานของ Cron บน Node.js แล้วเสร็จ 27 พ.ค. 69 | ThS | เสร็จสิ้น |
| 7 | ISS-022 (21 พ.ค. 69) | กลาง | เอกสารประกอบภายในโครงการยังไม่ครบถ้วน | เอกสารถูกปรับตามการพัฒนาอย่างต่อเนื่อง | ทบทวนเอกสารทั้งหมดและแก้ไขส่วนที่ขาด (27 พ.ค. 69) | ThS | เสร็จสิ้น | | 7 | ISS-022 : เอกสารประกอบภายในโครงการยังไม่ครบถ้วน | เอกสารถูกปรับตามการพัฒนาอย่างต่อเนื่อง จึงดำเนินการทบทวนเอกสารทั้งหมดและแก้ไขส่วนที่ขาด แล้วเสร็จ 27 พ.ค. 69 | ThS | เสร็จสิ้น |
| 8 | ISS-023 (22 พ.ค. 69) | กลาง | การเปลี่ยนคำว่า Rack เป็น Bin ไม่ครบทุกจุด และ ReportManager ผิดพลาด | เปลี่ยนชื่อไม่ครบทุกไฟล์และป้ายกำกับหน้าจอ | เปลี่ยนชื่อไฟล์ ป้ายกำกับ และแก้คุณสมบัติของ ReportManager (28 พ.ค. 69) | ThS | เสร็จสิ้น | | 8 | ISS-023 : การเปลี่ยนคำว่า Rack เป็น Bin ไม่ครบทุกจุด และ ReportManager ผิดพลาด | เปลี่ยนชื่อไม่ครบทุกไฟล์และป้ายกำกับหน้าจอ จึงดำเนินการเปลี่ยนชื่อไฟล์ ป้ายกำกับ และแก้คุณสมบัติของ ReportManager แล้วเสร็จ 28 พ.ค. 69 | ThS | เสร็จสิ้น |
| 9 | ISS-024 (22 พ.ค. 69) | สูง | การเข้าถึงตารางสต๊อกยังไม่จำกัดตามคลังของบริษัท | ขอบเขตสิทธิ์คลังสินค้ายังไม่ครบทุกคำสั่ง | จำกัดการเข้าถึงตารางสต๊อกตามคลังที่บริษัทได้รับสิทธิ์ (28 พ.ค. 69) | ThS | เสร็จสิ้น | | 9 | ISS-024 : การเข้าถึงตารางสต๊อกยังไม่จำกัดตามคลังของบริษัท | ขอบเขตสิทธิ์คลังสินค้ายังไม่ครบทุกคำสั่ง จึงดำเนินการจำกัดการเข้าถึงตารางสต๊อกตามคลังที่บริษัทได้รับสิทธิ์ แล้วเสร็จ 28 พ.ค. 69 | ThS | เสร็จสิ้น |
| 10 | ISS-025 (22 พ.ค. 69) | ต่ำ | แถบเลื่อนแนวนอนเกินขอบหน้าจอจากระยะขอบ Sidebar | ค่าระยะขอบเกินความกว้างของ Viewport | แก้ไขการจัดวาง Sidebar ให้อยู่ในขอบหน้าจอ (28 พ.ค. 69) | ThS | เสร็จสิ้น | | 10 | ISS-025 : แถบเลื่อนแนวนอนเกินขอบหน้าจอจากระยะขอบ Sidebar | ค่าระยะขอบเกินความกว้างของ Viewport จึงดำเนินการแก้ไขการจัดวาง Sidebar ให้อยู่ในขอบหน้าจอ แล้วเสร็จ 28 พ.ค. 69 | ThS | เสร็จสิ้น |
| 11 | ISS-026 (22 พ.ค. 69) | สูง | ระบบยังรับการเข้าสู่ระบบใหม่ขณะบัญชีมี Session ทำงานอยู่ | การบังคับ Session เดียวยังไม่ครอบคลุมทุกกรณี | ปฏิเสธการเข้าสู่ระบบใหม่เมื่อบัญชีมี Session ทำงานอยู่ (28 พ.ค. 69) | ThS | เสร็จสิ้น | | 11 | ISS-026 : ระบบยังรับการเข้าสู่ระบบใหม่ขณะบัญชีมี Session ทำงานอยู่ | การบังคับ Session เดียวยังไม่ครอบคลุมทุกกรณี จึงดำเนินการปฏิเสธการเข้าสู่ระบบใหม่เมื่อบัญชีมี Session ทำงานอยู่ แล้วเสร็จ 28 พ.ค. 69 | ThS | เสร็จสิ้น |
| 12 | ISS-027 (23 พ.ค. 69) | ต่ำ | เมธอดของคลาสมีการทำงานซ้ำซ้อน | พัฒนาเพิ่มทีละส่วนทำให้เกิดความซ้ำซ้อน | ลดความซ้ำซ้อนของเมธอดในคลาส (29 พ.ค. 69) | ThS | เสร็จสิ้น | | 12 | ISS-027 : เมธอดของคลาสมีการทำงานซ้ำซ้อน | พัฒนาเพิ่มทีละส่วนทำให้เกิดความซ้ำซ้อน จึงดำเนินการลดความซ้ำซ้อนของเมธอดในคลาส แล้วเสร็จ 29 พ.ค. 69 | ThS | เสร็จสิ้น |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -20,9 +20,9 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| 1 | ISS-028 (28 ก.ค. 69) | สูง | การเข้าสู่ระบบและค่าตั้งค่าสภาพแวดล้อมผิดพลาดหลัง Baseline | ค่าตั้งค่าของสภาพแวดล้อมใหม่ไม่ตรงกับที่ระบบคาดหวัง | แก้ไขการเข้าสู่ระบบและค่าตั้งค่าสภาพแวดล้อม (3 ส.ค. 69) | ThS | เสร็จสิ้น | | 1 | ISS-028 : การเข้าสู่ระบบและค่าตั้งค่าสภาพแวดล้อมผิดพลาดหลัง Baseline | ค่าตั้งค่าของสภาพแวดล้อมใหม่ไม่ตรงกับที่ระบบคาดหวัง จึงดำเนินการแก้ไขการเข้าสู่ระบบและค่าตั้งค่าสภาพแวดล้อม แล้วเสร็จ 3 ส.ค. 69 | ThS | เสร็จสิ้น |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -20,9 +20,9 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - | | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -22,9 +22,9 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - | | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)
@@ -21,9 +21,9 @@
## ความเสี่ยง/อุปสรรค ## ความเสี่ยง/อุปสรรค
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ | | ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
| :---: | --- | --- | --- | --- | --- | :---: | :---: | | :---: | --- | --- | :---: | :---: |
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - | | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
## สรุป CR/Change (ถ้ามี) ## สรุป CR/Change (ถ้ามี)