@ -0,0 +1,21 @@ |
|||
================== |
|||
Pos Old Orders v10 |
|||
================== |
|||
|
|||
This module adds new options for listing the old orders and printing the corresponding receipts. |
|||
|
|||
Installation |
|||
============ |
|||
|
|||
Just select it from available modules to install it, there is no need to extra installations. |
|||
|
|||
Configuration |
|||
============= |
|||
|
|||
Nothing to configure. |
|||
|
|||
Credits |
|||
======= |
|||
Developer: Linto CT @ cybrosys, linto@cybrosys.in |
|||
|
|||
|
@ -0,0 +1,26 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: LINTO C T(<https://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
import models |
|||
import report |
@ -0,0 +1,43 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: LINTO C T(<https://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
{ |
|||
'name': 'Order Reprinting In POS', |
|||
'version': '10.0.1.0.0', |
|||
'category': 'Point of Sale', |
|||
'summary': 'POS Order Reprinting', |
|||
'author': 'Cybrosys Techno Solutions', |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'images': ['static/description/banner.jpg'], |
|||
'website': 'https://www.cybrosys.com', |
|||
'depends': ['point_of_sale'], |
|||
'data': [ |
|||
'report/receipt_report.xml', |
|||
'views/pos_template.xml', |
|||
'views/point_of_sale_report.xml', |
|||
], |
|||
'qweb': ['static/src/xml/pos.xml'], |
|||
'images': ['static/description/banner.jpg'], |
|||
'installable': True, |
|||
'auto_install': False, |
|||
} |
@ -0,0 +1,3 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
import pos_orderline |
@ -0,0 +1,61 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
from odoo import models, fields, api |
|||
|
|||
|
|||
class PosOrderLines(models.Model): |
|||
_inherit = 'pos.order' |
|||
|
|||
@api.model |
|||
def _default_currency(self): |
|||
return self.env.user.company_id.currency_id |
|||
|
|||
currency_id = fields.Many2one('res.currency', string='Currency', |
|||
required=True, readonly=True, default=_default_currency, track_visibility='always') |
|||
|
|||
@api.model |
|||
def print_receipt(self): |
|||
return { |
|||
'type': 'ir.actions.client', |
|||
'tag': 'aek_browser_pdf', |
|||
'params': { |
|||
'report_name': 'order_reprinting_pos.report_pos_reciept_new', |
|||
'ids': self.ids, |
|||
'datas': ["bjhg,jh"], |
|||
} |
|||
} |
|||
|
|||
@api.model |
|||
def get_details(self, ref): |
|||
order_id = self.env['pos.order'].sudo().search([('pos_reference', '=', ref)], limit=1) |
|||
return order_id.ids |
|||
|
|||
@api.model |
|||
def get_orderlines(self, ref): |
|||
discount = 0 |
|||
result = [] |
|||
order_id = self.search([('pos_reference', '=', ref)], limit=1) |
|||
lines = self.env['pos.order.line'].search([('order_id', '=', order_id.id)]) |
|||
payments = self.env['account.bank.statement.line'].search([('pos_statement_id', '=', order_id.id)]) |
|||
payment_lines = [] |
|||
change = 0 |
|||
for i in payments: |
|||
if i.amount > 0: |
|||
temp = { |
|||
'amount': i.amount, |
|||
'name': i.journal_id.name |
|||
} |
|||
payment_lines.append(temp) |
|||
else: |
|||
change += i.amount |
|||
for line in lines: |
|||
new_vals = { |
|||
'product_id': line.product_id.name, |
|||
'qty': line.qty, |
|||
'price_unit': line.price_unit, |
|||
'discount': line.discount, |
|||
} |
|||
discount += (line.price_unit * line.qty * line.discount) / 100 |
|||
result.append(new_vals) |
|||
|
|||
return [result, discount, payment_lines, change] |
@ -0,0 +1,25 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: LINTO C T(<https://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
import pos_invoice |
@ -0,0 +1,34 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: LINTO C T(<https://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
from odoo import api, models |
|||
|
|||
|
|||
class PosReceiptReport(models.AbstractModel): |
|||
_name = 'report.point_of_sale.report_receipts' |
|||
|
|||
@api.model |
|||
def render_html(self, docids, data=None): |
|||
Report = self.env['report'] |
|||
return Report.sudo().render('order_reprinting_pos.receipt_report', {'docs': self.env['pos.order'].sudo().browse(docids)}) |
@ -0,0 +1,98 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
<template id="receipt_report_document"> |
|||
<t t-call="report.external_layout"> |
|||
<t t-set="o" t-value="o.with_context({'lang':o.partner_id.lang})" /> |
|||
<div class="page"> |
|||
<div class="row"> |
|||
</div> |
|||
|
|||
<h2> |
|||
<span >Receipt</span> |
|||
</h2> |
|||
|
|||
<div class="row mt32 mb32"> |
|||
<div class="col-xs-4" t-if="o.pos_reference"> |
|||
<strong>Ref: </strong> |
|||
<span t-esc="o.pos_reference" /> |
|||
</div> |
|||
<div class="col-xs-4" t-if="o.date_order"> |
|||
<strong>Date:</strong> |
|||
<p t-field="o.date_order"/> |
|||
</div> |
|||
|
|||
<div class="col-xs-4" t-if="o.partner_id"> |
|||
<strong>Customer :</strong> |
|||
<p t-field="o.partner_id.name"/> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- Is there a discount on at least one line? --> |
|||
<t t-set="display_discount" t-value="any([l.discount for l in o.lines])"/> |
|||
|
|||
<table class="table table-condensed"> |
|||
<thead> |
|||
<tr> |
|||
<th>Description</th> |
|||
<th class="text-right">Quantity</th> |
|||
<th class="text-right">Unit Price</th> |
|||
<th t-if="display_discount" class="text-right">Disc.(%)</th> |
|||
<th class="text-right">Taxes</th> |
|||
<th class="text-right">Tax Excluded Price</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody class="invoice_tbody"> |
|||
<tr t-foreach="o.lines" t-as="l"> |
|||
<td><span t-field="l.name"/></td> |
|||
<td class="text-right"> |
|||
<span t-field="l.qty"/> |
|||
</td> |
|||
<td class="text-right"> |
|||
<span t-field="l.price_unit"/> |
|||
</td> |
|||
<td t-if="display_discount" class="text-right"> |
|||
<span t-field="l.discount"/> |
|||
</td> |
|||
<td class="text-right"> |
|||
<span t-esc="', '.join(map(lambda x: (x.description or x.name), l.tax_ids_after_fiscal_position))"/> |
|||
</td> |
|||
<td class="text-right"> |
|||
<span t-field="l.price_subtotal" |
|||
t-options='{"widget": "monetary", "display_currency": o.currency_id}'/> |
|||
</td> |
|||
</tr> |
|||
</tbody> |
|||
</table> |
|||
|
|||
<div class="row"> |
|||
<div class="col-xs-4 pull-right"> |
|||
<table class="table table-condensed"> |
|||
<tr class="border-black"> |
|||
<td><strong>Tax</strong></td> |
|||
<td class="text-right"> |
|||
<span t-field="o.amount_tax" t-options='{"widget": "monetary", "display_currency": o.currency_id}'/> |
|||
</td> |
|||
</tr> |
|||
<tr class="border-black"> |
|||
<td><strong>Total</strong></td> |
|||
<td class="text-right"> |
|||
<span t-field="o.amount_total" t-options='{"widget": "monetary", "display_currency": o.currency_id}'/> |
|||
</td> |
|||
</tr> |
|||
</table> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
</template> |
|||
|
|||
<template id="receipt_report"> |
|||
<t t-call="report.html_container"> |
|||
<t t-foreach="docs" t-as="o"> |
|||
<t t-call="order_reprinting_pos.receipt_report_document" t-lang="o.partner_id.lang"/> |
|||
</t> |
|||
</t> |
|||
</template> |
|||
</data> |
|||
</odoo> |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 15 KiB |
@ -0,0 +1,92 @@ |
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan">POS Old Orders</h2> |
|||
<h3 class="oe_slogan">Order Reprinting POS</h3> |
|||
<h4 class="oe_slogan">Cybrosys Technologies , www.cybrosys.com</h4> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<p class="oe_mt32"> |
|||
This module allows us to list the previous orders and take a printout of each order. |
|||
A new button is added for this purpose. When we click on this button a new list |
|||
will appear, which will show all the previous orders. Once we have validated an order, or |
|||
created an invoice, the corresponding order will be updated in this list. We don't need to |
|||
refresh the browser or close the session. It is also possible to search among the list with order reference. |
|||
</p> |
|||
</div> |
|||
|
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<center> |
|||
<div class="oe_row_img oe_centered"> |
|||
<img class="oe_picture oe_screenshot" src="order-button.png"> |
|||
</div> |
|||
</center> |
|||
<p class="oe_mt32">By clicking on the 'Orders' button, we can see all orders list.</p> |
|||
<div class="oe_row_img oe_centered"> |
|||
<img class="oe_picture oe_screenshot" src="orders-list.png"> |
|||
</div> |
|||
<p class="oe_mt32"> |
|||
We can search orders by their reference. For each order, we can see a button 'Print'. By clicking on this button, we can see the |
|||
details of that particular order. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<center> |
|||
<div class="oe_row_img oe_centered"> |
|||
<img class="oe_picture oe_screenshot" src="old-receipt.png"> |
|||
</div> |
|||
<p class="oe_mt32"> |
|||
The 'Print Receipt' button can be used to download this order in a pdf file. |
|||
</p> |
|||
<div class="oe_row_img oe_centered"> |
|||
<img class="oe_picture oe_screenshot" src="order-re-pdf.png"> |
|||
</div> |
|||
</center> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2> |
|||
<div class="oe_slogan" style="margin-top:10px !important;"> |
|||
<div> |
|||
<a class="btn btn-primary btn-lg mt8" |
|||
style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com"><i |
|||
class="fa fa-envelope"></i> Email </a> <a |
|||
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
|||
href="https://www.cybrosys.com/contact/"><i |
|||
class="fa fa-phone"></i> Contact Us </a> <a |
|||
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
|||
href="https://www.cybrosys.com/odoo-customization-and-installation/"><i |
|||
class="fa fa-check-square"></i> Request Customization </a> |
|||
</div> |
|||
<br> |
|||
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block"> |
|||
<div> |
|||
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;"></i></a></td> |
|||
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;"></i></a></td> |
|||
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px;padding-left: 8px;"></i></a></td> |
|||
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;"></i></a></td> |
|||
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;"></i></a></td> |
|||
</div> |
|||
</div> |
|||
</section> |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 102 KiB |
@ -0,0 +1,7 @@ |
|||
.screen .centered-content-new{ |
|||
position: absolute !important; |
|||
right:25%; top: 64px !important; bottom: 0px !important; |
|||
left:25% !important; |
|||
border-right: dashed 1px rgb(215,215,215) !important; |
|||
border-left: dashed 1px rgb(215,215,215) !important; |
|||
} |
@ -0,0 +1,295 @@ |
|||
odoo.define('order_reprinting_pos',function(require) { |
|||
"use strict"; |
|||
|
|||
var gui = require('point_of_sale.gui'); |
|||
var chrome = require('point_of_sale.chrome'); |
|||
var popups = require('point_of_sale.popups'); |
|||
var core = require('web.core'); |
|||
var models = require('point_of_sale.models'); |
|||
var PosModelSuper = models.PosModel; |
|||
var pos_screens = require('point_of_sale.screens'); |
|||
var Model = require('web.DataModel'); |
|||
var QWeb = core.qweb; |
|||
var _t = core._t; |
|||
|
|||
models.load_models({ |
|||
model: 'pos.order', |
|||
fields: ['id', 'name', 'session_id', 'pos_reference', 'partner_id', 'amount_total', 'amount_tax'], |
|||
loaded: function (self, pos_orders) { |
|||
var new_order_list = []; |
|||
for (var i in pos_orders){ |
|||
new_order_list[pos_orders[i].id] = pos_orders[i]; |
|||
} |
|||
self.pos_orders = new_order_list; |
|||
}, |
|||
}); |
|||
|
|||
var DomCache = core.Class.extend({ |
|||
init: function(options){ |
|||
options = options || {}; |
|||
this.max_size = options.max_size || 2000; |
|||
|
|||
this.cache = {}; |
|||
this.access_time = {}; |
|||
this.size = 0; |
|||
}, |
|||
cache_node: function(key,node){ |
|||
var cached = this.cache[key]; |
|||
this.cache[key] = node; |
|||
this.access_time[key] = new Date().getTime(); |
|||
if(!cached){ |
|||
this.size++; |
|||
while(this.size >= this.max_size){ |
|||
var oldest_key = null; |
|||
var oldest_time = new Date().getTime(); |
|||
for(key in this.cache){ |
|||
var time = this.access_time[key]; |
|||
if(time <= oldest_time){ |
|||
oldest_time = time; |
|||
oldest_key = key; |
|||
} |
|||
} |
|||
if(oldest_key){ |
|||
delete this.cache[oldest_key]; |
|||
delete this.access_time[oldest_key]; |
|||
} |
|||
this.size--; |
|||
} |
|||
} |
|||
return node; |
|||
}, |
|||
clear_node: function(key) { |
|||
var cached = this.cache[key]; |
|||
if (cached) { |
|||
delete this.cache[key]; |
|||
delete this.access_time[key]; |
|||
this.size --; |
|||
} |
|||
}, |
|||
get_node: function(key){ |
|||
var cached = this.cache[key]; |
|||
if(cached){ |
|||
this.access_time[key] = new Date().getTime(); |
|||
} |
|||
return cached; |
|||
}, |
|||
}); |
|||
chrome.OrderSelectorWidget.include({ |
|||
renderElement: function(){ |
|||
var self = this; |
|||
this._super(); |
|||
this.$('.orders-list').click(function(event){ |
|||
self.gui.show_screen('OldOrdersWidget'); |
|||
}); |
|||
}, |
|||
}); |
|||
|
|||
models.PosModel = models.PosModel.extend({ |
|||
_save_to_server: function (orders, options) { |
|||
var result_new = PosModelSuper.prototype._save_to_server.call(this, orders, options); |
|||
var self = this; |
|||
var new_order = {}; |
|||
var order_list = self.pos_orders; |
|||
for (var i in orders) { |
|||
var partners = self.partners; |
|||
var partner = ""; |
|||
for(var j in partners){ |
|||
if(partners[j].id == orders[i].data.partner_id){ |
|||
partner = partners[j].name; |
|||
} |
|||
} |
|||
new_order = { |
|||
'amount_tax': orders[i].data.amount_tax, |
|||
'amount_total': orders[i].data.amount_total, |
|||
'pos_reference': orders[i].data.name, |
|||
'partner_id': [orders[i].data.partner_id, partner], |
|||
'session_id': [ |
|||
self.pos_session.id, self.pos_session.name |
|||
] |
|||
}; |
|||
order_list.push(new_order); |
|||
self.pos_orders = order_list; |
|||
self.gui.screen_instances.OldOrdersWidget.render_list(order_list); |
|||
} |
|||
return result_new; |
|||
}, |
|||
}); |
|||
|
|||
var OldOrdersWidget = pos_screens.ScreenWidget.extend({ |
|||
template: 'OldOrdersWidget', |
|||
|
|||
init: function(parent, options){ |
|||
this._super(parent, options); |
|||
this.order_cache = new DomCache(); |
|||
this.order_string = ""; |
|||
this.pos_reference = ""; |
|||
}, |
|||
|
|||
auto_back: true, |
|||
renderElement: function () { |
|||
this._super(this); |
|||
var self = this; |
|||
this.$('.button.print').click(function(){ |
|||
if (!self._locked) { |
|||
self.gui.screen_instances.receipt.print(); |
|||
} |
|||
new Model('pos.order').call('get_details',[self.pos_reference]).then(function(id){ |
|||
self.chrome.do_action('order_reprinting_pos.pos_receipt_report',{additional_context:{ |
|||
active_ids:[id], |
|||
}}); |
|||
}); |
|||
}); |
|||
}, |
|||
|
|||
show: function(){ |
|||
var self = this; |
|||
this._super(); |
|||
|
|||
this.renderElement(); |
|||
this.details_visible = false; |
|||
|
|||
this.$('.back').click(function(){ |
|||
self.gui.back(); |
|||
}); |
|||
var pos_orders = this.pos.pos_orders; |
|||
this.render_list(pos_orders); |
|||
|
|||
|
|||
var search_timeout = null; |
|||
|
|||
if(this.pos.config.iface_vkeyboard && this.chrome.widget.keyboard){ |
|||
this.chrome.widget.keyboard.connect(this.$('.searchbox input')); |
|||
} |
|||
|
|||
this.$('.searchbox input').on('keypress',function(event){ |
|||
clearTimeout(search_timeout); |
|||
|
|||
var query = this.value; |
|||
search_timeout = setTimeout(function(){ |
|||
self.perform_search(query,event.which === 13); |
|||
},70); |
|||
}); |
|||
|
|||
this.$('.searchbox .search-clear').click(function(){ |
|||
self.clear_search(); |
|||
}); |
|||
}, |
|||
hide: function () { |
|||
this._super(); |
|||
this.new_client = null; |
|||
}, |
|||
perform_search: function(query, associate_result){ |
|||
var new_orders; |
|||
if(query){ |
|||
new_orders = this.search_order(query); |
|||
|
|||
this.render_list(new_orders); |
|||
}else{ |
|||
var orders = this.pos.pos_orders; |
|||
this.render_list(orders); |
|||
} |
|||
}, |
|||
search_order: function(query){ |
|||
var self = this; |
|||
try { |
|||
query = query.replace(/[\[\]\(\)\+\*\?\.\-\!\&\^\$\|\~\_\{\}\:\,\\\/]/g,'.'); |
|||
query = query.replace(' ','.+'); |
|||
var re = RegExp("([0-9]+):.*?"+query,"gi"); |
|||
}catch(e){ |
|||
return []; |
|||
} |
|||
var results = []; |
|||
for(var i = 0; i < Math.min(self.pos.pos_orders.length,1000); i++){ |
|||
var r = re.exec(this.order_string); |
|||
if(r){ |
|||
var id = Number(r[1]); |
|||
results.push(this.get_order_by_id(id)); |
|||
}else{ |
|||
break; |
|||
} |
|||
} |
|||
return results; |
|||
}, |
|||
// returns the order with the id provided
|
|||
get_order_by_id: function (id) { |
|||
return this.pos.pos_orders[id]; |
|||
}, |
|||
clear_search: function(){ |
|||
var orders = this.pos.pos_orders; |
|||
this.render_list(orders); |
|||
this.$('.searchbox input')[0].value = ''; |
|||
this.$('.searchbox input').focus(); |
|||
}, |
|||
render_list: function(orders){ |
|||
var self = this; |
|||
for(var i = 0, len = Math.min(orders.length,1000); i < len; i++) { |
|||
if (orders[i]) { |
|||
var order = orders[i]; |
|||
self.order_string += i + ':' + order.pos_reference + '\n'; |
|||
} |
|||
} |
|||
|
|||
this.$('.order-list-contents').delegate('.print-button','click',function(event){ |
|||
var pos_ref = $(this).data('id'); |
|||
var order_new = null; |
|||
for(var i = 0, len = Math.min(orders.length,1000); i < len; i++) { |
|||
if (orders[i] && orders[i].pos_reference == pos_ref) { |
|||
order_new = orders[i]; |
|||
} |
|||
} |
|||
$('span.searchbox').css('display', 'none'); |
|||
$('.button.print').css('display', 'block'); |
|||
var lines = []; |
|||
var payments = []; |
|||
var discount = 0; |
|||
new Model('pos.order').call('get_orderlines',[order_new.pos_reference]).then(function(result){ |
|||
lines = result[0]; |
|||
payments = result[2]; |
|||
discount = result[1]; |
|||
self.gui.show_screen('OldOrdersWidget'); |
|||
self.$('.window').html(QWeb.render('PosTicketOld',{ |
|||
widget:self, |
|||
order: order_new, |
|||
change: result[3], |
|||
orderlines: lines, |
|||
discount_total: discount, |
|||
paymentlines: payments, |
|||
})); |
|||
self.pos_reference = order_new.pos_reference; |
|||
}); |
|||
}); |
|||
|
|||
var contents = this.$el[0].querySelector('.order-list-contents'); |
|||
if (contents){ |
|||
contents.innerHTML = ""; |
|||
for(var i = 0, len = Math.min(orders.length,1000); i < len; i++) { |
|||
if (orders[i]) { |
|||
var order = orders[i]; |
|||
|
|||
var orderline = this.order_cache.get_node(order.id); |
|||
if (!orderline) { |
|||
var clientline_html = QWeb.render('OrderLine', {widget: this, order: order}); |
|||
var orderline = document.createElement('tbody'); |
|||
orderline.innerHTML = clientline_html; |
|||
orderline = orderline.childNodes[1]; |
|||
if (order.id){ |
|||
this.order_cache.cache_node(order.id, orderline); |
|||
} |
|||
else{ |
|||
this.order_cache.cache_node(i, orderline); |
|||
} |
|||
} |
|||
contents.appendChild(orderline); |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
|
|||
close: function(){ |
|||
this._super(); |
|||
}, |
|||
}); |
|||
gui.define_screen({name:'OldOrdersWidget', widget: OldOrdersWidget}); |
|||
|
|||
|
|||
}); |
@ -0,0 +1,154 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<templates id="template" xml:space="preserve"> |
|||
<t t-extend="OrderSelectorWidget"> |
|||
<t t-jquery="div.order-selector" t-operation="append"> |
|||
<div> |
|||
<span class="order-button square orders-list"> |
|||
Orders |
|||
</span> |
|||
</div> |
|||
</t> |
|||
</t> |
|||
<t t-name="OrderLine"> |
|||
<tr class='order-line' t-att-data-id='order.id'> |
|||
<td><t t-esc='order.pos_reference' /></td> |
|||
<td><t t-esc='order.partner_id[1]' /></td> |
|||
<td><t t-esc='order.session_id[1]'/></td> |
|||
<td><t t-esc='order.amount_total'/></td> |
|||
<td class="print-button" t-att-data-id='order.pos_reference'><span >Print</span></td> |
|||
</tr> |
|||
</t> |
|||
<t t-name="OldOrdersWidget"> |
|||
<div class="clientlist-screen screen"> |
|||
<div class="screen-content"> |
|||
<section class="top-content"> |
|||
<span class='button back'> |
|||
<i class='fa fa-angle-double-left'></i> |
|||
Cancel |
|||
</span> |
|||
<span class='searchbox' style="margin-left:217px !important;"> |
|||
<input placeholder='Search Orders by ref' /> |
|||
<span class='search-clear'></span> |
|||
</span> |
|||
<div class="centered-content-new" style="position:absolute;margin-left:12%;margin-top:-62px;width:20%;"> |
|||
<div class="button print" style="display:none;"> |
|||
<i class='fa fa-print'></i> Print Receipt |
|||
</div> |
|||
</div> |
|||
|
|||
</section> |
|||
<section class="full-content"> |
|||
<div class='window'> |
|||
<section class='subwindow collapsed'> |
|||
<div class='subwindow-container collapsed'> |
|||
<div class='subwindow-container-fix order-details-contents'> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<section class='subwindow'> |
|||
<div class='subwindow-container'> |
|||
<div class='subwindow-container-fix touch-scrollable scrollable-y'> |
|||
<table class='client-list'> |
|||
<thead> |
|||
<tr> |
|||
<th>Reciept Ref.</th> |
|||
<th>Partner</th> |
|||
<th>Session</th> |
|||
<th>Amount Total</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody class='order-list-contents'> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
</div> |
|||
</section> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
|
|||
<t t-name="PosTicketOld"> |
|||
<div class="pos-sale-ticket" style="margin-left:30% !important;"> |
|||
|
|||
<div class="pos-center-align"><t t-esc="moment().format('L LT')"/> <t t-esc="order.pos_reference"/></div> |
|||
<br /> |
|||
<t t-esc="widget.pos.company.name"/><br /> |
|||
Phone: <t t-esc="widget.pos.company.phone || ''"/><br /> |
|||
User: <t t-esc="widget.pos.cashier ? widget.pos.cashier.name : widget.pos.user.name"/><br /> |
|||
<br /> |
|||
|
|||
<table class='receipt-orderlines'> |
|||
<colgroup> |
|||
<col width='50%' /> |
|||
<col width='25%' /> |
|||
<col width='25%' /> |
|||
</colgroup> |
|||
<tr t-foreach="orderlines" t-as="orderline"> |
|||
<td> |
|||
<t t-esc="orderline.product_id"/> |
|||
<t t-if="orderline.discount > 0"> |
|||
<div class="pos-disc-font"> |
|||
With a <t t-esc="orderline.discount"/>% discount |
|||
</div> |
|||
</t> |
|||
</td> |
|||
<td class="pos-right-align"> |
|||
<t t-esc="orderline.qty"/> |
|||
</td> |
|||
<td class="pos-right-align"> |
|||
<t t-esc="widget.format_currency(orderline.price_unit)"/> |
|||
</td> |
|||
</tr> |
|||
</table> |
|||
<br /> |
|||
<table class='receipt-total'> |
|||
<tr> |
|||
<td>Subtotal:</td> |
|||
<td class="pos-right-align"> |
|||
<t t-esc="widget.format_currency(order.amount_total-order.amount_tax)"/> |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<td>Tax:</td> |
|||
<td class="pos-right-align"> |
|||
<t t-esc="widget.format_currency(order.amount_tax)" /> |
|||
</td> |
|||
</tr> |
|||
<tr> |
|||
<td>Discount:</td> |
|||
<td class="pos-right-align"> |
|||
<t t-esc="widget.format_currency(discount_total)"/> |
|||
</td> |
|||
</tr> |
|||
<tr class="emph"> |
|||
<td>Total:</td> |
|||
<td class="pos-right-align"> |
|||
<t t-esc="widget.format_currency(order.amount_total)"/> |
|||
</td> |
|||
</tr> |
|||
</table> |
|||
<br /> |
|||
<table class='receipt-paymentlines'> |
|||
<t t-foreach="paymentlines" t-as="line"> |
|||
<tr> |
|||
<td> |
|||
<t t-esc="line.name"/> |
|||
</td> |
|||
<td class="pos-right-align"> |
|||
<t t-esc="widget.format_currency(line.amount)"/> |
|||
</td> |
|||
</tr> |
|||
</t> |
|||
</table> |
|||
<br /> |
|||
<table class='receipt-change'> |
|||
<tr><td>Change:</td><td class="pos-right-align"> |
|||
<t t-esc="widget.format_currency(change)"/> |
|||
</td></tr> |
|||
</table> |
|||
</div> |
|||
</t> |
|||
|
|||
</templates> |
@ -0,0 +1,27 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<report |
|||
id="pos_orders" |
|||
model="pos.order" |
|||
string="Receipts" |
|||
report_type="qweb-html" |
|||
name="order_reprinting_pos.receipt_report" |
|||
file="order_reprinting_pos.receipt_report" |
|||
/> |
|||
<record id="pos_receipt_report" model="ir.actions.report.xml"> |
|||
<field name="name">Receipt</field> |
|||
<field name="model">pos.order</field> |
|||
<field name="report_type">qweb-pdf</field> |
|||
<field name="report_name">point_of_sale.report_receipts</field> |
|||
</record> |
|||
<record id="view_pos_order_form_inherit" model="ir.ui.view"> |
|||
<field name="name">view_pos_order_updated</field> |
|||
<field name="model">pos.order</field> |
|||
<field name="inherit_id" ref="point_of_sale.view_pos_order_tree"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//field[@name='partner_id']" position="after"> |
|||
<field name="currency_id" /> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,14 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
<template id="assets" inherit_id="point_of_sale.assets"> |
|||
<xpath expr="." position="inside"> |
|||
<script type="text/javascript" src="/order_reprinting_pos/static/src/js/order_reprint.js"></script> |
|||
</xpath> |
|||
<xpath expr="//link[@id='pos-stylesheet']" position="after"> |
|||
<link rel="stylesheet" href="/order_reprinting_pos/static/src/css/style.css"/> |
|||
</xpath> |
|||
</template> |
|||
|
|||
</data> |
|||
</odoo> |