def invoice_ncf_validation(self, invoice): if not invoice.journal_id.ncf_remote_validation: return True elif not invoice.journal_id.purchase_type in ['exterior', 'import', 'others'] and invoice.journal_id.type == "purchase": if invoice.id: inv_in_draft = self.env["account.invoice"].search_count([('id', '!=', invoice.id), ('partner_id', '=', invoice.partner_id.id), ('move_name', '=', invoice.move_name), ('state', 'in', ('draft', 'cancel'))]) else: inv_in_draft = self.env["account.invoice"].search_count([('partner_id', '=', invoice.partner_id.id), ('move_name', '=', invoice.move_name), ('state', 'in', ('draft', 'cancel'))]) if inv_in_draft: return (200, u"Ncf duplicado", u"El número de comprobante fiscal digitado para este proveedor \n" u"ya se encuentra en una factura en borrador o cancelada.") inv_exist = self.env["account.invoice"].search_count( [('partner_id', '=', invoice.partner_id.id), ('number', '=', invoice.move_name), ('state', 'in', ('open', 'paid'))]) if inv_exist: return (300, u"Ncf duplicado", u"Este número de comprobante ya fue registrado para este proveedor!") if not is_ncf(invoice.move_name,invoice.type): return (500, u"Ncf invalido", u"El numero de comprobante fiscal no es valido! " u"no paso la validacion en DGII, Verifique que el NCF y el RNC del " u"proveedor esten correctamente digitados, si es de proveedor informal o de " u"gasto menor vefifique si debe solicitar nuevos numero.") return True
def invoice_ncf_validation(self, invoice): if not invoice.journal_id.ncf_remote_validation: return True if not is_ncf(invoice.move_name, invoice.type): return (100, u"Ncf invalido", u"El numero de comprobante fiscal no es valido " u"verifique de que no esta digitando un comprobante" u"de consumidor final codigo 02 o revise si lo ha " u"digitado incorrectamente") elif not invoice.journal_id.purchase_type in ['exterior', 'import', 'others'] and invoice.journal_id.type == "purchase": if invoice.id: inv_in_draft = self.env["account.invoice"].search_count([('id', '!=', invoice.id), ('partner_id', '=', invoice.partner_id.id), ('move_name', '=', invoice.move_name), ('state', 'in', ('draft', 'cancel'))]) else: inv_in_draft = self.env["account.invoice"].search_count([('partner_id', '=', invoice.partner_id.id), ('move_name', '=', invoice.move_name), ('state', 'in', ('draft', 'cancel'))]) if inv_in_draft: return (200, u"Ncf duplicado", u"El número de comprobante fiscal digitado para este proveedor \n" u"ya se encuentra en una factura en borrador o cancelada.") inv_exist = self.env["account.invoice"].search_count( [('partner_id', '=', invoice.partner_id.id), ('number', '=', invoice.move_name), ('state', 'in', ('open', 'paid'))]) if inv_exist: return (300, u"Ncf duplicado", u"Este número de comprobante ya fue registrado para este proveedor!") if invoice.journal_id.ncf_remote_validation: request_params = self.get_marcos_api_request_params() if request_params[0] == 1: res = requests.get( '{}/ncf/{}/{}'.format(request_params[1], invoice.partner_id.vat, invoice.move_name), proxies=request_params[2]) if res.status_code == 200 and not res.json().get("valid", False) == True: return (500, u"Ncf invalido", u"El numero de comprobante fiscal no es valido! " u"no paso la validacion en DGII, Verifique que el NCF y el RNC del " u"proveedor esten correctamente digitados, si es de proveedor informal o de " u"gasto menor vefifique si debe solicitar nuevos numero.") return True
def create_report_lines(self, invoices, tax_account): if self._context.get("recreate", False): self.report_lines.unlink() self.txt = False account_tax_ids = tax_account.keys() CANTIDAD_REGISTRO = len(invoices) ITBIS_RETENIDO = 0 ITBIS_TOTAL = 0 TOTAL_MONTO_FACTURADO = 0 # sum([inv.amount_untaxed*inv.rate for inv in invoices]) RETENCION_RENTA = 0 lines = [] line_number = 0 for inv in invoices: line_number += 1 LINE = line_number LINE_ITBIS_TOTAL = 0 LINE_ITBIS_RETENIDO = 0 LINE_RETENCION_RENTA = 0 LINE_TAX_COST = 0 CURRENCY_RATE = 1 move_lines = [ move_line for move_line in inv.move_id.line_ids if move_line.account_id.id in account_tax_ids ] for move_line in move_lines: amount = (move_line.debit if move_line.debit > 0 else move_line.credit) if move_line.amount_currency: CURRENCY_RATE = abs(amount) / abs( move_line.amount_currency) if tax_account[move_line.account_id.id] == "itbis": ITBIS_TOTAL += amount LINE_ITBIS_TOTAL += amount elif tax_account[move_line.account_id. id] == "ritbis" and inv.state == 'paid': if int(max(inv.payment_move_line_ids).date.split("-") [1]) == self.month: ITBIS_RETENIDO += abs(amount) LINE_ITBIS_RETENIDO += amount elif tax_account[move_line.account_id.id] == "isr": RETENCION_RENTA += amount LINE_RETENCION_RENTA += amount elif tax_account[move_line.account_id. id] == "cost" and move_line.tax_line_id: LINE_TAX_COST += amount TOTAL_MONTO_FACTURADO += amount TOTAL_MONTO_FACTURADO += inv.amount_untaxed * CURRENCY_RATE if not inv.partner_id.vat: raise exceptions.UserError(u"El número de RNC/Cédula del" u"proveedor {} no es válido" "para el NCF {}".format( inv.partner_id.name, inv.number)) RNC_CEDULA = re.sub("[^0-9]", "", inv.partner_id.vat.strip()) TIPO_IDENTIFICACION = "1" if len(RNC_CEDULA.strip()) == 9 else "2" TIPO_BIENES_SERVICIOS_COMPRADOS = (inv.expense_type) if not TIPO_BIENES_SERVICIOS_COMPRADOS: raise exceptions.UserError("Debe definir el tipo de gasto" u"para la posición fiscal {}! En la" "factura {}".format( inv.fiscal_position_id.name, inv.number)) if not is_ncf(inv.number, inv.type): raise exceptions.UserError(u"¡El número de NCF {} no es" u"válido!".format(inv.number)) NUMERO_COMPROBANTE_MODIFICADO = "".rjust(19) if inv.type == "in_invoice": NUMERO_COMPROBANTE_FISCAL = inv.number elif inv.type == "in_refund": NUMERO_COMPROBANTE_FISCAL = inv.number NUMERO_COMPROBANTE_MODIFICADO = inv.origin FECHA_COMPROBANTE = inv.date_invoice if inv.payment_move_line_ids: FECHA_PAGO = max(inv.payment_move_line_ids).date else: FECHA_PAGO = False lines.append((0, False, { "LINE": LINE, "RNC_CEDULA": RNC_CEDULA, "TIPO_IDENTIFICACION": TIPO_IDENTIFICACION, "TIPO_BIENES_SERVICIOS_COMPRADOS": TIPO_BIENES_SERVICIOS_COMPRADOS, "NUMERO_COMPROBANTE_FISCAL": NUMERO_COMPROBANTE_FISCAL, "NUMERO_COMPROBANTE_MODIFICADO": NUMERO_COMPROBANTE_MODIFICADO, "FECHA_COMPROBANTE": FECHA_COMPROBANTE, "FECHA_PAGO": FECHA_PAGO, "ITBIS_FACTURADO": LINE_ITBIS_TOTAL, "ITBIS_RETENIDO": abs(LINE_ITBIS_RETENIDO), "MONTO_FACTURADO": (inv.amount_untaxed + LINE_TAX_COST) * CURRENCY_RATE, "RETENCION_RENTA": LINE_RETENCION_RENTA })) self.write({ "report_lines": lines, "CANTIDAD_REGISTRO": CANTIDAD_REGISTRO, "ITBIS_RETENIDO": abs(ITBIS_RETENIDO), "ITBIS_TOTAL": ITBIS_TOTAL, "TOTAL_MONTO_FACTURADO": TOTAL_MONTO_FACTURADO, "RETENCION_RENTA": RETENCION_RENTA, "state": "done" })
def is_ncf(self, value, type): return is_ncf(value, type)
def create_report_lines(self, invoices): if self._context.get("recreate", False): self.report_lines.unlink() self.txt = False lines = [] line_number = 1 for inv in invoices: if inv.number[0] in ('A', 'P'): LINE = line_number if inv.fiscal_position_id.client_fiscal_type == "final": RNC_CEDULA = "" TIPO_IDENTIFICACION = "3" else: if not inv.partner_id.vat: raise exceptions.UserError( u"El cliente para la factura {} no tiene" u" RNC/Cédula.".format(inv.number)) RNC_CEDULA = re.sub("[^0-9]", "", inv.partner_id.vat.strip()) TIPO_IDENTIFICACION = "1" if len( str(RNC_CEDULA).strip()) == 9 else "2" if not is_ncf(inv.number, inv.type): raise exceptions.ValidationError( u"¡El número de NCF o el RNC/" u"Cédula del clienten para el" " comprobante {} no es" u"válido!".format(inv.number)) NUMERO_COMPROBANTE_MODIFICADO = "".rjust(19) if inv.type == "out_invoice": NUMERO_COMPROBANTE_FISCAL = inv.number elif inv.type == "out_refund": NUMERO_COMPROBANTE_FISCAL = inv.number NUMERO_COMPROBANTE_MODIFICADO = inv.origin FECHA_COMPROBANTE = inv.date_invoice if inv.payment_move_line_ids: FECHA_PAGO = max(inv.payment_move_line_ids).date else: FECHA_PAGO = False MONTO_FACTURADO = 0.00 for line in inv.invoice_line_ids: account_ids = [l.account_id.id for l in line] move_lines = self.env["account.move.line"].search([ ('move_id', '=', inv.move_id.id), ('account_id', 'in', account_ids) ]) MONTO_FACTURADO = abs( sum([l.credit for l in move_lines]) - sum([l.debit for l in move_lines])) if inv.type == "out_refund": MONTO_FACTURADO = MONTO_FACTURADO MONTO_FACTURADO = MONTO_FACTURADO ITBIS_FACTURADO = 0 for tax in inv.tax_line_ids: account_ids = [t.account_id.id for t in tax] move_lines = self.env["account.move.line"].search([ ('move_id', '=', inv.move_id.id), ('account_id', 'in', account_ids) ]) ITBIS_FACTURADO += (sum([l.debit for l in move_lines]) - sum([l.credit for l in move_lines]) * -1) if inv.type == "out_refund": ITBIS_FACTURADO = ITBIS_FACTURADO lines.append((0, False, { "LINE": LINE, "RNC_CEDULA": RNC_CEDULA, "TIPO_IDENTIFICACION": TIPO_IDENTIFICACION, "NUMERO_COMPROBANTE_FISCAL": NUMERO_COMPROBANTE_FISCAL, "NUMERO_COMPROBANTE_MODIFICADO": NUMERO_COMPROBANTE_MODIFICADO, "FECHA_COMPROBANTE": FECHA_COMPROBANTE, "FECHA_PAGO": FECHA_PAGO, "ITBIS_FACTURADO": ITBIS_FACTURADO, "MONTO_FACTURADO": MONTO_FACTURADO })) line_number += 1 CANTIDAD_REGISTRO = len(lines) ITBIS_TOTAL = sum([line[2]["ITBIS_FACTURADO"] for line in lines]) TOTAL_MONTO_FACTURADO = sum( [line[2]["MONTO_FACTURADO"] for line in lines]) res = self.write({ "report_lines": lines, "CANTIDAD_REGISTRO": CANTIDAD_REGISTRO, "ITBIS_TOTAL": ITBIS_TOTAL, "TOTAL_MONTO_FACTURADO": TOTAL_MONTO_FACTURADO, "state": "done" }) return res