DBA Data[Home] [Help]

PACKAGE BODY: APPS.CST_TPRICE_PVT

Source


1 PACKAGE BODY CST_TPRICE_PVT AS
2 /* $Header: CSTVTPAB.pls 120.5 2006/06/15 11:49:33 umoogala noship $ */
3 
4 G_PKG_NAME CONSTANT VARCHAR2(30) := 'CST_TPRICE_PVT';
5 G_DEBUG    CONSTANT VARCHAR(1) := NVL(FND_PROFILE.value('MRP_DEBUG'), 'N');
6 
7 procedure Adjust_Acct(
8   P_API_VERSION         IN      NUMBER,
9   P_INIT_MSG_LIST       IN      VARCHAR2,
10   P_COMMIT              IN      VARCHAR2,
11   P_VALIDATION_LEVEL    IN      NUMBER,
12   P_TPRICE_OPTION       IN      NUMBER,
13   P_TXF_PRICE           IN      NUMBER,
14   P_TXN_ID              IN      NUMBER,
15   P_COST_GRP_ID         IN      NUMBER,
16   P_TXF_COST_GRP        IN      NUMBER,
17   P_ITEM_ID             IN      NUMBER,
18   P_TXN_DATE            IN      DATE,
19   P_QTY                 IN      NUMBER,
20   P_SUBINV              IN      VARCHAR2,
21   P_TXF_SUBINV          IN      VARCHAR2,
22   P_TXN_ORG_ID          IN      NUMBER,
23   P_TXF_ORG_ID          IN      NUMBER,
24   P_TXF_TXN_ID          IN      NUMBER,
25   P_TXF_COST            IN      NUMBER,
26   P_TXN_ACT_ID          IN      NUMBER,
27   P_TXN_SRC_ID          IN      NUMBER,
28   P_SRC_TYPE_ID         IN      NUMBER,
29   P_FOB_POINT           IN      NUMBER,
30   P_USER_ID             IN      NUMBER,
31   P_LOGIN_ID            IN      NUMBER,
32   P_REQ_ID              IN      NUMBER,
33   P_PRG_APPL_ID         IN      NUMBER,
34   P_PRG_ID              IN      NUMBER,
35   X_RETURN_STATUS       OUT NOCOPY VARCHAR2,
36   X_MSG_COUNT           OUT NOCOPY NUMBER,
37   X_MSG_DATA            OUT NOCOPY VARCHAR2,
38   X_ERROR_NUM           OUT NOCOPY NUMBER,
39   X_ERROR_CODE          OUT NOCOPY VARCHAR2,
40   X_ERROR_MESSAGE       OUT NOCOPY VARCHAR2
41 ) IS
42   l_api_name    CONSTANT VARCHAR2(30) := 'Adjust_Acct';
43   l_api_version CONSTANT NUMBER       := 1.0;
44 
45   l_from_org    NUMBER;
46   l_to_org      NUMBER;
47   l_std_from_org NUMBER;
48   l_std_to_org  NUMBER;
49   l_from_ou     NUMBER;
50   l_to_ou       NUMBER;
51   l_from_cg     NUMBER;
52   l_to_cg       NUMBER;
53   l_from_layer  NUMBER;
54   l_to_layer    NUMBER;
55   l_from_subinv MTL_SECONDARY_INVENTORIES.SECONDARY_INVENTORY_NAME%TYPE;
56   l_to_subinv   MTL_SECONDARY_INVENTORIES.SECONDARY_INVENTORY_NAME%TYPE;
57   l_snd_uom     MTL_UNITS_OF_MEASURE.UOM_CODE%TYPE;
58   l_rcv_uom     MTL_UNITS_OF_MEASURE.UOM_CODE%TYPE;
59   l_snd_qty     NUMBER;
60   l_rcv_qty     NUMBER;
61   l_snd_sob_id  NUMBER;
62   l_snd_curr    GL_SETS_OF_BOOKS.CURRENCY_CODE%TYPE;
63   l_rcv_sob_id  NUMBER;
64   l_rcv_coa_id  NUMBER;
65   l_rcv_curr    GL_SETS_OF_BOOKS.CURRENCY_CODE%TYPE;
66   l_curr_type   GL_DAILY_CONVERSION_TYPES.CONVERSION_TYPE%TYPE;
67   l_conv_rate   NUMBER;
68   l_conv_date   DATE;
69   l_acct        NUMBER;
70   l_om_ccid     NUMBER;
71   l_inv_ccid    NUMBER;
72   l_rcv_count   NUMBER;
73   l_pay_count   NUMBER;
74   l_rcv_sum     NUMBER;
75   l_pay_sum     NUMBER;
76   l_line_id     NUMBER;
77   l_header_id   NUMBER;
78   l_cust_id     NUMBER;
79   l_order_type  NUMBER;
80   l_ship_num    MTL_MATERIAL_TRANSACTIONS.SHIPMENT_NUMBER%TYPE;
81   l_req_line    NUMBER;
82   l_prf         NUMBER;
83   l_cost_element NUMBER;
84   l_elem_cost   NUMBER;
85   l_err_num     NUMBER;
86   l_err_code    MTL_MATERIAL_TRANSACTIONS.ERROR_CODE%TYPE;
87   l_err_msg     MTL_MATERIAL_TRANSACTIONS.ERROR_EXPLANATION%TYPE;
88   l_stmt_num    NUMBER;
89   l_concat_id   VARCHAR2(2000);
90   l_concat_seg  VARCHAR2(2000);
91   l_concat_desc VARCHAR2(2000);
92   l_msg_count   NUMBER;
93   l_msg_data    VARCHAR2(2000);
94   l_acct_done   NUMBER;
95   l_txf_txn_id  NUMBER;
96   l_from_exp_item  NUMBER;
97   process_error EXCEPTION;
98   prf_inv_acct_err EXCEPTION;
99   inv_exp_acct_err EXCEPTION;
100 
101   l_pd_txfr_ind  NUMBER; -- OPM INVCONV process/discrete xfer indicator
102   l_io_invoicing NUMBER := to_number(fnd_profile.value('INV_INTERCOMPANY_INVOICE_INTERNAL_ORDER'));
103 
104 BEGIN
105 
106   -- Standard start of API savepoint
107   SAVEPOINT Adjust_Acct_PVT;
108 
109   -- Standard call to check for call compatibility
110   l_stmt_num := 10;
111   if NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) then
112      raise FND_API.g_exc_unexpected_error;
113   end if;
114 
115   -- Initialize message list if p_init_msg_list is set to TRUE
116   l_stmt_num := 20;
117   if FND_API.to_Boolean(p_init_msg_list) then
118      FND_MSG_PUB.initialize;
119   end if;
120 
121   -- Initialize API return status and local variables
122   l_stmt_num := 30;
123   x_return_status := FND_API.g_ret_sts_success;
124   l_err_num := 0;
125   l_err_code := '';
126   l_err_msg := '';
127 
128   /* OPM INVCONV sschinch check if this is a process discrete transfer */
129   SELECT MOD(SUM(DECODE(MP.process_enabled_flag,'Y',1,2)), 2)
130     INTO l_pd_txfr_ind
131     FROM mtl_parameters mp
132    WHERE mp.organization_id = p_txn_org_id
133       OR mp.organization_id = p_txf_org_id;
134 
135 
136   if (G_DEBUG = 'Y') then
137      FND_FILE.put_line(FND_FILE.LOG, 'In procedure CST_TPRICE_PVT.Adjust_Acct');
138      FND_FILE.put_line(FND_FILE.LOG, 'p_tprice_option = ' || p_tprice_option);
139      FND_FILE.put_line(FND_FILE.LOG, 'p_txf_price = ' || p_txf_price);
140      FND_FILE.put_line(FND_FILE.LOG, 'l_pd_txfr_ind = ' || l_pd_txfr_ind);
141      FND_FILE.put_line(FND_FILE.LOG, 'p_txn_act_id = ' || p_txn_act_id);
142      FND_FILE.put_line(FND_FILE.LOG, 'Internal Order invoicing = ' || l_io_invoicing);
143   end if;
144 
145   if (p_txn_act_id in (21, 22)) then
146      l_from_org := p_txn_org_id;
147      l_to_org := p_txf_org_id;
148      l_from_cg := p_cost_grp_id;
149      l_to_cg := p_txf_cost_grp;
150      l_from_subinv := p_subinv;
151      l_to_subinv := p_txf_subinv;
152   elsif (p_txn_act_id in (12, 15)) then
153      l_from_org := p_txf_org_id;
154      l_to_org := p_txn_org_id;
155      l_from_cg := p_txf_cost_grp;
156      l_to_cg := p_cost_grp_id;
157      l_from_subinv := p_txf_subinv;
158      l_to_subinv := p_subinv;
159   end if;
160 
161   l_stmt_num := 40;
162 
163   if (l_pd_txfr_ind = 0) OR
164      (l_pd_txfr_ind = 1 AND (p_txn_act_id = 21 or p_txn_act_id = 22))
165   then
166       SELECT count(*), sum(base_transaction_value)
167       INTO l_rcv_count, l_rcv_sum
168       FROM mtl_transaction_accounts
169       WHERE transaction_id = p_txn_id
170       AND organization_id = l_from_org
171       AND accounting_line_type = 10;
172   end if;
173 
174   l_stmt_num := 50;
175 
176   if (l_pd_txfr_ind = 0) OR
177      (l_pd_txfr_ind = 1 AND (p_txn_act_id = 15 or p_txn_act_id = 12))
178   then
179       SELECT count(*), sum(base_transaction_value)
180       INTO l_pay_count, l_pay_sum
181       FROM mtl_transaction_accounts
182       WHERE transaction_id = p_txn_id
183       AND organization_id = l_to_org
184       AND accounting_line_type = 9;
185   end if;
186 
187   if (G_DEBUG = 'Y') then
188      FND_FILE.put_line(FND_FILE.LOG, 'l_rcv_sum = ' || l_rcv_sum);
189      FND_FILE.put_line(FND_FILE.LOG, 'l_pay_sum = ' || l_pay_sum);
190   end if;
191 
192 
193   /* OPM INVCONV: process/discrete xfers
194    * Moved the following stmt here from inside the IF block
195    */
196   l_stmt_num := 70;
197 
198   SELECT to_number(org_information3)
199   INTO   l_from_ou
200   FROM   hr_organization_information
201   WHERE  org_information_context = 'Accounting Information'
202   AND    organization_id = l_from_org;
203 
204   l_stmt_num := 75;
205   SELECT to_number(org_information3)
206   INTO   l_to_ou
207   FROM   hr_organization_information
208   WHERE  org_information_context = 'Accounting Information'
209   AND    organization_id = l_to_org;
210 
211 
212   if (G_DEBUG = 'Y') then
213     FND_FILE.put_line(FND_FILE.LOG,
214 	'p_src_type_id/l_from_ou/l_to_ou/l_io_invoicing/p_txn_act_id/l_rcv_count: ' ||
215 	p_src_type_id ||'/'|| l_from_ou ||'/'|| l_to_ou ||'/'|| l_io_invoicing ||'/'||
216 	p_txn_act_id ||'/'|| l_rcv_count );
217   end if;
218 
219   -- The adjustment should be done after the accounting for both sending and
220   -- receiving orgs is done, i.e., the interorg receivable and payable exist
221   if ((l_pd_txfr_ind = 0 and l_rcv_count >= 1 and l_pay_count >= 1 and p_tprice_option <> 0)
222       OR
223       ((l_pd_txfr_ind  =  1) and
224        (p_src_type_id  in (7, 8)) and
225        (l_from_ou      <> l_to_ou) and
226        (l_io_invoicing =  1) and
227        ((p_txn_act_id  in (21, 22) and l_rcv_count >= 1) OR
228         (p_txn_act_id  in (12, 15) and l_pay_count >= 1)))
229      )
230   then
231 
232      l_stmt_num := 60;
233 
234      l_std_from_org := CSTPAVCP.standard_cost_org(l_from_org);
235      l_std_to_org := CSTPAVCP.standard_cost_org(l_to_org);
236 
237      -- Get the currency information for sending and receiving orgs
238      l_stmt_num := 80;
239 
240      CSTPAVCP.get_snd_rcv_rate(p_txn_id, l_from_org, l_to_org,
241                 l_snd_sob_id, l_snd_curr, l_rcv_sob_id, l_rcv_curr,
242                 l_curr_type, l_conv_rate, l_conv_date,
243                 l_err_num, l_err_code, l_err_msg);
244 
245      if (l_err_num<>0) then
246         raise process_error;
247      end if;
248 
249      if (l_conv_date is null) then
250         l_conv_date := p_txn_date;
251      end if;
252 
253      l_stmt_num := 90;
254 
255      SELECT chart_of_accounts_id
256      INTO l_rcv_coa_id
257      FROM gl_sets_of_books
258      WHERE set_of_books_id = l_rcv_sob_id;
259 
260      if (G_DEBUG = 'Y') then
261         FND_FILE.put_line(FND_FILE.LOG, 'l_snd_curr = ' || l_snd_curr);
262         FND_FILE.put_line(FND_FILE.LOG, 'l_rcv_curr = ' || l_rcv_curr);
263         FND_FILE.put_line(FND_FILE.LOG, 'l_conv_rate = ' || l_conv_rate);
264         FND_FILE.put_line(FND_FILE.LOG, 'l_rcv_coa_id = ' || l_rcv_coa_id);
265      end if;
266 
267      -- Get the primary unit of measure for sending and receiving orgs
268      l_stmt_num := 100;
269 
270      CSTPAVCP.get_snd_rcv_uom(p_item_id, l_from_org, l_to_org, l_snd_uom, l_rcv_uom,
271                   l_err_num, l_err_code, l_err_msg);
272 
273      -- Get the sending and receiving primary quantity
274      l_stmt_num := 110;
275 
276      if (l_from_org = p_txn_org_id) then
277         l_snd_qty := -1 * abs(p_qty); -- doing this since for action_id = 22, qty is +ve in MMT
278         l_rcv_qty := inv_convert.inv_um_convert
279                                 (p_item_id, NULL, -1 * l_snd_qty,
280                                  l_snd_uom, l_rcv_uom, NULL, NULL);
281      else
282         l_rcv_qty := p_qty;
283         l_snd_qty := inv_convert.inv_um_convert
284                                 (p_item_id, NULL, -1 * l_rcv_qty,
285                                  l_rcv_uom, l_snd_uom, NULL, NULL);
286      end if;
287 
288      if (l_err_num <> 0) then
289         raise process_error;
290      end if;
291 
292      if (G_DEBUG = 'Y') then
293         FND_FILE.put_line(FND_FILE.LOG, 'l_snd_uom = ' || l_snd_uom);
294         FND_FILE.put_line(FND_FILE.LOG, 'l_rcv_uom = ' || l_rcv_uom);
295         FND_FILE.put_line(FND_FILE.LOG, 'l_snd_qty = ' || l_snd_qty);
296         FND_FILE.put_line(FND_FILE.LOG, 'l_rcv_qty = ' || l_rcv_qty);
297      end if;
298 
299      -- Get the internal order information from the shipment transaction
300      -- OPM INVCONV: added action id 15
301      --
302      if (p_txn_act_id in (15, 21)) then
303         l_stmt_num := 120;
304 
305         SELECT MMT.trx_source_line_id, OEH.header_id, OEH.sold_to_org_id, OEH.order_type_id
306         INTO l_line_id, l_header_id, l_cust_id, l_order_type
307         FROM mtl_material_transactions MMT, oe_order_headers_all OEH, oe_order_lines_all OEL
308         WHERE MMT.transaction_id = p_txn_id
309         AND   OEL.line_id = MMT.trx_source_line_id
310         AND   OEL.header_id = OEH.header_id;
311      --
312      -- OPM INVCONV: added action id 15
313      --
314      elsif (p_txn_act_id in (12, 22)) then
315         l_stmt_num := 130;
316 
317         SELECT MMT.shipment_number, RT.requisition_line_id,
318 	       -- Following change has been made since for action id 22, transfer_transaction_id
319 	       -- points to receiving txn, not the shipping txn, because it got created after
320 	       -- goods are received.
321 	       decode(l_pd_txfr_ind, 1, 0, nvl(MMT.transfer_transaction_id, 0))
322         INTO l_ship_num, l_req_line, l_txf_txn_id
323         FROM mtl_material_transactions MMT, rcv_transactions RT
324         WHERE MMT.transaction_id = p_txn_id
325         AND   RT.transaction_id = MMT.rcv_transaction_id;
326 
327         /* Bug 3482782: for R11i.10, we can find the sending txn based on the txf_txn_id;
328            for R11i.9, we add 'ROWNUM = 1' to handle the situation where one delivery for
329            an internal sales order line has multiple deliver details for the same item. */
330         if (l_txf_txn_id <> 0) then
331            l_stmt_num := 135;
332 
333            SELECT MMT.trx_source_line_id, OEH.header_id, OEH.sold_to_org_id, OEH.order_type_id
334            INTO l_line_id, l_header_id, l_cust_id, l_order_type
335            FROM mtl_material_transactions MMT, oe_order_headers_all OEH, oe_order_lines_all OEL
336            WHERE MMT.transaction_id = l_txf_txn_id
337            AND   MMT.trx_source_line_id = OEL.line_id
338            AND   OEL.header_id = OEH.header_id;
339         else
340            l_stmt_num := 140;
341 
342            SELECT MMT.trx_source_line_id, OEH.header_id, OEH.sold_to_org_id, OEH.order_type_id
343            INTO l_line_id, l_header_id, l_cust_id, l_order_type
344            FROM mtl_material_transactions MMT, oe_order_headers_all OEH, oe_order_lines_all OEL
345            WHERE MMT.transaction_action_id = 21
346            AND   MMT.transaction_source_type_id = 8
347            AND   MMT.organization_id = l_from_org
348            AND   MMT.inventory_item_id = p_item_id
349            AND   MMT.shipment_number = l_ship_num
350            AND   MMT.trx_source_line_id = OEL.line_id
351            AND   OEL.source_document_line_id = l_req_line
352            AND   OEL.header_id = OEH.header_id
353            AND   ROWNUM = 1;
354         end if;
355      end if;
356 
357      if (G_DEBUG = 'Y') then
358         FND_FILE.put_line(FND_FILE.LOG, 'l_line_id = ' || l_line_id);
359         FND_FILE.put_line(FND_FILE.LOG, 'l_header_id = ' || l_header_id);
360         FND_FILE.put_line(FND_FILE.LOG, 'l_cust_id = ' || l_cust_id);
361         FND_FILE.put_line(FND_FILE.LOG, 'l_order_type = ' || l_order_type);
362      end if;
363 
364      -- Get the COGS account for the sending org from OE workflow, if not succeeded,
365      -- default it to the item COGS
366      l_stmt_num := 150;
367 
368      /* Commenting out the set_org_context API and using an equivalent another as the former would
369         be obsoleted with R12 as part of MOAC Uptake */
370 
371      /*  FND_CLIENT_INFO.set_org_context(l_from_ou); */
372 
373      /* OPM INVCONV: Process/Discrete xfer
374       * Get COGS only for logical intransit shipment.
375       */
376      if (l_pd_txfr_ind = 0) or
377         (l_pd_txfr_ind = 1 and p_txn_act_id in (21, 22))
378      then
379        mo_global.set_policy_context('S',l_from_ou);
380 
381        if (OE_FLEX_COGS_PUB.start_process(1.0, l_line_id, l_om_ccid, l_concat_seg, l_concat_id,
382                             l_concat_desc, l_msg_count, l_msg_data) <> FND_API.g_ret_sts_success) then
383           l_stmt_num := 160;
384 
385           SELECT nvl(MSI.cost_of_sales_account, MP.cost_of_sales_account)
386           INTO l_om_ccid
387           FROM mtl_system_items MSI, mtl_parameters MP
388           WHERE MSI.organization_id = l_from_org
389           AND   MSI.inventory_item_id = p_item_id
390           AND   MP.organization_id = MSI.organization_id;
391        end if;
392 
393        if (G_DEBUG = 'Y') then
394           FND_FILE.put_line(FND_FILE.LOG, 'l_om_ccid = ' || l_om_ccid);
395        end if;
396 
397      end if;
398 
399      /* OPM INVCONV: Process/Discrete xfer
400       * Get IC Expense account only for logical intransit receipt.
401       */
402      if (l_pd_txfr_ind = 0) or
406        -- Get the intercompany expense account from INV workflow
403         (l_pd_txfr_ind = 1 and p_txn_act_id in (12, 15))
404      then
405 
407        l_stmt_num := 170;
408 
409        if NOT
410           INV_WORKFLOW.call_generate_cogs(l_rcv_coa_id, l_cust_id, p_item_id, l_header_id, l_line_id,
411                        l_order_type, l_to_ou, l_inv_ccid, l_concat_seg, l_msg_data, l_to_org)
412        then
413           raise inv_exp_acct_err;
414        end if;
415 
416        if (G_DEBUG = 'Y') then
417           FND_FILE.put_line(FND_FILE.LOG, 'l_inv_ccid = ' || l_inv_ccid);
418        end if;
419 
420      end if;
421 
422      /* PAC Enhancements for R12: Stamp the COGS and Intercompany accrual accounts in MMT */
423      l_stmt_num := 175;
424 
425      UPDATE mtl_material_transactions
426      SET distribution_account_id = l_om_ccid,
427          expense_account_id = l_inv_ccid
428      WHERE transaction_id = p_txn_id;
429 
430 
431      -- First adjustment: delete interorg receivable and payable.  They are not needed as the
432      -- intercompany receivable and payable will be generated from intercompany invoice processors
433      if (G_DEBUG = 'Y') then
434         FND_FILE.put_line(FND_FILE.LOG, 'Start first adjustment');
435      end if;
436 
437      l_stmt_num := 180;
438 
439      /*
440       * OPM INVCONV: Process/Discrete xfer
441       * -- Delete InterOrg Profit Account (LineType 34) also.
442       */
443 
444      DELETE FROM mtl_transaction_accounts
445      WHERE transaction_id = p_txn_id
446      AND accounting_line_type in (9,10,34);
447 
448      -- Second adjustment: debit elemental COGS for the sending org
449      if (G_DEBUG = 'Y') then
450         FND_FILE.put_line(FND_FILE.LOG, 'Start second adjustment');
451      end if;
452 
453      l_stmt_num := 185;
454 
455      SELECT decode(inventory_asset_flag, 'Y', 0, 1)
456      INTO l_from_exp_item
457      FROM mtl_system_items_b
458      WHERE organization_id = l_from_org
459      AND inventory_item_id = p_item_id;
460 
461      /* Bug 3551024: For an expense item in the sending org, no COGS accounting */
462      /* OPM INVCONV: Process/Discrete Xfer
463       * COGS only for Logical Intransit Shipment Txn
464       */
465      if ((l_from_exp_item <> 1) and
466          ((l_pd_txfr_ind = 0) or (l_pd_txfr_ind = 1 and p_txn_act_id in (21, 22)))
467 	)
468      then
469 
470      l_acct_done := 0;
471 
472      FOR l_cost_element IN 1..5 loop
473          l_elem_cost := NULL;
474 
475          -- If the sending org is standard costing, get costs from CIC, otherwise from MCACD
476          if (l_std_from_org <> 0) then
477             l_stmt_num := 190;
478 
479             /* Bug 3239084: use cst_item_cost_details from the costing org to support cost sharing */
480             SELECT sum(item_cost)
481             INTO l_elem_cost
482             FROM cst_item_cost_details
483             WHERE inventory_item_id = p_item_id
484             AND   cost_element_id = l_cost_element
485             AND   cost_type_id = 1
486             AND   organization_id =
487                   (select cost_organization_id
488                    from mtl_parameters
489                    where organization_id = l_from_org);
490          else
491             l_stmt_num := 200;
492 
493             SELECT layer_id
494             INTO l_from_layer
495             FROM cst_quantity_layers
496             WHERE inventory_item_id = p_item_id
497             AND organization_id = l_from_org
498             AND cost_group_id = l_from_cg;
499 
500             l_stmt_num := 210;
501 
502             SELECT sum(actual_cost)
503             INTO l_elem_cost
504             FROM mtl_cst_actual_cost_details
505             WHERE transaction_id = p_txn_id
506             AND organization_id = l_from_org
507             AND cost_element_id = l_cost_element
508             AND layer_id = l_from_layer;
509          end if;
510 
511          l_stmt_num := 220;
512 
513          if (l_elem_cost is not NULL) then
514             l_acct_done := 1;
515 
516             if (l_std_from_org <> 0) then    -- To see if there is COGS account from Hook
517                l_acct := CSTPSCHK.std_get_account_id(l_from_org, p_txn_id, -1*sign(l_snd_qty), 2,
518                                   l_cost_element, null, l_from_subinv, l_from_cg,
519                                   0, 1, l_err_num, l_err_code, l_err_msg);
520             else
521                l_acct := CSTPACHK.get_account_id(l_from_org, p_txn_id, -1*sign(l_snd_qty), 2,
522                                   l_cost_element, null, l_from_subinv,
523                                   0, 1, l_err_num, l_err_code, l_err_msg);
524             end if;
525 
526             if (l_err_num <> 0) then
527                raise process_error;
528             end if;
529 
530             if (l_acct = -1) then
531                l_acct := l_om_ccid;
532             end if;
533 
534             l_stmt_num := 230;
535 
536             CSTPACDP.insert_account(l_from_org, p_txn_id, p_item_id, -1*l_elem_cost*l_snd_qty,
537                            -1*l_snd_qty, l_acct, l_snd_sob_id, 2, l_cost_element, NULL, p_txn_date,
538                            p_txn_src_id, p_src_type_id, l_snd_curr, NULL, NULL,
539                            NULL, NULL, 1, p_user_id, p_login_id, p_req_id,
540                            p_prg_appl_id, p_prg_id, l_err_num, l_err_code, l_err_msg);
541 
545          end if;
542             if (l_err_num <> 0) then
543                raise process_error;
544             end if;
546      end loop;
547 
548      -- If no cost is defined, create zero debit entry for COGS
549      if (l_acct_done = 0) then
550         CSTPACDP.insert_account(l_from_org, p_txn_id, p_item_id, 0,
551                        -1*l_snd_qty, l_om_ccid, l_snd_sob_id, 2, 1, NULL, p_txn_date,
552                        p_txn_src_id, p_src_type_id, l_snd_curr, NULL, NULL,
553                        NULL, NULL, 1, p_user_id, p_login_id, p_req_id,
554                        p_prg_appl_id, p_prg_id, l_err_num, l_err_code, l_err_msg);
555      end if;
556 
557      end if; -- if (l_from_exp_item <> 1)
558 
559      -- Third adjustment: credit intercompany expense for the receiving org
560      if (G_DEBUG = 'Y') then
561         FND_FILE.put_line(FND_FILE.LOG, 'Start third adjustment');
562      end if;
563 
564      /* OPM INVCONV: Process/Discrete Xfer
565       * IC Expense only for Logical Intransit Receipt Txn
566       */
567      if ((l_pd_txfr_ind = 0) or (l_pd_txfr_ind = 1 and p_txn_act_id in (12, 15)))
568      then
569 
570        l_stmt_num := 240;
571 
572        if (l_std_to_org <> 0) then    -- To see if there is intercompany expense account from Hook
573           l_acct := CSTPSCHK.std_get_account_id(l_to_org, p_txn_id, -1*sign(p_txf_price), 2,
574                              null, null, l_to_subinv, l_to_cg,
575                              0, 2, l_err_num, l_err_code, l_err_msg);
576        else
577           l_acct := CSTPACHK.get_account_id(l_to_org, p_txn_id, -1*sign(p_txf_price), 2,
578                              null, null, l_to_subinv,
579                              0, 2, l_err_num, l_err_code, l_err_msg);
580        end if;
581 
582        if (l_err_num <> 0) then
583           raise process_error;
584        end if;
585 
586        if (l_acct = -1) then
587           l_acct := l_inv_ccid;
588        end if;
589 
590        l_stmt_num := 250;
591 
592        CSTPACDP.insert_account(l_to_org, p_txn_id, p_item_id, -1*p_txf_price*l_rcv_qty,
593                              -1*l_rcv_qty, l_acct, l_rcv_sob_id, 2, NULL, NULL, p_txn_date,
594                              p_txn_src_id, p_src_type_id, l_rcv_curr, l_snd_curr, l_conv_date,
595                              l_conv_rate, l_curr_type, 1, p_user_id, p_login_id, p_req_id,
596                              p_prg_appl_id, p_prg_id, l_err_num, l_err_code, l_err_msg);
597 
598        if (l_err_num <> 0) then
599           raise process_error;
600        end if;
601      end if;
602 
603      -- If the option is not to treat transfer price as incoming cost, need fourth adjustment:
604      -- debit/credit profit in inventory for the receiving org
605      if (p_tprice_option = 1) then
606         if (G_DEBUG = 'Y') then
607            FND_FILE.put_line(FND_FILE.LOG, 'Start fourth adjustment');
608         end if;
609 
610         l_stmt_num := 260;
611 
612         SELECT -1.0*nvl(sum(MTA.base_transaction_value),0)
613         INTO l_prf
614         FROM mtl_transaction_accounts MTA
615         WHERE organization_id = l_to_org
616         AND transaction_id = p_txn_id;
617 
618         if (G_DEBUG = 'Y') then
619            FND_FILE.put_line(FND_FILE.LOG, 'l_prf = ' || l_prf);
620         end if;
621 
622         if (l_prf <> 0) then
623            l_stmt_num := 270;
624 
625            if (l_std_to_org <> 0) then   -- To see if there is profit in inventory account from Hook
626               l_acct := CSTPSCHK.std_get_account_id(l_to_org, p_txn_id, sign(l_prf), 30, null,
627                                  null, l_to_subinv, l_to_cg, 0, 2, l_err_num, l_err_code, l_err_msg);
628            else
629               l_acct := CSTPACHK.get_account_id(l_to_org, p_txn_id, sign(l_prf), 30, null,
630                                  null, l_to_subinv, 0, 2, l_err_num, l_err_code, l_err_msg);
631            end if;
632 
633            if (l_err_num <> 0) then
634               raise process_error;
635            end if;
636 
637            if (l_acct = -1) then
638               l_stmt_num := 280;
639 
640               SELECT profit_in_inv_account
641               INTO l_acct
642               FROM mtl_interorg_parameters
643               WHERE from_organization_id = l_from_org
644               AND to_organization_id = l_to_org;
645 
646               if (l_acct is NULL) then
647                   raise prf_inv_acct_err;
648               end if;
649            end if;
650 
651            l_stmt_num := 290;
652 
653            CSTPACDP.insert_account(l_to_org, p_txn_id, p_item_id, l_prf, l_rcv_qty, l_acct,
654                           l_rcv_sob_id, 30, NULL, NULL, p_txn_date, p_txn_src_id, p_src_type_id,
655                           l_rcv_curr, l_snd_curr, l_conv_date, l_conv_rate, l_curr_type, 1,
656                           p_user_id, p_login_id, p_req_id, p_prg_appl_id, p_prg_id,
657                           l_err_num, l_err_code, l_err_msg);
658 
659            if (l_err_num <> 0) then
660               raise process_error;
661            end if;
662         end if;
663      end if;
664 
665   end if;
666 
667   -- Standard check of p_commit
668   if FND_API.To_Boolean(p_commit) then
669      COMMIT WORK;
670   end if;
671 
672   -- Standard call to get message count and message info
673   FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
674                             p_data  => x_msg_data);
675 
676   if (G_DEBUG = 'Y') then
677      FND_FILE.put_line(FND_FILE.LOG, 'Out of procedure CST_TPRICE_PVT.Adjust_Acct');
678   end if;
679 
680 EXCEPTION
681 
682   when inv_exp_acct_err then
683   rollback to Adjust_Acct_PVT;
684   x_return_status := FND_API.g_ret_sts_error;
685   x_error_num := 9999;
686   x_error_code := 'CST_TPRICE_INV_ACCT_ERROR';
687   FND_MESSAGE.set_name('BOM', 'CST_TPRICE_INV_ACCT_ERROR');
688   x_error_message := FND_MESSAGE.Get;
689   FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
690                             p_data  => x_msg_data);
691 
692   when prf_inv_acct_err then
693   rollback to Adjust_Acct_PVT;
694   x_return_status := FND_API.g_ret_sts_error;
695   x_error_num := 9999;
696   x_error_code := 'CST_NO_PROFIT_INV_ACCT';
697   FND_MESSAGE.set_name('BOM', 'CST_NO_PROFIT_INV_ACCT');
698   x_error_message := FND_MESSAGE.Get;
699   FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
700                             p_data  => x_msg_data);
701 
702   when process_error then
703   rollback to Adjust_Acct_PVT;
704   x_return_status := FND_API.g_ret_sts_error;
705   x_error_num := l_err_num;
706   x_error_code := l_err_code;
707   x_error_message := l_err_msg;
708   FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
709                             p_data  => x_msg_data);
710 
711   when others then
712   rollback to Adjust_Acct_PVT;
713   x_return_status := FND_API.g_ret_sts_error;
714   x_error_num := SQLCODE;
715   x_error_message := 'CST_TPRICE.adjust_acct(' || to_char(l_stmt_num) || ') ' ||
716                      substr(SQLERRM,1,180);
717   FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
718                             p_data  => x_msg_data);
719 
720 END Adjust_Acct;
721 
722 END CST_TPRICE_PVT;