| Line 287... |
Line 287... |
| 287 |
codRequirements[lineitem.item_id] += lineitem.quantity
|
287 |
codRequirements[lineitem.item_id] += lineitem.quantity
|
| 288 |
else:
|
288 |
else:
|
| 289 |
codRequirements[lineitem.item_id] = lineitem.quantity
|
289 |
codRequirements[lineitem.item_id] = lineitem.quantity
|
| 290 |
|
290 |
|
| 291 |
advancedPOParameters = {}
|
291 |
advancedPOParameters = {}
|
| - |
|
292 |
SKUListForPO = []
|
| - |
|
293 |
inventory_client = InventoryClient().get_client()
|
| - |
|
294 |
itemStockPurchaseParams = inventory_client.getNonZeroItemStockPurchaseParams()
|
| - |
|
295 |
for itemStockPurchaseParam in itemStockPurchaseParams:
|
| - |
|
296 |
inventory_client = InventoryClient().get_client()
|
| - |
|
297 |
oosStatuses = inventory_client.getOosStatusesForXDaysForItem(itemStockPurchaseParam.item_id,5)
|
| - |
|
298 |
salesCount = 0
|
| - |
|
299 |
numDaysInStock = 0
|
| - |
|
300 |
avgSales = 0.0
|
| - |
|
301 |
lastXdaysSale =""
|
| - |
|
302 |
for oosStatus in oosStatuses:
|
| - |
|
303 |
if oosStatus.is_oos == False:
|
| - |
|
304 |
salesCount = salesCount + oosStatus.num_orders
|
| - |
|
305 |
numDaysInStock = numDaysInStock + 1
|
| - |
|
306 |
lastXdaysSale = lastXdaysSale + str(oosStatus.num_orders) + "-"
|
| - |
|
307 |
else:
|
| - |
|
308 |
lastXdaysSale = lastXdaysSale + "X-"
|
| - |
|
309 |
lastXdaysSale = lastXdaysSale[:-1]
|
| - |
|
310 |
if numDaysInStock>0:
|
| - |
|
311 |
avgSales = float(salesCount)/numDaysInStock
|
| - |
|
312 |
advancedPOParameters[itemStockPurchaseParam.item_id] = [round(avgSales * itemStockPurchaseParam.numOfDaysStock), avgSales, numDaysInStock, itemStockPurchaseParam.minStockLevel, itemStockPurchaseParam.numOfDaysStock, lastXdaysSale]
|
| - |
|
313 |
if itemInventorySnapshot.has_key(itemStockPurchaseParam.item_id):
|
| - |
|
314 |
itemAvailability = itemInventorySnapshot.get(itemStockPurchaseParam.item_id)
|
| - |
|
315 |
currentAvailability = 0
|
| - |
|
316 |
currentReserved = 0
|
| - |
|
317 |
for wId, rQty in itemAvailability.reserved.iteritems():
|
| - |
|
318 |
if wId in ourGoodWarehouseIds:
|
| - |
|
319 |
currentReserved = currentReserved + rQty
|
| - |
|
320 |
if (availability[itemStockPurchaseParam.item_id][0] - currentReserved) < max(advancedPOParameters[itemStockPurchaseParam.item_id][0], advancedPOParameters[itemStockPurchaseParam.item_id][3]):
|
| - |
|
321 |
SKUListForPO.append(itemStockPurchaseParam.item_id)
|
| - |
|
322 |
else:
|
| - |
|
323 |
SKUListForPO.append(itemStockPurchaseParam.item_id)
|
| - |
|
324 |
|
| 292 |
for key in requirements:
|
325 |
for key in requirements:
|
| - |
|
326 |
if advancedPOParameters.has_key(key):
|
| - |
|
327 |
continue
|
| 293 |
inventory_client = InventoryClient().get_client()
|
328 |
inventory_client = InventoryClient().get_client()
|
| 294 |
oosStatuses = inventory_client.getOosStatusesForXDaysForItem(key,5)
|
329 |
oosStatuses = inventory_client.getOosStatusesForXDaysForItem(key,5)
|
| 295 |
salesCount = 0
|
330 |
salesCount = 0
|
| 296 |
numDaysInStock = 0
|
331 |
numDaysInStock = 0
|
| 297 |
avgSales = 0
|
332 |
avgSales = 0.0
|
| - |
|
333 |
lastXdaysSale = ""
|
| 298 |
for oosStatus in oosStatuses:
|
334 |
for oosStatus in oosStatuses:
|
| 299 |
if oosStatus.is_oos == False:
|
335 |
if oosStatus.is_oos == False:
|
| 300 |
salesCount = salesCount + oosStatus.num_orders
|
336 |
salesCount = salesCount + oosStatus.num_orders
|
| 301 |
numDaysInStock = numDaysInStock + 1
|
337 |
numDaysInStock = numDaysInStock + 1
|
| - |
|
338 |
lastXdaysSale = lastXdaysSale + str(oosStatus.num_orders) + "-"
|
| - |
|
339 |
else:
|
| - |
|
340 |
lastXdaysSale = lastXdaysSale + "X-"
|
| - |
|
341 |
lastXdaysSale = lastXdaysSale[:-1]
|
| 302 |
if numDaysInStock>0:
|
342 |
if numDaysInStock>0:
|
| 303 |
avgSales = salesCount/numDaysInStock
|
343 |
avgSales = float(salesCount)/float(numDaysInStock)
|
| 304 |
itemStockPurchaseParam = ItemStockPurchaseParams()
|
344 |
itemStockPurchaseParam = ItemStockPurchaseParams()
|
| 305 |
itemStockPurchaseParam = inventory_client.getItemStockPurchaseParams(key)
|
345 |
itemStockPurchaseParam = inventory_client.getItemStockPurchaseParams(key)
|
| 306 |
advancedPOParameters[key] = [avgSales * itemStockPurchaseParam.numOfDaysStock, avgSales, numDaysInStock, itemStockPurchaseParam.minStockLevel, itemStockPurchaseParam.numOfDaysStock]
|
346 |
advancedPOParameters[key] = [round(avgSales * itemStockPurchaseParam.numOfDaysStock), avgSales, numDaysInStock, itemStockPurchaseParam.minStockLevel, itemStockPurchaseParam.numOfDaysStock, lastXdaysSale]
|
| 307 |
|
347 |
|
| - |
|
348 |
cumulativeRequirementsItemIds = list(set(requirements.keys()+SKUListForPO))
|
| 308 |
netRequirements = {}
|
349 |
netRequirements = {}
|
| 309 |
for itemId in requirements.keys():
|
350 |
for itemId in cumulativeRequirementsItemIds:
|
| 310 |
requirementsCount = requirements.get(itemId)
|
351 |
requirementsCount = requirements.get(itemId)
|
| - |
|
352 |
if requirementsCount is None:
|
| - |
|
353 |
requirementsCount = 0.0
|
| 311 |
if availability.has_key(itemId):
|
354 |
if availability.has_key(itemId):
|
| 312 |
availabilityCount = availability.get(itemId)[0]
|
355 |
availabilityCount = availability.get(itemId)[0]
|
| 313 |
item = availability.get(itemId)[1]
|
356 |
item = availability.get(itemId)[1]
|
| 314 |
if requirementsCount > availabilityCount:
|
357 |
if requirementsCount > availabilityCount or itemId in SKUListForPO:
|
| 315 |
if item.preferredVendor is None:
|
358 |
if item.preferredVendor is None:
|
| 316 |
raise PurchaseServiceException(101, 'Preferred Vendor missing for ' + " ".join([str(item.brand), str(item.modelName), str(item.modelNumber), str(item.color)]))
|
359 |
raise PurchaseServiceException(101, 'Preferred Vendor missing for ' + " ".join([str(item.brand), str(item.modelName), str(item.modelNumber), str(item.color)]))
|
| 317 |
if (netRequirements.has_key(item.preferredVendor)):
|
360 |
if (netRequirements.has_key(item.preferredVendor)):
|
| 318 |
netRequirements[item.preferredVendor].append([item, requirementsCount - availabilityCount])
|
361 |
netRequirements[item.preferredVendor].append([item, requirementsCount - availabilityCount])
|
| 319 |
else:
|
362 |
else:
|
| Line 348... |
Line 391... |
| 348 |
t_po_lineitem.quantity = quantity
|
391 |
t_po_lineitem.quantity = quantity
|
| 349 |
|
392 |
|
| 350 |
t_po_lineitem.availableQuantity = 0
|
393 |
t_po_lineitem.availableQuantity = 0
|
| 351 |
if availability.has_key(item.id):
|
394 |
if availability.has_key(item.id):
|
| 352 |
t_po_lineitem.availableQuantity = availability[item.id][0]
|
395 |
t_po_lineitem.availableQuantity = availability[item.id][0]
|
| - |
|
396 |
if requirements.has_key(item.id):
|
| 353 |
t_po_lineitem.reservedQuantity = requirements[item.id]
|
397 |
t_po_lineitem.reservedQuantity = requirements[item.id]
|
| 354 |
t_po_lineitem.suggestedQuantity = advancedPOParameters[item.id][0] + quantity
|
398 |
t_po_lineitem.suggestedQuantity = max(advancedPOParameters[item.id][0], advancedPOParameters[item.id][3]) + quantity
|
| 355 |
t_po_lineitem.avgSales = advancedPOParameters[item.id][1]
|
399 |
t_po_lineitem.avgSales = advancedPOParameters[item.id][1]
|
| 356 |
t_po_lineitem.numberOfDaysInStock = advancedPOParameters[item.id][2]
|
400 |
t_po_lineitem.numberOfDaysInStock = advancedPOParameters[item.id][2]
|
| 357 |
t_po_lineitem.minStockLevel = advancedPOParameters[item.id][3]
|
401 |
t_po_lineitem.minStockLevel = advancedPOParameters[item.id][3]
|
| 358 |
t_po_lineitem.numberOfDaysStock = advancedPOParameters[item.id][4]
|
402 |
t_po_lineitem.numberOfDaysStock = advancedPOParameters[item.id][4]
|
| - |
|
403 |
t_po_lineitem.lastXdaysSale = advancedPOParameters[item.id][5]
|
| 359 |
if codRequirements.has_key(item.id):
|
404 |
if codRequirements.has_key(item.id):
|
| 360 |
t_po_lineitem.codCount = min(codRequirements[item.id], quantity)
|
405 |
t_po_lineitem.codCount = min(codRequirements[item.id], quantity)
|
| 361 |
try:
|
406 |
try:
|
| 362 |
item_pricing = inventory_client.getItemPricing(item.id, vendorId)
|
407 |
item_pricing = inventory_client.getItemPricing(item.id, vendorId)
|
| 363 |
except Exception as e:
|
408 |
except Exception as e:
|