{"id":85,"date":"2013-12-08T03:38:06","date_gmt":"2013-12-08T03:38:06","guid":{"rendered":"http:\/\/blog.goodwill.co.id\/?p=85"},"modified":"2013-12-08T03:38:06","modified_gmt":"2013-12-08T03:38:06","slug":"recalculating-average-costing-backwardly","status":"publish","type":"post","link":"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/","title":{"rendered":"Recalculating average costing backwardly"},"content":{"rendered":"<p>Dealing with average costing could be a nightmare for most of us. Chuck Boecking, a fellow Adempiere consultant based in US explained it very well in\u00a0<a href=\"http:\/\/www.chuckboecking.com\/blog\/bid\/329233\/Why-Choose-Average-Invoice-in-a-Perpetual-Accounting-System-or-ERPhttp:\/\/\">his blog\u00a0<\/a>why we (not to) choose average costing in a ERP.<\/p>\n<p>ERP is a perpetual inventory accounting system. Therefore, the system\u00a0 will post every inventory transaction as they happen. When you use average invoicing, your inventory valuation will almost always be inaccurate. For example, Let&#8217;s assume\u00a0you buy a bunch of products over time over different costs. Then, over time, you sell all product. The resulting inventory GL balance will almost always be non-zero. Therefore, you will have a phantom inventory balance. If your operations are even a little complex, the variances that result from average invoice costing can be difficult to track and explain.<\/p>\n<p>Most of the time we heard about recommendation on using Standard Costing as a way to escape from this nightmare. In earlier release of Compiere (v. 2.5), even there are only Standard Costing and Last PO price method. However in Indonesia, the requirement for standard accounting practice is to use either Average Costing or FIFO\/LIFO. I still can recall back in 2005 how our team had to develop our own average costing functionality to satisfy the clients&#8217; need.<\/p>\n<p>Eventually Compiere overhauled its costing engine and introduced average costing and FIFO\/LIFO. But it&#8217;s so poor and immature we could hardly use it in real world. Our team once again drilled down the costing engine and did some major hacks. We contributed it back to community in 2006 although we know it&#8217;s not crystal clear perfect yet. At least now we had a working average costing in Adempiere (Hengsin Low later added more workarounds in 2010).<\/p>\n<p>One culprit we still found anyway is the fact that the ERP is allowing a back-dated transaction. Since we are using a moving (weighted) average costing, we could have trouble if user is entering transactions in a not so chronological manner.<\/p>\n<p>I am thinking to have a process where we could tell the ERP to recalculate the costing for a given period. Our team had made a good effort so far. However I&#8217;m still not satisfied and then I stumbled on this <a href=\"http:\/\/stackoverflow.com\/questions\/17691330\/calculation-average-costing-using-with-recursive-sql-postgres-9-1\">link<\/a> referenced by one of my client, whom now became a good friend of mine.<\/p>\n<p>The idea is to calculate the average costing backwardly, instead of from the beginning which is very time and resource consuming. I copy the content of the link here, in case it&#8217;s lost.<\/p>\n<p>So let&#8217;s begin.<\/p>\n<p>There are two tables:<br \/>\n-the one that holds inventory transactions, and<br \/>\n-the one that holds the latest inventory valuation<\/p>\n<p>I am trying to make an inventory valuation report using average costing method based on a certain date. Doing it the normal way, calculating from the beginning until that specific date, will yield variable response time. Imagine calculating on five years worth of data ( and thousands different inventory items ). It will take considerable amount of time ( and my company is not silicon-valley grade. meaning, 2 core cpu and 8 GB of RAM only) so I am calculating it backwardly: from the latest (current) backtrack to that specific date.<\/p>\n<p>(Every month the accounting dept will check on data, so the calculation will only deal with 1 month&#8217;s worth of data, forever. equal to consistent unchanging performance)<\/p>\n<p>I have merged the table into one on the script below<\/p>\n<p>create table test3 ( rn integer, amt numeric, qty integer, oqty integer);<br \/>\ninsert into test3 (rn,amt,qty,oqty) values (0,2260038.16765793,8,0);<br \/>\ninsert into test3 (rn,amt,qty,oqty) values (1,1647727.2727,3,0);<br \/>\ninsert into test3 (rn,amt,qty,oqty) values (2,2489654.75326715,0,1);<br \/>\ninsert into test3 (rn,amt,qty,oqty) values (3,2489654.75326715,0,1);<br \/>\ninsert into test3 (rn,amt,qty,oqty) values (4,1875443.6364,1,0);<br \/>\ninsert into test3 (rn,amt,qty,oqty) values (5,1647727.2727,3,0);<br \/>\ninsert into test3 (rn,amt,qty,oqty) values (6,3012987.01302857,0,1);<br \/>\ninsert into test3 (rn,amt,qty,oqty) values (7,3012987.01302857,0,1);<\/p>\n<p>select * from test3; (already sorted desc so rn=1 is the newest transaction)<\/p>\n<p><code>rn\u00a0 amt\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 qty\u00a0 oqty<br \/>\n0\u00a0\u00a0 2260038.168 8\u00a0\u00a0 0\u00a0\u00a0\u00a0 --&gt; this is the current average<br \/>\n1\u00a0\u00a0 1647727.273 3\u00a0\u00a0 0<br \/>\n2\u00a0\u00a0 2489654.753 0\u00a0\u00a0 1<br \/>\n3\u00a0\u00a0 2489654.753 0\u00a0\u00a0 1<br \/>\n4\u00a0\u00a0 1875443.636 1\u00a0\u00a0 0<br \/>\n5\u00a0\u00a0 1647727.273 3\u00a0\u00a0 0<br \/>\n6\u00a0\u00a0 3012987.013 0\u00a0\u00a0 1<br \/>\n7\u00a0\u00a0 3012987.013 0\u00a0\u00a0 1<\/code><\/p>\n<p>Average Costing Method backtracking ( given current avg calculate last transaction avg, and so on until nth transactions )<\/p>\n<p><strong>Avg (n) = ((Avg(n-1) * (Cum Qty(n)+In Qty(n))) &#8211; (In Amount(n) * In Qty (n)) + (Avg(n-1) * Out Qty(n))\/(Cum Qty(n)+Out Amount(n))<\/strong><\/p>\n<p>Cumulative qty for backtracking transactions would be minus for in, plus for out. So if current qty is 8, transaction in qty before is 3, then cumulative qty for that transaction is 5.<\/p>\n<p>To calculate the average for one transaction before last, then we use current average to use in that transaction calculation.<\/p>\n<p><em>with recursive <\/em><br \/>\n<em>runsum (id,amt,qty,oqty,sqty,avg) as <\/em><br \/>\n<em>\u00a0\u00a0\u00a0 (select data.id, data.amt, data.qty, data.oqty, data.sqty, data.avg<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0 from (<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 select rn as id,amt,qty, oqty, <\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sum(case when rn=0 then qty else <\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case when oqty=0 then qty*-1 <\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else oqty end end) over (order by rn) as sqty, lag(amt) over (order by rn) as avg<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 from test3 ) data<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ),<\/em><br \/>\n<em>counter (maximum) as<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (select count(rn)<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 from test3<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ),<\/em><br \/>\n<em>trans (n, id,amt,qty,oqty,sqty,prevavg,avg) as<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 (select 0 n, id,amt,qty,oqty, sqty,avg,avg<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 from runsum <\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0 union <\/em><br \/>\n<em>\u00a0\u00a0\u00a0 select trans.n+1, runsum.id,trans.amt,trans.qty, trans.oqty, trans.sqty, <\/em><br \/>\n<em>\u00a0\u00a0\u00a0 lag(trans.avg) over (order by 1), <\/em><br \/>\n<em>\u00a0\u00a0\u00a0 case when runsum.sqty=0 then runsum.amt else <\/em><br \/>\n<em>\u00a0\u00a0\u00a0 ((trans.prevavg*(runsum.sqty+trans.qty))-(runsum.amt*trans.qty)+(trans.prevavg*trans.oqty))\/(runsum.sqty+trans.oqty)<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 end<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 from runsum join trans using (id)<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 where trans.n&lt;(select maximum*2 from counter))<\/em><br \/>\n<em>select * <\/em><br \/>\n<em>from trans<\/em><br \/>\n<em>where prevavg is null and avg is not null<\/em><br \/>\n<em>order by id;<\/em><\/p>\n<p>The result is supposed to be like this<\/p>\n<p><code>rn\u00a0 amt\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 qty\u00a0oqty sqty sum avg<br \/>\n1\u00a0\u00a0 1647727.273 3\u00a0\u00a0 0\u00a0\u00a0 5\u00a0\u00a0 2627424.705<br \/>\n2\u00a0\u00a0 2489654.753 0\u00a0\u00a0 1\u00a0\u00a0 6\u00a0\u00a0 2627424.705<br \/>\n3\u00a0\u00a0 2489654.753 0\u00a0\u00a0 1\u00a0\u00a0 7\u00a0\u00a0 2627424.705<br \/>\n4\u00a0\u00a0 1875443.636 1\u00a0\u00a0 0\u00a0\u00a0 6\u00a0\u00a0 2752754.883<br \/>\n5\u00a0\u00a0 1647727.273 3\u00a0\u00a0 0\u00a0\u00a0 3\u00a0\u00a0 3857782.493<br \/>\n6\u00a0\u00a0 3012987.013 0\u00a0\u00a0 1\u00a0\u00a0 4\u00a0\u00a0 3857782.493<br \/>\n7\u00a0\u00a0 3012987.013 0\u00a0\u00a0 1\u00a0\u00a0 5\u00a0\u00a0 3857782.493<\/code><\/p>\n<p>I hope we could have something working in near future. So stay tuned.<\/p>\n<p>&#8212;<\/p>\n<p>Goodwill Consulting is a long time Adempiere \/ Idempiere supporter since their inception. We are offering software-as-a-service solution on the cloud based on Adempiere \/ Idempiere. For more information, you can drop us a visit at <a title=\"Goodwill ERP\" href=\"http:\/\/www.goodwillerp.com\" target=\"_blank\">www.goodwillerp.com<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dealing with average costing could be a nightmare for most of us. Chuck Boecking, a fellow Adempiere consultant based in US explained it very well in\u00a0his blog\u00a0why we (not to) choose average costing in a ERP. ERP is a perpetual inventory accounting system. Therefore, the system\u00a0 will post every inventory transaction as they happen. When [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,23,13],"tags":[49,52,50,51],"class_list":["post-85","post","type-post","status-publish","format-standard","hentry","category-accounting","category-adempiere-functionality","category-costing","tag-average-costing","tag-fifo","tag-postgresql","tag-standard-costing"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Recalculating average costing backwardly - Goodwill Consulting<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Recalculating average costing backwardly - Goodwill Consulting\" \/>\n<meta property=\"og:description\" content=\"Dealing with average costing could be a nightmare for most of us. Chuck Boecking, a fellow Adempiere consultant based in US explained it very well in\u00a0his blog\u00a0why we (not to) choose average costing in a ERP. ERP is a perpetual inventory accounting system. Therefore, the system\u00a0 will post every inventory transaction as they happen. When [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/\" \/>\n<meta property=\"og:site_name\" content=\"Goodwill Consulting\" \/>\n<meta property=\"article:published_time\" content=\"2013-12-08T03:38:06+00:00\" \/>\n<meta name=\"author\" content=\"Armen Rizal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Armen Rizal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/\"},\"author\":{\"name\":\"Armen Rizal\",\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/#\/schema\/person\/f0f72bd8c594649975fe804decbab5db\"},\"headline\":\"Recalculating average costing backwardly\",\"datePublished\":\"2013-12-08T03:38:06+00:00\",\"dateModified\":\"2013-12-08T03:38:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/\"},\"wordCount\":982,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/#organization\"},\"keywords\":[\"average costing\",\"fifo\",\"postgresql\",\"standard costing\"],\"articleSection\":[\"Accounting\",\"Adempiere Functionality\",\"Costing\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/\",\"url\":\"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/\",\"name\":\"Recalculating average costing backwardly - Goodwill Consulting\",\"isPartOf\":{\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/#website\"},\"datePublished\":\"2013-12-08T03:38:06+00:00\",\"dateModified\":\"2013-12-08T03:38:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.goodwill.co.id\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Recalculating average costing backwardly\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/#website\",\"url\":\"https:\/\/www.goodwill.co.id\/blog\/\",\"name\":\"Goodwill Consulting\",\"description\":\"Goodwill ERP - Adempiere Indonesia - Idempiere Indonesia\",\"publisher\":{\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.goodwill.co.id\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/#organization\",\"name\":\"Goodwill Consulting\",\"url\":\"https:\/\/www.goodwill.co.id\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.goodwill.co.id\/blog\/wp-content\/uploads\/2024\/07\/logo_goodwillerp.jpg\",\"contentUrl\":\"https:\/\/www.goodwill.co.id\/blog\/wp-content\/uploads\/2024\/07\/logo_goodwillerp.jpg\",\"width\":900,\"height\":599,\"caption\":\"Goodwill Consulting\"},\"image\":{\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/#\/schema\/person\/f0f72bd8c594649975fe804decbab5db\",\"name\":\"Armen Rizal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.goodwill.co.id\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd9c02aae88ac1440023f6c7ed15bbdb?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd9c02aae88ac1440023f6c7ed15bbdb?s=96&d=mm&r=g\",\"caption\":\"Armen Rizal\"},\"url\":\"https:\/\/www.goodwill.co.id\/blog\/author\/armen\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Recalculating average costing backwardly - Goodwill Consulting","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/","og_locale":"en_US","og_type":"article","og_title":"Recalculating average costing backwardly - Goodwill Consulting","og_description":"Dealing with average costing could be a nightmare for most of us. Chuck Boecking, a fellow Adempiere consultant based in US explained it very well in\u00a0his blog\u00a0why we (not to) choose average costing in a ERP. ERP is a perpetual inventory accounting system. Therefore, the system\u00a0 will post every inventory transaction as they happen. When [&hellip;]","og_url":"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/","og_site_name":"Goodwill Consulting","article_published_time":"2013-12-08T03:38:06+00:00","author":"Armen Rizal","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Armen Rizal","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/#article","isPartOf":{"@id":"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/"},"author":{"name":"Armen Rizal","@id":"https:\/\/www.goodwill.co.id\/blog\/#\/schema\/person\/f0f72bd8c594649975fe804decbab5db"},"headline":"Recalculating average costing backwardly","datePublished":"2013-12-08T03:38:06+00:00","dateModified":"2013-12-08T03:38:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/"},"wordCount":982,"commentCount":0,"publisher":{"@id":"https:\/\/www.goodwill.co.id\/blog\/#organization"},"keywords":["average costing","fifo","postgresql","standard costing"],"articleSection":["Accounting","Adempiere Functionality","Costing"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/","url":"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/","name":"Recalculating average costing backwardly - Goodwill Consulting","isPartOf":{"@id":"https:\/\/www.goodwill.co.id\/blog\/#website"},"datePublished":"2013-12-08T03:38:06+00:00","dateModified":"2013-12-08T03:38:06+00:00","breadcrumb":{"@id":"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.goodwill.co.id\/blog\/recalculating-average-costing-backwardly\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.goodwill.co.id\/blog\/"},{"@type":"ListItem","position":2,"name":"Recalculating average costing backwardly"}]},{"@type":"WebSite","@id":"https:\/\/www.goodwill.co.id\/blog\/#website","url":"https:\/\/www.goodwill.co.id\/blog\/","name":"Goodwill Consulting","description":"Goodwill ERP - Adempiere Indonesia - Idempiere Indonesia","publisher":{"@id":"https:\/\/www.goodwill.co.id\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.goodwill.co.id\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.goodwill.co.id\/blog\/#organization","name":"Goodwill Consulting","url":"https:\/\/www.goodwill.co.id\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.goodwill.co.id\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.goodwill.co.id\/blog\/wp-content\/uploads\/2024\/07\/logo_goodwillerp.jpg","contentUrl":"https:\/\/www.goodwill.co.id\/blog\/wp-content\/uploads\/2024\/07\/logo_goodwillerp.jpg","width":900,"height":599,"caption":"Goodwill Consulting"},"image":{"@id":"https:\/\/www.goodwill.co.id\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.goodwill.co.id\/blog\/#\/schema\/person\/f0f72bd8c594649975fe804decbab5db","name":"Armen Rizal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.goodwill.co.id\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd9c02aae88ac1440023f6c7ed15bbdb?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd9c02aae88ac1440023f6c7ed15bbdb?s=96&d=mm&r=g","caption":"Armen Rizal"},"url":"https:\/\/www.goodwill.co.id\/blog\/author\/armen\/"}]}},"_links":{"self":[{"href":"https:\/\/www.goodwill.co.id\/blog\/wp-json\/wp\/v2\/posts\/85"}],"collection":[{"href":"https:\/\/www.goodwill.co.id\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.goodwill.co.id\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.goodwill.co.id\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.goodwill.co.id\/blog\/wp-json\/wp\/v2\/comments?post=85"}],"version-history":[{"count":2,"href":"https:\/\/www.goodwill.co.id\/blog\/wp-json\/wp\/v2\/posts\/85\/revisions"}],"predecessor-version":[{"id":87,"href":"https:\/\/www.goodwill.co.id\/blog\/wp-json\/wp\/v2\/posts\/85\/revisions\/87"}],"wp:attachment":[{"href":"https:\/\/www.goodwill.co.id\/blog\/wp-json\/wp\/v2\/media?parent=85"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.goodwill.co.id\/blog\/wp-json\/wp\/v2\/categories?post=85"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.goodwill.co.id\/blog\/wp-json\/wp\/v2\/tags?post=85"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}