คำนำ
เป้าหมายของฉันคือการสร้างรหัสที่สามารถใช้ซ้ำได้สำหรับหลายโครงการ (และเผยแพร่บน GitHub) เพื่อจัดการการสมัครสมาชิก ฉันรู้เกี่ยวกับผู้ให้บริการการเรียกเก็บเงินแบบสไทรพ์และเกิดซ้ำ แต่นั่นไม่ใช่สิ่งที่โมดูลนี้มีเป้าหมาย มันควรจะเป็น wrapper / helper สำหรับการคำนวณยอดคงเหลือในบัญชีการแจ้งเตือนง่าย ๆ ในการต่ออายุการสมัครและจัดการการคำนวณราคา
มีหลายประเทศที่คุณไม่สามารถใช้การเรียกเก็บเงินที่เกิดขึ้นเนื่องจากผู้ให้บริการหรือความเป็นไปได้ในการชำระเงินที่มีการสนับสนุนต่ำหรือไม่มีการสนับสนุนหรือมีราคาแพงเกินไป (micropayments) และมีคนที่ไม่ต้องการใช้การเรียกเก็บเงินที่เกิดขึ้นประจำ แต่ชำระค่าใช้จ่ายด้วยตนเอง / avingg ใบแจ้งหนี้ ณ สิ้นปี ดังนั้นโปรดอย่าแนะนำการเรียกเก็บเงินแบบจ่ายซ้ำ PayPal หรือบริการที่คล้ายกันซ้ำ ๆ
สถานการณ์
สมมติว่าคุณมีรูปแบบที่สามารถสมัครเป็นสมาชิกแผน (เช่นUser
) โมเดลนี้มีฟิลด์ที่เก็บตัวบ่งชี้ของแผนการสมัครสมาชิกที่เป็นสมาชิกในปัจจุบัน ดังนั้นในการเปลี่ยนแปลงแผนทุกครั้งการเปลี่ยนแปลงจะถูกบันทึกไว้
มีโมเดล (เช่นSubscriptionPlanChanges
) ที่มีฟิลด์ต่อไปนี้บันทึกการเปลี่ยนแปลงที่กล่าวถึง:
subscriber
เกี่ยวข้องกับรูปแบบการสมัคร (User
ในกรณีนี้)from_plan
การกำหนดตัวระบุแผนที่โมเดลมีไว้ก่อนการเปลี่ยนแปลงto_plan
การกำหนดตัวระบุแผนรุ่นที่เลือกไว้ตอนนี้created_at
เป็นเขตข้อมูลวันที่ซึ่งจัดเก็บการเปลี่ยนแปลงvalid_until
เก็บวันที่จนกว่าการสมัครจริงจะใช้ได้paid_at
เป็นฟิลด์วันที่ซึ่งกำหนดว่าการชำระค่าสมัครสมาชิก (และเมื่อใด)
แน่นอนเค้าโครงนั้นสามารถพูดคุยได้
คำถามของยอดเงินในบัญชี
เมื่อผู้ใช้เปลี่ยนแผนสมัครสมาชิกของเขา / เธอฉันต้องเปรียบเทียบฟิลด์แผนรับราคาและคำนวณการหักเงินสำหรับแผนใหม่ตามแผนปัจจุบันvalid_until
และราคา พูดว่า: คุณสมัครเป็นสมาชิกแผน A เป็นเวลาหนึ่งปี แต่หลังจาก 6 เดือนคุณจะอัพเกรดเป็นแผน B ดังนั้นคุณจะได้รับส่วนลดครึ่งราคาที่จ่ายไปสำหรับแผน 6 เดือน
สิ่งที่ฉันสงสัย: หากผู้ใช้เช่นเปลี่ยนเป็นแผนฟรีเขามีเครดิตซึ่งสามารถหักได้ถ้าผู้ใช้ต้องการเปลี่ยนอีกครั้ง คุณจะแคชค่าในเขตข้อมูลเพิ่มเติมหรือคำนวณผ่านบันทึกทั้งหมดที่เกี่ยวข้องกับผู้ใช้ทุกครั้งหรือไม่ คุณจะเพิ่ม / เปลี่ยนบางสิ่งเกี่ยวกับเค้าโครงตารางหรือไม่
คำถามที่เข้าใจง่าย
เมื่อสิ้นสุดระยะเวลาการสมัครสมาชิกมาถึงผู้ใช้จะได้รับแจ้งและมีความเป็นไปได้ที่จะต่ออายุการสมัครของเขาโดยจ่ายเงินอีกครั้ง วิธีที่ง่ายที่สุดคือเพียงอัปเดตpaid_at
และvalid_until
มีตัวเลือกการสมัครใหม่ อย่างไรก็ตามฉันไม่แน่ใจว่าคุณเก็บข้อมูลทุกอย่างที่ใครบางคนอาจต้องการเช่นประวัติการชำระเงิน / สมัครสมาชิก
อีกตัวเลือกหนึ่งคือการสร้างบันทึกเพิ่มเติมสำหรับสิ่งนี้ที่from_plan
และto_plan
มีตัวระบุเดียวกัน (เช่นสัญลักษณ์ "ไม่มีการเปลี่ยนแปลง") แต่นั่นจะไม่รบกวนการคำนวณยอดเงินคงเหลือในทางใดทางหนึ่งหรือไม่
หากใครบางคนสามารถชี้ให้ฉันไปในทิศทางที่ถูกต้องเกี่ยวกับ logics ที่จัดการกับการสมัครรับข้อมูลฉันจะขอบคุณมันมาก
อัพเดท
ขอบคุณสำหรับความช่วยเหลือในตอนนี้ ฉันคิดว่าคำถามของฉันคลุมเครือเกินไปดังนั้นฉันจะพยายามให้แม่นยำยิ่งขึ้นโดยใช้สิ่งที่เป็นนามธรรมน้อยกว่า น่าเสียดายที่ฉันยังไม่สามารถแก้ปัญหาได้
กรณี A
User
สามารถเลือกSubscription Plan A
ได้ ปัจจุบันนี้จัดเก็บ a SubscriptionPlanChange
เพื่อติดตาม หลังจากเช่น 5 เดือน, อัพเกรดการสมัครสมาชิกของเขาไปUser
Subscription Plan B
ดังนั้นเขาจึงจ่ายราคาสำหรับการสมัครสมาชิกใหม่ของเขาหักราคาของแผน a สำหรับ 7 เดือนที่ยังไม่ได้ใช้
กรณี B
หลังจาก 3 เดือน, ม้วนกลับไปของเขาUser
Subscription Plan A
เขาไม่ต้องจ่าย แต่ได้รับยอดเงินเพื่อที่ว่าในตอนท้ายของการสมัครสมาชิกเขาจะได้รับยอดเงินที่หักสำหรับการสมัครใหม่ของเขา
Case C
User
สามารถเลือกแผนการสมัครสมาชิกสำหรับเซอร์วิสย่อยที่มีแผนการสมัครสมาชิกอิสระ เหมือนกันCase A
และCase B
สามารถสมัครสมาชิกบริการย่อยนั้นได้
_Case D_
ผู้ใช้ยกเลิกหนึ่งในการสมัครสมาชิกของเขา ซึ่งส่งผลให้ยอดเงินคงเหลือของเขาเพิ่มขึ้น
คำถามของฉัน (อย่างน้อยในปัจจุบัน) ส่วนใหญ่ขึ้นอยู่กับวิธีการจัดเก็บข้อมูลนั้นอย่างถูกต้องเพื่อให้ฉันสามารถสร้างประวัติศาสตร์ของการสมัครสมาชิกสำหรับการวิเคราะห์ธุรกิจและการคำนวณยอดคงเหลือรับการชำระเงินที่ค้างชำระตามการสมัครสมาชิกเป็นต้น
ฉันยังไม่แน่ใจว่าควรจัดเก็บยอดคงเหลือไว้เช่นผู้ใช้เป็นเจ้าของโมเดลหรือไม่ได้จัดเก็บ แต่สามารถคำนวณได้ตลอดเวลาตามข้อมูล / ประวัติที่เก็บไว้
บางสิ่งที่ควรทราบแม้ว่าฉันไม่คิดว่าพวกเขาควรจะแนะนำปัญหา:
- มันไม่จำเป็นต้องเป็น
User
, มันอาจเป็นอะไรก็ได้, นั่นเป็นสาเหตุว่าทำไมSubscriber
polymorphic Plans
ไม่จำเป็นต้องเป็นแผน แต่อาจเป็นเช่นที่Magazines
กล่าวถึง นั่นคือสิ่งที่ผมได้อธิบายด้วยกรณี Cและกรณี D