docs(sdlc): match reference PDF layout and company CI
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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 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 Fax. (+66) 2687 0255</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="document-header__title">{{documentTitle}}</div>
|
</div>
|
||||||
</header>
|
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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 ? ', …' : ''}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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', ''])
|
||||||
|
|||||||
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
+3
-3
@@ -19,9 +19,9 @@
|
|||||||
|
|
||||||
## ความเสี่ยง/อุปสรรค
|
## ความเสี่ยง/อุปสรรค
|
||||||
|
|
||||||
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ |
|
| ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
|
||||||
| :---: | --- | --- | --- | --- | --- | :---: | :---: |
|
| :---: | --- | --- | :---: | :---: |
|
||||||
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - |
|
| - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
|
||||||
|
|
||||||
## สรุป CR/Change (ถ้ามี)
|
## สรุป CR/Change (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -21,9 +21,9 @@
|
|||||||
|
|
||||||
## ความเสี่ยง/อุปสรรค
|
## ความเสี่ยง/อุปสรรค
|
||||||
|
|
||||||
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ |
|
| ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
|
||||||
| :---: | --- | --- | --- | --- | --- | :---: | :---: |
|
| :---: | --- | --- | :---: | :---: |
|
||||||
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - |
|
| - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
|
||||||
|
|
||||||
## สรุป CR/Change (ถ้ามี)
|
## สรุป CR/Change (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -19,9 +19,9 @@
|
|||||||
|
|
||||||
## ความเสี่ยง/อุปสรรค
|
## ความเสี่ยง/อุปสรรค
|
||||||
|
|
||||||
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ |
|
| ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
|
||||||
| :---: | --- | --- | --- | --- | --- | :---: | :---: |
|
| :---: | --- | --- | :---: | :---: |
|
||||||
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - |
|
| - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
|
||||||
|
|
||||||
## สรุป CR/Change (ถ้ามี)
|
## สรุป CR/Change (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -19,9 +19,9 @@
|
|||||||
|
|
||||||
## ความเสี่ยง/อุปสรรค
|
## ความเสี่ยง/อุปสรรค
|
||||||
|
|
||||||
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ |
|
| ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
|
||||||
| :---: | --- | --- | --- | --- | --- | :---: | :---: |
|
| :---: | --- | --- | :---: | :---: |
|
||||||
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - |
|
| - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
|
||||||
|
|
||||||
## สรุป CR/Change (ถ้ามี)
|
## สรุป CR/Change (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -19,9 +19,9 @@
|
|||||||
|
|
||||||
## ความเสี่ยง/อุปสรรค
|
## ความเสี่ยง/อุปสรรค
|
||||||
|
|
||||||
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ |
|
| ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
|
||||||
| :---: | --- | --- | --- | --- | --- | :---: | :---: |
|
| :---: | --- | --- | :---: | :---: |
|
||||||
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - |
|
| - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
|
||||||
|
|
||||||
## สรุป CR/Change (ถ้ามี)
|
## สรุป CR/Change (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -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 (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -19,9 +19,9 @@
|
|||||||
|
|
||||||
## ความเสี่ยง/อุปสรรค
|
## ความเสี่ยง/อุปสรรค
|
||||||
|
|
||||||
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ |
|
| ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
|
||||||
| :---: | --- | --- | --- | --- | --- | :---: | :---: |
|
| :---: | --- | --- | :---: | :---: |
|
||||||
| 1 | ISS-002 (18 เม.ย. 69) | สูง | คำสั่งบางรายการทำให้ความถูกต้องของข้อมูลเสียหาย | ไม่มีการตรวจสอบความสัมพันธ์ของข้อมูลก่อนทำรายการ | ถอดคำสั่งที่มีปัญหาและเพิ่มการตรวจสอบความถูกต้อง (24 เม.ย. 69) | ThS | เสร็จสิ้น |
|
| 1 | ISS-002 : คำสั่งบางรายการทำให้ความถูกต้องของข้อมูลเสียหาย | ไม่มีการตรวจสอบความสัมพันธ์ของข้อมูลก่อนทำรายการ จึงดำเนินการถอดคำสั่งที่มีปัญหาและเพิ่มการตรวจสอบความถูกต้อง แล้วเสร็จ 24 เม.ย. 69 | ThS | เสร็จสิ้น |
|
||||||
|
|
||||||
## สรุป CR/Change (ถ้ามี)
|
## สรุป CR/Change (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -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 (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -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 (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+8
-8
@@ -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 (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+14
-14
@@ -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 (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -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 (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -20,9 +20,9 @@
|
|||||||
|
|
||||||
## ความเสี่ยง/อุปสรรค
|
## ความเสี่ยง/อุปสรรค
|
||||||
|
|
||||||
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ |
|
| ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
|
||||||
| :---: | --- | --- | --- | --- | --- | :---: | :---: |
|
| :---: | --- | --- | :---: | :---: |
|
||||||
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - |
|
| - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
|
||||||
|
|
||||||
## สรุป CR/Change (ถ้ามี)
|
## สรุป CR/Change (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -22,9 +22,9 @@
|
|||||||
|
|
||||||
## ความเสี่ยง/อุปสรรค
|
## ความเสี่ยง/อุปสรรค
|
||||||
|
|
||||||
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ |
|
| ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
|
||||||
| :---: | --- | --- | --- | --- | --- | :---: | :---: |
|
| :---: | --- | --- | :---: | :---: |
|
||||||
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - |
|
| - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
|
||||||
|
|
||||||
## สรุป CR/Change (ถ้ามี)
|
## สรุป CR/Change (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -21,9 +21,9 @@
|
|||||||
|
|
||||||
## ความเสี่ยง/อุปสรรค
|
## ความเสี่ยง/อุปสรรค
|
||||||
|
|
||||||
| ลำดับ | Issue ID | ประเด็น | รายละเอียด | สาเหตุที่พบ | แนวทางการแก้ไข | ผู้รับผิดชอบ | สถานะ |
|
| ลำดับ | ประเด็น / ความเสี่ยง | รายละเอียด | ผู้รับผิดชอบ | สถานะ |
|
||||||
| :---: | --- | --- | --- | --- | --- | :---: | :---: |
|
| :---: | --- | --- | :---: | :---: |
|
||||||
| - | - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - | - | - |
|
| - | ไม่พบประเด็นความเสี่ยงหรืออุปสรรคในงวดนี้ | - | - | - |
|
||||||
|
|
||||||
## สรุป CR/Change (ถ้ามี)
|
## สรุป CR/Change (ถ้ามี)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user