/ Forums / Advansys Formativ / Creating Solutions with Formativ / Programmatically accept an appointment / Reply To: Programmatically accept an appointment

#6526
scaldwell
Participant

    Here’s a brief description of what this applet is suppose to do.

    We are using another applet to export our calendars from GW to .csv files, which are then uploaded to our website content management system and displayed to the public.

    Each Posted Appointment (event) can have several status categories, which are assigned through the use of a custom field. The categories are Active, Canceled, Postponed, and Rescheduled. Posted appointments or events that are rescheduled are cloned, in order to preserve all event information (mainly attachments) and the startdate and status is reset. The startdate is set to the new event date and the status is set to active or “”. This is modelled of one of your sample applets.

    When the new Posted Appointment is created through the clone method (which works) it is sent to the sender of it’s parent. It then must be accepted by the user. Posted Appointments don’t need to be accepted…do they? It would be cleaner if the Posted Appointment could be auto accepted by the applet. The new Posted Appointment doesn’t seem to be behaving like a true Posted Appointment.

    I’ve tried this method on the new message with no luck:

     objAppt.Accept("Accept") 

    Also, after the Posted Appointment is cloned it wont let me edit it again. In theory, the event can then be canceled…but whe I run the applet on this new cloned appointment and try to set the status again it says:

     Message.Object
    C:Program FilesAdvansysFormativAF_EDIT_NEW.vbf
    Update access is denied to current user. at line 104, column 17 

    I’ve included the entire applet for your viewing pleasure…don’t laugh!! It’s my first time.

    Thanks for any help you can provide.

    Scott
    scaldwell@ci.fayetteville.ar.us

     
    
    '-------------------------------------------------------------------------------
    ' Insert your comments here
    '-------------------------------------------------------------------------------
    
    'Dialog Variables
    Dim Dialog1
    Dim Dialog2
    Dim Dialog3
    Dim PriorityCtl
    Dim StatusCtl
    Dim DateCtl
    Dim TimeCtl
    Dim MemoCtl
    
    'Miscellaneous Variables
    Dim Msg
    Dim Cmd
    Dim iCount
    Dim Field1
    Dim Field2
    Dim Field3
    Dim Fields
    Dim FieldDefs
    Dim FieldObj1
    Dim FieldObj2
    Dim FieldObj3
    Dim sIndex1
    Dim sIndex2
    
    Const CUSTOM_FIELD1 = "STATUS"
    Const CUSTOM_FIELD2 = "RESCDATE"
    Const CUSTOM_FIELD3 = "RESCREASON"
    Const CAPTION = "AccessFayetteville Calendar Tools"
    
    '-------------------------------------------------------------------------------
    ' Main Function
    '-------------------------------------------------------------------------------
    
    Sub Main(Client, GWEvent)
    
      'Command Buttons
      cIntroDlg = 100
      cSelectEdit = 101
      cCheckReschedule = 102
      cReschedule = 103
      cExit = 999
    
      'Set the default status to 0
      sIndex1 = 1
      sIndex2 = 0
    
      'Set starting point
      Cmd = cIntroDlg
    
      Do While Cmd <> cExit
      
        If Cmd = cIntroDlg Then
          'Get the number of messages selected
          iCount = Client.ClientState.SelectedMessages.count
          If iCount > 1 Then
            MsgBox("This applet only allows single calendar events to be edited")
            Cmd = cExit
          Else
            Set Msg = Client.ClientState.CommandMessage
            AddFields
            FieldValues
            'Check message priority and pass to form
            If Msg.Priority = 1 Then
              sIndex1 = 0
            Elseif Msg.Priority = 2 Then
              sIndex1 = 1
            Elseif Msg.Priority = 3 Then
              sIndex1 = 2
            End If
            'Checks that some text is in the status field before checking for values
            If IsObject(Field1) then
              'Check custom status field for values and pass to form
              If Field1.Value = "Canceled" Then
                sIndex2 = 1
              Elseif Field1.Value = "Postponed" Then
                sIndex2 = 2
              Elseif Field1.Value = "Rescheduled" Then
                sIndex2 = 3
              Else
                sIndex2 = 0 'blank value for status signifies Active event
              End If
            End If
            
            'Create the Dialogs
            Call SetupIntroDlg(sIndex1, sIndex2)
            Select Case Dialog1.execute
              Case Btn1 Cmd = cSelectEdit
              Case Btn2 Cmd = cExit
              Case Else Cmd = cExit
            End Select     
          End If
        End If
            
        If Cmd = cSelectEdit Then
          'Update the priority field if the new priority is different from the old priority
          If (PriorityCtl.ItemIndex) <> sIndex1 Then
            Select Case PriorityCtl.ItemIndex
              Case 0 Msg.Priority = fgwLow
              Case 1 Msg.Priority = fgwNormal
              Case 2 Msg.Priority = fgwHigh
            End Select
          End If    
    
          'Update the status field if the new status is different from the old status
          If (StatusCtl.ItemIndex) = sIndex2 Then
            If Field1 = "Rescheduled" Then
              Cmd = cCheckReschedule
            Else
              Cmd = cExit
            End If        
          Else
            If Field1 = "" Then
              Select Case StatusCtl.ItemIndex
                Case 1 Call Fields.Add(CUSTOM_FIELD1, fgwString, "Canceled")
                Case 2 Call Fields.Add(CUSTOM_FIELD1, fgwString, "Postponed")
                Case 3 Call Fields.Add(CUSTOM_FIELD1, fgwString, "Rescheduled")
              End Select
              Cmd = cCheckReschedule        
            ElseIf Field1 = "Canceled" Then
              MsgBox("CANCELED items may not be changed")
              Cmd = cIntroDlg
            ElseIf Field1 = "Postponed" Then
              Select Case StatusCtl.ItemIndex
                Case 1 Call Fields.Add(CUSTOM_FIELD1, fgwString, "Canceled")
                Case 3 Call Fields.Add(CUSTOM_FIELD1, fgwString, "Rescheduled")
              End Select
              If StatusCtl.ItemIndex = 1 or StatusCtl.ItemIndex = 3 Then
                Cmd = cCheckReschedule
              Else
                MsgBox("POSTPONED items may only be CANCELED or RESCHEDULED")
                Cmd = cIntroDlg
              End If
            ElseIf Field1 = "Rescheduled" Then
              MsgBox("Only the explanation of a RESCHEDULED item may be changed")
              Cmd = cCheckReschedule
            End If
          End If
        End If
        
        'MsgBox(Field1)
        'MsgBox(StatusCtl.ItemIndex)
        
        If Cmd = cCheckReschedule Then
          If Field1 = "Rescheduled" Then
            Call SetupExpDlg
            Select Case Dialog3.execute
              Case Btn1 Cmd = cReschedule
              Case Btn2 Cmd = cReschedule
              Case Else Cmd = cExit
            End Select
          ElseIf StatusCtl.ItemIndex = 3 AND Field1 <> "Rescheduled" Then
            Call SetupSuppDlg
            Select Case Dialog2.execute
              Case Btn1 Cmd = cReschedule
              Case Btn2 Cmd = cReschedule
              Case Else Cmd = cExit
            End Select
          End If
        End If 
        
        If Cmd = cReschedule Then
          If (MemoCtl.Text = "") OR (MemoCtl.Text = " ") Then
            MsgBox("Explanations are REQUIRED for all rescheduled events")
            Cmd = cCheckReschedule
          Else 
            'If original is reschedule then only update the explanation
            If Field1 = "Rescheduled" Then
              Call Fields.Add(CUSTOM_FIELD3, fgwString, MemoCtl.Text)
              Cmd = cExit
            'If the new status is reschedule then add new date/time and explanation
            ElseIf (StatusCtl.ItemIndex = 3) Then
              DT = (DateCtl.Date) + (TimeCtl.Time)
                If (Msg.StartDate) = DT Then
                  MsgBox("The RESCHEDULED date and time must be different from the original")
                  Cmd = cCheckReschedule
                Else
                  Call Fields.Add(CUSTOM_FIELD2, fgwDate, DT)
                  Call Fields.Add(CUSTOM_FIELD3, fgwString, MemoCtl.Text)
                  Call CreateNewEvent
                  Cmd = cExit
                End If
            End If
          End If
        End If
    
      Loop
    
    ' Refresh view
    Call GroupWise.Refresh
    
    'Clean up variables
    Set Fields = nothing
    Set Field1 = nothing
    'Set Field2 = nothing
    Set Field3 = nothing
    Set FieldObj1 = nothing
    Set FieldObj2 = nothing
    Set FieldObj3 = nothing
    Set Dialog1 = nothing
    Set Dialog2 = nothing
    Set Dialog3 = nothing
    Set PriorityCtl = nothing
    Set StatusCtl = nothing
    Set DateCtl = nothing
    Set MemoCtl = nothing
    Set Msg = nothing
    
    End Sub
    
    '-------------------------------------------------------------------------------
    ' Creates a new message when an event is rescheduled
    '-------------------------------------------------------------------------------
    function CreateNewEvent
    
      Dim objAppt
      Dim objNewAppt
      Dim objRecipient
      Dim NewAddress
      NewAddress = Msg.Sender
      ' Create a copy of the original Posted Appointment substituted the new date for the StartDate
      Set objAppt = Msg.Clone
      ' Set the recipient equal to the original sender which was ourself
      Set objRecipient = objAppt.Recipients.Add(NewAddress,,0)   
      With objAppt 
        '.OnCalendar = TRUE
        '.Priority = Msg.Priority
        '.FromText = "Auto Generated Event"  
        '.Place = Msg.Place
        .StartDate = (DateCtl.Date) + (TimeCtl.Time)
        '.EndDate = DT + 1      
        '.Subject = Msg.Subject
        '.BodyText.PlainText = Msg.BodyText
      End With
      
      objAppt.Accept("Accept")
      ' Get Fields of new message
      Set Fields = objAppt.Fields
      ' Set Status of new message to normal
      Call Fields.Add(CUSTOM_FIELD1, fgwString, " ")
      ' Send Message
      Set objNewAppt = objAppt.Send
      ' Clean up
      Set objRecipient = Nothing
      Set objAppt = Nothing
    
    End function
    '-------------------------------------------------------------------------------
    ' Adds the custom fields if they do not exist
    '-------------------------------------------------------------------------------
    function AddFields
       
      Set FieldDefs = GroupWise.Account.FieldDefinitions
      
      On Error Resume Next     
      Set FieldObj1 = FieldDefs.Item(CUSTOM_FIELD1, fgwString)
      Set FieldObj2 = FieldDefs.Item(CUSTOM_FIELD2, fgwDate)
      Set FieldObj3 = FieldDefs.Item(CUSTOM_FIELD3, fgwString)
      ' If the custom fields don't exist in the field definitions then add them.
      If FieldObj1 Is Nothing Then
        Call FieldDefs.Add(CUSTOM_FIELD1, fgwString) 
      Elseif FieldObj2 Is Nothing then
        Call FieldDefs.Add(CUSTOM_FIELD2, fgwDate)
      Elseif FieldObj3 Is Nothing then
        Call FieldDefs.Add(CUSTOM_FIELD3, fgwString)
      End If
    
      ' Refresh view
      Call GroupWise.Refresh
      
    End function
    
    '-------------------------------------------------------------------------------
    ' Get the values of the custom fields
    '-------------------------------------------------------------------------------
    function FieldValues
      
      ' Contains all field objects for the current message
      Set Fields = Msg.Fields
       
      On Error Resume Next
      ' Finds the specified field objects and there values    
      Set Field1 = Fields.Item(CUSTOM_FIELD1, fgwString)
      'Set Field2 = Fields.Item(CUSTOM_FIELD2, fgwDate)
      Set Field3 = Fields.Item(CUSTOM_FIELD3, fgwString)
      
    End function
    
    '-------------------------------------------------------------------------------
    ' Dialog to edit the status dialog of the event 
    '-------------------------------------------------------------------------------
    function SetupIntroDlg(sIndex1, sIndex2)
    
      Set Dialog1 = Utilities.NewControlBoxDialog
      With Dialog1
        .Height = 240
        .Caption = CAPTION    
        .Title = "Event Classification"
        .ShowWizardImage = FALSE
      End With
      
      Set PriorityCtl = Dialog1.AddRadioGroupControl
      With PriorityCtl
        .Caption = "Priority"
        .Items.Add("Low")
        .Items.Add("Normal")
        .Items.Add("High") 
        .ItemIndex = sIndex1
        .Height = 40  
        .Columns = 3
        .Hint = "Select an event priority"
      End With
      
      Set StatusCtl = Dialog1.AddRadioGroupControl
      With StatusCtl
        .Caption = "Status"
        .Items.Add("Active")
        .Items.Add("Canceled")
        .Items.Add("Postponed")
        .Items.Add("Rescheduled")  
        .ItemIndex = sIndex2
        .Height = 60  
        .Columns = 2
        .Hint = "Select an event status"
      End With
    
    End function
    
    '-------------------------------------------------------------------------------
    ' Dialog to edit reschedule information for an event 
    '-------------------------------------------------------------------------------
    Function SetupSuppDlg
    
      Set Dialog2 = Utilities.NewControlBoxDialog
      With Dialog2
        .Height = 460
        .Caption = CAPTION    
        .Title = "Reschedule Information"
        .ShowWizardImage = FALSE
      End With
    
      Set DateCtl = Dialog2.AddDateTimeControl
      with DateCtl
        .Caption = "Reschedule Date To:"
        .Kind = fdtkDate
        .Date = Msg.StartDate
        .MinDate = Date
        .CaptionWidth = iCaptWidth
        .CaptionAlign = ftaRightJustify
        .Hint = "Enter a new date for this event"
      end with
    
      Set TimeCtl = Dialog2.AddDateTimeControl
      with TimeCtl
        .Caption = "Reschedule Time To:"
        .Kind = fdtkTime
        .Time = Msg.StartDate
        .CaptionWidth = iCaptWidth
        .CaptionAlign = ftaRightJustify
        .Hint = "Enter a new time for this event"
      end with
      
      Set MemoCtl = Dialog2.AddMemoControl
      with MemoCtl
        .Caption = "I am rescheduling this event because:"
        .ScrollBars = 4
        .Text = field3
        .CaptionAlign = ftaRightJustify
        .WordWrap = TRUE
        .hint = "Enter an explanation for this reschedule"
      end with 
    
    end Function
    
    '-------------------------------------------------------------------------------
    ' Dialog to edit reschedule explanation 
    '-------------------------------------------------------------------------------
    Function SetupExpDlg
    
      Set Dialog3 = Utilities.NewControlBoxDialog
      With Dialog3
        .Height = 425
        .Caption = CAPTION    
        .Title = "Reschedule Information"
        .ShowWizardImage = FALSE
      End With
        
      Set MemoCtl = Dialog3.AddMemoControl
      with MemoCtl
        .Caption = "Edit Explanation:"
        .ScrollBars = 4
        .Text = field3
        .CaptionAlign = ftaRightJustify
        .WordWrap = TRUE
        .hint = "Enter an explanation for this reschedule"
      end with 
    
    end Function