def start_inline(self,stylestack=None):
""" starts an inline entity with an optional style definition """
- print 'start_inline'
self.stack.append('inline')
if self.dirty:
self.escpos._raw(' ')
def start_block(self,stylestack=None):
""" starts a block entity with an optional style definition """
- print 'start_block'
if self.dirty:
- print 'cleanup before block'
self.escpos._raw('\n')
self.dirty = False
self.stack.append('block')
def end_entity(self):
""" ends the entity definition. (but does not cancel the active style!) """
- print 'end_entity'
if self.stack[-1] == 'block' and self.dirty:
- print 'cleanup after block'
self.escpos._raw('\n')
self.dirty = False
if len(self.stack) > 1:
text = text.strip()
text = re.sub('\s+',' ',text)
if text:
- print 'printing text:'+text
self.dirty = True
self.escpos.text(text)
self.left = True
def _txt(self,txt):
- print '_txt: ',txt
if self.left:
if self.clwidth < self.lwidth:
txt = txt[:max(0, self.lwidth - self.clwidth)]
self.crwidth += len(txt)
def start_inline(self,stylestack=None):
- print 'LINE:start_entity'
if (self.left and self.clwidth) or (not self.left and self.crwidth):
self._txt(' ')
text = text.strip()
text = re.sub('\s+',' ',text)
if text:
- print 'LINE:printing text:'+text
self._txt(text)
def linebreak(self):
self.left = False
def get_line(self):
- print 'LBUFFER: '+self.lbuffer
- print self.clwidth
- print 'RBUFFER: '+self.rbuffer
- print self.crwidth
-
return ' ' * self.indent * self.tabwidth + self.lbuffer + ' ' * (self.width - self.clwidth - self.crwidth) + self.rbuffer
formatstr = "{:"+str(width)+"."+str(decimals)+"f}"
- print formatstr
- print value
ret = formatstr.format(value)
- print ret
ret = ret.replace(',','COMMA')
ret = ret.replace('.','DOT')
ret = ret.replace('COMMA',thousands_separator)
ret = ret.replace('DOT',decimals_separator)
- print 'RET '+ret
if symbol:
if position == 'after':
serializer.linebreak()
elif elem.tag == 'img':
- if src in elem.attrib and 'data:' in elem.attrib['src']:
- self.print_base64_image(elem.attrib['src'])
+ pass
+ #if 'src' in elem.attrib and 'data:' in elem.attrib['src']:
+ # self.print_base64_image(elem.attrib['src'])
elif elem.tag == 'barcode' and 'encoding' in elem.attrib:
serializer.start_block(stylestack)
return this.message('open_cashbox');
},
- /* 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, ...)
- * 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
- * product_description: (string) generic description of the product
- * product_description_sale: (string) sales related information of the product
- * }
- * - 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]
- * }
+ /*
+ * ask the printer to print a receipt
*/
print_receipt: function(receipt){
var self = this;
function send_printing_job(){
if (self.receipt_queue.length > 0){
var r = self.receipt_queue.shift();
- self.message('print_receipt',{ receipt: r },{ timeout: 5000 })
+ self.message('print_xml_receipt',{ receipt: r },{ timeout: 5000 })
.then(function(){
send_printing_job();
},function(){
hour: date.getHours(),
minute: date.getMinutes() ,
isostring: date.toISOString(),
+ localestring: date.toLocaleString(),
},
company:{
email: company.email,
}else{
this.pos.push_order(currentOrder)
if(this.pos.config.iface_print_via_proxy){
- this.pos.proxy.print_receipt(currentOrder.export_for_printing());
+ var receipt = currentOrder.export_for_printing();
+ this.pos.proxy.print_receipt(QWeb.render('XmlReceipt',{
+ receipt: receipt
+ }));
this.pos.get('selectedOrder').destroy(); //finish order and go back to scan screen
}else{
this.pos_widget.screen_selector.set_current_screen(this.next_screen);
</div>
</t>
+ <t t-name="XmlReceipt">
+ <receipt align='center' width='40' value-thousands-separator='' >
+ <t t-if='receipt.company.logo'>
+ <img t-att-src='receipt.company.logo' />
+ <br/>
+ </t>
+ <t t-if='!receipt.company.logo'>
+ <h1><t t-esc='receipt.company.name' /></h1>
+ <br/>
+ </t>
+ <div font='b'>
+ <t t-if='receipt.shop.name'>
+ <div><t t-esc='receipt.shop.name' /></div>
+ </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.vat'>
+ <div>VAT:<t t-esc='receipt.company.vat' /></div>
+ </t>
+ <t t-if='receipt.company.email'>
+ <div><t t-esc='receipt.company.email' /></div>
+ </t>
+ <t t-if='receipt.company.website'>
+ <div><t t-esc='receipt.company.website' /></div>
+ </t>
+ <t t-if='receipt.header'>
+ <div><t t-esc='receipt.header' /></div>
+ </t>
+ <t t-if='receipt.cashier'>
+ <div>--------------------------------</div>
+ <div>Served by <t t-esc='receipt.cashier' /></div>
+ </t>
+ </div>
+ <br /><br />
+
+ <!-- Orderlines -->
+
+ <div line-ratio='0.6'>
+ <t t-foreach='receipt.orderlines' t-as='line'>
+ <t t-set='simple' t-value='line.discount === 0 and line.unit_name === "Unit(s)" and line.quantity === 1' />
+ <t t-if='simple'>
+ <line>
+ <left><t t-esc='line.product_name' /></left>
+ <right><value><t t-esc='line.price_display' /></value></right>
+ </line>
+ </t>
+ <t t-if='!simple'>
+ <line><left><t t-esc='line.product_name' /></left></line>
+ <t t-if='line.discount !== 0'>
+ <line indent='1'><left>Discount: <t t-esc='line.discount' />%</left></line>
+ </t>
+ <line indent='1'>
+ <left>
+ <value value-decimals='3' autoint='on'>
+ <t t-esc='line.quantity' />
+ </value>
+ <t t-if='line.unit_name !== "Unit(s)"'>
+ <t t-esc='line.unit_name' />
+ </t>
+ x
+ <value value-decimals='2'>
+ <t t-esc='line.price' />
+ </value>
+ </left>
+ <right>
+ <value><t t-esc='line.price_display' /></value>
+ </right>
+ </line>
+ </t>
+ </t>
+ </div>
+
+ <!-- Subtotal -->
+
+ <t t-set='taxincluded' t-value='Math.abs(receipt.subtotal - receipt.total_with_tax) <= 0.000001' />
+ <t t-if='!taxincluded'>
+ <line><right>--------</right></line>
+ <line><left>Subtotal</left><right> <value>receipt.subtotal</value></right></line>
+ <t t-foreach='receipt.tax_details' t-as='tax'>
+ <line>
+ <left><t t-esc='tax.name' /></left>
+ <right><value><t t-esc='tax.amount' /></value></right>
+ </line>
+ </t>
+ </t>
+
+ <!-- Total -->
+
+ <line><right>-------</right></line>
+ <line size='double-height'>
+ <left><pre> TOTAL</pre></left>
+ <right><value><t t-esc='receipt.total_with_tax' /></value></right>
+ </line>
+ <br/><br/>
+
+ <!-- Payment Lines -->
+
+ <t t-foreach='receipt.paymentlines' t-as='line'>
+ <line>
+ <left><t t-esc='line.journal' /></left>
+ <right><value><t t-esc='line.amount'/></value></right>
+ </line>
+ </t>
+ <br/>
+
+ <line size='double-height'>
+ <left><pre> CHANGE</pre></left>
+ <right><value><t t-esc='receipt.change' /></value></right>
+ </line>
+ <br/>
+
+ <!-- Extra Payment Info -->
+
+ <t t-if='receipt.total_discount'>
+ <line>
+ <left>Discounts</left>
+ <right><value><t t-esc='receipt.total_discount'/></value></right>
+ </line>
+ </t>
+ <t t-if='taxincluded'>
+ <t t-foreach='receipt.tax_details' t-as='tax'>
+ <line>
+ <left><t t-esc='tax.name' /></left>
+ <right><value><t t-esc='tax.amount' /></value></right>
+ </line>
+ </t>
+ </t>
+
+ <!-- Footer -->
+ <t t-if='receipt.footer'>
+ <br/>
+ <pre><t t-esc='receipt.footer' /></pre>
+ <br/>
+ <br/>
+ </t>
+
+ <br/>
+ <div font='b'>
+ <div><t t-esc='receipt.name' /></div>
+ <div><t t-esc='receipt.date.localestring' /></div>
+ </div>
+
+ </receipt>
+ </t>
+
<t t-name="WelcomeScreenWidget">
<div class="welcome-screen screen">
<header class='rightpane-header'><h2>Welcome</h2></header>