1 -- modified to be 'stable'
3 -- Function: itemprice(integer, integer, integer, numeric, integer, integer, integer, date, date)
5 -- DROP FUNCTION itemprice(integer, integer, integer, numeric, integer, integer, integer, date, date);
7 CREATE OR REPLACE FUNCTION itemprice(integer, integer, integer, numeric, integer, integer, integer, date, date)
13 pShiptoid ALIAS FOR $3;
16 pPriceUOM ALIAS FOR $6;
18 pEffective ALIAS FOR $8;
23 _iteminvpricerat NUMERIC;
28 -- Return the itemPrice in the currency passed in as pCurrid
29 _qty := itemuomtouom(pItemid, pQtyUOM, NULL, pQty);
31 -- If no as of passed, use current date
32 _asof := COALESCE(pAsOf, CURRENT_DATE);
34 -- Get a value here so we do not have to call the function several times
35 SELECT itemuomtouomratio(pItemid, pPriceUOM, NULL) AS ratio
36 INTO _iteminvpricerat;
38 -- First get a sales price if any so we when we find other prices
39 -- we can determine if we want that price or this price.
40 -- Check for a Sale Price
41 SELECT currToCurr(ipshead_curr_id, pCurrid, ipsprice_price, pEffective) INTO _sales
43 SELECT ipsitem_ipshead_id AS ipsprice_ipshead_id,
44 itemuomtouom(ipsitem_item_id, ipsitem_qty_uom_id, NULL, ipsitem_qtybreak) AS ipsprice_qtybreak,
45 (ipsitem_price * itemuomtouomratio(ipsitem_item_id, NULL, ipsitem_price_uom_id)) * _iteminvpricerat AS ipsprice_price,
46 (ipsitem_price_uom_id=COALESCE(pPriceUOM,-1)) AS uommatched
48 WHERE(ipsitem_item_id=pItemid)
50 SELECT ipsprodcat_ipshead_id AS ipsprice_ipshead_id,
51 ipsprodcat_qtybreak AS ipsprice_qtybreak,
52 noneg(CAST((item_listprice - (item_listprice * ipsprodcat_discntprcnt) - ipsprodcat_fixedamtdiscount)
53 AS NUMERIC(16,4))) AS ipsprice_price,
54 (item_price_uom_id=COALESCE(pPriceUOM,-1)) AS uommatched
55 FROM ipsprodcat JOIN item ON (ipsprodcat_prodcat_id=item_prodcat_id)
56 WHERE(item_id=pItemid) ) AS
57 ipsprice, ipshead, sale, custinfo
58 WHERE ( (ipsprice_ipshead_id=ipshead_id)
59 AND (sale_ipshead_id=ipshead_id)
60 AND (_asof BETWEEN sale_startdate AND sale_enddate)
61 AND (ipsprice_qtybreak <= _qty)
62 AND (cust_id=pCustid) )
63 ORDER BY uommatched DESC, ipsprice_qtybreak DESC, ipsprice_price ASC
66 -- Check for a Customer Shipto Price
67 SELECT currToCurr(ipshead_curr_id, pCurrid, ipsprice_price, pEffective) INTO _price
69 SELECT ipsitem_ipshead_id AS ipsprice_ipshead_id,
70 itemuomtouom(ipsitem_item_id, ipsitem_qty_uom_id, NULL, ipsitem_qtybreak) AS ipsprice_qtybreak,
71 (ipsitem_price * itemuomtouomratio(ipsitem_item_id, NULL, ipsitem_price_uom_id)) * _iteminvpricerat AS ipsprice_price,
72 (ipsitem_price_uom_id=COALESCE(pPriceUOM,-1)) AS uommatched
74 WHERE(ipsitem_item_id=pItemid)
76 SELECT ipsprodcat_ipshead_id AS ipsprice_ipshead_id,
77 ipsprodcat_qtybreak AS ipsprice_qtybreak,
78 noneg(CAST((item_listprice - (item_listprice * ipsprodcat_discntprcnt) - ipsprodcat_fixedamtdiscount)
79 AS NUMERIC(16,4))) AS ipsprice_price,
80 (item_price_uom_id=COALESCE(pPriceUOM,-1)) AS uommatched
81 FROM ipsprodcat JOIN item ON (ipsprodcat_prodcat_id=item_prodcat_id)
82 WHERE(item_id=pItemid) ) AS
83 ipsprice, ipshead, ipsass
84 WHERE ( (ipsprice_ipshead_id=ipshead_id)
85 AND (ipsass_ipshead_id=ipshead_id)
86 AND (_asof BETWEEN ipshead_effective AND (ipshead_expires - 1))
87 AND (ipsprice_qtybreak <= _qty)
88 AND (ipsass_shipto_id != -1)
89 AND (ipsass_shipto_id=pShiptoid) )
90 ORDER BY uommatched DESC, ipsprice_qtybreak DESC, ipsprice_price ASC
93 IF (_price IS NOT NULL) THEN
94 IF ((_sales IS NOT NULL) AND (_sales < _price)) THEN
100 -- Check for a Customer Shipto Pattern Price
101 SELECT currToCurr(ipshead_curr_id, pCurrid, ipsprice_price, pEffective) INTO _price
103 SELECT ipsitem_ipshead_id AS ipsprice_ipshead_id,
104 itemuomtouom(ipsitem_item_id, ipsitem_qty_uom_id, NULL, ipsitem_qtybreak) AS ipsprice_qtybreak,
105 (ipsitem_price * itemuomtouomratio(ipsitem_item_id, NULL, ipsitem_price_uom_id)) * _iteminvpricerat AS ipsprice_price,
106 (ipsitem_price_uom_id=COALESCE(pPriceUOM,-1)) AS uommatched
108 WHERE(ipsitem_item_id=pItemid)
110 SELECT ipsprodcat_ipshead_id AS ipsprice_ipshead_id,
111 ipsprodcat_qtybreak AS ipsprice_qtybreak,
112 noneg(CAST((item_listprice - (item_listprice * ipsprodcat_discntprcnt) - ipsprodcat_fixedamtdiscount)
113 AS NUMERIC(16,4))) AS ipsprice_price,
114 (item_price_uom_id=COALESCE(pPriceUOM,-1)) AS uommatched
115 FROM ipsprodcat JOIN item ON (ipsprodcat_prodcat_id=item_prodcat_id)
116 WHERE(item_id=pItemid) ) AS
117 ipsprice, ipshead, ipsass, shipto
118 WHERE ( (ipsprice_ipshead_id=ipshead_id)
119 AND (ipsass_ipshead_id=ipshead_id)
120 AND (_asof BETWEEN ipshead_effective AND (ipshead_expires - 1))
121 AND (ipsprice_qtybreak <= _qty)
122 AND (COALESCE(length(ipsass_shipto_pattern), 0) > 0)
123 AND (shipto_num ~ ipsass_shipto_pattern)
124 AND (ipsass_cust_id=pCustid)
125 AND (shipto_id=pShiptoid) )
126 ORDER BY uommatched DESC, ipsprice_qtybreak DESC, ipsprice_price ASC
129 IF (_price IS NOT NULL) THEN
130 IF ((_sales IS NOT NULL) AND (_sales < _price)) THEN
136 -- Check for a Customer Price
137 SELECT currToCurr(ipshead_curr_id, pCurrid, ipsprice_price, pEffective) INTO _price
139 SELECT ipsitem_ipshead_id AS ipsprice_ipshead_id,
140 itemuomtouom(ipsitem_item_id, ipsitem_qty_uom_id, NULL, ipsitem_qtybreak) AS ipsprice_qtybreak,
141 (ipsitem_price * itemuomtouomratio(ipsitem_item_id, NULL, ipsitem_price_uom_id)) * _iteminvpricerat AS ipsprice_price,
142 (ipsitem_price_uom_id=COALESCE(pPriceUOM,-1)) AS uommatched
144 WHERE(ipsitem_item_id=pItemid)
146 SELECT ipsprodcat_ipshead_id AS ipsprice_ipshead_id,
147 ipsprodcat_qtybreak AS ipsprice_qtybreak,
148 noneg(CAST((item_listprice - (item_listprice * ipsprodcat_discntprcnt) - ipsprodcat_fixedamtdiscount)
149 AS NUMERIC(16,4))) AS ipsprice_price,
150 (item_price_uom_id=COALESCE(pPriceUOM,-1)) AS uommatched
151 FROM ipsprodcat JOIN item ON (ipsprodcat_prodcat_id=item_prodcat_id)
152 WHERE(item_id=pItemid) ) AS
153 ipsprice, ipshead, ipsass
154 WHERE ( (ipsprice_ipshead_id=ipshead_id)
155 AND (ipsass_ipshead_id=ipshead_id)
156 AND (_asof BETWEEN ipshead_effective AND (ipshead_expires - 1))
157 AND (ipsprice_qtybreak <= _qty)
158 AND (COALESCE(length(ipsass_shipto_pattern), 0) = 0)
159 AND (ipsass_cust_id=pCustid) )
160 ORDER BY uommatched DESC, ipsprice_qtybreak DESC, ipsprice_price ASC
163 IF (_price IS NOT NULL) THEN
164 IF ((_sales IS NOT NULL) AND (_sales < _price)) THEN
170 -- Check for a Customer Type Price
171 SELECT currToCurr(ipshead_curr_id, pCurrid, ipsprice_price, pEffective) INTO _price
173 SELECT ipsitem_ipshead_id AS ipsprice_ipshead_id,
174 itemuomtouom(ipsitem_item_id, ipsitem_qty_uom_id, NULL, ipsitem_qtybreak) AS ipsprice_qtybreak,
175 (ipsitem_price * itemuomtouomratio(ipsitem_item_id, NULL, ipsitem_price_uom_id)) * _iteminvpricerat AS ipsprice_price,
176 (ipsitem_price_uom_id=COALESCE(pPriceUOM,-1)) AS uommatched
178 WHERE(ipsitem_item_id=pItemid)
180 SELECT ipsprodcat_ipshead_id AS ipsprice_ipshead_id,
181 ipsprodcat_qtybreak AS ipsprice_qtybreak,
182 noneg(CAST((item_listprice - (item_listprice * ipsprodcat_discntprcnt) - ipsprodcat_fixedamtdiscount)
183 AS NUMERIC(16,4))) AS ipsprice_price,
184 (item_price_uom_id=COALESCE(pPriceUOM,-1)) AS uommatched
185 FROM ipsprodcat JOIN item ON (ipsprodcat_prodcat_id=item_prodcat_id)
186 WHERE(item_id=pItemid) ) AS
187 ipsprice, ipshead, ipsass, custinfo
188 WHERE ( (ipsprice_ipshead_id=ipshead_id)
189 AND (ipsass_ipshead_id=ipshead_id)
190 AND (ipsass_custtype_id=cust_custtype_id)
191 AND (_asof BETWEEN ipshead_effective AND (ipshead_expires - 1))
192 AND (ipsprice_qtybreak <= _qty)
193 AND (cust_id=pCustid) )
194 ORDER BY uommatched DESC, ipsprice_qtybreak DESC, ipsprice_price ASC
197 IF (_price IS NOT NULL) THEN
198 IF ((_sales IS NOT NULL) AND (_sales < _price)) THEN
204 -- Check for a Customer Type Pattern Price
205 SELECT currToCurr(ipshead_curr_id, pCurrid, ipsprice_price, pEffective) INTO _price
207 SELECT ipsitem_ipshead_id AS ipsprice_ipshead_id,
208 itemuomtouom(ipsitem_item_id, ipsitem_qty_uom_id, NULL, ipsitem_qtybreak) AS ipsprice_qtybreak,
209 (ipsitem_price * itemuomtouomratio(ipsitem_item_id, NULL, ipsitem_price_uom_id)) * _iteminvpricerat AS ipsprice_price,
210 (ipsitem_price_uom_id=COALESCE(pPriceUOM,-1)) AS uommatched
212 WHERE(ipsitem_item_id=pItemid)
214 SELECT ipsprodcat_ipshead_id AS ipsprice_ipshead_id,
215 ipsprodcat_qtybreak AS ipsprice_qtybreak,
216 noneg(CAST((item_listprice - (item_listprice * ipsprodcat_discntprcnt) - ipsprodcat_fixedamtdiscount)
217 AS NUMERIC(16,4))) AS ipsprice_price,
218 (item_price_uom_id=COALESCE(pPriceUOM,-1)) AS uommatched
219 FROM ipsprodcat JOIN item ON (ipsprodcat_prodcat_id=item_prodcat_id)
220 WHERE(item_id=pItemid) ) AS
221 ipsprice, ipshead, ipsass, custtype, custinfo
222 WHERE ( (ipsprice_ipshead_id=ipshead_id)
223 AND (ipsass_ipshead_id=ipshead_id)
224 AND (coalesce(length(ipsass_custtype_pattern), 0) > 0)
225 AND (custtype_code ~ ipsass_custtype_pattern)
226 AND (cust_custtype_id=custtype_id)
227 AND (_asof BETWEEN ipshead_effective AND (ipshead_expires - 1))
228 AND (ipsprice_qtybreak <= _qty)
229 AND (cust_id=pCustid) )
230 ORDER BY uommatched DESC, ipsprice_qtybreak DESC, ipsprice_price ASC
233 IF (_price IS NOT NULL) THEN
234 IF ((_sales IS NOT NULL) AND (_sales < _price)) THEN
240 -- If we have not found another price yet and we have a
241 -- sales price we will use that.
242 IF (_sales IS NOT NULL) THEN
246 -- Check for a list price
247 SELECT MIN(currToLocal(pCurrid,
248 item_listprice - (item_listprice * COALESCE(cust_discntprcnt, 0)),
249 pEffective) * _iteminvpricerat) AS price,
250 item_exclusive INTO _item
251 FROM item LEFT OUTER JOIN custinfo ON (cust_id=pCustid)
252 WHERE (item_id=pItemid)
253 GROUP BY item_exclusive;
255 IF (NOT _item.item_exclusive) THEN
256 IF (_item.price < 0) THEN
270 LANGUAGE plpgsql STABLE
272 ALTER FUNCTION itemprice(integer, integer, integer, numeric, integer, integer, integer, date, date)