สัญญาบริการ: กระบวนการทำงาน¶
สถานะตลอดวงจรชีวิต¶
draft ─── date_start ≤ today ≤ date_end ───► active
│ │
│ date_end < today │
▼ ▼
cancelled ◄─── manual only (sticky) expired
สี่สถานะ การเปลี่ยนผ่านอัตโนมัติสองแบบ การเปลี่ยนด้วยตนเองหนึ่งแบบ
| สถานะ | ตั้งโดย | ความหมาย |
|---|---|---|
draft | การคำนวณเริ่มต้น (และการรีเซ็ตด้วยตนเอง) | สัญญาในอนาคตหรือไม่สมบูรณ์ |
active | cron รายวัน + การคำนวณเริ่มต้น | อยู่ในช่วงความถูกต้อง |
expired | cron รายวัน + การคำนวณเริ่มต้น | เลย date_end แล้ว |
cancelled | การกระทำของผู้ใช้เท่านั้น | ยุติก่อนกำหนด; ยึดติด |
การร่างสัญญา¶
- Maintenance → Service Contracts → :guilabel:
New - กรอก Name, Vendor, Contract Type, Date Start, Date End
- เพิ่ม Equipment ในแท็บ Equipment
- เพิ่มบรรทัด Coverage ต่อการซ่อมบำรุงแต่ละประเภท
- บันทึก — สัญญาจะได้รับเลขอ้างอิง (
SC/YYYY/NNNNN) และ สถานะจะคำนวณจากวันที่
เครื่องมือแพทย์รายการเดียว → ผู้ขายกรอกอัตโนมัติ
หากคุณเพิ่มเครื่องมือแพทย์เพียงรายการเดียวลงในสัญญาใหม่ขณะที่ฟิลด์ Vendor ว่าง assigned_partner_id ของเครื่องมือแพทย์จะ กรอกให้โดยอัตโนมัติ
การเปิดใช้งาน¶
มีสองเส้นทางการเปิดใช้งาน:
เส้นทางที่ 1 — อัตโนมัติ (cron รายวัน)¶
หาก date_start ≤ today ≤ date_end เมื่อบันทึกสัญญา การคำนวณ เริ่มต้นจะตั้งสถานะเป็น active ทันที cron รายวันจะ ประเมินสัญญาทุกฉบับใหม่วันละครั้งเพื่อให้ฉบับร่างที่วันที่เริ่ม มาถึงภายหลังได้รับการเลื่อนสถานะโดยไม่ต้องดำเนินการ
เส้นทางที่ 2 — ด้วยตนเอง¶
คลิกสถานะใด ๆ บนแถบสถานะเพื่อกระโดดไปยังสถานะนั้นโดยตรง — มีประโยชน์ สำหรับการลงวันที่ย้อนหลังของสัญญาหรือการคืนสัญญาที่ยกเลิกกลับเป็นร่าง
พฤติกรรมแบนเนอร์ความครอบคลุม¶
เมื่อ maintenance.request ถูกเปิดบนเครื่องมือแพทย์ที่อยู่ในความครอบคลุม แบนเนอร์ จะปรากฏเหนือชื่อพร้อมข้อความที่เป็นไปตามเมทริกซ์นี้:
| มีสัญญาบนเครื่องมือแพทย์? | ประเภทบนคำขอ? | ครอบคลุม? | เรียกเก็บได้? | แบนเนอร์ |
|---|---|---|---|---|
| ❌ | — | — | True | ⚠ อยู่นอกสัญญา — โรงพยาบาลชำระ |
| ✅ | ❌ | n/a | True | ✅ ครอบคลุมโดย SC/X — โรงพยาบาลต้องชำระ |
| ✅ | ✅ | ❌ | True | ⚠ ครอบคลุมโดย SC/X แต่ประเภทไม่อยู่ในความครอบคลุม |
| ✅ | ✅ | ✅, billable=True | True | ✅ ครอบคลุมโดย SC/X — โรงพยาบาลต้องชำระ |
| ✅ | ✅ | ✅, billable=False | False | ✅ ครอบคลุมโดย SC/X (ผู้ขาย) — ผู้ขายชำระ |
สัญญาที่เลือกสำหรับคำขอคือ roots_active_contract_id ของเครื่องมือแพทย์ — สัญญาที่ใช้งานอยู่ล่าสุดตาม date_start หากสัญญาสองฉบับ ครอบคลุมเครื่องมือแพทย์เดียวกันด้วยช่วงเวลาที่ทับซ้อน สัญญาที่ เริ่มใหม่กว่า จะชนะ ช่างเทคนิคสามารถแทนที่ด้วยตนเองได้
กระบวนการต่ออายุ¶
date_end - 60d date_end date_end + 1
│ │ │
▼ ▼ ▼
Alert On Renewal target Auto-expire
│ │ │
└─ cron fires ├─ procurement └─ state=expired
mail.activity │ finalises renewal cron sets
on Responsible │ (extends contract roots_renewal_
+ sets │ or signs new one) alerted intact
roots_renewal_ │
alerted=True │
▼
┌──────────────┐
│ Option A │ Option B
│ Extend │ Replace
│ existing │ with new
│ contract │ contract
│ │
│ Edit dates, │ Create new
│ reset │ contract,
│ roots_ │ leave old
│ renewal_ │ one to
│ alerted=False│ auto-expire
└──────────────┘
ตัวเลือก A — ขยายเวลา (พบบ่อยที่สุดสำหรับการรับประกัน)¶
- เปิดฟอร์มสัญญา
- เลื่อน Date End ไปข้างหน้า (เช่น เพิ่ม 12 เดือน)
- รีเซ็ต Renewal Alerted เป็น False (ในกลุ่ม Validity)
- บันทึก — สัญญายังคง active,
Alert Onคำนวณใหม่ และ รอบการต่ออายุครั้งถัดไปพร้อมทำงาน
ตัวเลือก B — แทนที่ (พบบ่อยที่สุดสำหรับ MA)¶
- สร้างสัญญาใหม่ที่เริ่มในวันถัดจากวันที่สัญญาเก่าสิ้นสุด
- เพิ่มเครื่องมือแพทย์ชุดเดียวกันลงในสัญญาใหม่
- คัดลอกบรรทัดความครอบคลุม (หรือปรับปรุงตามการเจรจาใหม่)
- ปล่อยสัญญาเก่าไว้ — มันจะหมดอายุโดยอัตโนมัติเมื่อ
date_endผ่านไป roots_active_contract_idของเครื่องมือแพทย์จะสลับไปยังสัญญาใหม่ โดยอัตโนมัติ (สัญญาที่เริ่มใหม่กว่าชนะ)
การยกเลิก¶
หากต้องการยุติสัญญาก่อนกำหนด (เช่น เครื่องมือแพทย์ถูกปลดระวาง ผู้ขาย ผิดสัญญา):
- เปิดฟอร์มสัญญา
- คลิก :guilabel:
Cancel Contractในส่วนหัว - ยืนยัน
สถานะจะกลายเป็น cancelled (ยึดติด — การคำนวณใหม่ตามวันที่จะ ไม่ ยกเลิกการยกเลิก) roots_active_contract_id ของเครื่องมือแพทย์จะ ทิ้งสัญญานี้ไป (cancelled ไม่ถือว่า active) คำขอที่เชื่อมโยงกับ สัญญาที่ยกเลิกแล้วจะคงการเชื่อมโยงไว้เว้นแต่จะมีการคำนวณใหม่
หากต้องการคืนสัญญาที่ยกเลิกกลับเข้าสู่วงจรชีวิตตามวันที่:
- เปิดฟอร์มสัญญา (ยังอยู่ในสถานะ
cancelled) - คลิก :guilabel:
Reset to Draft - การคำนวณจะรันใหม่ตามวันที่ — สัญญาจะกลายเป็น draft, active หรือ expired ตามที่ปฏิทินกำหนด
สถานการณ์หลายสัญญา¶
เครื่องมือแพทย์หนึ่งรายการครอบคลุมโดยสองสัญญา (รับประกัน + MA)¶
สถานการณ์ที่พบบ่อย: การรับประกันจากผู้ผลิต 2 ปี + MA ส่วนขยาย 5 ปี ที่ซื้อแยกกัน ทั้งสองครอบคลุม MRI เครื่องเดียวกัน
- เพิ่มเครื่องมือแพทย์ลงในสัญญาทั้งสอง
- สัญญาทั้งสองจะ
activeหากช่วงเวลารวมวันนี้ roots_active_contract_idของเครื่องมือแพทย์จะแปลงเป็น สัญญาที่เริ่มใหม่กว่า (date_startล่าสุด)- คำขอเชื่อมโยงอัตโนมัติกับสัญญาที่ ใหม่กว่า
- ช่างเทคนิคสามารถแทนที่ด้วยตนเองไปยังสัญญารับประกันได้หาก ข้อบกพร่องควรเรียกร้องกับสัญญานั้น
สัญญาหนึ่งฉบับครอบคลุมเครื่องมือแพทย์หลายรายการ (MA แบบฟลีต)¶
สถานการณ์ที่พบบ่อย: MA หนึ่งฉบับครอบคลุมเครื่องช่วยหายใจทั้ง 4 เครื่องใน ICU
- สร้างสัญญาหนึ่งฉบับ เพิ่มเครื่องมือแพทย์ทั้ง 4
roots_active_contract_idของเครื่องช่วยหายใจแต่ละเครื่องจะแปลงเป็นสัญญา เดียวกันนี้- คำขอใหม่แต่ละรายการเชื่อมโยงอัตโนมัติกับสัญญานั้น
- การแจ้งเตือนการต่ออายุจะทำงาน ครั้งเดียว สำหรับสัญญา (ไม่ใช่ 4 ครั้ง)
สัญญาเฉพาะอะไหล่ที่ใช้เครื่องมือแพทย์ร่วมกับ MA ค่าแรง¶
สถานการณ์ที่พบบ่อย: อะไหล่จัดหาโดยผู้ขายเฉพาะทาง ค่าแรง ครอบคลุมโดยหน่วยงานอื่น
- สร้างสองสัญญา ทั้งสองครอบคลุมเครื่องมือแพทย์เดียวกัน
- สัญญาที่เริ่มใหม่กว่าชนะสำหรับการเชื่อมโยงอัตโนมัติ
- แบนเนอร์ความครอบคลุมสะท้อนสัญญาที่เชื่อมโยงอัตโนมัติ — ช่างเทคนิค สลับด้วยตนเองเมื่อทำงาน "อีกครึ่งหนึ่ง"
- ตรรกะเมทริกซ์การตัดสินใจ (Q4) สำหรับการกำหนดเส้นทางใบเบิก-จ่ายสินค้าไปยัง RFQ แทน สต็อก ไม่ได้ ถูกนำไปใช้ใน Q3 — มีเพียงแบนเนอร์ที่สะท้อน สถานการณ์ในวันนี้
การกำจัดการแจ้งเตือนการต่ออายุซ้ำ¶
หาก cron รายวันทำงานหนึ่งครั้ง กิจกรรมจะถูกสร้างและ roots_renewal_alerted จะเปลี่ยนเป็น True ในการรันครั้งต่อ ๆ ไป cron จะเห็น True และข้าม หากต้องการเปิดใช้การแจ้งเตือนใหม่ (เช่น คุณขยายเวลา สัญญาและต้องการการเตือนใหม่ใกล้ date_end ใหม่):
- เปิดฟอร์มสัญญา
- ในกลุ่ม Validity ยกเลิกการกาเครื่องหมาย Renewal Alerted
- บันทึก — การรัน cron ครั้งถัดไปจะสร้างกิจกรรมใหม่หาก
today >= Alert On
นี่เป็นการรีเซ็ตด้วยตนเองเพียงอย่างเดียวบนสัญญา; ทุกอย่างที่เหลือ ขับเคลื่อนด้วยวันที่