Cara membuat template report dari API pihak ke tiga (PAJAK.IO)

Assalamualaikums warahmatullahi wabaraktuh. Pada kesempatan kali ini, saya ingin membahas topik terkait odoo, yakni cara membuat template report dari API pihak ketiga, yaitu Pajak.io tanpa harus membuat template secara manual di Odoo.

Hal ini dilakukan ketika terdapat case yang mana kita diharuskan untuk menggunakan template report beserta data yang disediakan oleh pihak ketiga. Dalam hal ini saya akan menggunakan API Pajak.io sebagai contoh nya. Dengan menggunakan template report dari pihak ketiga, kita tidak perlu membuat template report lagi dari awal.

Pertama kita perlu menyiapkan kredensial nya terlebih dahulu, pada Pajak.io kredensial yang dibutuhkan hanya Token API. Setelah itu kita lakukan hit API Pajak.io untuk mendapatkan template report nya.

def isBase64(self, input_str):
try:
missing_padding = len(input_str) % 4
if missing_padding:
input_str += '=' * (4 - missing_padding)

decoded_bytes = base64.b64decode(input_str)

decoded_bytes.decode('utf-8')

return input_str
except (base64.binascii.Error, UnicodeDecodeError):
cleaned_input = input_str.rstrip('=')
encoded_bytes = base64.b64encode(cleaned_input.encode('utf-8'))
return encoded_bytes.decode('utf-8')

def action_post_vat_output_pdf(self):
params = {
'client_id': self.env['ir.config_parameter'].sudo().
                get_param('pajak_io.client_id'),
'user_token': self.env['ir.config_parameter'].sudo().
                get_param('pajak_io.user_token'),
'is_production': self.env['ir.config_parameter'].sudo().
                get_param('pajak_io.is_production'),
'base_url_sandbox': self.env['ir.config_parameter'].sudo().
                get_param('pajak_io.base_url_sandbox'),
'base_url_production': self.env['ir.config_parameter'].sudo()
                .get_param('pajak_io.base_url_production')
}
action = self.env.ref('pajak_io.pajak_io_config_settings_action')
empty_fields = [field_name for field_name, field_value in params.items()
            if not field_value and field_name != 'is_production']
if empty_fields:
# Jika ada parameter yang kosong, munculkan pesan kesalahan
error_message = _('The following fields must be filled
                in pajak io integration settings: %s') % ', '.join(empty_fields)
raise RedirectWarning(error_message, action.id, _('Go to
                Integration Settings'))
params['user_token'] = self.isBase64(params['user_token'])
                # konversi user token ke base64 (wajib)
base_url = params['base_url_sandbox'] if not params['is_production']
            else params['base_url_production']
headers = {'Content-Type': 'application/json',
            'Authorization' : params["user_token"]}
body = [{
'transactionId': self.vat_id_transaction
}]
response = requests.post(f'{base_url}/efaktur/penjualan/get-pdf',     
            headers=headers, json=body)

if response.status_code == 200:
base64_data = response.json()['data']['filePdf']

# Decode Base64 string
binary_data = base64.b64decode(base64_data)

return binary_data
elif response.status_code == 401:
raise UserError(_('Authentication failed.
            Please check your user token.'))
elif response.status_code == 400:
raise UserError(_('Request to Pajak.io API failed. Error: %s'
                % response.json()['message']))



Lalu kita bikin report nya terlebih dahulu

<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record id="action_vat_output" model="ir.actions.report">
<field name="name">VAT Output PDF</field>
<field name="model">account.move</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">pajak_io.report_vat_output</field>
<field name="report_file">pajak_io.report_vat_output</field>
<field name="print_report_name">('VAT Output - %s' % (object.name))</field>
<field name="binding_model_id" ref="model_account_move"/>
<field name="binding_type">report</field>
</record>

</odoo>


Selanjutnya kita bikin template report kosong yang nanti nya akan di replace dengan template report yang di berikan oleh Pajak.io


<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<template id="pajak_io.report_vat_output">
<t t-call="web.html_container">
</t>
</template>
</data>
</odoo>


Dan terakhir kita ubah method _render_qweb_pdf dan replace binary data dari odoo dengan binary data yang di berikan oleh Pajak.io

from odoo import _, models
from odoo.exceptions import UserError


class IrActionsReport(models.Model):
_inherit = 'ir.actions.report'

def _render_qweb_pdf(self, report_ref, res_ids=None, data=None):
res = super()._render_qweb_pdf(report_ref, res_ids=res_ids, data=data)
if self._get_report(report_ref).report_name == 'pajak_io.report_vat_output':
invoices = self.env['account.move'].browse(res_ids)
if invoices.vat_id_transaction:
res_list = list(res) # Convert tuple to list
res_list[0] = invoices.action_post_vat_output_pdf()
                    # Replace the original binary PDF
res = tuple(res_list) # Convert the list back to a tuple
else:
raise UserError(_("This invoice has not been sent to
                    Pajak.io. Please ensure it is submitted before proceeding."))

return res


Hasil nya



Terimakasih




Instalasi Odoo 16 untuk Developer di Windows 11