def cabin_visit(product_data, user): # Create an order with a cabin settlement product order = Order( amount=0, # Default to 0 and update to correct amount later language_code=product_data['språk'], ) if not user.is_anonymous(): order.user = user order.save() # Save to DB in order to create relations, even though we'll have to do an UPDATE later cabin_settlement = CabinSettlement(order=order) if 'brukerdata' in product_data: cabin_settlement.name = product_data['brukerdata']['navn'] cabin_settlement.email = product_data['brukerdata']['epost'] cabin_settlement.save() amount = 0 for cabin in product_data['hytter']: sted = Sted.get(cabin['id']) # @TODO: Use private fields to get the appropriate owner: first forening of privat.juridisk_eier, # privat.vedlikeholdes_av forening = Forening.objects.get(turbasen_object_id=sted['grupper'][0]) cabin_visit = CabinVisit( cabin_settlement=cabin_settlement, cabin_object_id=sted['_id'], ) cabin_visit.save() for losji in cabin['losji']: # Business rule: Anyone claiming to be a member will get the membership price pays_membership_price = losji['ermedlem'] lodging = Lodging.objects.get( id=losji['id'], forening=forening.id, ) if losji['antall'] < 0: raise PermissionDenied # Try to relate this visitor to a user user = None memberid_unrecognized = None if losji['medlemsnummer'] is not None: try: user = User.get_or_create_inactive(memberid=losji['medlemsnummer']) # Note that this is where we could verify that the member has paid their annual fee, but it is # currently ignored except User.DoesNotExist: # We received an unrecognized memberid, but we'll still allow the purchase, so save the given # memberid for future reference, whatever it is memberid_unrecognized = losji['medlemsnummer'] # Save the visitor details cabin_visitor = CabinVisitor( cabin_visit=cabin_visit, protocol_number=losji['protokollnummer'], user=user, memberid_unrecognized=memberid_unrecognized, lodging_type=lodging.name, price=lodging.get_price(pays_membership_price), nights=losji['antall'], paid_membership_price=pays_membership_price, ) cabin_visitor.save() # Now calculate the lodging price and add it to the total amount amount += lodging.get_price(pays_membership_price) * losji['antall'] for proviant in cabin['proviant']: # Business rule: The client decides whether or not supplies should have membership price pays_membership_price = product_data['medlemspris'] supply = Supply.objects.get( id=proviant['id'], supply_category__forening=forening.id, ) if proviant['antall'] < 0: raise PermissionDenied # Save a copy of the current products and prices supply_purchase = SupplyPurchase( cabin_visit=cabin_visit, category=supply.supply_category.name, name=supply.name, price=supply.get_price(pays_membership_price), count=proviant['antall'], paid_membership_price=pays_membership_price, ) supply_purchase.save() # Now calculate the supplies price and add it to the total amount amount += supply.get_price(pays_membership_price) * proviant['antall'] # Save the total amount in øre amount *= 100 order.amount = amount order.save() return order