Exemple #1
0
    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, [])
Exemple #2
0
    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)])
Exemple #3
0
 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
Exemple #4
0
 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
Exemple #5
0
    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)
Exemple #7
0
    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")
Exemple #8
0
    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)
Exemple #9
0
 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)])
Exemple #10
0
 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, [])