diff --git a/addons/point_of_sale/static/src/js/pos_devices.js b/addons/point_of_sale/static/src/js/pos_devices.js index ede016cbd39..82e45dd7105 100644 --- a/addons/point_of_sale/static/src/js/pos_devices.js +++ b/addons/point_of_sale/static/src/js/pos_devices.js @@ -160,45 +160,44 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal this.message('open_cashbox'); }, - // ask the printer to print a receipt + /* ask the printer to print a receipt + * receipt is a JSON object with the following specs: + * receipt{ + * - orderlines : list of orderlines : + * { + * quantity: (number) the number of items, or the weight, + * unit_name: (string) the name of the item's unit (kg, dozen, ...) + * list_price: (number) the price of one unit of the item before discount + * discount: (number) the discount on the product in % [0,100] + * product_name: (string) the name of the product + * price_with_tax: (number) the price paid for this orderline, tax included + * price_without_tax: (number) the price paid for this orderline, without taxes + * tax: (number) the price paid in taxes on this orderline + * } + * - paymentlines : list of paymentlines : + * { + * amount: (number) the amount paid + * journal: (string) the name of the journal on wich the payment has been made + * } + * - total_with_tax: (number) the total of the receipt tax included + * - total_without_tax: (number) the total of the receipt without taxes + * - total_tax: (number) the total amount of taxes paid + * - total_paid: (number) the total sum paid by the client + * - change: (number) the amount of change given back to the client + * - name: (string) a unique name for this order + * - client: (string) name of the client. or null if no client is logged + * - cashier: (string) the name of the cashier + * - date: { the date at wich the payment has been done + * year: (number) the year [2012, ...] + * month: (number) the month [0,11] + * date: (number) the day of the month [1,31] + * day: (number) the day of the week [0,6] + * hour: (number) the hour [0,23] + * minute: (number) the minute [0,59] + * } + */ print_receipt: function(receipt){ - var sample_receipt = { - // TODO This is a sample receipt, - // we need to discuss the exact format based on what really needs - // to be printed on the receipt ... - // ... the same for invoices ... - client_name: 'John Smith', - cashier_name: 'Mike Doe', - date: '28 january 2024, 17h32', - currency:{ - symbol: '$', - position: 'before', - }, - total_with_taxes: 94.1, - total_without_taxes: 90, - taxes: 4.1, - orderlines:[ - { - name: 'Cola', - unit_price_with_taxes: 1, - unit_price_without_taxes: 0.8, - total_price_with_taxes: 10, - total_price_without_taxes: 8, - quantity: '10 Bottles', - discount: '', - }, - { - name: 'Pizza', - unit_price_with_taxes: 3, - unit_price_without_taxes: 2, - total_price_with_taxes: 18, - total_price_without_taxes: 12, - quantity: '10', - discount: '40 %', - } - ], - }; - this.message('print_receipt',{receipt: receipt || sample_receipt}); + this.message('print_receipt',{receipt: receipt}); }, }); diff --git a/addons/point_of_sale/static/src/js/pos_models.js b/addons/point_of_sale/static/src/js/pos_models.js index 69858d8a4b2..4eda2f1cb89 100644 --- a/addons/point_of_sale/static/src/js/pos_models.js +++ b/addons/point_of_sale/static/src/js/pos_models.js @@ -325,7 +325,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal push_order: function(record) { var self = this; return this.dao.add_operation(record).pipe(function(){ - return self.flush(); + return self.flush(); }); }, @@ -616,9 +616,21 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal export_as_JSON: function() { return { qty: this.get_quantity(), - price_unit: this.get_product().get('list_price'), + price_unit: this.get_list_price(), discount: this.get_discount(), - product_id: this.get_product().get('id') + product_id: this.get_product().get('id'), + }; + }, + export_for_printing: function(){ + return { + quantity: this.get_quantity(), + unit_name: this.get_unit().name, + list_price: this.get_list_price(), + discount: this.get_discount(), + product_name: this.get_product().get('name'), + price_with_tax : this.get_price_with_tax(), + price_without_tax: this.get_price_without_tax(), + tax: this.get_tax(), }; }, get_price_without_tax: function(){ @@ -703,11 +715,17 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal return { name: instance.web.datetime_to_str(new Date()), statement_id: this.get('id'), - account_id: (this.get('account_id'))[0], - journal_id: (this.get('journal_id'))[0], + account_id: (this.cashregister.get('account_id'))[0], + journal_id: (this.cashregister.get('journal_id'))[0], amount: this.get_amount() }; }, + export_for_printing: function(){ + return { + amount: this.get_amount(), + journal: this.cashregister.get('journal_id')[1], + }; + }, }); module.PaymentlineCollection = Backbone.Collection.extend({ @@ -796,6 +814,42 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal getDueLeft: function() { return this.getTotal() - this.getPaidTotal(); }, + export_for_printing: function(){ + var orderlines = []; + this.get('orderLines').each(function(orderline){ + orderlines.push(orderline.export_for_printing()); + }); + + var paymentlines = []; + this.get('paymentLines').each(function(paymentline){ + paymentlines.push(paymentline.export_for_printing()); + }); + var client = this.pos.get('client'); + var cashier = this.pos.get('cashier') || this.pos.get('user'); + var date = new Date(); + + return { + orderlines: orderlines, + paymentlines: paymentlines, + total_with_tax: this.getTotal(), + total_without_tax: this.getTotalTaxExcluded(), + total_tax: this.getTax(), + total_paid: this.getPaidTotal(), + change: this.getChange(), + name : this.getName(), + client: client ? client.name : null , + cashier: cashier ? cashier.name : null, + date: { + year: date.getFullYear(), + month: date.getMonth(), + date: date.getDate(), // day of the month + day: date.getDay(), // day of the week + hour: date.getHours(), + minute: date.getMinutes() + }, + currency: this.pos.get('currency'), + }; + }, exportAsJSON: function() { var orderLines, paymentLines; orderLines = []; @@ -835,7 +889,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal this.selected_orderline = undefined; } }, - }); module.OrderCollection = Backbone.Collection.extend({ diff --git a/addons/point_of_sale/static/src/js/pos_screens.js b/addons/point_of_sale/static/src/js/pos_screens.js index d8ea925e1c9..b353cdd3207 100644 --- a/addons/point_of_sale/static/src/js/pos_screens.js +++ b/addons/point_of_sale/static/src/js/pos_screens.js @@ -709,12 +709,15 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa var self = this; var currentOrder = this.pos.get('selectedOrder'); + console.log('RECEIPT:',currentOrder.export_for_printing()); + this.validate_button.$element.attr('disabled','disabled'); //FIXME is the css actually using this attr ? this.pos.push_order(currentOrder.exportAsJSON()) .then(function() { self.validate_button.$element.removeAttr('disabled'); if(self.pos.use_proxy_printer){ + self.pos.proxy.print_receipt(currentOrder.export_for_printing()); self.pos.get('selectedOrder').destroy(); //finish order and go back to scan screen }else{ self.pos_widget.screen_selector.set_current_screen('receipt'); @@ -739,7 +742,6 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.renderElement(); }, addPaymentLine: function(newPaymentLine) { - console.log('NEW PAYMENT LINE WIDGET',newPaymentLine); var x = new module.PaymentlineWidget(null, { payment_line: newPaymentLine });