add pos_receipt_design

This commit is contained in:
Tobias Brunner 2022-08-09 21:06:27 +02:00
parent 41e61e34f7
commit a7908db808
34 changed files with 1697 additions and 0 deletions

398
pos_receipt_design/LICENSE Normal file
View File

@ -0,0 +1,398 @@
SOFTWARE LICENCE AGREEMENT
==========================
This AGREEMENT is made effective on the date of the purchase of the software
between Webkul Software Pvt. Ltd.,Company incorporated under the Companies
Act, 1956 (hereinafter referred to as “Licensor"), and the purchaser of the
software/ product (hereinafter referred to as "Licensee").
Preamble
--------
Licensor is a web and mobile product based organization engaged in the
business of developing and marketing software for enterprise level e-commerce
businesses. It is an ISO and NSR (NASSCOM) certified organization having a
team of more than 150 creative engineers which come from different
backgrounds. It has developed more than 700 web extensions and apps in the
past few years for open source platforms which are used and trusted globally.
Licensee now wishes to obtain license, and Licensor wishes to grant a license,
to allow use of the software so purchased in developing the e-commerce
business website/ mobile app of the Licensee, subject to the terms and
conditions set forth herein.
THEREFORE, with the intent to be legally bound, the parties hereby agree as
follows:
Agreement
---------
1.DEFINITIONS.
As used in this Agreement, the following capitalized terms
shall have the definitions set forth below:
"Derivative Works" are works developed by Licensee, its officers, agents,
contractors or employees, which are based upon, in whole or in part, the
Source Code and/or the Documentation and may also be based upon and/or
incorporate one or more other preexisting works of the Licensor. Derivative
Works may be any improvement, revision, modification, translation (including
compilation or recapitulation by computer), abridgment, condensation,
expansion, or any other form in which such a preexisting work may be recast,
transformed, or adapted. For purposes hereof, a Derivative Work shall also
include any compilation that incorporates such a preexisting work.
"Documentation" is written, printed or otherwise recorded or stored (digital
or paper) material relating to the Software and/or Source Code, including
technical specifications and instructions for its use including Software/
Source Code annotations and other descriptions of the principles of its
operation and instructions for its use.
"Improvements" shall mean, with respect to the Software, all modifications and
changes made, developed, acquired or conceived after the date hereof and
during the entire term of this Agreement.
"Source Code" is the computer programming source code form of the Software in
the form maintained by the Licensor, and includes all non-third-party
executables, libraries, components, and Documentation created or used in the
creation, development, maintenance, and support of the Software as well as all
updates, error corrections and revisions thereto provided by Licensor, in
whole or in part.
2.SOFTWARE LICENSE.
(a)Grant of License. For the consideration set forth below, Licensor hereby
grants to Licensee, and Licensee hereby accepts the worldwide, non-exclusive,
perpetual, royalty-free rights and licenses set forth below:
(i)The right and license to use and incorporate the software, in whole or in
part, to develop its website/ mobile app (including the integration of all or
part of the Licensors software into Licensee's own software) on one domain (
Except Joomla modules , listed on store are entitled to be used on unlimited
domain as per the standard guidelines ) only, solely for the own personal or
business use of the Licensee. However, the License does not authorize the
Licensee to compile, copy or distribute the said Software or its Derivative
Works.
(ii)The right and license does not authorize the Licensee to share any backup
or archival copies of the Software and / or the Source Code and Documentation
on any public internet space including github , stackoverflow etc . The
Licensee must ensure that the backup are not accessible to any other person
and the Licensee must prevent copying / use of source code by any unauthorized
persons.
(iii)The right and license does not authorize the Licensee to migrate the
domain license to another domain.
(iv)Our Joomla extensions are published under the GNU/GPL.
(b)Scope; Rights and Responsibilities.
(i)Licensor shall enable the Licensee to download one complete copy of the
Software.
(ii)The Software is intended for the sole use of the Licensee in development
of its own website/ mobile app.
(iii)Licensee does not have the right to hand over, sell, distribute,
sub-license, rent, lease or lend any portion of the Software or Documentation,
whether modified or unmodified, to anyone. Licensee should not place the
Software on a server so that it becomes accessible via a public network such
as the Internet for distribution purposes. In case the Licensee is using any
source code management system like github, it can use the code there only when
it has paid subscription from such management system.
(iv) In case the Licensee purchases the module and allow the third party
development agency to customize as per its need, it is at liberty to do so
subject to the condition that the Licensee as well as the Agency are not
authorized to sell the modified version of the extension. Except for the
required customization purposes, Licensee is not authorized to release the
Source Code, Derivative Work source code and/or Documentation to any third
party, which shall be considered as violation of the Agreement, inter-alia
entailing forthwith termination and legal action.
(c)Ownership.
(i)Software and Source Code. All right, title, copyright, and interest in the
Software, Source Code, Software Modifications and Error corrections will be
and remain the property of Licensor.
(ii)Derivative Works. As creation of Derivative Works by the Licensee is
prohibited, thus, all right, title, copyright, and interest in any and/or all
Derivative Works and Improvements created by, or on behalf of, Licensee will
also be deemed to the property of Licensor. Licensor shall be entitled to
protect copyright / intellectual property in all such Derivative Works and
Improvements also in any country as it may deem fit including without
limitation seeking copyright and/or patent protection.
3.CONSIDERATION.
(a)Licensee shall pay to Licensor the amount as mentioned on the website from
where the order is placed, as one-time, upfront fees in consideration for the
licenses and rights granted hereunder (hereinafter referred to as the "License
Fee"). The License Fee to be paid by Licensee shall be paid upfront at the
time of placing the order, and no credit will be allowed under any
circumstances.
(b)Once paid, the License Fees shall be non-refundable. The Licensee has fully
satisfied itself about the Software and has seen the demonstration, and only
thereafter has placed the order. Thus, the License Fees or any part thereof is
non-refundable. No claim for refund of the Licence Fees shall be entertained
under any circumstances.
4.REPRESENTATIONS AND WARRANTIES.
(a)Mutual. Each of the parties represents and warrants to the other as
follows.
(i)such party is a legal entity duly organized, validly existing and in good
standing;
(ii)such party has the power and authority to conduct its business as
presently conducted and to enter into, execute, deliver and perform this
Agreement.
(iii)This Agreement has been duly and validly accepted by such party and
constitutes the legal, valid and binding obligations of such party
respectively, enforceable against such party in accordance with their
respective terms;
(iv)the acceptance, execution, delivery and performance of this Agreement does
not and will not violate such party's charter or by-laws; nor require any
consent, authorization, approval, exemption or other action by any third party
or governmental entity.
(b)Licensor warrants that, at the time of purchase of the Software:
the Software will function materially as set forth in the website or published
functionality provided by Licensor to customers and potential customers
describing the Software; and
Software add-ons, if purchased by the Licensee from the Licensor, will not
materially diminish the features or functions of or the specifications of the
Software as they existed as of the execution of this Agreement.
(c)Title. Licensor represents and warrants that it is the exclusive owner of
all copyright/ intellectual property in the Software (including the Source
Code) and has good and marketable title to the Software (including the Source
Code) free and clear of all liens, claims and encumbrances of any nature
whatsoever (collectively, "Liens"). Licensor's grant of license and rights to
Licensee hereunder does not, and will not infringe any third party's property,
intellectual property or personal rights.
5.TERM.
(a)Subject to Licensee's payment obligations, this Agreement shall commence as
on the date of making payment of the Software by the Licensee to the Licensor,
and shall continue until terminated by either party.
(b)The Licensor retains the right to terminate the license at any time, if the
Licensee is not abiding by any of the terms of the Agreement. The Licensee may
terminate the Agreement at any time at its own discretion by uninstalling the
Software and /or by destroying the said Software (or any copies thereof).
However, the Licensee shall not be entitled to seek any refund of the amount
paid by it to the Licensor, under any circumstances.
(c)Survival. In the event this Agreement is terminated for any reason, the
provisions set forth in Sections 2(a), 2(b), and 2(c) shall survive.
6.INDEMNIFICATION.
The Licensee release the Licensor from, and agree to indemnify, defend and
hold harmless the Licensor (and its officers, directors, employees, agents and
Affiliates) against, any claim, loss, damage, settlement, cost, taxes, expense
or other liability (including, without limitation, attorneys' fees) (each, a
"Claim") arising from or related to: (a) any actual or alleged breach of any
obligations in this Agreement; (b) any refund, adjustment, or return of
Software,(c) any claim for actual or alleged infringement of any Intellectual
Property Rights made by any third party or damages related thereto; or (d)
Taxes.
7.LIMITATION OF LIABILITY.
The Licensor will not be liable for any direct, indirect, incidental, special,
consequential or exemplary damages, including but not limited to, damages for
loss of profits, goodwill, use, data or other intangible losses arising out of
or in connection with the Software, whether in contract, warranty, tort etc. (
including negligence, software liability, any type of civil responsibility or
other theory or otherwise) to the Licensee or any other person for cost of
software, cover, recovery or recoupment of any investment made by the Licensee
or its affiliates in connection with this Agreement, or for any other loss of
profit, revenue, business, or data or punitive or consequential damages
arising out of or relating to this Agreement. Further, the aggregate liability
of the Licensor, arising out of or in connection with this Agreement or the
transactions contemplated hereby will not exceed at any time, or under any
circumstances, the total amounts received by the Licensor from the Licensee in
connection with the particular software giving rise to the claim.
8.FORCE MAJEURE.
The Licensor will not be liable for any delay or failure to perform any of its
obligations under this Agreement by reasons, events or other matters beyond
its reasonable control.
9.RELATIONSHIP OF PARTIES.
The Licensor and Licensee are independent legal entities, and nothing in this
Agreement will be construed to create a partnership, joint venture,
association of persons, agency, franchise, sales representative, or employment
relationship between the parties. The Licensee will have no authority to make
or accept any offers or representations on behalf of the Licensor. The
relationship between the parties is that of Licensor and Licensee only, and
the rights, duties, liabilities of each party shall be governed by this
Agreement.
10.MODIFICATION.
The Licensor may amend any of the terms and conditions contained in this
Agreement at any time and solely at its discretion. Any changes will be
effective upon the posting of such changes on the Portal/ website, and the
Licensee is responsible for reviewing these changes and informing itself of
all applicable changes or notices. The continued use of a software by the
Licensee after posting of any changes by the Licensor, will constitute the
acceptance of such changes or modifications by the Licensee.
11.MISCELLANEOUS.
(a)General Provisions. This Agreement: (i) may be amended only by a writing
signed by each of the parties; (ii) may be executed in several counterparts,
each of which shall be deemed an original but all of which shall constitute
one and the same instrument; (iii) contains the entire agreement of the
parties with respect to the transactions contemplated hereby and supersedes
all prior written and oral agreements, and all contemporaneous oral
agreements, relating to such transactions; (iv) shall be governed by, and
construed and enforced in accordance with, the laws of India; and (v) shall be
binding upon, and inure to the benefit of, the parties and their respective
successors and permitted assigns. Each of the parties hereby irrevocably
submits to the jurisdiction of the Courts at Delhi, India, for the purposes of
any action or proceeding arising out of or relating to this Agreement or the
subject matter hereof and brought by any other party.
(b)Assignment. Except for the purpose of customization as mentioned in clause
2(b)(iv) above, Licensee cannot assign, pledge or otherwise transfer, whether
by operation of law or otherwise, this Agreement, or any of its obligations
hereunder, without the prior written consent of Licensor, which consent shall
not be unreasonably withheld.
(c)Notices. Unless otherwise specifically provided herein, all notices,
consents, requests, demands and other communications required or permitted
hereunder:
(i)shall be in writing;
(ii)shall be sent by messenger, certified or registered mail/email, or
reliable express delivery service, to the appropriate address(es) set forth
below; and
(iii)shall be deemed to have been given on the date of receipt by the
addressee, as evidenced by a receipt executed by the addressee (or a
responsible person in his or her office), the records of the Party delivering
such communication or a notice to the effect that such addressee refused to
claim or accept such communication, if sent by messenger, mail or express
delivery service.
All such communications shall be sent to the following addresses or numbers,
or to such other addresses or numbers as any party may inform the others by
giving five days' prior notice:
If to Webkul Software Pvt. Ltd.:
Webkul Software Pvt. Ltd.
A-67, Sector 63, NOIDA 201301,
Uttar Pradesh, India
If to Licensee:
At the address mentioned by the Licensee
(at the time of placing order of generating Invoice)
(d)Severability. It is the intent of the parties that the provisions of this
Agreement be enforced to the fullest extent permissible under the laws and
public policies of India in which enforcement hereof is sought. In
furtherance of the foregoing, each provision hereof shall be severable from
each other provision, and any provision hereof which is/ becomes unenforceable
shall be subject to the following: (i) if such provision is contrary to or
conflicts with any requirement of any statute, rule or regulation in effect,
then such requirement shall be incorporated into, or substituted for, such
unenforceable provision to the minimum extent necessary to make such provision
enforceable; (ii) the court, agency or arbitrator considering the matter is
hereby authorized to (or, if such court, agency or arbitrator is unwilling or
fails to do so, then the parties shall) amend such provision to the minimum
extent necessary to make such provision enforceable, and the parties hereby
consent to the entry of an order so amending such provision; and (iii) if
any such provision cannot be or is not reformed and made enforceable pursuant
to clause (i) or (ii) above, then such provision shall be ineffective to the
minimum extent necessary to make the remainder of this Agreement enforceable.
Any application of the foregoing provisions to any provision hereof shall not
effect the validity or enforceability of any other provision hereof.
(e)By purchasing the Software, the Licensee acknowledge that it has read this
Agreement, and that it agrees to the content of the Agreement, its terms and
agree to use the Software in compliance with this Agreement.
(f)The Licensor holds the sole copyright of the Software. The Software or any
portion thereof is a copyrightable matter and is liable to be protected by the
applicable laws. Copyright infringement in any manner can lead to prosecution
according to the current law. The Licensor reserves the right to revoke the
license of any user who is not holding any license or is holding an invalid
license.
(g)This Agreement gives the right to use only one copy of the Software on one
domain solely for the own personal or business use of the Licensee, subject to
all the terms and conditions of this Agreement. A separate License has to be
purchased for each new Software installation. Any distribution of the Software
without the written consent of the Licensor (including non-commercial
distribution) is regarded as violation of this Agreement, and will entail
immediate termination of the Agreement and may invite liability, both civil
and criminal, as per applicable laws.
(h)The Licensor reserves the rights to publish a selected list of users/
Licensees of its Software, and no permission of any Licensee is needed in this
regard. The Licensee agrees that the Licensor may, in its sole discretion,
disclose or make available any information provided or submitted by the
Licensee or related to it under this Agreement to any judicial,
quasi-judicial, governmental, regulatory or any other authority as may be
required by the Licensor to co-operate and / or comply with any of their
orders, instructions or directions or to fulfill any requirements under
applicable Laws.
(i)If the Licensee continues to use the Software even after the sending of the
notice by the Licensor for termination, the Licensee agree to accept an
injunction to restrain itself from its further use, and to pay all costs (
including but not limited to reasonable attorney fees) to enforce injunction
or to revoke the License, and any damages suffered by the Licensor because of
the misuse of the Software by the Licensee.
12.ARBITRATION.
If any dispute arises between the Licensor and the Licensee at any time, in
connection with the validity, interpretation, implementation or alleged breach
of any provision of this Agreement, the same shall be referred to a sole
Arbitrator who shall be an independent and neutral third party appointed
exclusively by the Licensor. The Licensee shall not object to the appointment
of the Arbitrator so appointed by the Licensor. The place of arbitration shall
be Delhi, India. The Arbitration & Conciliation Act, 1996 as amended by The
Arbitration & Conciliation (Amendment) Act, 2015, shall govern the
arbitration proceedings. The arbitration proceedings shall be held in the
English language.
This document is an electronic record in terms of Information Technology Act,
2000 and the amended provisions pertaining to electronic records in various
statutes as amended by the Information Technology Act, 2000. This electronic
record is generated by a computer system and does not require any physical or
digital signatures.

View File

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
#################################################################################
#
# Copyright (c) 2016-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
# See LICENSE file for full copyright and licensing details.
# License URL : <https://store.webkul.com/license.html/>
#
#################################################################################
from . import models
def pre_init_check(cr):
from odoo.service import common
from odoo.exceptions import Warning
version_info = common.exp_version()
server_serie =version_info.get('server_serie')
if server_serie!='15.0':
raise Warning('Module support Odoo series 15.0 found {}.'.format(server_serie))
return True

View File

@ -0,0 +1,51 @@
# -*- coding: utf-8 -*-
#################################################################################
# Author : Webkul Software Pvt. Ltd. (<https://webkul.com/>)
# Copyright(c): 2015-Present Webkul Software Pvt. Ltd.
# All Rights Reserved.
#
#
#
# This program is copyright property of the author mentioned above.
# You can`t redistribute it and/or modify it.
#
#
# You should have received a copy of the License along with this program.
# If not, see <https://store.webkul.com/license.html/>
#################################################################################
{
"name" : "POS Receipt Design",
"summary" : """This module allows to make custom POS Receipt.""",
"category" : "Point Of Sale",
"version" : "1.0.2",
"author" : "Webkul Software Pvt. Ltd.",
"license" : "Other proprietary",
"website" : "https://store.webkul.com",
"description" : """Odoo POS Receipt Design
Custom Receipt
Design Receipt
Custom XML Receipt
POS Receipt
POS Ticket""",
"live_test_url" : "http://odoodemo.webkul.com/?module=pos_receipt_design&custom_url=/pos/auto",
"depends" : ['point_of_sale'],
"data" : [
'security/ir.model.access.csv',
'demo/demo.xml',
'views/pos_config_view.xml',
'views/receipt_design_view.xml',
],
"assets" : {
'point_of_sale.assets': [
"/pos_receipt_design/static/src/js/models.js",
],
},
"qweb" : ['static/src/xml/pos.xml'],
"images" : ['static/description/Odoo_POS-Receipt-Design_POS-Receipt-Design-Banner.png'],
"application" : True,
"installable" : True,
"auto_install" : False,
"price" : 79,
"currency" : "USD",
"pre_init_hook" : "pre_init_check",
}

View File

@ -0,0 +1,18 @@
<?xml version='1.0' encoding='utf-8'?>
<!-- Copyright (c) 2016-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>) -->
<!-- See LICENSE file for full copyright and licensing details. -->
<!-- License URL : <https://store.webkul.com/license.html/> -->
<odoo noupdate="1">
<function
model="receipt.design"
name="_create_receipt_design_1"/>
<function
model="receipt.design"
name="_create_receipt_design_2"/>
<function
model="receipt.design"
name="_create_receipt_design_3"/>
<function
model="receipt.design"
name="_create_receipt_design_4"/>
</odoo>

View File

@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
#################################################################################
#
# Copyright (c) 2016-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
# See LICENSE file for full copyright and licensing details.
# License URL : <https://store.webkul.com/license.html/>
#
#################################################################################
from . import pos_config
from . import receipt_design

View File

@ -0,0 +1,17 @@
# -*- coding: utf-8 -*-
#################################################################################
#
# Copyright (c) 2016-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
# See LICENSE file for full copyright and licensing details.
# License URL : <https://store.webkul.com/license.html/>
#
#################################################################################
from odoo import api, fields, models, _
import logging
_logger = logging.getLogger(__name__)
class PosConfig(models.Model):
_inherit = 'pos.config'
use_custom_receipt = fields.Boolean(string="Use Custom Receipt")
receipt_design_id = fields.Many2one('receipt.design', string="Receipt Design")

View File

@ -0,0 +1,606 @@
# -*- coding: utf-8 -*-
#################################################################################
#
# Copyright (c) 2016-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
# See LICENSE file for full copyright and licensing details.
# License URL : <https://store.webkul.com/license.html/>
#
#################################################################################
from odoo import api, fields, models, _
class ReceiptDesign(models.Model):
_name = "receipt.design"
_rec_name = "name"
name = fields.Char(string="Name")
receipt_design = fields.Text(string='Description', required=True)
@api.model
def _create_receipt_design_1(self):
record_data = {}
record_data['name'] = "Receipt Design 1"
record_data['receipt_design'] = """
<div class="pos-receipt">
<div style="font-size: 80%; text-align:center;">
<div><span t-esc='receipt.date.localestring'/> <span t-esc='receipt.name'/></div>
</div>
<br/>
<t t-if='receipt.company.logo'>
<img style="width: 30%;display: block;margin: auto;" t-att-src='receipt.company.logo' alt="Logo"/>
<br/>
</t>
<div style="font-size: 80%; text-align:center;">
<t t-if='!receipt.company.logo'>
<h2 class="pos-receipt-center-align">
<t t-esc='receipt.company.name' />
</h2>
</t>
<t t-if='receipt.company.contact_address'>
<div><t t-esc='receipt.company.contact_address' /></div>
</t>
<t t-if='receipt.company.phone'>
<div>Tel:<t t-esc='receipt.company.phone' /></div>
</t>
<t t-if='receipt.company.website'>
<div><t t-esc='receipt.company.website' /></div>
</t>
<t t-if='receipt.header_html'>
<t t-raw='receipt.header_html' />
</t>
<t t-if='!receipt.header_html and receipt.header'>
<div><t t-esc='receipt.header' /></div>
</t>
<br/>
</div>
<br />
<!-- Orderlines -->
<div class='orderlines'>
<div style="text-align:center; font-size: 75%; border-top: 1px dashed black;border-bottom: 1px dashed black;padding-top: 5px;padding-bottom: 5px;">
<div>Receipt : <span t-esc='receipt.name' /></div>
<br/>
<div>Date :
<t t-if="order.formatted_validation_date">
<span t-esc='order.formatted_validation_date' />
</t>
<t t-else="">
<span t-esc='order.validation_date' />
</t>
</div>
<br/>
<t t-if='receipt.client'>
<div>Client : <t t-esc='receipt.client.name' /></div>
<br/>
</t>
<t t-if='receipt.cashier'>
<div class='cashier'>
<div>Served by <t t-esc='receipt.cashier' /></div>
</div>
</t>
</div>
<br/>
<br/>
<table style="width: 100%;">
<tr style="border-bottom: 2px solid black;font-size:15px;">
<th style="text-align:left;">Product</th>
<th>Qty</th>
<th style="text-align: center;">Unit Price</th>
<th>Amount</th>
</tr>
<tr t-foreach="receipt.orderlines" t-as="line" style="border-bottom: 1px solid #ddd;font-size: 16px;font-family: initial;">
<td><div style="padding-top: 10px;padding-bottom: 10px;">
<span t-esc='line.product_name_wrapped[0]'/>
<t t-if='line.discount !== 0'>
<h5 style="margin-top: 0%;margin-bottom: 0%;font-size: 12px;color: #848484;">
<t t-esc='line.discount' />% Discount
</h5>
</t>
</div>
</td>
<td style="text-align: center;"><span t-esc="line.quantity"/><span t-if='line.unit_name !== "Units"' t-esc='line.unit_name'/></td>
<td style="text-align: center;"><span t-esc="widget.pos.format_currency_no_symbol(line.price)"/></td>
<td style="text-align: center;"><span t-esc='widget.pos.format_currency_no_symbol(line.price_display)'/></td>
</tr>
</table>
</div>
<div>
<!-- Subtotal -->
<t t-set='taxincluded' t-value='Math.abs(receipt.subtotal - receipt.total_with_tax) &lt;= 0.000001' />
<t t-if='!taxincluded'>
<br/>
<div style="font-weight: 700;text-align: right; font-size: 20px;border-top: 2px solid;margin-left: 30%; padding-top: 2%;">Subtotal : <span t-esc='widget.pos.format_currency(receipt.subtotal)' class="pos-receipt-right-align"/></div>
<t t-foreach='receipt.tax_details' t-as='tax'>
<div style="font-weight: 700;text-align: right;">
<t t-esc='tax.name' />
<span t-esc='widget.pos.format_currency_no_symbol(tax.amount)' class="pos-receipt-right-align"/>
</div>
</t>
</t>
<!-- Total -->
<br/>
<div style="font-size: 20px;text-align: right;font-weight: 700; border-top: 2px solid;margin-left: 30%;padding-top: 2%;">
TOTAL :
<span t-esc='widget.pos.format_currency(receipt.total_with_tax)'/>
</div>
<br/>
<!-- Extra Payment Info -->
<t t-if='receipt.total_discount'>
<div style="font-size: 14px;text-align: right;border-top: 1px solid;margin-left: 30%;padding-top: 2%;">
Discounts
<span t-esc='widget.pos.format_currency(receipt.total_discount)'/>
</div>
</t>
<br/>
<t t-if='taxincluded'>
<t t-foreach='receipt.tax_details' t-as='tax'>
<div style="font-size: 15px; text-align: right; font-weight: 700; border-top: 1px solid;margin-left: 30%;padding-top: 2%;">
<t t-esc='tax.name' />
<span t-esc='widget.pos.format_currency_no_symbol(tax.amount)'/>
</div>
</t>
<div style="font-size: 15px; text-align: right; font-weight: 700;">
Total Taxes :
<span t-esc='widget.pos.format_currency(receipt.total_tax)'/>
</div>
</t>
</div>
<br/>
<br/>
<div style="border-top: 1px dashed black;padding-top: 5%;border-bottom: 1px dashed black;">
<!-- Payment Lines -->
<t t-foreach='paymentlines' t-as='line'>
<div style="font-size: 14px;">
<t t-esc='line.name' />
<span t-esc='widget.pos.format_currency_no_symbol(line.get_amount())' class="pos-receipt-right-align"/>
</div>
</t>
<br/>
<div class="receipt-change" style="font-size: 14px;">
CHANGE
<span t-esc='widget.pos.format_currency(receipt.change)' class="pos-receipt-right-align"/>
</div>
<br/>
</div>
<div class='before-footer' />
<!-- Footer -->
<div t-if='receipt.footer_html' class="pos-receipt-center-align" style="font-size: 14px;">
<t t-raw='receipt.footer_html'/>
</div>
<div t-if='!receipt.footer_html and receipt.footer' class="pos-receipt-center-align" style="font-size: 13px;">
<br/>
<t t-esc='receipt.footer'/>
<br/>
<br/>
</div>
<div class='after-footer' style="font-size: 14px;">
<t t-foreach='paymentlines' t-as='line'>
<t t-if='line.ticket'>
<br />
<div class="pos-payment-terminal-receipt">
<t t-raw='line.ticket'/>
</div>
</t>
</t>
</div>
<br/>
<div style="text-align:center;">
Thank You. Please Visit Again !!
</div>
</div>"""
record_id = self.create(record_data)
pos_config_id = self.env.ref('point_of_sale.pos_config_main')
if record_id and pos_config_id:
pos_config_id.use_custom_receipt = True
pos_config_id.receipt_design_id = record_id.id
@api.model
def _create_receipt_design_2(self):
record_data = {}
record_data['name'] = "Receipt Design 2"
record_data['receipt_design'] = """
<div class="pos-receipt" style="font-family: monospace;">
<div class="pos-center-align" style="font-size: 12px;">
<t t-if="order.formatted_validation_date">
<t t-esc="order.formatted_validation_date"/>
</t>
<t t-else="">
<t t-esc="order.validation_date"/>
</t>
<br/><t t-esc="order.name"/></div>
<br />
<t t-esc="widget.pos.company.name"/><br />
<div style="font-size:13px">
Phone: <t t-esc="widget.pos.company.phone || ''"/><br />
</div>
<div style="font-size:13px">
User: <t t-esc="widget.pos.cashier ? widget.pos.cashier.name : widget.pos.user.name"/><br />
</div>
<br />
<t t-if="receipt.header">
<div style='text-align:center; font-size:13px'>
<t t-esc="receipt.header" />
</div>
<br />
</t>
<table class='receipt-orderlines' style="font-size:13px;">
<colgroup>
<col width='45%' />
<col width='25%' />
<col width='30%' />
</colgroup>
<tr t-foreach="orderlines" t-as="orderline">
<td><div style="padding-top: 5px;padding-bottom: 5px;">
<t t-esc="orderline.get_product().display_name"/>
<t t-if="orderline.get_discount() > 0">
<div style="font-size: 12px;font-style: italic;color: #808080;">
<t t-esc="orderline.get_discount()"/>% discount
</div>
</t>
</div>
</td>
<td class="pos-right-align">
<div>
<t t-esc="orderline.get_quantity_str_with_unit()"/>
</div>
</td>
<td class="pos-right-align">
<div>
<t t-esc="widget.pos.format_currency(orderline.get_display_price())"/>
</div>
</td>
</tr>
</table>
<br />
<!-- Subtotal -->
<t t-set='taxincluded' t-value='Math.abs(receipt.subtotal - receipt.total_with_tax) &lt;= 0.000001' />
<t t-if='!taxincluded'>
<br/>
<div style="font-weight: 700; font-size: 14px;">Subtotal<span t-esc='widget.pos.format_currency(receipt.subtotal)' class="pos-receipt-right-align"/></div>
<t t-foreach='receipt.tax_details' t-as='tax'>
<div style="font-weight: 700; font-size: 14px;">
<t t-esc='tax.name' />
<span t-esc='widget.pos.format_currency_no_symbol(tax.amount)' class="pos-receipt-right-align"/>
</div>
</t>
</t>
<!-- Total -->
<br/>
<div style="font-weight: 700; font-size: 14px;">
TOTAL
<span t-esc='widget.pos.format_currency(receipt.total_with_tax)' class="pos-receipt-right-align"/>
</div>
<br/><br/>
<!-- Payment Lines -->
<t t-foreach='paymentlines' t-as='line'>
<div style="font-size: 14px;">
<t t-esc='line.name' />
<span t-esc='widget.pos.format_currency_no_symbol(line.get_amount())' class="pos-receipt-right-align"/>
</div>
</t>
<br/>
<div class="receipt-change" style="font-size: 14px;">
CHANGE
<span t-esc='widget.pos.format_currency(receipt.change)' class="pos-receipt-right-align"/>
</div>
<br/>
<!-- Extra Payment Info -->
<t t-if='receipt.total_discount'>
<div style="font-size: 14px;">
Discounts
<span t-esc='widget.pos.format_currency(receipt.total_discount)' class="pos-receipt-right-align"/>
</div>
</t>
<t t-if='taxincluded'>
<t t-foreach='receipt.tax_details' t-as='tax'>
<div style="font-size: 14px;">
<t t-esc='tax.name' />
<span t-esc='widget.pos.format_currency_no_symbol(tax.amount)' class="pos-receipt-right-align"/>
</div>
</t>
<div style="font-size: 14px;">
Total Taxes
<span t-esc='widget.pos.format_currency(receipt.total_tax)' class="pos-receipt-right-align"/>
</div>
</t>
<div class='before-footer' />
<!-- Footer -->
<div t-if='receipt.footer_html' style="text-align: center; font-size: 14px;">
<t t-raw='receipt.footer_html'/>
</div>
<div t-if='!receipt.footer_html and receipt.footer' style="text-align: center;font-size: 14px;">
<br/>
<t t-esc='receipt.footer'/>
<br/><br/>
</div>
<div class='after-footer' style="font-size: 14px;">
<t t-foreach='paymentlines' t-as='line'>
<t t-if='line.ticket'>
<br />
<div class="pos-payment-terminal-receipt">
<t t-raw='line.ticket'/>
</div>
</t>
</t>
</div>
<br/><br/>
<div style="text-align:center;border-top: 2px dotted black;padding-top: 15px;">
<t t-if='receipt.cashier'>
<div class='cashier' style="text-align:center;">
<div>Served by <t t-esc='receipt.cashier' /></div>
</div>
</t>
<br/>
Thank You. Please Visit Again !!
</div>
</div>"""
self.create(record_data)
@api.model
def _create_receipt_design_3(self):
record_data = {}
record_data['name'] = "Receipt Design 3"
record_data['receipt_design'] = """
<div class="pos-receipt">
<t t-esc="widget.pos.company.name"/><br />
<div style="font-size:13px">
Phone: <t t-esc="widget.pos.company.phone || ''"/><br />
</div>
<div style="font-size:13px">
User : <t t-esc="widget.pos.cashier ? widget.pos.cashier.name : widget.pos.user.name"/><br />
</div>
<br/>
<div style="font-size:13px">
Date :
<t t-if="order.formatted_validation_date">
<t t-esc="order.formatted_validation_date"/>
</t>
<t t-else="">
<t t-esc="order.validation_date"/>
</t>
<br />
</div>
<div style="font-size:13px">
Order : <t t-esc="order.name"/><br />
</div>
<br />
<div style="font-size:13px">
Cashier : <t t-esc='receipt.cashier' /><br />
</div>
<br/>
<t t-if="receipt.header">
<div style='text-align:center; font-size:13px'>
<t t-esc="receipt.header" />
</div>
<br />
</t>
<div>
<table class='receipt-orderlines' style="font-size:15px; border-style: double;
border-left: none;border-right: none;border-bottom: none;width: 100%;">
<colgroup>
<col width='40%' />
<col width='30%' />
<col width='30%' />
</colgroup>
<tr style="border-bottom: 1px dashed black;">
<th style="text-align:left;">Product</th>
<th style="text-align:center;">Qty</th>
<th style="text-align:center;">Amount</th>
</tr>
<tr t-foreach="orderlines" t-as="orderline">
<td style="padding-top: 1%;padding-bottom: 1%;">
<t t-esc="orderline.get_product().display_name"/>
<t t-if="orderline.get_discount() > 0">
<div style="font-size: 12px;font-style: italic;color: #808080;">
<t t-esc="orderline.get_discount()"/>% discount
</div>
</t>
</td>
<td class="pos-center-align">
<t t-esc="orderline.get_quantity_str_with_unit()"/>
</td>
<td class="pos-center-align">
<t t-esc="widget.pos.format_currency(orderline.get_display_price())"/>
</td>
</tr>
</table>
</div>
<br />
<div style="padding-top: 6px;">
<!-- Subtotal -->
<t t-set='taxincluded' t-value='Math.abs(receipt.subtotal - receipt.total_with_tax) &lt;= 0.000001' />
<t t-if='!taxincluded'>
<br/>
<div style="font-weight: 700; font-size: 14px; border-top:1px dashed;"><span style="margin-left: 40%;">Subtotal : </span><span t-esc='widget.pos.format_currency(receipt.subtotal)' class="pos-receipt-right-align"/></div>
<t t-foreach='receipt.tax_details' t-as='tax'>
<div style="font-weight: 700; font-size: 14px;">
<span style="margin-left: 40%;"><t t-esc='tax.name' /></span>
<span t-esc='widget.pos.format_currency_no_symbol(tax.amount)' class="pos-receipt-right-align"/>
</div>
</t>
</t>
<!-- Total -->
<br/>
<div style="font-weight: 700; font-size: 14px;">
<span style="margin-left: 40%;">TOTAL : </span>
<span t-esc='widget.pos.format_currency(receipt.total_with_tax)' class="pos-receipt-right-align"/>
</div>
<br/><br/>
</div>
<!-- Payment Lines -->
<t t-foreach='paymentlines' t-as='line'>
<div style="font-size: 14px;border-top:1px dashed;padding-top: 5px;">
<span style="margin-left: 40%;"><t t-esc='line.name' /></span>
<span t-esc='widget.pos.format_currency_no_symbol(line.get_amount())' class="pos-receipt-right-align"/>
</div>
</t>
<br/>
<div class="receipt-change" style="font-size: 14px;">
<span style="margin-left: 40%;">CHANGE : </span>
<span t-esc='widget.pos.format_currency(receipt.change)' class="pos-receipt-right-align"/>
</div>
<br/>
<!-- Extra Payment Info -->
<t t-if='receipt.total_discount'>
<div style="font-size: 14px; border-top:1px dashed;padding-top: 5px;">
<span style="margin-left: 40%;">Discounts : </span>
<span t-esc='widget.pos.format_currency(receipt.total_discount)' class="pos-receipt-right-align"/>
</div>
</t>
<t t-if='taxincluded'>
<t t-foreach='receipt.tax_details' t-as='tax'>
<div style="font-size: 14px;">
<span style="margin-left: 40%;"><t t-esc='tax.name' /></span>
<span t-esc='widget.pos.format_currency_no_symbol(tax.amount)' class="pos-receipt-right-align"/>
</div>
</t>
<div style="font-size: 14px;">
<span style="margin-left: 40%;">Total Taxes : </span>
<span t-esc='widget.pos.format_currency(receipt.total_tax)' class="pos-receipt-right-align"/>
</div>
</t>
<div class='before-footer' />
<!-- Footer -->
<div t-if='receipt.footer_html' style="text-align: center; font-size: 14px;">
<t t-raw='receipt.footer_html'/>
</div>
<div t-if='!receipt.footer_html and receipt.footer' style="text-align: center;font-size: 14px;">
<br/>
<t t-esc='receipt.footer'/>
<br/><br/>
</div>
<div class='after-footer' style="font-size: 14px;">
<t t-foreach='paymentlines' t-as='line'>
<t t-if='line.ticket'>
<br />
<div class="pos-payment-terminal-receipt">
<t t-raw='line.ticket'/>
</div>
</t>
</t>
</div>
<br/><br/>
<div>
Thank You. Please Visit Again !!
</div>
</div>"""
self.create(record_data)
@api.model
def _create_receipt_design_4(self):
record_data = {}
record_data['name'] = "Receipt Design 4"
record_data['receipt_design'] = """
<div class="pos-receipt" style="font-family: 'Inconsolata';">
<div class="pos-receipt-order-data" style="font-size: 14px;">
<t t-if="order.formatted_validation_date">
<t t-esc="order.formatted_validation_date"/>
</t>
<t t-else="">
<t t-esc="order.validation_date"/>
</t>
<t t-esc="order.name"/></div>
<br />
<div class="pos-receipt-contact" style="font-size: 14px; font-family: 'Inconsolata'; text-align:left;">
<div style="font-size:15px;">
<t t-esc="widget.pos.company.name"/><br />
</div>
<div>
Phone: <t t-esc="widget.pos.company.phone || ''"/><br />
</div>
<div class='cashier'>
User: <t t-esc="widget.pos.cashier ? widget.pos.cashier.name : widget.pos.user.name"/><br />
</div>
<br />
<t t-if="receipt.header">
<div style='text-align:center;'>
<t t-esc="receipt.header" />
</div>
<br />
</t>
</div>
<table class='orderlines'>
<colgroup>
<col width='40%' />
<col width='30%' />
<col width='30%' />
</colgroup>
<tr t-foreach="orderlines" t-as="orderline">
<td><div style="padding-top: 5px;padding-bottom: 5px;">
<t t-esc="orderline.get_product().display_name"/>
<t t-if="orderline.get_discount() > 0">
<div style="font-size: 12px;font-style: italic;color: #808080;">
<t t-esc="orderline.get_discount()"/>% discount
</div>
</t>
</div>
</td>
<td style="text-align:right;">
<div>
<t t-esc="orderline.get_quantity_str_with_unit()"/>
</div>
</td>
<td style="text-align:right;">
<div>
<t t-esc="widget.pos.format_currency(orderline.get_display_price())"/>
</div>
</td>
</tr>
</table>
<br />
<table style="width: 100%;">
<tr>
<td>Subtotal:</td>
<td class="pos-receipt-right-align">
<t t-esc="widget.pos.format_currency(order.get_total_without_tax())"/>
</td>
</tr>
<t t-foreach="order.get_tax_details()" t-as="taxdetail">
<tr>
<td><t t-esc="taxdetail.name" /></td>
<td class="pos-receipt-right-align">
<t t-esc="widget.pos.format_currency(taxdetail.amount)" />
</td>
</tr>
</t>
<tr>
<t t-if="order.get_total_discount() > 0">
<td>Discount:</td>
<td class="pos-receipt-right-align">
<t t-esc="widget.pos.format_currency(order.get_total_discount())"/>
</td>
</t>
</tr>
<tr style="font-size: 20px;margin: 5px;">
<td>Total:</td>
<td class="pos-receipt-right-align">
<t t-esc="widget.pos.format_currency(order.get_total_with_tax())"/>
</td>
</tr>
</table>
<br />
<table style="width: 100%;">
<t t-foreach="paymentlines" t-as="line">
<tr>
<td>
<t t-esc="line.name"/>
</td>
<td class="pos-receipt-right-align">
<t t-esc="widget.pos.format_currency(line.get_amount())"/>
</td>
</tr>
</t>
</table>
<br />
<table style="width: 100%;">
<tr><td>Change:</td><td class="pos-receipt-right-align">
<t t-esc="widget.pos.format_currency(order.get_change())"/>
</td></tr>
</table>
<t t-if="receipt.footer">
<br />
<div style='text-align:center'>
<t t-esc="receipt.footer" />
</div>
</t>
</div>"""
self.create(record_data)

View File

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_receipt_design_user,receipt.design,model_receipt_design,point_of_sale.group_pos_user,1,0,0,0
access_receipt_design_manager,receipt.design,model_receipt_design,point_of_sale.group_pos_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_receipt_design_user receipt.design model_receipt_design point_of_sale.group_pos_user 1 0 0 0
3 access_receipt_design_manager receipt.design model_receipt_design point_of_sale.group_pos_manager 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 832 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.3 (57544) - http://www.bohemiancoding.com/sketch -->
<title>support/booking-commerce</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="sticky-notes" transform="translate(-291.000000, -4463.000000)">
<g id="support" transform="translate(271.000000, 4375.000000)">
<g id="Support" transform="translate(0.000000, 67.000000)">
<g id="Booking-commerce" transform="translate(20.000000, 21.000000)">
<g id="support/booking-commerce">
<circle id="Oval" fill="#E9E9E9" cx="30" cy="30" r="30"></circle>
<rect id="bg-top-half-f" fill="#777777" fill-rule="nonzero" x="20" y="20" width="21" height="10"></rect>
<rect id="bg-bottom-half-f" fill="#6C6C6C" fill-rule="nonzero" x="20" y="30" width="21" height="11"></rect>
<path d="M45.991,32 L43.991,29 L44.991,29 L44.991,18.988 C44.9912653,18.1993381 44.6781565,17.442887 44.1205821,16.8851251 C43.5630077,16.3273631 42.8066619,16.014 42.018,16.014 L18.976,16.014 C18.1868184,16.0132036 17.4297016,16.3262152 16.8714781,16.8840635 C16.3132546,17.4419118 15.9997341,18.1988181 16,18.988 L16,20 C16,20.5522847 15.5522847,21 15,21 C14.4477153,21 14,20.5522847 14,20 C14,20 14,19.995 14,19.992 L14,17.836 C13.9999999,16.8182829 14.4044232,15.8422781 15.1242454,15.122831 C15.8440676,14.403384 16.8202831,13.9994694 17.838,14 L43.155,14 C45.2735643,14 46.991,15.7174357 46.991,17.836 L46.991,29 L47.991,29 L45.991,32 Z M40,17 L40,18 L41,18 C42.1045695,18 43,18.8954305 43,20 L43,41 C43,42.1045695 42.1045695,43 41,43 L20,43 C18.8954305,43 18,42.1045695 18,41 L18,20 C18,18.8954305 18.8954305,18 20,18 L21,18 L21,17 L25,17 L25,18 L36,18 L36,17 L40,17 Z M25,20 L20,20 L20,41 L41,41 L41,20 L25,20 Z M17,31.991 L16,31.991 L16,42.034 C15.9997347,42.8226619 16.3128435,43.579113 16.8704179,44.1368749 C17.4279923,44.6946369 18.1843381,45.008 18.973,45.008 L42.017,45.008 C42.8056619,45.008 43.5620077,44.6946369 44.1195821,44.1368749 C44.6771565,43.579113 44.9902653,42.8226619 44.99,42.034 L44.99,41 L45,41 C45,40.4477153 45.4477153,40 46,40 C46.5522847,40 47,40.4477153 47,41 C47,41.016 46.992,41.029 46.991,41.044 L46.991,43.155 C46.991,45.2735643 45.2735643,46.991 43.155,46.991 L17.838,46.991 C16.8204563,46.9915306 15.8443924,46.5877532 15.124599,45.8685224 C14.4048056,45.1492917 14.0002651,44.1735438 14,43.156 L14,31.991 L13,31.991 L15,28.991 L17,31.991 Z" id="black-lines-f" fill="#333333"></path>
<path d="M26,37 L30.939,37 C31.9955738,37.0551938 33.0384606,36.7412673 33.889,36.112 C34.5961294,35.5744822 35.0046951,34.7320941 34.989,33.844 C34.9945538,33.1225376 34.7318982,32.4247361 34.252,31.886 C33.7524197,31.3122483 33.0603091,30.9409412 32.306,30.842 C33.906,30.4166667 34.706,29.5313333 34.706,28.186 C34.7245398,27.306405 34.3381985,26.4669974 33.658,25.909 C32.8154629,25.2628981 31.7677136,24.9432457 30.708,25.009 L26,25.009 L26,37 Z M30.531,26.547 C31.0894085,26.5133722 31.6412987,26.6816011 32.086,27.021 C32.4643734,27.3486066 32.670912,27.8321281 32.646,28.332 C32.6715885,28.8288285 32.4646197,29.3092919 32.086,29.632 C31.6390381,29.9662439 31.0881196,30.1313423 30.531,30.098 L28.029,30.098 L28.029,26.548 L30.534,26.548 L30.531,26.547 Z M28.026,31.636 L30.691,31.636 C31.2870862,31.6063307 31.8738053,31.7931432 32.343,32.162 C32.7575602,32.5124261 32.9871066,33.0346257 32.965,33.577 C32.9927286,34.1053167 32.7767734,34.6171968 32.379,34.966 C31.918091,35.322516 31.3437011,35.5001258 30.762,35.466 L28.029,35.466 L28.029,31.637 L28.026,31.636 Z" id="b-f" fill="#FFFFFF"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -0,0 +1,333 @@
<!-- Copyright (c) 2016-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>) -->
<!-- See LICENSE file for full copyright and licensing details. -->
<!-- License URL : <https://store.webkul.com/license.html/> -->
<section class="oe_container" style="padding-left: 2%; padding-right: 2%;">
<section class="oe_container" id="wk_header">
<div class="mt32 mb32">
<h2 class="text-center" style="color:#000">
Odoo POS Receipt Design
</h2>
<h5 class="mt8 mb8 text-center" style="font-weight:500; font-size:18px; color:#484848; font-family:'Montserrat', sans-serif">
<i>Design The POS Receipt as You Want!</i>
</h5>
</div>
<div class="row mt16 mb16 py-2 m-1" style="font-weight:500; font-size:18px; color:#484848; font-family:'Montserrat', sans-serif">
<div class=" card p-3 container col-md-6 border-right" style="font-weight:500; line-height:24px; font-size:16px; color:#484848; font-family:'Montserrat', sans-serif; vertical-align:middle; display:grid">
<p class="text-justify mb4 mt4 mr8">
Odoo POS Receipt Design allows you to design the reciepts for your Odoo POS as you want to make it more informative as well as enticing. You can easily simply go to your Odoo backend and add easy XML code to make the receipt design more presentable.
</p>
</div>
<div class="card p-3 container col-md-6 ">
<h4 class="ml-md-3">Information</h4>
<div class="mt-2 ml-md-3" style="display:flex">
<span class="ml-1 mr-2 my-auto"><img src="icon-user-guide.png" alt="user-guide"></span>
<div style="font-weight:600; font-size:14px; line-height:10px" class="mt-2">
User Guide
</div>
</div>
<div class="ml-md-3" style="display:flex">
<span style="font-size:15px; margin-top:0.2rem">https://webkul.com/blog/odoo-pos-receipt-design/</span>
</div>
</div>
</div>
<div class="shadow-sm mb-5 bg-white rounded" style="background: #FFFFFF;box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.17196);border-radius: 2px;padding: 2%;padding-bottom: 1%;padding-top: 1%;
margin-top: 4%;margin-bottom: 4%;">
<h3 style="font-family: Montserrat;font-style: normal;font-weight: 600;font-size: 24px;line-height: 37px;color: #333333;">
Do you want to enhance the monotonous receipt design?</h3>
<p style="font-family: Montserrat;font-style: normal;font-weight: normal;font-size: 16px;line-height: 37px;color: #484848;margin-bottom: 0%;;">
Now, do it with some quick and easy steps. It&apos;s completely your call to design the receipt of your Odoo POS as you want.</p>
</div>
</section>
<section class="oe_container">
<div class="row">
<div class="col-md-6 text-justify">
<div>
<h3 style="font-family: Montserrat;
font-style: normal;
font-weight: 600;
font-size: 24px;
line-height: 40px;
color: #333333;">
Customize the design of Receipt as You want</h3>
<h3>
<div class="mt-4">
<p style="font-family: Montserrat;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 30px;
color: #484848;">
Receipt is not just a document acknowledging that a person has received money or goods.
</p>
<p style="font-family: Montserrat;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 30px;
color: #484848;">
However, you can design your receipt for promotions of your store as well as.
</p>
<p style="font-family: Montserrat;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 30px;
color: #484848;">
Apart from promotions, it also helps you to build an impression in front of your customers.
</p>
</div>
</h3>
</div>
</div>
<div class="col-md-6 col-xs-12 " style="text-align: center;">
<div>
<img class="img-responsive" style="display: inline-block;width: 70%;" src="illustration-1.png">
</div>
</div>
</div>
</section>
<br/>
<br/>
<br/>
<section class="oe_container">
<div class="row">
<div class="col-md-6 col-xs-12 " style="text-align: center;">
<div>
<img class="img-responsive" style="display: inline-block;width: 65%;" src="Illustration-2.png">
</div>
</div>
<div class="col-md-6 text-justify" style="margin-top: 25px;">
<div>
<h3 style="font-family: Montserrat;
font-style: normal;
font-weight: 600;
font-size: 24px;
line-height: 40px;
color: #333333;">
Easy Way to Enhance Receipt Design</h3>
<h3>
<div class="mt-4">
<p style="font-family: Montserrat;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 27px;
color: #484848;">
You need to simply navigate in your Odoo backend and add easy XML code to make the receipt design more presentable.
</p>
<br/>
<p style="font-family: Montserrat;
font-style: normal;
font-weight: 500;
font-size: 16px;
line-height: 27px;
color: #484848;">
Hence, choose your colors or style it's all up to you. Moreover, you can select unique design for each POS shop.
</p>
</div>
</h3>
</div>
</div>
</div>
</section>
<br/>
<section class="oe_container" style="margin-top: 2%;">
<h3 style="font-family: Montserrat;
font-style: normal;
font-weight: normal;
font-size: 24px;
line-height: 40px;
color: #333333;">What do you get with Odoo POS Receipt Design?
</h3>
<div style="padding: 1%;">
<div class="row">
<div class="col-lg-4" style="padding: 1%;">
<div class="shadow-sm mb-5 bg-white rounded" style="height: 140px;">
<div style="padding-bottom: 8%;padding-left: 7%;padding-top: 6%;">
<a><img src="icon-1 (1).png"></a>
</div>
<div style="padding: 5%;padding-top: 0%;">
<span style="font-family: Montserrat;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 22px;
color: #333333;">Design POS receipt as you want</span>
</div>
</div>
</div>
<div class="col-lg-4" style="padding: 1%;">
<div class="shadow-sm mb-5 bg-white rounded" style="height: 140px;">
<div style="padding-bottom: 8%;padding-left: 7%;padding-top: 6%;">
<a><img src="Icon-2.png"></a>
</div>
<div style="padding: 5%;padding-top: 1%;">
<span style="font-family: Montserrat;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 22px;
color: #333333;">Add the XML code for the design</span>
</div>
</div>
</div>
<div class="col-lg-4" style="padding: 1%;">
<div class="shadow-sm mb-5 bg-white rounded" style="height: 140px;">
<div style="padding-bottom: 8%;padding-left: 7%;padding-top: 6%;">
<a><img src="Icon-3 (1).png"></a>
</div>
<div style="padding-left: 5%;padding-right: 2%;">
<span style="font-family: Montserrat;
font-style: normal;
font-weight: normal;
font-size: 16px;
line-height: 22px;
color: #333333;">Set Unique Receipt design for each POS Shop</span>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="oe_container mp_tabs">
<div id="my-tab-content" class="tab-content">
<div class="" id="odoo_nexmo_view_tab1">
<section class="shadow-sm mb-5 bg-white rounded oe_container mb-4 mt-4" style="background: #FFFFFF;box-shadow: 0 4px 8px 3px rgba(0,0,0,0.09);">
<div class="oe_container">
<div class="panel panel-primary" id="wkid0">
<div class="panel-heading">
<h3 class="panel-title" style="font-family: Montserrat;
font-style: normal;
font-weight: 600;
font-size: 18px;
line-height: 22px;
text-align: center;
color: #333333;
padding-top: 1%;">Design Receipt with XML Code in Odoo Backend</h3>
</div>
<div class="panel-body" style="padding: 1%; font-size: 18px;color: #484848;text-align: center;">
<a href="receipt_screen1.png">
<img class="img-border img-responsive thumbnail img-fluid" style="border: 1px solid #E0E0E0;" src="receipt_screen1.png">
</a>
</div>
</div>
</div>
</section>
<section class=" shadow-sm mb-5 bg-white rounded oe_container mb-4 mt-4"style="background: #FFFFFF;box-shadow: 0 4px 8px 3px rgba(0,0,0,0.09);">
<div class="oe_container">
<div class="panel panel-primary" id="wkid0">
<div class="panel-heading">
<h3 class="panel-title" style="font-family: Montserrat;
font-style: normal;
font-weight: 600;
font-size: 18px;
line-height: 22px;
text-align: center;
color: #333333;
padding-top: 1%;">Select Receipt design for Odoo POS</h3>
</div>
<div class="panel-body" style="padding: 1%; font-size: 18px;color: #484848;text-align: center;">
<a href="receipt_screen2.png">
<img class="img-border img-responsive thumbnail img-fluid" style="border: 1px solid #E0E0E0;" src="receipt_screen2.png">
</a>
</div>
</div>
</div>
</section>
<section class="shadow-sm mb-5 bg-white rounded oe_container mb-4 mt-4" style="background: #FFFFFF;box-shadow: 0 4px 8px 3px rgba(0,0,0,0.09);">
<div class="oe_container">
<div class="panel panel-primary" id="wkid0">
<div class="panel-heading">
<h3 class="panel-title" style="font-family: Montserrat;
font-style: normal;
font-weight: 600;
font-size: 18px;
line-height: 22px;
text-align: center;
color: #333333;
padding-top: 1%;">Freshly Designed Odoo POS Receipt</h3>
</div>
<div class="panel-body" style="padding: 1%; font-size: 18px;color: #484848;text-align: center;">
<div class="row">
<div style="width:215px;float:left; padding:5px;margin:3px;margin-left: 5%;">
<a href="receipt_1.jpg">
<img src="receipt_1.jpg" alt="receipt 1" style="width:215px;float:left;background:#ededed; padding:5px;margin:3px;border:1px solid #c8c8c8">
</a>
</div>
<div style="width:215px;float:left; padding:5px;margin:3px">
<a href="receipt_2.jpg">
<img src="receipt_2.jpg" alt="receipt 2" style="width:215px;float:left;background:#ededed; padding:5px;margin:3px;border:1px solid #c8c8c8">
</a>
</div>
<div style="width:215px;float:left;padding:5px;margin:3px">
<a href="receipt_3.jpg">
<img src="receipt_3.jpg" alt="receipt 3" style="width:215px;float:left;background:#ededed; padding:5px;margin:3px;border:1px solid #c8c8c8">
</a>
</div>
<div style="width:215px;float:left; padding:5px;margin:3px">
<a href="receipt_4.jpg">
<img src="receipt_4.jpg" alt="receipt 4" style="width:215px;float:left;background:#ededed; padding:5px;margin:3px;border:1px solid #c8c8c8">
</a>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</section>
<section class="pt32" id="webkul_support">
<div class="row">
<div class="col-12">
<h2 class="text-center">Help and Support</h2>
<p class="mb-2 text-center" style="font-size:16px; color:#333; font-weight:400">Get Immediate support for any of your query</p>
</div>
<div class="col-12">
<p class="text-center px-5" style="font-size:14px; color:#555; font-weight:normal">You will get 90 days free support for any doubt, queries, and bug fixing (excluding data recovery) or any type of issue related to this module.</p>
</div>
<div class="mx-auto col-lg-9 mb-4 oe_screenshot">
<div class="row align-items-center justify-content-center mx-0 p-3">
<div class="col-sm-2 text-center pr-0">
<img src="mail.png" alt="mail" class="img img-fluid">
</div>
<div class="col-xl-7 col-sm-10">
<p class="my-2" style="color:#555; font-weight:bold">Write a mail to us:</p>
<b class="text-primary" style="font-size:18px">support@webkul.com</b>
<p class="my-2" style="font-size:14px; color:#777; font-weight:normal">Any queries or want any extra features? Just drop a mail to our support.</p>
</div>
<div class="col-xl-3 offset-xl-0 float-xl-right col-sm-10 offset-sm-2 float-left mt16">
<a href="mailto:support@webkul.com" style="padding:10px 22px; background-color:#2335D7; font-size:14px; color:#fff"><i class="fa fa-pencil-square-o" style="color:white; margin-right:4px"></i>Write To US</a>
</div>
</div>
</div>
<div class="mx-auto col-lg-9 oe_screenshot">
<div class="row align-items-center justify-content-center mx-0 p-3">
<div class="col-sm-2 text-center pr-0">
<img src="support-icon.png" alt="support-icon" class="img img-fluid">
</div>
<div class="col-sm-10 ">
<p class="my-2" style="font-weight:bold; color:#555">Get in touch with our Expert:</p>
<b class="text-primary text-break" style="font-size:18px">https://webkul.uvdesk.com/en/customer/create-ticket/</b>
<p class="my-2" style="font-weight:normal; font-size:14px; color:#777">Have any technical queries, want extra features, or anything else? Our team is here to answer all your questions. Just Raise A Support Ticket.</p>
</div>
</div>
</div>
</div>
</section>
<br/>
<section class="oe_container">
<div class="span12">
<!-- Piwik Image Tracker-->
<img src="http://odooimg.webkul.com/analytics/piwik/piwik.php?idsite=3&amp;rec=1&amp;action_name=POS-RECEIPT-DESIGN&amp;url=https://apps.openerp.com/apps/modules/14.0/pos_receipt_design&amp;uid=pos_receipt_design" style="border:0" alt="">
<!-- End Piwik -->
</div>
<section>
</section>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.3 (57544) - http://www.bohemiancoding.com/sketch -->
<title>support/uvdesk</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="sticky-notes" transform="translate(-291.000000, -4577.000000)">
<g id="support" transform="translate(271.000000, 4375.000000)">
<g id="Support" transform="translate(0.000000, 67.000000)">
<g id="UVdesk" transform="translate(20.000000, 135.000000)">
<g id="support/uvdesk">
<circle id="Oval" fill="#E9E9E9" cx="30" cy="30" r="30"></circle>
<g id="uvdesk" transform="translate(16.000000, 14.000000)" fill="#575757">
<path d="M28.98,16.663 L28.98,16.44 C28.9741496,16.2310148 29.1142521,16.046013 29.317,15.995 L30.666,15.995 C30.886,15.995 31.003,16.073 31.003,16.218 L31.003,16.663 L28.98,16.663 Z M27.291,20.663 L25.618,20.663 L25.618,12.007 L27.291,12.007 C27.5590971,11.9698078 27.8294423,12.0576284 28.0245013,12.2452752 C28.2195603,12.4329219 28.3177832,12.6996639 28.291,12.969 L28.291,19.705 C28.3177832,19.9743361 28.2195603,20.2410781 28.0245013,20.4287248 C27.8294423,20.6163716 27.5590971,20.7041922 27.291,20.667 L27.291,20.663 Z M6.4,21.333 C5.55516536,21.3504938 4.76691072,20.9097876 4.33936257,20.1809157 C3.91181441,19.4520438 3.91181441,18.5489562 4.33936257,17.8200843 C4.76691072,17.0912124 5.55516536,16.6505062 6.4,16.668 C7.24483464,16.6505062 8.03308928,17.0912124 8.46063743,17.8200843 C8.88818559,18.5489562 8.88818559,19.4520438 8.46063743,20.1809157 C8.03308928,20.9097876 7.24483464,21.3504938 6.4,21.333 Z M22.473,14.349 C19.2569328,16.5704071 15.0970234,16.8978568 11.573,15.207 C10.2502614,14.6098427 9.04965321,13.7727058 8.032,12.738 C6.58967546,14.501886 4.54173171,15.664907 2.288,16 L2.288,19.52 C2.29784571,22.3188499 3.35443341,25.0127562 5.25,27.072 C6.33244248,28.2485896 7.66520977,29.1671739 9.15,29.76 L8.5,32 C6.60081885,31.2946599 4.91078793,30.1206164 3.587,28.587 C1.30225519,26.0624102 0.0255828499,22.7858433 6.66133815e-16,19.381 L6.66133815e-16,14.9 L0,12.16 C0.101266362,5.40153198 5.61879957,-0.0188270327 12.378,6.6610671e-16 C19.0177713,0.00846272136 24.4909491,5.20929946 24.838,11.84 C24.8569585,12.1597192 24.8569585,12.4802808 24.838,12.8 L22.473,14.349 Z M15.5,27.326 C16.2403525,27.3271042 16.8397352,27.9279784 16.8389993,28.6683313 C16.8382635,29.4086843 16.2376876,30.0083659 15.4973343,30.0079983 C14.7569811,30.0076308 14.1570008,29.4073533 14.157,28.667 C14.1572651,28.3110794 14.2989083,27.9698418 14.5507697,27.7183555 C14.8026311,27.4668692 15.1440794,27.3257347 15.5,27.326 Z M18.532,16.668 C19.8168525,16.6834216 20.8473569,17.7348736 20.8369229,19.0197763 C20.826489,20.304679 19.7790451,21.3392571 18.4941116,21.333811 C17.2091781,21.3283649 16.1705418,20.284945 16.171,19 C16.1744383,18.3780643 16.4248036,17.7829685 16.8670165,17.3456316 C17.3092294,16.9082947 17.9070645,16.6645426 18.529,16.668 L18.532,16.668 Z M29.032,17.335 L31,17.335 C31.383,26.919 20.8,29.435 17.517,29.328 C17.657156,29.0278906 17.657156,28.6811094 17.517,28.381 C30.633,27.774 29.031,17.335 29.031,17.335 L29.032,17.335 Z" id="Logo-Icon"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -0,0 +1,122 @@
/* Copyright (c) 2016-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>) */
/* See LICENSE file for full copyright and licensing details. */
/* License URL : <https://store.webkul.com/license.html/> */
odoo.define('wk_pos_invoice_offline.models', function (require) {
"use strict"
var models = require('point_of_sale.models');
var PosDB = require("point_of_sale.DB");
const Registries = require('point_of_sale.Registries');
const OrderReceipt = require('point_of_sale.OrderReceipt');
const AbstractReceiptScreen = require('point_of_sale.AbstractReceiptScreen');
const { nextFrame } = require('point_of_sale.utils');
models.load_models([{
model: 'receipt.design',
loaded: function(self, designs) {
self.db.all_designs = designs;
self.db.receipt_by_id = {};
designs.forEach(function(design){
self.db.receipt_by_id[design.id] = design;
});
},
}])
PosDB.include({
init: function(options){
var self = this;
this._super(options);
this.receipt_design = null;
},
})
// Inherit AbstractReceiptScreen
const PosResAbstractReceiptScreen = (AbstractReceiptScreen) =>
class extends AbstractReceiptScreen{
async _printReceipt() {
var self = this;
if(!self.env.pos.config.use_custom_receipt){
var data = super._printReceipt();
return data
} else {
if (self.env.pos.proxy.printer) {
var receipt_design_id = self.env.pos.config.receipt_design_id[0]
var receipt_design = self.env.pos.db.receipt_by_id[receipt_design_id].receipt_design
var order = self.env.pos.get_order();
var data = { widget: self.env,
pos: order.pos,
order: order,
receipt: order.export_for_printing(),
orderlines: order.get_orderlines(),
paymentlines: order.get_paymentlines(), };
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(receipt_design,"text/xml");
var s = new XMLSerializer();
var newXmlStr = s.serializeToString(xmlDoc);
//Works using the DOMParser
var qweb = new QWeb2.Engine();
qweb.add_template('<templates><t t-name="receipt_design">'+newXmlStr+'</t></templates>');
var receipt = qweb.render('receipt_design',data);
const printResult = await self.env.pos.proxy.printer.print_receipt(receipt);
if (printResult.successful) {
return true;
} else {
const { confirmed } = await self.showPopup('ConfirmPopup', {
title: printResult.message.title,
body: 'Do you want to print using the web printer?',
});
if (confirmed) {
await nextFrame();
return await self._printWeb();
}
return false;
}
} else {
return await self._printWeb();
}
}
}
}
Registries.Component.extend(AbstractReceiptScreen, PosResAbstractReceiptScreen);
// Inherit OrderReceipt
const PosResOrderReceipt = (OrderReceipt) =>
class extends OrderReceipt{
mounted(){
var self = this;
super.mounted();
if(self.env.pos.config.use_custom_receipt){
var receipt_design_id = self.env.pos.config.receipt_design_id[0]
var receipt_design = self.env.pos.db.receipt_by_id[receipt_design_id].receipt_design
var order = self._receiptEnv.order;
var data = { widget: self.env,
pos: order.pos,
order: order,
receipt: order.export_for_printing(),
orderlines: order.get_orderlines(),
paymentlines: order.get_paymentlines(), };
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(receipt_design,"text/xml");
var s = new XMLSerializer();
var newXmlStr = s.serializeToString(xmlDoc);
//Works using the DOMParser
var qweb = new QWeb2.Engine();
qweb.add_template('<templates><t t-name="receipt_design">'+newXmlStr+'</t></templates>');
var receipt = qweb.render('receipt_design',data) ;
$('div.pos-receipt').replaceWith(receipt);
}
}
}
Registries.Component.extend(OrderReceipt, PosResOrderReceipt);
});

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2016-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>) -->
<!-- See LICENSE file for full copyright and licensing details. -->
<!-- License URL : <https://store.webkul.com/license.html/> -->
<odoo>
<data>
<record id="pos_config_view_receipt_design_form_inherit" model="ir.ui.view">
<field name="name">pos.config.form</field>
<field name="model">pos.config</field>
<field name="inherit_id" ref="point_of_sale.pos_config_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='iface_invoicing']" position="after">
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="use_custom_receipt"/>
</div>
<div class="o_setting_right_pane">
<label for="use_custom_receipt"/>
<div class="text-muted">
Use Custom Receipt
</div>
<div class="content-group mt16" attrs="{'invisible': [('use_custom_receipt', '=', False)]}">
<field name="receipt_design_id" attrs="{'required': [('use_custom_receipt', '=', True)]}"/>
</div>
</div>
</div>
</xpath>
</field>
</record>
</data>
</odoo>

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2016-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>) -->
<!-- See LICENSE file for full copyright and licensing details. -->
<!-- License URL : <https://store.webkul.com/license.html/> -->
<odoo>
<data>
<record id="receipt_design_form_view" model="ir.ui.view">
<field name="name">Receipt Design</field>
<field name="model">receipt.design</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string='Receipt Design'>
<sheet>
<group>
<field name="name"/>
<field name='receipt_design' widget="ace" options="{'mode': 'xml'}" string="Receipt XML"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="receipt_design_tree_view" model="ir.ui.view">
<field name="name">Receipt Design</field>
<field name="model">receipt.design</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string='Receipt Design'>
<field name="name"/>
</tree>
</field>
</record>
<record id="receipt_design_action_window" model="ir.actions.act_window">
<field name="name">Receipt Designs</field>
<field name="res_model">receipt.design</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="pos_receipt_design.receipt_design_tree_view"/>
</record>
<menuitem id="menu_receipt_design" parent="point_of_sale.menu_point_config_product" action="pos_receipt_design.receipt_design_action_window"/>
</data>
</odoo>