Example #1
0
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