১৪.৭ : ট্রানসাকশান রিপোর্ট ভিউ

আজকে আমরা আমাদের transaction রিপোর্ট নিয়ে কাজ করবো যেখানে একজন ইউজার তার সব transaction রিপোর্ট দেখতে পাবেন এবং সেই সাথে date অনুসারে ফিল্টার ও করতে পারবেন।

তো আমাদের template_name এ টেমপ্লেট এর নাম দিবো। model এর মধ্যে মডেল নেম দিবো আর balance নামে একটা ভারিয়াবল এর মধ্যে ০ রাখবো। balance টা আমাদের তৈরি করা ভ্যারিয়েবল। এখন ইউজার তো frontend থেকে ডেট ফিল্টার করতে পারবে from থেকে to অব্দি সো from এবং to এই দুইটা ডেট কে কোয়েরি করবো আমরা সেজন্যে get_queryset নামে বিল্ট ইন ফাংশন ইউজ করবো আমরা। এখানে আমরা শুরু তেই ইউজার account কে ফিল্টার করে নিবো। সেখানে frontend থেকে ইউজার এর দেওয়া start_date আর end_date কে আমরা request.GET থেকে get ফাংশন দিয়ে start_date আর end_date কে নিবো। এখন যদি দুইটা ডেট ই পাই তাইলে এই দুইটা ডেট তো স্ট্রিং ফরমেট এ পেলাম তাদেরকে date অবজেক্ট এ কনভার্ট করবো সেজন্যে python এর datetime মডিউল ইউজ করবো সেখান থেকে datetime.strptime().date() ফাংশন টা ইউজ করে স্ট্রিং ডেট গুলা কে ডেট অবজেক্ট এ কনভার্ট করে ফেলবো। এরপর আমরা আমাদের transaction মডেল কে ডেট এর উপর ফিল্টার করবো। আমাদের ডেট store করতেছি timestamp নামের ফিল্ড দিয়ে সেখানে timestamp__date__gte অর্থাৎ টাইম যদি greater than আর time__date__lte অর্থাৎ less than থাকে তাইলে এই range এর মধ্যের transaction গুলা কে ফিল্টার করবো।

আর get_context_data তে আমরা ইউজার এর account কে কনটেক্সট ডাটা হিসেবে frontend এ pass করে দিবো।

class TransactionReportView(LoginRequiredMixin, ListView):
    template_name = 'transactions/transaction_report.html'
    model = Transaction
    balance = 0 # filter korar pore ba age amar total balance ke show korbe
    
    def get_queryset(self):
        queryset = super().get_queryset().filter(
            account=self.request.user.account
        )
        start_date_str = self.request.GET.get('start_date')
        end_date_str = self.request.GET.get('end_date')
        
        if start_date_str and end_date_str:
            start_date = datetime.strptime(start_date_str, '%Y-%m-%d').date()
            end_date = datetime.strptime(end_date_str, '%Y-%m-%d').date()
            
            queryset = queryset.filter(timestamp__date__gte=start_date, timestamp__date__lte=end_date)
            self.balance = Transaction.objects.filter(
                timestamp__date__gte=start_date, timestamp__date__lte=end_date
            ).aggregate(Sum('amount'))['amount__sum']
        else:
            self.balance = self.request.user.account.balance
       
        return queryset.distinct() # unique queryset hote hobe
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context.update({
            'account': self.request.user.account
        })

        return context

Last updated