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)
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 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)
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
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)
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)
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
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)
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])
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)
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))
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