Certificate Generation

Overview

The final step in this process is the creation of configurations to create a voter registration PDF for the citizens to download. For this, we will make use of DIGIT’s PDF service which uses PDFMake and Mustache libraries to generate PDF. Detailed documentation on generating PDFs using PDF service is available here.

Steps

Follow the below steps to set up PDF service locally and generate PDF for our voter registration service -

  1. Clone DIGIT Services repo.

> git clone -o upstream https://github.com/egovernments/DIGIT-OSS
  1. Clone Configs repo.

> git clone -o upstream https://github.com/egovernments/configs
  1. Navigate to the DIGIT-Dev repo and open up a terminal. Checkout DIGIT_DEVELOPER_GUIDE branch.

> cd DIGIT-Dev
> git checkout DIGIT_DEVELOPER_GUIDE
  1. Navigate to the configs folder and under pdf-service data config and format config folders, create file by the name of digit-developer-guide.json

> cd configs/pdf-service/data-config
> touch digit-developer-guide.json
  1. Add the following content in this newly created data config file -

{
  "key": "btcertificate",
  "DataConfigs": {
    "serviceName": "rainmaker-common",
    "version": "1.0.0",
    "baseKeyPath": "$.BirthRegistrationApplications.*",
    "entityIdPath":"$.id",
    "isCommonTableBorderRequired": true,
    "mappings": [
      {
        "mappings": [
          {
            "direct": [
              {
                "variable": "logoImage",
                "url":"https://raw.githubusercontent.com/egovernments/egov-web-app/master/web/rainmaker/dev-packages/egov-ui-kit-dev/src/assets/images/pblogo.png",
                "type":"image"
              },
              {
                "variable": "applicantName",
                "value": {
                  "path": "$.babyFirstName"
                }
              },
              {
                "variable": "applicationNo",
                "value": {
                  "path": "$.applicationNumber"
                }
              },
              {
                "variable": "address",
                "value": {
                  "path": "$.address.city"
                }
              },
              {
                "variable": "birthIdIssueDate",
                "value": {
                  "path": "$.auditDetails.createdTime"
                },
                "type": "date"
              },
              {
                "variable": "signedCertificateData",
                "value": {
                  "path": "$.signedCertificate"
                }
              },
              {
                "variable": "to",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_RECEIPT_TO"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "municipal_corportaion",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_MUNICIPAL_CORPORATION"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "corporation_contact",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_LICENSE_CORPORATION_CONTACT"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "corporation_website",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_LICENSE_CORPORATION_WEBSITE"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "corporation_email",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_LICENSE_CORPORATION_EMAIL"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "application_no",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_APPLICATION_NO"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "reciept_no",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_RECIEPT_NO"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "financial_year",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_FINANCIAL_YEAR"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "trade_name",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_TRADE_NAME"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "trade_owner_name",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_TRADE_OWNER_NAME"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "trade_owner_contact",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_TRADE_OWNER_CONTACT"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "trade_address",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_TRADE_ADDRESS"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "trade_type",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_TRADE_TYPE"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "accessories_label",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_ACCESSORIES_LABEL"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "trade_license_fee",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_TRADE_LICENSE_FEE"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "license_issue_date",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_LICENSE_ISSUE_DATE"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "license_validity",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_LICENSE_VALIDITY"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "approved_by",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_APPROVED_BY"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              },
              {
                "variable": "commissioner",
                "value": {
                  "path": "PDF_STATIC_LABEL_CONSOLIDATED_TLCERTIFICATE_COMMISSIONER"
                },
                "type": "label",
                "localisation":{
                  "required":true,
                  "prefix": null,
                  "module":"rainmaker-common"
                }
              }
            ]
          },
          {
            "externalAPI": [
              {
                "path": "http://localhost:8082/egov-mdms-service/v1/_get",
                "queryParam": "moduleName=tenant&masterName=tenants&tenantId=pb&filter=%5B?(@.code=='{$.tenantId}')%5D",
                "apiRequest": null,
                "responseMapping":[
                  {
                    "variable":"ulb-address",
                    "value":"$.MdmsRes.tenant.tenants[0].address"
                  },
                  {
                    "variable":"corporationContact",
                    "value":"$.MdmsRes.tenant.tenants[0].contactNumber"
                  },
                  {
                    "variable":"corporationWebsite",
                    "value":"$.MdmsRes.tenant.tenants[0].domainUrl"
                  },
                  {
                    "variable":"corporationEmail",
                    "value":"$.MdmsRes.tenant.tenants[0].emailId"
                  }
                ]
              },
              {
                "path": "http://localhost:8288/filestore/v1/files/url",
                "queryParam": "tenantId=pb,fileStoreIds=$.tradeLicenseDetail.applicationDocuments[?(@.documentType== 'OWNERPHOTO')].fileStoreId",
                "apiRequest": null,
                "requesttype": "GET",
                "responseMapping":[
                  {
                    "variable":"userpic",
                    "value":"$.fileStoreIds[0].url",
                    "type": "image"
                  }
                ]
              },
              {
                "path": "http://localhost:8282/egov-workflow-v2/egov-wf/process/_search",
                "queryParam": "businessIds=$.applicationNumber,history=true,tenantId=$.tenantId",
                "apiRequest": null,
                "responseMapping":[
                  {
                    "variable":"approvedBy",
                    "value":"$.ProcessInstances[?(@.action == 'APPROVE')].assigner.name"
                  }

                ]
              }

            ]
          },
          {
            "qrcodeConfig": [
              {
                "variable": "qrCode",
                "value": "{{signedCertificateData}}"
              }
            ]
          }
        ]

      }
    ]
  }
}
  1. Create a file by the name of digit-developer-guide.json format-config folder and place the following content in it -

  1. Open the PDF service (under core-services repository of DIGIT-Dev) on your IDE. Open Environment.js file and change the following properties to point to the local config files created. For example, in my local setup I have pointed these to the local files that I created -

  1. Make sure that Kafka and Workflow services are running locally and port-forward the following services -

    • egov-user to port 8284

    • egov-localization to port 8286

    • egov-filestore to 8288

    • egov-mdms to 8082

  2. PDF service is now ready to be started up. Execute the following commands to start it up

  1. Once PDF service is up hit the following cURL to look at the created PDF -

Note: Follow the steps below when the code is deployed to the DIGIT environment. These steps are not applicable for deployment in the local environment. You may choose to follow these when you build and deploy.

Deploy PDF Service

  • Navigate to the forked DIGIT-DevOps repository.

  • Find the deployment helm chart that was used to deploy DIGIT within the deploy-as-code/helm/environments directory.

  • Find "pdf-service"in the deployment helm chart (which was used to set up the DIGIT environment).

  • Find the "data-config-urls" property.

  • Add the path to your new PDF config file here. For this module, we have added file:///work-dir/configs/pdf-service/data-config/digit-developer-guide.json to the end of the data-config-urls. The code block is shown below for reference:

  • Raise a PR for this to the appropriate branch of DevOps which was forked/used to create the deployment.

  • Restart the PDF service in the k8s cluster, once the PR is merged. It will pick up the latest config from the file above.

Last updated

Was this helpful?