1 -- apply the fifo values to the general ledger for a credit memos.
4 -- cm's are invhist_ordtype = 'CM'
7 -- for a specific cohead
8 -- fetch the total value of system created transactions
9 -- eg. Ship/return issue etc...
11 -- find the value we have created as an adjustment (if any.)
13 -- calculate the correct values
14 -- update or create a JE for this.
17 -- SELECT invfifo_apply_gl_cmhead(cmhead_id) FROM cmhead ORDER BY cmhead_id ASC ;
19 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_all()
24 v_period_close_at_end INTEGER;
29 period_temp_open(period_start)
37 period_yearperiod_id = yearperiod_id
46 invfifo_apply_gl_cmhead(cmhead_id)
48 SELECT cmhead_id FROM cmhead ORDER BY cmhead_id ASC
51 IF v_period_close_at_end > 0 THEN
52 PERFORM period_temp_close(v_period_close_at_end);
59 LANGUAGE plpgsql VOLATILE
62 ALTER FUNCTION invfifo_apply_gl_cmhead_all()
67 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead(integer)
72 i_cmhead_id ALIAS FOR $1;
76 v_asset_accnt_id INTEGER;
77 v_cogs_accnt_id INTEGER;
79 v_cogs_adj_total NUMERIC;
80 v_ship_adj_total NUMERIC;
81 v_asset_adj_total NUMERIC;
87 v_posted_cogs NUMERIC;
88 v_posted_asset NUMERIC;
102 v_num_no_purchase INTEGER;
103 v_resultbool BOOLEAN;
105 v_period_close_at_end INTEGER;
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..
117 -- let's start with basics
118 -- from cost categories
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;
132 cmhead_id = i_cmhead_id
137 RETURN 'skipped = not posted';
149 itemsite_id = cmitem_itemsite_id
151 cmitem_cmhead_id = i_cmhead_id
155 if v_item_cnt < 1 THEN
156 RETURN 'skipped = not an item based order';
160 SELECT count(distinct salesaccnt_cos_accnt_id) INTO v_tmp FROM salesaccnt;
162 RAISE EXCEPTION 'multiple cogs accounts not supported';
165 SELECT DISTINCT(salesaccnt_cos_accnt_id) INTO v_cogs_accnt_id FROM salesaccnt;
168 SELECT count(distinct costcat_id) INTO v_tmp FROM costcat;
170 RAISE EXCEPTION 'multiple cost categories accounts not supported';
174 costcat_asset_accnt_id
189 cmhead_id = i_cmhead_id;
192 --RAISE NOTICE 'cmhead_id = %', i_cmhead_id;
194 gltrans_accnt_id | accnt_descrip
195 ------------------+-----------------------------
196 121 | Customer Credits
197 123 | G/L Discrepancy
199 148 | Inventory Asset << relivant
200 149 | Cost of Goods Sold << relivant
201 159 | Accounts Receivable (HK HQ)
204 --RAISE NOTICE 'BEFORE TOTALS START % ', clock_timestamp();
207 -- 0.632 ms without..
209 ROUND(invfifo_apply_gl_cmhead_fifo_total(i_cmhead_id),2),
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),
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
228 -- 600 ms iwth all of this..
229 -- probably need to verify that cogs/inventory match..!?!?
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;
235 RAISE NOTICE ' values: total total issued=% posted: cogs(%)=%, asset(%)=% adjbefore cogs=%, asset=%',
249 SELECT invfifo_apply_gl_cmhead_fetch_je_sequence(v_cmhead_number) INTO v_glsequence;
258 -- delete old difference...
260 IF v_glsequence > 0 THEN
262 PERFORM invfifo_apply_gl_cmhead_revert_fifo(v_cmhead_number);
266 RETURN 'NO FIFO DIFFERNECE';
270 IF (v_adj_cogs = v_cogsdiff AND v_assetdiff = v_adj_asset ) THEN
271 RETURN 'adjustment already exists';
274 IF v_glsequence > 0 THEN
276 PERFORM invfifo_apply_gl_cmhead_revert_fifo(v_cmhead_number);
281 if ((v_cogsdiff + v_assetdiff) != 0.0) THEN
282 RAISE EXCEPTION 'adjustment does not balance';
286 -- what date to post..
288 -- what is the last shipment?
290 MAX(cmhead_gldistdate)
296 cmhead_id = i_cmhead_id;
300 RAISE EXCEPTION 'could not find a cmhead? for order %' , i_cmhead_id;
303 RAISE NOTICE 'shipdate : %', v_date;
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!';
310 IF v_date <= v_start_date::date THEN
311 RAISE NOTICE 'ignoring transaction before start date';
316 -- find the first open period..
324 NOT yearperiod_closed
331 IF v_first_open >= v_date THEN
332 v_date = v_first_open ;
336 RAISE NOTICE 'shipdate after checking period: %', v_date;
340 SELECT period_temp_open(v_date) INTO v_period_close_at_end;
344 SELECT fetchGLSequence() INTO v_glsequence;
350 SELECT insertIntoGLSeries(
354 'FIFO-CMHEAD-' || v_cmhead_number,
355 v_asset_accnt_id, -- cogs
357 v_date ) INTO v_result;
359 if (v_result < 1) THEN
362 RAISE EXCEPTION 'insertIntoGLSeries INV ASS failed';
369 SELECT insertIntoGLSeries(
373 'FIFO-CMHEAD-' || v_cmhead_number,
374 v_cogs_accnt_id, -- cogs
376 v_date ) INTO v_result;
378 if (v_result < 1) THEN
381 RAISE EXCEPTION 'insertIntoGLSeries INV ASS failed';
385 SET glseries_notes='Fifo adjustment for ' || v_cmhead_number
386 WHERE (glseries_sequence=v_glsequence);
390 SELECT postGLSeriesNoSumm(v_glsequence,COALESCE(NULL,fetchJournalNumber('G/L'))) INTO v_result;
392 if (v_result < 1) THEN
393 RAISE EXCEPTION 'post GL seriese failed';
396 IF v_period_close_at_end > 0 THEN
397 PERFORM period_temp_close(v_period_close_at_end);
401 RETURN 'CHANGE: cogs=' || v_cogsdiff || ' asset=' || v_assetdiff;
407 LANGUAGE plpgsql VOLATILE
410 ALTER FUNCTION invfifo_apply_gl_cmhead(integer)
414 -------------------- FIFO ADJ ---------------------------
416 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_fetch_je_amount(text, integer)
421 i_cmhead_number ALIAS FOR $1;
422 i_accnt_id ALIAS FOR $2;
429 SUM(COALESCE(gltrans_amount,0))
435 gltrans_docnumber = 'FIFO-CMHEAD-' || i_cmhead_number
437 gltrans_accnt_id = i_accnt_id
439 gltrans_source = 'G/L'
441 gltrans_doctype = 'JE'
451 LANGUAGE plpgsql VOLATILE
454 ALTER FUNCTION invfifo_apply_gl_cmhead_fetch_je_amount(text, integer)
458 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_fetch_je_sequence(text)
463 i_cmhead_number ALIAS FOR $1;
470 COALESCE(gltrans_sequence,0)
476 gltrans_docnumber = 'FIFO-CMHEAD-' || i_cmhead_number
478 gltrans_source = 'G/L'
480 gltrans_doctype = 'JE'
491 LANGUAGE plpgsql VOLATILE
494 ALTER FUNCTION invfifo_apply_gl_cmhead_fetch_je_sequence(text )
499 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_fetch_je_date(i_cmhead_number text)
516 gltrans_docnumber = 'FIFO-CMHEAD-' || i_cmhead_number
518 gltrans_source = 'G/L'
520 gltrans_doctype = 'JE'
531 LANGUAGE plpgsql VOLATILE
534 ALTER FUNCTION invfifo_apply_gl_cmhead_fetch_je_date(text )
538 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_revert_fifo(i_cmhead_number text)
547 v_glsequence INTEGER;
552 v_period_close_at_end INTEGER;
565 NOT yearperiod_closed
580 gltrans_docnumber = 'FIFO-CMHEAD-' || i_cmhead_number
582 gltrans_source = 'G/L'
584 gltrans_doctype = 'JE'
591 IF (v_max_date >= v_first_open) THEN
592 PERFORM invfifo_apply_gl_cmhead_delete_je(i_cmhead_number);
595 IF (v_min_date < v_first_open) THEN
597 SELECT period_temp_open(v_first_open) INTO v_period_close_at_end;
599 SELECT fetchGLSequence() INTO v_glsequence;
604 COALESCE(SUM(gltrans_amount * -1), 0) AS v_amount,
609 gltrans_docnumber = 'FIFO-CMHEAD-' || i_cmhead_number
611 gltrans_source = 'G/L'
613 gltrans_doctype = 'JE'
619 gltrans_date < v_first_open
621 GROUP BY gltrans_accnt_id LOOP
623 IF (_r.v_amount <> 0) THEN
628 SELECT insertIntoGLSeries(
632 'FIFO-CMHEAD-' || i_cmhead_number,
635 v_first_open ) INTO v_result;
637 IF (v_result < 1) THEN
638 RAISE EXCEPTION 'insertIntoGLSeries SHIP ASS failed';
648 SET glseries_notes='Fifo adjustment for ' || i_cmhead_number
649 WHERE (glseries_sequence=v_glsequence);
653 SELECT postGLSeriesNoSumm(v_glsequence,COALESCE(NULL,fetchJournalNumber('G/L'))) INTO v_result;
655 if (v_result < 1) THEN
656 RAISE EXCEPTION 'post GL seriese failed.';
659 IF v_period_close_at_end > 0 THEN
660 PERFORM period_temp_close(v_period_close_at_end);
668 LANGUAGE plpgsql VOLATILE
671 ALTER FUNCTION invfifo_apply_gl_cmhead_revert_fifo(text )
676 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_delete_je(i_cmhead_number text)
682 v_period_close_at_end INTEGER;
694 NOT yearperiod_closed
700 SELECT period_temp_open(v_first_open) INTO v_period_close_at_end;
703 deleteGlSeries(gltrans_sequence, 'Journal edited by FIFO on ' || to_char(NOW(), 'Day Mon DD YYY') )
707 gltrans_docnumber = 'FIFO-CMHEAD-' || i_cmhead_number
709 gltrans_source = 'G/L'
711 gltrans_doctype = 'JE'
717 gltrans_date >= v_first_open;
719 IF v_period_close_at_end > 0 THEN
720 PERFORM period_temp_close(v_period_close_at_end);
727 LANGUAGE plpgsql VOLATILE
730 ALTER FUNCTION invfifo_apply_gl_cmhead_delete_je(text )
745 -------------------- FIFO VALUES ---------------------------
747 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_fifo_total(integer)
752 i_cmhead_id ALIAS FOR $1;
756 v_fifo_total NUMERIC;
771 cmhead_id = i_cmhead_id;
774 -- we can only really tell if there is a problem, if cust_id was not set..
784 invhist_ordnumber = v_number
788 -- cm's are not voided.!?!?
791 invhist_ordtype = 'CM';
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;
804 -- factor in reserved for non-shpped?
805 SUM(cmitem_qtyreturned)
814 itemsite_id = cmitem_itemsite_id
818 cmhead_id = cmitem_cmhead_id
820 cmitem_cmhead_id = i_cmhead_id
829 COALESCE(SUM(invdetail_qty ),0) ,
830 COALESCE(SUM(invdetail_qty * invfifo_landedunitcost),0)
838 invhist_ordnumber = v_number
841 -- cm's are not voided.!?!?
844 invhist_ordtype = 'CM';
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;
858 LANGUAGE plpgsql VOLATILE
861 ALTER FUNCTION invfifo_apply_gl_cmhead_fifo_total(integer)
865 --------------- GL account totals. ----------------------
868 CREATE OR REPLACE FUNCTION invfifo_apply_gl_cmhead_accnt_total(text, integer)
875 i_cmhead_number ALIAS FOR $1;
876 i_accnt_id ALIAS FOR $2;
884 COALESCE(SUM( gltrans_amount ),0)
890 gltrans_accnt_id = i_accnt_id
892 gltrans_docnumber = i_cmhead_number
899 gltrans_doctype='CM';
905 LANGUAGE plpgsql VOLATILE
908 ALTER FUNCTION invfifo_apply_gl_cmhead_accnt_total(text, integer)
915 --------------- void CM Application WHERE IS THIS USED>>>----------------------
918 --CREATE OR REPLACE FUNCTION voidCMApplication(i_docnumber TEXT)
923 -- v_sequence INTEGER;
924 -- v_resultbool BOOLEAN;
934 -- gltrans_docnumber = i_docnumber
936 -- gltrans_notes = 'CM Application'
938 -- NOT gltrans_deleted;
941 -- IF (NOT FOUND) THEN
942 -- RAISE EXCEPTION 'CM Application not found : %', i_docnumber;
945 -- SELECT deleteGlSeries(v_sequence , 'Void CM Application on ' || to_char(NOW(), 'Day Mon DD YYY') ) INTO v_resultbool;
947 -- RETURN v_sequence;
951 -- LANGUAGE plpgsql VOLATILE
954 --ALTER FUNCTION voidCMApplication(TEXT)
962 -- SELECT invfifo_apply_gl_cmhead(cmhead_id) FROM cmhead;