MOVED pgsql/x-dragon-gl-precision.sql to pgsql/fixes/x-dragon-gl-precision.sql
[Pman.Xtuple] / pgsql / x-dragon-invadj.sql
1 -- Sequence: accnt_accnt_id_seq
2
3 --DROP table invadj;
4
5  
6 CREATE SEQUENCE invadj_id_seq
7   INCREMENT 1
8   MINVALUE 1
9   MAXVALUE 2147483647
10   START 1
11   CACHE 1;
12 ALTER TABLE invadj_id_seq
13   OWNER TO admin;
14 GRANT ALL ON TABLE invadj_id_seq TO admin;
15 GRANT ALL ON TABLE invadj_id_seq TO xtrole;
16
17
18 CREATE TABLE invadj
19 (
20   invadj_id integer NOT NULL DEFAULT nextval(('invadj_id_seq'::text)::regclass),
21   invadj_transdate  date,
22   invadj_location_id integer,
23   invadj_itemsite_id integer,
24   invadj_qty_by integer,
25   invadj_posted boolean,
26   
27     CONSTRAINT invadj_pkey PRIMARY KEY (invadj_id ),
28     CONSTRAINT invadj_location_fkey FOREIGN KEY (invadj_location_id)
29         REFERENCES location (location_id) 
30       ON UPDATE CASCADE ON DELETE NO ACTION,
31       
32     CONSTRAINT invadj_itemsite_fkey FOREIGN KEY (invadj_itemsite_id)
33       REFERENCES itemsite (itemsite_id) 
34       ON UPDATE CASCADE ON DELETE NO ACTION
35 )
36 WITH (
37   OIDS=FALSE
38 );
39
40 ALTER TABLE invadj ADD COLUMN   invadj_comments text;
41 ALTER TABLE invadj ADD COLUMN   invadj_voids_id INTEGER NOT NULL DEFAULT 0;
42 ALTER TABLE invadj ADD COLUMN   invadj_invdetail_id INTEGER;
43 ALTER TABLE invadj ADD COLUMN   invadj_voided_by_id INTEGER NOT NULL DEFAULT 0;
44 ALTER TABLE invadj ADD COLUMN   invadj_invadjgrp_id INTEGER DEFAULT NULL;
45  
46
47 CREATE INDEX invadj_location_id_ix  ON invadj  USING btree  (invadj_location_id);
48 CREATE INDEX invadj_transdate_ix  ON invadj  USING btree  (invadj_transdate);
49 CREATE INDEX invadj_itemsite_ix  ON invadj  USING btree  (invadj_itemsite_id);
50 CREATE INDEX invadj_posted_ix  ON invadj USING btree  (invadj_posted);
51
52 CREATE INDEX invadj_voided_by_id_ix  ON invadj USING btree  (invadj_voided_by_id);
53 CREATE INDEX invadj_invdetail_id_ix  ON invadj USING btree  (invadj_invdetail_id);
54 CREATE INDEX invadj_voids_id_ix  ON invadj USING btree  (invadj_voids_id);
55
56 CREATE INDEX invadj_invadjgrp_id_ix  ON invadj USING btree  (invadj_invadjgrp_id);
57  
58
59
60 ALTER TABLE invadj
61   OWNER TO admin;
62 GRANT ALL ON TABLE invadj TO admin;
63 GRANT ALL ON TABLE invadj TO xtrole;
64 COMMENT ON TABLE invadj
65   IS 'Inventory Adjustment Draft';
66   
67   
68   
69   
70
71
72 -- create dummy itemlocs
73
74 CREATE OR REPLACE FUNCTION invadj_sync_invdetail(int)
75   RETURNS  int  AS
76 $BODY$
77 DECLARE
78   
79   i_invdetail_id ALIAS FOR $1;
80
81   r_invfifo RECORD;
82   v_id INTEGER;
83    
84     
85 BEGIN
86
87     SELECT
88             *
89         INTO
90             r_invfifo
91         FROM
92             invdetailview
93         WHERE
94             invdetail_id = i_invdetail_id;
95     
96     IF NOT FOUND THEN
97         RAISE EXCEPTION 'could not find invdetail record';
98     END IF;
99     
100     IF r_invfifo.invhist_transtype != 'AD' THEN
101         RAISE EXCEPTION 'record is not an adjustment';
102     END IF;
103     
104     SELECT
105             invadj_id
106         INTO
107             v_id
108         FROM
109             invadj
110         WHERE
111             invadj_invdetail_id = r_invfifo.invdetail_id;
112             
113     IF FOUND THEN
114         RETURN v_id;
115     END IF;
116     
117     INSERT INTO
118         invadj
119         (
120             
121             invadj_transdate  , invadj_location_id ,
122             invadj_itemsite_id , invadj_qty_by ,
123             
124             invadj_posted , invadj_comments,
125             invadj_voids_id, invadj_invdetail_id,
126             invadj_voided_by_id
127         )
128             VALUES
129         (
130             r_invfifo.invhist_transdate::date, r_invfifo.invdetail_location_id,
131             r_invfifo.invhist_itemsite_id, r_invfifo.invdetail_qty,
132             
133             true, r_invfifo.invhist_ordnumber || '/' || r_invfifo.invhist_ordnumber  || ' : '|| r_invfifo.invhist_comments,
134             0, r_invfifo.invdetail_id,
135             0
136             
137         );
138         
139     SELECT
140             invadj_id
141         INTO
142             v_id
143         FROM
144             invadj
145         WHERE
146             invadj_invdetail_id = r_invfifo.invdetail_id;
147           
148
149    RETURN v_id;
150 END;
151 $BODY$
152   LANGUAGE plpgsql VOLATILE
153   COST 100;
154 ALTER FUNCTION  invadj_sync_invdetail(int)
155   OWNER TO admin;
156
157
158   
159 -- create dummy itemlocs
160
161 CREATE OR REPLACE FUNCTION invadj_post(int)
162   RETURNS  INTEGER  AS
163 $BODY$
164 DECLARE
165   
166     i_invadj_id ALIAS FOR $1;
167
168     r_invadj RECORD;
169     r_dist RECORD;
170     
171     v_invdetail_id INTEGER;
172   
173     v_series INTEGER;
174     v_result INTEGER;
175     v_result_bool BOOLEAN;
176 BEGIN
177   
178   
179     SELECT
180             *
181         INTO
182             r_invadj
183         FROM
184             invadj
185         WHERE
186             invadj_id = i_invadj_id;
187     
188     IF NOT FOUND THEN
189         RAISE EXCEPTION 'could not find invadj record';
190     END IF;
191     
192     IF r_invadj.invadj_posted  THEN
193         RAISE EXCEPTION 'invadj already posted';
194     END IF;
195   
196   
197     IF   r_invadj.invadj_voids_id > 0 THEN 
198         
199         SELECT
200                 invadj_voided_by_id
201             INTO
202                 v_result
203             FROM
204                 invadj
205             WHERE
206                 invadj_id = r_invadj.invadj_voids_id;
207                 
208                 
209                 
210         IF NOT FOUND THEN
211             RAISE EXCEPTION 'voids id is invalid';
212         END IF;
213         IF v_result > 0 THEN
214             RAISE EXCEPTION 'voids id points to an already voided record';
215         END IF;
216             
217     END IF;
218   
219   
220     SELECT invAdjustment(
221                     r_invadj.invadj_itemsite_id,
222                     r_invadj.invadj_qty_by,
223                     'INVADJ-' || r_invadj.invadj_id,
224                     r_invadj.invadj_comments,
225                     r_invadj.invadj_transdate
226                     -- uses std cost?
227                 ) INTO v_series;
228             
229     IF v_series < 1 THEN
230         RAISE EXCEPTION  'invAdjustment post failed with %', v_series;
231     END IF;
232         
233     SELECT
234                 itemlocdist_id, itemlocdist_reqlotserial,
235                 itemlocdist_distlotserial, itemlocdist_qty,
236                 
237                 itemsite_loccntrl, itemsite_controlmethod,
238                 itemsite_perishable, itemsite_warrpurc,
239                 
240                 COALESCE(itemsite_lsseq_id,-1) AS itemsite_lsseq_id,
241                 COALESCE(itemlocdist_source_id,-1) AS itemlocdist_source_id
242             INTO
243                 r_dist
244             FROM
245                 itemlocdist, itemsite
246             WHERE
247                 (
248                     (itemlocdist_itemsite_id=itemsite_id) AND (itemlocdist_series=v_series )
249                 )
250             ORDER BY itemlocdist_id;
251             
252             
253     IF NOT FOUND THEN
254          RAISE EXCEPTION 'invAdjustment failed to create itemlocdist';
255     END IF;
256         
257         
258         
259     INSERT INTO itemlocdist (
260        itemlocdist_itemlocdist_id,  itemlocdist_source_type,
261        itemlocdist_source_id,  itemlocdist_qty,
262        itemlocdist_ls_id, itemlocdist_expiration
263    )
264        SELECT
265        itemlocdist_id,       'L',
266        r_invadj.invadj_location_id,       r_invadj.invadj_qty_by,
267        itemlocdist_ls_id, endOfTime()
268        FROM itemlocdist WHERE (itemlocdist_id=r_dist.itemlocdist_id);
269
270         
271     SELECT distributeToLocations(r_dist.itemlocdist_id) INTO v_result;
272     
273     IF NOT FOUND OR v_result < 0 THEN
274         RAISE EXCEPTION 'distributeToLocations failed  ';
275     END IF;
276           
277     
278     SELECT postItemlocseries(v_series) INTO v_result_bool ;
279     
280     IF NOT v_result_bool  THEN
281         RAISE EXCEPTION 'postItemlocseries failed  ';
282     END IF;
283         
284     -- finally - if the record was a void - make refernce in the voided data..    
285     IF  r_invadj.invadj_voids_id > 0 THEN
286     
287         UPDATE invadj SET
288             invadj_voided_by_id = r_invadj.invadj_id
289             WHERE
290             invadj_id = r_invadj.invadj_voids_id ;
291             
292             
293     END IF;
294   
295     SELECT
296             invdetail_id
297         INTO
298             v_invdetail_id
299         FROM
300             invdetailview
301         WHERE
302             invhist_ordnumber = 'INVADJ-' || r_invadj.invadj_id
303         LIMIT 1;
304     
305   
306     UPDATE invadj SET
307             invadj_posted = true,
308             invadj_invdetail_id = v_invdetail_id
309             WHERE
310             
311             invadj_id = r_invadj.invadj_id;
312   
313     
314     
315     
316     -- we need to update the invhist id..
317     
318     IF  r_invadj.invadj_voids_id > 0 OR  r_invadj.invadj_voided_by_id > 0  THEN
319         -- try running the void flag code.
320         PERFORM invfifo_invadj_void_flag(v_invdetail_id);
321     END IF;
322     
323     
324     
325    RETURN v_result;
326 END;
327 $BODY$
328   LANGUAGE plpgsql VOLATILE
329   COST 100;
330 ALTER FUNCTION  invadj_post(int)
331   OWNER TO admin;
332
333
334
335 -- sync:
336 --DELETE FROM invadj;
337 --SELECT invadj_sync_invdetail(invdetail_id) FROM invdetailview where invhist_transtype = 'AD' ORDER BY invhist_transdate ASC;
338
339
340 --- FIX the fact i forgot to update invdetail id..
341
342 --UPDATE invadj
343 --    SET invadj_invdetail_id = (SELECT invdetail_id FROM invdetailview WHERE invhist_ordnumber = 'INVADJ-' || invadj_id LIMIT 1)
344 --    WHERE invadj_posted  and invadj_invdetail_id IS NULL;
345 --
346 --
347