From a62bbd6ece1dbcd4f24ac81a2e8ce8e064617104 Mon Sep 17 00:00:00 2001 From: sipp11 Date: Fri, 12 Dec 2014 04:57:41 +0700 Subject: [PATCH] Add posts from wiki --- _posts/2013-10-18-milestone.md | 8 + _posts/2013-10-29-reportlab-101.md | 182 ++++++++ _posts/2013-11-12-psis-record.md | 634 +++++++++++++++++++++++++++ _posts/2013-11-13-app-setup.md | 209 +++++++++ _posts/2013-12-19-pdf-styling.md | 174 ++++++++ _posts/2013-12-23-auto-people-id.md | 19 + _posts/2014-11-04-errorcode.md | 24 + _posts/2014-11-10-admin-command.md | 70 +++ _posts/2014-11-10-admin-todo-list.md | 113 +++++ handbook.md | 27 ++ index.html | 2 + 11 files changed, 1462 insertions(+) create mode 100644 _posts/2013-10-18-milestone.md create mode 100644 _posts/2013-10-29-reportlab-101.md create mode 100644 _posts/2013-11-12-psis-record.md create mode 100644 _posts/2013-11-13-app-setup.md create mode 100644 _posts/2013-12-19-pdf-styling.md create mode 100644 _posts/2013-12-23-auto-people-id.md create mode 100644 _posts/2014-11-04-errorcode.md create mode 100644 _posts/2014-11-10-admin-command.md create mode 100644 _posts/2014-11-10-admin-todo-list.md create mode 100644 handbook.md diff --git a/_posts/2013-10-18-milestone.md b/_posts/2013-10-18-milestone.md new file mode 100644 index 0000000..768c50a --- /dev/null +++ b/_posts/2013-10-18-milestone.md @@ -0,0 +1,8 @@ +--- +layout: post +type: handbook +title: "PSISv2 Milestone" +date: 2013-10-18 +tags: contract +--- +

4.1

# รายละเอียด Phase Status Milestone
4.1ตรวจสอบและเชื่อมโยงระบบสืบค้นข้อมูลรายบุคคลของสำนักบริหารการทะเบียน กระทรวงมหาดไทย
1. ปรับปรุงระบบให้สามารถ export/import ข้อมูลครู/นักเรียน เพื่อใช้ในการตรวจสอบกับระบบของสำนักบริหารการทะเบียน กระทรวงมหาดไทย ตามที่สช.กำหนด กรณีที่มีการตรวจสอบแล้ว วันเดือนปีเกิดจะแก้ไขไม่ได้ feature-4.1 Done 0.7
2. พัฒนาระบบประมวลผลรายงานข้อมูลครู/นักเรียนที่ไม่ตรงกับข้อมูลสำนักบริหารการทะเบียนตามแบบรายงานที่ สช. กำหนด feature-4.1 Done 0.7.3
3. การ export/import และประมวลผลรายงานสามารถเลือกได้ไม่น้อยกว่า 3 ระดับ feature-4.1 Done 0.7

4.2

# รายละเอียด Phase Status Milestone
4.2ปรับปรุงใช้ให้ได้อย่างเหมาะสมกับความต้องการและมีประสิทธิภาพ
4.2.1ปรับปรุงโครงสร้างฐานข้อมูล
1. เพิ่ม Table Lookup __using admin__ - Done 0.6
2. เพิ่ม field ของโรงเรียน
* field เพื่อจำแนกลักษณะของภาษาที่สอน หลักสูตรที่เปิดทำการสอน - Done 0.5.8
* field เพื่อจำแนกประเภทและลักษณะของโรงเรียนที่ได้รับอุดหนุน - Done 0.5
3. ข้อมูลครู
* field passport - Done 0.5
* field เงินเพิ่มการครองชีพชั่วคราว - Done 0.5.2
4. ข้อมูลนักเรียน -- เพิ่มสถานศึกษาเดิม - Done 0.5.2
5. ห้องเรียน -- เพิ่มจำแนกสาขาวิชา / สาขางานตามที่ได้รับอนุญาต - Done 0.5.8
6. รายงาน
* เปลี่ยน รายงานล่าสุด - ข้อมูล ณ วันสิ้นเดือน (วันที่ DD เดือน MMM ปี YYYY) UI Done 0.5.2
* เปลี่ยน รายงานพรีวิว - รายงาน ณ วันที่ DD เดือน MMM ปี YYYY UI Done 0.5.2
4.2.2ปรับปรุงส่วนโรงเรียน
1. export บุคลากรในรูปแบบ text หรือ excel - Done 0.6.6
2. ส่วนบุคลากร
  • กรณีครูอยู่ในโรงเรียนมากกว่า 1 โรงเรียนให้มีสัญลักษณ์
UI Done Doctor
  • เตือนในกรณีไม่มีครูประจำชั้น
UI Done Doctor
  • เพิ่ม บุคคลที่ได้รับการยกเว้น ไม่ต้องมีใบประกอบวิชาชีพครูในประเภทใบประกอบวิชาชีพ
    • ได้แก่ พระภิกษุ ครูสอนศาสนา ผู้สอนตามโครงการแลกเปลี่ยนระหว่างประเทศ ข้าราชการตำรวจตระเวนชายแดน และข้าราชการสังกัดกระทรวงกลาโหม
    • โดยเมื่อเลือก บุคคลที่ได้รับยกเว้น ช่องเลขที่ใบประกอบวิชาชีพก็จะเป็นชื่ออาชีพตามข้างต้น
js Done 0.6.1
  • เตือนรายการข้อมูลบุคลากรทุกรายการ ถ้าไม่ครบ
UI - -
3. ห้องเรียน
* กรณีห้องเรียนเกินตามที่ได้อนุญาต ทำสัญลักษณ์สำหรับห้องที่เพิ่มหลังสุดว่าไม่ได้รับอุดหนุน UI Done Doctor
* กรณีห้องเรียนมีนักเรียนเกินความจุ ก็ให้มีสัญลักษณ์ UI Done Doctor
* กรณีห้องเรียนมีความจุเกินแล้วได้รับอนุญาตจากเจ้าหน้าที่แล้ว ก็ไม่ต้อง reset ใหม่ทุกปี - Done 0.5.1
4. รายงาน
* ทุกรายงานของโรงเรียน กรณีผู้ลงนามเป็นผู้ทำการแทน หรือ ลงนามแทน ให้พิมว่า ทำการแทนหรือลงนามแทนผู้รับใบอนุญาต

>> จะเอาไปแทนตำแหน่งใคร? เพราะในรายงานเดิมก็เห็นมีตามตำแหน่ง??
- Done <0.8.1
* อน.5 - แสดงสาเหตุการเพิ่ม กรณีนักเรียนกลับเข้ามาเรียนจากสาเหตุ พักการเรียน, ซ้ำรายวิชา, นักเรียนไปเรียนโครงการ และซ้ำซ้อน - Done 0.5.6
* อน.6 - แสดงสาเหตุการลด กรณีนักเรียนหายไปจากสาเหตุ พักการเรียน, ซ้ำรายวิชา, นักเรียนไปเรียนโครงการ และซ้ำซ้อน - Done 0.5.6
* อน.1-6 แสดงยศเป็นอักษรย่อไว้หน้าชื่อที่ลงนามด้วยในกรณีเป็นข้าราชการทหาร/ตำรวจ
  • ใส่มันทุกคนเลย
- Done 0.8.5
5. Search
  • ต้องค้นรายงานต่างๆ เก่าได้ไม่น้อยความ 6 เดือน
SEARCH Done 0.8.5

4.3

# รายละเอียด Phase Status Milestone
4.3ระบบจัดการตรวจสอบและดำเนินการในส่วนที่เกี่ยวข้องกับการเบิกจ่าย สำหรับเขต & สช.
4.3.1ระบบ ณ วันที่ 10 มิ.ย.
1. ประมวลผล, แสดงรายงานจำนวนนักเรียน และจำนวนเงินจำแนกตามระดับการศึกษาโดยใช้ข้อมูล ณ วันเดือนปี ที่โรงเรียนพิมพ์คำร้องขอรับ อน.1 ในกรณีที่โรงเรียนพิมรายงานโดยใช้ข้อมูลปัจจุบันให้แสดงข้อความ ข้อมูล ณ วันที่ xx เดือน xxxxxx ปี xxx ในรายงาน
  • สำหรับการตรวจสอบ หากพบว่าข้อมูลไม่ถูกต้อง เจ้าหน้าที่สามารถดำเนินการแก้ไขจำนวนให้ถูกต้องได้ และระบบต้องประมวลผล, แสดงรายงานเดียวกันของปีการศึกษาที่ผ่านมา 1 ปีการศึกษา พร้อมทั้งแสดงผลต่างเพิ่ม/ลด โดยใช้ (-) แสดงนักเรียนลด
    • confirmation indicator**
- Done 0.8.5
2. ประมวลผล และแสดงรายงานจำนวนนักเรียน/ครู โดยใช้ข้อมูลที่โรงเรียนพิมรายงาน อน.2 ในกรณีใช้ข้อมูลปัจจุบันให้เขียน ข้อมูล ณ วันที่ xx เดือน xxxxxx ปี xxx และจะต้องมีระบบตรวจสอบ
  • จะต้องมีปุ่มโรงเรียนยืนยันว่า สถานะตรวจสอบแล้ว ให้ทางสช. ทราบว่าโรงเรียนทำข้อมูลครบแล้วเพื่อยืนยันว่าเรียบร้อย
    • confirmation indicator**
- Done 0.8.5
3. ประมวลผล และแสดงรายงาน อน. 3
  • check at office --> school
- Done <0.7.7
4. ประมวลผลสรุปจำนวนโรงเรียนและนักเรียนที่มีสิทธิ์รับอุดหนุน, แสดงรายงานตามแบบที่ สช. กำหนด
  • แบบของงบประมาณ
  • แบบสรุปจำนวนนักเรียนของโรงเรียนเอกชน ประเภทสามัญศึกษา ที่มีสิทธิ์รับเงินอุดหนุนรายบุคคล
    • [psis-2/lists/อุปกรณ์การเรียน/แจ้งจัดสรรฯภาคเรียนที่๑.pdf]
- Done 0.7.7
  • แบบสรุปจำนวนนักเรียนของโรงเรียนเอกชน ประเภทอาชีวศึกษา ที่มีสิทธิ์รับเงินอุดหนุนรายบุคคล
    • [psis-2/2012-11-19 data/จำนวนนักเรียนอาชีว.xls]
- Done 0.7.7
  • แบบสรุปจำนวนนักเรียนพิการในโรงเรียนเอกชน ประเภทสามัญศึกษา
    • [psis-2/2012-11-19 data/พิการสามัญ.xls]
- Done 0.7.7
  • แบบสรุปจำนวนนักเรียนพิการในโรงเรียนเอกชน ประเภทอาชีวศึกษา
    • [psis-2/2012-11-19 data/พิการอาชีว.xls]
- Done 0.7.7
  • แบบสรุปจำนวนนักเรียนของโรงเรียนการกุศล และโรงเรียนสอนศาสนาอิสลามควบคู่กับวิชาสามัญที่มีมูลนิธิ/มัสยิดเป็นผู้รับใบอนุญาต
    • [psis-2/2012-11-19 data/การศึกษาสงเคราะห์.xls]
- Done 0.7.7
4.3.2ระบบ ณ วันสิ้นเดือน
1. ประมวลผล, แสดงรายงาน อน.4 โดยใช้ข้อมูล ณ วันที่พิมพ์รายงาน กรณีใช้ข้อมูลวันปัจจุบัน ให้แสดงข้อความ ข้อมูล ณ วันที่ xx เดือน xxxxxx ปี xxx PDF - -
2. ประมวลผล, แสดงรายงาน อน.5 - Done 0.5
3. ประมวลผล, แสดงรายงาน อน.6 - Done 0.5
4. ประมวลผล, แสดงรายงานบัญชีการจ่ายเงินเดือนครู - Done 0.5
5. ประมวลผล, แสดงรายงานหลักฐานการจ่ายเงินเดือนครูโดยผ่านระบบธนาคาร - Done 0.5
6. ประมวลผล, แสดงรายงานสรุปยอดจำนวนโรงเรียนและจำนวนเงินอุดหนุนรายบุคคลตามแบบ สช. กำหนด ตามข้อมูล อน. 4 ที่เจ้าหน้าที่ตรวจสอบแล้ว - Done 0.7.8
7. ประมวลผล, แสดงรายงานชื่อโรงเรียนที่ไม่ยื่นใบสำคัญรับเงินตามกำหนด เพื่อใช้ในการติดตามและให้จัดเก็บข้อมูลนักเรียน ครู ณ วันสิ้นเดือน
  • คือโรงเรียนที่ไม่สามารถออกรายงาน อน. 4 จากข้อมูลสิ้นเดือนได้
- Done 0.7.8
8. โรงเรียนที่เบิกอุดหนุนล่าช้าเนื่องจากไม่ยื่น อน.4 หรือยื่นไม่ทัน (กรณีครูไม่ครบชั้น, โรงเรียนตั้งใหม่, etc.) ให้ระบบประมวลผลโดยใช้ข้อมูล ณ วันสิ้นเดือนที่ไม่สามารถดำเนินการเบิก (ทั้งนี้ต้องไม่เกินจำนวน นร. ที่มีอยู่จริง)
  • ใช้ครูฝั่ง preview และข้อมูลนักเรียนใช้ฝั่งซ้ายโรงเรียนเก่าเบิกย้อนหลังได้นับจากเมื่อกรอก ไม่เกิน 2 เดือน โรงเรียนใหม่ ไม่เกิน 5 เดือน

    >>แสดงว่าต้องเก็บข้อมูลที่คิดซะว่ามีครูครบด้วยเพื่อออกรายงานย้อยหลัง
- Done 0.7.8
4.3.3ระบบส่วนของ สช.
1. ประมวลผล, แสดงรายงานจำนวนโรงเรียน นักเรียนที่มีสิทธิ์รับเงินอุดหนุน ณ วันที่ 10 มิ.ย. ที่เจ้าหน้าที่ตรวจสอบข้อมูลใน 4.3.1 ข้อ 2 (อน.2) เป็นภาพรวมทั้งประเทศ
  • แสดง list โรงเรียนที่มีสิทธิ์และกด confirmation หรือไม่กด
- Done 0.8.5
2. ประมวลผล, แสดงรายงานสรุปผล อน. 4 ได้แก่ จำนวนเงิน จำนวนนักเรียนที่มีสิทธิ์รับเงินอุดหนุน และจำนวนโรงเรียนที่โรงเรียนขอเบิกในภาพรวม โดยใช้ข้อมูลในข้อ 4.3.2 ข้อ 1 (อน.4) โดยแสดงเป็นภาพรวมทั้งประเทศ - Done 0.7.8
3. ถ่ายโอนข้อมูลเกี่ยวกับ PSIS เข้าสู่ระบบการโอนของธนาคารกรุงไทย จำกัด ตามแบบที่ธนาคารกำหนด พร้อมแสดง
  • จำนวนเงิน
  • เลขที่บัญชี
  • สำนักงานเขตพื้นที่การศึกษา
  • สช. จังหวัด
  • โรงเรียนเอกชน

โดยเลือกถ่ายโอนข้อมูลได้อย่างน้อย 2 ระดับ

- Done 0.8.1
4. ประมวลผล, แสดงรายงาน จำนวนเงินรายเขต รายโรง เพื่อให้เจ้าหน้าที่ตรวจสอบก่อนโอนเงินเข้าบัญชีธนาคารของสำนักงานเขต สช.จังหวัด แล้วแต่กรณีโดยผู้มีอำนาจตามที่ระเบียบกำหนด - Done 0.8.1
4.3.4ระบบสถิติการศึกษาโรงเรียนเอกชนในระบบโรงเรียน (ข้อมูลของวันที่ 10 มิ.ย. -- ข้อมูลต้องกรอกทุก field ถึงจะบันทึกได้)
1. ประมวล, แสดงรายงานสรุปจำนวนห้องเรียน นักเรียนทุกคน ประเภทสามัญศึกษาจำแนกตามเพศ ระดับชั้นปี รายโรง ตามแบบที่ สช. กำหนด - Done 0.7.9
2. ประมวล, แสดงรายงานสรุปจำนวนห้องเรียน นักเรียนทุกคน ประเภทอาชีวศึกษาจำแนกตามเพศ หลักสูตร ชั้นปี ประเภท สาขาวิชา สาขางาน รายโรง ตามแบบที่ สช. กำหนด - Done 0.7.9
3. ประมวล, แสดงรายงานสรุปจำนวนครู ประเภทสามัญศึกษาจำแนกตามเพศ วุฒิการศึกษา ระดับชั้นที่สอน รายโรง ตามแบบที่ สช. กำหนด - Done 0.7.9
4. ประมวล, แสดงรายงานสรุปจำนวนครู ประเภทอาชีวศึกษาจำแนกตามเพศ วุฒิการศึกษา ระดับชั้นที่สอน รายโรง ตามแบบที่ สช. กำหนด - Done 0.7.9
5. ประมวล, แสดงผลรายงานจำนวนนักเรียนเข้า-ออกระหว่างวันที่ 10 มิ.ย.ของปีที่ผ่านมา - 10 มิ.ย. ปีปัจจุบัน จำแนกตามชั้นปี รายโรง ตามแบบที่ สช. กำหนด - Done <0.7.8
6. ประมวล, แสดงรายงานจำนวนนักเรียนพิการ จำแนกตามประเภทความพิการ เพศ ชั้นปี รายโรง ตามแบบที่ สช. กำหนด - Done 0.7.9
7. ประมวล, แสดงรายงานชื่อนักเรียนซ้ำซ้อนที่ยังไม่ได้ตัดสิน พร้อมรหัส และชื่อโรงเรียน ตามแบบที่ สช. กำหนด - Done <0.7.8
8. ประมวล, แสดงรายงานจำนวนนักเรียนประเภทสามัญศึกษา (ข้อมูล ณ วันที่ 28/29 ก.พ. ของปีที่ผ่านมา) จำแนกตามเพศ รายชั้นปี เป็นรายโรง ตามแบบที่ สช. กำหนด - Done 0.7.9
9. ประมวล, แสดงรายงานจำนวนนักเรียนประเภทอาชีวศึกษา (ข้อมูล ณ วันที่ 28/29 ก.พ. ของปีที่ผ่านมา) จำแนกตามเพศ ประเภทวิชา สาขาวิชา สาขางาน รายชั้นปี และเป็นรายโรง ตามแบบที่ สช. กำหนด - Done 0.7.9
10. ประมวล, แสดงรายชื่อโรงเรียน จำแนกเป้นโรงเรียนที่ได้รับเงินอุดหนุน ไม่ได้รับเงินอุดหนุน ตามแบบที่ สช. กำหนด - Done 0.7.6
11. รายการที่ 1-0 สามารถถ่ายโอนข้อมูลในรูปแบบ text/excel ได้
* ExportView
- Done 0.7.6
12. สช. สามารถเลือกตาราง file, field กำหนดรูปแบบในการประมวลผล แสดงผลและถ่ายโอนรูปแบบ text/excel พร้อมคู่มือ
  • เลือกจากใน menu เอาละกันนะครับ กำหนดตาม TOR ครับ
- Done -
13. ระบบถ่ายโอนข้อมูล สถานศึกษา นักเรียน ครู เป็นรายบุคคลตาม field ที่ สช. กำหนด ในรูปแบบ text/excel หรือ sql โดยสามารถเลือกได้ 3 ระดับ - Done 0.7.2
14. ระบบบริหารจัดการค่าคงที่ จะต้องทำได้ดังนี้
  • ข้อมูลโรงเรียน -- เพิ่ม/ลบ โรงเรียนที่เลิกกิจการ
  • ชื่อโรงเรียนที่ถูกต้อง ข้อมูลอื่นๆ ที่เกี่ยวข้องกับโรงเรียนที่เลิกกิจการจะต้องลบออกไปด้วย เช่น ห้องเรียน นักเรียน ครู เป็นต้น
  • ตารางค่าคงที่ต่างๆ เพิ่มแสดงรายงานที่จัดเก็บในตารางข้อมูล
- Done 0.7.1
15. search -- เขต และ สช. สามารถสืบค้น สถานศึกษา นักเรียน ครู และรายงานต่างๆ ที่เกี่ยวข้องได้ไม่น้อยกว่า 3 ปี และเลือกวิธีค้นได้ 2 ระดับ
  1. โรงเรียน -- สืบค้นด้วยรหัสโรงเรียน หรือชื่อโรงเรียน
  2. บุคลากร -- สืบค้นด้วยเลขประจำตัว ชื่อ สกุล
  • แต่งตั้ง
  • ถอดถอน
  1. นักเรียน -- สืบค้นด้วยเลขประจำตัว ชื่อ สกุล
  • นักเรียนที่เข้าใหม่
  • นักเรียนที่จำหน่าย
  • นักเรียนซ้ำซ้อนที่ตัดสินแล้ว
  1. รายงานต่าง ๆ ที่เกี่ยวข้องกับการรับเงินอุดหนุนปีเดือนที่ผ่านมา
SEARCH Done 0.8.5

4.4

# รายละเอียด Phase Status Milestone
4.4ระบบบริหารจัดการเงินอุดหนุนโครงการสนับสนุนค่าใช้จ่ายการจัดการศึกษาตั้งแต่อนุบาลจบจบการศึกษาขั้นพื้นฐาน เป็นค่าหนังสือเรียน อุปกรณ์การเรียน เครื่องแบบนักเรียน และกิจกรรมพัฒนาคุณภาพผู้เรียน
4.4.1ระดับโรงเรียน
ภาค

เรียน1

1. ประมวลผลจำนวนนักเรียน, แสดงรายงานคำขอรับการอุดหนุนตามประมาณการโครงการฯ​
  • จำนวนนักเรียน ชั้น อ.1, ป.1, ม.1, ม.4, ปวช.1 ร้อยละ 80 ของจำนวนนักเรียนชั้นดังกล่าว ณ วันที่ 10 มิ.ย.ของปีการศึกษาที่ผ่านมา โดยตัดทศนิยมทิ้ง
  • ชั้นอื่นๆ ให้เลื่อนไหลจำนวนนักเรียนแต่ละชั้นปีของปีที่ผ่านมา ยกเว้น อ.3, ป.6, ม.3, ม.6 และ ปวช. 3 ให้ตัดทิ้ง
    • [psis-2/lists/อุปกรณ์การเรียน/[2012-11-20] คำร้องตามประมาณการ.doc] (มีคำขอ + ใบเสร็จใน file นี้)
PDF Done feature-4.4
2. ประมวลผล, แสดงรายงานใบสำคัญรับเงินโครงการฯ (ตามประมาณการ) โดยแสดงข้อมูล จำนวนเงิน และจำนวนนักเรียน จำแนกเป็นรายชั้นปี ตามแบบที่ สช. กำหนด
  • [psis-2/lists/อุปกรณ์การเรียน/[2012-11-20] คำร้องตามประมาณการ.doc]
    • (มีคำขอ + ใบเสร็จใน file นี้)
PDF Done feature-4.4
3. ระบบบริหารจัดการข้อมูลนักเรียนที่ใช้สิทธิ์ หรือ สละสิทธิ์ การรับเงินอุดหนุนจำแนกตามรายการ โดย รร. สามารถเลือกสละสิทธิ์ทุกรายการ หรือ บางราย รวมทั้งสละสิทธิ์ทั้งโรงเรียน - Done feature-4.4
4. ประมวลผลจำนวนนักเรียนตามที่มีอยู่จริง วันที่ 10 มิ.ย. ,แสดงรายงานคำขอรับการอุดหนุนตามการประมาณการโครงการฯ จ่ายจริง ณ วันที่ 10 มิ.ย. โดยจำแนกเป็นรายชั้นปี ตามแบบที่ สช. กำหนด
  • [psis-2/lists/อุปกรณ์การเรียน/[2012-11-20] คำขอรับอุดหนุนฯที่มีอยู่จริง + ใบสำคัญรับเงินอุดหนุน-10-Jun.doc]
    • มี จ่ายจริง 10 มิ.ย. + ขอเบิกเพิ่ม 10 มิ.ย
PDF Doing... done-4.4
5. ประมวลผลจำนวนนักเรียน จำนวนเงิน และแสดงรายงานแบบเปรียบเทียบจำนวนนักเรียน และจำนวนเงินอุดหนุนที่ขอเบิกเพิ่มเติม เป็นค่าหนังสือ อุปกรณ์การเรียน เครื่องแบบนักเรียน และกิจกรรมพัฒนาคุณภาพผู้เรียน (จ่ายจริง ณ วันที่ 10 มิ.ย.) โดยเปรียบเทียบกับข้อมูลในข้อ 2) จำแนกเป็นรายชั้นปีพร้อมทั้งแสดงผลต่าง (จำนวนเงิน) กรณีส่งคืนเงินให้ใส่วงเล็บและตัวเลขเป็นสีแดง ตามแบบที่ สช. กำหนด

?? สำหรับโรงเรียนที่ซื้อหนังสือเรียนต่ำกว่าอัตราที่กำหนดให้ใช้จำนวนเงินตามที่โรงเรียนจ่ายจริง

  • [psis-2/lists/อุปกรณ์การเรียน/เปรียบเทียบฯ.xls]
PDF Done feature-4.4
6. ประมวลผลจำนวนเงิน, แสดงรายงานใบสำคัญรับเงินที่ขอเบิกเพิ่มเติมเป็นเงินค่าหนังสือเรียน อุปกรณ์การเรียน เครื่องแบบนักเรียน และกิจกรรมพัฒนาคุณภาพผู้เรียน (ขอเบิกเพิ่ม ณ วันที่ 10 มิ.ย.) ตามแบบที่ สช. กำหนด
  • [psis-2/lists/อุปกรณ์การเรียน/[2012-11-20] คำขอรับอุดหนุนฯที่มีอยู่จริง + ใบสำคัญรับเงินอุดหนุน-10-Jun.doc]
    • มี จ่ายจริง 10 มิ.ย. + ขอเบิกเพิ่ม 10 มิ.ย
PDF Done feature-4.4
7. Table lookup เกี่ยวกับอัตราค่าหนังสือเรียน อุปกรณ์การเรียน เครื่องแบบนักเรียน และกิจกรรมพัฒนาคุณภาพผู้เรียนโดยมีอัตราประมาณการและอัตราจ่ายจริง
  • [psis-2/lists/อุปกรณ์การเรียน/ประกาศอัตราหนังสือ.pdf]
  • [psis-2/lists/อุปกรณ์การเรียน/แจ้งจัดสรร สพป.pdf]
  • [psis-2/lists/อุปกรณ์การเรียน/แจ้งจัดสรรโรงเรียน.pdf]
PDF Done feature-4.4
ภาค

เรียน2

8. ประมวลผลนักเรียนตามที่มีอยู่จริง ณ วันที่ 10 พ.ย. และแสดงรายงานคำขอรับการอุดหนุน เป็นค่าหนังสือเรียน (เฉพาะ ปวช.) อุปกรณ์การเรียน และกิจกรรมพัฒนาคุณภาพผู้เรียน โดยแยกตามชั้นปีตามแบบที่ สช. กำหนด
  • [psis-2/lists/อุปกรณ์การเรียน/[2012-11-20] คำขอรับเงินอุดหนุน&ใบสำคัญ-10-Nov.doc]
    • (มี คำขอรับการอุดหนุนตามที่มีอยู่จริง 10 พ.ย. + ใบสำคัญรับเงินอุดหนุน 10 พ.ย.)
PDF Done feature-4.4
9. ประมวลผลจำนวนนักเรียน และจำนวนเงินจำแนกตามชั้นปีและแสดงรายงานใบสำคัญรับเงิน (เฉพาะ ปวช.) อุปกรณ์การเรียน และกิจกรรมพัฒนาคุณภาพผู้เรียน จ่ายจริง ณ วันที่ 10 พ.ย.ตามแบบที่ สช. กำหนด
  • [psis-2/lists/อุปกรณ์การเรียน/[2012-11-20] คำขอรับเงินอุดหนุน&ใบสำคัญ-10-Nov.doc]
    • (มี คำขอรับการอุดหนุนตามที่มีอยู่จริง 10 พ.ย. + ใบสำคัญรับเงินอุดหนุน 10 พ.ย.)
PDF Done feature-4.4
4.4.2ระดับเขต
ภาค

เรียน1

1. ประมวลผล, แสดงรายงานสรุปจำนวนนักเรียน และจำนวนเงินอุดหนุนที่ขอเบิกตามประมาณการโครงการฯ จำแนกเป็นรายชั้นปีตามแบบที่ สช. กำหนด
  • [psis-2/lists/อุปกรณ์การเรียน/สรุปขอเบิกประมาณการ (สพปฯ).xls]
- Done feature-4.4
2. ประมวลผล,แสดงรายงานสรุปจำนวนนักเรียนที่ขอเบิกทุกชั้นปี จ่ายจริง ณ วันที่ 10 มิ.ย. ตามแบบที่ สช. กำหนด
  • [psis-2/lists/อุปกรณ์การเรียน/แบบสรุปเบิกจริง(สพปฯ).xls]
- Done feature-4.4
ภาค

เรียน2

3. ประมวลผล, แสดงรายงานแบบสรุปจำนวนนักเรียนและจำนวนเงินอุดหนุนที่ขอเบิก ทำแบบสรุปจำนวนนักเรียนที่ขอเบิกโครงการสนับสนุนค่าใช้จ่ายทุกชั้นปี เป็นค่าหนังสือเรียน (เฉพาะปวช.) อุปกรณ์การเรียน และกิจกรรมพัฒนาคุณภาพผู้เรียน จ่ายจริง ณ วันที่ 10 พ.ย. ตามแบบที่สช.กำหนด
  • [psis-2/lists/อุปกรณ์การเรียน/แบบสรุปเบิกจริง10พย(สพปฯ).xls]
- Done feature-4.4
4.4.3ระดับ สช.
1. ประมวลผลและแสดงรายงานสรุปจำนวนนักเรียนและจำนวนเงินอุดหนุน ณ วันที่ 10 มิ.ย. ที่เขตขอเบิก
  • [psis-2/lists/อุปกรณ์การเรียน/แจ้งจัดสรรฯภาคเรียนที่๑.pdf]
- Done feature-4.4
2. ประมวลผลแสดงรายงานสรุปจำนวนนักเรียนและจำนวนเงินอุดหนุน ณ วันที่ 10 พ.ย. ที่เขตขอเบิก
  • ก็ควรจะเหมือนข้อ 1 แต่เปลี่ยนวัน
- - -
3. ถ่ายโอนข้อมูลเกี่ยวกับเงินอุดหนุนค่าใช้จ่ายการจัดการศึกษาตั้งแต่ระดับ อ. จนจบการศึกษาขั้นพื้นฐาน เป็นค่าหนังสือเรียน อุปกรณ์การเรียน เครื่องแบบนักเรียน และกิจกรรมพัฒนาคุณภาพผู้เรียน จากระบบ PSIS เข้าสู่ระบบการโอนเงินของ ธ.กรุงไทย ตามแบบที่ธนาคารกำหนดพร้อมทั้งแสดงจำนวนเงิน เลขที่บัญชี เขต สช.จังหวัด และโรงเรียนอย่างน้อย 2 ระดับ - - -
4. ประมวลผลและแสดงรายงาน จำนวนเงินรายเขต รายโรง เพื่อให้เจ้าหน้าที่ตรวจสอบความถูกต้องได้แล้วแต่กรณีโดยมีผู้มีอำนาจตามระเบียบที่กำหนด
  • ส่วนกลางโอนเข้าบัญชีโดยตรง
  • ส่วนภูมิภาคโอนเข้าเขตพื้นที่ สรุป (สช. -> เขต, สข. -> จังหวัด, สช. -> โรงเรียน)
- - -
\ No newline at end of file diff --git a/_posts/2013-10-29-reportlab-101.md b/_posts/2013-10-29-reportlab-101.md new file mode 100644 index 0000000..beaf0b2 --- /dev/null +++ b/_posts/2013-10-29-reportlab-101.md @@ -0,0 +1,182 @@ +--- +layout: post +type: handbook +title: "ReportLab 101" +date: 2013-10-29 +tags: coding pdf reportlab +--- + +## Style + +เราจะใช้เพียงแค่ font TH Sarabun New ครับ โดยจะมีให้เลือกแค่ 2 แบบ:- + +* TH Sarabun New +* TH Sarabun New Bold + +ส่วนแต่ละส่วนนั้น สามารถจัดการ style โดยการออกแบบ Style ของแต่ละส่วนก่อน เช่น ให้หัวกระดาษเป็นอย่างนึง, เนื้อหาอย่างนึง, ในตารางอีกแบบนึง, คำอธิบายใต้ตารางอีกแบบนึง เป็นต้น พยายามจัดการให้มันไม่ต้องมีแบบมาก เพราะ (1)ง่ายต่อการอ่าน code (2)ง่ายต่อต่อการแก้ไข (3)ไม่ฟุ่มเฟือย + +เท่าที่ดูวิธีที่ง่ายที่สุดคือ ใช้ `ParagraphStyle` โดยเราสามารถจัดการได้โดย `import ParagraphStyle` ด้านบนของ file ก่อน + + from core.views.pdfs import Paragraph, ParagraphStyle + +จากนั้นเราก็จะสามารถกำหนด style ของตัวเองได้ + + style_x1 = ParagraphStyle(name="style_name", + fontName='TH Sarabun New', + fontSize=16, + alignment=TA_CENTER, + leading=16, + spaceAfter=8,) + +`name="xxx"` เป็นสิ่งที่จำเป็นสำหรับ `ParagraphStyle` นอกนั้นก็กำหนดตามต้องการ ตรง `TA_CENTER` แปลว่า ให้มันอยู่ตรงกลาง ซึ่งก็ยังมี `TA_LEFT`, `TA_RIGHT`, `TA_JUSTIFY` ตามชื่อ โดยถ้าต้องการใช้ค่าพวกนี้ก็ต้อง import ด้วย เช่น + + from reportlab.lib.enums import TA_CENTER, TA_LEFT + +ที่ผ่านมาคือ การตั้งว่า style เราจะมีอะไรบ้างต่อไปก็จะเป็นการใช้ style หลักๆแล้วเราจะใช้ Python List (ก็อารมณ์ array นั่นแหละ) ในการเก็บข้อมูลแต่ละชุดๆไป จะอารมณ์ประมาณว่า + + lines = [] # เริ่ม declare list ก่อน + lines.append(Paragraph("บรรทัดแรก", style_x1)) # อันนี้เหมือนเพิ่ม element ใน list + lines.append(Paragraph("บรรทัดที่สอง", style_x1)) # อันนี้เหมือนเพิ่ม element ใน list ต่อไป + +เราก็จะได้ประมาณว่า + + บรรทัดแรก + บรรทัดที่สอง + +มันจะตรงกลางนะ แต่พิมในนี้ลำบาก ก็เลยทำเป็นเป็นแค่ตัวอย่าง + +### Color + +การกำหนดสีจากที่ใช้ `colors.lightgrey` อะไรไปก็ยังสามารถกำหนดสีเองได้โดย + + from reportlab.lib.colors import Color + red50transparent = Color(100, 0, 0, alpha=0.5) + +โดย `Color(สีแดง, สีเขียว, สีฟ้า, alpha=1)` โดยแต่ละสีมีค่าตั้งแต่ 0-255 และ alpha ก็มีค่าตั้งแต 0-1 (1 คือ ทึบ, 0 คือ ใสทะลุปรุโปร่ง) จากนั้นก็เอา `red50transparent` ไปแทนที่ `colors.lightgrey` ได้เลย + +### ข้อสังเกต + +1. การขึ้นบรรทัดใหม่ถ้าเป็น Paragraph เดียวกันมันจะตัดขึ้นบรรทัดใหม่ให้เอง โดยใช้ช่องว่างเป็นตัวตัด มันใช้ได้ดีกับภาษาอังกฤษ แต่ไม่ใช่ภาษาไทย ดังนั้นเราต้องตัดคำเองครับ ถ้าคิดว่าตัวอักษรมันมีจำนวนไม่แน่นอน เผื่อไว้เลยครับ ดีกว่ากลายเป็นฉีกคำประหลาดๆ ให้ด้านหลังว่างไว้เยอะหน่อยยังดีกว่ามาก +1. การขึ้นบรรทัดใหม่ สามารถใช้ html tag
เป็นตัวขึ้นบรรทัดใหม่ได้เลย +1. แต่ละ Paragraph จะขึ้นบรรทัดใหม่เสมอ ค่ามันจะขึ้นกับ spaceBefore กับ spaceAfter + + +## Table + +ตารางเป็นอีกส่วนที่มีความซับซ้อนพอสมควรในกรณีที่มี cell รวมกัน แต่ถ้าตามปกติก็ง่ายๆ ไม่มีอะไร มาดูตัวอย่างง่ายๆ แล้วค่อยไล่อธิบายบางทีอาจจะเข้าใจง่ายกว่า + + data = [ + ['top\nLeft', '10', '20', '30'], + ['01', '11', '21'], + ['02', '12', '22', '32'], + ['03', '13', '23', '33'], + ['04', '14', '24', '34'], + ] + t = Table(data, style=[ + ('FONTNAME', (0,0), (-1,-1), 'TH Sarabun New Bold'), + ('GRID', (0,0), (-1,-1), 0.5 , colors.grey), + ('BACKGROUND',(0,0),(1,1),colors.palegreen), + ('SPAN',(0,0),(1,1)), + ('BACKGROUND',(-2,-2),(-1,-1), colors.red), + ('SPAN',(-2,-2),(-1,-1)), + ]) + lines.append(t) + +data นั้นจะเป็นตัวเก็บข้อมูลไว้แสดงในตารางโดยจะเป็น list 2 หรือ 3 มิติ เรียกไม่ถูกเหมือนกัน แต่มันจะซ้อนกันอย่างนั้น โดยระดับแรกจะเป็นตัวข้อมูลแสดงของ row และระดับที่ 2 ก็คือจะเป็นตัวข้อมูลในระดับ column ของแต่ละ row โดยข้อมูลนั้นจะใช้ `Table` เป็นตัวแปลงให้เป็นตาราง (ซึ่งก็ต้อง import อีกนั่นแหละ) + + from core.views.pdfs import Table + +หลังจากนั้นก็ต้องไปต่อใน lines เหมือนกับที่ทำกับ Paragraph ไม่มีผิดครับ ความสับสนของตารางมันจะอยู่ตรงที่ style มากกว่า มาดูผลโดยประมาณกันก่อนว่า มันจะได้ ตารางใน pdf ยังไงกันแน่ + +
top

Left

2030
12
02122232
031323
0414
+ +ตารางจะเริ่มที่มุมบนซ้าย -- เริ่มด้วย column 0 และ row 0 --> (0, 0) ตามที่เห็นก็สีมั่วๆนะครับ ขี้เกียจครับ อย่างที่เห็นชัดๆ คือ จะมี cell merge กันอยู่ 2 ที่ คือ + +1. มุมซ้ายบน ตำแหน่ง `(col, row) (0, 0)` ถึง `(1, 1)` +1. มุมขวาล่าง ตำแหน่ง `(col, row) (2, 3)` ถึง `(3, 4)` หรือมองอีกมุม (ขวาล่าง) คือ `(-2,-2),(-1,-1)` + +จริงๆ ก็จะเห็นชัดเจนกว่า style มันเนี่ย ตรงที่ cell merge กัน ถูกกำหนดด้วย + + ('BACKGROUND',(0,0),(1,1),colors.palegreen), + ('SPAN',(0,0),(1,1)), + +`BACKGROUND` ก็ไม่ได้เกี่ยวอะไรกับเค้า เพียงแค่บอกสีครับ SPAN เป็นตัวบอกว่า เราจะรวม cell ไหนถึงตรงไหนกันแน่ โดยข้อมูลจะเป็นข้อมูลของ cell แรกเสมอครับ + +### จัดตำแหน่ง + +ถ้าต้องการจะจัดตำแหน่งอักษรของแต่ละ cell ก็เพิ่มใน style ของ Table ได้ + + ('ALIGN',(0,0),(0,0),'CENTER'), + ('VALIGN',(0,0),(0,0),'MIDDLE'), + +* `ALIGN` คือ จัดตำแหน่งแนวนอน มีค่าเป็น `LEFT`, `RIGHT`, `CENTER` -- ค่า default เป็น `LEFT` +* `VALIGN` คือ จัดตำแหน่งแนวนอน มีค่าเป็น `TOP`, `MIDDLE`, `BOTTOM` -- ค่า default เป็น `BOTTOM` + +ในกรณีที่ต้องการจัดการตำแหน่งของ cell ที่มีการรวม cell กำหนดตำแหน่งแค่ cell ที่มีข้อมูล (มุมขวาบน) ก็พอ + +### ข้อสังเกต + +1. `SPAN` สามารถกำหนด ตำแหน่งค่าติดลบได้ `('SPAN',(-2,-2),(-1,-1))` << โดยจะเป็นการคิดจากมุมขวาล่างมา ตรงข้ามกับค่าบวกที่คิดจากมุมซ้ายบน +1. `SPAN` จะไม่สนใจข้อมูลที่อยู่ในตำแหน่งอื่นเลย นอกจากตัวมุมบนขวาของที่รวม -- ตัวอื่นจะอารมณ์ถูกทับไปเลย โดยสังเกตได้จากตัวอย่าง row ที่ 2 กลายเป็นว่า 01, 11 หายไปเลย โดยตำแหน่ง 21 ก็ไม่ได้เปลี่ยนไป +1. ถ้า list มีไม่ครบในตาราง ตรงที่ขาดไปก็จะเป็นช่องว่าง +1. การขึ้นบรรทัดใหม่ในตารางใช้ escape key `\n` ไม่ใช่ `
` เหมือนใน `Paragraph` +1. พวก `SPAN` ใน style ไม่ได้ต้องเรียงลำดับอะไรครับ จัดยังไงก็ได้ มันอ่านรู้เรื่อง แต่ที่ควรจะทำให้มันเป็นจากบนลงล่าง เป็นระบบหน่อยก็เพราะแค่เราจะกลับไปแก้ลำบากขึ้นเยอะ ถ้ามันไล่ไม่ได้ง่ายๆครับ + +เท่านี้ก็น่าจะพอได้ idea ไปลองแล้วหล่ะ + + +## การแก้ใน .py + +ใครใช้รายงานไหน จริงๆ ก็น่าจะมีอะไรอยู่ใน file พอสมควรแล้วครับ แต่ส่วนที่ต้องแก้ คือ ส่วนของ + + def prep_to_pdf(self, context): + lines = [] + ...... + ..... + ... + .. + return render_to_pdf(lines) + +แค่ส่วนจุดๆๆ นี้แหละครับ ที่ต้องแก้ไข (ซึ่งชื่อตัวแปร lines ก็เปลี่ยนได้ตามชอบใจครับ ที่ใช้ lines เพราะจะได้สอดคล้องกับตัวอย่างด้านบน) + +### การใช้คำสั่งต่างๆ + +โดยมากแล้วจะเป็นการเปรียบเทียบคำสั่งต่างๆ ของ templatetag ที่เห็นใน .html กับที่ต้องเขียนใน python (.py) ใน html นั้นจะมีการเรียกใช้งานตัวแปรและ function ที่ต่างออกไปจากปกติ + + {{date}} + +`{{ }}` ไว้สำหรับแสดงผลตัวแปรนั้นเป็น string + + {{date|month_full_th}} + +| เป็นการบ่งบอกว่า มีการใช้ function กับตัวแปร date โดยเราจะสามารถดูได้ว่า function นี้คืออะไรได้จากการ import function ข้างบน ซึ่งใน `templatetag` จะใช้คำสั่ง `{ % load yyyyy % }` + +การใช้งาน function พวกนี้ใน python code นั้นจะสามารถทำได้โดย + + from core.templatetags.extratags import intcomma2, intword_th, month_full_th + + thb = 1423.223 + print u'ราคา %s' % intcomma2(thb) + # จะได้ผลลัพธ์เป็น + ราคา 1,423.22 + +### คำสั่งอ้างอิง + +templatetags ที่ใช้ใน .html ก็มีแตกต่างกันออกไปแต่หลักๆก็จะมีอยู่ 2 ที่ด้วยกันคือ + +* `report_tags` -- ส่วนใหญ่จะเป็นการแปลงค่าแสดงผลที่เกี่ยวกับโรงเรียนทั้งหมด เช่น แสดงรอบ แสดงชั้นเป็นต้น + + from school.templatetags.report_tags import * +* `extra_tags` -- เป็นการแปลงค่าเพื่อแสดงผลทั่วๆไป เช่น ใน , ในหลักพัน การพิมวันที่เป็นภาษาไทย หรือพิมจำนวนเงินเป็นภาษาไทย + + from core.templatetags.extra_tags import * + +รายละเอียดของคำสั่งมีดังนี้ + +
file function description
report_tags school.templatetags.report_tags
shift_display แปลงค่า
  • 0 -> รอบเช้า และ
  • 1 -> รอบบ่าย
coarse_grade_display แสดงชั้นปีแบบคร่าวๆ โดยจะใช้ค่าชั้นปีแบบใดก็ได้ ผลเป็นแบบหยาบเสมอ โดยจะแสดงเป็น
  • เตรียมอนุบาล
  • อนุบาล
  • ประถมศึกษา
  • มัธยมศึกษาตอนต้น
  • มัธยมศึกษาตอนปลาย
  • ประกาศนียบัตรวิชาชีพ
  • ปวส.
  • ปวท.
fine_grade_display แสดงชั้นปีแบบเจาะจงชั้นปี

โดยจะแสดงเป็น

  • เตรียมอนุบาล
  • อ.1, อ.2, อ.3
  • ป.1, ป.2, ป.3, ป.4, ป.5, ป.6,
  • ม.1, ม.2, ม.3, ม.4, ม.5, ม.6,
  • ปวช.1-3
  • ปวส.1-3
  • ปวท.1-2
course_display แสดงหลักสูตรของสายวิชาชีพของแต่ละห้อง
education_level_display แสดงวุฒิที่ได้รับการบรรจุของบุคลากร เช่น ป.เอก (ครู) ป.เอก
extra_tags core.templatetags.extra_tags
intcomma2 เติม , ให้กับหลักพัน และถ้าค่าเป็นทศนิยมก็จะตัดเหลือแค่ 2 หลักให้อัตโนมัติ
intword_th แสดงจำนวนเงินเป็นภาษาไทย
date_abbv_th 11 พ.ย. 2556
date_full_th 5 ธันวาคม 2556
month_abbv_th ม.ค. 2556
month_full_th กุมภาพันธ์ 2556
year_th 2556
system_status_display
+ + + + + + diff --git a/_posts/2013-11-12-psis-record.md b/_posts/2013-11-12-psis-record.md new file mode 100644 index 0000000..0154408 --- /dev/null +++ b/_posts/2013-11-12-psis-record.md @@ -0,0 +1,634 @@ +--- +layout: post +type: handbook +title: "psisRecord" +date: 2013-11-12 +tags: database +--- +Now all data in the past will be in another database. MongoDB it is. + +### เป้าหมาย + +* ข้อมูลที่เก็บไว้จะต้องมีมากพอที่จะสร้างรายงานใหม่ได้ทันที โดยไม่มีโอกาสที่จะมีข้อมูลหายไปได้ เช่น ข้อมูลไร้สาระอย่างรายละเอียดเพิ่มเติมอย่างตัวอย่างคำอธิบายตัวย่อค่าคงที่จะไม่จำเป็นต้องใส่เพราะซ้ำซ้อนและสามารถเรียกได้แน่นอน ทุกเวลาจากฐานข้อมูลหลัก +* ข้อมูลจะต้องเข้าถึงง่ายเพื่อสร้างรายงานเปรียบเทียบให้กับสำนักงานต่างๆ ได้ + + +### buffer + +เป็นส่วนที่มีการคำนวณข้อมูลเพื่อเก็บไว้สำหรับรายงานต่อๆไป หลักๆ คือ ms* report เท่านั้นที่ใช้สำหรับตอนนี้ + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "*", + ... + } + +#### report + +1. ms_est_receipt +2. ms_actual +3. ms_actual_receipt +4. ms_actual_diff_receipt +5. ms_matrix + +ค่าหนังสือเรียน ใบเสร็จ ประมาณการ + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "ms_est_receipt", + "data": { + ... + } + } + +ค่าหนังสือเรียน นักเรียนที่มีอยู่จริง Jun 10 + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "ms_actual", + "data": { + ... + } + } + +ค่าหนังสือเรียน ใบสำคัญรับขอเบิกเพิ่มเติม Jun 10 + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "ms_actual_diff_receipt", + "data": { + ... + } + } + +ค่าหนังสือเรียน นักเรียนที่มีอยู่จริง Nov 10 + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "ms_actual", + "data": { + ... + } + } + +ค่าหนังสือเรียน ใบสำคัญรับขอเบิก Nov 10 + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "ms_actual_receipt", + "data": { + ... + } + } + +## report + +หลักๆ ข้อมูลตรงนี้ก็เอาไว้ออกรายงานโดยที่ไม่จำเป็นต้องประมวลผลจากข้อมูลใหม่ (หรือข้อมูลดิบไม่มีแล้ว) รายงานก็มีประมาณ + +1. sub1 +1. sub2 +1. sub3 +1. sub4 +1. sub5 +1. sub6 +1. salary +1. payment +1. sub4_fake +1. ms_est +1. ms_est_receipt +1. ms_actual_jun10 +1. ms_actual_jun10_receipt +1. ms_matrix +1. ms_actual_nov10 +1. ms_actual_nov10_receipt + +### รายงาน อน.1 + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "sub1", + "is_charity": true/false, + "data": { + 'disabled': { + 'sum': 0, + 'shift': [ + {}, # day shift + {}, # night shift + ] + }, + 'normal': { + 'sum': 0, + 'shift': [ ## list consisting of 0, 1 indicating shift + { # shift start + u'1-0': { # grade and course + 'text': {'grade': '1', 'course': u'0'}, + 'number': + { + 'boarding': 0, + 'normal': 296, + 'tuition': 1937.0, + 'disabled': 0, + 'rate': {'normal': 7793.0, 'charity': 0} + } + } + }, + { + ... # another shift if applied + } + ] + }, + "total": { + 'normal': { + '0': {'normal':0, 'charity':0, 'sum':0}, + '1': {'normal':0, 'charity':0, 'sum':0}, + 'all':{'normal':0, 'charity':0, 'sum':0}, + }, + 'disabled': { + '0': {'disabled':0, 'boarding':0, 'sum':0}, + '1': {'disabled':0, 'boarding':0, 'sum':0}, + 'all': {'disabled':0, 'boarding':0, 'sum':0}, + }, + } + } + +### รายงาน อน.2 + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "sub2", + "is_charity": true/false, + "data": { + '0': { # shift ! + '0': { # coarse grade + 'sum': { + 'abs_total': 0, + 'charity': 0, 'normal': 0, 'boarding': 0, 'disabled': 0, + 'teachers': 0, 'salary': 0, + }, + 'crs': [ + { # room thing and teacher data + "room": xx, "all_students": 0, "boarding": 0, "disabled": 0, "eligible": 0, + "full_name": xxx, "education": yyy, "employment_date": yyyy-mm-dd, + "employment_document_number": xxx, "salary": 0 + }, + {}, + {}, + ], + 'extra': [ + { # only teacher data + "full_name": xxx, "education": yyy, "employment_date": yyyy-mm-dd, + "employment_document_number": xxx, "salary": 0 + }, + {}, + {}, + ] + }, + '1': { # coarse grade + + }, + }, + '1': { # shift if applied + }, + }, + "total": { + '0': {'abs_total': 0, 'normal': 0, 'boarding': 0, 'disabled': 0, 'teachers': 0, 'salary': 0,}, + '1': {'abs_total': 0, 'normal': 0, 'boarding': 0, 'disabled': 0, 'teachers': 0, 'salary': 0,}, + 'all': {'abs_total': 0, 'normal': 0, 'boarding': 0, 'disabled': 0, 'teachers': 0, 'salary': 0,} + } + } + +### รายงาน อน.3 + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "sub3", + "is_charity": true/false, + "data": { + } + } + +### รายงาน อน.4 + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "sub4", + "is_charity": true/false, + "data": { + } + } + +### รายงาน อน.5 + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "sub5", + "is_charity": true/false, + "data": { + } + } + +### รายงาน อน.6 + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "sub6", + "is_charity": true/false, + "data": { + } + } + +### บัญชีการจ่ายเงินเดือนครู + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "salary", + "is_charity": true/false, + "data": { + } + } + +### หลักฐานการจ่ายเงินเดือนครู + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "payment", + "is_charity": true/false, + "data": { + } + } + +### ข้อมูลเก็บเผื่อสร้าง อน.4 ย้อนหลัง + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), # report_date + "report": "sub4_fake", + "data": { + # student detail count enough to feed ReportSub4Mixin.get_processed_data() + } + } + +## stat + +### original data + +This is what data with all grades; no dob cut; no student_status considered; no issue considered; but we only sum student in class. Student without class is out of luck ever. This is a pure query. + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), + "type": "original", + "data": { + } + } + +### raw data without any cut + +Raw data which met basic requirements, no further cut. (shift isn't considered) This should meet few requirements: + +* eligible grade +* verified & completed classroom +* date of birth +* student_status +* resolved issue students + +From get_subsidized_students_queryset() w/o any cut. + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), + "type": "raw", + "data": { + } + } + +นร. ประเภทสามัญศึกษา ที่มีสิทธิ์รับเงินอุดหนุนรายบุคคล +Data from get_subsidized_students_in_fine_grade() + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), + "type": "educational", + "data": { + } + } + +นร. ประเภทอาชีวศึกษา ที่มีสิทธิ์รับเงินอุดหนุนรายบุคคล +Data from get_subsidized_students_in_fine_grade() + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), + "type": "technical", + "data": { + } + } + +นร. พิการในโรงเรียนเอกชน ประเภทสามัญศึกษา +Filter verified disabled people from get_subsidized_students_queryset(). + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), + "type": "disabled_educational", + "data": { + } + } + +นร. พิการในโรงเรียนเอกชน ประเภทอาชีวศึกษา +Filter verified disabled people from get_subsidized_students_queryset(). + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), + "type": "disabled_technical", + "data": { + } + } + +นร. โรงเรียนการกุศล และโรงเรียนสอนศาสนาอิสลามควบคู่กับวิชาสามัญที่มีมูลนิธิ/มัสยิดเป็นผู้รับใบอนุญาต +Data from evaluate_errors() which (school).is_charity() has to return True + + { + "_id": xx, + "school": "", + "date": ISODate("xxx"), + "type": "charity", + "data": { + } + } + +## history + +เป็นการเก็บข้อมูลนักเรียนเข้า-ออกทั้งหมด จาก `archive_students_transfer` + + { + "_id": xx, + "people_id": "", + "date": ISODate("xxx"), + "transfer": "in/out", + "school": "", + ... # depending on whether it's transfer IN/OUT + } + +data is pretty much the same way sub5/sub6 is. + +## searchArchive + +* school [yearly data] +* teacher [monthly data in/out only] +* student [every in/out] +* report [not implemented -- using report] + +### school + + { + "_id": xx, + "archive_type": "school", + "school": "", + "basic": { + "thai_name": "", + "eng_name": "", + "serv_area_code": "", + }, + "board": { + "licensee": {"people_id": "", "full_name": "",}, + "manager": {"people_id": "", "full_name": "",}, + "principle": {"people_id": "", "full_name": "",}, + }, + "bank": { + "account_number": "", + "account_name": "", + "bank": "", + "bank_branch": "", + }, + "license": [ + { + "license_number": "", + "license_date": "", + "license_effective_date": "", + "age": [min, max], + "shift": { + "0": {"capacity": 0, "room": 0, "time": ["0", "0"], "grade": ["0", "0"]}, + "1": {"capacity": 0, "room": 0, "time": ["0", "0"], "grade": ["0", "0"]}, + } + }, + ## more items + {}, {}, ... + ] + } + +### teacher + + { + "_id": xx, + "archive_type": "teacher", + "school": "", + "people_id": "", + "full_name": "", + "transfer_type": "", + "date": ISODate("xxx"), + "editor": "" + } + +### student + + { + "_id": xx, + "archive_type": "student", + "school": "", + "people_id": "", + "full_name": "", + "transfer_type": "", + "xfer_status": "", + "student_id": "", + "date": ISODate("xxx"), + "editor": "" + } + +### confirmation + +ข้อมูลในส่วนยืนยันข้อมูลถูกต้องในส่วนต่างๆ +ส่วนยืนยันของโรงเรียน +ยืนยันความถูกต้องประจำปี (เฉพาะเดือน 6) +ยืนยันความถูกต้องประจำเดือน +ส่วนยืนยันคุณภาพของข้อมูลของสำนักงาน +ยืนยันการยื่นเอกสาร +ยืนยันความถูกต้องของข้อมูล +ส่วนยืนยันของโรงเรียน - ยืนยันความถูกต้องประจำปี (เฉพาะเดือน 6) + + { + "_id": xx, + "user_id": 000, + "username": " or ", + "date": ISODate("xxx"), + "school": "", + "what": "confirmation", + "type": "monthly", # only student for now. + } + +ส่วนยืนยันของโรงเรียน - ยืนยันความถูกต้องประจำเดือน + + { + "_id": xx, + "user_id": 000, + "username": " or ", + "date": ISODate("xxx"), + "school": "", + "what": "confirmation", + "type": "yearly", # only student for now. + } + +ส่วนยืนยันคุณภาพของข้อมูลของสำนักงาน - ยืนยันการยื่นเอกสาร + + { + "_id": xx, + "user_id": 000, + "username": " or ", + "date": ISODate("xxx"), + "school": "", + "office": "", + "what": "dataQuality", + "type": "delivered", + } + +ส่วนยืนยันคุณภาพของข้อมูลของสำนักงาน - ยืนยันความถูกต้องของข้อมูล + + { + "_id": xx, + "user_id": 000, + "username": " or ", + "date": ISODate("xxx"), + "school": "", + "office": "", + "what": "dataQuality", + "type": "completeness", + } + +### preferences + +System-wide's key-value storage. + +no. | name | value | description +--- | --- | --- | --- +1 | `subsidy_rate_header` | text | +2 | `ms_est_first_level_cut` | decimal 0-1 | +__System Preferences__ | via
`core.get_system_pref()` `core.set_system_pref() `| | +--- | --- | --- | --- +3 | `enforce_disability_expiration_date` | boolean +4 | `enforce_people_id_validation` | boolean +5 | `backfill_reviews_in_progress` | boolean | no more running repetitive back-filling reviews ever +6 | `check_student_issue_in_progress` | boolean | no more running repetitive task +7 | `check_teacher_issue_in_progress` | boolean | no more running repetitive task +8 | `sub4sum_in_progress` | boolean | no more running repetitive task +9 | `sub4sum_office_in_progress` | boolean | no more running repetitive task + +หัวเรื่องของ subsidy rate + + { + "_id": xx, + "year": "2013", + "name": "subsidy_rate_header", + "value": "xxxxxxxxxxx", + "user": "", + "username": "", + "date": "utc" + } + +อัตราตัดของการสนับสนุนตามการประมาณการของเรียนฟรี 15 ปี + + { + "_id": xx, + "year": "2013", + "name": "ms_est_first_level_cut", + "value": "xxxxxxxxxxx", # 0-1 (or 0-100%) [default 0.8] + "user": "", + "username": "", + "date": "utc" + } + +การบังคับใช้วันหมดอายุของนักเรียนพิการ + + { + "_id": xx, + "name": "enforce_disability_expiration_date", + "value": "true/false", # boolean + "user": "", + "date": "utc" + } + +การบังคับการตรวจสอบเลขประจำตัวประชาชนทั้งหมด +ถ้าเปิด true -- จะทำให้เลขประจำตัวประชาชนที่ผิดหลักและยังไม่ได้ตรวจสอบไม่ได้รับอุดหนุน +ถ้าปิด false -- เลขประจำตัวที่ผิดหลักและยังไม่ได้ตรวจสอบก็จะได้รับอุดหนุน + + { + "_id": xx, + "name": "enforce_people_id_validation", + "value": "true/false", # boolean + "user": "", + "date": "utc" + } + +## userPreferences + +ค่าต่างๆ ที่เกี่ยวกับ user โดยตรง + + { + "_id": xx, + "key": "logout_3rd_party_all_together", + "value": "True/False", + "user": "" + } + +จะเป็นค่าในกรณีที่ต้องการออกจากระบบของ Google/Yahoo ด้วย (Facebook ยังไม่ sign out เองอัตโนมัติ) เหมาะกับเครื่องที่ไม่ใช่ของตัวเองเพราะจะได้ไม่ sign in พวกนี้ค้างไว้ ถ้าออกจาก PSIS ก็ออกจาก Google/Yahoo ให้ด้วยทันที [ซึ่งนั่นคือค่า default] + +## userData + + { + "_id": xx, + "date": "utc", + "user": "", + "name": "", + "value": "", + } + +ตอนนี้จะเก็บเพียงแค่ task_id ซึ่งจะถูกลบหลังผ่านไป 2-3 วัน เพราะยังไง celery result task ก็ไม่มีเก็บหลังจากนั้นอยู่ดี + +name | value +--- | --- +task_id | diff --git a/_posts/2013-11-13-app-setup.md b/_posts/2013-11-13-app-setup.md new file mode 100644 index 0000000..8cda90d --- /dev/null +++ b/_posts/2013-11-13-app-setup.md @@ -0,0 +1,209 @@ +--- +layout: post +type: handbook +title: "PSISv2 Setup" +date: 2014-11-13 +tags: admin setup +--- + + +## การติดตั้งระบบ PSIS v2 + +ระบบ __PSIS v2__ นั้นจะรองรับเครื่องแม่ข่ายที่สามารถใช้งาน `Python` และฐานข้อมูล `PostgreSQL` หรือ `MySQL` หรือ `Oracle` ได้ แต่อย่างไรก็ดีเครื่องแม่ข่ายที่แนะนำในการใช้งานกับ __PSIS v2__ นั้นจะเป็นระบบปฏิบัติการใดๆ ก็ตามที่ทำงานบน Linux kernel ไม่ว่าจะเป็น Debian, Ubuntu, CentOS, RedHat, Arch ตามแต่ความถนัดของผู้ปฏิบัติการ ซึ่งเอกสารนี้จะใช้ระบบปฏิบัติการ Ubuntu 12.04 เป็นตัวอย่าง +ความต้องการของระบบ __PSIS v2__ + +* Python 2.7.x หรือใหม่กว่า +* PostgreSQL 9 หรือใหม่กว่า +* nginx 1.0.0 หรือใหม่กว่า + +## ขั้นตอนการติดตั้งระบบ PSIS v2 + +หลังจากติดตั้งระบบปฏิบัติการ Ubuntu 12.04 เรียบร้อยแล้ว จะต้องมีการติดตั้งโปรแกรมที่จำเป็นในการใช้งานของระบบ PSIS v2 ดังนี้ +ติดตั้งความพร้อมของระบบที่ต้องใช้เพิ่มเติมจากระบบปฏิบัติการ + + # apt-get update + # apt-get install postgresql mongodb nginx python python-pip git mercurial nodejs npm mysql-client + # npm install -g bower + + +## ติดตั้งส่วนของ PSIS v2 + +การติดตั้งส่วนนี้จะไม่มีหลักเกณฑ์ที่แน่นอนในการติดตั้ง แต่เอกสารนี้จะสิ่งที่เกี่ยวข้องกับโปรแกรมทั้งหมดใน `/opt/` เพื่อความสะดวกในการอธิบาย ซึ่งจะสามารถเปลี่ยนแปลงได้ตามความเหมาะสม + + # mkdir -p /opt/psis-v2/ + # cd /opt/psis-v2 + +ทำการคัดลอกไฟล์มายังไดเรกทอรี่นี้ + + # bzip2 -d psis-v2-app.bz2 + +จะได้ไดเรกทอรี่ `/opt/psis-v2/app/` เพิ่มขึ้นมาซึ่งเป็นส่วนของโปรแกรมนั้น จากนั้นจะต้องทำการสร้างไดเรกทอรี่แยกเพื่อให้เป็น root ของ `nginx` เพ่ื่อความปลอดภัยของไฟล์โปรแกรมหลัก + + # mkdir -p /opt/psis-v2/static/ + # ln -s /opt/psis-v2/app/static /opt/psis-v2/static + +สร้างไดเรกทอรี่สำหรับเก็บ log + + # mkdir -p /opt/psis-v2/log + +จากนั้นจะต้องลง `virtualenv` และ `virtualenvwrapper` โดยใช้คำสั่ง + + # pip install virtualenv virtualenvwrapper + +หลังจากลงโปรแกรมที่จำเป็นต่อระบบ จะยังต้องลง library ที่ PSIS v2 ใช้งานด้วย + + # apt-get build-dep python-mysqldb + # apt-get install graphviz libgraphviz-dev pkg-config + +และ + + $ cd /opt/psis-v2/ + $ pip install -r requirements.txt + $ bower install + +ถ้าไม่มี error อะไรก็จะเป็นการเสร็จสิ้นการติดตั้งเราสามารถทดสอบว่าใช้งานได้หรือไม่ด้วยคำสั่ง + + $ ./manage.py runserver + +เมื่อใช้งานได้แล้ว ก็สามารถปิดการทำสอบได้จาก ctrl+C + + +### ติดตั้งส่วนของ nginx + +หลังจากส่วนนี้ก็จะต้องทำการปรับแต่งค่าของ nginx เพื่อให้เป็น proxy server และ media server ของระบบ PSIS v2 + + # vim /etc/nginx/sites-available/psis + +โดยมีข้อมูลดังนี้ + + server { + listen 80; + server_name psisapp.com psis.opec.go.th; + + access_log /opt/psis-v2/log/nginx_access.log; + error_log /opt/psis-v2/log/nginx_error.log; + + root /opt/psis-v2/static/; + location ~* \.html$ { + expires -1; + } + location ~* \.(css|js|gif|jpe?g|png)$ { + expires 168h; + add_header Pragma public; + add_header Cache-Control "public, must-revalidate, proxy-revalidate"; + } + location /media/ { + # if asset versioning is used + if ($query_string) { + expires max; + } + } + location /static/ { + # if asset versioning is used + if ($query_string) { + expires max; + } + } + location / { + proxy_pass_header Server; + proxy_set_header Host $http_host; + proxy_redirect off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Scheme $scheme; + proxy_connect_timeout 15; + proxy_read_timeout 45; + proxy_pass http://localhost:8000/; + } + } + +จากนั้นจะต้องสร้าง symbolic link ไปยัง `/etc/nginx/sites-enabled/` เพื่อให้ `nginx` ได้ทำงานตามที่เราต้องการ + + # ln -s /etc/nginx/sites-available/psis /etc/nginx/sites-enabled/psis + +จากนั้นเราสามารถตรวจสอบว่าไฟล์ที่เราทำนั้นมีความถูกต้องหรือไม่จาก + + # service nginx configtest + +เมื่อตรวจสอบแล้วไม่พบข้อผิดพลาดใดๆ จะขึ้นว่า `Testing nginx configuration: nginx.` และจากนั้นก็สามารถทดสอบได้จากคำสั่ง + + # service nginx reload + + +### ติดตั้งส่วนฐานข้อมูล + +ระบบ PSIS v2 นั้นจะใช้ฐานข้อมูล 2 ชนิดด้วยกันคือ + + PostgreSQL ซึ่งจะเป็นฐานข้อมูลหลักสำหรับข้อมูลปัจจุบันทั้งหมด + MongoDB ใช้สำหรับเก็บข้อมูลที่ได้ประมวลผลแล้ว + +__PostgreSQL__ + +หลังจากติดตั้งไปแล้วในส่วนติดตั้งเพื่อความพร้อมของระบบปฏิบัติการ การเปิดใช้งานก็จะใช้คำสั่งง่ายๆ คือ + + # service postgresql start + +__MongoDB__ + +หลังจากติดตั้งไปแล้วในส่วนติดตั้งเพื่อความพร้อมของระบบปฏิบัติการ การเปิดใช้งานก็จะใช้คำสั่งง่ายๆ คือ + + # service mongodb start + + +### ติดตั้งส่วน upstart + +ในส่วนนี้จะเป็นส่วนที่ทำให้เราสามารถเปิดปิดการทำงานของระบบ PSIS v2 ได้โดยคำสั่งง่ายๆ ดังนี้ + + # start psis_app + # stop psis_app + +ส่วนที่เกี่ยวข้องสำหรับ `upstart` นั้นจะมี 2 ส่วน คือ script สำหรับเรียก `gnuicorn` และ `upstart` script ของระบบปฏิบัติการในไดเรกทอรี่ /etc/init/ + +ส่วนแรก คือ ส่วนไฟล์สคริปสำหรับ `gunicorn` คือ แอปพริเคชันสำหรับเรียกใช้งาน `wsgi` โดยสร้าง bash script ดังนี้ + + # vim /opt/psis-v2/run_app.sh + +โดยจะมีรายละเอียดดังนี้ + + #!/bin/bash + set -e + LOGFILE=gunicorn_django.log + LOGDIR=$(dirname $LOGFILE) + NUM_WORKERS=3 #recommended formula here is 1 + 2 * NUM_CORES + + VENV_DIR=/home/psisapp/.virtualenvs/psis + DJANGO_DIR=/opt/psis-v2/app + #we don't want to run this as root.. + USER=psisapp + GROUP=psisapp + + cd $DJANGO_DIR + source $VENV_DIR/bin/activate + test -d $LOGDIR || mkdir -p $LOGDIR + + #exec gunicorn_django -w $NUM_WORKERS -b 0.0.0.0:8000 + exec gunicorn core.wsgi:application -w $NUM_WORKERS -b 0.0.0.0:8000 + --log-level=debug + --log-file=$LOGFILE 2>>$LOGFILE + --user=$USER --group=$GROUP + +ในส่วนของไฟล์ `upstart` จะต้องสร้างไฟล์ `psis_app.conf` + + # vim /etc/init/psis_app.conf + +โดยจะมีรายละเอียดเป็นดังนี้ + + description "PSIS v2 Application" + start on runlevel [2345] + stop on runlevel [06] + respawn + respawn limit 10 5 + exec /opt/psis-v2/run_app.sh + +ข้างต้นจะเป็นวิธีทั้งหมดในการติดตั้งระบบ PSIS v2 เพื่อให้ใช้งานได้จากคำสั่ง 2 คำสั่งง่ายๆ + + $ sudo start psis_app + $ sudo stop psis_app + +ซึ่งในการใช้งานจริงอาจจะใช้ `crontab` โดย root เพื่อทำให้ระบบ PSIS v2 ทำงานได้อัตโนมัติ เช่น + + @reboot start psis_app diff --git a/_posts/2013-12-19-pdf-styling.md b/_posts/2013-12-19-pdf-styling.md new file mode 100644 index 0000000..830cac6 --- /dev/null +++ b/_posts/2013-12-19-pdf-styling.md @@ -0,0 +1,174 @@ +--- +layout: post +type: handbook +title: "PDF Styling" +date: 2013-12-19 +tags: coding +--- + +จะมี style คร่าวๆ ให้ได้จัดการปรับแต่งกันเอง (โดยเฉพาะตำแหน่งการวาง ชิดซ้าย กลาง ชิดขวา) ใน core.views.pdfs ซึ่งจริงๆแล้วก็จะแบ่งมาตรฐานเป็น 2 ส่วน คือ + +* `Paragraph` -- กำหนดด้วย `ParagraphStyle` +* `Table` -- กำหนด style ด้วย `style_tab` (แต่ต้องใส่เองทั้งหมด) + +## Paragraph + +ในส่วนนี้จะเป็นการกำหนด style คร่าวๆ เพื่อให้เป็นแนวทางหลักในการใช้งานทั้งหมด โดยมีทั้งหมดดังนี้ + +1. `style_base` - อันนี้เอาไว้เป็น parent style เฉยๆครับ เพราะมีกำหนดแค่รูปแบบตัวอักษรเป็น TH Sarabun +1. `style_h1` - ขนาด font 18 ตัวหนา พร้อมมี space บนล่างตามเหมาะสม +1. `style_h1c` - อันนี้คือ `h1` แต่ตั้ง align เป็น center ครับ +1. `style_h2` - ขนาด font 16 ตัวหนา พร้อมมี space บนล่างตามเหมาะสม +1. `style_h2c` - อันนี้คือ `h2` แต่ตั้ง align เป็น center ครับ +1. `style_h3` - ขนาด font 14 ตัวหนา พร้อมมี space บนล่างตามเหมาะสม +1. `style_h3c` - อันนี้คือ `h2` แต่ตั้ง align เป็น center ครับ +1. `style_normal` - ขนาด font 14 ไม่มี space บนล่าง ไม่มีย่อหน้า +1. `style_normal_indent` - เหมือน `style_normal` แต่มีย่อหน้าของบรรทัดแรกเข้าไป 4 space ครับ +1. `style_footnote` - อันนี้สำหรับอธิบายใต้ตารางครับ ตัวเล็กๆ 12 ไม่มี space บนล่าง ไม่มีย่อหน้า + +หรือจะเป็น code ก็ตามด้านล่างนี้ + + style_base = ParagraphStyle('normal', parent=style_base_sample, + fontName='TH Sarabun New') + style_h1 = ParagraphStyle('h1', parent=style_base, + fontName='TH Sarabun New Bold', + fontSize=18, + leading=21, + spaceBefore=7, spaceAfter=8,) + style_h1c = ParagraphStyle('h1c', parent=style_h1, + alignment=TA_CENTER,) + style_h2 = ParagraphStyle('h2', parent=style_base, + fontName='TH Sarabun New Bold', + fontSize=16, + leading=19, + spaceBefore=7, spaceAfter=8,) + style_h2c = ParagraphStyle('h1c', parent=style_h2, + alignment=TA_CENTER,) + style_h3 = ParagraphStyle('h2', parent=style_base, + fontName='TH Sarabun New Bold', + fontSize=14, + leading=17, + spaceBefore=7, spaceAfter=8,) + style_h3c = ParagraphStyle('h1c', parent=style_h3, + alignment=TA_CENTER,) + style_normal = ParagraphStyle('normal', parent=style_base, + fontSize=14, + leading=17,) + style_normal_indent = ParagraphStyle('normal', parent=style_normal, + firstLineIndent=16) + style_footnote = ParagraphStyle('footnote', parent=style_base, + fontSize=12, + leading=15,) + +การใช้งานจะสามารถ import ได้ประมาณนี้ + + from core.views.pdfs import style_h1, style_h1c, style_normal + +style พวกนี้อาจจะตอบคำถามไม่ได้หมด เช่น ตัวชิดขอบซ้าย ขอบขวาจะทำอย่างไร แนะนำให้ทำตามนี้เพื่อให้ code ดูสะอาดและจัดการง่ายที่สุดครับ เช่น กรณีเราต้องการส่วนที่พิมวันที่ซึ่งจะมีขนาดตามปกติ (`style_normal`) แต่มันจะต้องชิดขอบขวา ก็จะสามารถทำได้โดยสร้าง style ของตัวเองเป็น + + style_normal_right = ParagraphStyle('nr', parent=style_normal, alignment=TA_RIGHT,) + +ตอนนี้เราก็จะได้ style ที่ชิดขวามาแล้วโดยที่เราไม่ได้กำหนดรูปแบบตัวอักษรเองเลย เพียงแค่กำหนดว่าให้มันชิดฝั่งไหนก็พอตรง `alignment=TA_RIGHT` ส่วนในเรื่องของย่อหน้านั้นจะมี 2 เรื่องที่ต้องรู้คือ + +1. `firstLineIndent` อันนี้จะคือ จะให้ย่อหน้าเท่าไหร่สำหรับบรรทัดแรก แล้วบรรทัดอื่นก็จะกลับมาชิดซ้ายสุดเหมือนเดิม +1. `leftIndent` จะเป็นการเลื่อนตำแหน่งขอบซ้ายทั้งย่อหน้า เหมือนอารมณ์ใช้กับ list ที่เป็นข้อๆ มันจะไม่ล้นไปซ้ายสุดขอบกระดาษ แต่เป็นการกำหนดว่า เลื่อนขอบซ้ายทั้ง `Paragraph` +1. หน่วยของค่าที่ใช้สำหรับ 2 ตัวนี้ ก็ไม่แน่ใจเหมือนกันว่า คืออะไรครับ แต่ 4 คือ เท่ากับ 1 ตัวอักษร หรือถ้าต้องการ 4 space ก็จะต้องใช้ `firstLineIndent=16` เป็นต้น + +ทั้งสองอันนี้สามารถใช้ร่วมกันได้ครับ ไม่มีปัญหาอะไร + +ส่วนหนึ่งที่ผมคิดว่า น่าจะมีปัญหาคือ ความสูงระหว่าง `Paragraph` หรือ `spaceBefore` และ `spaceAfter` ทาง style ข้างต้นจะมีการกำหนดเพียงแค่ส่วนของ `style_h1`, `style_h1c`, `style_h2`, `style_h2c`, `style_h3`, `style_h3c` แต่ในส่วนของ `style_normal` จะไม่ได้กำหนดไว้ ดังนั้นจะสามารถเลือกได้เองว่าจะทำ style ใหม่เพื่อเพิ่มในส่วนนี้ หรือว่าจะใช้ Spacer ก็ได้ + +### Spacer + +เป็นแค่ตัวว่างเปล่าไว้กำหนดความสูง + + from core.views.pdfs import Spacer + +เวลาใช้ก็ + + lst.append(Spacer(1, 0.2*inch)) + +ก็จะได้พื้นที่ว่างระหว่างตัวบนกับตัวล่างมาแล้ว 1/5 ของ 1 นิ้ว + +## Table + +ส่วนของ Table นั้น ไม่สามารถตั้งมาตรฐานได้อย่างชัดเจน การกำหนดมาตรฐานคร่าวๆ ของตารางก็จะเป็น (1) การบังคับความกว้างของตารางและ (2) style ก็จะมีการกำหนดขนาดแบบ font, สี +ความกว้างของตาราง + +เท่าที่ดูจะต้องมีการทำกระดาษแบบ landscape ด้วย แต่ไว้สรุปในเวลาต่อไป ตอนนี้ก็เป็นมาตรฐานแนวตั้งไปก่อน + +1. ตารางกว้างได้สูงสุด 6.8" แนวตั้ง ส่วนแนวนอนยังไม่ได้รองรับในขณะนี้ +1. ตารางมีขนาดได้ตั้งแต่ 5.8" - 6.8" เท่านั้น เว้นแต่จะได้รับการยอมรับแล้ว +1. รวมทั้งส่วนของลายเซ็นก็เช่นกัน จะต้องเป็น table กว้างไม่ <= 6.8" +1. ในกรณีที่ในรายงานมีหลายตารางในหน้าเดียวกัน ความกว้างของรายงานจะต้องมีความกว้างเท่ากันทั้งหมด แม้ว่าจะมีจำนวน column ไม่เท่ากัน หรืออย่างไรก็ตามครับ ก็ปรับให้มันเท่ากันซะ + +#### การกำหนดขนาดของ Table + +จากเดิมที่รูปแบบจะเป็น + + t = Table(data, style=xxxxxxxxx) + +ก็จะมีตัวแปรเพิ่มขึ้นมาเป็น + + t = Table(data, + colWidths=[0.25*inch, 1.25*inch, 2.0*inch, 1.25*inch, 1.25*inch, 1.0*inch], + style=xxxxxxxxx + ) + +หรือจะใช้เป็น + + t = Table(data, + colWidths=[0.25*inch, 1.25*inch, 2.0*inch, 1.25*inch, 1.25*inch, 1.0*inch] + ) + t.setStyle(TableStyle(xxxxxx)) + +จะสังเกตเห็นได้ว่า `colWidths` มีการกำหนดตัวเลขชัดเจน เป็นความกว้างของตารางทั้งหมด (กำหนดด้วยบรรทัดที่มี column มากที่สุด ส่วนเรื่อง SPAN มันจัดการให้ตรงกับความกว้างเองครับ) สิ่งที่อธิบายได้คือ ความกว้างของตารางทั้งหมดคือ 0.25 + 1.25 + 2 + 1.25 + 1.25 + 1 = 7 แสดงว่า ตารางนี้มีความกว้างเกินที่กำหนดไว้ (จริงๆแล้วมันคือ กว้างเกินส่วนของ Paragraph จากซ้ายถึงขวาด้วย มันจะไม่สวยครับ) จะต้องแก้ไขให้ได้ 6.8 หรือน้อยกว่า เช่น 0.25 + 1.25 + 2 + 1.15 + 1.15 + 1 = 6.8 ให้ได้เท่ากับ 6.8 + + +#### การกำหนด style + +ส่วนนี้จะขึ้นกับตัวแปร style_tab + + from core.views.pdfs import style_tab + +ส่วนการใช้งานแทนที่จะเขียนลงไปชัดเจนในส่วนของ fontface, fontsize ก็จะกลายเป็น + + number_table_style = [ + ('FONTNAME', (0,0), (-1,-1), style_tab['font']), + ('INNERGRID', (0,0), (-1,-1), 0.5 , style_tab['header_bg']), + ('FONTSIZE', (0, 0), (-1, -1), 13), + ('BOTTOMPADDING', (0, 0), (-1, -1), 4), + ('FONTNAME', (0,0), (8,2), style_tab['header_font']), + ('ALIGN',(1,4),(-1,-1),'LEFT'), + ('ALIGN',(2,4),(-1,-1),'RIGHT'), + ('BACKGROUND',(0,0),(8,2), style_tab['header_bg']), + ('SPAN',(0,0),(0,2)), + ('ALIGN',(0,0),(0,2),'CENTER'), + ('VALIGN',(0,0),(0,2),'MIDDLE'), + ('SPAN',(1,0),(1,2)), + ('ALIGN',(1,0),(1,2),'CENTER'), + ('VALIGN',(1,0),(1,2),'MIDDLE'), + ('SPAN',(-7,0),(-2,0)), + ('ALIGN',(-7,0),(-2,0),'CENTER'), + ('SPAN',(8,0),(8,2)), + ('ALIGN',(8,0),(8,2),'CENTER'), + ('VALIGN',(8,0),(8,2),'MIDDLE'), + ('SPAN',(2,1),(4,1)), + ('ALIGN',(2,1),(4,1),'CENTER'), + ('SPAN',(5,1),(7,1)), + ('ALIGN',(5,1),(7,1),'CENTER'), + ('SPAN',(0,3),(8,3)), + ('SPAN',(0,-1,),(1,-1)), + ('FONTNAME', (0,-2), (8,-1), style_tab['header_font']), + ('LINEABOVE', (0,0), (-1,-1), 0.5 , style_tab['header_bg']), + ('LINELEFT', (0,0), (-1,-1), 0.5 , style_tab['header_bg']), + ('GRID', (0,0), (-1,-1), 0.5 , style_tab['grid_color']), + ] + +จะสังเกตได้ว่า `style_tab` จะไปทดแทนการกำหนดสีพื้น, สี border, fontface, fontsize ทั้งหมดจากเดิมที่จะใช้ `colors.grey`, 'TH Sarabun New' เป็นต้น สิ่งที่สามารถเรียกได้จาก `style_tab` คือ + +* `style_tab['font']` -- คือ font ปกติในตาราง +* `style_tab['header_font']` -- คือ font ตัวหนา +* `style_tab['header_bg']` -- คือ สีพื้นของหัวตาราง (สีเทา) +* `style_tab['fontsize']` -- คือ ขนาด font +* `style_tab['grid_color']` -- คือ สีของ border ของตาราง diff --git a/_posts/2013-12-23-auto-people-id.md b/_posts/2013-12-23-auto-people-id.md new file mode 100644 index 0000000..cf8ec3a --- /dev/null +++ b/_posts/2013-12-23-auto-people-id.md @@ -0,0 +1,19 @@ +--- +layout: post +title: "เลขประจำตัวประชาชนอัตโนมัติ" +date: 2013-12-23 +tags: people_id +--- +เลขอัตโนมัติสำหรับบุคคลที่ไม่มีเลข 13 หลัก ระบบจะสร้างเลขอัตโนมัติขึ้นตามนี้ เพื่อป้องกันโอกาสที่จะเกิดเลขซ้ำซ้อนขึ้น + + if this returns auto, then we make up people_id for the system. + Pxx1387767388 (13-char ID) + | | | + | | -- UTC UNIX Timestamp (it should be 10-digit for a while) + | -------- first digits of sha1(school_id) + | > this should make it more immune to duplicate + ---------- P -- showing that it's AUTO people_id + + This way -- It's not possible to have a duplicate ID.. + time machine isn't existed yet. + diff --git a/_posts/2014-11-04-errorcode.md b/_posts/2014-11-04-errorcode.md new file mode 100644 index 0000000..8e6f54d --- /dev/null +++ b/_posts/2014-11-04-errorcode.md @@ -0,0 +1,24 @@ +--- +layout: post +title: "PSISv2 Error Code" +date: 2014-11-04 +tags: error +--- + +Error definitions are as following: + +* `4A0G` school.report.miscsupport + * calculate_actual_support + * there is no ms_actual +* `4A1G` school.report.miscsupport + * get_actual_for + * Blank student queryset +* `4E0G` school.report.miscsupport + * get_estimated_for + * Blank student queryset +* `5B0P` school.views.classrooms.ClassroomOperations post() + * delete command on student -- normally impossible case +* `9A1G` people.views.PeopleSyncView get() +* `9A1P` people.views.PeopleSyncView post() +* `9A2G` people.views.PeopleExporter get() +* `9A2P` people.views.PeopleExporter post() diff --git a/_posts/2014-11-10-admin-command.md b/_posts/2014-11-10-admin-command.md new file mode 100644 index 0000000..a53828a --- /dev/null +++ b/_posts/2014-11-10-admin-command.md @@ -0,0 +1,70 @@ +--- +layout: post +type: handbook +title: "Admin Commands" +date: 2014-11-10 +tags: command admin +--- +These are checklist admin needs to get done. + +* [ดึงข้อมูลจาก PSIS v1](#psis-v1) +* [คำสั่งตรวจสอบปัญหาต่างๆ](#section) +* [คำสั่งเก็บประมวลผลข้อมูล](#section-1) +* [คำสั่งอื่นๆ](#section-2) + + +## ดึงข้อมูลจาก PSIS v1 + +เริ่มกันที่คำสั่งสำหรับการดึงข้อมูลเก่าเลย หลักการคล้ายกัน คือ กำหนด `school_id` ได้ตามชอบใจ ถ้าไม่ครบมันจะ search ด้วยรหัสที่พิมลงไปเป็นตัวเริ่มต้น + +* `$ ./manage.py ` + +อันนี้คือจัดการของโรงเรียนที่ต้องการ + +* `$ ./manage.py 1010` + +อันนี้คือจัดการของโรงเรียนที่มีรหัสโรงเรียนขึ้นต้นด้วย `1010` ทั้งหมด + +* `$ ./manage.py all` + +อันนี้คือจัดการของทุกโรงเรียน ซึ่งไม่แนะนำเลยเพราะแยกเป็นหลาย process จะเร็วกว่ามากนัก + +คำสั่งที่มีของชุดนี้คือ + +* `import_v1_bank` +* `import_v1_class_rel` +* `import_v1_classroom` +* `import_v1_employee` +* `import_v1_sinfo` +* `import_v1_student` +* `import_v1_address` +* `import_v1_people` + +เพื่อที่จะให้ได้ข้อมูลของโรงเรียนที่สมบูรณ์นั้น จะต้องทำตามคำสั่งต่อไปนี้ + +* `import_v1_people` +* `import_v1_student`, `import_v1_employee`, `import_v1_classroom` +* `import_v1_sinfo`, `import_v1_address`, `import_v1_bank`, `import_v1_class_rel` + +โดยในข้อเดียวกันลำดับไม่มีความสำคัญ จะเริ่มอันไหนก่อนก็ไม่มีปัญหา การนำเข้าข้อมูลนั้น โดยมากจะมีการลบข้อมูลในระบบ PSISv2 ก่อนเสมอ ก่อนที่จะนำเข้าใหม่ ดังนั้น เมื่อมีการเปลี่ยนแปลงข้อมูลใน PSISv2 แล้ว ก็ไม่ควรที่จะใช้การนำเข้าแบบนี้อีกเลย + + +## คำสั่งตรวจสอบปัญหาต่างๆ + +* `check_teacher_issue` +* `check_student_issue` + + +## คำสั่งเก็บประมวลผลข้อมูล + +* `run_misc_support` -- ข้อมูลเริ่มต้นสำหรับอุดหนุนทางการศึกษา +* `db_builder` -- บังคับให้ระบบประมวลผลเงินอุดหนุนเรียนฟรี 15 ปี (เพื่อจะได้มีการแสดงผลในส่วนของสำนักงาน ไม่เช่นนั้นจะต้องรอให้โรงเรียนเปิดรายงานก่อน) +* `mongo_report` -- รายงาน อน. และเงินเดือน +* `mongo_stat` -- สถิติในส่วนใหญ่ใน _TOR ข้อ 4.3_ +* `mongo_yearly_stat` -- สถิติที่ URL เริ่มต้นด้วย `/yrly/` +* `archive_students_transfer` -- [**] จำเป็นต้องสั่งทำงานวันแรกของเดือน เพื่อความถูกต้องของระบบ + +## คำสั่งอื่นๆ + +* `backfill_reviews` -- ทำงานโดยการใส่ review record ไว้สำหรับข้อมูลที่จำเป็นต้องมีการตรวจสอบ +* `prefix_filler` -- ใส่เพศให้กับ record ที่ยังไม่มีใช้เพื่อความถูกต้องของข้อมูล Statistics เท่านั้น (เท่าที่คิดออก) diff --git a/_posts/2014-11-10-admin-todo-list.md b/_posts/2014-11-10-admin-todo-list.md new file mode 100644 index 0000000..de0f738 --- /dev/null +++ b/_posts/2014-11-10-admin-todo-list.md @@ -0,0 +1,113 @@ +--- +layout: post +type: handbook +title: "Todo List" +date: 2014-11-10 +tags: todo admin +--- +These are checklist admin needs to get done. + +* [On June 10](#june-10) +* [At the beginning of the month](#at-the-beginning-of-the-month) +* [On Nov 10](#november-10) +* [On Feb 15](#february-15) +* [At the end of Febuary](#at-the-end-of-febuary) + + +### June 10 + +* backup PostgreSQL +* backup and tar MongoDB +* cleanup everything first (should take < 10 mins for all) + * `backfill_reviews` + * `check_student_issue` + * `check_teacher_issue` + * `archive_issues` + * `cleanup_glitches` +* `mongo_report --date=20xx0610 --report=yearly` + * It's much better to have 1, 2, 3, ..., 9 separately (much faster) +* `run_misc_support --date=20xx0610` + * it's also a good idea to separate into 1, 2, 3, 4, 5, ..., 9 or it could take > 5 hours to finish + * with i5 & SSD, 9 takes little over 1:30 hour +* `mongo_yearly_stat --date=20xx0610 all` + +Pre-compile report for office + +on `/office/opec/stat/` & `/misc_support/` (on ztokyo3 contained enough tools) + +* `staticsitegen` + * don't forget to change code for `Jun10Renderer` & `MiscSupportJun10Renderer` + * `MiscSupportJun10Renderer` alone takes roughly 35 mins on i5 and SSD +* `./toolkit/__meduza_cleanup.sh` +* `~/bin/sync_psis_meduza.sh` +* double check if data is there, + * `/office/opec/stat/` + * `/misc_support/` แบบสรุปเบิกจริง + * `/misc_support/` ภาคเรียนที่ 1, PDF + +### At the beginning of the month + +If it's March 1st, there is an extra work below. + +* backup PostgreSQL +* backup and tar MongoDB +* cleanup everything first (should take < 10 mins for all) + * `backfill_reviews` + * `check_student_issue` + * `check_teacher_issue` + * `archive_issues` + * `cleanup_glitches` +* `mongo_report --date=20xxyy01 --report=monthly` + * It's much better to have 1, 2, 3, ..., 9 separately (much faster) +* visit `/sub4sum/` page to invoke + * `sub4sum` + * `sub4sum_office` +* `archive_students_transfer` - This usually throws 100k tasks to Celery which takes > 5 hours to complete. + + + +### November 10 + +The process is simple, but it takes time to get jobs done. + +* backup PostgreSQL +* backup and tar MongoDB +* `run_misc_support --date=20xx1110` + * it's a good idea to separate into 1, 2, 3, 4, 5, ..., 9 or it could take > 5 hours to finish + * processed on tokyo1 & 3 simultaneously took only < 15 mins to get all things done + * note load distributes throughout every app & DB servers. No hard hit at all. That's why it runs smoothly fast here. +* `mongo_report --date=20xx1110 --report=ms_nov10` + * 1 takes less than 10 minutes to complete (most work are done in run_misc_support already. + * note this does take its toll on ztokyo2 though. DB server gets hit hard at 100% every cores. Thus, it's oddly taking longer than run_misc_support in production. + +Pre-compile report for office on `/misc_support/` too. (on ztokyo3 contained enough tools) + +* staticsitegen -- don't forget to change code for Nov10Renderer + * This takes > 1:15 to finish on i5 & SSD; meduza is a blocking single process, so it doesn't get any better on ztokyo3, 1:35 it took on Nov 10, 2014 +* `./toolkit/__meduza_cleanup.sh` +* `~/bin/sync_psis_meduza.sh` +* double check if data is there, + * แบบสรุปเบิกจริง 10 พย. + * ภาคเรียนที่ 2, PDF + +### February 15 + +* backup PostgreSQL +* backup and tar MongoDB +* make sure ms_rate is fulfilled +* `mongo_report --date=20xx0215 --report=ms_feb15` + +Pre-compile report for office on `/misc_support/` too. (on ztokyo3 contained enough tools) + +* staticsitegen -- don't forget to change code for Feb15Renderer +* `./toolkit/__meduza_cleanup.sh` +* `~/bin/sync_psis_meduza.sh` +* double check if data is there, + * สรุปขอเบิกประมาณการ + +### At the end of Febuary + +This is an extra work from **at the beginning of the month** + +* `mongo_yearly_stat --date=20xx0215 all` + * It's much better to have 1, 2, 3, ..., 9 separately (much faster) diff --git a/handbook.md b/handbook.md new file mode 100644 index 0000000..dd56562 --- /dev/null +++ b/handbook.md @@ -0,0 +1,27 @@ +--- +layout: page +title: "Handbook" +date: 2014-12-12 +tags: +--- + +* [Admin Todo List][todolist] +* [Admin Commands][command] +* [Setup][setup] +* [Milestone][milestone] +* [psisRecord][psisrecord] +* [PDF styling][pdfstyling] +* [ReportLab 101][reportlab] + + + + + + +[todolist]: /2014/11/admin-todo-list +[setup]: /2014/11/app-setup +[command]: /2014/11/admin-command +[milestone]: /2013/10/milestone +[psisrecord]: /2013/11/psis-record +[pdfstyling]: /2013/12/pdf-styling +[reportlab]: /2013/10/reportlab-101 diff --git a/index.html b/index.html index b342ba3..420fb42 100644 --- a/index.html +++ b/index.html @@ -5,10 +5,12 @@ layout: default
    {% for post in site.posts %} + {% if post.type != 'handbook' %}
  • {{ post.title }}
  • + {% endif %} {% endfor %}