17,377
社区成员
发帖
与我相关
我的任务
分享
-----------------------------------------------------------------------------
-------------------- IMPLEMENTATION STATEPACKAGE METHODS --------------------
-----------------------------------------------------------------------------
-- Finite_State_Set___
-- Updates the finite state indicator for an existing LU-instance.
--
-- Finite_State_Machine___
-- Processes an event by:
-- 1. Fetching the current state
-- 2. Evaluating any conditions for given event at current state
-- 3. executing any exit code for the old state
-- 4. Performing any action associated with given event
-- 5. update the database to the new state
-- 6. execute any entry code for the new state
-- 7. Executing a state change to the new state
-----------------------------------------------------------------------------
PROCEDURE Finite_State_Set___ (
rec_ IN OUT PURCHASE_ORDER_LINE_TAB%ROWTYPE,
state_ IN VARCHAR2 )
IS
BEGIN
rec_.rowversion := sysdate;
UPDATE purchase_order_line_tab
SET rowstate = state_,
rowversion = rec_.rowversion
WHERE order_no = rec_.order_no
AND line_no = rec_.line_no
AND release_no = rec_.release_no;
rec_.rowstate := state_;
Purchase_Order_Line_Hist_API.Insert_History(rec_.order_no, rec_.line_no, rec_.release_no, rec_.rowstate,
Fnd_Session_API.Get_Fnd_User, state_);
END Finite_State_Set___;
PROCEDURE Finite_State_Machine___ (
rec_ IN OUT PURCHASE_ORDER_LINE_TAB%ROWTYPE,
event_ IN VARCHAR2,
attr_ IN OUT VARCHAR2 )
IS
state_ VARCHAR2(30);
order_no_ PURCHASE_ORDER_LINE_TAB.order_no%TYPE;
line_no_ PURCHASE_ORDER_LINE_TAB.line_no%TYPE;
release_no_ PURCHASE_ORDER_LINE_TAB.release_no%TYPE;
BEGIN
state_ := rec_.rowstate;
IF (state_ IS NULL) THEN
IF (event_ IS NULL) THEN
IF (Not Order_Is_Stopped___(rec_)) THEN
Finite_State_Set___(rec_, 'Released');
Refresh_Order_State___(rec_, attr_);
Purchase_Order_Line_Util_API.Set_Dop_Started(rec_.order_no,rec_.line_no,rec_.release_no);
ELSIF (Order_Is_Stopped___(rec_)) THEN
Finite_State_Set___(rec_, 'Stopped');
END IF;
ELSE
Error_SYS.State_Event_Not_Handled(lu_name_, event_, Finite_State_Decode__(state_));
END IF;
ELSIF (state_ = 'Arrived') THEN
IF (event_ IS NULL) THEN
IF (Not Inspect_Receipt___(rec_)) THEN
Finite_State_Set___(rec_, 'Received');
Refresh_Order_State___(rec_, attr_);
Purchase_Order_Line_Util_API.Set_Dop_Started(rec_.order_no,rec_.line_no,rec_.release_no);
END IF;
ELSIF (event_ = 'Arrive') THEN
Finite_State_Machine___(rec_, NULL, attr_);
Refresh_Order_State___(rec_, attr_);
Purchase_Order_Line_Util_API.Set_Dop_Started(rec_.order_no,rec_.line_no,rec_.release_no);
ELSIF (event_ = 'Close') THEN
IF (Zero_At_Dock___(rec_)) THEN
Finite_State_Set___(rec_, 'Closed');
Refresh_Order_State___(rec_, attr_);
ELSE
IF Purchase_Order_Line_Part_API.Is_Part(rec_.order_no, rec_.line_no, rec_.release_no) THEN
Client_SYS.Add_Info(lu_name_,'CLOSEERRORQTY: The quantity at dock not zero.');
ELSE
Client_SYS.Add_Info(lu_name_,'CLOSEERRORNOPART: Closing is just allowed for purchase part lines.');
END IF;
END IF;
ELSIF (event_ = 'Receive') THEN
Finite_State_Set___(rec_, 'Received');
Refresh_Order_State___(rec_, attr_);
ELSIF (event_ = 'Unreceive') THEN
IF (Check_Unreceive_Arr_To_Conf___(rec_)) THEN
Finite_State_Set___(rec_, 'Confirmed');
Refresh_Order_State___(rec_, attr_);
END IF;
ELSE
Error_SYS.State_Event_Not_Handled(lu_name_, event_, Finite_State_Decode__(state_));
END IF;
ELSIF (state_ = 'Cancelled') THEN
Error_SYS.State_Event_Not_Handled(lu_name_, event_, Finite_State_Decode__(state_));
ELSIF (state_ = 'Closed') THEN
IF (event_ = 'Reopen') THEN
Finite_State_Set___(rec_, 'Received');
Refresh_Order_State___(rec_, attr_);
ELSIF (event_ = 'Unreceive') THEN
IF (Check_Unreceive_Clo_To_Rec___(rec_)) THEN
Finite_State_Set___(rec_, 'Received');
Refresh_Order_State___(rec_, attr_);
ELSIF (Check_Unreceive_Clo_To_Conf___(rec_)) THEN
Finite_State_Set___(rec_, 'Confirmed');
Refresh_Order_State___(rec_, attr_);
ELSIF (Check_Unreceive_Clo_To_Arr___(rec_)) THEN
Finite_State_Set___(rec_, 'Arrived');
Refresh_Order_State___(rec_, attr_);
Finite_State_Machine___(rec_, NULL, attr_);
END IF;
ELSE
Error_SYS.State_Event_Not_Handled(lu_name_, event_, Finite_State_Decode__(state_));
END IF;
ELSIF (state_ = 'Confirmed') THEN
IF (event_ = 'Arrive') THEN
Finite_State_Set___(rec_, 'Arrived');
Refresh_Order_State___(rec_, attr_);
Purchase_Order_Line_Util_API.Set_Dop_Started(rec_.order_no,rec_.line_no,rec_.release_no);
Finite_State_Machine___(rec_, NULL, attr_);
ELSIF (event_ = 'Cancel') THEN
IF (Not Reservations_Exist___(rec_) And Not Issues_Exist___(rec_)) THEN
/* Finite_State_Set___(rec_, 'Cancelled');
Reduce_Blanket_Amount___(rec_, attr_);
Refresh_Order_State___(rec_, attr_);*/
Update_Revision_Status___(rec_, attr_);
Finite_State_Set___(rec_, 'Cancelled');
Reduce_Blanket_Amount___(rec_, attr_);
Refresh_Order_State___(rec_, attr_);
Cancel_Customer_Order___(rec_, attr_);
Delete_Reserved___(rec_, attr_);
END IF;
ELSIF (event_ = 'Reset') THEN
Finite_State_Set___(rec_, 'Released');
Refresh_Order_State___(rec_, attr_);
/* ELSE
Error_SYS.State_Event_Not_Handled(lu_name_, event_, Finite_State_Decode__(state_)); */
END IF;
ELSIF (state_ = 'Received') THEN
IF (event_ = 'Arrive') THEN
Refresh_Order_State___(rec_, attr_);
Purchase_Order_Line_Util_API.Set_Dop_Started(rec_.order_no,rec_.line_no,rec_.release_no);
ELSIF (event_ = 'Close') THEN
IF (Zero_At_Dock___(rec_)) THEN
Finite_State_Set___(rec_, 'Closed');
Refresh_Order_State___(rec_, attr_);
Delete_Reserved___(rec_, attr_);
ELSE
IF Purchase_Order_Line_Part_API.Is_Part(rec_.order_no, rec_.line_no, rec_.release_no) THEN
Client_SYS.Add_Info(lu_name_,'CLOSEERRORQTY: The quantity at dock not zero.');
ELSE
Client_SYS.Add_Info(lu_name_,'CLOSEERRORNOPART: Closing is just allowed for purchase part lines.');
END IF;
END IF;
ELSIF (event_ = 'Receive') THEN
Refresh_Order_State___(rec_, attr_);
ELSIF (event_ = 'Unreceive') THEN
IF (Check_Unreceive_Rec_To_Arr___(rec_)) THEN
Finite_State_Set___(rec_, 'Arrived');
Refresh_Order_State___(rec_, attr_);
Finite_State_Machine___(rec_, NULL, attr_);
ELSIF (Check_Unreceive_Rec_To_Conf___(rec_)) THEN
Finite_State_Set___(rec_, 'Confirmed');
Refresh_Order_State___(rec_, attr_);
END IF;
ELSE
Error_SYS.State_Event_Not_Handled(lu_name_, event_, Finite_State_Decode__(state_));
END IF;
ELSIF (state_ = 'Released') THEN
IF (event_ = 'Arrive') THEN
Finite_State_Set___(rec_, 'Arrived');
Refresh_Order_State___(rec_, attr_);
Purchase_Order_Line_Util_API.Set_Dop_Started(rec_.order_no,rec_.line_no,rec_.release_no);
Finite_State_Machine___(rec_, NULL, attr_);
ELSIF (event_ = 'Cancel') THEN
IF (Not Reservations_Exist___(rec_) And Not Issues_Exist___(rec_)) THEN
/* Finite_State_Set___(rec_, 'Cancelled');
Reduce_Blanket_Amount___(rec_, attr_);
Refresh_Order_State___(rec_, attr_);*/
Update_Revision_Status___(rec_, attr_);
Finite_State_Set___(rec_, 'Cancelled');
Reduce_Blanket_Amount___(rec_, attr_);
Refresh_Order_State___(rec_, attr_);
Cancel_Customer_Order___(rec_, attr_);
Delete_Reserved___(rec_, attr_);
END IF;
ELSIF (event_ = 'Confirm') THEN
Finite_State_Set___(rec_, 'Confirmed');
Refresh_Order_State___(rec_, attr_);
Purchase_Order_Line_Util_API.Set_Dop_Started(rec_.order_no,rec_.line_no,rec_.release_no);
ELSIF (event_ = 'Freeze') THEN
Finite_State_Set___(rec_, 'Stopped');
ELSE
Error_SYS.State_Event_Not_Handled(lu_name_, event_, Finite_State_Decode__(state_));
END IF;
ELSIF (state_ = 'Stopped') THEN
IF (event_ = 'Cancel') THEN
IF (Not Reservations_Exist___(rec_) And Not Issues_Exist___(rec_)) THEN
/* Finite_State_Set___(rec_, 'Cancelled');
Reduce_Blanket_Amount___(rec_, attr_);
Refresh_Order_State___(rec_, attr_);*/
Update_Revision_Status___(rec_, attr_);
Finite_State_Set___(rec_, 'Cancelled');
Reduce_Blanket_Amount___(rec_, attr_);
Refresh_Order_State___(rec_, attr_);
Cancel_Customer_Order___(rec_, attr_);
Delete_Reserved___(rec_, attr_);
END IF;
ELSIF (event_ = 'Release') THEN
Finite_State_Set___(rec_, 'Released');
Refresh_Order_State___(rec_, attr_);
Purchase_Order_Line_Util_API.Set_Dop_Started(rec_.order_no,rec_.line_no,rec_.release_no);
ELSE
Error_SYS.State_Event_Not_Handled(lu_name_, event_, Finite_State_Decode__(state_));
END IF;
ELSE
Error_SYS.State_Not_Exist(lu_name_, Finite_State_Decode__(state_));
END IF;
END Finite_State_Machine___;
ELSIF (event_ = 'Arrive') THEN
--Finite_State_Machine___(rec_, NULL, attr_);
if(Not Inspect_Receipt___(rec_)) then
Finite_State_Set___(rec_, 'Received');
end if;
Refresh_Order_State___(rec_, attr_);
Purchase_Order_Line_Util_API.Set_Dop_Started(rec_.order_no,rec_.line_no,rec_.release_no);