pgsql/vendinfo.sql
[Pman.Xtuple] / pgsql / x-fifo-invfifo-apply-gl-cmhead.sql
1 -- apply the fifo values to the general ledger for a credit memos.
2
3
4 -- cm's are invhist_ordtype = 'CM'
5
6 --Process:
7 -- for a specific cohead
8 -- fetch the total value of system created transactions
9 -- eg. Ship/return issue etc...
10
11 -- find the value we have created as an adjustment (if any.)
12
13 -- calculate the correct values
14 -- update or create a JE for this.
15
16 -- test:
17 -- SELECT invfifo_apply_gl_cmhead(cmhead_id) FROM cmhead ORDER BY cmhead_id ASC  ;
18
19 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_all()
20   RETURNS  TEXT
21     
22 AS $BODY$
23 DECLARE        
24     v_period_close_at_end INTEGER;
25     
26 BEGIN
27
28         SELECT
29             period_temp_open(period_start)
30         INTO
31             v_period_close_at_end
32         FROM
33             period
34         LEFT JOIN
35             yearperiod
36         ON
37             period_yearperiod_id = yearperiod_id
38         WHERE
39             NOT yearperiod_closed
40         ORDER BY
41             period_start ASC
42         LIMIT 1;
43
44
45         PERFORM 
46                 invfifo_apply_gl_cmhead(cmhead_id) 
47         FROM (
48                 SELECT cmhead_id FROM cmhead  ORDER BY cmhead_id ASC
49         ) x;
50
51         IF v_period_close_at_end > 0 THEN
52             PERFORM period_temp_close(v_period_close_at_end);
53         END IF;
54
55         RETURN 'OK';
56     
57 END;
58 $BODY$
59   LANGUAGE plpgsql VOLATILE
60   COST 100;
61   
62 ALTER FUNCTION  invfifo_apply_gl_cmhead_all()
63   OWNER TO admin; 
64
65
66  
67 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead(integer)
68   RETURNS  TEXT
69     
70 AS $BODY$
71 DECLARE        
72     i_cmhead_id  ALIAS FOR $1;
73     v_tmp INTEGER;
74     v_item_cnt NUMERIC;
75     
76     v_asset_accnt_id  INTEGER;
77     v_cogs_accnt_id INTEGER;
78     
79     v_cogs_adj_total NUMERIC;
80     v_ship_adj_total  NUMERIC;
81     v_asset_adj_total NUMERIC;
82     
83     
84     v_fifo_value NUMERIC;
85     
86     
87     v_posted_cogs NUMERIC;
88     v_posted_asset NUMERIC;
89     
90     v_assetdiff NUMERIC;
91     v_cogsdiff NUMERIC;
92     
93     v_adj_cogs  NUMERIC;
94     
95     v_adj_asset  NUMERIC;
96     
97     v_cmhead_number TEXT;
98     
99     v_glsequence INTEGER;
100     v_result INTEGER;
101     v_num_ships INTEGER;
102     v_num_no_purchase INTEGER;
103     v_resultbool BOOLEAN;
104     
105     v_period_close_at_end INTEGER;
106     v_first_open DATE;
107     v_date DATE;
108     v_start_date TEXT;
109     
110     
111 BEGIN
112     --RAISE NOTICE 'START % ', clock_timestamp();
113     -- need to determine what accounts are affected,
114     -- generate a line item for all of them.
115     -- then commit the gl entry for them..
116     
117     -- let's start with basics
118     -- from cost categories
119     -- 
120     -- shipping asset, (number=1260) id = 96 -->  costcat_shipasset_accnt_id =96
121     -- inventory asset (number = 1210 or 120?)  costcat_asset_accnt_id =194
122     -- cogs (number = 121 or 5000) <<< from sales assigments COGS accnt.
123     RAISE NOTICE 'cmhead_id = %', i_cmhead_id;
124     
125     SELECT
126             cmhead_id
127         INTO
128             v_item_cnt
129         FROM
130             cmhead
131         WHERE
132             cmhead_id = i_cmhead_id
133             AND
134             cmhead_posted;
135             
136      if NOT FOUND THEN
137         RETURN 'skipped = not posted';
138     END IF;
139     
140     SELECT
141             count(cmitem_id)
142         INTO
143             v_item_cnt
144         FROM
145             cmitem
146         LEFT JOIN
147             itemsite
148         ON
149             itemsite_id = cmitem_itemsite_id
150         WHERE
151             cmitem_cmhead_id = i_cmhead_id
152         AND
153             itemsite_stocked;
154             
155     if v_item_cnt < 1 THEN
156         RETURN 'skipped = not an item based order';
157     END IF;
158       
159      
160     SELECT count(distinct salesaccnt_cos_accnt_id) INTO v_tmp FROM salesaccnt;
161     IF v_tmp > 1 THEN
162         RAISE EXCEPTION 'multiple cogs accounts not supported';
163     END IF;
164     
165     SELECT DISTINCT(salesaccnt_cos_accnt_id) INTO v_cogs_accnt_id FROM salesaccnt;
166     
167     
168     SELECT count(distinct costcat_id) INTO v_tmp FROM costcat;
169     IF v_tmp > 1 THEN
170         RAISE EXCEPTION 'multiple cost categories accounts not supported';
171     END IF;
172     
173     SELECT
174             costcat_asset_accnt_id 
175         INTO
176             v_asset_accnt_id
177         FROM
178             costcat
179         LIMIT 1;
180     
181     
182     SELECT
183             cmhead_number
184         INTO
185             v_cmhead_number
186         FROM
187             cmhead
188         WHERE
189             cmhead_id = i_cmhead_id;
190         
191     
192     --RAISE NOTICE 'cmhead_id = %', i_cmhead_id;
193     /*
194      gltrans_accnt_id |        accnt_descrip        
195 ------------------+-----------------------------
196               121 | Customer Credits
197               123 | G/L Discrepancy
198               135 | Sales
199               148 | Inventory Asset  << relivant
200               149 | Cost of Goods Sold << relivant
201               159 | Accounts Receivable (HK HQ)
202
203     */
204     --RAISE NOTICE 'BEFORE TOTALS START % ', clock_timestamp();
205     
206     
207     -- 0.632 ms without..
208     SELECT
209         ROUND(invfifo_apply_gl_cmhead_fifo_total(i_cmhead_id),2),
210         
211         ROUND(invfifo_apply_gl_cmhead_accnt_total(v_cmhead_number, v_cogs_accnt_id) ,2), -- together = 300ms
212         ROUND(invfifo_apply_gl_cmhead_accnt_total(v_cmhead_number, v_asset_accnt_id),2),  
213         
214         ROUND(invfifo_apply_gl_cmhead_fetch_je_amount(v_cmhead_number,v_cogs_accnt_id) ,2), -- together = 300ms
215         ROUND(invfifo_apply_gl_cmhead_fetch_je_amount(v_cmhead_number, v_asset_accnt_id),2) -- 0.166
216
217
218          INTO
219          v_fifo_value,
220           
221          v_posted_cogs,
222          v_posted_asset,
223          
224          v_adj_cogs,
225          v_adj_asset
226          ;
227     
228     -- 600 ms iwth all of this..
229     -- probably need to verify that cogs/inventory match..!?!?
230     
231     --RAISE NOTICE 'AFTER TOTALS START % ', clock_timestamp();
232     v_cogsdiff = v_fifo_value - v_posted_cogs;
233     v_assetdiff = (-1 * v_fifo_value) - v_posted_asset;
234   
235     RAISE NOTICE ' values: total  total issued=%    posted:  cogs(%)=%,  asset(%)=%   adjbefore cogs=%, asset=%',
236          v_fifo_value,
237        
238          v_cogs_accnt_id,
239          v_posted_cogs,
240          v_asset_accnt_id,
241          v_posted_asset,
242          
243          v_adj_cogs,
244          v_adj_asset
245          
246          ;
247     
248     
249     SELECT invfifo_apply_gl_cmhead_fetch_je_sequence(v_cmhead_number) INTO v_glsequence;
250     
251     
252     IF (
253         v_cogsdiff  = 0.0
254         
255         AND
256         v_assetdiff = 0.0
257     ) THEN
258         -- delete old difference...
259         
260         IF v_glsequence > 0 THEN
261
262             PERFORM invfifo_apply_gl_cmhead_revert_fifo(v_cmhead_number);
263         
264         END IF;
265     
266         RETURN 'NO FIFO DIFFERNECE';
267     END IF;
268     
269     
270     IF (v_adj_cogs = v_cogsdiff AND v_assetdiff = v_adj_asset ) THEN
271         RETURN 'adjustment already exists';
272     END IF;
273     
274     IF v_glsequence > 0 THEN
275
276          PERFORM invfifo_apply_gl_cmhead_revert_fifo(v_cmhead_number);
277      
278      END IF;
279     
280     
281     if ((v_cogsdiff  + v_assetdiff) != 0.0) THEN
282         RAISE EXCEPTION 'adjustment does not balance';
283     END IF;
284     
285     
286     -- what date to post..
287     
288     -- what is the last shipment?
289     SELECT
290             MAX(cmhead_gldistdate)
291         INTO
292             v_date
293         FROM
294             cmhead
295         WHERE
296             cmhead_id = i_cmhead_id;
297             
298
299     IF NOT FOUND THEN
300         RAISE EXCEPTION 'could not find a cmhead? for order %' , i_cmhead_id;
301     END IF;
302     
303     RAISE NOTICE 'shipdate : %', v_date;
304     
305    SELECT fetchMetricText('invfifo_start_date') INTO v_start_date;
306     IF v_start_date IS NULL OR LENGTH(v_start_date) < 1 THEN
307         RAISE EXCEPTION 'PERFORM setmetric(''invfifo_start_date'',  ''YOUR START DATE'');  -- do this!';
308     END IF;
309     
310     IF v_date <= v_start_date::date THEN
311         RAISE NOTICE 'ignoring transaction before start date';
312         RETURN 0;
313     END IF;
314     
315     
316     -- find the first open period..
317    SELECT
318             yearperiod_start
319     INTO
320             v_first_open
321     FROM
322             yearperiod
323     WHERE
324             NOT yearperiod_closed
325         
326     ORDER BY
327             yearperiod_start ASC
328     LIMIT 1;
329     
330         
331     IF v_first_open >= v_date THEN
332         v_date = v_first_open ;
333     END IF;
334     
335     
336     RAISE NOTICE 'shipdate after checking period: %', v_date;
337     -- create new..
338     
339     
340      SELECT period_temp_open(v_date) INTO v_period_close_at_end; 
341  
342     
343     
344     SELECT fetchGLSequence() INTO v_glsequence;
345     
346  
347     -- fix the value
348     
349     
350     SELECT insertIntoGLSeries(
351                         v_glsequence,
352                         'G/L',
353                         'JE',
354                        'FIFO-CMHEAD-' || v_cmhead_number, 
355                         v_asset_accnt_id,  -- cogs
356                          v_assetdiff  ,
357                        v_date ) INTO v_result;
358
359     if (v_result < 1) THEN
360         
361     
362         RAISE EXCEPTION 'insertIntoGLSeries INV ASS failed';
363     END IF;
364     
365
366     -- fix the value
367     
368     
369     SELECT insertIntoGLSeries(
370                         v_glsequence,
371                         'G/L',
372                         'JE',
373                        'FIFO-CMHEAD-' || v_cmhead_number, 
374                         v_cogs_accnt_id,  -- cogs
375                         v_cogsdiff  ,
376                        v_date ) INTO v_result;
377
378     if (v_result < 1) THEN
379         
380     
381         RAISE EXCEPTION 'insertIntoGLSeries INV ASS failed';
382     END IF;
383     
384     UPDATE glseries
385                 SET glseries_notes='Fifo adjustment for ' || v_cmhead_number
386                 WHERE (glseries_sequence=v_glsequence);
387     
388     
389
390     SELECT postGLSeriesNoSumm(v_glsequence,COALESCE(NULL,fetchJournalNumber('G/L'))) INTO v_result;
391     
392     if (v_result < 1) THEN
393         RAISE EXCEPTION 'post GL seriese failed';
394     END IF;
395     
396     IF v_period_close_at_end > 0 THEN
397         PERFORM period_temp_close(v_period_close_at_end);
398     END IF;
399     
400     
401     RETURN 'CHANGE: cogs=' || v_cogsdiff  || ' asset=' ||  v_assetdiff;
402     
403     
404     
405    END;
406 $BODY$
407   LANGUAGE plpgsql VOLATILE
408   COST 100;
409   
410 ALTER FUNCTION  invfifo_apply_gl_cmhead(integer)
411   OWNER TO admin;    
412         
413     
414 -------------------- FIFO ADJ ---------------------------        
415
416 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_fetch_je_amount(text, integer)
417     RETURNS  NUMERIC
418     
419 AS $BODY$
420 DECLARE        
421     i_cmhead_number ALIAS FOR $1;
422     i_accnt_id  ALIAS FOR $2;
423     
424     v_ret NUMERIC;
425     
426 BEGIN  
427     v_ret = 0;
428     SELECT
429             SUM(COALESCE(gltrans_amount,0))
430         INTO
431             v_ret
432         FROM
433             gltrans
434         WHERE
435             gltrans_docnumber = 'FIFO-CMHEAD-' || i_cmhead_number
436         AND
437             gltrans_accnt_id = i_accnt_id
438         AND
439             gltrans_source = 'G/L'
440         AND
441            gltrans_doctype = 'JE'
442         AND
443             NOT gltrans_deleted
444         AND
445             gltrans_posted;
446            
447     RETURN v_ret;
448    
449    END;
450 $BODY$
451   LANGUAGE plpgsql VOLATILE
452   COST 100;
453   
454 ALTER FUNCTION  invfifo_apply_gl_cmhead_fetch_je_amount(text, integer)
455   OWNER TO admin;    
456         
457  
458 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_fetch_je_sequence(text)
459     RETURNS  INTEGER
460     
461 AS $BODY$
462 DECLARE        
463     i_cmhead_number ALIAS FOR $1;
464      
465     v_ret INTEGER;
466     
467 BEGIN  
468     
469     SELECT
470             COALESCE(gltrans_sequence,0)
471         INTO
472             v_ret
473         FROM
474             gltrans
475         WHERE
476             gltrans_docnumber = 'FIFO-CMHEAD-' || i_cmhead_number
477         AND
478             gltrans_source = 'G/L'
479         AND
480            gltrans_doctype = 'JE'
481         AND
482             NOT gltrans_deleted
483         AND
484             gltrans_posted
485         LIMIT 1;
486            
487     RETURN v_ret;
488    
489    END;
490 $BODY$
491   LANGUAGE plpgsql VOLATILE
492   COST 100;
493   
494 ALTER FUNCTION  invfifo_apply_gl_cmhead_fetch_je_sequence(text )
495   OWNER TO admin;    
496         
497  
498  
499 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_fetch_je_date(i_cmhead_number text)
500     RETURNS  DATE
501     
502 AS $BODY$
503 DECLARE        
504       
505     v_ret DATE;
506     
507 BEGIN  
508     
509     SELECT
510             MIN(gltrans_date)
511         INTO
512             v_ret
513         FROM
514             gltrans
515         WHERE
516             gltrans_docnumber = 'FIFO-CMHEAD-' || i_cmhead_number
517         AND
518             gltrans_source = 'G/L'
519         AND
520            gltrans_doctype = 'JE'
521         AND
522             NOT gltrans_deleted
523         AND
524             gltrans_posted
525         LIMIT 1;
526            
527     RETURN v_ret;
528    
529    END;
530 $BODY$
531   LANGUAGE plpgsql VOLATILE
532   COST 100;
533   
534 ALTER FUNCTION  invfifo_apply_gl_cmhead_fetch_je_date(text )
535   OWNER TO admin;    
536      
537
538 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_revert_fifo(i_cmhead_number text)
539     RETURNS  INTEGER
540     
541 AS $BODY$
542 DECLARE  
543     v_first_open DATE;
544     v_min_date DATE;
545     v_max_date DATE;
546
547     v_glsequence INTEGER;
548     _r RECORD;
549     v_result INTEGER;
550     
551     v_post BOOLEAN;
552     v_period_close_at_end INTEGER;
553     
554     
555     
556 BEGIN
557     
558     SELECT
559         yearperiod_start
560     INTO
561         v_first_open
562     FROM
563         yearperiod
564     WHERE
565         NOT yearperiod_closed
566
567     ORDER BY
568         yearperiod_start ASC
569     LIMIT 1;
570     
571     SELECT 
572             MIN(gltrans_date),
573             MAX(gltrans_date)
574     INTO
575             v_min_date,
576             v_max_date
577     FROM
578             gltrans
579     WHERE   
580             gltrans_docnumber = 'FIFO-CMHEAD-' || i_cmhead_number
581         AND
582             gltrans_source = 'G/L'
583         AND
584            gltrans_doctype = 'JE'
585         AND
586             NOT gltrans_deleted
587         AND
588             gltrans_posted;
589     
590     
591     IF (v_max_date >= v_first_open) THEN
592         PERFORM invfifo_apply_gl_cmhead_delete_je(i_cmhead_number);
593     END IF;
594     
595     IF (v_min_date < v_first_open) THEN
596         
597         SELECT period_temp_open(v_first_open)  INTO v_period_close_at_end;
598
599         SELECT fetchGLSequence() INTO v_glsequence;
600
601         v_post := false;
602
603         FOR _r IN SELECT 
604                         COALESCE(SUM(gltrans_amount * -1), 0) AS v_amount,
605                         gltrans_accnt_id
606                 FROM
607                         gltrans
608                 WHERE
609                         gltrans_docnumber = 'FIFO-CMHEAD-' || i_cmhead_number
610                     AND
611                         gltrans_source = 'G/L'
612                     AND
613                        gltrans_doctype = 'JE'
614                     AND
615                         NOT gltrans_deleted
616                     AND
617                         gltrans_posted 
618                     AND
619                         gltrans_date < v_first_open
620
621                 GROUP BY gltrans_accnt_id LOOP
622
623                 IF (_r.v_amount <> 0) THEN
624
625                     v_post := true;
626
627
628                     SELECT insertIntoGLSeries(
629                                 v_glsequence,
630                                 'G/L',
631                                 'JE',
632                                 'FIFO-CMHEAD-' || i_cmhead_number, 
633                                 _r.gltrans_accnt_id,
634                                 _r.v_amount,
635                                v_first_open ) INTO v_result;
636
637                     IF (v_result < 1) THEN
638                         RAISE EXCEPTION 'insertIntoGLSeries SHIP ASS  failed';
639                     END IF;
640                 END IF;
641         END LOOP;
642
643         IF (NOT v_post) THEN
644             RETURN -1;
645         END IF;
646
647         UPDATE glseries
648                     SET glseries_notes='Fifo adjustment for ' || i_cmhead_number
649                     WHERE (glseries_sequence=v_glsequence);
650
651
652
653         SELECT postGLSeriesNoSumm(v_glsequence,COALESCE(NULL,fetchJournalNumber('G/L'))) INTO v_result;
654
655         if (v_result < 1) THEN
656             RAISE EXCEPTION 'post GL seriese failed.';
657         END IF;
658
659         IF v_period_close_at_end > 0 THEN
660             PERFORM period_temp_close(v_period_close_at_end);
661         END IF;
662     END IF;
663        
664     RETURN 0;
665    
666    END;
667 $BODY$
668   LANGUAGE plpgsql VOLATILE
669   COST 100;
670   
671 ALTER FUNCTION  invfifo_apply_gl_cmhead_revert_fifo(text )
672   OWNER TO admin;    
673
674    
675  
676 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_delete_je(i_cmhead_number text)
677     RETURNS  INTEGER
678     
679 AS $BODY$
680 DECLARE        
681     v_first_open DATE;
682     v_period_close_at_end INTEGER;
683     v_ret INTEGER;
684     
685 BEGIN  
686
687     SELECT
688         yearperiod_start
689     INTO
690         v_first_open
691     FROM
692         yearperiod
693     WHERE
694         NOT yearperiod_closed
695
696     ORDER BY
697         yearperiod_start ASC
698     LIMIT 1;
699
700     SELECT period_temp_open(v_first_open) INTO v_period_close_at_end; 
701  
702     PERFORM
703         deleteGlSeries(gltrans_sequence, 'Journal edited by FIFO on ' || to_char(NOW(), 'Day Mon DD YYY') ) 
704         FROM
705             gltrans
706         WHERE
707             gltrans_docnumber = 'FIFO-CMHEAD-' || i_cmhead_number
708         AND
709             gltrans_source = 'G/L'
710         AND
711            gltrans_doctype = 'JE'
712         AND
713             NOT gltrans_deleted
714         AND
715             gltrans_posted
716         AND
717             gltrans_date >= v_first_open;
718         
719     IF v_period_close_at_end > 0 THEN
720         PERFORM period_temp_close(v_period_close_at_end);
721     END IF;
722            
723     RETURN 1;
724    
725    END;
726 $BODY$
727   LANGUAGE plpgsql VOLATILE
728   COST 100;
729   
730 ALTER FUNCTION  invfifo_apply_gl_cmhead_delete_je(text )
731   OWNER TO admin;    
732         
733
734  
735  
736  
737  
738  
739  
740  
741  
742  
743  
744  
745 -------------------- FIFO VALUES ---------------------------        
746           
747 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_fifo_total(integer)
748     RETURNS  NUMERIC
749     
750 AS $BODY$
751 DECLARE        
752     i_cmhead_id  ALIAS FOR $1;
753     v_number TEXT;
754     v_total NUMERIC;
755     v_fifo_qty NUMERIC;
756     v_fifo_total NUMERIC;
757     v_tmp INTEGER;
758     v_ret NUMERIC;
759     
760 BEGIN
761     SELECT
762         
763         cmhead_number
764     INTO
765         v_number
766     
767     FROM
768          
769             cmhead
770         WHERE
771             cmhead_id = i_cmhead_id;
772     
773     
774     -- we can only really tell if there is a problem, if cust_id was not set..
775     
776     select
777             count(invdetail_id)
778         INTO
779             v_tmp
780         FROM
781             invdetailview
782          WHERE
783            
784             invhist_ordnumber = v_number 
785         AND
786             invfifo_cust_id = 0
787         AND
788             -- cm's are not voided.!?!?
789              invfifo_void = 0
790         AND
791            invhist_ordtype = 'CM';
792         
793     
794     IF FOUND AND v_tmp > 0 THEN
795         RAISE EXCEPTION 'FIFO values not calculated  : SELECT invhist_itemsite_id, invfifo_landedunitcost FROM invdetailview where invhist_ordnumber = ''%'' AND invfifo_landedunitcost = 0.0 AND    invhist_ordtype = ''CM'';', v_number;
796     END IF;
797     
798     
799     
800     
801     -- cmitem qty..
802     
803     SELECT
804         -- factor in reserved for non-shpped?
805         SUM(cmitem_qtyreturned)
806     INTO
807         v_total 
808     FROM
809         cmitem
810          
811     LEFT JOIN
812         itemsite
813     ON
814         itemsite_id = cmitem_itemsite_id
815     LEFT JOIN 
816         cmhead
817     ON
818         cmhead_id = cmitem_cmhead_id
819     WHERE
820         cmitem_cmhead_id = i_cmhead_id
821     AND
822         NOT cmhead_void
823     AND
824         itemsite_stocked;
825     
826     -- fifo qty..
827     
828     SELECT
829         COALESCE(SUM(invdetail_qty ),0) ,
830         COALESCE(SUM(invdetail_qty   * invfifo_landedunitcost),0)
831         INTO
832             v_fifo_qty,
833             v_fifo_total
834         FROM
835             invdetailview
836         WHERE
837            
838             invhist_ordnumber = v_number 
839              
840         AND
841             -- cm's are not voided.!?!?
842              invfifo_void = 0
843         AND
844            invhist_ordtype = 'CM';
845     
846     
847       IF v_fifo_qty != v_total THEN
848         RAISE EXCEPTION 'docnum=%, fifo qty for cmhead_id = %  does not match fifo = %, shipped = %',
849                 v_number , i_cmhead_id, v_fifo_qty, v_total;
850     END IF;
851     
852     return v_fifo_total;
853      
854
855
856 END;
857 $BODY$
858   LANGUAGE plpgsql VOLATILE
859   COST 100;
860   
861 ALTER FUNCTION  invfifo_apply_gl_cmhead_fifo_total(integer)
862   OWNER TO admin;    
863     
864     
865 --------------- GL account totals. ----------------------
866   
867
868 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_accnt_total(text, integer)
869     RETURNS  NUMERIC
870     
871 AS $BODY$
872 DECLARE        
873           
874     
875     i_cmhead_number  ALIAS FOR $1;
876     i_accnt_id  ALIAS FOR $2;
877     v_ret NUMERIC;
878     
879 BEGIN
880        
881         
882        
883       SELECT 
884             COALESCE(SUM( gltrans_amount ),0)
885         INTO
886             v_ret
887         FROM
888             gltrans
889         WHERE
890                 gltrans_accnt_id = i_accnt_id
891             AND
892                 gltrans_docnumber = i_cmhead_number
893             
894             AND
895                 NOT gltrans_deleted
896             AND
897                 gltrans_posted
898             AND
899                 gltrans_doctype='CM';
900             
901     RETURN v_ret;    
902             
903 END;
904 $BODY$
905   LANGUAGE plpgsql VOLATILE
906   COST 100;
907   
908 ALTER FUNCTION  invfifo_apply_gl_cmhead_accnt_total(text, integer)
909   OWNER TO admin;  
910
911
912
913
914     
915 --------------- void CM Application WHERE IS THIS USED>>>----------------------
916   
917 --
918 --CREATE OR REPLACE FUNCTION voidCMApplication(i_docnumber TEXT)
919 --    RETURNS  INTEGER
920 --    
921 --AS $BODY$
922 --DECLARE
923 --    v_sequence INTEGER;
924 --    v_resultbool BOOLEAN;
925 --
926 --BEGIN
927 --    SELECT 
928 --            gltrans_sequence
929 --    INTO
930 --            v_sequence
931 --    FROM
932 --            gltrans
933 --    WHERE
934 --            gltrans_docnumber = i_docnumber
935 --        AND
936 --            gltrans_notes = 'CM Application'
937 --        AND
938 --            NOT gltrans_deleted;
939 --
940 --
941 --    IF (NOT FOUND) THEN
942 --        RAISE EXCEPTION 'CM Application not found : %', i_docnumber;
943 --    END IF;
944 --
945 --    SELECT deleteGlSeries(v_sequence ,  'Void CM Application on ' || to_char(NOW(), 'Day Mon DD YYY') ) INTO v_resultbool;
946 --
947 --    RETURN v_sequence;
948 --            
949 --END;
950 --$BODY$
951 --  LANGUAGE plpgsql VOLATILE
952 --  COST 100;
953 --  
954 --ALTER FUNCTION  voidCMApplication(TEXT)
955 --  OWNER TO admin; 
956
957
958
959
960 -- time testing
961
962 -- SELECT invfifo_apply_gl_cmhead(cmhead_id) FROM cmhead;
963         
964