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
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'
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")
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