Odoo 9 community does not have a button to generate from the POS (Point of Sale) Order a quotation (Sales Order), here is the following code of my module pos_2_so. Folders arborescence will have as sub folders : model, view, static, ref the print screen :

We will start by adding a new button on the interface of the pos, in the folder static/src/xml/, we create a new file named pos_2_so.xml. Bellow is its QWeb xml code :
<?xml version="1.0" encoding="UTF-8"?> <templates id="template"> <t t-name="Pos2SoWidget"> <div class="pos2sopad"> <div id="pos-2-so-frame"> <button class="pos-2-so-button" id="pos-2-so-button">To Sales Order</button> </div> </div> </t> <t t-extend="ProductScreenWidget"> <t t-jquery=".leftpane .window" t-operation="append"> <div class="placeholder-Pos2SoWidget"></div> </t></t> </templates>
This portion of code creates a template named pos2sopad which include only a button :
<t t-name="Pos2SoWidget"> <div class="pos2sopad"> <div id="pos-2-so-frame"> <button class="pos-2-so-button" id="pos-2-so-button">To Sales Order</button> </div> </div> </t>
We need to set a placeholder by adding a div inside the template ProductScreenWidget that we will append in the div .leftpane .window class :
<t t-extend="ProductScreenWidget"> <t t-jquery=".leftpane .window" t-operation="append"> <div class="placeholder-Pos2SoWidget"></div> </t> </t>
We now load the QWeb file in our module by adding this code from __openerp__.py like bellow:
{
'name' : 'POS 2 SO',
'version' : '0.1',
'category' : 'tools',
'description' : """
Create SO from POS
""",
'author' : 'NumberSpeaks',
'depends' : [
'base',
'point_of_sale',
],
'data' : [
'view/pos_2_order.xml',
'view/pos_order_view.xml',
],
'qweb': [
'static/src/xml/pos_2_so.xml',
],
'demo' : [],
'installable' : True,
'auto_install' : False,
}
Your template has been created, but they are still not displayable on our screen, we will need javascript for that. Here is the following javascript code located in static/src/js :
odoo.define('point_of_sale.pos_2_so', function(require) {
"use strict";
var PosBaseWidget = require('point_of_sale.BaseWidget');
var gui = require('point_of_sale.gui');
var screens = require('point_of_sale.screens');
var Pos2SoWidget = PosBaseWidget.extend({
template : 'Pos2SoWidget',
init : function(parent) {
var self = this;
this._super(parent);
},
start : function() {
var self = this;
this.$el.find('.pos-2-so-button').click(function() {
self.gui.show_screen('payment');
pos2so = true;
});
},
});
screens.ProductScreenWidget.include({
start : function() {
var self = this;
this._super();
this.pos2sopad = new Pos2SoWidget(this, {});
this.pos2sopad.replace(this.$('.placeholder-Pos2SoWidget'));
},
});
We will initialize the template QWeb Pos2SoWidget previously created and run a function when clicking on the button, on this example clicking on the button will display the payment screen and set pos2so to true:
var Pos2SoWidget = PosBaseWidget.extend({
template : 'Pos2SoWidget',
init : function(parent) {
var self = this;
this._super(parent);
},
start : function() {
var self = this;
this.$el.find('.pos-2-so-button').click(function() {
self.gui.show_screen('payment');
pos2so = true;
});
},
});
then replace div placeholder-pos2sowidget by the html generated by the template :
screens.ProductScreenWidget.include({
start : function() {
var self = this;
this._super();
this.pos2sopad = new Pos2SoWidget(this, {});
this.pos2sopad.replace(this.$('.placeholder-Pos2SoWidget'));
},
});
To include our javascript file in our web page, we have to create a new file name pos_2_so_view.xml in view folder, reference it in __openerp__.py file, ref the content of that file above :
<?xml version="1.0" encoding="utf-8"?> <openerp> <data> <template id="pos_2_so_assets" name="pos_2_so css assets" inherit_id="point_of_sale.assets"> <xpath expr="." position="inside"> <link rel="stylesheet" href="/pos_2_so/static/src/css/pos_2_so.css" /> <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20type%3D%22text%2Fjavascript%22%20src%3D%22%2Fpos_2_so%2Fstatic%2Fsrc%2Fjs%2Fpos_2_so.js%22%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="<script>" title="<script>" /> </xpath> </template> </data> </openerp>
After restarting Odoo and installing the new module, you should see this additional button on the screen of your point of sale:



Field `inbound_payment_method_ids` does not exist
Error context:
View `pos.config.form.view`
[view_id: 1695, xml_id: n/a, model: pos.config, parent_id: 1413]
None” while parsing /usr/lib/python2.7/dist-packages/odoo/addons/pos_cache/views/pos_cache_views.xml:4, near
pos.config.form.view
pos.config