open-insight/LSL2/STPROC/NOTES_SERVICES.txt
2024-11-04 13:53:09 -07:00

561 lines
21 KiB
Plaintext

Compile function Notes_Services(@Service, @Params)
/***********************************************************************************************************************
Name : RDS_Services
Description : Handler program for all RDS services.
Notes : Application errors should be logged using the Error Services module. There are a few methodological
assumptions built into way errors are managed which are important to understand in order to properly
work with Error Services:
- The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to
the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger
this will appear backwards since the originating procedure always appears at the bottom of the
list and the current routine appears at the top of the list. We are using this orientation because
it is common to refer to the process of calling other procedures as 'drilling down'.
- The reason for defining the orientation of the call stack is because Error_Services allows for
multiple error conditions to be appended to an original error. In most cases this will happen when
a procedure at the bottom of the stack generates an error condition and then returns to its
calling procedure. This higher level procedure can optionally add more information relevant to
itself. This continues as the call stack 'bubbles' its way back to the top to where the
originating procedure is waiting.
- Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus)
preserve their error state until explicitly cleared. This can hinder the normal execution of code
since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists.
Our philosophy is that error conditions should automatically be cleared before a new procedure
is executed to avoid this problem. However, the nature of Basic+ does not make this easy to
automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our
philosophy then it should include a call into the 'Clear' service request at the top of the
program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.)
- Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any
error conditions that were set before.
Parameters :
Service [in] -- Name of the service being requested
Param1-10 [in/out] -- Additional request parameter holders
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
Metadata :
History : (Date, Initials, Notes)
10/16/24 djs Added service to process notes queue.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert SERVICE_SETUP
$Insert LOGICAL
$Insert NOTE_PTRS_EQUATES
$Insert MSG_EQUATES
$Insert NOTES_EQUATES
$Insert LSL_USERS_EQUATES
$Insert EMAIL_BOX_EQUATES
$Insert NOTES_QUEUE_EQUATES
$Insert NOTIFICATION_EQUATES
$Insert SEC_GROUPS_EQUATES
Declare function Database_Services, obj_Notes_Sent, Get_Status, Error_Services, Obj_Tables, Datetime, SRP_Datetime
Declare function SRP_Array, Environment_Services, Logging_Services, RTI_CreateGuid, LSL_Users_Services
Declare subroutine Obj_Tables, Obj_Notes_Sent, Update_Index, Errmsg, Database_Services, Btree.Extract, Error_Services
Declare subroutine Notes_Services, Logging_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\NOTES'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Notes Queue Processing Log.csv'
Headers = 'Logging DTM' : @FM : 'Notes Queue ID' : @FM : 'Notes'
objNotesQProcLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Notes Queue Log.csv'
Headers = 'Logging DTM' : @FM : 'Notes Queue ID' : @FM : 'Notes'
objNotesQueueLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
GoToService
Return Response or ""
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Service SnoozeNewMessageNotifications(UserID)
Open 'NOTE_PTRS' to hTable then
SnoozeTime = Datetime()
WriteV SnoozeTime to hTable, UserID, NOTE_PTRS_SNOOZE$ else
Errmsg('Error setting snooze.')
end
end else
Errmsg('Error setting snooze.')
end
end service
Service AllowNewMessageNotifications(UserID)
Open 'NOTE_PTRS' to hTable then
SnoozeTime = ''
WriteV SnoozeTime to hTable, UserID, NOTE_PTRS_SNOOZE$ else
Errmsg('Error setting snooze.')
end
end else
Errmsg('Error setting snooze.')
end
end service
Service CheckForNotificationSnooze(UserID)
SnoozeRow = ''
Snoozed = FALSE$
UserRec = Database_Services('ReadDataRow','NOTE_PTRS', @USER4, '', '', '')
CurrentTime = Datetime()
SnoozeRow = UserRec<NOTE_PTRS_SNOOZE$>
If SnoozeRow NE '' then
CutoffTime = SRP_DateTime("AddMinutes", SnoozeRow, 30)
If CurrentTime LE CutoffTime then
Snoozed = TRUE$
end else
Notes_Services('AllowNewMessageNotifications', @USER4)
end
end
Response = Snoozed
end service
Service GetInboxMessages(UserID)
InboxList = ''
UserRec = Database_Services('ReadDataRow','NOTE_PTRS', @USER4, '', '', '')
MessageCount = Dcount(UserRec<1>, @VM)
For index = 1 to MessageCount
ArchiveFlag = UserRec<NOTE_PTRS_ARCHIVED$, Index>
If ArchiveFlag = '' or ArchiveFlag = False$ then
InboxList<NOTE_PTRS_SUBJECT$,-1> = UserRec<NOTE_PTRS_SUBJECT$, index>
InboxList<NOTE_PTRS_FROM$,-1> = UserRec<NOTE_PTRS_FROM$, index>
InboxList<NOTE_PTRS_DATE$,-1> = UserRec<NOTE_PTRS_DATE$, index>
InboxList<NOTE_PTRS_TIME$,-1> = UserRec<NOTE_PTRS_TIME$, index>
InboxList<NOTE_PTRS_NEW$,-1> = UserRec<NOTE_PTRS_NEW$, index>
InboxList<NOTE_PTRS_ATTACHMENT$,-1> = UserRec<NOTE_PTRS_ATTACHMENT$, index>
InboxList<NOTE_PTRS_NOTE_IDS$,-1> = UserRec<NOTE_PTRS_NOTE_IDS$, index>
end
Next index
Response = InboxList
end service
Service GetArchivedMessages(UserID)
ArchiveList = ''
UserRec = Database_Services('ReadDataRow','NOTE_PTRS', @USER4, '', '', '')
MessageCount = Dcount(UserRec<1>, @VM)
For index = 1 to MessageCount
ArchiveFlag = UserRec<NOTE_PTRS_ARCHIVED$, Index>
If ArchiveFlag = True$ then
ArchiveList<NOTE_PTRS_SUBJECT$,-1> = UserRec<NOTE_PTRS_SUBJECT$, index>
ArchiveList<NOTE_PTRS_FROM$,-1> = UserRec<NOTE_PTRS_FROM$, index>
ArchiveList<NOTE_PTRS_DATE$,-1> = UserRec<NOTE_PTRS_DATE$, index>
ArchiveList<NOTE_PTRS_TIME$,-1> = UserRec<NOTE_PTRS_TIME$, index>
ArchiveList<NOTE_PTRS_NEW$,-1> = UserRec<NOTE_PTRS_NEW$, index>
ArchiveList<NOTE_PTRS_ATTACHMENT$,-1> = UserRec<NOTE_PTRS_ATTACHMENT$, index>
ArchiveList<NOTE_PTRS_NOTE_IDS$,-1> = UserRec<NOTE_PTRS_NOTE_IDS$, index>
end
Next index
Response = ArchiveList
end service
Service UpdateNotes(UserID)
ErrorMsg = ''
IF UserID NE '' then
If RowExists('NOTE_PTRS', UserID) then
NPRec = Database_Services('ReadDataRow', 'NOTE_PTRS', UserID)
end else
NPRec = ''
Database_Services('WriteDataRow', 'NOTE_PTRS', UserID, NPRec, True$, False$, True$)
end
If Error_Services('NoError') then
IF LEN(NPRec) > 60000 THEN
* Dump the oldest note pointers
PtrCnt = COUNT(NPRec<note_ptrs_from$>, @vm) + (NPRec<note_ptrs_from$> NE '')
FOR N = PtrCnt TO (PtrCnt - 100) STEP -1
NPRec = Delete(NPRec, note_ptrs_subject$, N, 0)
NPRec = Delete(NPRec, note_ptrs_from$, N, 0)
NPRec = Delete(NPRec, note_ptrs_date$, N, 0)
NPRec = Delete(NPRec, note_ptrs_time$, N, 0)
NPRec = Delete(NPRec, note_ptrs_new$, N, 0)
NPRec = Delete(NPRec, note_ptrs_note_ids$, N, 0)
NPRec = Delete(NPRec, note_ptrs_attachment$, N, 0)
NPRec = Delete(NPRec, note_ptrs_archived$, N, 0)
NEXT N
TLen = LEN(NPRec)
END
NotesSentKeys = obj_Notes_Sent('GetUserKeys',UserID)
IF NotesSentKeys NE '' THEN
FOR I = 1 TO COUNT(NotesSentKeys,@VM) + (NotesSentKeys NE '')
NotesSentKey = NotesSentKeys<1,I>
NoteID = FIELD(NotesSentKey,'*',2)
LOCATE NoteID IN NPRec<NOTE_PTRS_NOTE_IDS$> USING @VM SETTING POS ELSE
NoteRec = XLATE('NOTES',NoteID,'','X')
SentFrom = NoteRec<NOTES_FROM$>
SentDate = NoteRec<NOTES_ENTRY_DATE$>
SentTime = NoteRec<NOTES_ENTRY_TIME$>
AttachWindow = NoteRec<NOTES_ATTACH_WINDOW$>
AttachKeys = NoteRec<NOTES_ATTACH_KEYS$>
Subject = NoteRec<NOTES_SUBJECT$>
IF AttachWindow NE '' AND AttachKeys NE '' THEN
Attachment = 'Yes'
END ELSE
Attachment = 'No'
END
NPRec = INSERT( NPRec, note_ptrs_subject$, 1, 0, Subject ) ;* Add the subject
ConvSentFrom = OCONV(SentFrom,'[XLATE_CONV,LSL_USERS*FIRST_LAST]')
IF ConvSentFrom NE '' THEN SentFrom = ConvSentFrom
NPRec = INSERT( NPRec, note_ptrs_from$, 1, 0, SentFrom )
NPRec = INSERT( NPRec, note_ptrs_date$, 1, 0, OCONV(SentDate,'D2/') )
NPRec = INSERT( NPRec, note_ptrs_time$, 1, 0, OCONV(SentTime,'MTH') )
NPRec = INSERT( NPRec, note_ptrs_new$, 1, 0, 'Yes' )
NPRec = INSERT( NPRec, note_ptrs_note_ids$, 1, 0, NoteID )
NPRec = INSERT( NPRec, note_ptrs_attachment$, 1, 0, Attachment )
NPRec = INSERT( NPRec, note_ptrs_archived$, 1, 0, '0' )
END
Database_Services('WriteDataRow', 'NOTE_PTRS', UserID, NPRec, True$, False$, True$)
NEXT I
IF Get_Status(errCode) THEN
ErrorMsg = 'Error in service: ':Service:'. Error code: ':errCode
END ELSE
obj_Notes_Sent('Delete',NotesSentKeys)
Update_Index('NOTES_SENT','USER_ID', False$, True$)
END
END
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in service: ':Service:'. Unassigned Parameter "UserID" passed into service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
Service GetUnreadMessageCount(UserID)
unreadMessageCount = 0
IF UserID NE '' then
if xlate( 'NOTE_PTRS', @user4, 'NEW_MESSAGES', 'X' ) then
NotePtrRec = xlate( 'NOTE_PTRS', @user4, '', 'X' )
LOCATE 'Yes' in NotePtrRec<note_ptrs_new$> using @VM setting mPos then
*If any are marked as yes, that means there are unread messages
for each messageRead in NotePtrRec<note_ptrs_new$> using @VM
if messageRead EQ 'Yes' then unreadMessageCount += 1
Next message
end
end
end
Response = unreadMessageCount
end service
Service GetNewMessages(UserId)
NotesSentKeys = ''
IF UserId NE '' THEN
OPEN 'DICT.NOTES_SENT' TO DictVar THEN
SearchString = 'USER_ID':@VM:UserId:@FM
Flag = ''
Btree.Extract(SearchString,'NOTES_SENT',DictVar,NotesSentKeys,'',Flag)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
RETURN
END
END
end
Response = NotesSentKeys
end service
Service MarkAllAsRead(UserId)
if UserID NE '' then
NotePtrsRec = Database_Services('ReadDataRow', 'NOTE_PTRS', UserId)
NotePtrsStatus = NotePtrsRec<NOTE_PTRS_NEW$>
for each NotePtrsRead in NotePtrsStatus using @VM setting nPos
NotePtrsRec<NOTE_PTRS_NEW$, nPos> = 'No'
Next NotePtrsRead
isNPRecCurrent = NotePtrsRec<NOTE_PTRS_TIME$> EQ Database_Services('ReadDataRow', 'NOTE_PTRS', UserId)<NOTE_PTRS_TIME$>
if isNPRecCurrent then
Database_Services('WriteDataRow','NOTE_PTRS', UserId, NotePtrsRec, '','', true$)
end
end else
Error_Services('Set', 'Error in Notes Service, MarkAllAsRead. UserId parameter not supplied')
end
end service
Service SendNotes()
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, ServiceKeyID then
ErrorMsg = ''
Open 'NOTES_QUEUE' to hNotesQueue then
Select hNotesQueue
EOF = False$
Loop
ReadNext NotesQueueId else EOF = True$
Until EOF
// Send NOTES record
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = NotesQueueId
LogData<3> = 'Being processing NOTES_QUEUE record, "':NotesQueueID:'".'
Logging_Services('AppendLog', objNotesQProcLog, LogData, @RM, @FM)
DeleteRec = False$
Read NotesQueueRec from hNotesQueue, NotesQueueId then
NotesId = NotesQueueRec<NOTES_QUEUE.NOTES_ID$>
If NotesId NE '' then
NotesRec = Database_Services('ReadDataRow', 'NOTES', NotesId)
If Error_Services('NoError') then
If NotesRec NE '' then
DeleteRec = True$
Recipients = NotesRec<NOTES_SEND_TO$>
SentFrom = NotesRec<NOTES_FROM$>
Subject = NotesRec<NOTES_SUBJECT$>
Message = NotesRec<NOTES_MESSAGE$>
AttachWindow = NotesRec<NOTES_ATTACH_WINDOW$>
AttachKeys = NotesRec<NOTES_ATTACH_KEYS$>
SendToGroup = NotesRec<NOTES_MSG_GROUPS_IDS$>
GroupRecipients = ''
If SendToGroup NE '' then
NotifyGroupRecipients = ''
SecGroupRecipients = ''
For each GroupID in SendToGroup using @VM
If RowExists('NOTIFICATION', GroupID) then
GroupRec = Database_Services('ReadDataRow', 'NOTIFICATION', GroupID)
If Error_Services('NoError') then
GroupUsers = GroupRec<NOTIFICATION_USER_ID$>
LimitToOnShift = GroupRec<NOTIFICATION_LIMIT_TO_ACTIVE_SHIFT$>
If LimitToOnShift then
UsersOnShift = LSL_Users_Services('GetOnShiftUsers')
NotifyGroupRecipients = SRP_Array('Join', GroupUsers, UsersOnShift, 'AND', @VM)
end else
NotifyGroupRecipients = GroupUsers
end
end
end
If RowExists('SEC_GROUPS', GroupID) then
GroupRec = Database_Services('ReadDataRow', 'SEC_GROUPS', GroupID)
If Error_Services('NoError') then
GroupUsers = GroupRec<SEC_GROUPS_USER$>
SecGroupRecipients = GroupUsers
end
end
GroupRecipients = SRP_Array('Join', NotifyGroupRecipients, GroupRecipients, 'OR', @VM)
GroupRecipients = SRP_Array('Join', SecGroupRecipients, GroupRecipients, 'OR', @VM)
Next GroupID
end
thisRecipients = ''
RecipCnt = 0
Recipients = SRP_Array('Join', GroupRecipients, Recipients, 'OR', @VM)
thisRecipients = SRP_Array('Clean', Recipients, 'TrimAndMakeUnique', @VM)
RecipCnt = DCount(thisRecipients, @VM)
// Previous logic from obj_Notes
CurrDTM = OConv(Date(),'D4/'):' ':OConv(Time(),'MTHS')
RecipientsText = thisRecipients
SWAP @VM WITH ', ' IN RecipientsText
FOR RecipIndex = 1 TO RecipCnt
thisRecipient = thisRecipients<1, RecipIndex>
obj_Notes_Sent('Create',thisRecipient:@RM:NotesId:@RM:CurrDTM) ;* Add to Notes Sent buffer table
UserRec = XLATE('LSL_USERS',thisRecipient,'','X')
FwdFlag = UserRec<LSL_USERS_FWD_EMAIL$>
eMailAddr = UserRec<LSL_USERS_EMAIL$>
IF FwdFlag = 1 AND eMailAddr NE '' THEN
Text = ''
Text<-1> = 'OI eMail From: ':OCONV(SentFrom,'[XLATE_CONV,LSL_USERS*FIRST_LAST]'):' at ':CurrDTM
Text<-1> = ''
Text<-1> = 'Recipients: ':RecipientsText
Text<-1> = ''
Text<-1> = 'Subject: ':Subject
Text<-1> = ''
Text<-1> = 'Message: '
Text<-1> = ''
Text<-1> = Message
Text<-1> = ''
IF AttachWindow NE '' THEN
Text<-1> = ''
Text<-1> = 'Attached Window: ':AttachWindow
END
IF AttachKeys NE '' THEN
Text<-1> = ''
Text<-1> = 'Record Key: ':AttachKeys
END
IF SendToGroup NE '' THEN
Text<-1> = ''
Text<-1> = 'Sent to Group: ':SendToGroup
END
HeaderText = Text<1>
CONVERT \00\ TO ',' IN Text
SWAP @VM WITH ':@VM:' IN Text
SWAP @FM WITH CHAR(13):CHAR(10) IN Text
SWAP @TM WITH CHAR(13):CHAR(10) IN Text
eMailBoxKey = NotesId:'*':thisRecipient
eMailBoxRec = ''
eMailBoxRec<EMAIL_BOX_EMAIL_ADDR$> = eMailAddr
eMailBoxRec<EMAIL_BOX_EMAIL_TEXT$> = Text
eMailBoxRec<EMAIL_BOX_EMAIL_HEADER$> = HeaderText
eMailBoxRec<EMAIL_BOX_FROM_USER$> = SentFrom
ebParms = 'EMAIL_BOX':@RM:eMailBoxKey:@RM:@RM:eMailBoxRec
obj_Tables('WriteRec',ebParms)
END ;* End of check for forwarding flag
Next RecipIndex
end else
// Log this condition, but delete record since we have nothing to send.
DeleteRec = True$
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = NotesQueueId
LogData<3> = 'Error in ':Service:' service. Failed to send Note due to null NOTES record, "':NotesId:'", read in.'
Logging_Services('AppendLog', objNotesQProcLog, LogData, @RM, @FM)
end
end else
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = NotesQueueId
LogData<3> = 'Error in ':Service:' service. Failed to read NOTES record, "':NotesId:'". Error message: ':Error_Services('GetMessage')
Logging_Services('AppendLog', objNotesQProcLog, LogData, @RM, @FM)
end
end else
// Log this condition, but delete record since we have nothing to send.
DeleteRec = True$
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = NotesQueueId
LogData<3> = 'Error in ':Service:' service. Null NotesId in NOTES_QUEUE record, "':NotesQueueId:'".'
Logging_Services('AppendLog', objNotesQProcLog, LogData, @RM, @FM)
end
end else
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = NotesQueueId
LogData<3> = 'Error in ':Service:' service. Error reading NOTES_QUEUE record, "':NotesQueueId:'". File error: ':@File.Error
Logging_Services('AppendLog', objNotesQProcLog, LogData, @RM, @FM)
end
If DeleteRec then
Database_Services('DeleteDataRow', 'NOTES_QUEUE', NotesQueueId, True$, False$)
If Error_Services('NoError') then
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = NotesQueueId
LogData<3> = 'Successfuly deleted NOTES_QUEUE record, "':NotesQueueID:'".'
Logging_Services('AppendLog', objNotesQProcLog, LogData, @RM, @FM)
end
end
Repeat
end else
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = NotesQueueId
LogData<3> = 'Error in ':Service:' service. Failed to open NOTES_QUEUE table.'
Logging_Services('AppendLog', objNotesQProcLog, LogData, @RM, @FM)
end
Unlock hSysLists, ServiceKeyID else Null
end
end service
Service AddToQueue(NotesId)
If NotesId NE '' then
If RowExists('NOTES', NotesId) then
QueueId = RTI_CreateGuid()
If QueueId NE '' then
QueueRec = NotesId
Database_Services('WriteDataRow', 'NOTES_QUEUE', QueueId, QueueRec)
If Error_Services('HasError') then
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = NotesId
ErrorMsg = 'Error in ':Service:' service. Failed to write NOTES_QUEUE record, "':QueueID:'", for NOTES record, "':NotesId:'".'
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
LogData<3> = ErrorMsg
Logging_Services('AppendLog', objNotesQProcLog, LogData, @RM, @FM)
end
end else
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = NotesId
ErrorMsg = 'Error in ':Service:' service. Failed to genereate NOTES_QUEUE Id for NOTES record, "':NotesId:'".'
LogData<3> = ErrorMsg
Logging_Services('AppendLog', objNotesQProcLog, LogData, @RM, @FM)
end
end else
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = NotesId
ErrorMsg = 'Error in ':Service:' service. NOTES record, "':NotesId:'", does not exist!.'
LogData<3> = ErrorMsg
end
end else
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = NotesId
ErrorMsg = 'Error in ':Service:' service. Null NOTES Id passed into service.'
LogData<3> = ErrorMsg
end
end service