[IMP]Layout Factura para impresora térmica

La ventaja de usar formato continuo, es la rapidez y la cantidad de líneas por factura que se pueden agregar ( cerca de 300)
parent a1eabb4a
......@@ -2,13 +2,13 @@
{
"name": """Facturación Electrónica para Chile\
""",
'version': '0.5.5',
'version': '0.6.0',
'category': 'Localization/Chile',
'sequence': 12,
'author': 'Daniel Santibáñez Polanco, Cooperativa OdooCoop',
'website': 'https://globalresponse.cl',
'license': 'AGPL-3',
'summary': '',
'summary': 'Facturación Electrónica para Chile.',
'description': """
Facturación Electrónica para Chile.
""",
......@@ -32,7 +32,7 @@ Facturación Electrónica para Chile.
'base64',
'hashlib',
'cchardet',
'suds',#use suds-py3
'suds',
'urllib3',
'signxml',
'ast',
......@@ -40,6 +40,7 @@ Facturación Electrónica para Chile.
'num2words',
'xlsxwriter',
'io',
'pil',
]
},
'data': [
......
......@@ -62,6 +62,11 @@ try:
except ImportError:
_logger.warning('Cannot import hashlib library')
try:
from PIL import Image, ImageDraw, ImageFont
except:
_logger.warning("no se ha cargado PIL")
# timbre patrón. Permite parsear y formar el
# ordered-dict patrón corespondiente al documento
timbre = """<TED version="1.0"><DD><RE>99999999-9</RE><TD>11</TD><F>1</F>\
......@@ -185,14 +190,18 @@ class AccountInvoice(models.Model):
domain = self._get_available_journal_document_class()
return [('id', 'in', domain)]
@api.multi
def get_barcode_img(self, columns=13, ratio=3):
barcodefile = BytesIO()
image = self.pdf417bc(self.sii_barcode, columns, ratio)
image.save(barcodefile, 'PNG')
data = barcodefile.getvalue()
return base64.b64encode(data)
def _get_barcode_img(self):
for r in self:
if r.sii_barcode:
barcodefile = BytesIO()
image = self.pdf417bc(r.sii_barcode)
image.save(barcodefile, 'PNG')
data = barcodefile.getvalue()
r.sii_barcode_img = base64.b64encode(data)
r.sii_barcode_img = r.get_barcode_img()
vat_discriminated = fields.Boolean(
'Discriminate VAT?',
......@@ -1387,16 +1396,17 @@ version="1.0">
rut = rut.replace('CL','')
return rut
def pdf417bc(self, ted):
def pdf417bc(self, ted, columns=13, ratio=3):
bc = pdf417gen.encode(
ted,
security_level=5,
columns=13,
columns=columns,
)
image = pdf417gen.render_image(
bc,
padding=15,
scale=1,
ratio=ratio,
)
return image
......@@ -2254,3 +2264,26 @@ version="1.0">
for l in self.invoice_line_ids:
total_discount += (((l.discount or 0.00) /100) * l.price_unit * l.quantity)
return self.currency_id.round(total_discount)
@api.multi
def sii_header(self):
W, H = (560, 255)
img = Image.new('RGB', (W, H), color=(255,255,255))
d = ImageDraw.Draw(img)
w, h = (0, 0)
for i in range(10):
d.rectangle(((w, h), (550+w, 220+h)), outline="black")
w += 1
h += 1
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 40)
d.text((50,30), "R.U.T.: %s" % self.company_id.document_number, fill=(0,0,0), font=font)
d.text((50,90), self.sii_document_class_id.name, fill=(0,0,0), font=font)
d.text((220,150), "N° %s" % self.sii_document_number, fill=(0,0,0), font=font)
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 20)
d.text((200,235), "SII %s" %self.company_id.sii_regional_office_id.name, fill=(0,0,0), font=font)
buffered = BytesIO()
img.save(buffered, format="PNG")
imm = base64.b64encode(buffered.getvalue()).decode()
return imm
......@@ -480,30 +480,60 @@
</t>
</template>
<template id="thermal_layouts.invoice_thermal">
<!--<template id="thermal_layouts.invoice_thermal">-->
<template id="invoice_thermal">
<t t-foreach="docs" t-as="doc">
<receipt align='center' width='40' value-thousands-separator='.' >
<div class="pos-center-align"> <t t-esc="order.name"/></div>
<t t-if="doc and 'company_id' in doc">
<t t-set="company" t-value="doc.company_id.sudo()"/>
</t>
<t t-if="not doc or not 'company_id' in doc">
<t t-set="company" t-value="res_company"/>
</t>
<t t-if="'journal_document_class_id' in doc and doc.journal_document_class_id">
<t t-set="document_class_id" t-value="doc.journal_document_class_id.sii_document_class_id"/>
</t>
<t t-set="partner_id" t-value="doc.partner_id" />
<t t-set="commercial_partner_id" t-value="doc.partner_id.commercial_partner_id" />
<t t-set="logo" t-value="company.logo" />
<t t-set="sii_document_number" t-value="doc.sii_document_number" />
<t t-if="doc.type in ['in_invoice', 'in_refund']">
<t t-set="partner_id" t-value="company.partner_id" />
<t t-set="commercial_partner_id" t-value="company.partner_id" />
<t t-set="company" t-value="doc.partner_id" />
<t t-set="logo" t-value="doc.partner_id.image" />
<t t-set="sii_document_number" t-value="doc.reference" />
</t>
<receipt align='center' width='45' value-thousands-separator='.' >
<div class="pos-center-align">
<img t-att-src="'data:image/png;base64,%s' % doc.sii_header()"/>
</div>
<t t-if='doc.company_id'>
<img t-att-src='doc.company_id.logo' />
</t>
<t t-else=''>
<h3><t t-esc='doc.company_id' /></h3>
<img t-att-src='logo' />
</t>
<div>
<h3><t t-esc="doc.company_id.name"/></h3>
<h3><t t-esc="company.name"/></h3>
</div>
<line><left font='b'>Number: </left><right><t t-esc="doc.number"/></right></line>
<line><left font='b'>Seller: </left><right><t t-esc="doc.user_id.name"/></right></line>
<line><left font='b'>Date: </left><right><t t-esc="doc.date_invoice"/></right></line>
<line><left font='b'>Phone: </left><right><t t-esc="doc.company_id.phone"/></right></line>
<line><left font='b'>Company Address: </left><right><t t-esc="doc.company_id.street"/></right></line>
<line><left font='b'>Vendedor: </left><right><t t-esc="doc.user_id.name"/></right></line>
<line><left font='b'>Fecha: </left><right><t t-esc="doc.date_invoice"/></right></line>
<line><left font='b'>Teléfono: </left><right><t t-esc="doc.company_id.phone"/></right></line>
<line><left font='b'>Dirección: </left><right><t t-esc="doc.company_id.street"/></right></line>
<t t-if="doc.partner_id">
<line><right>--------</right></line>
<line><left font='b'>Client: </left><right><span t-esc="doc.partner_id.name"/></right></line>
<line><left font='b'>Address: </left><right><span t-esc="doc.partner_id.street"/></right></line>
<line><left font='b'>Phone: </left><right><span t-esc="doc.partner_id.phone"/></right></line>
<line><left font='b'>Cliente: </left><right><span t-esc="doc.partner_id.name"/></right></line>
<line><left font='b'>RUT: </left><right><span t-esc="doc.partner_id.document_number"/></right></line>
<line><left font='b'>Giro: </left><right><span t-esc="doc.partner_id.activity_description.name"/></right></line>
<line><left font='b'>Dirección: </left><right><span t-esc="doc.partner_id.street"/></right></line>
<line><left font='b'>Teléfono: </left><right><span t-esc="doc.partner_id.phone"/></right></line>
</t>
<t t-if="doc.referencias">
<line><right>--------</right></line>
<line><right>Documento de Referencia</right></line>
<t t-foreach="doc.referencias" t-as="l">
<line><left>Folio:</left><right><t t-if="l.origen" t-esc="l.origen" /></right></line>
<line><left>Referencia:</left><right><t t-if="l.sii_referencia_TpoDocRef" t-esc="l.sii_referencia_TpoDocRef.name" /></right></line>
<line><left>Motivo/observación:</left><right><t t-esc="l.sii_referencia_CodRef[0]" /> <t t-esc="l.sii_referencia_CodRef" />: <span t-if="l.motivo" t-field="l.motivo"/></right></line>
<line><left>Fecha del documento</left><right><span t-if="l.fecha_documento" t-field="l.fecha_documento"/></right></line>
</t>
</t>
<line><right>--------</right></line>
<div class='orderlines' line-ratio='0.6'>
......@@ -518,7 +548,7 @@
<t t-else=''>
<line><left><t t-esc='line.name' /></left></line>
<t t-if='line.discount != 0'>
<line indent='1'><left>Discount: <t t-esc='line.discount' />%</left></line>
<line indent='1'><left>Descuento: <t t-esc='line.discount' />%</left></line>
</t>
<line indent='1'>
<left>
......@@ -541,12 +571,18 @@
</t>
</div>
<line><right>--------</right></line>
<line t-if="doc.global_descuentos_recargos">
<t t-foreach="doc.global_descuentos_recargos" t-as="gdr">
<left><pre> Descuento o Recargo Global</pre></left>
<right>$ <value value-decimals='0'><t t-esc="gdr.valor if gdr.gdr_type=='amount' else gdr.amount_untaxed_global_dr" t-esc-options="{'widget': 'monetary', 'display_currency': doc.currency_id}"/></value></right>
</t>
</line>
<line t-if="doc.amount_untaxed and not doc._es_boleta()" class='total'>
<left><pre> SubTotal</pre></left>
<right>$ <value value-decimals='0'><t t-esc='doc.amount_untaxed' /></value></right>
</line>
<line t-if="doc.amount_untaxed and not doc._es_boleta()" class='total'>
<left><pre> Taxes</pre></left>
<left><pre> Impuestos</pre></left>
<t t-foreach="doc.tax_line_ids" t-as="tl">
<right><t t-esc="tl.tax_id.description" />: $ <value value-decimals='0'><t t-esc='tl.amount' /></value></right>
</t>
......@@ -556,18 +592,49 @@
<right>$ <value value-decimals='0'><t t-esc='doc.amount_total' /></value></right>
</line>
<div class="row">
<div class="col-xs-12" >
<span t-field="doc.sii_barcode_img" t-field-options="{&quot;widget&quot;: &quot;image&quot;}" style="margin-left:25%;"/>
</div>
<div class="col-xs-12">
<div>
<img t-att-src="'data:image/png;base64,%s' % doc.get_barcode_img(25,6).decode()"/>
<em>
<p style="text-align:center;color:red; font-size:8px;">
Timbre Electrónico SII
<br/>
Resolución <t t-esc='doc.company_id.dte_resolution_number'/> de <t t-esc='doc.company_id.dte_resolution_date[:4]'/> Verifique documento en: <t t-if="not doc._es_boleta()">www.sii.cl</t><t t-if="doc._es_boleta()" t-esc="'%s/boleta/%s' % (o.company_id.website, doc.sii_document_number)"/>
Resolución <t t-esc='doc.company_id.dte_resolution_number'/> de <t t-esc='doc.company_id.dte_resolution_date[:4]'/> Verifique documento en: <t t-if="not doc._es_boleta()">www.sii.cl</t><t t-if="doc._es_boleta()" t-esc="'%s/boleta/%s' % (doc.company_id.website, doc.sii_document_number)"/>
</p>
</div>
</em>
</div>
<t t-if="cedible">
<div class="row">
<div class="col-xs-12" style="border: 1px solid black;height:20px;font-size:15px !important;">
<div class="col-xs-4">
<strong>Nombre:</strong>
</div>
</div>
<div class="col-xs-12" style="border: 1px solid black;height:20px;font-size:15px !important;">
<div class="col-xs-7">
<strong>R.U.T.:</strong>
</div>
<div class="col-xs-5">
<strong>FECHA:</strong>
</div>
</div>
<div class="col-xs-12" style="border: 1px solid black;height:20px; font-size:15px !important;">
<div class="col-xs-7">
<strong>RECINTO:</strong>
</div>
<div class="col-xs-5">
<strong>FIRMA:</strong>
</div>
</div>
<div class="col-xs-12" style="border: 1px solid black;">
<p style="font-size:8px">
"El acuse de recibo que se declara en este acto, de acuerdo a lo dispuesto en la letra b) del Artículo 4°, y la letra c) del Artículo 5° de la Ley 19.983, acredita que la entrega de mercaderías o servicio(s) prestado(s) ha(n) sido recibido(s)"
</p>
</div>
</div>
<div class="row">
<h6 class="pull-right"> CEDIBLE</h6>
</div>
</t>
</receipt>
</t>
</template>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment