account_move.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. # -*- coding: utf-8 -*-
  2. ##############################################################################
  3. #
  4. # OpenERP, Open Source Management Solution
  5. # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
  6. #
  7. # This program is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU Affero General Public License as
  9. # published by the Free Software Foundation, either version 3 of the
  10. # License, or (at your option) any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU Affero General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU Affero General Public License
  18. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. #
  20. ##############################################################################
  21. from openerp import models, fields, tools, api, _
  22. import json
  23. import base64
  24. import requests
  25. import io
  26. try:
  27. import qrcode
  28. except ImportError:
  29. qrcode = None
  30. class account_invoice(models.Model):
  31. _name = 'account.invoice'
  32. _inherit = 'account.invoice'
  33. _description = 'Add extra data to SET in account invoice'
  34. cdc = fields.Char(string='Código de Control (CDC)')
  35. numero_factura = fields.Char(string='Factura Nº', related='number', store = True)
  36. sucursal = fields.Char(string='Sucursal', compute='_compute_suc_sec', store=True)
  37. sec = fields.Char('Sec', compute='_compute_suc_sec', store=True)
  38. nro_actual = fields.Char('Nro Actual', compute='_compute_suc_sec', store=True)
  39. talonario_id = fields.Many2one('talonario', string='Talonario')
  40. timbrado_name = fields.Char(related='talonario_id.name', string='Número de timbrado', readonly=True)
  41. talonario_tipo_documento = fields.Selection(related='talonario_id.tipo_documento', string='Tipo de documento', readonly=True)
  42. fecha_final = fields.Date(related='talonario_id.fecha_final', string='Fecha de expiración de timbrado', readonly=True)
  43. no_mostrar_libro_iva = fields.Boolean(string='No visualizar en el libro IVA')
  44. importacion = fields.Boolean(string='Fact. de importación')
  45. importacion_gasto = fields.Boolean(string='Fact. de gastos de importación')
  46. tipo_emision = fields.Selection([('1','Normal'),('2','Contingencia')],'Tipo de Emisión')
  47. tipo_transaccion = fields.Selection([('1','Venta de mercadería'),('2','Prestación de servicios'),('3','Mixto (Venta de mercadería y servicios)'),('4','Venta de activo fijo'),('5','Venta de divisas'),('6','Compra de divisas'),('7','Promoción o entrega de muestras'),('8','Donación'),('9','Anticipo'),('10','Compra de productos'),('11','Compra de servicios'),('12','Venta de crédito fiscal'),('13','Muestras médicas (Art. 3 RG 24/2014)')],'Tipo de transacción')
  48. tipo_impuesto = fields.Selection([('1','Normal'),('2','Contingencia')],'Tipo de impuesto')
  49. indicador_presencia = fields.Selection([('1','Operación presencial'),('2','Operación electrónica'),('3','Operación telemarketing'),('4','Venta a domicilio'),('5','Operación bancaria'),('6','Operación cíclica'),('7','ver1'),('8','ver2'),('9','Otros')],'Indicador de Presencia')
  50. descripcion_indi_presencia = fields.Char('Describir Otros')
  51. # qr_code = fields.Binary('Código QR', compute='_compute_qr_code')
  52. # texto_qr = fields.Char(invisible=True)
  53. dEstRes = fields.Char('Estado de respuesta')
  54. dProtAut = fields.Char('Código de operación')
  55. dFecProc = fields.Datetime(string='Fecha de respuesta')
  56. # mje_resultado_ids = fields.One2many('mje.resultado', 'invoice_id', string='Resultados de mensajes')
  57. operacion_credito = fields.Selection([('1','Normal'),('2','Contingencia')],'Operación Crédito')
  58. estado_de = fields.Selection([
  59. ('noenviado', 'No enviado'),
  60. ('enviado', 'Enviado'),
  61. ('aprobado', 'Aprobado'),
  62. ('rechazado', 'Rechazado'),
  63. ('cancelado', 'Cancelado')],
  64. string='Estado DE',
  65. default='noenviado'
  66. )
  67. @api.onchange('talonario_id')
  68. def _onchange_talonario_id(self):
  69. if self.talonario_id:
  70. self.timbrado_name = self.talonario_id.name
  71. self.talonario_tipo_documento = self.talonario_id.tipo_documento
  72. self.fecha_final = self.talonario_id.fecha_final
  73. else:
  74. self.timbrado_name = False
  75. self.talonario_tipo_documento = False
  76. self.fecha_final = False
  77. @api.depends('number', 'journal_id', 'state')
  78. def _compute_suc_sec(self):
  79. for invoice in self:
  80. if invoice.state == 'cancel' and invoice.type == 'out_invoice':
  81. invoice.sucursal = ''
  82. invoice.sec = ''
  83. invoice.nro_actual = ''
  84. elif invoice.journal_id.id == 2 and invoice.number and invoice.type == 'out_invoice':
  85. parts = invoice.number.split('-')
  86. invoice.sucursal = parts[0] if len(parts) > 0 else ''
  87. invoice.sec = parts[1] if len(parts) > 1 else ''
  88. invoice.nro_actual = parts[2] if len(parts) > 2 else ''
  89. else:
  90. invoice.sucursal = ''
  91. invoice.sec = ''
  92. invoice.nro_actual = ''
  93. @api.multi
  94. def action_invoice_open(self):
  95. for invoice in self:
  96. cdc = self.calcular_cdc(invoice)
  97. invoice.cdc = cdc
  98. return super(AccountInvoice, self).action_invoice_open()
  99. @staticmethod
  100. def calcular_cdc(invoice):
  101. journal_id = invoice.journal_id.code.zfill(2)
  102. ruc = invoice.partner_id.ruc
  103. fecha_factura = invoice.date_invoice.strftime("%Y%m%d")
  104. cdc = journal_id + ruc + fecha_factura
  105. return cdc
  106. # class AccountInvoiceLine(models.Model):
  107. # _inherit = 'account.invoice.line'
  108. #
  109. # product_id = fields.Many2one('product.product', 'Producto')
  110. # quantity = fields.Float('Cantidad')
  111. # price_unit = fields.Float('Precio de Venta')
  112. # subtotal = fields.Float('Subtotal', compute='_compute_subtotal')
  113. #
  114. # @api.depends('quantity', 'price_unit')
  115. # def _compute_subtotal(self):
  116. # for line in self:
  117. # line.subtotal = line.quantity * line.price_unit
  118. # class AccountInvoice(models.Model):
  119. # _inherit = 'account.invoice'
  120. #
  121. # qr_code = fields.Binary('Código QR', compute='_compute_qr_code')
  122. #
  123. # @api.depends('partner_id', 'number', 'amount_total', 'invoice_line_ids')
  124. # def _compute_qr_code(self):
  125. # for invoice in self:
  126. # if not qrcode:
  127. # invoice.qr_code = False
  128. # continue
  129. #
  130. # qr_data = {
  131. # 'ruc_emisor': invoice.company_id.partner_id.vat,
  132. # 'ruc_receptor': invoice.partner_id.vat,
  133. # 'tipo_documento': 'FACT',
  134. # 'numero_documento': invoice.number,
  135. # 'monto_total': invoice.amount_total,
  136. # 'lineas_factura': [],
  137. # }
  138. #
  139. # for line in invoice.invoice_line_ids:
  140. # linea_factura = {
  141. # 'producto': line.product_id.name,
  142. # 'cantidad': line.quantity,
  143. # 'precio_venta': line.price_unit,
  144. # 'subtotal': line.subtotal,
  145. # }
  146. # qr_data['lineas_factura'].append(linea_factura)
  147. #
  148. # qr_string = '|'.join(str(value) for value in qr_data.values())
  149. # qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_M, box_size=10, border=4)
  150. # qr.add_data(qr_string)
  151. # qr.make(fit=True)
  152. # qr_image = qr.make_image(fill_color="black", back_color="white")
  153. #
  154. # qr_image_data = io.BytesIO()
  155. # qr_image.save(qr_image_data, format='PNG')
  156. # invoice.qr_code = base64.b64encode(qr_image_data.getvalue())