2 CREATE OR REPLACE FUNCTION convertQuote(INTEGER) 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.
6 pQuheadid ALIAS FOR $1;
12 _ordertype CHARACTER(1);
14 _usespos BOOLEAN := false;
15 _blanketpos BOOLEAN := true;
16 _showConvertedQuote BOOLEAN := false;
23 -- Check to make sure the quote has not expired
24 IF (SELECT COALESCE(quhead_expire, endOfTime()) < CURRENT_DATE
26 WHERE(quhead_id=pQuheadid)) THEN
30 -- Check to make sure that all of the quote items have a valid itemsite
31 SELECT quitem_id INTO _r
32 FROM quitem LEFT OUTER JOIN itemsite ON (quitem_itemsite_id=itemsite_id)
33 WHERE ((itemsite_id IS NULL)
34 AND (quitem_quhead_id=pQuheadid));
36 PERFORM postEvent('CannotConvertQuote', 'Q', quhead_id,
37 quhead_warehous_id, quhead_number,
38 NULL, NULL, NULL, NULL)
40 WHERE (quhead_id=pQuheadid);
45 SELECT cust_creditstatus, cust_usespos, cust_blanketpos
46 INTO _creditstatus, _usespos, _blanketpos
48 WHERE ((quhead_cust_id=cust_id)
49 AND (quhead_id=pQuheadid));
52 SELECT prospect_id INTO _prospectid
54 WHERE ((quhead_cust_id=prospect_id)
55 AND (quhead_id=pQuheadid));
61 ELSIF (_creditstatus = 'H' AND NOT checkPrivilege('CreateSOForHoldCustomer')) THEN
63 ELSIF (_creditstatus = 'W' AND NOT checkPrivilege('CreateSOForWarnCustomer')) THEN
68 SELECT quhead_number INTO _qunumber
70 WHERE (quhead_id=pQuheadid)
71 AND (COALESCE(quhead_custponumber, '') = '');
73 RAISE EXCEPTION 'Customer PO required for Quote % [xtuple: convertQuote, -7, %]',
78 IF ( (_usespos) AND (NOT _blanketpos) ) THEN
79 SELECT quhead_number, quhead_custponumber INTO _qunumber, _ponumber
80 FROM quhead JOIN cohead ON ( (cohead_cust_id=quhead_cust_id) AND
81 (UPPER(cohead_custponumber)=UPPER(quhead_custponumber)) )
82 WHERE (quhead_id=pQuheadid);
84 RAISE EXCEPTION 'Duplicate Customer PO % for Quote % [xtuple: convertQuote, -8, %, %]',
90 PERFORM quhead_number, cohead_id
92 WHERE quhead_id = pQuheadid
93 AND cohead_number = quhead_number;
96 SELECT fetchSoNumber() INTO _soNum;
98 SELECT quhead_number INTO _soNum
100 WHERE quhead_id = pQuheadid;
103 SELECT NEXTVAL('cohead_cohead_id_seq') INTO _soheadid;
105 ( cohead_id, cohead_number, cohead_cust_id,
106 cohead_orderdate, cohead_packdate,
107 cohead_custponumber, cohead_warehous_id,
108 cohead_billtoname, cohead_billtoaddress1,
109 cohead_billtoaddress2, cohead_billtoaddress3,
110 cohead_billtocity, cohead_billtostate, cohead_billtozipcode,
111 cohead_billtocountry,
112 cohead_shipto_id, cohead_shiptoname, cohead_shiptoaddress1,
113 cohead_shiptoaddress2, cohead_shiptoaddress3,
114 cohead_shiptocity, cohead_shiptostate, cohead_shiptozipcode,
115 cohead_shiptocountry,
116 cohead_salesrep_id, cohead_commission,
117 cohead_terms_id, cohead_shipchrg_id, cohead_shipform_id,
118 cohead_fob, cohead_shipvia,
119 cohead_ordercomments, cohead_shipcomments,
120 cohead_freight, cohead_misc, cohead_misc_accnt_id, cohead_misc_descrip,
121 cohead_holdtype, cohead_wasquote, cohead_quote_number, cohead_prj_id,
122 cohead_curr_id, cohead_taxzone_id, cohead_taxtype_id,
123 cohead_shipto_cntct_id, cohead_shipto_cntct_honorific, cohead_shipto_cntct_first_name,
124 cohead_shipto_cntct_middle, cohead_shipto_cntct_last_name, cohead_shipto_cntct_suffix,
125 cohead_shipto_cntct_phone, cohead_shipto_cntct_title, cohead_shipto_cntct_fax,
126 cohead_shipto_cntct_email,
127 cohead_billto_cntct_id, cohead_billto_cntct_honorific,
128 cohead_billto_cntct_first_name, cohead_billto_cntct_middle, cohead_billto_cntct_last_name,
129 cohead_billto_cntct_suffix, cohead_billto_cntct_phone, cohead_billto_cntct_title,
130 cohead_billto_cntct_fax, cohead_billto_cntct_email, cohead_ophead_id,
131 cohead_calcfreight, cohead_saletype_id, cohead_shipzone_id )
132 SELECT _soheadid, _soNum, quhead_cust_id,
133 CURRENT_DATE, quhead_packdate,
134 quhead_custponumber, quhead_warehous_id,
135 quhead_billtoname, quhead_billtoaddress1,
136 quhead_billtoaddress2, quhead_billtoaddress3,
137 quhead_billtocity, quhead_billtostate, quhead_billtozip,
138 quhead_billtocountry,
139 quhead_shipto_id, quhead_shiptoname, quhead_shiptoaddress1,
140 quhead_shiptoaddress2, quhead_shiptoaddress3,
141 quhead_shiptocity, quhead_shiptostate, quhead_shiptozipcode,
142 quhead_shiptocountry,
143 quhead_salesrep_id, quhead_commission,
144 quhead_terms_id, cust_shipchrg_id, cust_shipform_id,
145 quhead_fob, quhead_shipvia,
146 quhead_ordercomments, quhead_shipcomments,
147 quhead_freight, quhead_misc, quhead_misc_accnt_id, quhead_misc_descrip,
148 'N', TRUE, quhead_number, quhead_prj_id,
149 quhead_curr_id, quhead_taxzone_id, quhead_taxtype_id,
150 quhead_shipto_cntct_id, quhead_shipto_cntct_honorific,
151 quhead_shipto_cntct_first_name, quhead_shipto_cntct_middle, quhead_shipto_cntct_last_name,
152 quhead_shipto_cntct_suffix, quhead_shipto_cntct_phone, quhead_shipto_cntct_title,
153 quhead_shipto_cntct_fax, quhead_shipto_cntct_email, quhead_billto_cntct_id,
154 quhead_billto_cntct_honorific, quhead_billto_cntct_first_name, quhead_billto_cntct_middle,
155 quhead_billto_cntct_last_name, quhead_billto_cntct_suffix, quhead_billto_cntct_phone,
156 quhead_billto_cntct_title, quhead_billto_cntct_fax, quhead_billto_cntct_email, quhead_ophead_id,
157 quhead_calcfreight, quhead_saletype_id, quhead_shipzone_id
158 FROM quhead JOIN custinfo ON (cust_id=quhead_cust_id)
159 WHERE (quhead_id=pQuheadid);
162 UPDATE url SET url_source_id = _soheadid,
164 WHERE ((url_source='Q') AND (url_source_id = pQuheadid));
166 UPDATE imageass SET imageass_source_id = _soheadid,
167 imageass_source = 'S'
168 WHERE ((imageass_source='Q') AND (imageass_source_id = pQuheadid));
170 UPDATE docass SET docass_source_id = _soheadid,
171 docass_source_type = 'S'
172 WHERE ((docass_source_type='Q') AND (docass_source_id = pQuheadid));
175 IF (fetchMetricBool('EnableBatchManager')) THEN
176 UPDATE xtbatch.emlassc SET emlassc_type='S',
177 emlassc_assc_id=_soheadid
178 WHERE ((emlassc_type='Q') AND (emlassc_assc_id=pQuheadid));
181 -- Copy Characteristics
183 (charass_target_type, charass_target_id, charass_char_id, charass_value, charass_default, charass_price)
184 SELECT 'SO', _soheadid, charass_char_id, charass_value, charass_default, charass_price
186 WHERE ((charass_target_type='QU')
187 AND (charass_target_id=pQuheadid));
191 ( comment_cmnttype_id, comment_source, comment_source_id, comment_date, comment_user, comment_text, comment_public )
192 SELECT comment_cmnttype_id, 'S', _soheadid, comment_date, comment_user, ('Quote-' || comment_text), comment_public
194 WHERE ( (comment_source='Q')
195 AND (comment_source_id=pQuheadid) );
197 FOR _r IN SELECT quitem.*,
198 quhead_number, quhead_prj_id, quhead_saletype_id,
199 itemsite_item_id, itemsite_leadtime,
200 itemsite_createsopo, itemsite_createsopr,
201 item_type, COALESCE(quitem_itemsrc_id, itemsrc_id, -1) AS itemsrcid
202 FROM quhead JOIN quitem ON (quitem_quhead_id=quhead_id)
203 JOIN itemsite ON (itemsite_id=quitem_itemsite_id)
204 JOIN item ON (item_id=itemsite_item_id)
205 LEFT OUTER JOIN itemsrc ON ( (itemsrc_item_id=item_id) AND
207 WHERE (quhead_id=pQuheadid)
208 ORDER BY quitem_linenumber LOOP
210 SELECT NEXTVAL('coitem_coitem_id_seq') INTO _soitemid;
213 ( coitem_id, coitem_cohead_id, coitem_linenumber, coitem_itemsite_id,
214 coitem_status, coitem_scheddate, coitem_promdate,
215 coitem_price, coitem_custprice,
216 coitem_qtyord, coitem_qtyshipped, coitem_qtyreturned,
217 coitem_qty_uom_id, coitem_qty_invuomratio,
218 coitem_price_uom_id, coitem_price_invuomratio,
219 coitem_unitcost, coitem_prcost,
220 coitem_custpn, coitem_memo, coitem_taxtype_id, coitem_order_id )
222 ( _soitemid, _soheadid, _r.quitem_linenumber, _r.quitem_itemsite_id,
223 'O', _r.quitem_scheddate, _r.quitem_promdate,
224 _r.quitem_price, _r.quitem_custprice,
225 _r.quitem_qtyord, 0, 0,
226 _r.quitem_qty_uom_id, _r.quitem_qty_invuomratio,
227 _r.quitem_price_uom_id, _r.quitem_price_invuomratio,
228 stdcost(_r.itemsite_item_id), _r.quitem_prcost,
229 _r.quitem_custpn, _r.quitem_memo, _r.quitem_taxtype_id, -1 );
231 IF (fetchMetricBool('enablextcommissionission')) THEN
232 PERFORM xtcommission.getSalesReps(quhead_cust_id, quhead_shipto_id,
233 _r.itemsite_item_id, _r.quhead_saletype_id,
234 _r.quitem_price, _r.quitem_custprice,
235 _soitemid, 'SalesItem')
237 WHERE (quhead_id=pQuheadid);
240 -- Copy Characteristics
242 (charass_target_type, charass_target_id, charass_char_id, charass_value, charass_default, charass_price)
243 SELECT 'SI', _soitemid, charass_char_id, charass_value, charass_default, charass_price
245 WHERE ((charass_target_type='QI')
246 AND (charass_target_id=_r.quitem_id));
250 ( comment_cmnttype_id, comment_source, comment_source_id, comment_date, comment_user, comment_text )
251 SELECT comment_cmnttype_id, 'SI', _soitemid, comment_date, comment_user, ('Quote-' || comment_text)
253 WHERE ( (comment_source='QI')
254 AND (comment_source_id=_r.quitem_id) );
258 IF (_r.quitem_createorder) THEN
260 IF (_r.item_type IN ('M')) THEN
261 SELECT createWo( CAST(_r.quhead_number AS INTEGER), supply.itemsite_id, 1, (_r.quitem_qtyord * _r.quitem_qty_invuomratio),
262 _r.itemsite_leadtime, _r.quitem_scheddate, _r.quitem_memo, 'S', _soitemid, _r.quhead_prj_id ) INTO _orderId
263 FROM itemsite sold, itemsite supply
264 WHERE ((sold.itemsite_item_id=supply.itemsite_item_id)
265 AND (supply.itemsite_warehous_id=_r.quitem_order_warehous_id)
266 AND (sold.itemsite_id=_r.quitem_itemsite_id) );
270 (charass_target_type, charass_target_id, charass_char_id, charass_value)
271 SELECT 'W', _orderId, charass_char_id, charass_value
273 WHERE ((charass_target_type='QI')
274 AND (charass_target_id=_r.quitem_id));
276 ELSIF ( (_r.item_type IN ('P', 'O')) AND (_r.itemsite_createsopr) ) THEN
277 SELECT createPr( CAST(_r.quhead_number AS INTEGER), _r.quitem_itemsite_id, (_r.quitem_qtyord * _r.quitem_qty_invuomratio),
278 _r.quitem_scheddate, '', 'S', _soitemid ) INTO _orderId;
280 UPDATE pr SET pr_prj_id=_r.quhead_prj_id WHERE pr_id=_orderId;
281 ELSIF ( (_r.item_type IN ('P', 'O')) AND (_r.itemsite_createsopo) ) THEN
282 IF (_r.quitem_prcost=0) THEN
283 SELECT createPurchaseToSale(_soitemid, _r.itemsrcid, _r.quitem_dropship) INTO _orderId;
285 SELECT createPurchaseToSale(_soitemid, _r.itemsrcid, _r.quitem_dropship, _r.quitem_prcost) INTO _orderId;
290 UPDATE coitem SET coitem_order_type=_ordertype, coitem_order_id=_orderid
291 WHERE (coitem_id=_soitemid);
297 SELECT metric_value INTO _showConvertedQuote
298 FROM metric WHERE metric_name = 'ShowQuotesAfterSO';
300 IF (_showConvertedQuote) THEN
302 SET quhead_status= 'C'
303 WHERE (quhead_id = pQuheadid);
305 PERFORM deleteQuote(pQuheadid);
311 $$ LANGUAGE 'plpgsql';