Advertisement
Guest User

Untitled

a guest
Feb 20th, 2020
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.14 KB | None | 0 0
  1. CREATE OR REPLACE FUNCTION in_submit_do_receipt(
  2. bigint,
  3. character varying,
  4. character varying)
  5. RETURNS void AS
  6. $BODY$
  7. DECLARE
  8. pTenantId ALIAS FOR $1;
  9. pSessionId ALIAS FOR $2;
  10. pProcessNo ALIAS FOR $3;
  11.  
  12. vProcessId bigint;
  13. vDoReceiptId bigint;
  14. vUserId bigint;
  15. vDatetime character varying(14);
  16. vFlagInvoice character varying(1);
  17. vEmptyId bigint;
  18. vStatusRelease character varying(1);
  19. vStatusDraft character varying(1);
  20. vStatusFinal character varying(1);
  21. vStatusVoid character varying(1);
  22. vEmptyValue character varying(1);
  23. vProductStatus character varying(5);
  24. vSignDebit character varying(1);
  25. vSignCredit character varying(1);
  26. vTypeRate character varying(3);
  27. vProductCOA character varying(10);
  28. vSystemCOA character varying(10);
  29. vSoId bigint;
  30. vDoId bigint;
  31. vUnfinishedItem bigint;
  32. vParentOuId bigint;
  33. vJournalTrxId bigint;
  34. vJournalType character varying(20);
  35. vOuId bigint;
  36. vOuWarehouseId bigint;
  37. vResult character varying;
  38.  
  39. vDocJournal DOC_JOURNAL%ROWTYPE;
  40. vOuStructure OU_BU_STRUCTURE%ROWTYPE;
  41. vOuStructureJournalItem OU_BU_STRUCTURE%ROWTYPE;
  42. result RECORD;
  43.  
  44. vDoReceiptDocTypeId bigint;
  45. vRoundingModeNonTax character varying(5);
  46. vDoDocTypeId bigint;
  47. vSoDocTypeId bigint;
  48. vSlsInvTempId bigint;
  49. vSlsInvTempDocTypeId bigint;
  50. vNo character varying(5);
  51.  
  52. vRemarkModifyItemSo text;
  53. vAutonumIdModifyItemSo bigint;
  54. vAutonumIdSo bigint;
  55. vDocNoNewSo character varying;
  56. vDocNoModifyItemSo character varying;
  57. vModifyItemSoId bigint;
  58. vDocDate character varying(8);
  59. vRoleId bigint;
  60. vFlgUserRole character varying;
  61. vSchemeDor character varying(20) := 'EA25';
  62. vDocTypeCart bigint;
  63.  
  64. vInvoiceId bigint;
  65. BEGIN
  66.  
  67. vFlagInvoice := 'N';
  68. vEmptyId := -99;
  69. vStatusRelease := 'R';
  70. vStatusVoid := 'V';
  71. vStatusDraft := 'D';
  72. vStatusFinal := 'F';
  73. vEmptyValue := '';
  74. vProductStatus := 'GOOD';
  75. vSignDebit := 'D';
  76. vSignCredit := 'C';
  77. vTypeRate := 'COM';
  78. vProductCOA := 'PRODUCT';
  79. vSystemCOA := 'SYSTEM';
  80. vUnfinishedItem := 0;
  81. vNo := 'N';
  82.  
  83. vDoReceiptDocTypeId = 525;
  84. vDoDocTypeId := 311;
  85. vSoDocTypeId := 301;
  86. vSlsInvTempDocTypeId := 361;
  87. vDocTypeCart := 370;
  88.  
  89. SELECT f_get_value_system_config_by_param_code(pTenantId, 'rounding.mode.non.tax') INTO vRoundingModeNonTax;
  90.  
  91. SELECT A.process_message_id INTO vProcessId
  92. FROM t_process_message A
  93. WHERE A.tenant_id = pTenantId AND
  94. A.process_name = 'in_submit_do_receipt' AND
  95. A.process_no = pProcessNo;
  96.  
  97. SELECT CAST(A.process_parameter_value AS bigint) INTO vDoReceiptId
  98. FROM t_process_parameter A
  99. WHERE A.process_message_id = vProcessId AND
  100. A.process_parameter_key = 'doReceiptId';
  101.  
  102. SELECT CAST(A.process_parameter_value AS bigint) INTO vUserId
  103. FROM t_process_parameter A
  104. WHERE A.process_message_id = vProcessId AND
  105. A.process_parameter_key = 'userId';
  106.  
  107. SELECT CAST(A.process_parameter_value AS character varying(14)) INTO vDatetime
  108. FROM t_process_parameter A
  109. WHERE A.process_message_id = vProcessId AND
  110. A.process_parameter_key = 'datetime';
  111.  
  112. DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId;
  113. /*
  114. * 1. update status doc in_do_receipt
  115. * 2. add sl_log_so_balance_item
  116. * 3. add sl_so_balance_invoice
  117. * 4. add sl_so_balance_invoice_tax
  118. * 5. update sl_so_balance_invoice untuk Do Id
  119. * 6. update sl_so_balance_invoice_tax untuk Do Id
  120. * 7. void sales invoice temporer untuk So Id
  121. * 8. delete data sales invoice temporer dari fi_invoice_ar_balance dan fi_invoice_tax_ar_balance
  122. * 9. add in_log_product_balance_stock
  123. * 10. update in_product_balance_stock
  124. * 11. update in_balance_do_item
  125. * 12. update sl_so_balance_item - status dan qty
  126. * 13. update status sl_so. Jika seluruh balance item sudah final/cancel, maka status menjadi Final.
  127. * 14. add gl_journal_trx
  128. * 15. add gl_journal_trx_item
  129. * 16. add gl_journal_trx_mapping
  130. *
  131. */
  132.  
  133. SELECT A.ref_id, f_get_ou_bu_structure(A.ou_id) AS ou, f_get_document_journal(A.doc_type_id) as doc,
  134. A.doc_date
  135. FROM in_do_receipt A
  136. WHERE A.do_receipt_id = vDoReceiptId INTO result;
  137.  
  138. vDoId := result.ref_id;
  139. vOuStructure := result.ou;
  140. vDocJournal := result.doc;
  141. vDocDate := result.doc_date;
  142.  
  143. SELECT ref_id INTO vSoId
  144. FROM sl_do
  145. WHERE do_id = vDoId;
  146.  
  147. SELECT 'Automatic Modify Item SO from DO receipt items of SO : '||A.doc_no INTO vRemarkModifyItemSo
  148. FROM sl_so A
  149. WHERE A.so_id = vSoId;
  150.  
  151. -- Get role id, flg user role awe submit DO
  152. SELECT role_id, flg_user_role INTO vRoleId, vFlgUserRole
  153. FROM awe_historydoc
  154. WHERE scheme = vSchemeDor
  155. AND doc_id = vDoReceiptId
  156. AND activity = 'SUBMIT';
  157.  
  158. /*
  159. * update status doc in_do_receipt menjadi Release
  160. */
  161. UPDATE in_do_receipt SET status_doc = vStatusRelease, version = version + 1, update_datetime = vDatetime, update_user_id = vUserId
  162. WHERE do_receipt_id = vDoReceiptId;
  163.  
  164. /*
  165. * buat data log sl_log_so_balance_item
  166. */
  167. INSERT INTO sl_log_so_balance_item
  168. (tenant_id, so_id, so_item_id, ref_doc_type_id, ref_id, ref_item_id,
  169. qty_trx, trx_uom_id, qty_int, base_uom_id, remark,
  170. "version", create_datetime, create_user_id, update_datetime, update_user_id)
  171. SELECT A.tenant_id, C.so_id, C.so_item_id, A.doc_type_id, A.do_receipt_id, B.do_receipt_item_id,
  172. B.qty_return * D.qty_so / D.qty_int, D.so_uom_id, B.qty_return, B.uom_id, B.remark,
  173. 0, vDatetime, vUserId, vDatetime, vUserId
  174. FROM in_do_receipt A, in_do_receipt_item B, in_balance_do_item C, sl_so_item D
  175. WHERE A.do_receipt_id = vDoReceiptId AND
  176. A.do_receipt_id = B.do_receipt_id AND
  177. B.ref_id = C.do_item_id AND
  178. C.so_item_id = D.so_item_id AND
  179. B.qty_return > 0;
  180.  
  181. /*
  182. * buat data sl_so_balance_Invoice
  183. * supaya dapat ditarik saat buat sales invoice
  184. */
  185. WITH insert_balance_invoice AS (
  186. SELECT B.product_id, D.qty_so,
  187. -- before
  188. ROUND(D.gross_sell_price * (D.qty_so)) AS gross_amount_before,
  189. D.nett_item_amount AS nett_item_amount_before, D.tax_amount AS tax_amount_after_disc_before,
  190. f_get_gross_amount_after_discount(D.gross_sell_price, D.flg_disc, D.discount_percentage, D.discount_amount,
  191. D.qty_so, f_get_digit_decimal_doc_curr(vSoDocTypeId, D.curr_code)) AS gaad_before,
  192. -- after
  193. ROUND(D.gross_sell_price * (D.qty_so - B.qty_return)) AS gross_amount_after,
  194. f_get_gross_amount_after_discount(D.gross_sell_price, D.flg_disc, D.discount_percentage, D.discount_amount,
  195. (D.qty_so - B.qty_return), f_get_digit_decimal_doc_curr(vSoDocTypeId, D.curr_code)) AS gaad_after,
  196. ROUND(f_get_tax_amount_after_discount(f_get_gross_amount_after_discount(D.gross_sell_price, D.flg_disc, D.discount_percentage, D.discount_amount,
  197. (D.qty_so - B.qty_return), f_get_digit_decimal_doc_curr(vSoDocTypeId, D.curr_code)), flg_tax_amount, tax_percentage, f_get_digit_decimal_doc_curr(vSoDocTypeId, D.curr_code))) AS tax_amount_after_disc_after,
  198. -- other data
  199. A.tenant_id, A.ou_id, E.partner_bill_to_id, C.so_id,
  200. A.ref_doc_type_id, A.ref_id, F.doc_no, F.doc_date, B.ref_id AS ref_item_id, ROUND(B.qty_return * D.qty_so / D.qty_int) AS qty,
  201. D.so_uom_id, D.curr_code, D.nett_sell_price, D.flg_tax_amount, D.tax_percentage,
  202. B.do_receipt_item_id
  203. FROM in_do_receipt A, in_do_receipt_item B, in_balance_do_item C, sl_so_item D, sl_so E, sl_do F, sl_so_balance_invoice G
  204. WHERE A.do_receipt_id = vDoReceiptId AND
  205. A.do_receipt_id = B.do_receipt_id AND
  206. B.ref_id = C.do_item_id AND
  207. C.so_item_id = D.so_item_id AND
  208. D.so_id = E.so_id AND
  209. A.ref_id = F.do_id AND
  210. G.ref_id = F.do_id AND
  211. G.ref_item_id = C.do_item_id AND
  212. B.qty_return > 0
  213. ), diff_summary AS (
  214. SELECT A.product_id, tax_amount_after_disc_before - tax_amount_after_disc_after AS tax_diff,
  215. f_get_dpp_after_discount(A.gaad_before-A.gaad_after, A.flg_tax_amount, A.tax_amount_after_disc_before - A.tax_amount_after_disc_after) AS dpp_after_disc_diff,
  216. (gross_amount_before - gaad_before) - (gross_amount_after - gaad_after) AS disc_amount_diff
  217. FROM insert_balance_invoice A
  218. )
  219. INSERT INTO sl_so_balance_invoice
  220. (tenant_id, ou_id, partner_id, so_id,
  221. ref_doc_type_id, ref_id, ref_doc_no, ref_doc_date, ref_item_id, qty_dlv_so, so_uom_id,
  222. curr_code, price_so, item_amount, flg_invoice, invoice_id,
  223. regular_disc_amount, promo_disc_amount, adj_regular_disc_amount, adj_promo_disc_amount,
  224. "version", create_datetime, create_user_id, update_datetime, update_user_id,
  225. do_receipt_item_id)
  226. SELECT tenant_id, ou_id, partner_bill_to_id, so_id,
  227. ref_doc_type_id, ref_id, doc_no, doc_date, ref_item_id, -1 * qty, so_uom_id,
  228. curr_code, nett_sell_price,
  229. -1 * (B.dpp_after_disc_diff + B.disc_amount_diff),
  230. vFlagInvoice, vEmptyId,
  231. -1 * B.disc_amount_diff, 0, 0, 0,
  232. 0, vDatetime, vUserId, vDatetime, vUserId,
  233. do_receipt_item_id
  234. FROM insert_balance_invoice A
  235. JOIN diff_summary B ON A.product_id = B.product_id;
  236.  
  237.  
  238. /*
  239. * buat data sl_so_balance_invoice_tax
  240. * supaya dapat ditarik saat buat sales invoice
  241. */
  242. WITH insert_balance_invoice_tax AS (
  243. SELECT B.product_id,
  244. -- BEFORE
  245. ROUND(D.gross_sell_price * (D.qty_so)) AS gross_amount_before,
  246. f_get_gross_amount_after_discount(D.gross_sell_price, D.flg_disc, D.discount_percentage, D.discount_amount,
  247. D.qty_so, f_get_digit_decimal_doc_curr(vSoDocTypeId, D.curr_code)) AS gaad_before,
  248. D.tax_amount AS tax_amount_after_disc_before,
  249. -- AFTER
  250. ROUND(D.gross_sell_price * (D.qty_so - B.qty_return)) AS gross_amount_after,
  251. f_get_gross_amount_after_discount(D.gross_sell_price, D.flg_disc, D.discount_percentage, D.discount_amount,
  252. (D.qty_so - B.qty_return), f_get_digit_decimal_doc_curr(vSoDocTypeId, D.curr_code)) AS gaad_after,
  253. ROUND(f_get_tax_amount_after_discount(f_get_gross_amount_after_discount(D.gross_sell_price, D.flg_disc, D.discount_percentage, D.discount_amount,
  254. (D.qty_so - B.qty_return), f_get_digit_decimal_doc_curr(vSoDocTypeId, D.curr_code)), flg_tax_amount, tax_percentage, f_get_digit_decimal_doc_curr(vSoDocTypeId, D.curr_code))) AS tax_amount_after_disc_after,
  255. -- OTHER
  256. A.tenant_id, A.ou_id, F.partner_bill_to_id, C.so_id,
  257. A.ref_doc_type_id, A.ref_id, B.ref_id AS ref_item_id, D.tax_id, E.flg_amount,
  258. D.tax_percentage, D.curr_code, D.flg_tax_amount,
  259. B.do_receipt_item_id
  260. FROM in_do_receipt A, in_do_receipt_item B, in_balance_do_item C, sl_so_item D, m_tax E, sl_so F
  261. WHERE A.do_receipt_id = vDoReceiptId AND
  262. A.do_receipt_id = B.do_receipt_id AND
  263. B.ref_id = C.do_item_id AND
  264. C.so_item_id = D.so_item_id AND
  265. D.tax_id = E.tax_id AND
  266. D.so_id = F.so_id AND
  267. B.qty_return > 0
  268. ), diff_summary AS (
  269. SELECT A.product_id, tax_amount_after_disc_before - tax_amount_after_disc_after AS tax_diff,
  270. f_get_dpp_after_discount(A.gaad_before-A.gaad_after, A.flg_tax_amount, A.tax_amount_after_disc_before - A.tax_amount_after_disc_after) AS dpp_after_disc_diff,
  271. (gross_amount_before - gaad_before) - (gross_amount_after - gaad_after) AS disc_amount_diff
  272. FROM insert_balance_invoice_tax A
  273. )
  274. INSERT INTO sl_so_balance_invoice_tax
  275. (tenant_id, ou_id, partner_id, so_id,
  276. ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  277. tax_percentage, curr_code, base_amount, tax_amount, flg_invoice, invoice_id,
  278. "version", create_datetime, create_user_id, update_datetime, update_user_id,
  279. do_receipt_item_id)
  280. -- SELECT tenant_id, ou_id, partner_bill_to_id, so_id,
  281. -- ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  282. -- tax_percentage, curr_code,
  283. -- -1 * (f_get_dpp_after_discount(gross_after_disc, flg_tax_amount, f_get_tax_amount_after_discount(gross_after_disc, flg_tax_amount, tax_percentage, 0)) + (gross_amount - gross_after_disc)),
  284. -- -1 * f_get_tax_amount_after_discount(gross_after_disc, flg_tax_amount, tax_percentage, 0),
  285. -- vFlagInvoice, vEmptyId,
  286. -- 0, vDatetime, vUserId, vDatetime, vUserId,
  287. -- do_receipt_item_id
  288. SELECT tenant_id, ou_id, partner_bill_to_id, so_id,
  289. ref_doc_type_id, ref_id, ref_item_id, tax_id, flg_amount,
  290. tax_percentage, curr_code,
  291. -1 * (B.dpp_after_disc_diff + B.disc_amount_diff),
  292. -1 * tax_diff,
  293. vFlagInvoice, vEmptyId,
  294. 0, vDatetime, vUserId, vDatetime, vUserId,
  295. do_receipt_item_id
  296. FROM insert_balance_invoice_tax A
  297. JOIN diff_summary B ON A.product_id = B.product_id;
  298.  
  299. /*
  300. * update sl_so_balance_invoice, dan sl_so_balance_invoice_tax
  301. * yang sudah dibuat oleh sales invoice temporer
  302. */
  303. UPDATE sl_so_balance_invoice SET flg_invoice = vFlagInvoice, flg_invoice_temp = vFlagInvoice, invoice_id = vEmptyId
  304. WHERE ref_id = vDoId AND
  305. ref_doc_type_id = vDoDocTypeId;
  306.  
  307. UPDATE sl_so_balance_invoice_tax SET flg_invoice = vFlagInvoice, invoice_id = vEmptyId
  308. WHERE ref_id = vDoId AND
  309. ref_doc_type_id = vDoDocTypeId;
  310.  
  311. /*
  312. * void data sales invoice temporer yang menggunakan DO Item id yang sama dng Do Receipt :
  313. * 1. cari invoice temp id yang memiliki data DO Item yang sama dengan DO Receipt
  314. * 2. update status doc invoice temp sesuai id yang diperoleh di langkah ke 1
  315. */
  316. SELECT A.invoice_temp_id INTO vSlsInvTempId
  317. FROM sl_invoice_temp_item A, in_do_receipt_item B, in_do_receipt C, sl_invoice_temp D
  318. WHERE A.ref_doc_type_id = B.ref_doc_type_id AND
  319. A.ref_id = vDoId AND
  320. A.ref_item_id = B.ref_id AND
  321. B.do_receipt_id = C.do_receipt_id AND
  322. C.ref_id = A.ref_id AND
  323. B.do_receipt_id = vDoReceiptId AND
  324. A.invoice_temp_id = D.invoice_temp_id AND
  325. D.status_doc <> vStatusVoid;
  326.  
  327. UPDATE sl_invoice_temp SET status_doc = vStatusVoid, update_datetime = vDatetime, update_user_id = vUserId
  328. WHERE invoice_temp_id = vSlsInvTempId;
  329.  
  330. /*
  331. * advance invoice harus diupdate juga supaya bisa dipakai lagi
  332. */
  333. UPDATE sl_so_balance_advance_invoice B SET flg_invoice = vFlagInvoice, flg_invoice_temp = vFlagInvoice, invoice_id = vEmptyId
  334. WHERE B.so_id = vSoId
  335. AND EXISTS (
  336. SELECT 1 FROM sl_invoice_temp_advance A
  337. WHERE A.ref_id = B.ref_id
  338. AND A.ref_doc_type_id = B.ref_doc_type_id
  339. AND A.invoice_temp_id = vSlsInvTempId
  340. );
  341.  
  342.  
  343. /*
  344. * nomor faktur pajak boleh digunakan kembali untuk temp sales invoice yang di void gara2 DO Receipt
  345. *
  346. */
  347. UPDATE m_gen_tax_number A
  348. SET invoice_id = vEmptyId, invoice_doc_type_id = vEmptyId, invoice_doc_no = vEmptyValue, invoice_doc_date = vEmptyValue
  349. FROM sl_invoice_temp B
  350. WHERE A.invoice_doc_no = B.inv_doc_no
  351. AND A.invoice_doc_date = B.inv_doc_date
  352. AND A.invoice_doc_type_id = B.doc_type_id
  353. AND A.invoice_id = vSlsInvTempId
  354. AND B.invoice_temp_id = vSlsInvTempId;
  355.  
  356. /*
  357. * delete data sales invoice temporer dari fi_invoice_ar_balance dan fi_invoice_tax_ar_balance
  358. */
  359.  
  360. DELETE FROM fi_invoice_tax_ar_balance A
  361. WHERE A.tenant_id = pTenantId AND
  362. EXISTS (
  363. SELECT 1 FROM fi_invoice_ar_balance B
  364. WHERE A.tenant_id = B.tenant_id
  365. AND A.invoice_ar_balance_id = B.invoice_ar_balance_id
  366. AND B.doc_type_id = vSlsInvTempDocTypeId
  367. AND B.invoice_ar_id = vSlsInvTempId
  368. );
  369.  
  370. DELETE FROM fi_invoice_ar_balance A
  371. WHERE A.tenant_id = pTenantId AND
  372. A.doc_type_id = vSlsInvTempDocTypeId AND
  373. A.invoice_ar_id = vSlsInvTempId;
  374.  
  375.  
  376. /*
  377. * buat data log product balance stock
  378. * ref item id = do_receipt_id
  379. */
  380. INSERT INTO in_log_product_balance_stock
  381. (tenant_id, ou_id, doc_type_id, ref_id, doc_no, doc_date, partner_id,
  382. product_id, product_balance_id, warehouse_id, product_status, base_uom_id, qty,
  383. "version", create_datetime, create_user_id, update_datetime, update_user_id)
  384. SELECT A.tenant_id, E.ou_id, A.doc_type_id, A.do_receipt_id, A.doc_no, A.doc_date, D.partner_ship_to_id,
  385. C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.uom_id, SUM(C.qty_return),
  386. 0, vDatetime, vUserId, vDatetime, vUserId
  387. FROM in_do_receipt A, in_do_receipt_item B, in_do_receipt_product C, sl_do D, m_warehouse_ou E
  388. WHERE A.do_receipt_id = vDoReceiptId AND
  389. A.do_receipt_id = B.do_receipt_id AND
  390. B.do_receipt_item_id = C.do_receipt_item_id AND
  391. A.ref_id = D.do_id AND
  392. A.warehouse_id = E.warehouse_id
  393. GROUP BY A.tenant_id, E.ou_id, A.doc_type_id, A.do_receipt_id, A.doc_no, A.doc_date, D.partner_ship_to_id,
  394. C.product_id, C.product_balance_id, A.warehouse_id, C.product_status, C.uom_id;
  395.  
  396. /*
  397. * update in_product_balance_stock
  398. * mod by Didit, 30 Des 2016
  399. * perbaiki jika ada 1 produk yang sama (product dan product balance) tapi ada lebih dari 1 record di tabel itemnya akan menjadi salah
  400. */
  401. WITH tt_in_product_balance_summary AS (
  402. SELECT C.product_id, C.tenant_id, A.warehouse_id, C.product_balance_id, C.product_status, SUM(C.qty_return) AS qty_return
  403. FROM in_do_receipt A, in_do_receipt_item B, in_do_receipt_product C
  404. WHERE A.do_receipt_id = vDoReceiptId
  405. AND A.do_receipt_id = B.do_receipt_id
  406. AND B.do_receipt_item_id = C.do_receipt_item_id
  407. AND C.qty_return > 0
  408. GROUP BY C.product_id, C.tenant_id, A.warehouse_id, C.product_balance_id, C.product_status
  409. )
  410. UPDATE in_product_balance_stock SET qty = qty + A.qty_return, update_datetime = vDatetime, update_user_id = vUserId, version = version + 1
  411. FROM tt_in_product_balance_summary A
  412. WHERE in_product_balance_stock.product_id = A.product_id AND
  413. in_product_balance_stock.tenant_id = A.tenant_id AND
  414. in_product_balance_stock.warehouse_id = A.warehouse_id AND
  415. in_product_balance_stock.product_balance_id = A.product_balance_id AND
  416. in_product_balance_stock.product_status = A.product_status;
  417.  
  418. /*
  419. * update data balance do item sehubungan dengan product yang dikembalian/tidak diterima oleh customer,
  420. * sehingga saat akan membuat return note, hanya barang yang memang diterima oleh customer
  421. */
  422. UPDATE in_balance_do_item SET qty_dlv_int = qty_dlv_int - A.qty_return,
  423. qty_dlv = in_balance_do_item.qty_dlv - (A.qty_return * in_balance_do_item.qty_dlv / in_balance_do_item.qty_dlv_int),
  424. status_item = vStatusRelease, update_datetime = vDatetime, update_user_id = vUserId
  425. FROM in_do_receipt_item A
  426. WHERE A.do_receipt_id = vDoReceiptId AND
  427. in_balance_do_item.do_item_id = A.ref_id AND
  428. A.qty_return > 0;
  429.  
  430. UPDATE in_balance_do_item
  431. SET status_item = vStatusRelease,
  432. update_datetime = vDatetime,
  433. update_user_id = vUserId
  434. FROM in_do_receipt A
  435. WHERE A.do_receipt_id = vDoReceiptId AND
  436. in_balance_do_item.do_id = A.ref_id AND
  437. A.ref_doc_type_id = vDoDocTypeId;
  438.  
  439. /*
  440. * update status SO seperti semula
  441. */
  442. UPDATE sl_so
  443. SET status_doc = flg_old_status,
  444. flg_old_status = vEmptyValue,
  445. update_datetime = vDatetime,
  446. update_user_id = vUserId,
  447. version = version + 1
  448. WHERE so_id = vSoId;
  449.  
  450. /*
  451. * update flg invoice so balance inv
  452. */
  453. UPDATE sl_so_balance_invoice
  454. SET flg_invoice = vNo,
  455. update_datetime = vDatetime,
  456. update_user_id = vUserId,
  457. version = version + 1
  458. WHERE so_id = vSoId
  459. AND ref_id = vDoId;
  460.  
  461. /*
  462. * update status so balance item
  463. */
  464. UPDATE sl_so_balance_item B
  465. SET status_item = B.flg_old_status,
  466. flg_old_status = vEmptyValue,
  467. update_datetime = vDatetime,
  468. update_user_id = vUserId,
  469. version = B.version + 1
  470. FROM sl_so A
  471. INNER JOIN sl_so_item C ON A.so_id = C.so_id
  472. INNER JOIN sl_do_item D ON D.ref_id = C.so_item_id
  473. WHERE B.so_item_id = C.so_item_id
  474. AND A.so_id = vSoId
  475. AND D.do_id = vDoId;
  476.  
  477. /*
  478. * status item SO akan berubah menjadi Release, karena ada nya barang yang dikembalikan oleh customer
  479. */
  480. UPDATE sl_so_balance_item SET qty_dlv = sl_so_balance_item.qty_dlv - (A.qty_return * sl_so_balance_item.qty_so / sl_so_balance_item.qty_so_int),
  481. qty_dlv_int = sl_so_balance_item.qty_dlv_int - A.qty_return,
  482. status_item = vStatusRelease
  483. FROM in_do_receipt_item A, in_balance_do_item B
  484. WHERE A.do_receipt_id = vDoReceiptId AND
  485. A.ref_id = B.do_item_id AND
  486. sl_so_balance_item.so_item_id = B.so_item_id AND
  487. A.qty_return > 0;
  488.  
  489. UPDATE sl_so SET status_doc = vStatusRelease
  490. WHERE so_id = vSoId;
  491.  
  492. -- Buat invoice temp
  493. SELECT sl_automatic_create_temporary_sales_invoice_from_do_receipt(pSessionId, pTenantId, vUserId, vDatetime, vSoId, vDoId) INTO vResult;
  494.  
  495. IF NOT EXISTS (
  496. SELECT 1
  497. FROM sl_invoice_temp A
  498. WHERE A.ref_id = vSoId
  499. AND A.status_doc <> 'V'
  500. AND A.gross_amount = 0
  501. )
  502. THEN
  503. -- Buat invoice dari invoice temp bila nilai temp SI > 0
  504. SELECT sl_automatic_create_sales_invoice_from_temp_sales_invoice(pSessionId, pTenantId, vUserId, vDatetime, vSoId, vDoId) INTO vResult;
  505.  
  506. SELECT A.invoice_id into vInvoiceId
  507. FROM sl_invoice A
  508. WHERE A.ref_id = vSoId
  509. AND A.ref_doc_type_id = vSoDocTypeId;
  510.  
  511. UPDATE fi_ar_edc_settlement A
  512. SET invoice_amount = B.total_amount,
  513. invoice_tax_amount = B.tax_amount,
  514. reward_amount = A.amount_payment - B.total_amount,
  515. invoice_id = vInvoiceId
  516. FROM sl_invoice B
  517. WHERE A.so_id = B.ref_id
  518. AND B.ref_doc_type_id = vSoDocTypeId
  519. AND A.so_id = vSoId;
  520.  
  521. PERFORM cb_add_cn_ar_from_balance_partstation(pSessionId, pTenantId, vSoId, vUserId, vDatetime);
  522.  
  523. PERFORM cb_add_dn_ar_from_balance_partstation(pSessionId, pTenantId, vSoId, vUserId, vDatetime)
  524. FROM fi_ar_edc_settlement A
  525. WHERE A.so_id = vSoId
  526. AND A.reward_amount > 0;
  527.  
  528. PERFORM fi_alloc_sls_inv_edc(pTenantId, pSessionId, A.cn_ar_id, A.dn_ar_id, A.invoice_id, B.ou_id, A.partner_id, vUserId, vDatetime)
  529. FROM fi_ar_edc_settlement A
  530. INNER JOIN sl_so B ON B.so_id = A.so_id
  531. WHERE A.so_id = vSoId;
  532.  
  533. END IF;
  534.  
  535. /*
  536. * @author TKP, 9 Jun 2016
  537. * Cek jika OU pada warehouse sama dengan OU pada dokumen maka nilai ou_bu_id dan ou_sub_bu_id =-99
  538. * jika OU pada warehouse tidak sama dengan OU pada dokumen maka nilai ou_bu_id dan ou_sub_bu_id didapat pada f_get_ou_bu_structure;
  539. */
  540.  
  541. SELECT A.ou_id, B.ou_id INTO vOuId, vOuWarehouseId
  542. FROM in_do_receipt A
  543. INNER JOIN m_warehouse_ou B ON A.warehouse_id = B.warehouse_id
  544. WHERE A.do_receipt_id = vDoReceiptId;
  545.  
  546. IF (vOuId <> vOuWarehouseId) THEN
  547. SELECT f_get_ou_bu_structure(vOuWarehouseId) as ou_structure INTO result;
  548. vOuStructureJournalItem := result.ou_structure;
  549. ELSE
  550. vOuStructureJournalItem := ROW(-99, -99, -99);
  551. END IF;
  552.  
  553. /*
  554. * membuat data transaksi jurnal :
  555. * 1. buat admin
  556. * 2. buat temlate jurnal
  557. */
  558.  
  559. PERFORM gl_manage_admin_journal_trx(A.tenant_id, (vOuStructure).ou_bu_id, A.ou_id, (vDocJournal).journal_type, (vDocJournal).ledger_code, f_get_year_month_date(A.doc_date), 'MONTHLY', vDatetime, vUserId)
  560. FROM in_do_receipt A
  561. WHERE A.do_receipt_id = vDoReceiptId;
  562.  
  563. SELECT NEXTVAL('gl_journal_trx_seq') INTO vJournalTrxId;
  564.  
  565. INSERT INTO gl_journal_trx
  566. (journal_trx_id, tenant_id, journal_type, doc_type_id, doc_id, doc_no, doc_date,
  567. ou_bu_id, ou_branch_id, ou_sub_bu_id, partner_id, cashbank_id, warehouse_id, ext_doc_no, ext_doc_date,
  568. ref_doc_type_id, ref_id, due_date, curr_code, remark, status_doc, workflow_status,
  569. "version", create_datetime, create_user_id, update_datetime, update_user_id)
  570. SELECT vJournalTrxId, A.tenant_id, (vDocJournal).journal_type, A.doc_type_id, A.do_receipt_id, A.doc_no, A.doc_date,
  571. (vOuStructure).ou_bu_id, (vOuStructure).ou_branch_id, (vOuStructure).ou_sub_bu_id, B.partner_ship_to_id, vEmptyId, A.warehouse_id, A.ext_doc_no, A.ext_doc_date,
  572. A.ref_doc_type_id, A.ref_id, A.doc_date, C.curr_code, A.remark, vStatusDraft, 'DRAFT',
  573. 0, vDatetime, vUserId, vDatetime, vUserId
  574. FROM in_do_receipt A, sl_do B, sl_so C
  575. WHERE A.do_receipt_id = vDoReceiptId AND
  576. A.ref_id = B.do_id AND
  577. B.ref_id = C.so_id;
  578.  
  579. INSERT INTO tt_journal_trx_item
  580. (session_id, tenant_id, journal_trx_id, line_no,
  581. ref_doc_type_id, ref_id,
  582. partner_id, product_id, cashbank_id, ou_rc_id,
  583. segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  584. coa_id, curr_code, qty, uom_id,
  585. amount, journal_date, type_rate,
  586. numerator_rate, denominator_rate, journal_desc, remark)
  587. SELECT pSessionId, A.tenant_id, vJournalTrxId, 1,
  588. A.doc_type_id, B.do_receipt_item_id,
  589. C.partner_ship_to_id, B.product_id, vEmptyId, vEmptyId,
  590. vEmptyId, vSignDebit, vProductCOA, vEmptyId,
  591. f_get_product_coa_group_product(A.tenant_id, B.product_id), f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), B.qty_return, B.uom_id,
  592. 0, A.doc_date, vTypeRate,
  593. 1, 1, 'PRODUCT_STOCK', B.remark
  594. FROM in_do_receipt A, in_do_receipt_item B, sl_do C
  595. WHERE A.do_receipt_id = vDoReceiptId AND
  596. A.do_receipt_id = B.do_receipt_id AND
  597. A.ref_id = C.do_id;
  598.  
  599. INSERT INTO gl_journal_trx_item
  600. (tenant_id, journal_trx_id, line_no,
  601. ref_doc_type_id, ref_id,
  602. partner_id, product_id, cashbank_id, ou_rc_id,
  603. segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  604. coa_id, curr_code, qty, uom_id,
  605. amount, journal_date, type_rate,
  606. numerator_rate, denominator_rate, journal_desc, remark,
  607. "version", create_datetime, create_user_id, update_datetime, update_user_id,
  608. ou_branch_id, ou_sub_bu_id)
  609. SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id),
  610. A.ref_doc_type_id, A.ref_id,
  611. A.partner_id, A.product_id, A.cashbank_id, A.ou_rc_id,
  612. A.segmen_id, A.sign_journal, A.flg_source_coa, A.activity_gl_id,
  613. A.coa_id, A.curr_code, A.qty, A.uom_id,
  614. A.amount, A.journal_date, A.type_rate,
  615. A.numerator_rate, A.denominator_rate, A.journal_desc, A.remark,
  616. 0, vDatetime, vUserId, vDatetime, vUserId,
  617. (vOuStructureJournalItem).ou_branch_id, (vOuStructureJournalItem).ou_sub_bu_id
  618. FROM tt_journal_trx_item A
  619. WHERE A.session_id = pSessionId;
  620.  
  621. INSERT INTO gl_journal_trx_mapping
  622. (tenant_id, journal_trx_id, line_no,
  623. ref_doc_type_id, ref_id,
  624. partner_id, product_id, cashbank_id, ou_rc_id,
  625. segmen_id, sign_journal, flg_source_coa, activity_gl_id,
  626. coa_id, curr_code, qty, uom_id,
  627. amount, journal_date, type_rate,
  628. numerator_rate, denominator_rate, journal_desc, remark,
  629. "version", create_datetime, create_user_id, update_datetime, update_user_id)
  630. SELECT A.tenant_id, A.journal_trx_id, ROW_NUMBER() OVER ( PARTITION BY A.journal_trx_id ),
  631. vEmptyId, vEmptyId,
  632. vEmptyId, vEmptyId, vEmptyId, vEmptyId,
  633. vEmptyId, vSignCredit, vSystemCOA, vEmptyId,
  634. f_get_system_coa_by_group_coa(A.tenant_id, 'HargaPokokPenjualan'), f_get_value_system_config_by_param_code(pTenantId, 'ValutaBuku'), 0, vEmptyId,
  635. 0, A.journal_date, A.type_rate,
  636. 1, 1, 'COGS', vEmptyValue,
  637. 0, vDatetime, vUserId, vDatetime, vUserId
  638. FROM tt_journal_trx_item A
  639. WHERE A.session_id = pSessionId
  640. GROUP BY A.tenant_id, A.journal_trx_id, A.journal_date, A.type_rate;
  641.  
  642. -- PROSES modify item dan create SO --
  643. -- Ambil autonum id Cancel SO
  644. SELECT A.process_parameter_value::bigint INTO vAutonumIdModifyItemSo
  645. FROM t_process_parameter A
  646. WHERE A.process_message_id = vProcessId
  647. AND A.process_parameter_key = 'autonumIdModifyItemSo';
  648.  
  649. -- Ambil doc no Cancel SO
  650. SELECT A.process_parameter_value INTO vDocNoModifyItemSo
  651. FROM t_process_parameter A
  652. WHERE A.process_message_id = vProcessId
  653. AND A.process_parameter_key = 'autonumModifyItemSo';
  654.  
  655. IF EXISTS(
  656. SELECT 1
  657. FROM sl_do A
  658. INNER JOIN sl_so_item C ON A.ref_id = C.so_id
  659. INNER JOIN sl_so D ON C.so_id = D.so_id
  660. WHERE A.do_id = vDoId AND D.ref_doc_type_id = vDocTypeCart
  661. )
  662. THEN
  663.  
  664. PERFORM sl_add_cancel_item_so(pTenantId, pSessionId, vDatetime, vSoId, vUserId);
  665.  
  666. ELSE
  667. -- Buatkan modify item SO ( APPROVED ), Function akan mengembalikan cancel so id yang akan di gunakan di pembuatan SO baru
  668. SELECT sl_automatic_modify_item_so_for_do_receipt(pSessionId, pTenantId, vUserId, vRoleId, vFlgUserRole, vDatetime, vSoId, vOuId, vAutonumIdModifyItemSo, vDocNoModifyItemSo, vDocDate, vRemarkModifyItemSo) INTO vModifyItemSoId;
  669.  
  670. SELECT A.process_parameter_value::bigint INTO vAutonumIdSo
  671. FROM t_process_parameter A
  672. WHERE A.process_message_id = vProcessId
  673. AND A.process_parameter_key = 'autonumIdSo';
  674.  
  675. -- Ambil doc no SO baru
  676. SELECT A.process_parameter_value INTO vDocNoNewSo
  677. FROM t_process_parameter A
  678. WHERE A.process_message_id = vProcessId
  679. AND A.process_parameter_key = 'autonumSo';
  680.  
  681. -- Buatkan SO baru ( APPROVED )
  682. PERFORM sl_automatic_so_for_do_receipt(pSessionId, pTenantId, vUserId, vRoleId, vFlgUserRole, vDatetime, vSoId, vDoReceiptId, vAutonumIdSo, vDocNoNewSo, vDocDate, vModifyItemSoId);
  683.  
  684. END IF;
  685.  
  686. DELETE FROM tt_journal_trx_item WHERE session_id = pSessionId;
  687. END;
  688. $BODY$
  689. LANGUAGE plpgsql VOLATILE
  690. COST 100;
  691. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement