def test_same_year_same_month(self): member = create_member(first_payment_year=2017, first_payment_month=6) ps = create_payment_strategy() logic.create_payment(member, now(), DEFAULT_FEE, ps) debt = logic.get_debt_state(member, 2017, 6) self.assertEqual(debt, [])
def test_previous_year(self): member = create_member(first_payment_year=2017, first_payment_month=8) ps = create_payment_strategy() logic.create_payment(member, now(), DEFAULT_FEE, ps) debt = logic.get_debt_state(member, 2018, 2) self.assertEqual(debt, [(2017, 9), (2017, 10), (2017, 11), (2017, 12), (2018, 1), (2018, 2)])
def get_context_data(self, **kwargs): # Get the context from base context = super(MemberDetailView, self).get_context_data(**kwargs) member = self.get_object() today = datetime.date.today() debt = logic.get_debt_state(member, today.year, today.month) if len(debt) > 1 and member.category.fee > 0: context['debtor'] = True context['member'] = member context['quotas'] = Quota.objects.filter(member=member)[:6] context['missing_letter'] = not member.has_subscription_letter return context
def get_context_data(self, **kwargs): # Get the context from base context = super().get_context_data(**kwargs) member = self.get_object() today = datetime.date.today() debt = logic.get_debt_state(member, today.year, today.month) if len(debt) > 1 and member.category.fee > 0: context['debtor'] = True context['member'] = member context['last_payments_info'] = self._get_last_payments(member) context['missing_letter'] = not member.has_subscription_letter return context
def test_multiyear(self): member = create_member(first_payment_year=2017, first_payment_month=8) ps = create_payment_strategy() logic.create_payment(member, now(), DEFAULT_FEE, ps) debt = logic.get_debt_state(member, 2020, 2) self.assertEqual(debt, [(2017, 9), (2017, 10), (2017, 11), (2017, 12), (2018, 1), (2018, 2), (2018, 3), (2018, 4), (2018, 5), (2018, 6), (2018, 7), (2018, 8), (2018, 9), (2018, 10), (2018, 11), (2018, 12), (2019, 1), (2019, 2), (2019, 3), (2019, 4), (2019, 5), (2019, 6), (2019, 7), (2019, 8), (2019, 9), (2019, 10), (2019, 11), (2019, 12), (2020, 1), (2020, 2)])
def post(self, request): raw_sendmail = parse.parse_qs(request.body)[b'sendmail'] to_send_mail_ids = map(int, raw_sendmail) limit_year, limit_month = self._get_yearmonth(request) sent_error = 0 sent_ok = 0 tini = time.time() errors_code = str(uuid.uuid4()) for member_id in to_send_mail_ids: member = Member.objects.get(id=member_id) debt = logic.get_debt_state(member, limit_year, limit_month) debt_info = { 'debt': _build_debt_string(debt), 'member': member, 'annual_fee': member.category.fee * 12, 'on_purpose_missing_var': "ERROR", } text = render_to_string('members/mail_indebt.txt', debt_info) text = _clean_double_empty_lines(text) if 'ERROR' in text: # badly built template logger.error( "Error when building the report missing mail result, info: %s", debt_info) return HttpResponse("Error al armar la página") recipient = f"{member.entity.full_name} <{member.entity.email}>" mail = EmailMessage(self.MAIL_SUBJECT, text, self.MAIL_FROM, [recipient], cc=[self.MAIL_MANAGER], reply_to=[self.MAIL_MANAGER]) try: mail.send() except Exception as err: sent_error += 1 logger.error("Problems sending email [%s] to member %s: %r", errors_code, member, err) else: sent_ok += 1 deltat = time.time() - tini context = { 'sent_ok': sent_ok, 'sent_error': sent_error, 'errors_code': errors_code, 'deltamsec': int(deltat * 1000), } return render(request, 'members/mail_sent.html', context)
def handle(self, *args, **options): currently = datetime.datetime.now() limit_year, limit_month = logic.decrement_year_month( currently.year, currently.month) members = (Member.objects.filter( legal_id__isnull=False, category__fee__gt=0, shutdown_date__isnull=True).order_by('legal_id').all()) mail_data = [] for member in members: if not isinstance(member.entity, Person): continue debt = logic.get_debt_state(member, limit_year, limit_month) if not debt: continue debt_info = { 'debt': utils.build_debt_string(debt), 'member': member, 'annual_fee': member.category.fee * 12, 'on_purpose_missing_var': "ERROR", } text = render_to_string('members/mail_indebt.txt', debt_info) if 'ERROR' in text: # badly built template raise ValueError( "Problems building the mail text; info: {}".format( debt_info)) mail_data.append((member, text)) print("Found {} members in debt".format(len(mail_data))) for member, text in mail_data: print( f"Sending mail to {member.entity.full_name} <{member.entity.email}>" ) try: utils.send_email(member, MAIL_SUBJECT, text) except Exception as err: print(" problem:", repr(err)) else: print(" ok") print("Done")
def get(self, request): """Produce the report with the given year/month limits.""" limit_year, limit_month = self._get_yearmonth(request) # get those already confirmed members members = Member.objects\ .filter(legal_id__isnull=False, category__fee__gt=0, shutdown_date__isnull=True)\ .order_by('legal_id').all() debts = [] for member in members: debt = logic.get_debt_state(member, limit_year, limit_month) if debt: debts.append({ 'member': member, 'debt': _build_debt_string(debt), }) context = { 'debts': debts, 'limit_year': limit_year, 'limit_month': limit_month, } return render(request, 'members/report_debts.html', context)
def test_no_payment_yet_several_months(self): member = create_member(registration_date=datetime.date(2017, 5, 13)) debt = logic.get_debt_state(member, 2017, 8) self.assertEqual(debt, [(2017, 5), (2017, 6), (2017, 7), (2017, 8)])
def test_no_payment_yet_previous_month(self): member = create_member(registration_date=datetime.date(2017, 5, 13)) debt = logic.get_debt_state(member, 2017, 1) self.assertEqual(debt, [])