मैं एक कांटेदार समस्या का थोड़ा सा बनने के लिए एक सुरुचिपूर्ण समाधान कैसे वास्तुकार करने के लिए मार्गदर्शन की तलाश में हूं। हालांकि मैं रूबी (और रेल) का उपयोग कर रहा हूं, मुझे लगता है कि मेरी समस्या काफी हद तक एक वास्तुशिल्प है, हालांकि भाषा की मेरी पसंद स्पष्ट रूप से पुस्तकालयों आदि से जुड़े सुझावों के संदर्भ में प्रभाव डालती है, इसलिए भाषा प्रासंगिक बनी हुई है।आवर्ती भुगतान और भविष्य की घटनाओं को शामिल करने वाली कठिन वास्तुकला की समस्या
वैसे भी, संक्षेप में: मेरे आवेदन में सदस्यता का प्रतिनिधित्व करने वाली वस्तुएं हैं, जो फिटनेस सुविधाओं के सदस्य हैं। सदस्यता में पुनरावर्ती भुगतान की एक श्रृंखला होती है। कुछ सदस्यता स्वचालित रूप से अपने कार्यकाल के अंत में नवीनीकृत होती है, जबकि अन्य नहीं करते हैं।
तो उदाहरण के लिए, आपके पास एक सदस्यता हो सकती है जो एक वर्ष की प्रारंभिक अवधि के लिए हो, और उसके बाद महीने-दर-महीने नवीनीकृत हो। आवेदन में, इस तरह की सदस्यता बनाने के लिए 12 पुनरावर्ती भुगतान किए जाने का कारण बनता है। जब अंतिम महीने समाप्त हो जाता है, तो सदस्यता भी होती है। पूर्ण भुगतान के आधार पर सदस्यता समाप्त होने के कारण दैनिक क्रॉन कार्य जिम्मेदार होता है। यदि सदस्यता स्वचालित रूप से नवीनीकृत करने के लिए सेट है, तो उसी क्रॉन कार्य सदस्यता को नवीनीकृत कर देगा।
आपके पास ऐसी सदस्यता भी हो सकती है जिनके पास प्रारंभिक अवधि नहीं है और केवल महीने-दर-महीने या सप्ताह-दर-सप्ताह चलती है। ये काम समान तरीके से प्रारंभिक भुगतान शेड्यूलिंग से कम है।
अभी तक इतना अच्छा है। क्या बनाता है जटिल चीजों को अतिरिक्त आवश्यकताएँ हैं:
प्रशासकों की सदस्यता (पकड़ पर डाल), विशिष्ट अवधि के लिए, जिसके बाद वे स्वचालित रूप से (जैसे लोग हैं, जो एक के लिए छुट्टी पर चले जाओ प्रतिनिधित्व करने के लिए पुन: सक्रिय "फ्रीज" कर सकते हैं समय की निर्धारित अवधि)। मैं अभी सदस्यता को जमा करना चुन सकता हूं और इसे बाद में पुनः सक्रिय कर सकता हूं, या मैं भविष्य में किसी बिंदु पर फ्रीज तिथि सेट करके फ्रीज तिथि निर्धारित कर सकता हूं, साथ ही पुन: सक्रियण तिथि (नोट: हमेशा ए पुनर्सक्रियण तिथि, जो चीजों को थोड़ा आसान बनाता है)।
व्यवस्थापक अभी भी सदस्यता रद्द कर सकते हैं, या तो भविष्य में होने वाली रद्दीकरण को सेट कर सकते हैं। (भविष्य रद्दीकरण अभी तक नहीं बनाए गए हैं।)
प्रशासक सदस्यता रद्द कर सकते हैं, जो किसी भी पिछले भुगतान को छोड़कर रद्दीकरण की तरह है।
आवर्ती भुगतान पर असर इन मुश्किलों से निपटने में क्या मुश्किल बनाता है। जब आप सदस्यता जमा करते हैं, आवर्ती भुगतान को फ्रीज अवधि के आसपास "बाहर निकालना" चाहिए, ताकि फ्रीज का प्रतिनिधित्व करने वाले समय की अवधि का भुगतान न किया जाए। यह दोनों अवधारणात्मक और प्रोग्रामेटिक रूप से संभालना मुश्किल है। भुगतान, उदाहरण के लिए, विभिन्न अवधि के लिए बढ़ाया जा सकता है (यानी प्रत्येक भुगतान जो किसी अन्य सप्ताह के लिए सदस्यता के दो सप्ताह के लिए भुगतान करता है), और रद्दीकरण की तारीख भुगतान कवर अवधि के भीतर कहीं भी हो सकती है।
फ्रीज के लिए, मैंने उस दृष्टिकोण को लिया है जहां सदस्यता वस्तु में कुछ तारीखें हैं, अर्थात् फ्रीज अवधि को संभालने के लिए "फ्रीज_ऑन" और "thaw_on"। हालांकि, ग्राहक अब भविष्य में रद्दीकरण भी चाहता है, और मैंने ठंडे कार्यक्षमता के साथ कुछ कीड़े देखी हैं, जो मुझे विश्वास दिलाती है कि मुझे अपने दृष्टिकोण पर पुनर्विचार करने की आवश्यकता है।
मैं चीजों को बदलने पर विचार कर रहा हूं ताकि भविष्य की घटनाओं को निर्धारित किया जा सके लेकिन आवेदन के पुनरावर्ती भुगतान हिस्से पर कोई प्रभाव न हो। विचार विशेष घटनाओं को कतार में रखना होगा।उदाहरण के लिए, भविष्य में एक फ्रीज किसी विशेष तिथि पर फ्रीज ईवेंट को कतारबद्ध करके, और बाद की तारीख पर एक थॉव ईवेंट (इन दो घटनाओं को उपयोगकर्ता के परिप्रेक्ष्य से एक "अनुसूचित फ्रीज" में जोड़ा जाएगा) द्वारा पूरा किया जाएगा। भविष्य में रद्दीकरण को समान रूप से संभाला जाएगा।
इस दृष्टिकोण के कुछ फायदे हैं, उदाहरण के लिए, यदि आप भविष्य में रद्दीकरण रद्द करना चाहते हैं (यह ऐसी परेशानियों, मुश्किल चीजें हैं जिनके बारे में मैं बात कर रहा हूं), तो आप ईवेंट कतार से निर्धारित रद्दीकरण को हटा सकते हैं।
हालांकि, मुझे नाराज लग रहा है कि मैं बस फ्राइंग पैन से आग में कूद सकता हूं। मैं सोच रहा हूं कि कोई मुझे इस मुद्दे पर कुछ मार्गदर्शन प्रदान कर सकता है। क्या इस तरह की समस्या के लिए डिजाइन पैटर्न या मौजूदा वास्तुशिल्प सिद्धांत हैं जिनकी मैं जांच कर सकता हूं?
नोट करने के लिए एक अतिरिक्त बात यह है कि निर्धारित शर्तों के साथ सदस्यता के लिए आवर्ती भुगतान (यानी महीने-दर-महीने स्वचालित रूप से नवीकरण नहीं) डेटाबेस रिकॉर्ड के रूप में मौजूद होना चाहिए जिसे संपादित किया जा सकता है (समय में स्थानांतरित किया गया है, मूल्य समायोजित किया गया है), इसलिए अस्थायी का उपयोग करना अभिव्यक्ति (मार्टिन फाउलर के सुझाव के अनुसार) इस समस्या के लिए उपयुक्त नहीं है, जहां तक मुझे पता है। मुझे एहसास है कि किसी इवेंट कतार का मेरा प्रस्तावित समाधान उपयोगकर्ता को किसी मौजूदा आवर्ती भुगतान के साथ होने वाले परिवर्तनों को प्रदर्शित नहीं करेगा, लेकिन मुझे लगता है कि मैं इसके साथ रह सकता हूं। नीचे दो महान सुझाव के लिए प्रतिक्रिया करने के लिए (टिप्पणी बक्से लगभग अनुमति नहीं देते:
नहीं एक ScanLife बार कोड है, यह एक QR कोड
टोरंटो, हमें अपने रचनात्मक लोगों
संपादित देना है विवरण के स्तर):
क्रिस Robison:
हां, फ्रीज अवधि मनमाना लंबाई हो सकती है, हालांकि अभ्यास में मुझे लगता है कि यह दो सप्ताह से कम होने के लिए दुर्लभ होगा। लेकिन किसी भी समाधान को अवधि की लंबाई के बावजूद काम करना चाहिए।
हां, नवीकरण तिथि बदलती है - इसे फ्रीज की लंबाई से आगे बढ़ाया जाता है। तो यदि फ्रीज दो सप्ताह लंबा है, तो यह भुगतान को दो सप्ताह तक आगे बढ़ा देता है। चीजों को विशेष रूप से मुश्किल बनाने के लिए, कुछ व्यवसायों में, भुगतान केवल विशिष्ट तिथियों पर वापस ले लिया जा सकता है - उदाहरण के लिए, कुछ क्लब केवल प्रत्येक महीने के पहले और 15 वें स्थान पर भुगतान करते हैं। इसलिए जब इन क्लबों के लिए तारीखों को धक्का दिया जाता है, तो उन्हें किसी विशेष तारीख को "स्नैप" करना पड़ता है।
क्या आप अधिक विस्तार से समझा सकते हैं कि ये नियम ईवेंट कतार को क्यों प्रभावित करते हैं लेकिन सदस्यता भुगतान का प्रबंधन नहीं करते हैं?
मुझे आपकी परिशोधन तालिका अवधारणा में रूचि है। यह मूल रूप से वही है जो मैंने पहले ही बनाया है - मासिक भुगतान के साथ एक साल की सदस्यता 12 बनाता है, साप्ताहिक रूप से यह 52 बनाता है - और इनमें से प्रत्येक के पास एक राज्य मशीन के साथ जुड़े राशि, कर, आदि हैं। "लंबित", "भुगतान", "असफल", और "धनवापसी" राज्य।
जिस भाग में मैं संघर्ष कर रहा हूं वह यह है कि यह तालिका घटनाओं का जवाब कैसे देती है। अभी, यदि आप एक फ्रीज सेट करते हैं, तो यह भुगतान की तिथियों को बदलकर तुरंत तालिका को प्रभावित करता है। तालिका के बीच में फ्रीज सेट करें, और यह आगे भुगतान को धक्का देता है। यह प्रभावी लगता है, लेकिन यह वास्तव में काफी जटिल और प्रबंधन करने में मुश्किल है। आपकी परिशोधन तालिका विचार इस स्थिति में कैसे सुधार करेगा?
Arsen7:
इस घटना कतार मैं मूल रूप से प्रस्तावित की तरह लगता है। मुझे यह स्पष्ट लगता है कि आपने पहले इस तरह की चीजों के साथ काम किया है (मैं प्रसंस्करण तिथि पर आपकी त्रुटि जांच से प्रभावित था, यह एक अच्छा विचार है और एक जिसे मैं एएसएपी लागू करना चाहता हूं) इसलिए मुझे आशा है कि आप समझा सकते हैं थोड़ा सा विस्तार में आपका सुझाव।
विशेष रूप से, मैं सोच रहा हूं कि आपकी अवधारणा मेरे मूल प्रश्न में वर्णित आवर्ती भुगतान स्थिति से कैसे निपटती है, और टिप्पणी में मैंने क्रिस रोबिसन के उत्तर पर अभी छोड़ा था। यदि मैंने किसी दिए गए खरीद के लिए पुनरावर्ती भुगतान का शेड्यूल स्थापित किया है, और भुगतान के बीच में फ्रीज इवेंट निर्धारित किया गया है, तो भुगतान की अवधि अपरिवर्तित बनी रहेगी जब तक कि फ्रीज की तारीख वर्तमान तिथि बन जाए, जिस पर समय फ्रीज स्थापित किया जाएगा और भुगतान आगे बढ़ेगा?
यह मेरे आवेदन को सरल बनाने के लिए शायद एक शानदार तरीका है, लेकिन मुझे आश्चर्य है कि उपयोगकर्ता इसे कैसे समझेंगे। मैं उन्हें कैसे इंगित करूंगा कि जब फ्रीज निर्धारित किया गया था, तो वे भुगतान का शेड्यूल अब सटीक अनुसूची नहीं कर रहे हैं, लेकिन फ्रीज होने के बाद बदल जाएगा?
ठीक है, मैंने अभी संपादित किए गए प्रश्न का उत्तर देने के लिए उत्तर संपादित किया है। ;-) मुझे लंबे समय तक देरी क्षमा करें - मेरे पास कुछ अपेक्षाकृत व्यस्त दिन थे। – Arsen7