Files
open-insight/LSL2/STPROC/MATERIAL_MOVEMENT_SERVICES.txt
Infineon\Mitchem b2c9e500f8 Modified WM_IN ZPL label generation to include a 2D datamatrix
barcode. Implemented 2D barcode verification in PTI and FQA Label Check
Operations.

Bug fixes

Changed WMI 2D barcode to have 8 fields to keep code base simpler

minor changes to error message verbiage

Refactored code to use post log. Refactored code to not use multiple returns. Modfield input form fields to force upper case only.

changed LSL password verification to be case insensitive to avoid barcode scanning issues when caps lock is on

temporary change to allow 1D WMI scans at PTI while we exhaust current supply
2025-06-18 19:09:34 +02:00

785 lines
27 KiB
Plaintext

Compile function Material_Movement_Services(@Service, @Params)
/***********************************************************************************************************************
Name : Material_Movement_Services
Description : Handler program for all material movement services.
Notes :
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)
01/07/21 DPC Original programmer - built to support PTI movement on form NDW_PTI_MAT_SCAN
08/23/21 DPC Added code to support new PTO form (NDW_PTO_MAT_SCAN)
01/22/22 DPC Added code to support GaN and EPP processes
06/01/22 DPC Removed GAN references
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$insert SERVICE_SETUP
$insert SCANS_EQUATES
$insert APP_INSERTS
$insert WO_MAT_EQUATES
$insert RDS_EQUATES
$insert NOTIFICATION_EQU
$insert EPI_PART_EQUATES
$Insert WO_LOG_EQUATES
$Insert MSG_EQUATES
Declare function Scan_Services, Memory_Services, Database_Services, SRP_JSON, RTI_CreateGUID, Memberof, obj_WO_Mat
Declare function Get_Property, RDS_Services, EpiPro_Services, DateTime, Signature_Services, Material_Movement_Services
Declare subroutine Scan_Services, Memory_Services, Database_Services, SRP_JSON, Security_Services, Hold_Services
Declare subroutine obj_WO_Mat_Log, obj_WO_Mat, Set_Status, SAP_Services, Obj_Notes, Print_SAP_Cass_Ship_Label
GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.')
end
Return Response or ""
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Service Parameter Options
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options SCAN_TYPES = 'CASSETTE1', 'CASSETTE2', 'SUPPLIER'
Options SCAN_TYPES_PTO = 'LABEL1', 'LABEL2'
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------
// ProcessFQAScanData
//
// Processes new scan data and updates the SCANS database row for the indicated Scan ID. This service should parse the
// scan data and identify its intended field and then evaluate if the scan data is valid. Note: just because the scan
// resource is not ready to be accepted, it does not mean this scan data is invalid. Each scan data will have to be
// evaluated on a case by case basis.
//----------------------------------------------------------------------------------------------------------------------
Service ProcessFQAScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Param3)
ErrorMsg = ''
If (ScanData NE '') then
ColumnIndex = ''
ColumnValue = ''
// Identify the scan data based on the data identifier prefix (if any). Otherwise, assume this is a
// type of cassette ID (i.e., RDS or WMO).
Begin Case
Case ScanType EQ 'SUPPLIER'
ValidLot = False$
If ScanData[1, 2] EQ '2T' OR ScanData[1,2] EQ '1T' then ScanData[1, 2] = ''
ScanSubLot = ScanData
CassetteID = Param1
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
end else
RDSType = 'SIC'
end
ValidLot = Rds_Services('IsValidSubLot', CassetteID, RDSType, ScanSubLot)
If ValidLot NE True$ then
// Add error to error stack
ErrorMsg = 'Invalid Supplier Lot: ':ScanData
end
If ErrorMsg EQ '' then Response = ScanSubLot
Case ScanType EQ 'CASSETTE1'
DelimCount = DCount(ScanData, '|')
Begin Case
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
Case (DelimCount NE 8)
ErrorMsg = 'Invalid Lot Label Scan.'
Case Otherwise$
CassetteID = Field(ScanData, '|', 3)
SeqNo = Field(ScanData, '|', 8)
End Case
If ErrorMsg EQ '' then
If CassetteID[1, 2] EQ '1T' then
CassetteID[1, 2] = ''
end else If CassetteID[1,1] EQ 'I' OR CassetteID[1,1] EQ 'O' then
CassetteID[1,1] = ''
end
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
WOMatKey = Field(CassetteID, '.', 1):'*':Field(CassetteID, '.', 3)
end else
RDSType = 'SIC'
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
end
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType )
If ValidCassetteID EQ True$ then
If Param1 NE '' AND ScanData NE Param1 then ;*Cassette2 Scan
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Param1
end
If ErrorMsg EQ '' then
// Check if FQA is signed
FQASigned = ''
WorkOrdNo = Field(WOMatKey, '*', 1)
ReactorType = XLATE('WO_LOG', WorkOrdNo, 'REACT_TYPE', 'X')
QAStage = ''
Begin Case
Case RDSType EQ 'EPP'
QAStage = 'MO_QA'
Case Otherwise$
QAStage = 'QA'
End Case
FQASigned = Signature_Services('CheckSignature', WOMatKey, QAStage)
If NOT(FQASigned) then ErrorMsg = 'FQA not signed for ':CassetteID:'!'
end
end else
ErrorMsg = 'Invalid Lot ID ':CassetteID
end
If ErrorMsg EQ '' then
Response = ''
Response<1> = CassetteID
Response<2> = SeqNo
end
end
Case ScanType EQ 'CASSETTE2'
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
// non-existent carrier will the scan data be considered invalid.
// Strip '1T', 'I', and 'O' prefixes.
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
Cassette1ID = Param1
Seq1No = Param2
DelimCount = DCount(ScanData, '|')
Begin Case
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
Case (DelimCount NE 8)
ErrorMsg = 'Invalid Lot Label Scan.'
Case Otherwise$
CassetteID = Field(ScanData, '|', 3)
Seq2No = Field(ScanData, '|', 8)
End Case
If ErrorMsg EQ '' then
If CassetteID[1, 2] EQ '1T' then
CassetteID[1, 2] = ''
end else If CassetteID[1,1] EQ 'I' OR CassetteID[1,1] EQ 'O' then
CassetteID[1,1] = ''
end
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
end else
RDSType = 'SIC'
end
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType )
If ValidCassetteID EQ True$ then
If Cassette1ID NE '' AND (CassetteID NE Cassette1ID) then ;*Cassette2 Scan
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Cassette1ID
end
If Seq1No EQ Seq2No then
ErrorMsg = 'FQA Label verification failed due':CRLF$:'to operator double-scanning barcode.'
end
end else
ErrorMsg = 'Invalid RDS Number: ':CassetteID
end
If ErrorMsg EQ '' then Response = CassetteID
end
End Case
end else
ErrorMsg = 'ScanData argument was missing in the ' : Service : ' service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
//----------------------------------------------------------------------------------------------------------------------
// ProcessPTIScanData
//
// Processes new scan data and updates the SCANS database row for the indicated Scan ID. This service should parse the
// scan data and identify its intended field and then evaluate if the scan data is valid. Note: just because the scan
// resource is not ready to be accepted, it does not mean this scan data is invalid. Each scan data will have to be
// evaluated on a case by case basis.
//----------------------------------------------------------------------------------------------------------------------
Service ProcessPTIScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Param3)
ErrorMsg = ''
If (ScanData NE '') then
ColumnIndex = ''
ColumnValue = ''
// Identify the scan data based on the data identifier prefix (if any). Otherwise, assume this is a
// type of cassette ID (i.e., RDS or WMO).
Begin Case
Case ScanType EQ 'SUPPLIER'
ValidLot = False$
If ScanData[1, 2] EQ '2T' OR ScanData[1,2] EQ '1T' then ScanData[1, 2] = ''
ScanSubLot = ScanData
CassetteID = Param1
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
end else
RDSType = 'SIC'
end
ValidLot = Rds_Services('IsValidSubLot', CassetteID, RDSType, ScanSubLot)
If ValidLot NE True$ then ErrorMsg = 'Invalid Supplier Lot: ':ScanData
If ErrorMsg EQ '' then Response = ScanSubLot
Case ScanType EQ 'CASSETTE1'
debug
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
// non-existent carrier will the scan data be considered invalid.
// Strip '1T', 'I', and 'O' prefixes.
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
DelimCount = DCount(ScanData, '|')
Begin Case
Case (ScanData[1, 1] EQ 'I')
! Temporary exception while we exhaust current WMI inventory on KIT racks that
! do not have a 2D barcode.
CassetteID = ScanData
SeqNo = 'SEQ1'
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
Case (DelimCount NE 8)
ErrorMsg = 'Invalid Lot Label Scan.'
Case Otherwise$
CassetteID = Field(ScanData, '|', 3)
SeqNo = Field(ScanData, '|', 8)
End Case
If ErrorMsg EQ '' then
If CassetteID[1, 2] EQ '1T' then
CassetteID[1, 2] = ''
end else If CassetteID[1,1] EQ 'I' OR CassetteID[1,1] EQ 'O' then
CassetteID[1,1] = ''
end
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
end else
RDSType = 'SIC'
end
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType)
If ValidCassetteID EQ True$ then
If Param1 NE '' AND (ScanData NE Param1) then ;*Cassette2 Scan
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Param1
end
end else
ErrorMsg = 'Invalid Cassette Number: ':CassetteID
end
If ErrorMsg EQ '' then
Response = ''
Response<1> = CassetteID
Response<2> = SeqNo
end
end
Case ScanType EQ 'CASSETTE2'
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
// non-existent carrier will the scan data be considered invalid.
// Strip '1T', 'I', and 'O' prefixes.
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
Cassette1ID = Param1
Seq1No = Param2
DelimCount = DCount(ScanData, '|')
Begin Case
Case (ScanData[1, 1] EQ 'I')
! Temporary exception while we exhaust current WMI inventory on KIT racks that
! do not have a 2D barcode.
CassetteID = ScanData
Seq2No = 'SEQ2'
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
Case (DelimCount NE 8)
ErrorMsg = 'Invalid Lot Label Scan.'
Case Otherwise$
CassetteID = Field(ScanData, '|', 3)
Seq2No = Field(ScanData, '|', 8)
End Case
If ErrorMsg EQ '' then
If CassetteID[1, 2] EQ '1T' then
CassetteID[1, 2] = ''
end else If CassetteID[1,1] EQ 'I' OR CassetteID[1,1] EQ 'O' then
CassetteID[1,1] = ''
end
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
end else
RDSType = 'SIC'
end
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType)
If ValidCassetteID EQ True$ then
If Cassette1ID NE '' AND (CassetteID NE Cassette1ID) then ;*Cassette2 Scan
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Cassette1ID
end
If Seq1No EQ Seq2No then
ErrorMsg = 'PTI Label verification failed due':CRLF$:'to operator double-scanning barcode.'
end
end else
ErrorMsg = 'Invalid Cassette Number: ':CassetteID
end
If ErrorMsg EQ '' then Response = CassetteID
end
End Case
end else
ErrorMsg = 'ScanData argument was missing in the ' : Service : ' service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
//----------------------------------------------------------------------------------------------------------------------
// ProcessPTOScanData
//
// This service should parse the scan data and identify its intended field and then evaluate if the scan data is valid.
// For PTO scan, we will first look at the 2D barcode from the 4x2 (RDS or cassette label). After parsing, we will take
// the 3rd data point and try to validate that is in an RDS and that that RDS record is in the proper state to do the PTO
// transaction. If so, it will automatically print the 4x4 (what OI refers to as Shipping label), from which the operator
// will scan the 2D barcode. Parsing that barcode, we will attempt to bring back the RDS again and validate that it is the
// same RDS we got from the first label. If so, then the 'Save' button is enabled and the operator is allowed to process the
// transaction.
//----------------------------------------------------------------------------------------------------------------------
Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
ErrorMsg = ''
Location = 'PTO Mat'
If (ScanData NE '') then
ColumnIndex = ''
ColumnValue = ''
Cassette1 = ''
Cassette2 = ''
Begin Case
Case ScanType EQ 'LABEL1'
// Determine whether regular NEPP or EPP label scan
// NEPP should be data matrix scan and have 7 parts, RDS_No is the 3rd
// EPP is 1D scan and will have the WMO number (e.g. 170369*1*48)
// This should be a multi-part 2D datamatrix scan, so there should be a long string separated by pipe symbols.
// Validate the 1. it is multi-part string and 2. that the RDS number from the string is a) valid RDS number
// and b) is currently is the proper state to do PTO transaction.
// Strip any standardized prefixes (e.g. '1T', '2T', etc.) as necessary
// Data from Label1 should have 8 parts (no matter type - Si or EPP), we're looking for the 3rd
cnt = DCount(ScanData, '|')
if cnt NE 8 then
ErrorMsg = 'Invalid Lot Label Scan.'
end else
Cassette1 = Field(ScanData, '|', 3)
end
If ErrorMsg EQ '' then
// Strip the prefix encoding
If Cassette1[1, 2] EQ '1T' OR Cassette1[1, 2] EQ '2T' then
Cassette1[1, 2] = ''
end else If Cassette1[1,1] EQ 'I' OR ScanData[1,1] EQ 'O' then
Cassette1[1,1] = ''
end
WOMatKey = ''
RdsRec = ''
WONo = ''
CassNo = ''
If INDEX(Cassette1,'.',2) then
RDSType = 'EPP'
WMOKey = Cassette1
Convert '.' to '*' in WMOKey
If RowExists('WM_OUT', WMOKey) then
WONo = Field(WMOKey, '*', 1, 1)
CassNo = Field(WMOKey, '*', 3, 1)
WOMatKey = WONo:'*':CassNo
end
end else
RDSType = 'SIC'
WOMatKey = XLATE('RDS', Cassette1, 'WO_MAT_KEY', 'X')
RdsRec = Database_Services('ReadDataRow','RDS', Cassette1)
WONo = RdsRec<RDS_WO$>
CassNo = RdsRec<RDS_CASS_NO$>
end
ValidCassette1 = False$ ; // Assume Cassette ID is not valid for now.
testCass1 = Cassette1
Convert '*' to '.' in testCass1
If Rds_Services('IsValidRDS', Cassette1, RDSType) then
If Rds_Services('GetHoldStatus', Cassette1, RDSType) EQ False$ then
If Rds_Services('IsPackaged', Cassette1, RDSType) EQ True$ then
ValidCassette1 = True$
end else
ErrorMsg = RDSType: ' RDS ':testCass1: ' has not completed packaging.'
end
end else
ErrorMsg = RDSType: ' RDS ':testCass1: ' is currently on hold.'
end
end else
ErrorMsg = RDSType: ' RDS ' : testCass1 : ' is an invalid RDS number.'
end
If ErrorMsg EQ '' then
LastPTO = obj_WO_Mat('OutofPTO',WOMatKey)
StepNo = 1
IF LastPTO THEN
MsgHead = 'Cassette previously scanned through PTO'
MsgText = 'Scanned at ':LastPTO<2>:' by ':LastPTO<1>:CRLF$
MsgText := 'Are you sure you wish to rescan and reprint the shipping label?'
OK = Msg(@WINDOW, '','YESNO','',MsgHead:@FM:MsgText)
IF NOT(OK) THEN
ErrorMsg = 'Scan Cancelled'
END else
Print_SAP_Cass_Ship_Label(WONo,StepNo,CassNo,Cassette1, RDSType)
end
end else
Print_SAP_Cass_Ship_Label(WONo,StepNo,CassNo,Cassette1, RDSType)
end
If ErrorMsg EQ '' then
If ValidCassette1 EQ True$ then
If Param1 NE '' AND ScanData NE Param1 then ;*Cassette2 Scan
ErrorMsg = 'RDS Mismatch: ':Cassette1: ' does not match ': Param1
end
end else
ErrorMsg = 'Invalid RDS Number: ':Cassette1
end
If ErrorMsg EQ '' then Response = Cassette1
end
end
end
Case ScanType EQ 'LABEL2'
cnt = DCount(ScanData, ';')
if cnt EQ 9 then
// Tower is customer and RDS should be 2nd position
Cassette2 = Field(ScanData, ';', 2)
end else if cnt EQ 10 then
// All other customers and RDS should be 3rd position
Cassette2 = Field(ScanData, ';', 3)
end else
ErrorMsg = 'Invalid Shipping Label Scan.'
end
If ErrorMsg EQ '' then
// Strip the prefix encoding
If Cassette2[1, 2] EQ '1T' OR Cassette2[1, 2] EQ '2T' then
Cassette2[1, 2] = ''
end else If Cassette2[1,1] EQ 'I' OR ScanData[1,1] EQ 'O' then
Cassette2[1,1] = ''
end
testCass1 = Param3
testCass2 = Cassette2
convert '*' to '.' in testCass1
convert '*' to '.' in testCass2
If testCass1 NE testCass2 then
ErrorMsg = 'Scan Mismatch - RDS values do not match. Both cassettes placed on hold - Supervisor, Lead, or Engineering disposition required.':CRLF$ |
: 'RDS Label #1: ':testCass1:CRLF$ |
: 'RDS Label #2: ':testCass2:CRLF$
ScanMismatch = True$
GoSub ToggleLotHold
end
If ErrorMsg EQ '' then Response = Cassette2
end
End Case
end else
ErrorMsg = 'ScanData argument was missing in the ' : Service : ' service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
Service SaveRecord(CassetteID, Warehouse, Location, OperatorID)
// Write success record in Material Log
RDSKey = CassetteID
WMOKey = CassetteID
Convert '.' to '*' in WMOKey
Begin Case
Case RowExists('RDS', RDSKey) EQ True$
// RDS number
WOMatKey = Xlate('RDS', RDSKey, 'WO', 'X')
WOMatKey = WoMatKey:'*':Xlate('RDS', RDSKey, 'CASS_NO', 'X')
Case RowExists('WM_OUT', WMOKey) EQ True$
// WM_OUT key
WOMatKey = Xlate('WM_OUT', WMOKey, 'WO_MAT_KEY', 'X')
Case RowExists('WO_MAT', CassetteID) EQ True$
// WO_MAT key
WOMatKey = CassetteID
Case Otherwise$
ErrorMessage = 'Invalid cassette ID ':CassetteID
Error_Services('Add', ErrorMessage)
End Case
If Error_Services('NoError') then
LogFile = 'WO_MAT'
Action = 'PLACE'
WhCd = Warehouse
LocCd = Location
UserID = OperatorID
Tag = CassetteID
ToolID = ''
errCode = ''
WONo = Field(WOMatKey, '*', 1, 1)
CassNo = Field(WOMatKey, '*', 2, 1)
InvDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
WOMLParms = LogFile:@RM
WOMLParms := InvDTM:@RM
WOMLParms := Action:@RM
WOMLParms := WhCd:@RM
WOMLParms := LocCd:@RM
WOMLParms := WONo:@RM
WOMLParms := CassNo:@RM
WOMLParms := UserID:@RM
WOMLParms := Tag:@RM
WOMLParms := ToolID
Set_Status(0)
errCode = ''
obj_WO_Mat_Log('Create',WOMLParms)
If Get_Status(errCode) then
Swap @SVM with CRLF$ in errCode
ErrorMsg = 'Errors calling obj_WO_Mat_Log("Create"). Error code: ':errCode
Error_Services('Add', ErrorMsg)
Gosub SendErrorNotification
end
end
end service
SendErrorNotification:
Recipients = ''
SentFrom = 'MATERIAL_MOVEMENT_SERVICES'
Subject = 'ERROR CALLING OBJ_WO_MAT '
Message = 'Error occured while attempting to write WO_MAT_LOG at ':Location:' Scan':CRLF$:ErrorMsg
AttachKey = WoMatKey
AttachWindow = ''
SendToGroup = 'FI_SUPPORT'
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
return
ToggleLotHold:
If ScanMismatch EQ True$ then
// Write fail packaging record in material log for first cassette ID
LogFile = 'WO_MAT'
LogDTM = DateTime()
Action = 'PLACE'
WhCd = '1K'
LocCd = 'PTO'
UserID = @User4
Tags = 'RDS Mismatch (':Cassette2:')'
ToolID = ''
OperatorID = @User4
If Cassette1 EQ '' then
Cassette1 = Param1
end
// Check if first cassette ID is a valid RDS or WM_OUT key
Convert '.' to '*' in Cassette1
ValidCass = False$
Begin Case
Case ( RowExists('RDS', Cassette1) EQ True$ )
WONo = Xlate('RDS', Cassette1, 'WO', 'X')
CassNo = Xlate('RDS', Cassette1, 'CASS_NO', 'X')
HoldEntity = 'RDS'
Case ( RowExists('WM_OUT', Cassette1) EQ True$ )
WONo = Field(Cassette1, '*', 1, 1)
CassNo = Field(Cassette1, '*', 3, 1)
HoldEntity = 'WM_OUT'
Case ( RowExists('WO_MAT', Cassette1) EQ True$ )
WONo = Field(Cassette1, '*', 1, 1)
CassNo = Field(Cassette1, '*', 2, 1)
HoldEntity = 'WO_MAT'
Case Otherwise$
Null
// To do: Throw Error
End Case
Convert '*' to '.' in Cassette1
HoldEntityID = Cassette1
WOMLParms = LogFile:@RM
WOMLParms := LogDTM:@RM
WOMLParms := Action:@RM
WOMLParms := WhCd:@RM
WOMLParms := LocCd:@RM
WOMLParms := WONo:@RM
WOMLParms := CassNo:@RM
WOMLParms := UserID:@RM
WOMLParms := Tags:@RM
WOMLParms := ToolID
Set_Status(0)
errCode = ''
obj_WO_Mat_Log('Create',WOMLParms)
If Get_Status(errCode) then
Swap @SVM with CRLF$ in errCode
ErrorMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
Gosub SendErrorNotification
end
// Place first cassette on hold
WOMatKey = WONo:'*':CassNo
CtrlEntID = False$ ;* Control checked/unchecked
OriginFlag = 'PTO' ;* Flag to indicate a hold initiated from the packagaing form
Hold_Services('ToggleHold', WOMatKey, HoldEntity, HoldEntityID, CtrlEntID, OriginFlag, '', OperatorID)
// Check if second cassette ID is a valid RDS or WM_OUT key
Convert '.' to '*' in Cassette2
ValidCass = False$
Begin Case
Case ( RowExists('RDS', Cassette2) EQ True$ )
ValidCass = True$
WONo = Xlate('RDS', Cassette2, 'WO', 'X')
CassNo = Xlate('RDS', Cassette2, 'CASS_NO', 'X')
HoldEntity = 'RDS'
Case ( RowExists('WM_OUT', Cassette2) EQ True$ )
ValidCass = True$
WONo = Field(Cassette2, '*', 1, 1)
CassNo = Field(Cassette2, '*', 3, 1)
HoldEntity = 'WM_OUT'
Case ( RowExists('WO_MAT', Cassette2) EQ True$ )
ValidCass = True$
WONo = Field(Cassette2, '*', 1, 1)
CassNo = Field(Cassette2, '*', 2, 1)
HoldEntity = 'WO_MAT'
Case Otherwise$
Null
End Case
// Write fail packaging record in material log for second cassette ID
If ValidCass EQ True$ then
LogFile = 'WO_MAT'
LogDTM = DateTime()
Action = 'PLACE'
WhCd = '1K'
LocCd = 'PTO'
UserID = @User4
Tags = 'RDS Mismatch (':Cassette1:')'
ToolID = ''
HoldEntityID = Cassette2
WOMLParms = LogFile:@RM
WOMLParms := LogDTM:@RM
WOMLParms := Action:@RM
WOMLParms := WhCd:@RM
WOMLParms := LocCd:@RM
WOMLParms := WONo:@RM
WOMLParms := CassNo:@RM
WOMLParms := UserID:@RM
WOMLParms := Tags:@RM
WOMLParms := ToolID
Set_Status(0)
errCode = ''
obj_WO_Mat_Log('Create',WOMLParms)
If Get_Status(errCode) then
Swap @SVM with CRLF$ in errCode
ErrorMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
Gosub SendErrorNotification
end
// Place second cassette on hold
WOMatKey = WONo:'*':CassNo
CtrlEntID = False$ ;* Control checked/unchecked
OriginFlag = 'PTO' ;* Flag to indicate a hold initiated from the packaging form
Parms = WOMatKey:@RM:HoldEntity:@RM:HoldEntityID:@RM:CtrlEntID:@RM:OriginFlag:@RM:OperatorID
Hold_Services('ToggleHold', WOMatKey, HoldEntity, HoldEntityID, CtrlEntID, OriginFlag, '', OperatorID)
end
GoSub SendPTOMismatchNotification
errCode = ''
IF Get_Status(errCode) THEN Error_Services('Add', 'Error code ':errCode:' in ':Service:' service.')
Error_Services('Add', 'Cassette scans did not match! Both cassettes placed on hold - Supervisor, Lead, or Engineering disposition required.')
end
return
SendPTOMismatchNotification:
// Send scan mismatch notification
Recipients = XLATE('NOTIFICATION','PTO_MISMATCH',NOTIFICATION_USER_ID$,'X')
SentFrom = 'MATERIAL_MOVEMENT_SERVICES'
Subject = 'PTO Mat Scan Verification Mismatch'
Message = 'RDS label verification failed at PTO MatScan. Both cassettes placed on hold - Supervisor, Lead, or Engineering disposition required.':CRLF$ |
: 'RDS Label #1: ':Cassette1:CRLF$ |
: 'RDS Label #2: ':Cassette2:CRLF$ |
: 'Operator: ':@User4
AttachWindow = ''
AttachKey = ''
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
return