ตรวจสอบข้อมูลบนหน้าเอกสารด้วยโมดูล Base Exception

ระหว่างที่กำลังทำ Code Review ให้กับโมดูลใน OCA ได้เห็นโมดูลชุดนึงชื่อแปลกๆเช่น base_exception, purchase_exception, sale_exception เพิ่งจะได้มีโอกาสมารีวิวรู้สึกว่ามันเจ๋งดีเลยอยากเอามาแชร์

เป็นเหมือนกันไม๊ครับ เวลาทำระบบให้ลูกค้า ลูกค้ามักจะขอให้เพิ่มการตรวจสอบค่าต่างๆบนหน้าเอกสารต่างๆก่อนการยืนยัน  ยากบ้าง ง่ายบ้าง เช่น ให้ Purchase Order ต้องมีการใส่วันกำหนดส่งเสมอ, Sales Order ให้ช่วยเตือนหากเผลอบันทึกราคาเป็นศูนย์ หรือให้ช่วยเช็คด้วยว่า Partner ที่เลือกมีตั้ง email ไว้หรือไม่

ซึ่งการตรวจสอบเหล่านี้เป็นหนึ่งในเรื่องที่เราต้องเขียนโค้ดเพิ่มเติม อาจเขียน Python และ raise ValidationError เมื่อทดสอบไม่ผ่าน หรือเขียนปรับ View ให้ required=True และอื่นๆอีก บ่อยครั้งที่ logic เหล่านี้กระจัดกระจายไปตามโมดูลต่างๆที่เราเขียนเพิ่ม

** ไม่นับว่าการ raise Exception เหล่านี้จะทำให้เกิดปัญหาในการ import ข้อมูลเข้าระบบด้วย เพราะมันจะไม่ผ่านการ Import Check ตั้งแต่ต้น

ซึ่งโมดูลที่ผมกำลังจะเล่าให้ฟังนี้น่าจะช่วยแก้ปัญหานี้ได้โดยตรง เราไปทดสอบพร้อมๆกันเลยครับ

สมมุติผมต้องการจัดการการ Validation บนหน้าต่าง Purchase Order โมดูลที่ผมต้องใช้คือ

  • base_exception :: abstract module สำหรับ extend ไปยังโมเดลต่างๆ
  • purchase_exception :: extend base_exception สำหรับ purchase.order, purchase.order.line

Note: โหลดได้จาก https://odoo-community.org/shop

การตั้งค่า

หลังจากติดตั้งแล้วให้ไปที่เซตสิทธิ์ผู้ใช้งานเป็น Exception Manager แล้วเข้าไปที่ Menu: Settings > Technical > Exception Rules

Exception Rules จะมีตัวอย่างให้ 2 rules โดยเราสามารถเพิ่มได้เองภายหลัง

โดยการเซต Rule เราสามารถทำได้ทั้งแบบกำหนด Domain (เช่น [(‘product_qty’, ‘<‘, 0)]) หรือเขียนเป็น python code ซึ่งจะยืดหยุ่นมากกว่า

ตัวอย่างเช่น Quantity not negative คือไม่ต้องการให้ Quantity บน Purchase Order Line ติดลบ ตัวอย่างนี้ใช้ Python code

การใช้งาน

ถึงตอนใช้งาน สมมุติเราสร้าง Purchase Order โดยใส่ Quantity แบบติดลบ และเลือก Partner ที่ยังไม่เซต email เมื่อทำการ Confirm Order ระบบจะแสดงปัญหาทั้งหมดที่ตรวจสอบเจอ

หากเลือกปล่อยผ่านด้วย Ignore Exception เอกสารนี้ก็จะถูก Confirm ได้ตามปกติ แต่ถ้าไม่ปล่อยผ่าน เอกสารนี้ก็จะยังค้างอยู่ที่ Draft และมีการขึ้นคำเตือนให้ที่หน้าเอกสาร ทั้งบน Form และ List View ซึ่งจะสะดวกสำหรับการมาปรับแก้ในภายหลังอีกด้วย

เป็นไงครับ กับโมดูลเล็กๆจาก OCA ที่น่าจะมีประโยชน์ไม่น้อยทีเดียว ผมคงต้องลองเอาไปใช้ในโปรเจคที่จะทำบ้างแล้ว น่าจะช่วยประหยัดเวลา และให้งานเป็นระเบียบได้ดีเลยครับ 🙂

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *