VbzCart/docs/archive/code/VBA/clsPackage
<VB> ' CLASS: clsPackage
Option Compare Database Option Explicit
Private vID As Long Private vSeq As Long Private vOrder As Long Private vShpmt As Long Private vWhenStarted As Variant Private vWhenFinished As Variant Private vNotes_StoreToBuyer As String Private vNotes_StoreToRecip As String Private vNotes_Internal As String 'Private vAddr As String Private vWhenChecked As Variant Public Sub Init(iFields As Fields)
With iFields vID = !ID vSeq = !Seq vOrder = !ID_Order vShpmt = Nz(!ID_Shipment) vWhenStarted = !WhenStarted vWhenFinished = !WhenFinished vNotes_StoreToBuyer = Nz(!Notes_StoreToBuyer) vNotes_StoreToRecip = Nz(!Notes_StoreToRecip) vNotes_Internal = Nz(!Notes_Internal) vWhenChecked = !WhenChecked End With
End Sub Public Sub Save() ' ACTION: save the object's data back to the database
With clsPackages .DataOpen If Located Then With .Data .Edit !Seq = vSeq !ID_Order = vOrder !ID_Shipment = IIf(vShpmt = 0, Null, vShpmt) !WhenStarted = vWhenStarted !WhenFinished = vWhenFinished !WhenChecked = vWhenChecked .Update End With End If .DataShut End With
End Sub Public Property Get ID() As Long
ID = vID
End Property Public Property Get Seq() As Long
Seq = vSeq
End Property Public Property Get Code() As String
Code = Me.Order.Code & "-" & Me.Seq
End Property Public Property Get Order_ID() As Long
Order_ID = vOrder
End Property Public Property Get Order() As clsOrder
Set Order = clsOrders.Item(vOrder)
End Property Public Property Get IsPacked() As Boolean ' ACTION: Returns TRUE iff the package has been finished (and placed into a shipment).
IsPacked = Not IsNull(vWhenFinished)
End Property Public Sub AddCharges(iIncludeShipping As Boolean) ' ACTION: create charge transactions for this package ' 1. 2002-08-24 THIS STEP IS NOT NEEDED: create a shipment if there isn't one assigned ' 2. for each item in the package, increment the qtyDone for the corresponding order item ' 3. create a transaction entry for this package in the order's transactions (ITEM) ' 4. set the package's "finished" timestamp (do this last) ' Dim objShip As clsShipment
Dim objItem As clsPackageItem Dim objList As Scripting.Dictionary Dim objTrx As clsTrxactn Dim curTotal As Currency Dim curShItm As Currency Dim curShPkg As Currency Dim curShPkgMax As Currency DBEngine.BeginTrans
STEP 1 - get/create shipment object/record ' If Me.ShipmentExists Then ' Set objShip = Me.Shipment ' Else ' If MsgBox("No shipment has been assigned. Ok to create a new one?", vbOKCancel, "Confirm") = vbOK Then ' Set objShip = objShipments.Create ' vShpmt = objShip.ID ' Else ' DBEngine.Rollback ' Exit Sub ' End If ' End If
' STEP 2 - increment order item's qtyDone & add the costs
Set objList = Me.Items For Each objItem In objList With objItem If .QtyShipped <> 0 Then ' negative = returned items .Ship curTotal = curTotal + .PriceTotal curShItm = curShItm + .ShipItemTotal curShPkg = .ShipPkgEffective GoSub CheckCancel End If End With If curShPkg > curShPkgMax Then curShPkgMax = curShPkg Next objItem
' STEP 3 - create transaction(s)
Set objTrx = New clsTrxactn With objTrx .Descr = "total for items being shipped" .Type_ID = kiTrxType_ItemShipped .Order_ID = Me.Order_ID .Package_ID = Me.ID .Amount = curTotal .SaveNew If iIncludeShipping Then ' create transactions for shipping charges ' - itemized shipping total .Descr = "itemized shipping total" .Type_ID = kiTrxType_ShippingItemized .Amount = curShItm .SaveNew ' - package charge .Descr = "shipping package" .Type_ID = kiTrxType_ShippingPackage .Amount = curShPkgMax .SaveNew End If End With GoSub CheckCancel
' STEP 4 - package's "finished" timestamp
vWhenFinished = Now
' CLEANUP
Me.Save DBEngine.CommitTrans Exit Sub
CheckCancel:
If doCancel Then DBEngine.Rollback Exit Sub End If Return
End Sub 'Public Function StockIsPulled() As Boolean ACTION: checks to see if at least one line item has been pulled from stock 'End Function Public Function FindItem(iItem As Long, iStartPkgItem As Long) As clsPackageItem ' ACTION: Returns the package item object for the given item; Nothing if not found. ' iStart is the ID of the package-item to start from (i.e. skip)
Dim sqlFilt As String Dim objItem As clsPackageItem Dim rs As Recordset
Set rs = clsPackageItems.Data_Items With rs sqlFilt = "(ID_Package=" & Me.ID & ") AND (ID_Item=" & iItem & ")" If iStartPkgItem = 0 Then .FindFirst sqlFilt Else .FindFirst "ID=" & iStartPkgItem .FindNext sqlFilt End If If .NoMatch Then Set objItem = Nothing Else ' there should be only one entry per package for each item, so the first one is it. Set objItem = New clsPackageItem objItem.Init .Fields End If End With Set FindItem = objItem
End Function Public Sub PullItem(iStockItem As Long, iQty As Long) ' ACTION: removes the given quantity of the given item from stock and adds it to the package ' NOTE: Only use this method when there is no specific package line.
Dim objLine As clsStockItem
Set objLine = clsStockItems.Item(iStockItem) objLine.FetchToPkgLine iQty, Me.ID
End Sub Public Sub DelCharges() ' ACTION: remove the charge transactions for this package ' 1. (ok to leave shipment assigned; no action needed) ' 2. for each item in the package, DECrement the qtyDone for the corresponding order item ' 3. REMOVE the transaction entry for this package in the order's transactions (ITEM) ' 4. CLEAR the package's "finished" timestamp
Dim objItem As clsPackageItem Dim objList As Scripting.Dictionary Dim objTrx As clsTrxactn Dim ok As Boolean Dim sqlFilt As String DBEngine.BeginTrans
' STEP 2 - DECrement order item's qtyDone
Set objList = Me.Items For Each objItem In objList objItem.UnShip Next objItem
' STEP 3 - DELETE transactions
sqlFilt = "ID_Package=" & Me.ID With clsTrxactns .DataOpen With .Data .FindFirst sqlFilt Do Until .NoMatch .Delete .FindNext sqlFilt Loop End With .DataShut End With
' STEP 4 - CLEAR package's "finished" timestamp
vWhenFinished = Null
' CLEANUP
Me.Save DBEngine.CommitTrans
End Sub Public Property Get Shipment_ID() As Long
Shipment_ID = vShpmt
End Property Public Property Get Shipment() As clsShipment
If vShpmt = 0 Then Set Shipment = Nothing Else Set Shipment = clsShipments.Item(vShpmt) End If
End Property Public Property Get ShipmentExists() As Boolean
ShipmentExists = (vShpmt <> 0)
End Property Public Property Get WhenStarted() As Date
WhenStarted = vWhenStarted
End Property Public Property Get WhenFinished() As Date
WhenFinished = vWhenFinished
End Property Public Property Get HasBeenFinished() As Boolean
HasBeenFinished = Not IsNull(vWhenFinished)
End Property Public Property Get Checked() As Boolean
Checked = Not IsNull(vWhenChecked)
End Property Public Property Let Checked(iDone As Boolean)
If iDone <> Me.Checked Then If iDone Then vWhenChecked = Now Else vWhenChecked = Null End If Save End If
End Property Public Property Get Items() As Scripting.Dictionary ' ACTION: returns a list of objects, one for each Package Item in the current Package
Dim strFilt As String Dim objList As Scripting.Dictionary Dim objItem As clsPackageItem
strFilt = "ID_Package=" & Me.ID Set objList = New Scripting.Dictionary With clsPackageItems .DataOpen With .Data .FindFirst strFilt Do Until .NoMatch Set objItem = New clsPackageItem objItem.Init .Fields objList.Add objItem, objItem.ID .FindNext strFilt Loop End With .DataShut End With Set Items = objList
End Property Public Property Get QtyShipped()
Dim objItem As clsPackageItem Dim qtyShp As Long For Each objItem In Me.Items qtyShp = qtyShp + objItem.QtyShipped Next objItem QtyShipped = qtyShp
End Property Public Property Get Messages(iMedia As Long, iPrefix As String) As String
Dim sqlFilt As String Dim strOut As String
sqlFilt = "(ID_Media=" & iMedia & ") AND ((ID_Package=" & Me.ID & ") OR ((ID_Order =" & Me.Order_ID & ") AND (ID_Package IS NULL)))" With clsOrderMsgs .DataOpen With .Data .FindFirst sqlFilt Do Until .NoMatch If Not IsNull(!Message) Then If strOut <> "" Then strOut = strOut & vbCrLf End If strOut = strOut & iPrefix & !Message End If .FindNext sqlFilt Loop End With .DataShut End With Messages = strOut
End Property Public Property Get NotesSummary(iBuyer As Boolean, iRecip As Boolean, iStore As Boolean) As String ' ACTION: returns a string containing all notes intended for the given targets, as indicated ' NOTE: It is assumed that if only one note-set is flagged on, then no header "-- Message from..." should be included. ' NOTE ALSO: This method of tracking messages is deprecated, and will be replaced eventually.
Dim strNotes As String Dim isPlural As Boolean isPlural = (CLng(iBuyer) + CLng(iRecip) + CLng(iStore) < -1)
With Me.Order If iRecip Then AppendNote strNotes, .Notes_BuyerToRecip, "-- Message from customer to recipient:", isPlural If iStore Or iBuyer Then AppendNote strNotes, .Notes_BuyerToStore, "-- Message from customer to us:", isPlural End If If iStore Then AppendNote strNotes, .Notes_Internal, "-- Message to ourselves (for this order):", isPlural End If End With If iBuyer Then AppendNote strNotes, vNotes_StoreToBuyer, "-- Message from us to the customer:", isPlural If iRecip Then AppendNote strNotes, vNotes_StoreToRecip, "-- Message from us to the recipient:", isPlural If iStore Then AppendNote strNotes, vNotes_Internal, "-- Message to ourselves (for this package):", isPlural NotesSummary = strNotes
End Property Private Sub AppendNote(ioConcat As String, iNote As String, iDescr As String, Optional iUseDescr As Boolean = True)
If iNote <> "" Then If ioConcat <> "" Then ioConcat = ioConcat & vbCrLf & vbCrLf If iUseDescr Then ioConcat = ioConcat & iDescr & vbCrLf End If ioConcat = ioConcat & iNote End If
End Sub Public Sub Delete(iMoveToStock As Boolean) ' ACTIONS: ' - move all this package's items to the location set by policy (if any) ' - delete the package record and all its item records
Dim strFilt As String Dim idLoc As Long Dim uResp As Integer Dim rs As Recordset Dim objItem As clsPackageItem
' Dim objOrdItm As clsOrderItem
idLoc = LocForDeletedPkgs If idLoc = 0 Then If iMoveToStock Then uResp = MsgBox("No location for deleted package items has been set. Delete anyway?", vbQuestion Or vbOKCancel, "Are you sure?") If uResp = vbCancel Then Exit Sub End If End If
' 1. Delete package items
strFilt = "ID_Package=" & Me.ID With clsPackageItems Set rs = .Data_Items rs.FindLast strFilt Do Until rs.NoMatch Set objItem = .Item(rs!ID) If iMoveToStock And (idLoc <> 0) And (Nz(rs!QtyShipped) <> 0) Then If objItem Is Nothing Then uResp = MsgBox("Could not find package item ID=" & !ID, vbExclamation, "Record not found") Exit Sub End If ' move the item to stock ' Set objOrdItm = clsOrderItems.Item(rs!ID_OrderItem) ' clsStockItems.Add idLoc, rs!QtyShipped, rs!ID_Item, objOrdItm.ID clsStockItems.AddFromPkgItem objItem, idLoc End If ' delete the item record from the package If objItem Is Nothing Then uResp = MsgBox("Package line " & Me.Seq & " has no item set. Deleting package item record anyway.", vbExclamation Or vbOKCancel, "Item not found") If uResp = vbCancel Then Exit Sub Else If Not objItem.Delete Then uResp = MsgBox("Could not delete package item ID=" & !ID, vbExclamation Or vbOKCancel, "Record not found") If uResp = vbCancel Then Exit Sub End If End If ' move to the next item rs.FindPrevious strFilt Loop End With
' 2. Delete the package
With clsPackages .DataOpen If Located Then With .Data .Delete End With End If .DataShut End With
End Sub Public Sub Edit() ' ACTION: opens the form for editing a package, and loads the current package record into it
Dim frmPkg As Form_frmPackage
Set frmPkg = clsForms.PackageForm_GotoPkg(Me.ID)
' clsForms.PackageForm.Locate Me.ID End Sub Private Function Located() As Boolean
With clsPackages.Data If !ID <> Me.ID Then .FindFirst "ID=" & Me.ID Located = Not .NoMatch Else Located = True End If End With
End Function </VB>