Merge pull request #1609 from xtuple/4_5_x
[xtuple] / foundation-database / public / functions / updatestdcost.sql
1 CREATE OR REPLACE FUNCTION updateStdCost(INTEGER, NUMERIC, NUMERIC, TEXT, TEXT) RETURNS BOOLEAN AS $$
2 -- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. 
3 -- See www.xtuple.com/CPAL for the full text of the software license.
4 DECLARE
5     pItemcostid ALIAS FOR $1;
6     pNewcost    ALIAS FOR $2;
7     pOldcost    ALIAS FOR $3;
8     pDocNumber  ALIAS FOR $4;
9     pNotes      ALIAS FOR $5;
10     _itemcostid INTEGER;
11     _r          RECORD;
12     _newcost    NUMERIC;
13     _oldcost    NUMERIC;
14
15 BEGIN
16   IF (pNewcost IS NULL) THEN
17     _newcost := 0;
18   ELSE
19     _newcost := pNewcost;
20   END IF;
21   IF (pOldcost IS NULL) THEN
22     _oldcost := 0;
23   ELSE
24     _oldcost := pOldcost;
25   END IF;
26
27   IF (_newcost > 0) THEN
28     UPDATE itemcost
29     SET itemcost_stdcost=_newcost,
30         itemcost_posted=CURRENT_DATE
31     WHERE (itemcost_id=pItemcostid);
32   END IF;
33
34 --  Distribute to G/L, debit Inventory Asset, credit Inventory Cost Variance
35   FOR _r IN SELECT itemsite_id, (itemsite_qtyonhand + itemsite_nnqoh) AS totalQty,
36                    costcat_invcost_accnt_id, costcat_asset_accnt_id,
37                    itemsite_costmethod
38             FROM itemcost, itemsite, costcat
39             WHERE ( (itemsite_item_id=itemcost_item_id)
40              AND (itemsite_costcat_id=costcat_id)
41              AND (itemsite_costmethod != 'A')
42              AND ((itemsite_qtyonhand + itemsite_nnqoh) <> 0)
43              AND (itemcost_id=pItemcostid) ) LOOP
44 --    IF (_newcost <> _oldcost) THEN
45 --      RAISE NOTICE 'itemcost_id = %, Qty = %, Old Cost = %, New Cost = %', pItemcostid, _r.totalQty, _oldcost, _newcost;
46 --    END IF;
47     PERFORM insertGLTransaction( 'P/D', '', pDocNumber, pNotes,
48                                  _r.costcat_invcost_accnt_id, _r.costcat_asset_accnt_id, _r.itemsite_id,
49                                  ((_newcost - _oldcost) * _r.totalQty),
50                                  CURRENT_DATE );
51 --  Update Itemsite Value if not Average Cost
52     IF (_r.itemsite_costmethod <> 'A') THEN
53 --      RAISE NOTICE 'itemsite_id = %, Qty = %, New Cost = %', _r.itemsite_id, _r.totalQty, _newcost;
54       UPDATE itemsite SET itemsite_value=(_r.totalQty * stdCost(itemsite_item_id))
55       WHERE (itemsite_id=_r.itemsite_id);
56     END IF;
57   END LOOP;
58
59   IF (_newcost = 0) THEN
60     DELETE FROM itemcost
61     WHERE (itemcost_id=pItemcostid);
62
63     RETURN FALSE;
64   END IF;
65
66   IF ( SELECT metric_value
67         FROM metric
68         WHERE ((metric_name = 'EnableAsOfQOH')
69         AND (metric_value = 't'))) THEN
70     IF (pNewcost IS NOT NULL) THEN
71       _newcost := pNewcost;
72     END IF;
73     IF (pOldcost IS NULL) THEN
74       _oldcost := 0;
75     ELSE
76       _oldcost := pOldcost;
77     END IF;
78   --  Distribute to G/L, debit Inventory Asset, credit Inventory Cost Variance
79     PERFORM postValueIntoInvBalance(
80                   itemsite_id,
81                   current_date,
82                   asofinvqty(itemsite_id,current_date),
83                   asofinvnn(itemsite_id,current_date),
84                   _oldcost,
85                   _newcost)
86        FROM itemsite
87        JOIN item ON (itemsite_item_id=item_id)
88        JOIN itemcost ON (itemcost_item_id=item_id)
89       WHERE((itemsite_costmethod = 'S')
90         AND (itemcost_id=pItemcostid));
91   END IF;
92
93   RETURN TRUE;
94
95 END;
96 $$ LANGUAGE 'plpgsql';
97
98
99 CREATE OR REPLACE FUNCTION updateStdCost(INTEGER, TEXT, BOOLEAN, NUMERIC) RETURNS INTEGER AS $$
100 -- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. 
101 -- See www.xtuple.com/CPAL for the full text of the software license.
102 DECLARE
103     pItemid     ALIAS FOR $1;
104     pCostType   ALIAS FOR $2;
105     pLevel      ALIAS FOR $3;
106     pCost       ALIAS FOR $4;
107     _newCost    NUMERIC;
108     _oldCost    NUMERIC := 0;
109     _itemcostid INTEGER;
110     _updateRet  BOOLEAN;
111     _itemNumber TEXT;
112
113 BEGIN
114     IF (pCost IS NULL) THEN
115         _newCost = 0;
116     ELSE
117         _newCost = pCost;
118     END IF;
119
120     SELECT itemcost_id, itemcost_stdCost, item_number
121         INTO _itemcostid, _oldCost, _itemNumber
122     FROM itemcost, costelem, item
123     WHERE ((itemcost_costelem_id=costelem_id)
124       AND  (itemcost_item_id=item_id)
125       AND  (item_id=pItemid)
126       AND  (itemcost_lowlevel=pLevel)
127       AND  (costelem_type=pCosttype));
128 --    RAISE NOTICE 'updateStdCost(%, %, %, %) has itemcost_id % and stdcost %',
129 --                              pItemid, pCostType, plevel, _newCost, _itemcostid, _oldCost;
130
131     IF (NOT FOUND) AND (_newCost > 0) THEN
132         SELECT NEXTVAL('itemcost_itemcost_id_seq') INTO _itemcostid;
133         RAISE NOTICE 'updateStdCost() inserting itemcost_id %', _itemcostid;
134         INSERT INTO itemcost
135             (itemcost_id, itemcost_item_id, itemcost_costelem_id,
136              itemcost_lowlevel, itemcost_stdcost, itemcost_posted,
137              itemcost_actcost, itemcost_updated)
138         SELECT
139               _itemcostid, pItemid, costelem_id,
140               pLevel, _newCost, CURRENT_DATE,
141               0, CURRENT_DATE
142         FROM costelem
143         WHERE (costelem_type=pCosttype);
144     END IF;
145
146     IF (_itemcostid IS NOT NULL) THEN
147         SELECT updateStdCost(_itemcostid, _newCost, _oldCost, 'Post Cost',
148                ('Set Standard Cost - ' || pCosttype || ' for item ' || _itemNumber)) INTO _updateRet;
149         IF (_updateRet) THEN
150             RETURN _itemcostid;
151         END IF;
152     END IF;
153
154     RETURN -1;
155 END;
156 $$ LANGUAGE 'plpgsql';