fix: include person_uuid for Member import from CORE API
				
					
				
			so we correctly associate Customer / Person / Member
This commit is contained in:
		
							parent
							
								
									6f7fa65c09
								
							
						
					
					
						commit
						eb9a1ae4f0
					
				
					 1 changed files with 53 additions and 3 deletions
				
			
		|  | @ -29,6 +29,7 @@ import decimal | |||
| import logging | ||||
| from collections import OrderedDict | ||||
| 
 | ||||
| import sqlalchemy as sa | ||||
| from sqlalchemy import orm | ||||
| 
 | ||||
| from rattail import importing | ||||
|  | @ -800,14 +801,13 @@ class MemberImporter(FromCOREPOSAPI, corepos_importing.model.MemberImporter): | |||
|     """ | ||||
|     Importer for member data from CORE POS API. | ||||
|     """ | ||||
|     # TODO use this key instead | ||||
|     #key = 'corepos_card_number' | ||||
|     key = 'number' | ||||
|     key = 'corepos_card_number' | ||||
|     supported_fields = [ | ||||
|         'number', | ||||
|         'corepos_account_id', | ||||
|         'corepos_card_number', | ||||
|         'customer_uuid', | ||||
|         'person_uuid', | ||||
|         'person_first_name', | ||||
|         'person_last_name', | ||||
|         'membership_type_number', | ||||
|  | @ -837,9 +837,57 @@ class MemberImporter(FromCOREPOSAPI, corepos_importing.model.MemberImporter): | |||
|             model.Customer, | ||||
|             key='number') | ||||
| 
 | ||||
|         query = self.session.query(model.Person)\ | ||||
|                             .outerjoin(model.Customer, | ||||
|                                        model.Customer.account_holder_uuid == model.Person.uuid)\ | ||||
|                             .outerjoin(model.CoreCustomer)\ | ||||
|                             .outerjoin(model.Member, | ||||
|                                        model.Member.person_uuid == model.Person.uuid)\ | ||||
|                             .outerjoin(model.CoreMember)\ | ||||
|                             .filter(sa.or_( | ||||
|                                 model.CoreCustomer.corepos_card_number != None, | ||||
|                                 model.CoreMember.corepos_card_number != None))\ | ||||
|                             .options(orm.joinedload(model.Person.customer_accounts)\ | ||||
|                                      .joinedload(model.Customer._corepos)) | ||||
|         def card_number(person, normal): | ||||
|             customer = self.app.get_customer(person) | ||||
|             if customer and customer.corepos_card_number: | ||||
|                 return customer.corepos_card_number | ||||
|             member = self.app.get_member(person) | ||||
|             if member and member.corepos_card_number: | ||||
|                 return member.corepos_card_number | ||||
|         self.people_by_card_number = self.cache_model(model.Person, query=query, | ||||
|                                                       key=card_number) | ||||
| 
 | ||||
|     def get_host_objects(self): | ||||
|         return self.get_core_members() | ||||
| 
 | ||||
|     def get_person(self, card_number): | ||||
|         if hasattr(self, 'people_by_card_number'): | ||||
|             return self.people_by_card_number.get(card_number) | ||||
| 
 | ||||
|         model = self.model | ||||
| 
 | ||||
|         try: | ||||
|             return self.session.query(model.Person)\ | ||||
|                                .join(model.Customer, | ||||
|                                      model.Customer.account_holder_uuid == model.Person.uuid)\ | ||||
|                                .join(model.CoreCustomer)\ | ||||
|                                .filter(model.CoreCustomer.corepos_card_number == card_number)\ | ||||
|                                .one() | ||||
|         except orm.exc.NoResultFound: | ||||
|             pass | ||||
| 
 | ||||
|         try: | ||||
|             return self.session.query(model.Person)\ | ||||
|                                .join(model.Member, | ||||
|                                      model.Member.person_uuid == model.Person.uuid)\ | ||||
|                                .join(model.CoreMember)\ | ||||
|                                .filter(model.CoreMember.corepos_card_number == card_number)\ | ||||
|                                .one() | ||||
|         except orm.exc.NoResultFound: | ||||
|             pass | ||||
| 
 | ||||
|     def get_customer_by_number(self, number): | ||||
|         if hasattr(self, 'customers_by_number'): | ||||
|             return self.customers_by_number.get(number) | ||||
|  | @ -860,6 +908,7 @@ class MemberImporter(FromCOREPOSAPI, corepos_importing.model.MemberImporter): | |||
|     def normalize_host_object(self, member): | ||||
|         card_number = member['cardNo'] | ||||
|         customer = self.get_customer_by_number(card_number) | ||||
|         person = self.get_person(card_number) | ||||
| 
 | ||||
|         # TODO: at first i was *skipping* non-member status records, | ||||
|         # but since CORE sort of assumes all customers are members, | ||||
|  | @ -902,6 +951,7 @@ class MemberImporter(FromCOREPOSAPI, corepos_importing.model.MemberImporter): | |||
|             'corepos_account_id': int(member['customerAccountID']), | ||||
|             'corepos_card_number': card_number, | ||||
|             'customer_uuid': customer.uuid if customer else None, | ||||
|             'person_uuid': person.uuid if person else None, | ||||
|             'person_first_name': None, | ||||
|             'person_last_name': None, | ||||
|             'membership_type_number': typeno, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lance Edgar
						Lance Edgar