# -*- encoding: utf-8 -*-
from resources import *
from import_export.admin import ImportExportModelAdmin
import re
import csv
import xlwt
from types import *
from datetime import date
from decimal import Decimal
from number_to_letter import *
from django.conf import settings
from django.contrib import admin
from django.forms import ModelForm
from ordenes_de_pago.models import *
from django.contrib.messages import *
from django.core.urlresolvers import reverse
from reservas_abm.models import Banco, FormaPago
from dateutil.relativedelta import relativedelta
from django.contrib.admin import SimpleListFilter
from django.forms.models import BaseInlineFormSet
from daterange_filter.filter import DateRangeFilter
from django.utils.translation import ugettext_lazy as _
from django.http import HttpResponse, HttpResponseRedirect


def mygetattr(obj, attr):
    try:
        value = getattr(obj, attr)
        if callable(value):
            value = value()
        return value
    except:
        value = None
        return value


def generic_export_xls(queryset, fields):
    response = HttpResponse(mimetype="application/ms-excel")
    response['Content-Disposition'] = 'attachment; filename=filename.xls'
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('Sheetname')
    fila = 0
    for i, (field, descripcion) in enumerate(fields):
        ws.write(fila, i, unicode(descripcion))
    for obj in queryset:
        fila += 1
        for i, (field, descripcion) in enumerate(fields):
            valor = mygetattr(obj, field)
            if not (type(valor) is Decimal or type(valor) is LongType):
                ws.write(fila, i, unicode(valor))
            if type(valor) is Decimal:
                ws.row(fila).set_cell_number(i, Decimal(valor))
            if type(valor) is LongType:
                ws.row(fila).set_cell_number(i, valor)
    wb.save(response)
    return response


def generic_export_csv(queryset, fields):
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment; filename=filename.csv'
    writer = csv.writer(response)
    writer.writerow([unicode(descripcion).encode("utf-8") for
                     field, descripcion in fields])
    for obj in queryset:
        writer.writerow([unicode(mygetattr(obj, field)).encode("utf-8")
                         for field, descripcion in fields])
    return response


def factura_export_xls(queryset, fields_factura, fields_detalle_fac):
    response = HttpResponse(mimetype="application/ms-excel")
    response['Content-Disposition'] = 'attachment; filename=filename.xls'
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('Facturas_' + str(datetime.date.today()),
                      cell_overwrite_ok=True)
    fila = 0
    fila_detalle = 0
    ws.write(fila, 0, 'Exportacion Facturas ' + str(datetime.date.today()))
    # Encabezado Exportacion
    fila = 3
    all_fields = fields_factura + fields_detalle_fac
    for j, (field, descripcion) in enumerate(all_fields):
        ws.write(fila, j, unicode(descripcion))
    # Datos Factura
    fila += 1
    for obj in queryset:
        for i, (field, descripcion) in enumerate(fields_factura):
            valor = mygetattr(obj, field)
            if type(valor) is datetime.date:
                date_format = ''
                date_split = (str(valor).split('-'))
                for x in reversed(date_split):
                    date_format += x + '/'
                valor = date_format[:-1]
            if not (type(valor) is Decimal or type(valor) is LongType):
                ws.write(fila, i, unicode(valor))
            if type(valor) is Decimal:
                ws.row(fila).set_cell_number(i, Decimal(valor))
            if type(valor) is LongType:
                ws.row(fila).set_cell_number(i, valor)
            if not (type(valor) is Decimal or type(valor) is LongType):
                ws.write(fila, i, unicode(valor))
            if type(valor) is Decimal:
                ws.row(fila).set_cell_number(i, Decimal(valor))
            if type(valor) is LongType:
                ws.row(fila).set_cell_number(i, valor)
        # Datos Detalle Factura
        fila_detalle = fila
        for i in range(obj.detallefactura_set.all().count()):
            col = 7
            for j, (field_detalle_fac, descripcion) in enumerate(fields_detalle_fac):
                valor = mygetattr(obj.detallefactura_set.all()[
                                  i], field_detalle_fac)
                if not (type(valor) is Decimal or type(valor) is LongType):
                    ws.write(fila_detalle, col, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_detalle).set_cell_number(col, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_detalle).set_cell_number(col, valor)
                col += 1
            fila_detalle += 1

        if (fila_detalle >= fila):
            fila = fila_detalle
        else:
            fila += 1

    wb.save(response)
    return response


def orden_pago_peru_export_xls(queryset, fields_orden_pago, fields_detalle_op, fields_factura_op, fields_detalle_ret, fields_detalle_cc):
    response = HttpResponse(mimetype="application/ms-excel")
    response['Content-Disposition'] = 'attachment; filename=filename.xls'
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('OrdenesDePago_' +
                      str(datetime.date.today()), cell_overwrite_ok=True)
    fila = 0
    fila_detalle = 0
    ws.write(fila, 0, 'Exportacion Ordenes de Pago ' +
             str(datetime.date.today()))
    # Encabezado Exportacion
    fila = 3
    all_fields = fields_orden_pago + fields_detalle_op + \
        fields_factura_op + fields_detalle_ret + fields_detalle_cc
    for j, (field, descripcion) in enumerate(all_fields):
        ws.write(fila, j, unicode(descripcion))
    # Datos Orden de Pago
    fila += 1
    for obj in queryset:
        for i, (field, descripcion) in enumerate(fields_orden_pago):
            valor = mygetattr(obj, field)
            if valor == 'P':
                valor = 'Pesos'
            if valor == 'D':
                valor = 'Dolares'
            if type(valor) is datetime.date:
                date_format = ''
                date_split = (str(valor).split('-'))
                for x in reversed(date_split):
                    date_format += x + '/'
                valor = date_format[:-1]
            if not (type(valor) is Decimal or type(valor) is LongType):
                ws.write(fila, i, unicode(valor))
            if type(valor) is Decimal:
                ws.row(fila).set_cell_number(i, Decimal(valor))
            if type(valor) is LongType:
                ws.row(fila).set_cell_number(i, valor)
        # Datos Detalle Orde de Pago
        fila_detalle = fila
        for i in range(obj.detalleordenpagoperu_set.all().count()):
            col = 5
            for j, (field_detalle_op, descripcion) in enumerate(fields_detalle_op):
                valor = mygetattr(obj.detalleordenpagoperu_set.all()[
                                  i], field_detalle_op)
                if valor == 'A':
                    valor = 'A Rendir'
                if valor == 'P':
                    valor = 'Proveedores'
                if valor == 'V':
                    valor = 'Viaticos'
                if valor == 'H':
                    valor = 'Honorarios'
                if valor == 'O':
                    valor = 'Otros'
                if not (type(valor) is Decimal or type(valor) is LongType):
                    ws.write(fila_detalle, col, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_detalle).set_cell_number(col, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_detalle).set_cell_number(col, valor)
                col += 1
            fila_detalle += 1
        # Datos Factura Orden de Pago
        fila_fac = fila
        for i in range(obj.detalleordenpagofacperu_set.count()):
            col = 9
            for j, (field_factura_op, descripcion) in enumerate(fields_factura_op):
                valor = mygetattr(obj.detalleordenpagofacperu_set.all()[
                                  i], field_factura_op)
                if not (type(valor) is Decimal or type(valor) is LongType):
                    ws.write(fila_fac, col, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_fac).set_cell_number(col, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_fac).set_cell_number(col, valor)
                col += 1
            fila_fac += 1
        # Datos Ret Orden Pago
        fila_ret = fila
        for i in range(obj.detalleordenpagoretperu_set.count()):
            col = 10
            for j, (field_ret_op, descripcion) in enumerate(fields_detalle_ret):
                valor = mygetattr(
                    obj.detalleordenpagoretperu_set.all()[i], field_ret_op)
                if not (type(valor) is Decimal or type(valor) is LongType):
                    ws.write(fila_ret, col, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_ret).set_cell_number(col, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_ret).set_cell_number(col, valor)
                col += 1
            fila_ret += 1
        # Datos Centro Costo Orden de Pago
        fila_cc = fila
        try:
            for i in range(obj.detalleordenpagoccperu_set.count()):
                col = 14
                for j, (field_cc_op, descripcion) in enumerate(fields_detalle_cc):
                    valor = mygetattr(
                        obj.detalleordenpagoperu_set.all()[i], field_cc_op)
                    if not (type(valor) is Decimal or type(valor) is LongType):
                        ws.write(fila_cc, col, unicode(valor))
                    if type(valor) is Decimal:
                        ws.row(fila_cc).set_cell_number(col, Decimal(valor))
                    if type(valor) is LongType:
                        ws.row(fila_cc).set_cell_number(col, valor)
                    col += 1
                fila_cc += 1
        except:
            pass

        if (fila_detalle >= fila):
            fila = fila_detalle
        else:
            fila += 1

    wb.save(response)
    return response


def orden_pago_venta_export_xls(queryset, fields_orden_pago, fields_detalle_op, fields_factura_op, fields_detalle_ret, fields_detalle_cc):
    response = HttpResponse(mimetype="application/ms-excel")
    response['Content-Disposition'] = 'attachment; filename=filename.xls'
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('OrdenesDePago_' +
                      str(datetime.date.today()), cell_overwrite_ok=True)
    fila = 0
    fila_detalle = 0
    ws.write(fila, 0, 'Exportacion Ordenes de Pago ' +
             str(datetime.date.today()))
    # Encabezado Exportacion
    fila = 3
    all_fields = fields_orden_pago + fields_detalle_op + \
        fields_factura_op + fields_detalle_ret + fields_detalle_cc
    for j, (field, descripcion) in enumerate(all_fields):
        ws.write(fila, j, unicode(descripcion))
    # Datos Orden de Pago
    fila += 1
    for obj in queryset:
        for i, (field, descripcion) in enumerate(fields_orden_pago):
            valor = mygetattr(obj, field)
            if valor == 'P':
                valor = 'Pesos'
            if valor == 'D':
                valor = 'Dolares'
            if type(valor) is datetime.date:
                date_format = ''
                date_split = (str(valor).split('-'))
                for x in reversed(date_split):
                    date_format += x + '/'
                valor = date_format[:-1]
            if not (type(valor) is Decimal or type(valor) is LongType):
                ws.write(fila, i, unicode(valor))
            if type(valor) is Decimal:
                ws.row(fila).set_cell_number(i, Decimal(valor))
            if type(valor) is LongType:
                ws.row(fila).set_cell_number(i, valor)
        # Datos Detalle Orde de Pago
        fila_detalle = fila
        for i in range(obj.detalleordenpagoventa_set.all().count()):
            col = 5
            for j, (field_detalle_op, descripcion) in enumerate(fields_detalle_op):
                valor = mygetattr(obj.detalleordenpagoventa_set.all()[
                                  i], field_detalle_op)
                if valor == 'A':
                    valor = 'A Rendir'
                if valor == 'P':
                    valor = 'Proveedores'
                if valor == 'V':
                    valor = 'Viaticos'
                if valor == 'H':
                    valor = 'Honorarios'
                if valor == 'O':
                    valor = 'Otros'
                if not (type(valor) is Decimal or type(valor) is LongType):
                    ws.write(fila_detalle, col, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_detalle).set_cell_number(col, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_detalle).set_cell_number(col, valor)
                col += 1
            fila_detalle += 1
        # Datos Factura Orden de Pago
        fila_fac = fila
        for i in range(obj.detalleordenpagofacventa_set.count()):
            col = 9
            for j, (field_factura_op, descripcion) in enumerate(fields_factura_op):
                valor = mygetattr(obj.detalleordenpagofacventa_set.all()[
                                  i], field_factura_op)
                if not (type(valor) is Decimal or type(valor) is LongType):
                    ws.write(fila_fac, col, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_fac).set_cell_number(col, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_fac).set_cell_number(col, valor)
                col += 1
            fila_fac += 1
        # Datos Ret Orden Pago
        fila_ret = fila
        for i in range(obj.detalleordenpagoretventa_set.count()):
            col = 10
            for j, (field_ret_op, descripcion) in enumerate(fields_detalle_ret):
                valor = mygetattr(
                    obj.detalleordenpagoretventa_set.all()[i], field_ret_op)
                if not (type(valor) is Decimal or type(valor) is LongType):
                    ws.write(fila_ret, col, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_ret).set_cell_number(col, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_ret).set_cell_number(col, valor)
                col += 1
            fila_ret += 1
        # Datos Centro Costo Orden de Pago
        fila_cc = fila
        try:
            for i in range(obj.detalleordenpagoccventa_set.count()):
                col = 14
                for j, (field_cc_op, descripcion) in enumerate(fields_detalle_cc):
                    valor = mygetattr(
                        obj.detalleordenpagoventa_set.all()[i], field_cc_op)
                    if not (type(valor) is Decimal or type(valor) is LongType):
                        ws.write(fila_cc, col, unicode(valor))
                    if type(valor) is Decimal:
                        ws.row(fila_cc).set_cell_number(col, Decimal(valor))
                    if type(valor) is LongType:
                        ws.row(fila_cc).set_cell_number(col, valor)
                    col += 1
                fila_cc += 1
        except:
            pass

        if (fila_detalle >= fila):
            fila = fila_detalle
        else:
            fila += 1

    wb.save(response)
    return response


def orden_pago_export_xls(queryset, fields_orden_pago, fields_detalle_op, fields_factura_op, fields_detalle_ret, fields_detalle_cc):
    response = HttpResponse(mimetype="application/ms-excel")
    response['Content-Disposition'] = 'attachment; filename=filename.xls'
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('OrdenesDePago_' +
                      str(datetime.date.today()), cell_overwrite_ok=True)
    fila = 0
    fila_detalle = 0
    ws.write(fila, 0, 'Exportacion Ordenes de Pago ' +
             str(datetime.date.today()))
    # Encabezado Exportacion
    fila = 3
    all_fields = fields_orden_pago + fields_detalle_op + \
        fields_factura_op + fields_detalle_ret + fields_detalle_cc
    for j, (field, descripcion) in enumerate(all_fields):
        ws.write(fila, j, unicode(descripcion))
    # Datos Orden de Pago
    fila += 1
    for obj in queryset:
        for i, (field, descripcion) in enumerate(fields_orden_pago):
            valor = mygetattr(obj, field)
            if valor == 'P':
                valor = 'Pesos'
            if valor == 'D':
                valor = 'Dolares'
            if type(valor) is datetime.date:
                date_format = ''
                date_split = (str(valor).split('-'))
                for x in reversed(date_split):
                    date_format += x + '/'
                valor = date_format[:-1]
            if not (type(valor) is Decimal or type(valor) is LongType):
                ws.write(fila, i, unicode(valor))
            if type(valor) is Decimal:
                ws.row(fila).set_cell_number(i, Decimal(valor))
            if type(valor) is LongType:
                ws.row(fila).set_cell_number(i, valor)
        # Datos Detalle Orde de Pago
        fila_detalle = fila
        for i in range(obj.detalleordenpago_set.all().count()):
            col = 5
            for j, (field_detalle_op, descripcion) in enumerate(fields_detalle_op):
                valor = mygetattr(obj.detalleordenpago_set.all()[
                                  i], field_detalle_op)
                if valor == 'A':
                    valor = 'A Rendir'
                if valor == 'P':
                    valor = 'Proveedores'
                if valor == 'V':
                    valor = 'Viaticos'
                if valor == 'H':
                    valor = 'Honorarios'
                if valor == 'O':
                    valor = 'Otros'
                if not (type(valor) is Decimal or type(valor) is LongType):
                    ws.write(fila_detalle, col, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_detalle).set_cell_number(col, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_detalle).set_cell_number(col, valor)
                col += 1
            fila_detalle += 1
        # Datos Factura Orden de Pago
        fila_fac = fila
        for i in range(obj.detalleordenpagofac_set.count()):
            col = 9
            for j, (field_factura_op, descripcion) in enumerate(fields_factura_op):
                valor = mygetattr(obj.detalleordenpagofac_set.all()[
                                  i], field_factura_op)
                if not (type(valor) is Decimal or type(valor) is LongType):
                    ws.write(fila_fac, col, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_fac).set_cell_number(col, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_fac).set_cell_number(col, valor)
                col += 1
            fila_fac += 1
        # Datos Ret Orden Pago
        fila_ret = fila
        for i in range(obj.detalleordenpagoret_set.count()):
            col = 10
            for j, (field_ret_op, descripcion) in enumerate(fields_detalle_ret):
                valor = mygetattr(
                    obj.detalleordenpagoret_set.all()[i], field_ret_op)
                if not (type(valor) is Decimal or type(valor) is LongType):
                    ws.write(fila_ret, col, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_ret).set_cell_number(col, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_ret).set_cell_number(col, valor)
                col += 1
            fila_ret += 1
        # Datos Centro Costo Orden de Pago
        fila_cc = fila
        try:
            for i in range(obj.detalleordenpagocc_set.count()):
                col = 14
                for j, (field_cc_op, descripcion) in enumerate(fields_detalle_cc):
                    valor = mygetattr(
                        obj.detalleordenpago_set.all()[i], field_cc_op)
                    if not (type(valor) is Decimal or type(valor) is LongType):
                        ws.write(fila_cc, col, unicode(valor))
                    if type(valor) is Decimal:
                        ws.row(fila_cc).set_cell_number(col, Decimal(valor))
                    if type(valor) is LongType:
                        ws.row(fila_cc).set_cell_number(col, valor)
                    col += 1
                fila_cc += 1
        except:
            pass

        if (fila_detalle >= fila):
            fila = fila_detalle
        else:
            fila += 1

    wb.save(response)
    return response
# ******************************* CLASE MEDIAMIXIN ******************************


class MediaMixin(object):
    class Media:
        css = {
            "all": ("ordenes_de_pago/css/chosen.css", 'ordenes_de_pago/css/proveedor.css')
        }
        js = ('ordenes_de_pago/js/jquery-1.6.4.min.js', 'ordenes_de_pago/js/chosen.jquery.min.js',
              )
# ******************************* CLASE MEDIAMIXIN ******************************

#*************** Convierte todos los campos en ReadOnly ***********************#


class ReadOnlyAdmin(object):
    def get_readonly_fields(self, request, obj=None):
        if (request.user.is_superuser) or (request.user.groups.filter(name='usuarios_chile')):
            ret = set(self.readonly_fields)
        else:
            ret = set(self.readonly_fields + type(self.readonly_fields)
                      (field.name for field in self.model._meta.fields))
        return list(ret - set(self.exclude or []) - set(['id']))
#*************** Convierte todos los campos en ReadOnly ***********************#


class ProveedorPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('id', 'cuit', 'razonsocial', 'nroproveedor',
                    'ret_iibb', 'porcentaje_ret', 'nro_iibb')
    search_fields = ('razonsocial', 'nroproveedor')

    fieldsets = (
        ('Datos Proveedor', {
            'classes': ('expand',),
            'fields': (('cuit', 'razonsocial', 'domicilio_fiscal', 'provincia', 'nroproveedor'),),
        }),
        ('Datos IIBB', {
            'classes': ('expand',),
            'fields': (('ret_iibb', 'porcentaje_ret', 'nro_iibb'),),
        }),
    )


class ProveedorAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('id', 'cuit', 'razonsocial', 'nroproveedor',
                    'ret_iibb', 'porcentaje_ret', 'nro_iibb')
    search_fields = ('razonsocial', 'nroproveedor')

    fieldsets = (
        ('Datos Proveedor', {
            'classes': ('expand',),
            'fields': (('cuit', 'razonsocial', 'domicilio_fiscal', 'provincia', 'nroproveedor'),),
        }),
        ('Datos IIBB', {
            'classes': ('expand',),
            'fields': (('ret_iibb', 'porcentaje_ret', 'nro_iibb'),),
        }),
    )


class CentroCostoAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('cuenta', 'subcuenta', 'sublibrotipo')


class DetalleFacturaPeruInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleFacturaPeru
    extra = 0
    cant_delete = True


class DetalleFacturaInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleFactura
    extra = 0
    cant_delete = True


class DetalleFacturaVentaInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleFacturaVenta
    extra = 0
    cant_delete = True


class DetalleNotaCreditoPeruInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleNotaCredito
    extra = 0
    cant_delete = True


class DetalleNotaCreditoInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleNotaCredito
    extra = 0
    cant_delete = True


class DetalleNotaCreditoVentaInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleNotaCreditoVenta
    extra = 0
    cant_delete = True


class DetalleNotaCreditoPeruAdmin():
    pass


class DetalleNotaCreditoAdmin():
    pass


class DetalleNotaCreditoVentaAdmin():
    pass


class NotaCreditoPeruAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin, MediaMixin):
    class Media:
        js = (
            settings.STATIC_URL + "ordenes_de_pago/js/jquery-1.6.2.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.orden_pago.js",
            settings.STATIC_URL + "ordenes_de_pago/js/disable_enter.js",
            settings.STATIC_URL + "ordenes_de_pago/js/notacredito.js",
            settings.STATIC_URL + "ordenes_de_pago/js/basic.js",
        )
        css = {
            'all': (settings.STATIC_URL + "ordenes_de_pago/css/style.css", "ordenes_de_pago/css/chosen.css", 'ordenes_de_pago/css/proveedor.css')
        }

    actions = ['Exportar_a_Excel', ]
    list_display = ('nronotacredito', 'proveedor',
                    'fecha_nota_credito', 'importe_total', 'pendiente')
    list_filter = ('fecha_nota_credito',)
    search_fields = ('proveedor__razonsocial',)

    fieldsets = (
        ('Datos Nota Credito', {
            'classes': ('expand',),
            'fields': (('nronotacredito', 'fecha_nota_credito', 'proveedor'),),
        }),
        ('Datos Tipo Nota Credito', {
            'classes': ('expand',),
            'fields': (('tipo_nota_credito', 'concepto', 'importe_neto_total', 'importe_total', 'pendiente'),),
        }),
    )

    resource_class = NotaCreditoPeruResources

    exportable_fields_notacredito = (
        ('nronotacredito', 'Nro. Nota Credito'),
        ('fecha_nota_credito', 'Fecha Nota Credito'),
        ('proveedor', 'Proveedor'),
        ('tipo_nota_credito', 'Tipo'),
        ('concepto', 'Concepto'),
        ('importe_total', 'Imp Total'),
        ('pendiente', 'Pendiente'),
    )
    exportable_fields_detalle_nota_credito = (
        ('importe_neto', 'Imp. Neto'),
        ('iva', 'IVA'),
        ('ret_iva', 'Ret IVA'),
        ('ret_iibb', 'Ret IIBB'),
        ('percep_iva', 'Perc IVA'),
        ('percep_iibb_caba', 'Perc IIBB CABA'),
        ('percep_iibb_bsas', 'Perc IIBB BSAS'),
    )

    def Exportar_a_Excel(self, request, queryset):
        return nota_credito_export_xls(queryset, self.exportable_fields_notacredito, self.exportable_fields_detalle_nota_credito)

    def Exportar_a_csv(self, request, queryset):
        return generic_export_csv(queryset, self.exportable_fields)

    inlines = [
        DetalleNotaCreditoPeruInLine,
    ]


class NotaCreditoAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin, MediaMixin):
    class Media:
        js = (
            settings.STATIC_URL + "ordenes_de_pago/js/jquery-1.6.2.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.orden_pago.js",
            settings.STATIC_URL + "ordenes_de_pago/js/disable_enter.js",
            settings.STATIC_URL + "ordenes_de_pago/js/notacredito.js",
            settings.STATIC_URL + "ordenes_de_pago/js/basic.js",
        )
        css = {
            'all': (settings.STATIC_URL + "ordenes_de_pago/css/style.css", "ordenes_de_pago/css/chosen.css", 'ordenes_de_pago/css/proveedor.css')
        }

    actions = ['Exportar_a_Excel', ]
    list_display = ('nronotacredito', 'proveedor',
                    'fecha_nota_credito', 'importe_total', 'pendiente')
    list_filter = ('fecha_nota_credito',)
    search_fields = ('proveedor__razonsocial',)

    fieldsets = (
        ('Datos Nota Credito', {
            'classes': ('expand',),
            'fields': (('nronotacredito', 'fecha_nota_credito', 'proveedor'),),
        }),
        ('Datos Tipo Nota Credito', {
            'classes': ('expand',),
            'fields': (('tipo_nota_credito', 'concepto', 'importe_neto_total', 'importe_total', 'pendiente'),),
        }),
    )

    resource_class = NotaCreditoResources

    exportable_fields_notacredito = (
        ('nronotacredito', 'Nro. Nota Credito'),
        ('fecha_nota_credito', 'Fecha Nota Credito'),
        ('proveedor', 'Proveedor'),
        ('tipo_nota_credito', 'Tipo'),
        ('concepto', 'Concepto'),
        ('importe_total', 'Imp Total'),
        ('pendiente', 'Pendiente'),
    )
    exportable_fields_detalle_nota_credito = (
        ('importe_neto', 'Imp. Neto'),
        ('iva', 'IVA'),
        ('ret_iva', 'Ret IVA'),
        ('ret_iibb', 'Ret IIBB'),
        ('percep_iva', 'Perc IVA'),
        ('percep_iibb_caba', 'Perc IIBB CABA'),
        ('percep_iibb_bsas', 'Perc IIBB BSAS'),
    )

    def Exportar_a_Excel(self, request, queryset):
        return nota_credito_export_xls(queryset, self.exportable_fields_notacredito, self.exportable_fields_detalle_nota_credito)

    def Exportar_a_csv(self, request, queryset):
        return generic_export_csv(queryset, self.exportable_fields)

    inlines = [
        DetalleNotaCreditoInLine,
    ]


class NotaCreditoVentaAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin, MediaMixin):
    class Media:
        js = (
            settings.STATIC_URL + "ordenes_de_pago/js/jquery-1.6.2.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.orden_pago.js",
            settings.STATIC_URL + "ordenes_de_pago/js/disable_enter.js",
            settings.STATIC_URL + "ordenes_de_pago/js/notacredito.js",
            settings.STATIC_URL + "ordenes_de_pago/js/basic.js",
        )
        css = {
            'all': (settings.STATIC_URL + "ordenes_de_pago/css/style.css", "ordenes_de_pago/css/chosen.css", 'ordenes_de_pago/css/proveedor.css')
        }

    actions = ['Exportar_a_Excel', ]
    list_display = ('nronotacredito', 'proveedor', 'fecha_nota_credito',
                    'importe_neto_total', 'importe_total', 'pendiente')
    list_filter = ('fecha_nota_credito',)
    search_fields = ('proveedor__razonsocial',)

    fieldsets = (
        ('Datos Nota Credito', {
            'classes': ('expand',),
            'fields': (('nronotacredito', 'fecha_nota_credito', 'proveedor'),),
        }),
        ('Datos Tipo Nota Credito', {
            'classes': ('expand',),
            'fields': (('tipo_nota_credito', 'concepto', 'importe_neto_total', 'importe_total', 'pendiente'),),
        }),
    )

    resource_class = NotaCreditoVentaResources

    exportable_fields_notacredito = (
        ('nronotacredito', 'Nro. Nota Credito'),
        ('fecha_nota_credito', 'Fecha Nota Credito'),
        ('proveedor', 'Proveedor'),
        ('tipo_nota_credito', 'Tipo'),
        ('concepto', 'Concepto'),
        ('importe_total', 'Imp Total'),
        ('pendiente', 'Pendiente'),
    )
    exportable_fields_detalle_nota_credito = (
        ('importe_neto', 'Imp. Neto'),
        ('iva', 'IVA'),
        ('ret_iva', 'Ret IVA'),
        ('ret_iibb', 'Ret IIBB'),
        ('percep_iva', 'Perc IVA'),
        ('percep_iibb_caba', 'Perc IIBB CABA'),
        ('percep_iibb_bsas', 'Perc IIBB BSAS'),
    )

    def Exportar_a_Excel(self, request, queryset):
        return nota_credito_export_xls(queryset, self.exportable_fields_notacredito, self.exportable_fields_detalle_nota_credito)

    def Exportar_a_csv(self, request, queryset):
        return generic_export_csv(queryset, self.exportable_fields)

    inlines = [
        DetalleNotaCreditoVentaInLine,
    ]


class FacturaPeruAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin, MediaMixin):
    class Media:
        js = (
            settings.STATIC_URL + "ordenes_de_pago/js/jquery-1.6.2.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.orden_pago.js",
            settings.STATIC_URL + "ordenes_de_pago/js/disable_enter.js",
            settings.STATIC_URL + "ordenes_de_pago/js/factura.js",
            settings.STATIC_URL + "ordenes_de_pago/js/basic.js",
        )
        css = {
            'all': (settings.STATIC_URL + "ordenes_de_pago/css/style.css", "ordenes_de_pago/css/chosen.css", 'ordenes_de_pago/css/proveedor.css')
        }

    actions = ['Exportar_a_Excel', ]
    list_display = ('nrofactura', 'proveedor', 'fecha_factura',
                    'importe_total', 'pendiente')
    list_filter = ('fecha_factura',)
    search_fields = ('proveedor__razonsocial',)

    fieldsets = (
        ('Datos Factura', {
            'classes': ('expand',),
            'fields': (('nrofactura', 'fecha_factura', 'proveedor'),),
        }),
        ('Datos Tipo Factura', {
            'classes': ('expand',),
            'fields': (('tipo_factura', 'concepto', 'importe_neto_total', 'importe_total', 'pendiente'),),
        }),
    )

    resource_class = FacturaPeruResources

    exportable_fields_factura = (
        ('nrofactura', 'Nro. Fac'),
        ('fecha_factura', 'Fecha Fac'),
        ('proveedor', 'Proveedor'),
        ('tipo_factura', 'Tipo'),
        ('concepto', 'Concepto'),
        ('importe_total', 'Imp Total'),
        ('pendiente', 'Pendiente'),
    )
    exportable_fields_detalle_fac = (
        ('importe_neto', 'Imp. Neto'),
        ('iva', 'IVA'),
        ('ret_iva', 'Ret IVA'),
        ('ret_iibb', 'Ret IIBB'),
        ('percep_iva', 'Perc IVA'),
        ('percep_iibb_caba', 'Perc IIBB CABA'),
        ('percep_iibb_bsas', 'Perc IIBB BSAS'),
    )

    def Exportar_a_Excel(self, request, queryset):
        return factura_export_xls(queryset, self.exportable_fields_factura, self.exportable_fields_detalle_fac)

    def Exportar_a_csv(self, request, queryset):
        return generic_export_csv(queryset, self.exportable_fields)
    inlines = [
        DetalleFacturaPeruInLine,
    ]


class FacturaAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin, MediaMixin):
    class Media:
        js = (
            settings.STATIC_URL + "ordenes_de_pago/js/jquery-1.6.2.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.orden_pago.js",
            settings.STATIC_URL + "ordenes_de_pago/js/disable_enter.js",
            settings.STATIC_URL + "ordenes_de_pago/js/factura.js",
            settings.STATIC_URL + "ordenes_de_pago/js/basic.js",
        )
        css = {
            'all': (settings.STATIC_URL + "ordenes_de_pago/css/style.css", "ordenes_de_pago/css/chosen.css", 'ordenes_de_pago/css/proveedor.css')
        }

    actions = ['Exportar_a_Excel', ]
    list_display = ('nrofactura', 'proveedor', 'fecha_factura',
                    'importe_total', 'pendiente')
    list_filter = ('fecha_factura',)
    search_fields = ('proveedor__razonsocial',)

    fieldsets = (
        ('Datos Factura', {
            'classes': ('expand',),
            'fields': (('nrofactura', 'fecha_factura', 'proveedor'),),
        }),
        ('Datos Tipo Factura', {
            'classes': ('expand',),
            'fields': (('tipo_factura', 'concepto', 'importe_neto_total', 'importe_total', 'pendiente'),),
        }),
    )

    resource_class = FacturaResources

    exportable_fields_factura = (
        ('nrofactura', 'Nro. Fac'),
        ('fecha_factura', 'Fecha Fac'),
        ('proveedor', 'Proveedor'),
        ('tipo_factura', 'Tipo'),
        ('concepto', 'Concepto'),
        ('importe_total', 'Imp Total'),
        ('pendiente', 'Pendiente'),
    )
    exportable_fields_detalle_fac = (
        ('importe_neto', 'Imp. Neto'),
        ('iva', 'IVA'),
        ('ret_iva', 'Ret IVA'),
        ('ret_iibb', 'Ret IIBB'),
        ('percep_iva', 'Perc IVA'),
        ('percep_iibb_caba', 'Perc IIBB CABA'),
        ('percep_iibb_bsas', 'Perc IIBB BSAS'),
    )

    def Exportar_a_Excel(self, request, queryset):
        return factura_export_xls(queryset, self.exportable_fields_factura, self.exportable_fields_detalle_fac)

    def Exportar_a_csv(self, request, queryset):
        return generic_export_csv(queryset, self.exportable_fields)
    inlines = [
        DetalleFacturaInLine,
    ]


class IVA_ComprasAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin, MediaMixin):
    list_display = ('fecha', 'tipo_comprobante', 'nro_comprobante', 'cuit', 'razonsocial',
                    'grabado_21', 'grabado_105', 'grabado_27', 'exento', 'iva_21', 'iva_105',
                    'iva_27', 'ret_iva', 'percep_iva', 'ret_gcias', 'percep_iibb_caba',
                    'ret_iibb_caba', 'importe_total')
    list_filter = ('fecha',)
    search_fields = ('proveedor__razonsocial',)


class IVA_ComprasVentaAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin, MediaMixin):
    list_display = ('fecha', 'tipo_comprobante', 'nro_comprobante', 'cuit', 'razonsocial',
                    'grabado_21', 'grabado_105', 'grabado_27', 'exento', 'iva_21', 'iva_105',
                    'iva_27', 'ret_iva', 'percep_iva', 'ret_gcias', 'percep_iibb_caba',
                    'ret_iibb_caba', 'importe_total')
    list_filter = ('fecha',)
    search_fields = ('proveedor__razonsocial',)


class FacturaVentaAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin, MediaMixin):
    class Media:
        js = (
            settings.STATIC_URL + "ordenes_de_pago/js/jquery-1.6.2.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/disable_enter.js",
            settings.STATIC_URL + "ordenes_de_pago/js/factura.js",
            settings.STATIC_URL + "ordenes_de_pago/js/basic.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.orden_pago.js",

        )
        css = {
            'all': (settings.STATIC_URL + "ordenes_de_pago/css/style.css", "ordenes_de_pago/css/chosen.css", 'ordenes_de_pago/css/proveedor.css')
        }

    resource_class = FacturaVentaResources

    list_display = ('nrofactura', 'proveedor', 'fecha_factura',
                    'importe_total', 'pendiente')
    list_filter = ('fecha_factura',)
    search_fields = ('proveedor__razonsocial',)

    fieldsets = (
        ('Datos Factura', {
            'classes': ('expand',),
            'fields': (('nrofactura', 'fecha_factura', 'proveedor'),),
        }),
        ('Datos Tipo Factura', {
            'classes': ('expand',),
            'fields': (('tipo_factura', 'concepto', 'importe_neto_total', 'importe_total', 'pendiente'),),
        }),
    )

    inlines = [
        DetalleFacturaVentaInLine,
    ]


class DetalleFacturaPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('factura', 'porcentaje_iva', 'importe neto', 'iva', 'ret_iva',
                    'ret_iibb', 'percep_iva', 'percep_iibb_caba', 'percep_iibb_bsas')


class DetalleFacturaAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('factura', 'porcentaje_iva', 'importe neto', 'iva', 'ret_iva',
                    'ret_iibb', 'percep_iva', 'percep_iibb_caba', 'percep_iibb_bsas')


class DetalleFacturaVentaAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('factura', 'porcentaje_iva', 'importe neto', 'iva', 'ret_iva',
                    'ret_iibb', 'percep_iva', 'percep_iibb_caba', 'percep_iibb_bsas')


class DetalleOrdenPagoCCPeruInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoCCPeru
    extra = 0
    cant_delete = True


class DetalleOrdenPagoCCInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoCC
    extra = 0
    cant_delete = True


class DetalleOrdenPagoCCVentaInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoCCVenta
    extra = 0
    cant_delete = True


class DetalleOrdenPagoNCPeruInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoNCPeru
    extra = 0
    cant_delete = True

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                return self.readonly_fields + ('notacredito',)
        if obj is not None:  # El Objeto no es  nuevo
            return self.readonly_fields + ('notacredito',)
        return self.readonly_fields

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'notacredito':
            kwargs['queryset'] = NotaCreditoPeru.objects.filter(
                pendiente=False)
        return super(DetalleOrdenPagoNCPeruInLine, self).formfield_for_foreignkey(db_field, request, **kwargs)


class DetalleOrdenPagoNCVentaInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoNCVenta
    extra = 0
    cant_delete = True

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                return self.readonly_fields + ('notacredito',)
        if obj is not None:  # El Objeto no es  nuevo
            return self.readonly_fields + ('notacredito',)
        return self.readonly_fields

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'notacredito':
            kwargs['queryset'] = NotaCreditoVenta.objects.filter(
                pendiente=False)
        return super(DetalleOrdenPagoNCVentaInLine, self).formfield_for_foreignkey(db_field, request, **kwargs)


class DetalleOrdenPagoNCInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoNC
    extra = 0
    cant_delete = True

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                return self.readonly_fields + ('notacredito',)
        if obj is not None:  # El Objeto no es  nuevo
            return self.readonly_fields + ('notacredito',)
        return self.readonly_fields

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'notacredito':
            kwargs['queryset'] = NotaCredito.objects.filter(pendiente=False)
        return super(DetalleOrdenPagoNCInLine, self).formfield_for_foreignkey(db_field, request, **kwargs)


class DetalleOrdenPagoFACPeruInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoFACPeru
    extra = 0
    cant_delete = True

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                return self.readonly_fields + ('factura',)
        if obj is not None:  # El Objeto no es  nuevo
            return self.readonly_fields + ('factura',)
        return self.readonly_fields

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'factura':
            kwargs['queryset'] = FacturaPeru.objects.filter(pendiente=False)
        return super(DetalleOrdenPagoFACPeruInLine, self).formfield_for_foreignkey(db_field, request, **kwargs)


class DetalleOrdenPagoFACInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoFAC
    extra = 0
    cant_delete = True

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                return self.readonly_fields + ('factura',)
        if obj is not None:  # El Objeto no es  nuevo
            return self.readonly_fields + ('factura',)
        return self.readonly_fields

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'factura':
            kwargs['queryset'] = Factura.objects.filter(pendiente=False)
        return super(DetalleOrdenPagoFACInLine, self).formfield_for_foreignkey(db_field, request, **kwargs)


class DetalleOrdenPagoFACVentaInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoFACVenta
    extra = 0
    cant_delete = True

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                return self.readonly_fields + ('factura',)
        if obj is not None:  # El Objeto no es  nuevo
            return self.readonly_fields + ('factura',)
        return self.readonly_fields

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'factura':
            kwargs['queryset'] = FacturaVenta.objects.filter(pendiente=False)
        return super(DetalleOrdenPagoFACVentaInLine, self).formfield_for_foreignkey(db_field, request, **kwargs)


class DetalleOrdenPagoPeruInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoPeru
    extra = 0
    cant_delete = True


class DetalleOrdenPagoInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPago
    extra = 0
    cant_delete = True


class DetalleOrdenPagoVentaInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoVenta
    extra = 0
    cant_delete = True


class DetalleOrdenPagoRetPeruInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoRetPeru
    extra = 0
    cant_delete = True


class DetalleOrdenPagoRetInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoRet
    extra = 0
    cant_delete = True


class DetalleOrdenPagoRetVentaInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleOrdenPagoRetVenta
    extra = 0
    cant_delete = True


class DetalleOrdenPagoRetPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'importe_ret_iibb', 'nro_ret_iibb',
                    'importe_ret_ganancias', 'nro_ret_ganancias')


class DetalleOrdenPagoRetAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'importe_ret_iibb', 'nro_ret_iibb',
                    'importe_ret_ganancias', 'nro_ret_ganancias')


class DetalleOrdenPagoRetVentaAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'importe_ret_iibb', 'nro_ret_iibb',
                    'importe_ret_ganancias', 'nro_ret_ganancias')


class DetalleOrdenPagoCCPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'centro_costo', 'porcentaje_aplicacion')


class DetalleOrdenPagoCCAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'centro_costo', 'porcentaje_aplicacion')


class DetalleOrdenPagoCCVentaAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'centro_costo', 'porcentaje_aplicacion')


class DetalleOrdenPagoNCPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'notacredito')


class DetalleOrdenPagoNCAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'notacredito')


class DetalleOrdenPagoFACPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'factura')


class DetalleOrdenPagoFACAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'factura')


class DetalleOrdenPagoFACVentaAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'factura')


class DetalleOrdenPagoPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'banco', 'forma_pago',
                    'tipo_gasto', 'nro_cheque')


class DetalleOrdenPagoAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'banco', 'forma_pago',
                    'tipo_gasto', 'nro_cheque')


class DetalleOrdenPagoVentaAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('orden_pago', 'banco', 'forma_pago',
                    'tipo_gasto', 'nro_cheque')


class OrdenPagoPeruAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin, MediaMixin):

    class Media():
        js = (
            settings.STATIC_URL + "ordenes_de_pago/js/jquery-1.6.2.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.orden_pago.js",
            settings.STATIC_URL + "ordenes_de_pago/js/disable_enter.js",
            settings.STATIC_URL + "ordenes_de_pago/js/basic.js",
            settings.STATIC_URL + "ordenes_de_pago/js/orden_de_pago.js",
        )
        css = {
            'all': (settings.STATIC_URL + "ordenes_de_pago/css/style.css", "ordenes_de_pago/css/chosen.css", 'ordenes_de_pago/css/proveedor.css')
        }

    actions = ['Exportar_a_Excel', 'delete_selected']
    '''
    def delete_selected(self, request, obj):
        for orden_pago in obj.all():
            for factura in orden_pago.detalleordenpagofac_set.all():
                factura.factura.pendiente=False
                factura.factura.save()
            for notacredito in orden_pago.detalleordenpagonc_set.all():
                notacredito.notacredito.pendiente=False
                notacredito.notacredito.save()
        orden_pago.delete()
    '''
    list_display = ('nro_orden_pago', 'proveedor',
                    'fecha_orden_pago', 'total_a_pagar', 'ver_ordenpago')
    list_filter = ('fecha_orden_pago',)
    search_fields = ('proveedorperu__razonsocial', 'nro_orden_pago')

    fieldsets = (
        ('Datos Orden de Pago', {
            'classes': ('expand',),
            'fields': (('proveedor',), ('fecha_orden_pago', 'moneda', 'total_a_pagar')),
        }),
    )

    exportable_fields_orden_pago = (
        ('nro_orden_pago', 'Nro. OP'),
        ('proveedor', 'Proveedor'),
        ('fecha_orden_pago', 'Fecha'),
        ('moneda', 'Moneda'),
        ('total_a_pagar', 'Total'),
    )
    exportable_fields_detalle_orden_pago = (
        ('banco', 'Banco'),
        ('forma_pago', 'Forma Pago'),
        ('tipo_gasto', 'Tipo Gasto'),
        ('nro_cheque', 'Cheque'),
    )
    exportable_fields_fac_orden_pago = (
        ('factura', 'Factura'),
    )
    exportable_fields_ret_orden_pago = (
        ('importe_ret_iibb', 'Imp IIBB'),
        ('nro_ret_iibb', 'Nro IIBB'),
        ('importe_ret_ganancias', 'Imp Gan'),
        ('nro_ret_ganancias', 'Nro Gan'),
    )
    exportable_fields_cc_orden_pago = (
        ('centro_costo', 'Ctro Costo'),
        ('porcentaje_aplicacion', '% Aplic'),
    )

    resource_class = OrdenPagoResources

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            if obj is not None:
                return self.readonly_fields + ('proveedor', 'fecha_orden_pago', 'moneda')
        return self.readonly_fields

    def Exportar_a_Excel(self, request, queryset):
        return orden_pago_peru_export_xls(queryset, self.exportable_fields_orden_pago, self.exportable_fields_detalle_orden_pago,
                                          self.exportable_fields_fac_orden_pago, self.exportable_fields_ret_orden_pago, self.exportable_fields_cc_orden_pago)

    def nro_cheque(self, obj):
        return obj.detalleordenpagoperu_set.get().nro_cheque

    def ver_ordenpago(self, obj):
        return '<a href="%s">Ver o Imprimir Orden de Pago</a>' % reverse('ordenpagoperu', args=[obj.nro_orden_pago])
    ver_ordenpago.allow_tags = True

    inlines = [
        DetalleOrdenPagoFACPeruInLine, DetalleOrdenPagoNCPeruInLine, DetalleOrdenPagoPeruInLine, DetalleOrdenPagoRetPeruInLine, DetalleOrdenPagoCCPeruInLine,
    ]


class OrdenPagoAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin, MediaMixin):

    class Media():
        js = (
            settings.STATIC_URL + "ordenes_de_pago/js/jquery-1.6.2.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.orden_pago.js",
            settings.STATIC_URL + "ordenes_de_pago/js/disable_enter.js",
            settings.STATIC_URL + "ordenes_de_pago/js/basic.js",
            settings.STATIC_URL + "ordenes_de_pago/js/orden_de_pago.js",
        )
        css = {
            'all': (settings.STATIC_URL + "ordenes_de_pago/css/style.css", "ordenes_de_pago/css/chosen.css", 'ordenes_de_pago/css/proveedor.css')
        }

    actions = ['Exportar_a_Excel', 'delete_selected']

    def delete_selected(self, request, obj):
        for orden_pago in obj.all():
            for factura in orden_pago.detalleordenpagofac_set.all():
                factura.factura.pendiente = False
                factura.factura.save()
            for notacredito in orden_pago.detalleordenpagonc_set.all():
                notacredito.notacredito.pendiente = False
                notacredito.notacredito.save()
        orden_pago.delete()

    list_display = ('nro_orden_pago', 'proveedor',
                    'fecha_orden_pago', 'total_a_pagar', 'ver_ordenpago')
    list_filter = ('fecha_orden_pago',)
    search_fields = ('proveedor__razonsocial', 'nro_orden_pago')

    fieldsets = (
        ('Datos Orden de Pago', {
            'classes': ('expand',),
            'fields': (('proveedor',), ('fecha_orden_pago', 'moneda', 'total_a_pagar')),
        }),
    )

    exportable_fields_orden_pago = (
        ('nro_orden_pago', 'Nro. OP'),
        ('proveedor', 'Proveedor'),
        ('fecha_orden_pago', 'Fecha'),
        ('moneda', 'Moneda'),
        ('total_a_pagar', 'Total'),
    )
    exportable_fields_detalle_orden_pago = (
        ('banco', 'Banco'),
        ('forma_pago', 'Forma Pago'),
        ('tipo_gasto', 'Tipo Gasto'),
        ('nro_cheque', 'Cheque'),
    )
    exportable_fields_fac_orden_pago = (
        ('factura', 'Factura'),
    )
    exportable_fields_ret_orden_pago = (
        ('importe_ret_iibb', 'Imp IIBB'),
        ('nro_ret_iibb', 'Nro IIBB'),
        ('importe_ret_ganancias', 'Imp Gan'),
        ('nro_ret_ganancias', 'Nro Gan'),
    )
    exportable_fields_cc_orden_pago = (
        ('centro_costo', 'Ctro Costo'),
        ('porcentaje_aplicacion', '% Aplic'),
    )

    resource_class = OrdenPagoResources

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            if obj is not None:
                return self.readonly_fields + ('proveedor', 'fecha_orden_pago', 'moneda')
        return self.readonly_fields

    def Exportar_a_Excel(self, request, queryset):
        return orden_pago_export_xls(queryset, self.exportable_fields_orden_pago, self.exportable_fields_detalle_orden_pago,
                                     self.exportable_fields_fac_orden_pago, self.exportable_fields_ret_orden_pago, self.exportable_fields_cc_orden_pago)

    def nro_cheque(self, obj):
        return obj.detalleordenpago_set.get().nro_cheque

    def ver_ordenpago(self, obj):
        return '<a href="%s">Ver o Imprimir Orden de Pago</a>' % reverse('ordenpago', args=[obj.nro_orden_pago])
    ver_ordenpago.allow_tags = True

    inlines = [
        DetalleOrdenPagoFACInLine, DetalleOrdenPagoNCInLine, DetalleOrdenPagoInLine, DetalleOrdenPagoRetInLine, DetalleOrdenPagoCCInLine,
    ]


class OrdenPagoVentaAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin):
    class Media():
        js = (
            settings.STATIC_URL + "ordenes_de_pago/js/jquery-1.6.2.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.min.js",
            settings.STATIC_URL + "ordenes_de_pago/js/chosen.jquery.orden_pago.js",
            settings.STATIC_URL + "ordenes_de_pago/js/disable_enter.js",
            settings.STATIC_URL + "ordenes_de_pago/js/basic.js",
            settings.STATIC_URL + "ordenes_de_pago/js/orden_de_pago.js",
        )
        css = {
            'all': (settings.STATIC_URL + "ordenes_de_pago/css/style.css", "ordenes_de_pago/css/chosen.css", 'ordenes_de_pago/css/proveedor.css')
        }

    actions = ['Exportar_a_Excel', 'delete_selected']

    def delete_selected(self, request, obj):
        for orden_pago_venta in obj.all():
            for facturaventa in orden_pago_venta.detalleordenpagofacventa_set.all():
                facturaventa.factura.pendiente = False
                facturaventa.factura.save()
            for notacreditoventa in orden_pago_venta.detalleordenpagoncventa_set.all():
                notacreditoventa.notacredito.pendiente = False
                notacreditoventa.notacredito.save()
        orden_pago_venta.delete()

    list_display = ('nro_orden_pago', 'proveedor',
                    'fecha_orden_pago', 'total_a_pagar', 'ver_ordenpago')
    list_filter = ('fecha_orden_pago',)
    search_fields = ('proveedor__razonsocial', 'nro_orden_pago')

    fieldsets = (
        ('Datos Orden de Pago', {
            'classes': ('expand',),
            'fields': (('proveedor',), ('fecha_orden_pago', 'moneda', 'total_a_pagar')),
        }),
    )

    exportable_fields_orden_pago = (
        ('nro_orden_pago', 'Nro. OP'),
        ('proveedor', 'Proveedor'),
        ('fecha_orden_pago', 'Fecha'),
        ('moneda', 'Moneda'),
        ('total_a_pagar', 'Total'),
    )
    exportable_fields_detalle_orden_pago = (
        ('banco', 'Banco'),
        ('forma_pago', 'Forma Pago'),
        ('tipo_gasto', 'Tipo Gasto'),
        ('nro_cheque', 'Cheque'),
    )
    exportable_fields_fac_orden_pago = (
        ('factura', 'Factura'),
    )
    exportable_fields_ret_orden_pago = (
        ('importe_ret_iibb', 'Imp IIBB'),
        ('nro_ret_iibb', 'Nro IIBB'),
        ('importe_ret_ganancias', 'Imp Gan'),
        ('nro_ret_ganancias', 'Nro Gan'),
    )
    exportable_fields_cc_orden_pago = (
        ('centro_costo', 'Ctro Costo'),
        ('porcentaje_aplicacion', '% Aplic'),
    )

    resource_class = OrdenPagoVentaResources

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            if obj is not None:
                return self.readonly_fields + ('proveedor', 'fecha_orden_pago', 'moneda')
        return self.readonly_fields

    def Exportar_a_Excel(self, request, queryset):
        return orden_pago_venta_export_xls(queryset, self.exportable_fields_orden_pago, self.exportable_fields_detalle_orden_pago,
                                           self.exportable_fields_fac_orden_pago, self.exportable_fields_ret_orden_pago, self.exportable_fields_cc_orden_pago)

    def ver_ordenpago(self, obj):
        return '<a href="%s">Ver o Imprimir Orden de Pago</a>' % reverse('ordenpagoventa', args=[obj.nro_orden_pago])
    ver_ordenpago.allow_tags = True

    inlines = [
        DetalleOrdenPagoFACVentaInLine, DetalleOrdenPagoNCVentaInLine, DetalleOrdenPagoVentaInLine, DetalleOrdenPagoRetVentaInLine, DetalleOrdenPagoCCVentaInLine,
    ]


class IngresosBrutosAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin):
    list_display = ('id', 'nro_certificado', 'proveedor',
                    'importe_pagado', 'importe_retenido', 'pertenece', 'ver_retiibb')

    fieldsets = (
        ('Datos Ret IIBB', {
            'classes': ('expand',),
            'fields': (('orden_pago', 'orden_pago_venta', 'proveedor', 'fecha_iibb'),),
        }),
        ('Datos Importes', {
            'classes': ('expand',),
            'fields': (('importe_pagado', 'importe_retenido'),),
        }),
    )

    def ver_retiibb(self, obj):
        return '<a href="%s">Ver o Imprimir Comprobante</a>' % reverse('retiibb', args=[obj.id])
    ver_retiibb.allow_tags = True


admin.site.register(Proveedor, ProveedorAdmin)
#admin.site.register(ProveedorPeru, ProveedorPeruAdmin)
admin.site.register(CentroCosto, CentroCostoAdmin)
admin.site.register(Factura, FacturaAdmin)
#admin.site.register(FacturaPeru, FacturaPeruAdmin)
admin.site.register(FacturaVenta, FacturaVentaAdmin)
admin.site.register(NotaCredito, NotaCreditoAdmin)
#admin.site.register(NotaCreditoPeru, NotaCreditoPeruAdmin)
admin.site.register(NotaCreditoVenta, NotaCreditoVentaAdmin)
#admin.site.register(DetalleFactura, DetalleFacturaAdmin)
#admin.site.register(DetalleFacturaVenta, DetalleFacturaVentaAdmin)
admin.site.register(OrdenPago, OrdenPagoAdmin)
#admin.site.register(OrdenPagoPeru, OrdenPagoPeruAdmin)
admin.site.register(OrdenPagoVenta, OrdenPagoVentaAdmin)
admin.site.register(IngresosBrutos, IngresosBrutosAdmin)
#admin.site.register(DetalleOrdenPago, DetalleOrdenPagoAdmin)
#admin.site.register(DetalleOrdenPagoVenta, DetalleOrdenPagoVentaAdmin)
#admin.site.register(DetalleOrdenPagoFAC, DetalleOrdenPagoFACAdmin)
#admin.site.register(DetalleOrdenPagoFACVenta, DetalleOrdenPagoFACVentaAdmin)
#admin.site.register(DetalleOrdenPagoCC, DetalleOrdenPagoCCAdmin)
#admin.site.register(DetalleOrdenPagoCCVenta, DetalleOrdenPagoCCVentaAdmin)
#admin.site.register(DetalleOrdenPagoRet, DetalleOrdenPagoRetAdmin)
#admin.site.register(DetalleOrdenPagoRetVenta, DetalleOrdenPagoRetVentaAdmin)
admin.site.register(IVA_Compras, IVA_ComprasAdmin)
admin.site.register(IVA_ComprasVenta, IVA_ComprasVentaAdmin)
