da84dd280eed5de7572e0c7f60f80809ed90b89c
[xtuple] / foundation-database / public / functions / explodekit.sql
1
2 CREATE OR REPLACE FUNCTION explodeKit(INTEGER, INTEGER, INTEGER, INTEGER, NUMERIC) RETURNS INTEGER AS $$
3 -- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. 
4 -- See www.xtuple.com/CPAL for the full text of the software license.
5 DECLARE
6   pSoheadid ALIAS FOR $1;
7   pLinenumber ALIAS FOR $2;
8   pSubnumber ALIAS FOR $3;
9   pItemsiteid ALIAS FOR $4;
10   pQty ALIAS FOR $5;
11 BEGIN
12   RETURN explodeKit(pSoheadid, pLinenumber, pSubnumber, pItemsiteid, pQty, CURRENT_DATE, NULL);
13 END;
14 $$ LANGUAGE 'plpgsql';
15
16 CREATE OR REPLACE FUNCTION explodeKit(INTEGER, INTEGER, INTEGER, INTEGER, NUMERIC, DATE, DATE) RETURNS INTEGER AS $$
17 -- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. 
18 -- See www.xtuple.com/CPAL for the full text of the software license.
19 DECLARE
20   pSoheadid ALIAS FOR $1;
21   pLinenumber ALIAS FOR $2;
22   pSubnumber ALIAS FOR $3;
23   pItemsiteid ALIAS FOR $4;
24   pQty ALIAS FOR $5;
25   pScheddate ALIAS FOR $6;
26   pPromdate ALIAS FOR $7;
27 BEGIN
28   RETURN explodeKit(pSoheadid, pLinenumber, pSubnumber, pItemsiteid, pQty, CURRENT_DATE, NULL, '');
29 END;
30 $$ LANGUAGE 'plpgsql';
31
32 CREATE OR REPLACE FUNCTION explodeKit(INTEGER, INTEGER, INTEGER, INTEGER, NUMERIC, DATE, DATE, TEXT) RETURNS INTEGER AS $$
33 -- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. 
34 -- See www.xtuple.com/CPAL for the full text of the software license.
35 DECLARE
36   pSoheadid ALIAS FOR $1;
37   pLinenumber ALIAS FOR $2;
38   pSubnumber ALIAS FOR $3;
39   pItemsiteid ALIAS FOR $4;
40   pQty ALIAS FOR $5;
41   pScheddate ALIAS FOR $6;
42   pPromdate ALIAS FOR $7;
43   pMemo ALIAS FOR $8;
44   _subnumber INTEGER := COALESCE(pSubnumber,0);
45   _revid INTEGER;
46   _itemid INTEGER;
47   _warehousid INTEGER;
48   _item RECORD;
49   _type TEXT;
50   _coitemid INTEGER;
51   _count INTEGER;
52   _orderid INTEGER := 0;
53   _itemsrcid INTEGER;
54 BEGIN
55
56   SELECT getActiveRevId('BOM',itemsite_item_id), itemsite_warehous_id, itemsite_item_id
57     INTO _revid, _warehousid, _itemid
58     FROM itemsite
59    WHERE(itemsite_id=pItemsiteid);
60   IF(NOT FOUND) THEN
61     RAISE EXCEPTION 'No Item Site for the specified line was found.';
62   END IF;
63
64   FOR _item IN
65   SELECT bomitem_id, 
66          itemsite_id,
67          itemsite_warehous_id,
68          COALESCE((itemsite_active AND item_active), false) AS active,
69          COALESCE((itemsite_sold AND item_sold), false) AS sold,
70          item_id,
71          item_type,
72          item_price_uom_id,
73          itemsite_createsopr,itemsite_createwo,itemsite_createsopo, itemsite_dropship,
74          bomitem_uom_id,
75          itemuomtouomratio(item_id, bomitem_uom_id, item_inv_uom_id) AS invuomratio,
76          roundQty(itemuomfractionalbyuom(bomitem_item_id, bomitem_uom_id),(bomitem_qtyfxd + bomitem_qtyper * pQty) * (1 + bomitem_scrap)) AS qty
77     FROM bomitem JOIN item ON (item_id=bomitem_item_id)
78                   LEFT OUTER JOIN itemsite ON ((itemsite_item_id=item_id) AND (itemsite_warehous_id=_warehousid))
79    WHERE((bomitem_parent_item_id=_itemid)
80      AND (bomitem_rev_id=_revid)
81      AND (CURRENT_DATE BETWEEN bomitem_effective AND (bomitem_expires - 1)))
82    ORDER BY bomitem_seqnumber LOOP
83     IF (NOT _item.active) THEN
84       RAISE EXCEPTION 'One or more of the components for the kit is inactive for the selected item site.';
85     ELSIF (NOT _item.sold) THEN
86       RAISE EXCEPTION 'One or more of the components for the kit is not sold for the selected item site.';
87     ELSIF (_item.item_type='F') THEN
88       SELECT explodeKit(pSoheadid, pLinenumber, _subnumber, _item.itemsite_id, _item.qty)
89         INTO _subnumber;
90     ELSE
91       IF (_item.itemsite_createsopr) THEN
92         _type := 'R';
93       ELSIF (_item.itemsite_createsopo) THEN
94         _type := 'P';
95       ELSIF (_item.itemsite_createwo) THEN
96         _type := 'W';
97       ELSE
98         _type := NULL;
99       END IF;
100       _subnumber := _subnumber + 1;
101       _coitemid = nextval('coitem_coitem_id_seq');
102       raise notice 'coitem id: %',_coitemid;
103       INSERT INTO coitem
104             (coitem_id, coitem_cohead_id,
105              coitem_linenumber, coitem_subnumber,
106              coitem_itemsite_id, coitem_status,
107              coitem_scheddate, coitem_promdate,
108              coitem_qtyord, coitem_qty_uom_id, coitem_qty_invuomratio,
109              coitem_qtyshipped, coitem_qtyreturned,
110              coitem_unitcost, coitem_custprice,
111              coitem_price, coitem_price_uom_id, coitem_price_invuomratio,
112              coitem_order_type, coitem_order_id,
113              coitem_custpn, coitem_memo,
114              coitem_prcost)
115       VALUES (_coitemid, pSoheadid,
116              pLinenumber, _subnumber,
117              _item.itemsite_id, 'O',
118              pScheddate, pPromdate,
119              _item.qty, _item.bomitem_uom_id, _item.invuomratio,
120              0, 0,
121              stdCost(_item.item_id), 0,
122              0, _item.item_price_uom_id, 1,
123              _type, -1,
124              '', pMemo,
125              0);
126
127       IF (_item.itemsite_createsopr) THEN
128         SELECT createPR(cohead_number::INTEGER, 'S', _coitemid) INTO _orderid
129         FROM cohead
130         WHERE (cohead_id=pSoheadid);
131         IF (_orderid > 0) THEN
132           UPDATE coitem SET coitem_order_id=_orderid
133           WHERE (coitem_id=_coitemid);
134         ELSE
135           RAISE EXCEPTION 'Could not explode kit. CreatePR failed, result=%', _orderid; 
136         END IF;
137       END IF;
138
139       IF (_item.itemsite_createsopo) THEN
140         SELECT itemsrc_id INTO _itemsrcid
141         FROM itemsrc
142         WHERE ((itemsrc_item_id=_item.item_id)
143         AND (itemsrc_default));
144
145         GET DIAGNOSTICS _count = ROW_COUNT;
146         IF (_count > 0) THEN
147           PERFORM createPurchaseToSale(_coitemid, _itemsrcid, _item.itemsite_dropship);
148         ELSE
149           RAISE WARNING 'One or more Kit items are flagged as purchase-to-order for this site, but no default item source is defined.';
150         END IF;
151       END IF;
152      
153     END IF;
154   END LOOP;
155
156   RETURN _subnumber;
157 END;
158 $$ LANGUAGE 'plpgsql';
159