การจัดการการสมัครสมาชิกยอดคงเหลือและการเปลี่ยนแปลงแผนการกำหนดราคา [ปิด]


11

คำนำ
เป้าหมายของฉันคือการสร้างรหัสที่สามารถใช้ซ้ำได้สำหรับหลายโครงการ (และเผยแพร่บน 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, มันอาจเป็นอะไรก็ได้, นั่นเป็นสาเหตุว่าทำไมSubscriberpolymorphic
  • Plansไม่จำเป็นต้องเป็นแผน แต่อาจเป็นเช่นที่Magazinesกล่าวถึง นั่นคือสิ่งที่ผมได้อธิบายด้วยกรณี Cและกรณี D

1
สิ่งหนึ่งที่คุณสามารถทำได้อย่างแน่นอนก็คือการกำหนดราคาแต่ละฉบับ (ซึ่งขึ้นอยู่กับแผนเช่นการรวมแผนที่ [แผนปัญหา] ไปที่ [ราคาเสนอขาย]) แล้วก็ติดตามยอดคงเหลือของสมาชิกแต่ละรายต่อนิตยสาร (หรือคำศัพท์ใดก็ตามที่คุณต้องการ)
CVn

ขอบคุณทุกคนฉันต้องอัปเดตคำถามเพราะฉันยังไม่สามารถแก้ปัญหาได้
pduersteler

1
ฉันขอถามว่าคุณจะลงมือทำสิ่งนี้ได้อย่างไร?
JCM

คำตอบ:


6

น่าเสียดายที่คำตอบของปัญหาที่ซับซ้อนมักจะซับซ้อน คำแนะนำของฉันสำหรับคุณคือการบันทึกเฉพาะข้อมูลที่เกี่ยวข้องจากนั้นใช้โมเดลเพื่อสร้างภาพที่ใหญ่ขึ้น

กล่าวอีกนัยหนึ่ง SubscriptionPlanChanges ของคุณจะมีข้อมูลต่อไปนี้สำหรับกุญแจ:

  • สมาชิก
  • วางแผน
  • ใช้ได้จาก

ด้วยวิธีนี้คุณอนุญาตให้มีหลายแผนสำหรับผู้สมัครสมาชิกเดียวกันซึ่งสามารถทับซ้อนกัน สาขาอื่น ๆ ได้แก่ :

  • ใช้ได้ถึงวันที่
  • จ่ายจน
  • อัตรา (เช่น 0 ถ้าฟรี)

โปรดสังเกตว่าไม่มี "แผนจาก" หรือ "แผนถึง" แม้ว่าคุณจะมีข้อมูลเหล่านั้นได้ข้อมูลก็ฟุ่มเฟือยและสามารถคำนวณได้ด้วยตัวคุณเอง (การจัดเก็บข้อมูลดังกล่าวหมายความว่าคุณมีหน้าที่เพิ่มเติมในการทำให้สอดคล้องกัน) เมื่อแผนใหม่เริ่มต้นแทนที่จะต้องปรับเปลี่ยนแผนเดิมคุณต้องออกจากแผนเหล่านั้นและเพิ่มระเบียนใหม่ หากมีแผนซ้อนทับอื่นอยู่หลังจากแผนใหม่คุณสามารถตัดสินใจได้ว่าจะลบ (ยิ่งใช้วิธีนี้ง่ายขึ้น) เมื่อคุณโหลดแผนเหล่านี้สำหรับผู้สมัครสมาชิกคุณเรียงลำดับตามวันที่ "ถูกต้องจาก"

เมื่อคุณได้รับสิ่งนี้การคำนวณเครดิตของผู้ใช้นั้นค่อนข้างง่าย หากสองแผนไม่สามารถซ้อนทับกันคุณเพียง แต่ใช้วันที่น้อยลงระหว่างวันที่ "ใช้ได้จนถึง" ของแผนก่อนหน้าและ "ถูกต้องจาก" ของแผนปัจจุบันเพื่อกำหนดวันที่สิ้นสุด วันที่เริ่มต้นเป็นวันที่มากกว่าสองวันระหว่างวันที่ "ถูกต้องจาก" และ "วันที่จ่ายจนถึง" (ถ้ากำหนด) การชำระเงิน (หรือเครดิต) นั้นสามารถคำนวณตามอัตราคูณด้วยช่วงเวลาระหว่างวันที่เริ่มต้นและวันที่สิ้นสุดดังกล่าวข้างต้นของแผนนั้น

ด้วยวิธีนี้คุณสามารถคำนวณสิ่งที่คุณจำเป็นต้องรู้ในทางทฤษฎี ฉันจะไม่แนะนำให้พยายามบันทึกค่าที่คำนวณได้เนื่องจากจะมีการเปลี่ยนแปลงเมื่อมีการแก้ไขเพิ่มหรือลบระเบียนที่มีอยู่

รูปแบบของวิธีการคำนวณค่าเหล่านี้สามารถจัดการได้โดยการเพิ่มฟิลด์ประเภทเพิ่มเติม ในรหัสของคุณคุณสามารถสร้างตัวจัดการพิเศษเพื่อจัดการตรรกะของการคำนวณแผนเฉพาะเพื่อให้อัลกอริทึมหลักของคุณค่อนข้างชัดเจนของการคำนวณที่ซับซ้อน ยังดีกว่าถ้าคุณจัดการเพื่อสร้างตัวจัดการสำหรับกรณีที่ไม่มีการระบุประเภทดังนั้นสิ่งที่คุณต้องทำคือเรียกตัวจัดการที่เหมาะสมตามประเภทของมันเพื่อทำการคำนวณที่คุณต้องการ

ฉันหวังว่าจะตอบคำถามของคุณ


ขอบคุณมากที่หลั่งน้ำตาแสง! แม้ว่าฉันรู้สึกว่าฉันไม่ชัดเจนเกี่ยวกับเขตข้อมูล "ถูกต้อง" เป็นคำศัพท์ของฉันของคุณvalid_until paid_untilไม่มีความยาวสูงสุดของแผนการสมัคร
pduersteler

@pduersteler อ่าฉันผิดแล้ว นั่นทำให้การคำนวณง่ายขึ้นมากเนื่องจากวันที่ "สิ้นสุด" เป็นเพียงการเริ่มต้นของแผนใหม่
Neil

1
อัตราคือจำนวนเงินที่จ่าย? ถ้าใช่นี่อาจเป็นเอนทิตีอื่นตัวอย่างใบแจ้งหนี้ฉันถูกใช่ไหม?
JCM

3

นอกเหนือจากคำตอบข้างต้นฉันจะสร้างตารางที่มีเครดิตซึ่งเครดิตจะเท่ากับสกุลเงินปัจจุบัน เมื่อใดก็ตามที่ผู้ใช้สลับแผนเป็นทางเลือกที่ถูกกว่ายอดคงเหลือที่ไม่ได้ใช้จะเข้าสู่เครดิต เมื่อใดก็ตามที่ผู้ใช้มีสิ่งที่ต้องชำระคุณจะต้องใช้เครดิตก่อนและขอให้ชำระเงินหากเครดิตหมดหรือไม่มีอยู่ หากใช้ทางเลือกนี้ให้สร้างตารางเป็น transaction-list เพื่อให้สามารถสร้างสถานการณ์การใช้ซ้ำได้หากมีข้อพิพาทเกิดขึ้น ตัวอย่าง:

ID, รหัสผู้ใช้, TransactionDate, เครดิต (บวกเมื่อคุณให้เครดิตผู้ใช้และลบเมื่อผู้ใช้ใช้เครดิต)

เพียงรวมเครดิตสำหรับผู้ใช้เพื่อแสดงยอดคงเหลือ

หวังว่านี่เป็นประโยชน์สำหรับคุณ ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.