def testStockReceipt(self):
        original_amounts = {
            'pp': 10,
            'pq': 20,
            'pr': 30,
        }

        # First submit an soh so we can make sure receipts functions
        # differently than soh
        handle(get_two_way_number_for_recipient(self.users[0]), 'soh {loc} {report}'.format(
            loc='loc1',
            report=' '.join('%s %s' % (k, v) for k, v in original_amounts.items())
        ), None)

        received_amounts = {
            'pp': 1,
            'pq': 2,
            'pr': 3,
        }

        handled = handle(get_two_way_number_for_recipient(self.users[0]), 'r {loc} {report}'.format(
            loc='loc1',
            report=' '.join('%s %s' % (k, v) for k, v in received_amounts.items())
        ), None)

        self.assertTrue(handled)

        self.check_form_type('receipts')

        for code in original_amounts.keys():
            expected_amount = original_amounts[code] + received_amounts[code]
            self.check_stock(code, expected_amount)
    def testStockConsumption(self):
        original_amounts = {
            'pp': 10,
            'pq': 20,
            'pr': 30,
        }

        # First submit an soh so we can make sure consumption functions properly
        handle(get_two_way_number_for_recipient(self.users[0]), 'soh {loc} {report}'.format(
            loc='loc1',
            report=' '.join('%s %s' % (k, v) for k, v in original_amounts.items())
        ), None)

        lost_amounts = {
            'pp': 1,
            'pq': 2,
            'pr': 3,
        }

        handled = handle(get_two_way_number_for_recipient(self.users[0]), 'c {loc} {report}'.format(
            loc='loc1',
            report=' '.join('%s %s' % (k, v) for k, v in lost_amounts.items())
        ), None)

        self.assertTrue(handled)

        # this is the only difference from losses..
        self.check_form_type('consumption')

        for code in original_amounts.keys():
            expected_amount = original_amounts[code] - lost_amounts[code]
            self.check_stock(code, expected_amount)
    def testStockLosses(self):
        original_amounts = {
            'pp': 10,
            'pq': 20,
            'pr': 30,
        }

        # First submit an soh so we can make sure losses functions properly
        handle(
            get_two_way_number_for_recipient(self.users[0]),
            'soh {loc} {report}'.format(
                loc='loc1',
                report=' '.join('%s %s' % (k, v)
                                for k, v in original_amounts.items())), None)

        lost_amounts = {
            'pp': 1,
            'pq': 2,
            'pr': 3,
        }

        handled = handle(
            get_two_way_number_for_recipient(self.users[0]),
            'l {loc} {report}'.format(
                loc='loc1',
                report=' '.join('%s %s' % (k, v)
                                for k, v in lost_amounts.items())), None)

        self.assertTrue(handled)

        self.check_form_type('consumption', 'loss')

        for code in original_amounts.keys():
            expected_amount = original_amounts[code] - lost_amounts[code]
            self.check_stock(code, expected_amount)
Exemple #4
0
    def test_get_two_way_number_for_recipient(self):
        self.assertIsNone(get_two_way_number_for_recipient(self.user))

        self.user.phone_numbers = ['123', '456', '789']
        entry = self.user.get_or_create_phone_entry('456')
        entry.set_two_way()
        entry.set_verified()
        entry.save()
        self.assertEqual(get_two_way_number_for_recipient(self.user).phone_number, '456')

        entry = self.user.get_or_create_phone_entry('789')
        entry.set_two_way()
        entry.set_verified()
        entry.save()
        self.assertEqual(get_two_way_number_for_recipient(self.user).phone_number, '456')

        self.user.set_default_phone_number('789')
        self.assertEqual(self.user.phone_numbers, ['789', '123', '456'])
        v = get_two_way_number_for_recipient(self.user)
        self.assertEqual(v.phone_number, '789')

        v.verified = False
        v.is_two_way = False
        v.pending_verification = False
        v.save()
        self.assertEqual(get_two_way_number_for_recipient(self.user).phone_number, '456')
Exemple #5
0
    def test_get_two_way_number_for_recipient(self):
        self.assertIsNone(get_two_way_number_for_recipient(self.user))

        self.user.phone_numbers = ['123', '456', '789']
        entry = self.user.get_or_create_phone_entry('456')
        entry.set_two_way()
        entry.set_verified()
        entry.save()
        self.assertEqual(get_two_way_number_for_recipient(self.user).phone_number, '456')

        entry = self.user.get_or_create_phone_entry('789')
        entry.set_two_way()
        entry.set_verified()
        entry.save()
        self.assertEqual(get_two_way_number_for_recipient(self.user).phone_number, '456')

        self.user.set_default_phone_number('789')
        self.assertEqual(self.user.phone_numbers, ['789', '123', '456'])
        v = get_two_way_number_for_recipient(self.user)
        self.assertEqual(v.phone_number, '789')

        v.verified = False
        v.is_two_way = False
        v.pending_verification = False
        v.save()
        self.assertEqual(get_two_way_number_for_recipient(self.user).phone_number, '456')
    def testStockReceipt(self):
        original_amounts = {
            'pp': 10,
            'pq': 20,
            'pr': 30,
        }

        # First submit an soh so we can make sure receipts functions
        # differently than soh
        handle(get_two_way_number_for_recipient(self.users[0]), 'soh {loc} {report}'.format(
            loc='loc1',
            report=' '.join('%s %s' % (k, v) for k, v in original_amounts.items())
        ), None)

        received_amounts = {
            'pp': 1,
            'pq': 2,
            'pr': 3,
        }

        handled = handle(get_two_way_number_for_recipient(self.users[0]), 'r {loc} {report}'.format(
            loc='loc1',
            report=' '.join('%s %s' % (k, v) for k, v in received_amounts.items())
        ), None)

        self.assertTrue(handled)

        self.check_form_type('receipts')

        for code in original_amounts.keys():
            expected_amount = original_amounts[code] + received_amounts[code]
            self.check_stock(code, expected_amount)
Exemple #7
0
def send_translated_message(user, message, **kwargs):
    verified_number = get_two_way_number_for_recipient(user)
    if not verified_number:
        return False
    with localize(user.get_language_code()):
        send_sms_to_verified_number(verified_number, message % kwargs)
        return True
Exemple #8
0
    def testStockReportRoaming(self):
        self.assertEqual([], list(iter_commtrack_forms(self.domain.name)))
        amounts = {
            'pp': 10,
            'pq': 20,
            'pr': 30,
        }
        # soh loc1 pp 10 pq 20...
        handled = handle(
            get_two_way_number_for_recipient(self.users[0]),
            'soh {loc} {report}'.format(
                loc='loc1',
                report=' '.join('%s %s' % (k, v) for k, v in amounts.items())),
            None)
        self.assertTrue(handled)
        forms = list(iter_commtrack_forms(self.domain.name))
        self.assertEqual(1, len(forms))
        self.assertEqual(_get_location_from_sp(self.sp),
                         _get_location_from_form(forms[0]))

        ledger_transactions = LedgerAccessorSQL.get_ledger_transactions_for_case(
            self.sp.case_id)
        self.assertEqual({forms[0].form_id},
                         set(t.form_id for t in ledger_transactions))
        self.assertEqual({'balance'},
                         set(t.readable_type for t in ledger_transactions))
        self.assertEqual(3, len(ledger_transactions))

        self.check_transaction_amounts(ledger_transactions, amounts)
    def testStockReportRoaming(self):
        self.assertEqual(0, len(get_commtrack_forms(self.domain.name)))
        amounts = {
            'pp': 10,
            'pq': 20,
            'pr': 30,
        }
        # soh loc1 pp 10 pq 20...
        handled = handle(
            get_two_way_number_for_recipient(self.users[0]),
            'soh {loc} {report}'.format(
                loc='loc1',
                report=' '.join('%s %s' % (k, v) for k, v in amounts.items())),
            None)
        self.assertTrue(handled)
        forms = list(get_commtrack_forms(self.domain.name))
        self.assertEqual(1, len(forms))
        self.assertEqual(_get_location_from_sp(self.sp),
                         _get_location_from_form(forms[0]))

        self.assertEqual(1, StockReport.objects.count())
        report = StockReport.objects.all()[0]
        self.assertEqual(forms[0]._id, report.form_id)
        self.assertEqual('balance', report.type)
        self.assertEqual(3, report.stocktransaction_set.count())

        for code, amt in amounts.items():
            [product] = [p for p in self.products if p.code_ == code]
            trans = StockTransaction.objects.get(product_id=product._id)
            self.assertEqual(self.sp.case_id, trans.case_id)
            self.assertEqual(0, trans.quantity)
            self.assertEqual(amt, trans.stock_on_hand)
Exemple #10
0
    def get_two_way_entry_or_phone_number(cls, recipient, try_user_case=True, domain_for_toggles=None):
        """
        If recipient has a two-way number, returns it as a PhoneNumber entry.
        If recipient does not have a two-way number but has a phone number configured,
        returns the one-way phone number as a string.

        If try_user_case is True and recipient is a CommCareUser who doesn't have a
        two-way or one-way phone number, then it will try to get the two-way or
        one-way number from the user's user case if one exists.
        """
        if settings.USE_PHONE_ENTRIES:
            phone_entry = get_two_way_number_for_recipient(recipient)
            if phone_entry:
                return phone_entry

        phone_number = get_one_way_number_for_recipient(recipient)

        if toggles.INBOUND_SMS_LENIENCY.enabled(domain_for_toggles) and \
                toggles.ONE_PHONE_NUMBER_MULTIPLE_CONTACTS.enabled(domain_for_toggles):
            phone_entry = PhoneNumber.get_phone_number_for_owner(recipient.get_id, phone_number)
            if phone_entry:
                return phone_entry

        # Avoid processing phone numbers that are obviously fake (len <= 3) to
        # save on processing time
        if phone_number and len(phone_number) > 3:
            return phone_number

        if try_user_case and isinstance(recipient, CommCareUser) and recipient.memoized_usercase:
            return cls.get_two_way_entry_or_phone_number(recipient.memoized_usercase,
                                                         domain_for_toggles=domain_for_toggles)

        return None
    def testStockReportFixed(self):
        self.assertEqual(0, len(get_commtrack_forms(self.domain.name)))

        amounts = {
            'pp': 10,
            'pq': 20,
            'pr': 30,
        }
        # soh loc1 pp 10 pq 20...
        handled = handle(
            get_two_way_number_for_recipient(self.users[1]),
            'soh {report}'.format(report=' '.join(
                '%s %s' % (k, v) for k, v in amounts.items())), None)
        self.assertTrue(handled)
        forms = list(get_commtrack_forms(self.domain.name))
        self.assertEqual(1, len(forms))
        self.assertEqual(_get_location_from_sp(self.sp),
                         _get_location_from_form(forms[0]))

        for code, amt in amounts.items():
            [product] = filter(lambda p: p.code_ == code, self.products)
            trans = StockTransaction.objects.get(product_id=product._id)
            self.assertEqual(self.sp.case_id, trans.case_id)
            self.assertEqual(0, trans.quantity)
            self.assertEqual(amt, trans.stock_on_hand)
Exemple #12
0
def send_translated_message(user, message, **kwargs):
    verified_number = get_two_way_number_for_recipient(user)
    if not verified_number:
        return False
    with localize(user.get_language_code()):
        send_sms_to_verified_number(verified_number, message % kwargs)
        return True
Exemple #13
0
    def get_two_way_entry_or_phone_number(cls, recipient, try_user_case=True):
        """
        If recipient has a two-way number, returns it as a PhoneNumber entry.
        If recipient does not have a two-way number but has a phone number configured,
        returns the one-way phone number as a string.

        If try_user_case is True and recipient is a CommCareUser who doesn't have a
        two-way or one-way phone number, then it will try to get the two-way or
        one-way number from the user's user case if one exists.
        """
        if use_phone_entries():
            phone_entry = get_two_way_number_for_recipient(recipient)
            if phone_entry:
                return phone_entry

        phone_number = get_one_way_number_for_recipient(recipient)

        # Avoid processing phone numbers that are obviously fake (len <= 3) to
        # save on processing time
        if phone_number and len(phone_number) > 3:
            return phone_number

        if try_user_case and isinstance(
                recipient, CommCareUser) and recipient.memoized_usercase:
            return cls.get_two_way_entry_or_phone_number(
                recipient.memoized_usercase)

        return None
    def testStockReportRoaming(self):
        self.assertEqual(0, len(get_commtrack_forms(self.domain.name)))
        amounts = {
            'pp': 10,
            'pq': 20,
            'pr': 30,
        }
        # soh loc1 pp 10 pq 20...
        handled = handle(get_two_way_number_for_recipient(self.users[0]), 'soh {loc} {report}'.format(
            loc='loc1',
            report=' '.join('%s %s' % (k, v) for k, v in amounts.items())
        ), None)
        self.assertTrue(handled)
        forms = list(get_commtrack_forms(self.domain.name))
        self.assertEqual(1, len(forms))
        self.assertEqual(_get_location_from_sp(self.sp), _get_location_from_form(forms[0]))

        self.assertEqual(1, StockReport.objects.count())
        report = StockReport.objects.all()[0]
        self.assertEqual(forms[0]._id, report.form_id)
        self.assertEqual('balance', report.type)
        self.assertEqual(3, report.stocktransaction_set.count())

        for code, amt in amounts.items():
            [product] = [p for p in self.products if p.code_ == code]
            trans = StockTransaction.objects.get(product_id=product._id)
            self.assertEqual(self.sp.case_id, trans.case_id)
            self.assertEqual(0, trans.quantity)
            self.assertEqual(amt, trans.stock_on_hand)
Exemple #15
0
    def get_message(self, recipient):
        user = recipient.owner
        if not user_has_reporting_location(user) or not get_two_way_number_for_recipient(user):
            return

        message, kwargs = self.get_message_for_location(user.location)
        if not message:
            return
        kwargs['name'] = user.name
        return message % kwargs
    def get_message(self, recipient):
        user = recipient.owner
        if not user_has_reporting_location(user) or not get_two_way_number_for_recipient(user):
            return

        message, kwargs = self.get_message_for_location(user.location)
        if not message:
            return
        kwargs['name'] = user.name
        return message % kwargs
    def test_multiline_message(self):
        quantities = {'fs': 100, 'md': 100, 'ff': 100, 'pc': 100}
        message = """
            hmk
            fs 100 md 100 ff 100 pc 100
        """
        verified_number = get_two_way_number_for_recipient(self.user1)
        msg = incoming(verified_number.phone_number, message,
                       verified_number.backend_id)
        self.assertIsNotNone(msg)

        stock_states = StockState.objects.filter(
            case_id=self.facility_sp_id).values_list('sql_product__code',
                                                     'stock_on_hand')

        for product_code, quantity in stock_states:
            self.assertEqual(quantity, quantities[product_code])
Exemple #18
0
    def testStockReportFixed(self):
        self.assertEqual([], list(iter_commtrack_forms(self.domain.name)))
        amounts = {
            'pp': 10,
            'pq': 20,
            'pr': 30,
        }
        # soh loc1 pp 10 pq 20...
        handled = handle(
            get_two_way_number_for_recipient(self.users[1]),
            'soh {report}'.format(report=' '.join(
                '%s %s' % (k, v) for k, v in amounts.items())), None)
        self.assertTrue(handled)
        forms = list(iter_commtrack_forms(self.domain.name))
        self.assertEqual(1, len(forms))
        self.assertEqual(_get_location_from_sp(self.sp),
                         _get_location_from_form(forms[0]))

        ledger_transactions = LedgerAccessorSQL.get_ledger_transactions_for_case(
            self.sp.case_id)
        self.check_transaction_amounts(ledger_transactions, amounts)
Exemple #19
0
    def test_multiline_message(self):
        quantities = {
            'fs': 100,
            'md': 100,
            'ff': 100,
            'pc': 100
        }
        message = """
            hmk
            fs 100 md 100 ff 100 pc 100
        """
        verified_number = get_two_way_number_for_recipient(self.user1)
        msg = incoming(
            verified_number.phone_number, message, verified_number.backend_id
        )
        self.assertIsNotNone(msg)

        stock_states = StockState.objects.filter(
            case_id=self.facility_sp_id
        ).values_list('sql_product__code', 'stock_on_hand')

        for product_code, quantity in stock_states:
            self.assertEqual(quantity, quantities[product_code])
    def test_soh_and_receipt(self):
        handled = handle(get_two_way_number_for_recipient(self.users[0]), 'pp 20.30', None)
        self.assertTrue(handled)

        self.check_stock('pp', Decimal(20))
    def test_soh_and_receipt(self):
        handled = handle(get_two_way_number_for_recipient(self.users[0]),
                         'pp 20.30', None)
        self.assertTrue(handled)

        self.check_stock('pp', Decimal(20))
Exemple #22
0
 def get_recipients(self):
     for user in self.get_users():
         vn = get_two_way_number_for_recipient(user)
         if vn and self.recipients_filter(user):
             yield vn