Với Odoo thì cái gì chả tuỳ chỉnh được bác. Một số phần thì tuỳ chỉnh ngay trong giao diện Odoo được, một số phần phức tạp thì cần tuỳ chỉnh bằng module bổ sung. Tuỳ chỉnh cái biên lai của PoS thì không phức tạp nhưng do cơ chế đặc thù của PoS nên việc tuỳ chỉnh biến lai buộc phải viết ở module. Bác cần điều chỉnh lại cho phù hợp với mẫu bên bác.
Share với bác đoạn code xml mà các bác ERPOnline làm cho công ty mình
<templates id="toCoffeeOneReceiptTemplate" xml:space="preserve">
<t t-extend="PosWidget" >
<t t-jquery="img.pos-logo" t-operation="replace">
<img class="pos-logo" t-att-src="widget.session.url('/web/binary/company_logo')"/>
</t>
</t>
<t t-name="PosTicket">
<div class="pos-sale-ticket">
<div class="pos-center-align"><t t-esc="new Date().toString(Date.CultureInfo.formatPatterns.shortDate + ' ' +
Date.CultureInfo.formatPatterns.longTime)"></t> <t t-esc="order.get('name')"></t></div>
<br />
<t t-if='widget.pos.company.logo'>
<div id="company_logo" class="pos-center-align">
<img t-att-src="'data:image/png;base64,' + widget.pos.company.logo" />
</div>
</t>
<t t-esc="widget.pos.company.name"></t><br />
Phone: <t t-esc="widget.pos.company.phone || ''"></t><br />
User: <t t-esc="widget.pos.cashier ? widget.pos.cashier.name : widget.pos.user.name"></t><br />
Customer: <t t-esc="customer_name"></t><br />
Shop: <t t-esc="widget.pos.shop.name"></t><br />
<br />
<t t-if="widget.pos.config.receipt_header">
<div style='text-align:center'>
<t t-esc="widget.pos.config.receipt_header" ></t>
</div>
<br />
</t>
<table>
<colgroup>
<col width='50%' />
<col width='25%' />
<col width='25%' />
</colgroup>
<tr t-foreach="orderlines" t-as="orderline" class="spaceUnder">
<t t-set="discount" t-value="0"></t>
<t t-set="raw_qty" t-value="'' + orderline.get_quantity()"></t>
<t t-if="orderline.get_discount() > 0">
<t t-set="discount" t-value="orderline.get_discount()"></t>
</t>
<td style="vertical-align: top;">
<t t-esc="orderline.get_product().display_name"></t>
<t t-if="discount > 0">
<div class="pos-disc-font">
With a <t t-esc="discount"></t>% discount
</div>
</t>
</td>
<td class="pos-left-align" style="vertical-align: bottom;">
<t t-esc="raw_qty + ' ' + orderline.get_unit().name"></t><br />
<t t-if="discount > 0">
<t t-esc="widget.format_currency_no_currency_symbol(orderline.price - orderline.price * discount/100)"></t>
</t>
<t t-if="discount == 0">
<t t-esc="widget.format_currency_no_currency_symbol(orderline.price)"></t>
</t>
</td>
<td class="pos-right-align" style="vertical-align: bottom;">
<t t-esc="widget.format_currency_no_currency_symbol(orderline.get_display_price())"></t>
</td>
</tr>
</table>
<br />
<table>
<tr>
<td>Subtotal:</td>
<td class="pos-right-align">
<t t-esc="widget.format_currency(order.getTotalTaxExcluded())"></t>
</td>
</tr>
<t t-foreach="order.getTaxDetails()" t-as="taxdetail">
<tr>
<td><t t-esc="taxdetail.name" ></t></td>
<td class="pos-right-align">
<t t-esc="widget.format_currency(taxdetail.amount)" ></t>
</td>
</tr>
</t>
<tr class="spaceUnder">
<td>Discount:</td>
<td class="pos-right-align">
<t t-esc="widget.format_currency(order.getDiscountTotal())"></t>
</td>
</tr>
<tr class="emph">
<td>Total:</td>
<td class="pos-right-align">
<t t-esc="widget.format_currency(order.getTotalTaxIncluded())"></t>
</td>
</tr>
</table>
<br />
<table>
<tr t-foreach="paymentlines" t-as="line">
<td>
<t t-esc="line.name"></t>
</td>
<td class="pos-right-align">
<t t-esc="widget.format_currency(line.get_amount())"></t>
</td>
</tr>
</table>
<br />
<table>
<tr class="emph change">
<td>Change:</td>
<td class="pos-right-align">
<t t-esc="widget.format_currency(order.getChange())"></t>
</td>
</tr>
</table>
<t t-if="widget.pos.config.receipt_footer">
<br />
<div style='text-align:center'>
<t t-esc="widget.pos.config.receipt_footer" ></t>
</div>
</t>
</div>
</t>
</templates>Nói chung, nó không dễ như sửa giao diện Tree, List, Form, Graph của Odoo (có thể làm ngay trong gia diện Odoo). PoS có đặc trưng riêng.