Ejemplo n.º 1
0
def process_nc2(file_name):
    incoming_name = os.path.join(INCOMING_ROOT, file_name)
    wh_records, errors = NC2CSVModel.import_data(data=open(incoming_name, 'rU'))
    wh_id = inventory_api.warehouse('NC2', {})['id']

    new_recs_ctr = 0
    exist_recs_ctr = 0
    errors_cnt = len(errors)

    for rec in wh_records:
        rec['warehouse_id'] = wh_id
        rec_obj = WarehouseFulfill.objects \
                                  .filter(warehouse_pack_id=rec['warehouse_pack_id']) \
                                  .first()
        if rec_obj:
            # if warehose fulfill object already exists ... skip to next one
            exist_recs_ctr += 1
        else:
            new_recs_ctr += 1
            rec_obj = WarehouseFulfill(**rec)
            rec_obj.save()

            if rec_obj.fulfillment:
                create_nc2_shippingcharge(rec_obj)

    summary_msg = 'Loaded NC2 file: %d new records, %d duplicate records, %d bad rows' \
                                    % (new_recs_ctr, exist_recs_ctr, errors_cnt)
    return summary_msg, errors
Ejemplo n.º 2
0
def create_fulfill_request(warehouse, order_id):
    warehouse_labels = [w['label'] for w in inventory_api.warehouse({})]
    unfulfilled_items = fulfill_api.unfulfilled(str(order_id), {})['unfulfilled_items']
    inv_items = dict((i['label'], i['id']) for i in products_api.inventoryitem({}))
    order = sales_api.sale(order_id, {})

    if unfulfilled_items is None:
        return 'FULFILL_ALREADY_REQUESTED'
    elif warehouse not in warehouse_labels:
        return 'WAREHOUSE_NOT_RECOGNISED'
    else:
        # now create a fulfillment request
        today = get_today()
        warehouse = Warehouse.objects.get(label=warehouse)

        fulfill_info = {}
        fulfill_info['request_date'] = today
        fulfill_info['warehouse_id'] = warehouse.id
        fulfill_info['order_id'] = str(order_id)
        fulfill_info['status'] = 'requested'
        fulfill_obj = Fulfillment(**fulfill_info)
        fulfill_obj.save()

        for label, quantity in unfulfilled_items.iteritems():
            inv_id = inv_items[label]
            fline_info = {}
            fline_info['inventory_item_id'] = inv_id
            fline_info['quantity'] = quantity
            fline_info['fulfillment_id'] = fulfill_obj.id
            fline_obj = FulfillLine(**fline_info)
            fline_obj.save()

        return 'FULFILL_REQUESTED'
Ejemplo n.º 3
0
def queue_orders(request):
    new_back_orders = 0
    warehouses = [w['label'] for w in inventory_api.warehouse({})]
    new_requests = dict((w,0) for w in warehouses)
    back_to_queue = dict((w,0) for w in warehouses)

    bad_requests = []

    if request.method == 'POST':
        for k,v in request.POST.iteritems():
            if k[:8] == 'q_choice' and v != '----':
                if v == 'Future Order':
                    rslt = create_backorder(k[9:])
                    if rslt == 'FULFILL_BACKORDERED':
                        new_back_orders += 1
                    else:
                        bad_requests.append(k[9:])
                elif v[:9] == 'Queue for':
                    wh = v[10:]
                    rslt = create_fulfill_request(wh, k[9:])
                    if rslt == 'FULFILL_REQUESTED':
                        new_requests[wh] += 1
                    else:
                        bad_requests.append(k[9:])
                elif 'Queue future order' in v:
                    wh = v[23:]
                    rslt = backorder_to_requested(wh, k[9:])
                    if rslt == 'BACKORDER_REQUESTED':
                        back_to_queue[wh] += 1
                    else:
                        bad_requests.append(k[9:])

        msg = '%d new future orders.' % new_back_orders
        for wh in warehouses:
            msg += ' %d new %s fulfillments.' % (new_requests[wh], wh)
        for wh in warehouses:
            msg += ' %d future orders to %s.' % (back_to_queue[wh], wh)
        msg += ' %d Bad requests' % len(bad_requests)
        messages.info(request, msg)
        
        return HttpResponseRedirect("/inventory/management")
    else:
        raise ValueError("This resource requires a POST request")
Ejemplo n.º 4
0
def process_nc2(file_name):
    incoming_name = os.path.join(INCOMING_ROOT, file_name)
    
    # TODO .... using pandas makes it all very ugly
    with open(incoming_name, 'U') as f:
        warehouse_records = pd.read_csv(incoming_name)

    new_recs_ctr = 0
    exist_recs_ctr = 0
    missing_ship_codes = 0

    # any pre-formatting of data here

    def rounder(f, places=2):
        if places==5:
            return Decimal(Decimal(f).quantize(Decimal('.00001'), rounding=ROUND_HALF_UP))
        else:
            return Decimal(Decimal(f).quantize(Decimal('.01'), rounding=ROUND_HALF_UP))

    records = []
    for k, v in warehouse_records.groupby('OrderNum'):
        pack_info = {}
        pack_info['warehouse_id'] = inventory_api.warehouse('NC2', {})['id']

        # have our orders be of form 'SAL.xxxx' or 'TRF.xxxx'
        # for most packs we are using first row
        top_row = v.iloc[0]
        savor_request_id = top_row['OrderNum'].replace('SAL.', '') \
                                              .replace('FLF', '') \
                                              .replace('TRF.', '')

        try:
            pack_info['fulfillment_id'] = savor_request_id
            # set default values
            pack_info['warehouse_pack_id'] = ','.join([str(n) for n in v['ShipNum'].values])
            pack_info['order_date'] = parse(top_row['OrderDate']).date()
            pack_info['request_date'] = parse(top_row['OrderDate']).date()
            pack_info['ship_date'] = parse(top_row['ShipDate']).date()
            pack_info['shipping_name'] = top_row['Name']
            pack_info['shipping_attn'] = top_row['Company']
            pack_info['shipping_zip'] = top_row['Zip']
            pack_info['shipping_country'] = top_row['Country']
            pack_info['ship_email'] = top_row['Email']

            pack_info['tracking_number'] = ','.join([str(n) for n in v['Tracking#'].values])[:90]
            pack_info['weight'] = sum([rounder(w, places=5) for w in v['Weight [Lbs.]'].values])
            pack_info['shipping_cost'] = sum([rounder(w, places=2) for w in v['ShippingCost'].values])
            pack_info['handling_cost'] = sum([rounder(w, places=2) for w in v['HandlingCost'].values])

            ship_code = top_row['ShipMethod']
            SHIP_MAP = {'FEG': 'FEDEX_GROUND', 'PMD': 'USPS_PRIORITY', 'GRND': 'UPS_GROUND',
                        'FDXHD': 'FEDEX_GROUND'}
            if ship_code not in SHIP_MAP:
                missing_ship_codes += 1
            else:
                pack_info['shipping_type_id'] = inventory_api.shippingtype(SHIP_MAP[ship_code], {})['id']

            pack_obj = WarehouseFulfill.objects.filter(warehouse_pack_id=pack_info['warehouse_pack_id']).first()
            if pack_obj:
                # if warehose fulfill object already exists ... skip to next one
                exist_recs_ctr += 1
            else:
                new_recs_ctr += 1
                pack_obj = WarehouseFulfill(**pack_info)
                pack_obj.save()
        except BaseException as e:
            logger.error('NC2 record: failed to load %s. Error: %s' % (savor_request_id, str(e)))

    return exist_recs_ctr, new_recs_ctr, missing_ship_codes