| @ -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> | ||||