carlos@0
|
1 |
<?xml version="1.0"?>
|
adrian@94
|
2 |
<database name="FUNCTION M_INOUT_POST">
|
adrian@94
|
3 |
<function name="M_INOUT_POST" type="NULL">
|
antonio@735
|
4 |
<parameter name="p_pinstance_id" type="NUMERIC" mode="in">
|
antonio@735
|
5 |
<default/>
|
antonio@735
|
6 |
</parameter>
|
antonio@735
|
7 |
<parameter name="p_inout_id" type="NUMERIC" mode="in">
|
antonio@735
|
8 |
<default/>
|
antonio@735
|
9 |
</parameter>
|
gorkaion@239
|
10 |
<body><![CDATA[/*************************************************************************
|
juanpablo@771
|
11 |
* The contents of this file are subject to the Compiere Public
|
juanpablo@771
|
12 |
* License 1.1 ("License"); You may not use this file except in
|
juanpablo@771
|
13 |
* compliance with the License. You may obtain a copy of the License in
|
juanpablo@771
|
14 |
* the legal folder of your Openbravo installation.
|
juanpablo@771
|
15 |
|
carlos@0
|
16 |
* Software distributed under the License is distributed on an
|
carlos@0
|
17 |
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
carlos@0
|
18 |
* implied. See the License for the specific language governing rights
|
juanpablo@771
|
19 |
|
carlos@0
|
20 |
* and limitations under the License.
|
juanpablo@771
|
21 |
* The Original Code is Compiere ERP \& Business Solution
|
juanpablo@771
|
22 |
* The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
|
juanpablo@771
|
23 |
|
carlos@0
|
24 |
* Portions created by Jorg Janke are Copyright (C) 1999-2001 Jorg Janke,
|
carlos@0
|
25 |
* parts created by ComPiere are Copyright (C) ComPiere, Inc.;
|
carlos@0
|
26 |
* All Rights Reserved.
|
carlos@0
|
27 |
* Contributor(s): Openbravo SL
|
juanpablo@771
|
28 |
|
carlos@511
|
29 |
* Contributions are Copyright (C) 1999-2008 Openbravo, S.L
|
juanpablo@771
|
30 |
*
|
juanpablo@771
|
31 |
* Specifically, this derivative work is based upon the following Compiere
|
juanpablo@771
|
32 |
* file and version.
|
carlos@0
|
33 |
*************************************************************************
|
carlos@0
|
34 |
* $Id: M_InOut_Post.sql,v 1.8 2003/09/05 04:58:06 jjanke Exp $
|
carlos@0
|
35 |
***
|
carlos@0
|
36 |
* Title: Post M_InOut_ID
|
carlos@0
|
37 |
* Description:
|
carlos@0
|
38 |
* Action: COmplete
|
carlos@0
|
39 |
* - Create Transaction
|
carlos@0
|
40 |
* (only stocked products)
|
carlos@0
|
41 |
* - Update Inventory (QtyReserved, QtyOnHand)
|
carlos@0
|
42 |
* (only stocked products)
|
carlos@0
|
43 |
* - Update OrderLine (QtyDelivered)
|
carlos@0
|
44 |
*
|
carlos@0
|
45 |
* Action: Reverse Correction
|
carlos@0
|
46 |
* - Create Header and lines with negative Quantities (and header amounts)
|
carlos@0
|
47 |
* - Post it
|
carlos@0
|
48 |
************************************************************************/
|
carlos@0
|
49 |
-- Logistice
|
carlos@0
|
50 |
v_ResultStr VARCHAR2(2000):='';
|
carlos@0
|
51 |
v_Message VARCHAR2(2000):='';
|
carlos@0
|
52 |
v_Record_ID NUMBER;
|
carlos@0
|
53 |
v_User NUMBER;
|
carlos@0
|
54 |
-- Parameter
|
carlos@0
|
55 |
TYPE RECORD IS REF CURSOR;
|
carlos@0
|
56 |
Cur_Parameter RECORD;
|
carlos@0
|
57 |
--
|
carlos@0
|
58 |
Cur_InOut RECORD;
|
carlos@0
|
59 |
Cur_InOutLine RECORD;
|
carlos@0
|
60 |
--
|
carlos@0
|
61 |
v_Result NUMBER:=1;
|
carlos@0
|
62 |
v_AD_Org_ID NUMBER;
|
carlos@0
|
63 |
v_AD_Client_ID NUMBER;
|
carlos@0
|
64 |
v_NextNo NUMBER;
|
carlos@0
|
65 |
v_Qty NUMBER;
|
carlos@0
|
66 |
v_QtyPO NUMBER;
|
carlos@0
|
67 |
v_QtySO NUMBER;
|
carlos@0
|
68 |
v_QuantityOrder NUMBER;
|
carlos@0
|
69 |
v_QuantityOrderPO NUMBER;
|
carlos@0
|
70 |
v_QuantityOrderSO NUMBER;
|
carlos@0
|
71 |
v_RDocumentNo VARCHAR2(40) ;
|
carlos@0
|
72 |
v_RInOut_ID NUMBER;
|
carlos@0
|
73 |
v_IsStocked NUMBER;
|
carlos@0
|
74 |
v_DoctypeReversed_ID NUMBER;
|
carlos@0
|
75 |
--MODIFIED BY F.IRIAZABAL
|
carlos@0
|
76 |
v_QtyOrder NUMBER;
|
carlos@0
|
77 |
v_ProductUOM NUMBER;
|
carlos@0
|
78 |
v_BreakDown CHAR(1) ;
|
carlos@0
|
79 |
v_ActualQty NUMBER;
|
carlos@0
|
80 |
v_QtyAux NUMBER;
|
carlos@0
|
81 |
v_Count NUMBER:=0;
|
carlos@0
|
82 |
v_Line VARCHAR2(10) ;
|
carlos@0
|
83 |
FINISH_PROCESS BOOLEAN:=false;
|
carlos@0
|
84 |
BEGIN
|
carlos@0
|
85 |
IF(p_PInstance_ID IS NOT NULL) THEN
|
carlos@0
|
86 |
-- Update AD_PInstance
|
carlos@0
|
87 |
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID) ;
|
carlos@0
|
88 |
v_ResultStr:='PInstanceNotFound';
|
carlos@0
|
89 |
AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'Y', NULL, NULL) ;
|
carlos@0
|
90 |
-- Get Parameters
|
carlos@0
|
91 |
v_ResultStr:='ReadingParameters';
|
carlos@0
|
92 |
FOR Cur_Parameter IN
|
carlos@0
|
93 |
(SELECT i.Record_ID,
|
carlos@0
|
94 |
i.AD_User_ID,
|
carlos@0
|
95 |
p.ParameterName,
|
carlos@0
|
96 |
p.P_String,
|
carlos@0
|
97 |
p.P_Number,
|
carlos@0
|
98 |
p.P_Date
|
carlos@0
|
99 |
FROM AD_PInstance i
|
carlos@0
|
100 |
LEFT JOIN AD_PInstance_Para p
|
carlos@0
|
101 |
ON i.AD_PInstance_ID=p.AD_PInstance_ID
|
carlos@0
|
102 |
WHERE i.AD_PInstance_ID=p_PInstance_ID
|
carlos@0
|
103 |
ORDER BY p.SeqNo
|
carlos@0
|
104 |
)
|
carlos@0
|
105 |
LOOP
|
carlos@0
|
106 |
v_Record_ID:=Cur_Parameter.Record_ID;
|
carlos@0
|
107 |
v_User:=Cur_Parameter.AD_User_ID;
|
carlos@0
|
108 |
END LOOP; -- Get Parameter
|
carlos@0
|
109 |
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || v_Record_ID) ;
|
carlos@0
|
110 |
ELSE
|
gorkaion@239
|
111 |
DBMS_OUTPUT.PUT_LINE('--<<M_InOut_Post>>') ;
|
carlos@0
|
112 |
v_Record_ID:=p_InOut_ID;
|
carlos@0
|
113 |
END IF;
|
carlos@0
|
114 |
BEGIN --BODY
|
carlos@0
|
115 |
SELECT AD_Client_ID, AD_Org_ID, CreatedBy
|
carlos@0
|
116 |
INTO v_AD_Client_ID, v_AD_Org_ID, v_User
|
carlos@0
|
117 |
FROM M_InOut
|
carlos@0
|
118 |
WHERE M_InOut_ID=v_Record_ID;
|
carlos@0
|
119 |
SELECT count(*)
|
carlos@0
|
120 |
INTO v_Count
|
carlos@0
|
121 |
FROM AD_CLIENTINFO
|
carlos@0
|
122 |
WHERE AD_CLIENT_ID=v_AD_Client_ID
|
carlos@0
|
123 |
AND CHECKINOUTORG='Y';
|
gorkaion@239
|
124 |
IF v_Count>0 THEN
|
carlos@0
|
125 |
v_ResultStr:='CheckingRestrictions - M_INOUT ORG IS IN C_BPARTNER ORG TREE';
|
carlos@0
|
126 |
SELECT count(*)
|
carlos@0
|
127 |
INTO v_Count
|
carlos@0
|
128 |
FROM M_InOut m,
|
carlos@0
|
129 |
C_BPartner bp
|
carlos@0
|
130 |
WHERE m.M_InOut_ID=v_Record_ID
|
carlos@0
|
131 |
AND m.C_BPARTNER_ID=bp.C_BPARTNER_ID
|
carlos@0
|
132 |
AND AD_IsOrgIncluded(m.AD_ORG_ID, bp.AD_ORG_ID, bp.AD_CLIENT_ID)=-1;
|
gorkaion@239
|
133 |
IF v_Count>0 THEN
|
carlos@0
|
134 |
RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgBpartnerInout@') ;
|
carlos@0
|
135 |
END IF;
|
carlos@0
|
136 |
END IF;
|
carlos@0
|
137 |
IF(NOT FINISH_PROCESS) THEN
|
carlos@0
|
138 |
v_ResultStr:='CheckingRestrictions';
|
carlos@0
|
139 |
SELECT COUNT(*)
|
carlos@0
|
140 |
INTO v_Count
|
carlos@0
|
141 |
FROM C_DocType,
|
carlos@0
|
142 |
M_InOut M
|
carlos@0
|
143 |
WHERE M_Inout_ID = v_Record_ID
|
carlos@0
|
144 |
AND C_DocType.DocBaseType IN ('MMR', 'MMS')
|
carlos@0
|
145 |
AND C_DocType.IsSOTrx=M.IsSOTrx
|
gorkaion@239
|
146 |
AND AD_ISORGINCLUDED(m.AD_Org_ID,C_DocType.AD_Org_ID, m.AD_Client_ID) <> -1
|
carlos@0
|
147 |
AND M.C_DOCTYPE_ID=C_DocType.C_DOCTYPE_ID;
|
carlos@0
|
148 |
IF v_Count=0 THEN
|
carlos@0
|
149 |
RAISE_APPLICATION_ERROR(-20000, '@NotCorrectOrgDoctypeShipment@') ;
|
carlos@0
|
150 |
END IF;
|
carlos@0
|
151 |
SELECT COUNT(*), MAX(M.line)
|
carlos@0
|
152 |
INTO v_Count, v_line
|
carlos@0
|
153 |
FROM M_InOutLine M,
|
carlos@0
|
154 |
M_Product P
|
carlos@0
|
155 |
WHERE M.M_PRODUCT_ID=P.M_PRODUCT_ID
|
carlos@0
|
156 |
AND P.M_ATTRIBUTESET_ID IS NOT NULL
|
carlos@0
|
157 |
AND M.M_ATTRIBUTESETINSTANCE_ID IS NULL
|
carlos@0
|
158 |
AND M.M_INOUT_ID=v_Record_ID;
|
gorkaion@239
|
159 |
IF v_Count<>0 THEN
|
carlos@0
|
160 |
RAISE_APPLICATION_ERROR(-20000, '@Inline@'||v_line||' '||'@productWithoutAttributeSet@') ;
|
carlos@0
|
161 |
END IF;
|
carlos@0
|
162 |
SELECT COUNT(*), MAX(M.line)
|
carlos@0
|
163 |
INTO v_Count, v_Line
|
carlos@0
|
164 |
FROM M_InOut I,
|
carlos@0
|
165 |
M_InOutLine M,
|
carlos@0
|
166 |
M_AttributeSetInstance P
|
carlos@0
|
167 |
WHERE I.M_InOut_ID=M.M_InOut_ID
|
carlos@0
|
168 |
AND M.M_AttributeSetInstance_ID=P.M_AttributeSetInstance_ID
|
carlos@0
|
169 |
AND P.ISLOCKED='Y'
|
carlos@0
|
170 |
AND I.ISSOTRX='Y'
|
carlos@0
|
171 |
AND I.M_INOUT_ID=v_Record_ID;
|
gorkaion@239
|
172 |
IF v_Count<>0 THEN
|
carlos@0
|
173 |
RAISE_APPLICATION_ERROR(-20000, '@Inline@'||v_line||' '||'@lockedProduct@') ;
|
carlos@0
|
174 |
END IF;
|
carlos@0
|
175 |
-- Process Shipments
|
carlos@0
|
176 |
|
carlos@511
|
177 |
-- Set org lines like the header
|
carlos@511
|
178 |
UPDATE M_INOUTLINE
|
carlos@0
|
179 |
SET AD_ORG_ID = (SELECT AD_ORG_ID FROM M_INOUT WHERE M_INOUT_ID = v_Record_ID)
|
carlos@0
|
180 |
WHERE M_INOUT_ID = v_Record_ID;
|
carlos@0
|
181 |
|
carlos@0
|
182 |
FOR Cur_InOut IN
|
carlos@0
|
183 |
(SELECT *
|
carlos@0
|
184 |
FROM M_INOUT
|
carlos@0
|
185 |
WHERE(M_InOut_ID=v_Record_ID
|
carlos@0
|
186 |
OR(v_Record_ID IS NULL
|
carlos@0
|
187 |
AND DocAction='CO'))
|
carlos@0
|
188 |
AND IsActive='Y' FOR UPDATE
|
carlos@0
|
189 |
)
|
carlos@0
|
190 |
LOOP
|
carlos@0
|
191 |
DBMS_OUTPUT.PUT_LINE('Shipment_ID=' || Cur_InOut.M_InOut_ID || ', Doc=' || Cur_InOut.DocumentNo || ', Status=' || Cur_InOut.DocStatus || ', Action=' || Cur_InOut.DocAction) ;
|
carlos@0
|
192 |
v_ResultStr:='HeaderLoop';
|
carlos@0
|
193 |
/**
|
carlos@0
|
194 |
* Shipment not processed
|
carlos@0
|
195 |
*/
|
carlos@0
|
196 |
IF(Cur_InOut.Processed='N' AND Cur_InOut.DocStatus='DR' AND Cur_InOut.DocAction='CO') THEN
|
carlos@0
|
197 |
-- For all active shipment lines
|
carlos@0
|
198 |
v_ResultStr:='HeaderLoop-1';
|
carlos@0
|
199 |
FOR Cur_InOutLine IN
|
carlos@0
|
200 |
(SELECT *
|
carlos@0
|
201 |
FROM M_INOUTLINE
|
carlos@0
|
202 |
WHERE M_InOut_ID=Cur_InOut.M_InOut_ID
|
carlos@0
|
203 |
AND IsActive='Y' FOR UPDATE
|
carlos@0
|
204 |
)
|
carlos@0
|
205 |
LOOP
|
adrian@170
|
206 |
-- Incomming or Outgoing :1:2
|
carlos@0
|
207 |
v_Qty:=Cur_InOutLine.MovementQty;
|
carlos@0
|
208 |
v_QuantityOrder:=Cur_InOutLine.QuantityOrder;
|
carlos@0
|
209 |
IF(SUBSTR(Cur_InOut.MovementType, 2)='-') THEN
|
carlos@0
|
210 |
v_Qty:=- Cur_InOutLine.MovementQty;
|
carlos@0
|
211 |
v_QuantityOrder:=-Cur_InOutLine.QuantityOrder;
|
carlos@0
|
212 |
END IF;
|
carlos@0
|
213 |
IF(Cur_InOut.IsSOTrx='N') THEN
|
carlos@0
|
214 |
v_QtySO:=0;
|
carlos@0
|
215 |
v_QtyPO:=Cur_InOutLine.MovementQty;
|
carlos@0
|
216 |
v_QuantityOrderSO:=0;
|
carlos@0
|
217 |
v_QuantityOrderPO:=Cur_InOutLine.QuantityOrder;
|
carlos@0
|
218 |
ELSE
|
carlos@0
|
219 |
v_QtySO:=Cur_InOutLine.MovementQty;
|
carlos@0
|
220 |
v_QtyPO:=0;
|
carlos@0
|
221 |
v_QuantityOrderSO:=Cur_InOutLine.QuantityOrder;
|
carlos@0
|
222 |
v_QuantityOrderPO:=0;
|
carlos@0
|
223 |
END IF;
|
carlos@0
|
224 |
-- UOM Conversion
|
adrian@170
|
225 |
-- Is it a standard stocked product:3
|
carlos@0
|
226 |
SELECT COUNT(*)
|
carlos@0
|
227 |
INTO v_IsStocked
|
carlos@0
|
228 |
FROM M_PRODUCT
|
carlos@0
|
229 |
WHERE M_Product_ID=Cur_InOutLine.M_Product_ID
|
carlos@0
|
230 |
AND IsStocked='Y'
|
carlos@0
|
231 |
AND ProductType='I';
|
carlos@0
|
232 |
-- Create Transaction for stocked product
|
carlos@0
|
233 |
IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1) THEN
|
carlos@0
|
234 |
v_ResultStr:='CreateTransaction';
|
carlos@0
|
235 |
Ad_Sequence_Next('M_Transaction', Cur_InOutLine.AD_Org_ID, v_NextNo) ;
|
carlos@0
|
236 |
INSERT
|
carlos@0
|
237 |
INTO M_TRANSACTION
|
carlos@0
|
238 |
(
|
carlos@0
|
239 |
M_Transaction_ID, M_InOutLine_ID, AD_Client_ID, AD_Org_ID,
|
carlos@0
|
240 |
IsActive, Created, CreatedBy, Updated,
|
carlos@0
|
241 |
UpdatedBy, MovementType, M_Locator_ID, M_Product_ID,
|
carlos@0
|
242 |
M_AttributeSetInstance_ID, MovementDate, MovementQty, M_Product_UOM_ID,
|
carlos@0
|
243 |
QuantityOrder, C_UOM_ID
|
carlos@0
|
244 |
)
|
carlos@0
|
245 |
VALUES
|
carlos@0
|
246 |
(
|
carlos@0
|
247 |
v_NextNo, Cur_InOutLine.M_InOutLine_ID, Cur_InOutLine.AD_Client_ID, Cur_InOutLine.AD_Org_ID,
|
carlos@0
|
248 |
'Y', now(), Cur_InOutLine.UpdatedBy, now(),
|
carlos@0
|
249 |
Cur_InOutLine.UpdatedBy, Cur_InOut.MovementType, Cur_InOutLine.M_Locator_ID, Cur_InOutLine.M_Product_ID,
|
carlos@0
|
250 |
COALESCE(Cur_InOutLine.M_AttributeSetInstance_ID, 0), Cur_InOut.MovementDate, v_Qty, Cur_InOutLine.M_Product_UOM_ID,
|
carlos@0
|
251 |
v_QuantityOrder, Cur_InOutLine.C_UOM_ID
|
carlos@0
|
252 |
)
|
carlos@0
|
253 |
;
|
carlos@0
|
254 |
END IF;
|
carlos@0
|
255 |
-- Create Asset
|
carlos@0
|
256 |
IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND Cur_InOut.IsSOTrx='Y') THEN
|
antonio@735
|
257 |
A_ASSET_CREATE(NULL, Cur_InOutLine.M_InOutLine_ID) ;
|
carlos@0
|
258 |
END IF;
|
carlos@0
|
259 |
v_ResultStr:='UpdateOrderLine';
|
carlos@0
|
260 |
IF(Cur_InOutLine.C_OrderLine_ID IS NOT NULL) THEN
|
carlos@0
|
261 |
-- stocked product
|
carlos@0
|
262 |
IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1) THEN
|
carlos@0
|
263 |
-- Update OrderLine (if C-, Qty is negative)
|
carlos@0
|
264 |
UPDATE C_ORDERLINE
|
carlos@0
|
265 |
SET QtyReserved=QtyReserved - v_QtyPO - v_QtySO,
|
carlos@0
|
266 |
QtyDelivered=QtyDelivered + v_QtySO,
|
carlos@0
|
267 |
Updated=now()
|
carlos@0
|
268 |
WHERE C_OrderLine_ID=Cur_InOutLine.C_OrderLine_ID;
|
carlos@0
|
269 |
-- Products not stocked
|
carlos@0
|
270 |
ELSE
|
carlos@0
|
271 |
-- Update OrderLine (if C-, Qty is negative)
|
carlos@0
|
272 |
UPDATE C_ORDERLINE
|
carlos@0
|
273 |
SET QtyDelivered=QtyDelivered + v_QtySO,
|
carlos@0
|
274 |
Updated=now()
|
carlos@0
|
275 |
WHERE C_OrderLine_ID=Cur_InOutLine.C_OrderLine_ID;
|
carlos@0
|
276 |
END IF;
|
carlos@0
|
277 |
END IF;
|
carlos@0
|
278 |
IF(Cur_InOutLine.M_Product_ID IS NOT NULL AND v_IsStocked=1) THEN
|
carlos@0
|
279 |
M_Check_Stock(Cur_InOutLine.M_Product_ID, v_AD_Client_ID, v_AD_Org_ID, v_Result, v_Message) ;
|
carlos@0
|
280 |
IF v_Result=0 THEN
|
carlos@0
|
281 |
RAISE_APPLICATION_ERROR(-20000, v_Message||' '||'@line@'||' '||Cur_InOutLine.line) ;
|
carlos@0
|
282 |
END IF;
|
carlos@0
|
283 |
END IF;
|
carlos@0
|
284 |
END LOOP; -- For all InOut Lines
|
carlos@0
|
285 |
/*******************
|
carlos@0
|
286 |
* PO Matching
|
carlos@0
|
287 |
******************/
|
carlos@0
|
288 |
IF(Cur_InOut.IsSOTrx='N') THEN
|
carlos@0
|
289 |
DECLARE
|
carlos@0
|
290 |
Cur_SLines RECORD;
|
carlos@0
|
291 |
Cur_ILines RECORD;
|
carlos@0
|
292 |
v_Qty NUMBER;
|
carlos@0
|
293 |
v_MatchPO_ID NUMBER(10) ;
|
carlos@0
|
294 |
v_MatchInv_ID NUMBER(10) ;
|
carlos@0
|
295 |
BEGIN
|
carlos@0
|
296 |
v_ResultStr:='MatchPO';
|
carlos@0
|
297 |
FOR Cur_SLines IN
|
carlos@0
|
298 |
(SELECT sl.AD_Client_ID,
|
carlos@0
|
299 |
sl.AD_Org_ID,
|
carlos@0
|
300 |
ol.C_OrderLine_ID,
|
carlos@0
|
301 |
sl.M_InOutLine_ID,
|
carlos@0
|
302 |
sl.M_Product_ID,
|
carlos@0
|
303 |
sl.M_AttributeSetInstance_ID,
|
carlos@0
|
304 |
sl.MovementQty,
|
carlos@0
|
305 |
ol.QtyOrdered
|
carlos@0
|
306 |
FROM M_INOUTLINE sl,
|
carlos@0
|
307 |
C_ORDERLINE ol
|
carlos@0
|
308 |
WHERE sl.C_OrderLine_ID=ol.C_OrderLine_ID
|
carlos@0
|
309 |
AND sl.M_Product_ID=ol.M_Product_ID -- AND sl.M_AttributeSetInstance_ID=ol.M_AttributeSetInstance_ID
|
carlos@0
|
310 |
AND sl.M_InOut_ID=Cur_InOut.M_InOut_ID
|
carlos@0
|
311 |
)
|
carlos@0
|
312 |
LOOP
|
carlos@0
|
313 |
Ad_Sequence_Next('M_MatchPO', Cur_SLines.AD_Org_ID, v_MatchPO_ID) ;
|
carlos@0
|
314 |
-- The min qty. Modified by Ismael Ciordia
|
carlos@0
|
315 |
v_Qty:=Cur_SLines.MovementQty;
|
gorkaion@239
|
316 |
--IF (ABS(Cur_SLines.MovementQty) > ABS(Cur_SLines.QtyOrdered)) THEN
|
carlos@0
|
317 |
-- v_Qty := Cur_SLines.QtyOrdered;
|
carlos@0
|
318 |
--END IF;
|
carlos@0
|
319 |
v_ResultStr:='InsertMatchPO ' || v_MatchPO_ID;
|
carlos@0
|
320 |
INSERT
|
carlos@0
|
321 |
INTO M_MATCHPO
|
carlos@0
|
322 |
(
|
carlos@0
|
323 |
M_MatchPO_ID, AD_Client_ID, AD_Org_ID, IsActive,
|
carlos@0
|
324 |
Created, CreatedBy, Updated, UpdatedBy,
|
carlos@0
|
325 |
M_InOutLine_ID, C_OrderLine_ID, M_Product_ID, DateTrx,
|
carlos@0
|
326 |
Qty, Processing, Processed, Posted
|
carlos@0
|
327 |
)
|
carlos@0
|
328 |
VALUES
|
carlos@0
|
329 |
(
|
carlos@0
|
330 |
v_MatchPO_ID, Cur_SLines.AD_Client_ID, Cur_SLines.AD_Org_ID, 'Y',
|
carlos@0
|
331 |
now(), 0, now(), 0,
|
carlos@0
|
332 |
Cur_SLines.M_InOutLine_ID, Cur_SLines.C_OrderLine_ID, Cur_SLines.M_Product_ID, now(),
|
carlos@0
|
333 |
v_Qty, 'N', 'Y', 'N'
|
carlos@0
|
334 |
)
|
carlos@0
|
335 |
;
|
carlos@0
|
336 |
END LOOP;
|
carlos@0
|
337 |
v_ResultStr:='MatchInv';
|
carlos@0
|
338 |
FOR Cur_ILines IN
|
carlos@0
|
339 |
(SELECT sl.AD_Client_ID,
|
carlos@0
|
340 |
sl.AD_Org_ID,
|
carlos@0
|
341 |
il.C_InvoiceLine_ID,
|
carlos@0
|
342 |
sl.M_InOutLine_ID,
|
carlos@0
|
343 |
sl.M_Product_ID,
|
carlos@0
|
344 |
sl.M_AttributeSetInstance_ID,
|
carlos@0
|
345 |
sl.MovementQty,
|
carlos@0
|
346 |
il.QTYINVOICED
|
carlos@0
|
347 |
FROM M_INOUTLINE sl,
|
carlos@0
|
348 |
C_INVOICELINE il
|
carlos@0
|
349 |
WHERE sl.M_InOutLine_ID=il.M_InOutLine_ID
|
carlos@0
|
350 |
AND sl.M_InOut_ID=Cur_InOut.M_InOut_ID
|
carlos@0
|
351 |
)
|
carlos@0
|
352 |
LOOP
|
carlos@0
|
353 |
Ad_Sequence_Next('M_MatchInv', Cur_ILines.AD_Org_ID, v_MatchInv_ID) ;
|
carlos@0
|
354 |
-- The min qty. Modified by Ismael Ciordia
|
carlos@0
|
355 |
v_Qty:=Cur_ILines.MovementQty;
|
gorkaion@239
|
356 |
--IF (ABS(Cur_ILines.MovementQty) > ABS(Cur_ILines.QtyInvoiced)) THEN
|
carlos@0
|
357 |
-- v_Qty := Cur_ILines.QtyInvoiced;
|
carlos@0
|
358 |
--END IF;
|
carlos@0
|
359 |
v_ResultStr:='InsertMatchPO ' || v_MatchPO_ID;
|
carlos@0
|
360 |
INSERT
|
carlos@0
|
361 |
INTO M_MATCHINV
|
carlos@0
|
362 |
(
|
carlos@0
|
363 |
M_MATCHINV_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE,
|
carlos@0
|
364 |
CREATED, CREATEDBY, UPDATED, UPDATEDBY,
|
carlos@0
|
365 |
M_INOUTLINE_ID, C_INVOICELINE_ID, M_PRODUCT_ID, DATETRX,
|
carlos@0
|
366 |
QTY, PROCESSING, PROCESSED, POSTED
|
carlos@0
|
367 |
)
|
carlos@0
|
368 |
VALUES
|
carlos@0
|
369 |
(
|
carlos@0
|
370 |
v_MatchInv_ID, Cur_ILines.AD_Client_ID, Cur_ILines.AD_Org_ID, 'Y',
|
carlos@0
|
371 |
now(), 0, now(), 0,
|
carlos@0
|
372 |
Cur_ILines.M_InOutLine_ID, Cur_ILines.C_InvoiceLine_ID, Cur_ILines.M_Product_ID, now(),
|
carlos@0
|
373 |
v_Qty, 'N', 'Y', 'N'
|
carlos@0
|
374 |
)
|
carlos@0
|
375 |
;
|
carlos@0
|
376 |
END LOOP;
|
carlos@0
|
377 |
END;
|
carlos@0
|
378 |
END IF;
|
carlos@0
|
379 |
-- Close Shipment
|
carlos@0
|
380 |
v_ResultStr:='CloseShipment';
|
carlos@0
|
381 |
UPDATE M_INOUT
|
carlos@0
|
382 |
SET Processed='Y',
|
carlos@0
|
383 |
DocStatus='CO',
|
carlos@0
|
384 |
DocAction='--',
|
carlos@0
|
385 |
Updated=now()
|
carlos@0
|
386 |
WHERE M_INOUT.M_INOUT_ID=Cur_InOut.M_INOUT_ID;
|
carlos@0
|
387 |
--
|
carlos@0
|
388 |
v_ResultStr:='LogEntry';
|
carlos@0
|
389 |
IF(p_PInstance_ID IS NOT NULL) THEN
|
carlos@0
|
390 |
INSERT
|
carlos@0
|
391 |
INTO AD_PINSTANCE_LOG
|
carlos@0
|
392 |
(
|
carlos@0
|
393 |
AD_PInstance_ID, Log_ID,
|
carlos@0
|
394 |
P_ID, P_Msg
|
carlos@0
|
395 |
)
|
carlos@0
|
396 |
VALUES
|
carlos@0
|
397 |
(
|
carlos@0
|
398 |
p_PInstance_ID, Cur_InOut.M_InOut_ID,
|
carlos@0
|
399 |
Cur_InOut.M_InOut_ID, Cur_InOut.DocAction || ': ' || Cur_InOut.DocumentNo
|
carlos@0
|
400 |
)
|
carlos@0
|
401 |
;
|
carlos@0
|
402 |
END IF;
|
carlos@0
|
403 |
-- Not Processed + Complete --
|
carlos@0
|
404 |
/**
|
carlos@0
|
405 |
* Reverse Correction
|
carlos@0
|
406 |
*/
|
carlos@0
|
407 |
ELSIF(Cur_InOut.DocStatus='CO' AND Cur_InOut.DocAction='RC') THEN
|
carlos@0
|
408 |
v_ResultStr:='CreateInOut';
|
carlos@0
|
409 |
SELECT COALESCE(C_DOCTYPE_REVERSED_ID, C_DOCTYPE_ID)
|
carlos@0
|
410 |
INTO v_DoctypeReversed_ID
|
carlos@0
|
411 |
FROM C_DOCTYPE
|
carlos@0
|
412 |
WHERE C_DOCTYPE_ID=Cur_InOut.C_DocType_ID;
|
carlos@0
|
413 |
Ad_Sequence_Next('M_InOut', Cur_InOut.M_InOut_ID, v_RInOut_ID) ; -- Get RInOut_ID
|
carlos@0
|
414 |
Ad_Sequence_Doctype(v_DoctypeReversed_ID, Cur_InOut.M_InOut_ID, 'Y', v_RDocumentNo) ; -- Get RDocumentNo
|
carlos@0
|
415 |
IF(v_RDocumentNo IS NULL) THEN
|
carlos@0
|
416 |
AD_Sequence_Doc('DocumentNo_M_InOut', Cur_InOut.AD_Client_ID, 'Y', v_RDocumentNo) ;
|
carlos@0
|
417 |
END IF;
|
carlos@0
|
418 |
-- Indicate that it is invoiced (i.e. not printed on invoices)
|
carlos@0
|
419 |
v_ResultStr:='SetInvoiced';
|
carlos@0
|
420 |
UPDATE M_INOUTLINE SET IsInvoiced='Y' WHERE M_InOut_ID=Cur_InOut.M_InOut_ID;
|
carlos@0
|
421 |
--
|
carlos@0
|
422 |
DBMS_OUTPUT.PUT_LINE('Reverse InOut_ID=' || v_RInOut_ID || ' DocumentNo=' || v_RDocumentNo) ;
|
carlos@0
|
423 |
v_ResultStr:='InsertInOut Reverse ' || v_RInOut_ID;
|
carlos@0
|
424 |
INSERT
|
carlos@0
|
425 |
INTO M_INOUT
|
carlos@0
|
426 |
(
|
carlos@0
|
427 |
M_InOut_ID, C_Order_ID, IsSOTrx, AD_Client_ID,
|
carlos@0
|
428 |
AD_Org_ID, IsActive, Created, CreatedBy,
|
carlos@0
|
429 |
Updated, UpdatedBy, DocumentNo, C_DocType_ID,
|
carlos@0
|
430 |
Description, IsPrinted, MovementType, MovementDate,
|
carlos@0
|
431 |
DateAcct, C_BPartner_ID, C_BPartner_Location_ID, AD_User_ID,
|
carlos@0
|
432 |
M_Warehouse_ID, POReference, DateOrdered, DeliveryRule,
|
carlos@0
|
433 |
FreightCostRule, FreightAmt, C_Project_ID, C_Activity_ID,
|
carlos@0
|
434 |
C_Campaign_ID, AD_OrgTrx_ID, User1_ID, User2_ID,
|
carlos@0
|
435 |
DeliveryViaRule, M_Shipper_ID, C_Charge_ID, ChargeAmt,
|
carlos@0
|
436 |
PriorityRule, DocStatus, DocAction, Processing,
|
carlos@0
|
437 |
Processed, ISLOGISTIC, salesrep_id
|
carlos@0
|
438 |
)
|
carlos@0
|
439 |
VALUES
|
carlos@0
|
440 |
(
|
carlos@0
|
441 |
v_RInOut_ID, Cur_InOut.C_Order_ID, Cur_InOut.IsSOTrx, Cur_InOut.AD_Client_ID,
|
carlos@0
|
442 |
Cur_InOut.AD_Org_ID, 'Y', now(), 0,
|
carlos@0
|
443 |
now(), 0, v_RDocumentNo, v_DoctypeReversed_ID,
|
carlos@0
|
444 |
'(*R*: ' || Cur_InOut.DocumentNo || ') ' || Cur_InOut.Description, 'N', Cur_InOut.MovementType, Cur_InOut.MovementDate,
|
carlos@0
|
445 |
Cur_InOut.DateAcct, Cur_InOut.C_BPartner_ID, Cur_InOut.C_BPartner_Location_ID, Cur_InOut.AD_User_ID,
|
carlos@0
|
446 |
Cur_InOut.M_Warehouse_ID, Cur_InOut.POReference, Cur_InOut.DateOrdered, Cur_InOut.DeliveryRule,
|
carlos@0
|
447 |
Cur_InOut.FreightCostRule, Cur_InOut.FreightAmt * -1, Cur_InOut.C_Project_ID, Cur_InOut.C_Activity_ID,
|
carlos@0
|
448 |
Cur_InOut.C_Campaign_ID, Cur_InOut.AD_OrgTrx_ID, Cur_InOut.User1_ID, Cur_InOut.User2_ID,
|
carlos@0
|
449 |
Cur_InOut.DeliveryViaRule, Cur_InOut.M_Shipper_ID, Cur_InOut.C_Charge_ID, Cur_InOut.ChargeAmt * -1,
|
carlos@0
|
450 |
Cur_InOut.PriorityRule, 'DR', 'CO', 'N',
|
carlos@0
|
451 |
'N', Cur_InOut.islogistic, Cur_InOut.salesrep_id
|
carlos@0
|
452 |
)
|
carlos@0
|
453 |
;
|
carlos@0
|
454 |
v_ResultStr:='InsertInOutLine';
|
carlos@0
|
455 |
FOR Cur_InOutLine IN
|
carlos@0
|
456 |
(SELECT *
|
carlos@0
|
457 |
FROM M_INOUTLINE
|
carlos@0
|
458 |
WHERE M_InOut_ID=Cur_InOut.M_InOut_ID
|
carlos@0
|
459 |
AND IsActive='Y' FOR UPDATE
|
carlos@0
|
460 |
)
|
carlos@0
|
461 |
LOOP
|
carlos@0
|
462 |
-- Create InOut Line
|
carlos@0
|
463 |
Ad_Sequence_Next('M_InOutLine', Cur_InOut.M_InOut_ID, v_NextNo) ;
|
carlos@0
|
464 |
v_ResultStr:='CreateInOutLine';
|
carlos@0
|
465 |
INSERT
|
carlos@0
|
466 |
INTO M_INOUTLINE
|
carlos@0
|
467 |
(
|
carlos@0
|
468 |
M_InOutLine_ID, Line, M_InOut_ID, C_OrderLine_ID,
|
carlos@0
|
469 |
AD_Client_ID, AD_Org_ID, IsActive, Created,
|
carlos@0
|
470 |
CreatedBy, Updated, UpdatedBy, M_Product_ID,
|
carlos@0
|
471 |
M_AttributeSetInstance_ID, C_UOM_ID, M_Locator_ID, MovementQty,
|
carlos@0
|
472 |
Description, IsInvoiced, Lot, SerNo, --MODIFIED BY F.IRIAZABAL
|
carlos@0
|
473 |
QuantityOrder, M_Product_UOM_ID
|
carlos@0
|
474 |
)
|
carlos@0
|
475 |
VALUES
|
carlos@0
|
476 |
(
|
carlos@0
|
477 |
v_NextNo, Cur_InOutLine.Line, v_RInOut_ID, Cur_InOutLine.C_OrderLine_ID,
|
carlos@0
|
478 |
Cur_InOut.AD_Client_ID, Cur_InOut.AD_Org_ID, 'Y', now(),
|
carlos@0
|
479 |
0, now(), 0, Cur_InOutLine.M_Product_ID,
|
carlos@0
|
480 |
Cur_InOutLine.M_AttributeSetInstance_ID, Cur_InOutLine.C_UOM_ID, Cur_InOutLine.M_Locator_ID, Cur_InOutLine.MovementQty * -1,
|
carlos@0
|
481 |
'*R*: ' || Cur_InOutLine.Description, Cur_InOutLine.IsInvoiced, Cur_InOutLine.Lot, Cur_InOutLine.SerNo, --MODIFIED BY F.IRIAZABAL
|
carlos@0
|
482 |
Cur_InOutLine.QuantityOrder * -1, Cur_InOutLine.M_PRODUCT_UOM_ID
|
carlos@0
|
483 |
)
|
carlos@0
|
484 |
;
|
carlos@0
|
485 |
END LOOP;
|
carlos@0
|
486 |
-- Close Order
|
carlos@0
|
487 |
v_ResultStr:='CloseInOut';
|
carlos@0
|
488 |
UPDATE M_INOUT
|
carlos@0
|
489 |
SET Description=COALESCE(TO_CHAR(Description), '') || ' (*R*=' || v_RDocumentNo || ')',
|
carlos@0
|
490 |
Processed='Y',
|
carlos@0
|
491 |
DocStatus='RE', -- it IS reversed
|
carlos@0
|
492 |
DocAction='--',
|
carlos@0
|
493 |
Updated=now(),
|
carlos@0
|
494 |
UpdatedBy=v_User
|
carlos@0
|
495 |
WHERE M_INOUT.M_INOUT_ID=Cur_InOut.M_INOUT_ID;
|
carlos@0
|
496 |
v_ResultStr:='LogEntry';
|
carlos@0
|
497 |
IF(p_PInstance_ID IS NOT NULL) THEN
|
carlos@0
|
498 |
INSERT
|
carlos@0
|
499 |
INTO AD_PINSTANCE_LOG
|
carlos@0
|
500 |
(
|
carlos@0
|
501 |
AD_PInstance_ID, Log_ID,
|
carlos@0
|
502 |
P_ID, P_Msg
|
carlos@0
|
503 |
)
|
carlos@0
|
504 |
VALUES
|
carlos@0
|
505 |
(
|
carlos@0
|
506 |
p_PInstance_ID, Cur_InOut.M_InOut_ID,
|
carlos@0
|
507 |
Cur_InOut.M_InOut_ID, Cur_InOut.DocAction || ': ' || Cur_InOut.DocumentNo
|
carlos@0
|
508 |
)
|
carlos@0
|
509 |
;
|
carlos@0
|
510 |
END IF;
|
carlos@0
|
511 |
-- Post Reversal
|
carlos@0
|
512 |
v_ResultStr:='PostReversal';
|
antonio@735
|
513 |
M_INOUT_POST(NULL, v_RInOut_ID) ;
|
carlos@0
|
514 |
-- Indicate as Reversal Transaction
|
carlos@0
|
515 |
v_ResultStr:='IndicateReversal';
|
carlos@0
|
516 |
UPDATE M_INOUT
|
carlos@0
|
517 |
SET Updated=now(),
|
carlos@0
|
518 |
UpdatedBy=v_User,
|
carlos@0
|
519 |
DocStatus='RE' -- the reversal transaction
|
carlos@0
|
520 |
WHERE M_InOut_ID=v_RInOut_ID;
|
carlos@0
|
521 |
END IF; -- ReverseCorrection
|
carlos@0
|
522 |
END LOOP; -- InOut Header
|
carlos@0
|
523 |
/**
|
carlos@0
|
524 |
* Transaction End
|
carlos@0
|
525 |
*/
|
carlos@0
|
526 |
v_ResultStr:='Fini';
|
carlos@0
|
527 |
END IF; --FINISH_PROCESS
|
gorkaion@239
|
528 |
--<<FINISH_PROCESS>>
|
carlos@0
|
529 |
IF(p_PInstance_ID IS NOT NULL) THEN
|
carlos@0
|
530 |
-- Update AD_PInstance
|
carlos@0
|
531 |
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message) ;
|
carlos@0
|
532 |
AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', v_Result, v_Message) ;
|
carlos@0
|
533 |
ELSE
|
gorkaion@239
|
534 |
DBMS_OUTPUT.PUT_LINE('--<<M_InOut_Post finished>>') ;
|
carlos@0
|
535 |
END IF;
|
carlos@0
|
536 |
RETURN;
|
carlos@0
|
537 |
END; --BODY
|
carlos@0
|
538 |
EXCEPTION
|
carlos@0
|
539 |
WHEN OTHERS THEN
|
carlos@0
|
540 |
v_ResultStr:= '@ERROR=' || SQLERRM;
|
carlos@0
|
541 |
DBMS_OUTPUT.PUT_LINE(v_ResultStr) ;
|
carlos@0
|
542 |
IF(p_PInstance_ID IS NOT NULL) THEN
|
carlos@0
|
543 |
ROLLBACK;
|
carlos@0
|
544 |
AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', 0, v_ResultStr) ;
|
carlos@0
|
545 |
ELSE
|
carlos@0
|
546 |
DECLARE
|
antonio@735
|
547 |
v_Code NUMBER:=SQLCODE;
|
carlos@0
|
548 |
BEGIN
|
carlos@0
|
549 |
INSERT
|
carlos@0
|
550 |
INTO DBA_ERRORLOG
|
carlos@0
|
551 |
(
|
carlos@0
|
552 |
DBA_ErrorLog_ID, Created,
|
carlos@0
|
553 |
Code, Msg,
|
carlos@0
|
554 |
Info
|
carlos@0
|
555 |
)
|
carlos@0
|
556 |
VALUES
|
carlos@0
|
557 |
(
|
carlos@0
|
558 |
DBA_ErrorLog_Seq.NEXTVAL, now(),
|
carlos@0
|
559 |
v_Code, v_ResultStr,
|
carlos@0
|
560 |
'M_InOut_Post'
|
carlos@0
|
561 |
)
|
carlos@0
|
562 |
;
|
carlos@0
|
563 |
END;
|
carlos@0
|
564 |
RAISE;
|
carlos@0
|
565 |
END IF;
|
carlos@0
|
566 |
RETURN;
|
antonio@735
|
567 |
END M_INOUT_POST
|
gorkaion@239
|
568 |
]]></body>
|
adrian@94
|
569 |
</function>
|
adrian@94
|
570 |
</database>
|