FBR DI Integration Extension for Manager.io

@Abdul_Qadir_Arif I don’t think there is anything wrong with it. You should try it. You will get exactly the right result.

7 posts were split to a new topic: FBR POS Integration Extension for Manager.io

Thank You Sir your Great and amazing Manager.io Desktop i have done all things and completed all the scenarios and now Done my production Environment too!!! my invoices are live now with my own company Logo on the invoice. Really appreciate your work for us. now just keep update Manager.io with the FBR Digital Invoicing System as if they make any change or amend in their rules. Thank @Mabaega

1 Like

i failed again nd again but cant get the fbr logo or e signature on my Invoice? need help about it @Mabaega


<!DOCTYPE html>

<html>
<head>
	<meta charset='UTF-8' />
	<meta name='viewport' content='width=device-width, initial-scale=1.0' />
	<style>
		@page {
			size: A4;
			margin: 20mm;
		}
		*, ::after, ::before, ::backdrop, ::file-selector-button {
			margin: 0;
			padding: 0;
		}
		*, ::after, ::before, ::backdrop, ::file-selector-button {
			box-sizing: border-box;
			border: 0 solid;
		}
		body {
			margin: 0;
			min-width: 800px;
			padding: 30px;
			font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
			color: #171717;
			font-size: 12px;
			line-height: 1.428571429;
			min-width: 800px;
		}
		address {
			font-style: normal;
			line-height: 1.5em;
		}
		dt {
			font-weight: bold;
			margin: 0 0 2px 0;
		}
		dd {
			margin: 0 0 16px 0;
		}
		dd:last-of-type {
			margin-bottom: 0;
		}
		.qrcontainer{
			background-color: #e6f2ff;
			border: 1px solid #b3d1ff;
			border-radius: 8px;
			padding: 10px;
			margin-bottom: 10px;
			display: inline-block;
		}
		@media print {
			body {
				padding: 0;
				min-width: auto;
			}
		}
		table {
			font-size: 12px;
			width: 100%;
		}
		tr#table-headers th {
			font-weight: bold;
			padding: 5px 10px;
			border: 1px solid #000;
			text-align: start
		}
		tbody#table-rows td {
			padding: 5px 10px;
			text-align: start;
			vertical-align: top
		}
		tbody#table-rows tr.row td {
			border-left: 1px solid #000;
			border-right: 1px solid #000;
		}
		tbody#table-rows tr.last-row td {
			padding-bottom: 30px;
			border-bottom: 1px solid #000;
		}
		tbody#table-rows tr.column-total td {
			font-weight: bold;
			border: 1px solid #000;
			white-space: nowrap;
			text-align: right;
		}
		tbody#table-rows tr.total td {
			white-space: nowrap;
		}
		tbody#table-rows tr.total td:first-child {
			text-align: end;
		}
		tbody#table-rows tr.total td:last-child {
			border: 1px solid #000;
			text-align: right;
		}


</style>

</head>
<body>
	<table>
		<thead>
			<tr>
				<td>
					<header style='display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 20px'>
						<h1 id='title' style='font-size: 32px; line-height: 32px; font-weight: bold'></h1>
						<div id='business-logo' style='text-align: end'></div>
					</header>
					<section style='display: flex; margin-bottom: 20px; width: 100%; align-items: flex-start; gap: 20px'>
						<address id='recipient-info' style='flex: 1'></address>
						<dl id='fields' style='flex: 1; text-align: end'></dl>
						<div aria-hidden='true' style='width: 1px; border-left: 1px solid #000; align-self: stretch '></div>
						<address id='business-info' style='white-space: nowrap'></address>
					</section>
					<p style='font-weight: bold; font-size: 14px; margin-bottom: 20px' id='description'></p>
				</td>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>
					<table style='border-collapse: collapse; width: 100%'>
						<thead>
							<tr id='table-headers'></tr>
						</thead>
						<tbody id='table-rows'>
						</tbody>
					</table>
					<div id='qrcode' style='margin-bottom: 20px'></div>
					<div id='custom-fields'></div>
					<table><tr><td><div id='footers'></div></td></tr></table>
					<div id='status' style='text-align: center'></div>
				</td>
			</tr>
		</tbody>
	</table>
	<script>
		function sendResize() {
			window.parent.postMessage({
				type: 'resize',
				width: document.documentElement.scrollWidth + 1,
				height: document.documentElement.scrollHeight + 1
			}, '*');
		}
		window.addEventListener('message', (event) => {
			if (event.source !== window.parent) return;
			if (event.data.type !== 'context-response') return;
			const data = event.data.body;
			document.documentElement.dir = data.direction;
			document.title = [data?.business?.name, data?.title, data?.reference].filter(Boolean).join(' - ');
			document.getElementById('title').innerHTML = data.title || 'No title';
			document.getElementById('description').innerHTML = data.description || '';


		var businessLogoTd = document.getElementById('business-logo');
		if (data.business.logo) {
			const img = document.createElement('img');
			img.addEventListener('load', sendResize); // Resize iframe when logo loads
			img.src = data.business.logo;
			img.style = 'max-height: 150px; max-width: 300px; display: inline';
			businessLogoTd.appendChild(img);
		}
		const business = data.business || {};
		document.getElementById('business-info').innerHTML = `<strong>${business.name || ''}</strong><br>${business.address ? business.address.replace(/\n/g, '<br>') : ''}`;

		const recipient = data.recipient || {};
		document.getElementById('recipient-info').innerHTML = `<strong>${recipient.name || ''}</strong><br>${recipient.address ? recipient.address.replace(/\n/g, '<br>') : ''}`;

		const fieldsDiv = document.getElementById('fields');
		fieldsDiv.innerHTML = '';
		(data.fields || []).forEach(f => {
			const dt = document.createElement('dt');
			dt.innerHTML = f.label;
			const dd = document.createElement('dd');
			dd.innerHTML = f.text;
			fieldsDiv.appendChild(dt);
			fieldsDiv.appendChild(dd);
		});

		const headersRow = document.getElementById('table-headers');
		headersRow.innerHTML = '';
		(data.table.columns || []).forEach(col => {
			const th = document.createElement('th');
			th.innerHTML = col.label;
			th.style.textAlign = col.align;
			if (col.minWidth) {
				th.style.whiteSpace = 'nowrap';
				th.style.width = '1px';
			}
			else if (col.nowrap) {
				th.style.whiteSpace = 'nowrap';
				th.style.width = '80px';
			}
			headersRow.appendChild(th);
		});

		const rowsBody = document.getElementById('table-rows');
		rowsBody.innerHTML = '';
		(data.table.rows || []).forEach(row => {
			const tr = document.createElement('tr');
			tr.className = 'row'; // Apply row styling
			row.cells.forEach((cell, i) => {
				var col = data.table.columns[i]; 
				const td = document.createElement('td');
				td.innerHTML = (cell.text || '').split('\n').join('<br />');
				td.style.textAlign = col.align;
				if (col.minWidth) {
					td.style.whiteSpace = 'nowrap';
					td.style.width = '1px';
				}
				else if (col.nowrap) {
					td.style.whiteSpace = 'nowrap';
					td.style.width = '80px';
				}
				tr.appendChild(td);
			});
			rowsBody.appendChild(tr);
		});

		const rows = rowsBody.querySelectorAll('tr.row');
		if (rows.length > 0) {
			const lastRow = rows[rows.length - 1];
			lastRow.classList.add('last-row');
		}

		const tr = document.createElement('tr');
		tr.classList.add('column-total');
		(data.table.columns || []).forEach(col => {
			const td = document.createElement('td');
			td.style.textAlign = col.align;
			if (col.sumText) td.textContent = col.sumText;
			tr.appendChild(td);
		});
		if (tr.innerText) rowsBody.appendChild(tr);

		(data.table.totals || []).forEach(total => {
			const tr = document.createElement('tr');
			tr.className = 'total';

			const tdLabel = document.createElement('td');
			tdLabel.innerHTML = total.label;
			tdLabel.colSpan = data.table.columns.length - 1; 
			
			const tdValue = document.createElement('td');
			tdValue.innerHTML = total.text;
			tdValue.id = total.key;
			if (total.class) tdValue.classList.add(total.class);
			tdValue.dataset.value = total.number;
			if (total.emphasis) {
				tdLabel.style.fontWeight = 'bold';
				tdValue.style.fontWeight = 'bold';
			}
			tr.appendChild(tdLabel);
			tr.appendChild(tdValue);
			rowsBody.appendChild(tr);
		});
		const customFieldsDiv = document.getElementById('custom-fields');
		const qrCodeDiv = document.getElementById('qrcode');
		customFieldsDiv.innerHTML = '';
		const cssBase64Image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGsAAABrCAYAAABwv3wMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkJBNkUwMkY3NDA1MTFGMDkyNjZBM0UyNkIzNDM1OUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkJBNkUwMzA3NDA1MTFGMDkyNjZBM0UyNkIzNDM1OUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGQkE2RTAyRDc0MDUxMUYwOTI2NkEzRTI2QjM0MzU5QiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGQkE2RTAyRTc0MDUxMUYwOTI2NkEzRTI2QjM0MzU5QiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlV5w7oAAB8WSURBVHja7F0HnFTV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';
		
        const invoiceFieldKey = '24b11f97-46d7-472e-ad4b-e99fbed9197e';
        const qrFieldKey = 'd2e9265a-460e-4a06-83f9-29a523a4d516';
        
        const invoiceField = (data.custom_fields || []).find(cf => cf.key === invoiceFieldKey);
        const invoiceNumber = invoiceField?.text || '';
        
        const excludedKeys = new Set([invoiceFieldKey, qrFieldKey]);
        
        (data.custom_fields || []).forEach(f => {
            if (invoiceNumber && f.key === qrFieldKey) {
                const div = document.createElement('div');
                div.innerHTML = `
                    <div class="qrcontainer">
                        <div style='display: flex; gap: 0px; align-items: center;'>
                            <img src='${cssBase64Image}' style='width: 100px; height: 100px;' />
                            ${f.text}
                        </div>
                        <div style='padding-left: 10px; padding-top: 2px; padding-bottom: 5px; text-align: left; line-height: 1.4; background-color: #fff;'>
                            <strong>FBR Invoice Number:</strong><br />
                            ${invoiceNumber}
                        </div>
                    </div>
                `;
                qrCodeDiv.appendChild(div);
            } else if (f.displayAtTheTop && !excludedKeys.has(f.key)) {
                const dt = document.createElement('dt');
                dt.innerHTML = f.label;
                const dd = document.createElement('dd');
                dd.innerHTML = f.text;
                fieldsDiv.appendChild(dt);
                fieldsDiv.appendChild(dd);
            } else if (!excludedKeys.has(f.key)) {
                const div = document.createElement('div');
                div.innerHTML = `<strong>${f.label || ''}</strong><br />${(f.text || '').split('\n').join('<br />')}<br /><br />`;
                customFieldsDiv.appendChild(div);
            }
        });

		const footersDiv = document.getElementById('footers');
		footersDiv.innerHTML = '';
		(data.footers || []).forEach(f => {
			const div = document.createElement('div');
			div.style = 'margin-top: 20px';
			div.innerHTML = f; // Raw HTML content
			footersDiv.appendChild(div);
			const scripts = div.querySelectorAll('script');
			scripts.forEach(script => {
				const newScript = document.createElement('script');
				for (const attr of script.attributes) {
					newScript.setAttribute(attr.name, attr.value);
				}
				if (script.textContent) {
					newScript.textContent = script.textContent;
				}
				script.parentNode.replaceChild(newScript, script);
			});
		});

		const statusDiv = document.getElementById('status');
		if (data.emphasis?.text != null) {
			statusDiv.style.marginTop = '40px';
			const span = document.createElement('span');
			span.style = 'border-width: 5px; border-color: #FF0000; border-style: solid; padding: 10px; font-size: 20px; text-transform: uppercase';
			if (data.emphasis.positive) {
				span.style.color = 'green';
				span.style.borderColor = 'green';
			}
			if (data.emphasis.negative) {
				span.style.color = 'red';
				span.style.borderColor = 'red';
			}
			span.innerHTML = data.emphasis.text;
			statusDiv.appendChild(span);
		}
		sendResize();
	}, false);

	window.addEventListener('load', () =>
		window.parent.postMessage({ type: 'context-request' }, '*')
	);
</script>

</body>
</html>

The Custom Themes you attached work well. You must ensure that the Themes are correctly selected on the Invoice Form, and that your Invoice Form includes a QR Code image.


In the next update, I plan to merge the Logo with the QR Code directly, similar to the FBR POS Extension, so that custom themes will no longer be required to display the FBR logo and QR Code.

2 Likes

it will be highly appreciated and thank you for your fast reply

@wasi_rajput, in Sales Invoice select Custom Theme FBR-Extension
also in Custom Fields > Image Custom Field should be like this :backhand_index_pointing_down:

2 Likes

Sir thank thank i got this now cz of you thanks again!

1 Like

Can we Upload or import data in manager.io of our Sales form Excel Sheet? @Mabaega @Syed_Salman_Ali

we want to integrate our system FBR Digital Invoicing program? please guide accordingly,

FBR Extension - Integration Guide

@wasi_rajput Please follow batch operations.

@Mabaega We need to add an additional province (FATA/PATA) in the drop down list while setting up business detail. i have updated this in the custom field but is not being populated in the below screen.

below is the screenshot from manual invoicing form in FBR Portal for your reference.

2 Likes

@Mabaega Can you please update the above request in FBR extension?

I already added FATA/PATA in yesterday’s update. Is it still not working?

i have just tried, this is still same

2 Likes

"{
“dated”: “2026-03-17 12:18:04”,
“validationResponse”: {“statusCode”:“01”,“status”:“Invalid”,“errorCode”:“0012”,“error”:“Provided buyer registration type is not valid. Please refer to relevant reference API in the technical document for DI API for valid buyer registration types “,“invoiceStatuses”:null},
“sourceInvoiceNo”:””,

buyer resiteration type sir masla kar rha pichly one week sy!! can you reply with sandbox testing ?

@safdarsana8888 .

Please Change the Customer Type Registered / Unregistered.

Respected brother

There is problem i think on server side!! Check practically on your side!! And can i got your personal WhatsApp to contact there??

I have my own app for di which works since 4 months but suddenly from last week its giving error 0012 error of registered unregistered buyer type. Plz check on your side and reply must!! I have checked all scenarios, all giving this error!! Too much stucked!! Checked spellings everything!! Formulated json manually and tried through postman but respond with same error!!

@safdarsana8888 03360812565
It is possible that the problem is coming from the FBR yesterday. when you’re working.

I’ve tried it and sent a snippet. Our link is working.