sync
[Pman.Xtuple] / pgsql / invadj_post.sql
1
2 -- create dummy itemlocs
3
4   
5 -- create dummy itemlocs
6
7 CREATE OR REPLACE FUNCTION invadj_post(int)
8   RETURNS  INTEGER  AS
9 $BODY$
10 DECLARE
11   
12     i_invadj_id ALIAS FOR $1;
13
14     r_invadj RECORD;
15     r_dist RECORD;
16     
17     v_invdetail_id INTEGER;
18   
19     v_series INTEGER;
20     v_result INTEGER;
21     v_result_bool BOOLEAN;
22 BEGIN
23   
24   
25     SELECT
26             *
27         INTO
28             r_invadj
29         FROM
30             invadj
31         WHERE
32             invadj_id = i_invadj_id;
33     
34     IF NOT FOUND THEN
35         RAISE EXCEPTION 'could not find invadj record';
36     END IF;
37     
38     IF r_invadj.invadj_posted  THEN
39         RAISE EXCEPTION 'invadj already posted';
40     END IF;
41   
42   
43     IF   r_invadj.invadj_voids_id > 0 THEN 
44         
45         SELECT
46                 invadj_voided_by_id
47             INTO
48                 v_result
49             FROM
50                 invadj
51             WHERE
52                 invadj_id = r_invadj.invadj_voids_id;
53                 
54                 
55                 
56         IF NOT FOUND THEN
57             RAISE EXCEPTION 'voids id is invalid';
58         END IF;
59         IF v_result > 0 THEN
60             RAISE EXCEPTION 'voids id points to an already voided record';
61         END IF;
62             
63     END IF;
64   
65   
66     SELECT invAdjustment(
67                     r_invadj.invadj_itemsite_id,
68                     r_invadj.invadj_qty_by,
69                     'INVADJ-' || r_invadj.invadj_id,
70                     r_invadj.invadj_comments,
71                     r_invadj.invadj_transdate
72                     -- uses std cost?
73                 ) INTO v_series;
74             
75     IF v_series < 1 THEN
76         RAISE EXCEPTION  'invAdjustment post failed with %', v_series;
77     END IF;
78         
79     SELECT
80                 itemlocdist_id, itemlocdist_reqlotserial,
81                 itemlocdist_distlotserial, itemlocdist_qty,
82                 
83                 itemsite_loccntrl, itemsite_controlmethod,
84                 itemsite_perishable, itemsite_warrpurc,
85                 
86                 COALESCE(itemsite_lsseq_id,-1) AS itemsite_lsseq_id,
87                 COALESCE(itemlocdist_source_id,-1) AS itemlocdist_source_id
88             INTO
89                 r_dist
90             FROM
91                 itemlocdist, itemsite
92             WHERE
93                 (
94                     (itemlocdist_itemsite_id=itemsite_id) AND (itemlocdist_series=v_series )
95                 )
96             ORDER BY itemlocdist_id;
97             
98             
99     IF NOT FOUND THEN
100          RAISE EXCEPTION 'invAdjustment failed to create itemlocdist';
101     END IF;
102         
103         
104         
105     INSERT INTO itemlocdist (
106        itemlocdist_itemlocdist_id,  itemlocdist_source_type,
107        itemlocdist_source_id,  itemlocdist_qty,
108        itemlocdist_ls_id, itemlocdist_expiration
109    )
110        SELECT
111        itemlocdist_id,       'L',
112        r_invadj.invadj_location_id,       r_invadj.invadj_qty_by,
113        itemlocdist_ls_id, endOfTime()
114        FROM itemlocdist WHERE (itemlocdist_id=r_dist.itemlocdist_id);
115
116         
117     SELECT distributeToLocations(r_dist.itemlocdist_id) INTO v_result;
118     
119     IF NOT FOUND OR v_result < 0 THEN
120         RAISE EXCEPTION 'distributeToLocations failed  ';
121     END IF;
122           
123     
124     SELECT postItemlocseries(v_series) INTO v_result_bool ;
125     
126     IF NOT v_result_bool  THEN
127         RAISE EXCEPTION 'postItemlocseries failed  ';
128     END IF;
129         
130     -- finally - if the record was a void - make refernce in the voided data..    
131     IF  r_invadj.invadj_voids_id > 0 THEN
132     
133         UPDATE invadj SET
134             invadj_voided_by_id = r_invadj.invadj_id
135             WHERE
136             invadj_id = r_invadj.invadj_voids_id ;
137             
138             
139     END IF;
140   
141     SELECT
142             invdetail_id
143         INTO
144             v_invdetail_id
145         FROM
146             invdetailview
147         WHERE
148             invhist_ordnumber = 'INVADJ-' || r_invadj.invadj_id
149         LIMIT 1;
150     
151   
152     UPDATE invadj SET
153             invadj_posted = true,
154             invadj_invdetail_id = v_invdetail_id
155             WHERE
156             
157             invadj_id = r_invadj.invadj_id;
158   
159     
160     
161     
162     -- we need to update the invhist id..
163     
164     IF  r_invadj.invadj_voids_id > 0 OR  r_invadj.invadj_voided_by_id > 0  THEN
165         -- try running the void flag code.
166         PERFORM invfifo_invadj_void_flag(v_invdetail_id);
167     END IF;
168     
169     
170     
171    RETURN v_result;
172 END;
173 $BODY$
174   LANGUAGE plpgsql VOLATILE
175   COST 100;
176 ALTER FUNCTION  invadj_post(int)
177   OWNER TO admin;
178
179
180
181 -- sync:
182 --DELETE FROM invadj;
183 --SELECT invadj_sync_invdetail(invdetail_id) FROM invdetailview where invhist_transtype = 'AD' ORDER BY invhist_transdate ASC;
184
185
186 --- FIX the fact i forgot to update invdetail id..
187
188 --UPDATE invadj
189 --    SET invadj_invdetail_id = (SELECT invdetail_id FROM invdetailview WHERE invhist_ordnumber = 'INVADJ-' || invadj_id LIMIT 1)
190 --    WHERE invadj_posted  and invadj_invdetail_id IS NULL;
191 --
192 --
193