Dim LinkFound As Boolean = False
'Temp Variables
Dim PartNo As String = ""
Dim SerialNo As String = ""
Dim DelQty As Double = 0

'Update SalesOrder
For Each SORow As DataRow In tbLineDetails.Rows
	LinkFound = False

	If SORow("LinkID").ToString <> "" Then
		'Update LineDetail
		For i = 1 To .SalesOrderLines.Count

			If .SalesOrderLines(i).PartNo = SORow("PartNo").ToString Then
				For j = 1 To .SalesOrderLines(i).LineDetails.Count
					If .SalesOrderLines(i).LineDetails(j).SOHID = SORow("LinkID").ToString Then
						LinkFound = True
						.SalesOrderLines(i).Picked = True

						If Math.Round(.SalesOrderLines(i).LineDetails(j).Quantity, 2) <> Math.Round(CType(SORow("DelQty"), Double), 2) Then
							.SalesOrderLines(i).LineDetails(j).Quantity = CDec(CType(SORow("DelQty"), Double))
						End If

						Exit For 'LineDetails
					End If
				Next
			End If

			If LinkFound = True Then
				Exit For        ' SalesOrderLines
			End If
		Next
	Else
		'Add new LineDetail
		For i = 1 To .SalesOrderLines.Count
			If .SalesOrderLines(i).PartNo = SORow("PartNo").ToString Then
				PartNo = SORow("PartNo").ToString
				SerialNo = SORow("SerialNo").ToString
				DelQty = CType(SORow("DelQty"), Double)
				Dim AllocQty As Double = 0
				Dim PickedQty As Double = CType(SORow("PCQty"), Double)

				SB = New StringBuilder
				SB.Append("SELECT   *").AppendLine()
				SB.Append("FROM     IN_SOH").AppendLine()
				SB.Append("WHERE    SerialNo = '").Append(SORow("SerialNo").ToString).AppendLine("'")
				SB.Append("AND      InventoryID = '").Append(.SalesOrderLines(i).InventoryID).AppendLine("'")
				SB.Append("AND      IN_LogicalID = '").Append(.LogicalWarehouseResidingIn.IN_LogicalID).AppendLine("'")
				SB.Append("AND      QuantityLeft > 0").AppendLine()
				SB.Append("ORDER BY DateIn")
				Dim daSOH As New SqlDataAdapter(SB.ToString, JiwaCon)
				Dim dsSOH As New DataSet
				daSOH.Fill(dsSOH, "IN_SOH")

				If dsSOH.Tables("IN_SOH").Rows.Count > 0 Then
					For Each SOHRow As DataRow In dsSOH.Tables("IN_SOH").Rows
						Dim Quantity As Double = Math.Min(CType(SOHRow("QuantityLeft"), Double), PickedQty)

						If Math.Round(Quantity, 2) > 0 Then
							'.SalesOrderLines(i).AddLineDetail(SOHRow("LinkID").ToString, CType(SOHRow("DateIn"), DateTime), CType(SOHRow("LCostIn"), Double), Quantity, CType(SOHRow("ExpiryDate"), DateTime))
							.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).SOHID = SOHRow("LinkID").ToString
							.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).DateIn = CType(SOHRow("DateIn"), DateTime)
							.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).Cost = CType(SOHRow("LCostIn"), Decimal)
							.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).Quantity = CDec(Quantity)
							.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).ExpiryDate = CType(SOHRow("ExpiryDate"), DateTime)
							.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).SerialNo = SOHRow("SerialNo").ToString
							AllocQty += Quantity
							.SalesOrderLines(i).Picked = True

							If Math.Round(AllocQty, 2) >= Math.Round(PickedQty, 2) Then
								Exit For
							End If
						End If
					Next    'SOHRow

					If Math.Round(AllocQty, 2) < Math.Round(PickedQty, 2) Then
						'Insufficient stock selected.  Select balance without a serial number filter
						SB = New StringBuilder
						SB.Append("SELECT   *").AppendLine()
						SB.Append("FROM     IN_SOH").AppendLine()
						SB.Append("WHERE    InventoryID = '").Append(.SalesOrderLines(i).InventoryID).AppendLine("'")
						SB.Append("AND      IN_LogicalID = '").Append(.LogicalWarehouseResidingIn.IN_LogicalID).AppendLine("'")
						SB.Append("AND      QuantityLeft > 0").AppendLine()
						SB.Append("ORDER BY DateIn")
						daSOH = New SqlDataAdapter(SB.ToString, JiwaCon)
						dsSOH = New DataSet
						daSOH.Fill(dsSOH, "IN_SOH")

						If dsSOH.Tables("IN_SOH").Rows.Count > 0 Then
							For Each SOHRow As DataRow In dsSOH.Tables("IN_SOH").Rows
								Dim Quantity As Double = Math.Min(CType(SOHRow("QuantityLeft"), Double), (PickedQty - AllocQty))

								If Math.Round(Quantity, 2) > 0 Then
									'.SalesOrderLines(i).AddLineDetail(SOHRow("LinkID").ToString, CType(SOHRow("DateIn"), DateTime), CType(SOHRow("LCostIn"), Double), Quantity, CType(SOHRow("ExpiryDate"), DateTime))
									.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).SOHID = SOHRow("LinkID").ToString
									.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).DateIn = CType(SOHRow("DateIn"), DateTime)
									.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).Cost = CType(SOHRow("LCostIn"), Decimal)
									.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).Quantity = CDec(Quantity)
									.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).ExpiryDate = CType(SOHRow("ExpiryDate"), DateTime)
									.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).SerialNo = SOHRow("SerialNo").ToString
									AllocQty += Quantity
									.SalesOrderLines(i).Picked = True

									If Math.Round(AllocQty, 2) >= Math.Round(PickedQty, 2) Then
										Exit For
									End If
								End If
							Next    'SOHRow
						End If
					End If

					If Math.Round(AllocQty, 2) < Math.Round(PickedQty, 2) Then
						'Insufficient stock in Jiwa available for selection
						SB = New StringBuilder
						SB.Append("Insufficient SOH for ").Append(.SalesOrderLines(i).PartNo).Append(" on Invoice ").Append(.InvoiceNo).AppendLine()
						SB.Append("Quantity picked = ").Append(PickedQty.ToString).Append(".  Jiwa quantity available = ").Append(AllocQty.ToString)
						EmailStockShortageAlert(SB.ToString)
					End If
				Else
					'No stock selected.  Select stock without a serial number filter
					SB = New StringBuilder
					SB.Append("SELECT   *").AppendLine()
					SB.Append("FROM     IN_SOH").AppendLine()
					SB.Append("WHERE    InventoryID = '").Append(.SalesOrderLines(i).InventoryID).AppendLine("'")
					SB.Append("AND      IN_LogicalID = '").Append(.LogicalWarehouseResidingIn.IN_LogicalID).AppendLine("'")
					SB.Append("AND      QuantityLeft > 0").AppendLine()
					SB.Append("ORDER BY DateIn")
					daSOH = New SqlDataAdapter(SB.ToString, JiwaCon)
					dsSOH = New DataSet
					daSOH.Fill(dsSOH, "IN_SOH")

					If dsSOH.Tables("IN_SOH").Rows.Count > 0 Then
						For Each SOHRow As DataRow In dsSOH.Tables("IN_SOH").Rows
							Dim Quantity As Double = Math.Min(CType(SOHRow("QuantityLeft"), Double), (PickedQty - AllocQty))

							If Math.Round(Quantity, 2) > 0 Then
								'.SalesOrderLines(i).AddLineDetail(SOHRow("LinkID").ToString, CType(SOHRow("DateIn"), DateTime), CType(SOHRow("LCostIn"), Double), Quantity, CType(SOHRow("ExpiryDate"), DateTime))
								.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).SOHID = SOHRow("LinkID").ToString
								.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).DateIn = CType(SOHRow("DateIn"), DateTime)
								.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).Cost = CType(SOHRow("LCostIn"), Decimal)
								.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).Quantity = CDec(Quantity)
								.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).ExpiryDate = CType(SOHRow("ExpiryDate"), DateTime)
								.SalesOrderLines(i).LineDetails(.SalesOrderLines(i).LineDetails.Count).SerialNo = SOHRow("SerialNo").ToString
								AllocQty += Quantity
								.SalesOrderLines(i).Picked = True

								If Math.Round(AllocQty, 2) >= Math.Round(PickedQty, 2) Then
									Exit For
								End If
							End If
						Next    'SOHRow
					End If

					If Math.Round(AllocQty, 2) < Math.Round(PickedQty, 2) Then
						'Insufficient stock in Jiwa available for selection
						SB = New StringBuilder
						SB.Append("Insufficient SOH for ").Append(.SalesOrderLines(i).PartNo).Append(" on Invoice ").Append(.InvoiceNo).AppendLine()
						SB.Append("Quantity picked = ").Append(PickedQty.ToString).Append(".  Jiwa quantity available = ").Append(AllocQty.ToString)
						EmailStockShortageAlert(SB.ToString)
					End If
				End If
			End If
		Next                'SalesOrderLine
	End If
Next                        'SORow

'Check SalesOrderLine Totals
For i = 1 To .SalesOrderLines.Count
	Dim TotalQty As Double = 0

	For j = 1 To .SalesOrderLines(i).LineDetails.Count
		TotalQty += .SalesOrderLines(i).LineDetails(j).Quantity
	Next

	.SalesOrderLines(i).QuantityThisDelivery = CDec(TotalQty)
Next

'.Reference = "Goods Dispatched"
'.SalesOrderHistorys.Item(1).EDIPickStatus = JiwaSalesOrder.SalesOrderHistoryEDIPickStatuses.e_SalesOrderHistoryEDIPickStatusPicked

jump:               
If BatchNotExisting = True Then
	.Reference = "Goods not Dispatched"
	.SalesOrderHistorys.Item(1).EDIPickStatus = JiwaSales.SalesOrder.SalesOrder.SalesOrderHistoryEDIPickStatuses.e_SalesOrderHistoryEDIPickStatusPicking
	EmailNotesAlertForBatchNotExist("is contained Batch Number/s, that do not exist in Jiwa")
Else
	.Reference = "Goods Dispatched"
	.SalesOrderHistorys.Item(1).EDIPickStatus = JiwaSales.SalesOrder.SalesOrder.SalesOrderHistoryEDIPickStatuses.e_SalesOrderHistoryEDIPickStatusPicked
End If
'----------------
.Save() 