Example #1
0
    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
Example #2
0
    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
Example #3
0
    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"
        })
Example #4
0
 def is_ncf(self, value, type):
     return is_ncf(value, type)
Example #5
0
    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