{"id":2274,"date":"2023-04-18T19:20:03","date_gmt":"2023-04-18T19:20:03","guid":{"rendered":"https:\/\/morecpq.com\/?p=2274"},"modified":"2024-01-27T11:52:09","modified_gmt":"2024-01-27T16:52:09","slug":"approvals-vf-email-templates","status":"publish","type":"post","link":"https:\/\/morecpq.com\/index.php\/2023\/04\/18\/approvals-vf-email-templates\/","title":{"rendered":"CPQ Standard Approvals &#8211; VisualForce Email Template Examples!"},"content":{"rendered":"\n<p>I&#8217;ve had these email templates for a while now and use them as starting points for any CPQ implementation where approvals are required, which is most implementations!  These are provided as is and can be modified to suit your needs!  There are 4 actual email templates (Needs Approval, Approved, Rejected, and Recalled).  Here&#8217;s the list of things to support these templates!<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Apex Controller Class<\/li>\n\n\n\n<li>VisualForce Components\n<ul class=\"wp-block-list\">\n<li>The comments block <\/li>\n\n\n\n<li>The approval directions block<\/li>\n\n\n\n<li>The quote header block<\/li>\n\n\n\n<li>The quote lines block<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>VisualForce Email Templates\n<ul class=\"wp-block-list\">\n<li>Needs Approval<\/li>\n\n\n\n<li>Approved<\/li>\n\n\n\n<li>Rejected<\/li>\n\n\n\n<li>Recalled<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Apex Controller Test Class<\/li>\n<\/ol>\n\n\n\n<p><strong>APEX Controller Class<\/strong><\/p>\n\n\n\n<p>Here&#8217;s the controller!  It&#8217;s very simple!  Get quote, get quote lines, get comments.  That&#8217;s it.<\/p>\n\n\n\n<pre class=\"wp-block-code no-wrap has-white-color has-black-background-color has-text-color has-background has-small-font-size\"><code>public without sharing class QuoteApprovalsCmpController {\n    public String quoteId;\n    public SBQQ__Quote__c quote;\n    public List&lt;SBQQ__QuoteLine__c&gt; quoteLines;\n    \n    public void setQuoteId(String Id) {\n        quoteId = Id;\n    }\n    \n    public String getQuoteId() {\n        return quoteId;\n    }\n    \n    public void setQuote(SBQQ__Quote__c q) {\n        quote = q;\n    }\n    \n    public SBQQ__Quote__c getQuote() {\n        String soql = ''\n            + ' select ' + String.join(new List&lt;String&gt;(SBQQ__Quote__c.SObjectType.getDescribe().fields.getMap().keySet()), ',')\n            + ', SBQQ__SalesRep__r.Name, SBQQ__Account__r.Name, SBQQ__Opportunity2__r.Name from SBQQ__Quote__c'\n            + ' where Id=\\''+quoteId+'\\' limit 1';\n        quote = Database.query(soql);\n        return quote;\n    }\n    \n    public void setQuoteLines(List&lt;SBQQ__QuoteLine__c&gt; lines) {\n        quoteLines = lines;\n    }\n    \n    public List&lt;SBQQ__QuoteLine__c&gt; getQuoteLines() {\n        String soql = ''\n            + ' select ' + String.join(new List&lt;String&gt;(SBQQ__QuoteLine__c.SObjectType.getDescribe().fields.getMap().keySet()), ',')\n            + ' from SBQQ__QuoteLine__c'\n            + ' where SBQQ__Quote__c=\\''+quoteId+'\\' limit 200';\n        quoteLines = Database.query(soql);\n        return quoteLines;\n    }\n    \n    public ProcessInstanceStep getCurrentProcessInstanceStep() {\n        List&lt;ProcessInstanceStep&gt; steps = &#91;SELECT ProcessInstance.CompletedDate, ActorId, Comments, CreatedById, CreatedDate, ElapsedTimeInDays, ElapsedTimeInHours, ElapsedTimeInMinutes, Id, OriginalActorId, ProcessInstanceId, StepNodeId, StepStatus, SystemModstamp\n                                           FROM ProcessInstanceStep\n                                           WHERE ProcessInstance.TargetObjectId = :quoteId AND ProcessInstance.CompletedDate = null\n                                           ORDER BY SystemModstamp DESC];\n        if (steps.size() &gt; 0) return steps&#91;0];\n        else return null;\n    }\n}<\/code><\/pre>\n\n\n\n<p><strong>VF Component &#8211; Comments<\/strong><\/p>\n\n\n\n<p>This block will display only if there are approval comments.  It&#8217;s nice to have the comments thread in any email that is sent so that the person reading it has some context for what is going on with the given quote.<\/p>\n\n\n\n<pre class=\"wp-block-code no-wrap has-white-color has-black-background-color has-text-color has-background has-small-font-size\"><code>&lt;apex:component controller=\"QuoteApprovalsCmpController\" access=\"global\"&gt;\n\t&lt;apex:attribute name=\"cmpQuoteId\" type=\"String\" description=\"ID of the Quote\" required=\"required\" assignTo=\"{!quoteId}\"\/&gt;\n\t&lt;style&gt;\n\t\tspan {\n\t\t\tfont-weight: bold;\n\t\t}\n\t&lt;\/style&gt;\n\n\t&lt;apex:outputPanel rendered=\"{!if(CurrentProcessInstanceStep.Comments != null, true, false)}\"&gt;\n\t&lt;p&gt;&lt;span&gt;Comments:&lt;\/span&gt;&lt;\/p&gt;\n\t&lt;p&gt;{!CurrentProcessInstanceStep.Comments}&lt;\/p&gt;\n\t&lt;\/apex:outputPanel&gt;\n&lt;\/apex:component&gt;<\/code><\/pre>\n\n\n\n<p><strong>VF Component &#8211; Approval Directions<\/strong><\/p>\n\n\n\n<p>This is a section where we say how to approve.  There are a few different ways but you might want to change how this is worded or change it to include another way or exclude one that I&#8217;ve included.<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-small-font-size\"><code>&lt;apex:component controller=\"QuoteApprovalsCmpController\" access=\"global\"&gt;\n\t&lt;apex:attribute name=\"cmpQuoteId\" type=\"String\" description=\"ID of the Quote\" required=\"required\" assignTo=\"{!quoteId}\"\/&gt;\n\t&lt;style&gt;\n\t\tspan {\n\t\t\tfont-weight: bold;\n\t\t}\n\t&lt;\/style&gt;\n\n\t&lt;p&gt;\n\t\t&lt;span&gt;Click the link below to approve or reject:&lt;\/span&gt;\n\t\t&lt;a href=\"{!LEFT($Api.Partner_Server_URL_290,FIND('services',$Api.Partner_Server_URL_290)-1)}{!'lightning\/r\/ProcessInstanceHistory\/' + cmpQuoteId + '\/related\/ProcessSteps\/view'}\"&gt;Approve or Reject&lt;\/a&gt;\n\t&lt;\/p&gt;\n\t\n\t&lt;p&gt;To Approve by email, simply reply to this email with \"Approve\" or \"Reject\" as the response.&lt;\/p&gt;\n&lt;\/apex:component&gt;<\/code><\/pre>\n\n\n\n<p><strong>VF Component &#8211; Quote Header<\/strong><\/p>\n\n\n\n<p>This is the bun of the quote!  We include various fields from the quote record to give some detail on what someone is approving.  This is where you might want to add more quote fields or remove some I&#8217;ve included.<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-small-font-size\"><code>&lt;apex:component controller=\"QuoteApprovalsCmpController\" access=\"global\"&gt;\n\t&lt;apex:attribute name=\"cmpQuoteId\" type=\"String\" description=\"ID of the Quote\" required=\"required\" assignTo=\"{!quoteId}\"\/&gt;\n\t&lt;table cellpadding=\"5\" style=\"border-collapse: collapse\" width=\"100%\"&gt;\n\t\t&lt;tr&gt;\n\t\t\t&lt;td align=\"right\" style=\"border-right-style: solid; border-right-width: thick; border-right-color: #6EC0EE;\" width=\"20%\"&gt;&lt;i&gt;Quote&lt;\/i&gt;&lt;\/td&gt;\n\t\t\t&lt;td width=\"80%\"&gt;&lt;a href=\"{!LEFT($Api.Partner_Server_URL_140,FIND('.com',$Api.Partner_Server_URL_140)+4)+quote.Id}\"&gt;&lt;b&gt;{!quote.Name}&lt;\/b&gt;&lt;\/a&gt;&lt;\/td&gt;\n\t\t&lt;\/tr&gt;\n\t\t&lt;tr&gt;\n\t\t\t&lt;td align=\"right\" style=\"border-right-style: solid; border-right-width: thick; border-right-color: #6EC0EE;\" width=\"20%\"&gt;&lt;i&gt;Opportunity&lt;\/i&gt;&lt;\/td&gt;\n\t\t\t&lt;td width=\"80%\"&gt;&lt;a href=\"{!LEFT($Api.Partner_Server_URL_140,FIND('.com',$Api.Partner_Server_URL_140)+4)+quote.SBQQ__Opportunity2__c}\"&gt;&lt;b&gt;{!quote.SBQQ__Opportunity2__r.Name}&lt;\/b&gt;&lt;\/a&gt;&lt;\/td&gt;\n\t\t&lt;\/tr&gt;\n\t\t&lt;tr&gt;\n\t\t\t&lt;td align=\"right\" style=\"border-right-style: solid; border-right-width: thick; border-right-color: #6EC0EE;\" width=\"20%\"&gt;&lt;i&gt;Sales Rep&lt;\/i&gt;&lt;\/td&gt;\n\t\t\t&lt;td width=\"80%\"&gt;&lt;b&gt;{!quote.SBQQ__SalesRep__r.Name}&lt;\/b&gt;&lt;\/td&gt;\n\t\t&lt;\/tr&gt;\n\t\t&lt;tr&gt;\n\t\t\t&lt;td align=\"right\" style=\"border-right-style: solid; border-right-width: thick; border-right-color: #6EC0EE;\" width=\"20%\"&gt;&lt;i&gt;Account&lt;\/i&gt;&lt;\/td&gt;\n\t\t\t&lt;td width=\"80%\"&gt;&lt;b&gt;{!quote.SBQQ__Account__r.Name}&lt;\/b&gt;&lt;\/td&gt;\n\t\t&lt;\/tr&gt;\n\t\t&lt;tr&gt;\n\t\t\t&lt;td align=\"right\" style=\"border-right-style: solid; border-right-width: thick; border-right-color: #6EC0EE;\" width=\"20%\"&gt;&lt;i&gt;Amount&lt;\/i&gt;&lt;\/td&gt;\n\t\t\t&lt;td width=\"80%\"&gt;&lt;b&gt;&lt;apex:outputText value=\"{0, Number, Currency}\"&gt;&lt;apex:param value=\"{!quote.SBQQ__ListAmount__c}\" \/&gt;&lt;\/apex:outputText&gt;&lt;\/b&gt;&lt;\/td&gt;\n\t\t&lt;\/tr&gt;\n\t\t&lt;tr&gt;\n\t\t\t&lt;td align=\"right\" style=\"border-right-style: solid; border-right-width: thick; border-right-color: #6EC0EE;\" width=\"20%\"&gt;&lt;i&gt;Status&lt;\/i&gt;&lt;\/td&gt;\n\t\t\t&lt;td width=\"80%\"&gt;&lt;b&gt;{!quote.SBQQ__Status__c}&lt;\/b&gt;&lt;\/td&gt;\n\t\t&lt;\/tr&gt;\n\t&lt;\/table&gt;\n\t&lt;br \/&gt;\n&lt;\/apex:component&gt;<\/code><\/pre>\n\n\n\n<p><strong>VF Component &#8211; Quote Lines<\/strong><\/p>\n\n\n\n<p>This is similar to the quote header but it&#8217;s the lines!  Feel free to add and\/or remove fields from this section.<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-small-font-size\"><code>&lt;apex:component controller=\"QuoteApprovalsCmpController\" access=\"global\"&gt;\n\t&lt;apex:attribute name=\"cmpQuoteId\" type=\"String\" description=\"ID of the Quote\" required=\"required\" assignTo=\"{!quoteId}\"\/&gt;\n\t&lt;table cellpadding=\"5\" style=\"border-collapse: collapse\" width=\"100%\"&gt;\n\t\t&lt;tr&gt;\n\t\t\t&lt;td style=\"background-color: #6EC0EE; color: #FFFFFF;\"&gt;&lt;b&gt;Product Name&lt;\/b&gt;&lt;\/td&gt;\n\t\t\t&lt;td style=\"background-color: #6EC0EE; color: #FFFFFF; text-align:right;\"&gt;&lt;b&gt;Unit Price&lt;\/b&gt;&lt;\/td&gt;\n\t\t\t&lt;td style=\"background-color: #6EC0EE; color: #FFFFFF; text-align:center;\"&gt;&lt;b&gt;Quantity&lt;\/b&gt;&lt;\/td&gt;\n\t\t\t&lt;td style=\"background-color: #6EC0EE; color: #FFFFFF; text-align:right;\"&gt;&lt;b&gt;Total Price&lt;\/b&gt;&lt;\/td&gt;\n\t\t&lt;\/tr&gt; \n\t\t&lt;apex:repeat value=\"{!quoteLines}\" var=\"lineItem\"&gt;\n\t\t&lt;tr&gt;\n\t\t\t&lt;td&gt;{!lineItem.SBQQ__ProductName__c}&lt;\/td&gt;\n\t\t\t&lt;td style=\"text-align:right;\"&gt;&lt;apex:outputText value=\"{0, Number, Currency}\"&gt;&lt;apex:param value=\"{!lineItem.SBQQ__ListPrice__c}\" \/&gt;&lt;\/apex:outputText&gt;&lt;\/td&gt;\n\t\t\t&lt;td style=\"text-align:center;\"&gt;&lt;apex:outputText value=\"{0, number, ###,###,###,###}\"&gt;&lt;apex:param value=\"{!lineItem.SBQQ__Quantity__c}\"\/&gt;&lt;\/apex:outputText&gt;&lt;\/td&gt;\n\t\t\t&lt;td style=\"text-align:right;\"&gt;&lt;apex:outputText value=\"{0, Number, Currency}\"&gt;&lt;apex:param value=\"{!lineItem.SBQQ__NetTotal__c}\" \/&gt;&lt;\/apex:outputText&gt;&lt;\/td&gt;\n\t\t&lt;\/tr&gt;\n\t\t&lt;\/apex:repeat&gt;\n\t&lt;\/table&gt;\n&lt;\/apex:component&gt;<\/code><\/pre>\n\n\n\n<p><strong>VF Email Template &#8211; Needs Approval<\/strong><\/p>\n\n\n\n<p>This quote needs approval!  You can see where we&#8217;re using the above components.  This is the place to add any template specific information or wording.  Below this one are the other three templates.  You also don&#8217;t have to use all of these.  Sometimes it doesn&#8217;t make sense to send a recalled email.<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-small-font-size\"><code>&lt;messaging:emailTemplate subject=\"Quote {!relatedTo.Name} - Needs Approval\" recipientType=\"User\" relatedToType=\"SBQQ__Quote__c\"&gt;\n\t&lt;messaging:htmlEmailBody&gt;\n\t\t&lt;body style=\"font-family: 'Arial'\"&gt;\n\t\t\t&lt;p&gt;Quote {!relatedTo.Name} - &lt;b&gt;Needs Approval&lt;\/b&gt;&lt;\/p&gt;\n\t\t\t\t&lt;hr style=\"border: solid thin #6EC0EE\" \/&gt;\n\t\t\t\t&lt;br \/&gt;\n\t\t\t\t&lt;c:QuoteApprovalsCommentsCmp cmpQuoteId=\"{!relatedTo.Id}\" \/&gt;\n\t\t\t\t&lt;c:QuoteApprovalsCmp cmpQuoteId=\"{!relatedTo.Id}\" \/&gt;\n\t\t\t\t&lt;c:QuoteApprovalsHeaderCmp cmpQuoteId=\"{!relatedTo.Id}\" \/&gt;\n\t\t\t\t&lt;c:QuoteApprovalsLinesCmp cmpQuoteId=\"{!relatedTo.Id}\" \/&gt;\n\t\t\t&lt;p \/&gt;\n\t\t&lt;\/body&gt;\n\t&lt;\/messaging:htmlEmailBody&gt;\n&lt;\/messaging:emailTemplate&gt;<\/code><\/pre>\n\n\n\n<p><strong>VF Email Template &#8211; Approved<\/strong><\/p>\n\n\n\n<p>Notice in the approved template, we don&#8217;t include the directions or the comments.  If you&#8217;d like to have comments in any other template, just add the component line for that section from the needs approval template above to the approved template below.<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-small-font-size\"><code>&lt;messaging:emailTemplate subject=\"Quote {!relatedTo.Name} - Approved\" recipientType=\"User\" relatedToType=\"SBQQ__Quote__c\"&gt;\n    &lt;messaging:htmlEmailBody &gt;\n        &lt;body style=\"font-family: 'Arial'\"&gt;\n            &lt;p style=\"color:green;\"&gt;Quote {!relatedTo.Name} has been &lt;b&gt;Approved&lt;\/b&gt;&lt;\/p&gt;\n            &lt;hr style=\"border: solid thin #6EC0EE\" \/&gt;\n            &lt;br \/&gt;\n\t\t\t&lt;c:QuoteApprovalsHeaderCmp cmpQuoteId=\"{!relatedTo.Id}\" \/&gt;\n\t\t\t&lt;c:QuoteApprovalsLinesCmp cmpQuoteId=\"{!relatedTo.Id}\" \/&gt;\n        &lt;\/body&gt;\n    &lt;\/messaging:htmlEmailBody&gt;\n&lt;\/messaging:emailTemplate&gt;<\/code><\/pre>\n\n\n\n<p><strong>VF Email Template &#8211; Rejected<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-small-font-size\"><code>&lt;messaging:emailTemplate subject=\"Quote {!relatedTo.Name} - Rejected\" recipientType=\"User\" relatedToType=\"SBQQ__Quote__c\"&gt;\n    &lt;messaging:htmlEmailBody &gt;\n        &lt;body style=\"font-family: 'Arial'\"&gt;\n            &lt;p style=\"color:red;\"&gt;Quote {!relatedTo.Name} has been &lt;b&gt;Rejected&lt;\/b&gt;&lt;\/p&gt;\n            &lt;hr style=\"border: solid thin #6EC0EE\" \/&gt;\n            &lt;br \/&gt;\n\t\t\t&lt;c:QuoteApprovalsCommentsCmp cmpQuoteId=\"{!relatedTo.Id}\" \/&gt;\n\t\t\t&lt;c:QuoteApprovalsHeaderCmp cmpQuoteId=\"{!relatedTo.Id}\" \/&gt;\n\t\t\t&lt;c:QuoteApprovalsLinesCmp cmpQuoteId=\"{!relatedTo.Id}\" \/&gt;\n        &lt;\/body&gt;\n    &lt;\/messaging:htmlEmailBody&gt;\n&lt;\/messaging:emailTemplate&gt;<\/code><\/pre>\n\n\n\n<p><strong>VF Email Template &#8211; Recalled<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-small-font-size\"><code>&lt;messaging:emailTemplate subject=\"Quote {!relatedTo.Name} - Recalled\" recipientType=\"User\" relatedToType=\"SBQQ__Quote__c\"&gt;\n    &lt;messaging:htmlEmailBody &gt;\n        &lt;body style=\"font-family: 'Arial'\"&gt;\n            &lt;p style=\"color:orange;\"&gt;Quote {!relatedTo.Name} has been &lt;b&gt;Recalled&lt;\/b&gt;&lt;\/p&gt;\n            &lt;hr style=\"border: solid thin #6EC0EE\" \/&gt;\n            &lt;br \/&gt;\n\t\t\t&lt;c:QuoteApprovalsHeaderCmp cmpQuoteId=\"{!relatedTo.Id}\" \/&gt;\n\t\t\t&lt;c:QuoteApprovalsLinesCmp cmpQuoteId=\"{!relatedTo.Id}\" \/&gt;\n        &lt;\/body&gt;\n    &lt;\/messaging:htmlEmailBody&gt;\n&lt;\/messaging:emailTemplate&gt;<\/code><\/pre>\n\n\n\n<p><strong>APEX Controller Test Class<\/strong><\/p>\n\n\n\n<p>Of course you need a test class.  Keep in mind that if you change anything in the controller, you&#8217;re gonna need to update this test class to keep your code coverage up to snuff.<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-small-font-size\"><code>@isTest\nprivate class QuoteApprovalsCmpController_Test {\n    @isTest\n    static void test_getCurrentProcessInstanceStep() {\n        SBQQ__Quote__c quote = new SBQQ__Quote__c();\n        insert quote;\n        \n        List&lt;SBQQ__QuoteLine__c> qls = new List&lt;SBQQ__QuoteLine__c>{new SBQQ__QuoteLine__c(SBQQ__Quote__c=quote.id)};\n        \n        QuoteApprovalsCmpController cmpCtlr = new QuoteApprovalsCmpController();\n        cmpCtlr.setQuoteId(quote.Id);\n        cmpCtlr.setQuote(quote);\n        cmpCtlr.setQuoteLines(qls);\n        qls = cmpCtlr.getQuoteLines();\n        quote = cmpCtlr.getQuote();\n        cmpCtlr.getQuoteId();\n        cmpCtlr.getCurrentProcessInstanceStep();\n    }\n}<\/code><\/pre>\n\n\n\n<p><strong>Installer!<\/strong><\/p>\n\n\n\n<p>Yep.  Same as always.  Below are the installers!<\/p>\n\n\n\n<p><a href=\"https:\/\/test.salesforce.com\/packaging\/installPackage.apexp?p0=04t4x000000r1aa\" target=\"_blank\" rel=\"noreferrer noopener\">Sandbox<\/a> | <a href=\"https:\/\/login.salesforce.com\/packaging\/installPackage.apexp?p0=04t4x000000r1aa\" target=\"_blank\" rel=\"noreferrer noopener\">Production<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve had these email templates for a while now and use them as starting points for any CPQ implementation where approvals are required, which is most implementations! These are provided as is and can be modified to suit your needs! There are 4 actual email templates (Needs Approval, Approved, Rejected, and Recalled). Here&#8217;s the list &hellip;<br \/><a href=\"https:\/\/morecpq.com\/index.php\/2023\/04\/18\/approvals-vf-email-templates\/\" class=\"more-link pen_button pen_element_default pen_icon_arrow_double\">Continue reading <span class=\"screen-reader-text\">CPQ Standard Approvals &#8211; VisualForce Email Template Examples!<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2274","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/morecpq.com\/index.php\/wp-json\/wp\/v2\/posts\/2274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/morecpq.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/morecpq.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/morecpq.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/morecpq.com\/index.php\/wp-json\/wp\/v2\/comments?post=2274"}],"version-history":[{"count":24,"href":"https:\/\/morecpq.com\/index.php\/wp-json\/wp\/v2\/posts\/2274\/revisions"}],"predecessor-version":[{"id":2637,"href":"https:\/\/morecpq.com\/index.php\/wp-json\/wp\/v2\/posts\/2274\/revisions\/2637"}],"wp:attachment":[{"href":"https:\/\/morecpq.com\/index.php\/wp-json\/wp\/v2\/media?parent=2274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/morecpq.com\/index.php\/wp-json\/wp\/v2\/categories?post=2274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/morecpq.com\/index.php\/wp-json\/wp\/v2\/tags?post=2274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}