def process_item(rent_list_item):
        """
        Blah
        """
        user = rent_list_item.user

        profile = user.get_profile()
        zip_code = profile.shipping_zip
        rent_list = RentList.objects.filter(user=user, rent_order=None)

        def chain_objects(o1, objects=[]):
            return itertools.chain([o1] if o1 else [], itertools.ifilter(lambda x: x != o1, objects))

        debug("Home DC: %s", profile.dropship)

        from project.inventory.models import Dropship

        dropships = list(chain_objects(profile.dropship, Dropship.list_by_distance(zip_code)))

        def find_dropship(item):
            for dropship in dropships:
                if dropship.is_game_available(item, for_rent=True):
                    return dropship
            return None

        rent_plan = MemberRentalPlan.get_current_plan(user)

        for list_item in chain_objects(rent_list_item, rent_list):
            dc = find_dropship(list_item.item)

            debug("Processing: %s %s...", list_item.user, list_item.item)

            if not dc:
                # TODO: Create report
                debug("Create report")
                continue

            if not rent_plan.is_valid():
                return False

            order = RentOrder.create(user, list_item, dc)
            debug("Rent order was created: %s", order)
            return True

        return False
Beispiel #2
0
    def import_rent_orders(self, user_id):
        user = User.objects.get(id=user_id)
        shipping = user.get_profile().get_shipping_address_data('shipping')
        
        def get_label_data(history_record_id, label_type):
            c = self.mconn.cursor()
            c.execute('''
                select image_filename, tracking_code FROM endicia_labels where ref_history_record = %s and label_type = %s
            ''', [history_record_id, label_type])
            for image_filename, tracking_code in c.fetchall():
                return image_filename, tracking_code
            return None, None
        
        c = self.mconn.cursor()
        c.execute('''
            select 
                i.upc, 
                h.sent_date, 
                group_concat(h.delivered_date order by h.delivered_date), 
                h.sent_code, 
                group_concat(h.from_center order by h.from_center), 
                group_concat(h.returned_date order by h.returned_date), 
                group_concat(h.id order by h.id)
            from history_records h
                inner join items i on i.id=h.ref_item
            where h.ref_user = %s
            group by h.ref_item, h.sent_date, h.sent_code
            order by h.sent_date
        ''', [user_id,])
        for upc, sent_date, delivered_date, sent_code, from_center, returned_date, history_record_id in c.fetchall():
            delivered_date = delivered_date.split(',')[-1]
            delivered_date = datetime.strptime(delivered_date, '%Y-%m-%d %H:%M:%S') if delivered_date != '0000-00-00 00:00:00' else None
            from_center = int(from_center.split(',')[-1])
            returned_date = returned_date.split(',')[-1]
            returned_date = datetime.strptime(returned_date, '%Y-%m-%d') if returned_date != '0000-00-00' else None
            history_record_id = int(history_record_id.split(',')[-1])

            item = self.get_item(upc)
            if not item: 
                if returned_date is None:
                    self.missing_items.add(id)
                continue 
            
            outgoing_mail_label, outgoing_tracking_number = get_label_data(history_record_id, 'rental_mailing')
            incoming_mail_label, incoming_tracking_number = get_label_data(history_record_id, 'rental_return')
            
            if outgoing_mail_label:
                outgoing_mail_label = 'media/labels/old/endicia/' + outgoing_mail_label
            if incoming_mail_label:
                incoming_mail_label = 'media/labels/old/endicia/' + incoming_mail_label
            
            o = RentOrder(
                user = user,
                item = item,
                status = RentOrderStatus.Returned if returned_date else RentOrderStatus.Shipped,
                date_rent = sent_date,
                date_prepared = sent_date,
                date_shipped = sent_date,
                date_delivered = delivered_date,
                date_returned = returned_date,
                
                source_dc_id = self.DROPSHIP_MAP.get(from_center),
                inventory = self.entries.get(sent_code),
    
                first_name = user.first_name,
                last_name = user.last_name,

                outgoing_mail_label = outgoing_mail_label,
                outgoing_tracking_number = outgoing_tracking_number,
                incoming_mail_label = incoming_mail_label,
                incoming_tracking_number = incoming_tracking_number,
                
                **shipping
            )
            o.save()
Beispiel #3
0
    def do_process_cancellations(self):
        debug("Processing expired plans...")
        for p in MemberRentalPlan.objects.filter(status=RentalPlanStatus.Expired):
            user = p.user
            orders = RentOrder.list_stolen_games(user)
            if orders.count() == 0:
                p.delete()
                continue

            for order in orders.filter(penalty_payment=None):
                order.take_penalty_payment()

            if p.expiration_date > datetime.datetime.now().date() - datetime.timedelta(10):
                continue

            if p.buy_games_at_home():
                p.delete()
                continue

            p.status = RentalPlanStatus.Collection
            p.save()

        debug("Processing plans that could be canceled...")
        for p in MemberRentalPlan.objects.filter(status=RentalPlanStatus.CanceledP):
            user = p.user
            orders = RentOrder.list_stolen_games(user)
            if orders.count() == 0:
                debug("There is no games at home. Subscription could be canceled")
                p.finish_cancellation()
                continue

            if not p.cancellation_date:
                continue
            if orders.filter(date_rent__lt=datetime.datetime(2010, 10, 1)).count():
                # FIXME: temporary stub
                continue
            has_claims = False
            for o in orders:
                has_claims = o.claims().count() > 0
                if has_claims: break
            if has_claims:
                continue
            if p.cancellation_date < datetime.datetime(2010, 12, 23).date() - datetime.timedelta(10):
                p.cancellation_date = None

            debug("Processing %s...", p.user)

            for order in orders.filter(penalty_payment=None):
                order.take_penalty_payment()

            if not p.cancellation_date:
                p.cancellation_date = datetime.datetime.now().date()
                p.save()

            date_x = datetime.datetime.now().date() - datetime.timedelta(10)

            if p.cancellation_date > date_x:
                debug("User has %s day(s) to return rented games", (p.cancellation_date - date_x).days)
                continue

            if p.buy_games_at_home():
                debug("All games are sold. Subscription could be canceled")
                p.finish_cancellation()
                continue

            debug('Changing plan status to "Collection"...')
            p.status = RentalPlanStatus.Collection
            p.save()

        debug("Processing plans that was suspended...")
        for p in MemberRentalPlan.objects.filter(status=RentalPlanStatus.Suspended):
            user = p.user
            orders = RentOrder.list_stolen_games(user)
            if orders.count() == 0:
                continue

            debug("Processing %s...", p.user)

            for order in orders.filter(penalty_payment=None):
                order.take_penalty_payment(penalty_reason=("SUSP", "Rent Suspension"))

            date_x = datetime.datetime.now() - datetime.timedelta(10)

            if p.suspend_date is None:
                p.suspend_date = datetime.datetime.now()
                p.save()
            if p.suspend_date > date_x:
                debug("User has %s day(s) to return rented games", (p.suspend_date - date_x).days)
                continue

            if p.buy_games_at_home(description="Rent Suspension", penalty_reason=("SUSP", "Rent Suspension")):
                continue

            debug('Changing plan status to "Collection"...')
            p.status = RentalPlanStatus.Collection
            p.save()