# -*- encoding: utf-8 -*-
from import_export.admin import ImportExportModelAdmin
from resources import *
from django.conf import settings
from django.contrib import admin
from django.contrib.admin import SimpleListFilter
from reservas_abm.models import *
#################### VIEW ADMIN LOGS ####################
from django.contrib.admin.models import LogEntry, DELETION
from django.utils.html import escape
from django.utils.safestring import mark_safe
#################### VIEW ADMIN LOGS ####################
from django.http import HttpResponse, HttpResponseRedirect
import xlwt
import csv
import datetime
from datetime import date
from dateutil.relativedelta import relativedelta
from django.utils.translation import ugettext_lazy as _
from types import *
from decimal import Decimal
from django.core.urlresolvers import reverse
from daterange_filter.filter import DateRangeFilter
import re
from django.contrib.messages import *
from django.forms import ModelForm
from django.forms.models import BaseInlineFormSet


def remove_from_fieldsets(fieldsets, fields):
    for fieldset in fieldsets:
        for field in fields:
            if field in fieldset[5]['fields']:
                new_fields = []
                for new_field in fieldset[5]['fields']:
                    if not new_field in fields:
                        new_fields.append(new_field)
                fieldset[5]['fields'] = tuple(new_fields)
                break


def mes_anterior():
    fecha = datetime.date.today()
    delta = relativedelta(months=1)
    mes_ant = (fecha-delta)
    return mes_ant


try:
    from django.contrib.admin.filterspecs import FilterSpec, DateFieldFilterSpec

    class ExpiredFilterSpec(DateFieldFilterSpec):
        # """
        # Adds filtering by future and previous values in the admin
        # filter sidebar. Set the is_expired_filter filter in the model field
        # attribute 'is_expired_filter'.
        #my_model_field.is_expired_filter = True
        # """
        def __init__(self, f, request, params, model, model_admin, **kwargs):
            super(ExpiredFilterSpec, self).__init__(f, request, params, model,
                                                    model_admin, **kwargs)
            self.links += (
                (_('Mes Anterior'), {'%s__month' % self.field.name:
                                     mes_anterior().month, '%s__year' % self.field.name:
                                     mes_anterior().year}),
            )

        def title(self):
            return "Fecha"
    # registering the filter
    FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'is_expired_filter',
                                                         False), ExpiredFilterSpec))
except:
    pass


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 daily_export_xls(queryset, fields, fields_transactions, fields_instruments):
    response = HttpResponse(mimetype="application/ms-excel")
    response['Content-Disposition'] = 'attachment; filename=filename.xls'
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('Daily_' + str(datetime.date.today()),
                      cell_overwrite_ok=True)
    fila = 0
    fila_trans = 0
    fila_instru = 0
    cuenta_filas_transaction = 0
    cuenta_filas_instrument = 0
    ws.write(fila, 0, 'Exportacion Daily ' + str(datetime.date.today()))
    # Encabezado Exportacion
    fila = 3
    all_fields = fields + fields_transactions + fields_instruments
    for j, (field, descripcion) in enumerate(all_fields):
        ws.write(fila, j, unicode(descripcion))
    # Datos Daily
    fila += 1
    fila_copy = fila
    for obj in queryset:
        # Datos Transaccion
        fila_trans = fila
        # Cuento Cant Fila Transaccion
        cuenta_filas_transaction = obj.detalletransaction_set.all().count()
        # Cuento Cant Fila Transaccion
        # Cuento Cant Filas Instrument
        cuenta_filas_instrument = obj.detallepago_set.all().count()
        # Cuento Cant Filas Instrument
        if cuenta_filas_transaction > cuenta_filas_instrument:
            rango = cuenta_filas_transaction
            repite_transaction = 0
            repite_instrument = 1
        else:
            rango = cuenta_filas_instrument
            repite_transaction = 1
            repite_instrument = 0
        if repite_transaction == 0:
            for i in range(obj.detalletransaction_set.all().count()):
                col = 12
                for j, (field_transaction, descripcion) in enumerate(fields_transactions):
                    valor = mygetattr(obj.detalletransaction_set.all()[
                                      i], field_transaction)
                    if descripcion == 'transaction_codeid':
                        transaction_split = (str(valor).split('|'))
                        valor = transaction_split[0]
                    if not (type(valor) is Decimal or type(valor) is LongType):
                        ws.write(fila_trans, col, unicode(valor))
                    if type(valor) is Decimal:
                        ws.row(fila_trans).set_cell_number(col, Decimal(valor))
                    if type(valor) is LongType:
                        ws.row(fila_trans).set_cell_number(col, valor)
                    col += 1
                fila_trans += 1
        else:
            for completa in range(rango):
                for i in range(obj.detalletransaction_set.all().count()):
                    col = 12
                    for j, (field_transaction, descripcion) in enumerate(fields_transactions):
                        valor = mygetattr(obj.detalletransaction_set.all()[
                                          i], field_transaction)
                        if descripcion == 'transaction_codeid':
                            transaction_split = (str(valor).split('|'))
                            valor = transaction_split[0]
                        if not (type(valor) is Decimal or type(valor) is LongType):
                            ws.write(fila_trans, col, unicode(valor))
                        if type(valor) is Decimal:
                            ws.row(fila_trans).set_cell_number(
                                col, Decimal(valor))
                        if type(valor) is LongType:
                            ws.row(fila_trans).set_cell_number(col, valor)
                        col += 1
                    fila_trans += 1
        # Datos Instrument
        fila_instru = fila
        if repite_instrument == 0:
            for i in range(obj.detallepago_set.all().count()):
                col = 17
                for j, (field_instrument, descripcion) in enumerate(fields_instruments):
                    valor = mygetattr(obj.detallepago_set.all()[
                                      i], field_instrument)
                    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 descripcion == 'instrument_id':
                        instrument_split = (str(valor).split('|'))
                        valor = instrument_split[0]
                    if not (type(valor) is Decimal or type(valor) is LongType):
                        ws.write(fila_instru, col, unicode(valor))
                    if type(valor) is Decimal:
                        ws.row(fila_instru).set_cell_number(
                            col, Decimal(valor))
                    if type(valor) is LongType:
                        ws.row(fila_instru).set_cell_number(col, valor)
                    if col == 19:
                        valor_convert = Decimal(str(valor))
                        ws.row(fila_instru).set_cell_number(col, valor_convert)
                    col += 1
                fila_instru += 1
        else:
            for completa in range(rango):
                for i in range(obj.detallepago_set.all().count()):
                    col = 17
                    for j, (field_instrument, descripcion) in enumerate(fields_instruments):
                        valor = mygetattr(obj.detallepago_set.all()[
                                          i], field_instrument)
                        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 descripcion == 'instrument_id':
                            instrument_split = (str(valor).split('|'))
                            valor = instrument_split[0]
                        if not (type(valor) is Decimal or type(valor) is LongType):
                            ws.write(fila_instru, col, unicode(valor))
                        if type(valor) is Decimal:
                            ws.row(fila_instru).set_cell_number(
                                col, Decimal(valor))
                        if type(valor) is LongType:
                            ws.row(fila_instru).set_cell_number(col, valor)
                        if col == 19:
                            valor_convert = Decimal(str(valor))
                            ws.row(fila_instru).set_cell_number(
                                col, valor_convert)
                        col += 1
                    fila_instru += 1
        if (fila_trans >= fila_instru):
            fila = fila_trans
        if (fila_instru >= fila_trans):
            fila = fila_instru
        ######################## REPITE DATOS DAILY ########################
        for j in range(fila - fila_copy):
            for i, (field, descripcion) in enumerate(fields):
                valor = mygetattr(obj, field)
                if valor == 'P':
                    valor = 'ARS'
                if valor == 'D':
                    valor = 'USD'
                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_copy, i, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_copy).set_cell_number(i, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_copy).set_cell_number(i, valor)
            fila_copy += 1
        ######################## REPITE DATOS DAILY ########################
    wb.save(response)
    return response


def daily_chile_export_xls(queryset, fields, fields_transactions, fields_instruments):
    response = HttpResponse(mimetype="application/ms-excel")
    response['Content-Disposition'] = 'attachment; filename=filename.xls'
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('Daily_' + str(datetime.date.today()),
                      cell_overwrite_ok=True)
    fila = 0
    fila_trans = 0
    fila_instru = 0
    ws.write(fila, 0, 'Exportacion Daily ' + str(datetime.date.today()))
    # Encabezado Exportacion
    fila = 3
    all_fields = fields + fields_transactions + fields_instruments
    for j, (field, descripcion) in enumerate(all_fields):
        ws.write(fila, j, unicode(descripcion))
    # Datos Daily
    fila += 1
    #fila_copy = fila
    for obj in queryset:
        # for j in range(obj.detalletransaction_set.all().count()):
        for i, (field, descripcion) in enumerate(fields):
            valor = mygetattr(obj, field)
            if valor == 'P':
                valor = 'ARS'
            if valor == 'D':
                valor = 'USD'
            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_copy, i, unicode(valor))
                ws.write(fila, i, unicode(valor))
            if type(valor) is Decimal:
                #ws.row(fila_copy).set_cell_number(i, Decimal(valor))
                ws.row(fila).set_cell_number(i, Decimal(valor))
            if type(valor) is LongType:
                #ws.row(fila_copy).set_cell_number(i, valor)
                ws.row(fila).set_cell_number(i, valor)
        #  fila_copy+=1
        # Datos Transaccion
        fila_trans = fila
        for i in range(obj.detalletransactionchile_set.all().count()):
            col = 12
            for j, (field_transaction, descripcion) in enumerate(fields_transactions):
                valor = mygetattr(obj.detalletransactionchile_set.all()[
                                  i], field_transaction)
                if descripcion == 'transaction_codeid':
                    transaction_split = (str(valor).split('|'))
                    valor = transaction_split[0]
                if not (type(valor) is Decimal or type(valor) is LongType):
                    ws.write(fila_trans, col, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_trans).set_cell_number(col, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_trans).set_cell_number(col, valor)
                col += 1
            fila_trans += 1
        # Datos Instrument
        fila_instru = fila
        for i in range(obj.detallepagochile_set.all().count()):
            col = 17
            for j, (field_instrument, descripcion) in enumerate(fields_instruments):
                valor = mygetattr(obj.detallepagochile_set.all()[
                                  i], field_instrument)
                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 descripcion == 'instrument_id':
                    instrument_split = (str(valor).split('|'))
                    valor = instrument_split[0]
                if not (type(valor) is Decimal or type(valor) is LongType):
                    ws.write(fila_instru, col, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_instru).set_cell_number(col, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_instru).set_cell_number(col, valor)
                if col == 19:
                    valor_convert = Decimal(str(valor))
                    ws.row(fila_instru).set_cell_number(col, valor_convert)
                col += 1
            fila_instru += 1
        if (fila_trans >= fila_instru):
            fila = fila_trans
        if (fila_instru >= fila_trans):
            fila = fila_instru
        else:
            fila += 1
    wb.save(response)
    return response


def daily_venta_export_xls(queryset, fields, fields_transactions, fields_instruments):
    response = HttpResponse(mimetype="application/ms-excel")
    response['Content-Disposition'] = 'attachment; filename=filename.xls'
    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet(
        'Daily_Venta_' + str(datetime.date.today()), cell_overwrite_ok=True)
    fila = 0
    fila_trans = 0
    fila_instru = 0
    ws.write(fila, 0, 'Exportacion Daily Venta ' + str(datetime.date.today()))
    # Encabezado Exportacion
    fila = 3
    all_fields = fields + fields_transactions + fields_instruments
    for j, (field, descripcion) in enumerate(all_fields):
        ws.write(fila, j, unicode(descripcion))
    # Datos Daily
    fila += 1
    fila_copy = fila
    for obj in queryset:
        # Datos Transaccion
        fila_trans = fila
        # Cuento Cant Fila Transaccion
        cuenta_filas_transaction = obj.detalletransactionventa_set.all().count()
        # Cuento Cant Fila Transaccion
        # Cuento Cant Filas Instrument
        cuenta_filas_instrument = obj.detallepagoventa_set.all().count()
        # Cuento Cant Filas Instrument
        if cuenta_filas_transaction > cuenta_filas_instrument:
            rango = cuenta_filas_transaction
            repite_transaction = 0
            repite_instrument = 1
        else:
            rango = cuenta_filas_instrument
            repite_transaction = 1
            repite_instrument = 0
        if repite_transaction == 0:
            for i in range(obj.detalletransactionventa_set.all().count()):
                col = 12
                for j, (field_transaction, descripcion) in enumerate(fields_transactions):
                    valor = mygetattr(obj.detalletransactionventa_set.all()[
                                      i], field_transaction)
                    if descripcion == 'transaction_codeid':
                        transaction_split = (str(valor).split('|'))
                        valor = transaction_split[0]
                    if not (type(valor) is Decimal or type(valor) is LongType):
                        ws.write(fila_trans, col, unicode(valor))
                    if type(valor) is Decimal:
                        ws.row(fila_trans).set_cell_number(col, Decimal(valor))
                    if type(valor) is LongType:
                        ws.row(fila_trans).set_cell_number(col, valor)
                    col += 1
                fila_trans += 1
        else:
            for completa in range(rango):
                for i in range(obj.detalletransactionventa_set.all().count()):
                    col = 12
                    for j, (field_transaction, descripcion) in enumerate(fields_transactions):
                        valor = mygetattr(obj.detalletransactionventa_set.all()[
                                          i], field_transaction)
                        if descripcion == 'transaction_codeid':
                            transaction_split = (str(valor).split('|'))
                            valor = transaction_split[0]
                        if not (type(valor) is Decimal or type(valor) is LongType):
                            ws.write(fila_trans, col, unicode(valor))
                        if type(valor) is Decimal:
                            ws.row(fila_trans).set_cell_number(
                                col, Decimal(valor))
                        if type(valor) is LongType:
                            ws.row(fila_trans).set_cell_number(col, valor)
                        col += 1
                    fila_trans += 1
        # Datos Instrument
        fila_instru = fila
        if repite_instrument == 0:
            for i in range(obj.detallepagoventa_set.all().count()):
                col = 17
                for j, (field_instrument, descripcion) in enumerate(fields_instruments):
                    valor = mygetattr(obj.detallepagoventa_set.all()[
                                      i], field_instrument)
                    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 descripcion == 'instrument_id':
                        instrument_split = (str(valor).split('|'))
                        # Exporto la forma de pago no el instrument_id
                        valor = instrument_split[1]
                        # Exporto la forma de pago no el instrument_id
                    if not (type(valor) is Decimal or type(valor) is LongType):
                        ws.write(fila_instru, col, unicode(valor))
                    if type(valor) is Decimal:
                        ws.row(fila_instru).set_cell_number(
                            col, Decimal(valor))
                    if type(valor) is LongType:
                        ws.row(fila_instru).set_cell_number(col, valor)
                    if col == 19:
                        if not valor == None:
                            valor_convert = Decimal(str(valor))
                            ws.row(fila_instru).set_cell_number(
                                col, valor_convert)
                    col += 1
                fila_instru += 1
        else:
            for completa in range(rango):
                for i in range(obj.detallepagoventa_set.all().count()):
                    col = 17
                    for j, (field_instrument, descripcion) in enumerate(fields_instruments):
                        valor = mygetattr(obj.detallepagoventa_set.all()[
                                          i], field_instrument)
                        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 descripcion == 'instrument_id':
                            instrument_split = (str(valor).split('|'))
                            # Exporto la forma de pago no el instrument_id
                            valor = instrument_split[1]
                            # Exporto la forma de pago no el instrument_id
                        if not (type(valor) is Decimal or type(valor) is LongType):
                            ws.write(fila_instru, col, unicode(valor))
                        if type(valor) is Decimal:
                            ws.row(fila_instru).set_cell_number(
                                col, Decimal(valor))
                        if type(valor) is LongType:
                            ws.row(fila_instru).set_cell_number(col, valor)
                        if col == 19:
                            valor_convert = Decimal(str(valor))
                            ws.row(fila_instru).set_cell_number(
                                col, valor_convert)
                        col += 1
                    fila_instru += 1
        if (fila_trans >= fila_instru):
            fila = fila_trans
        if (fila_instru >= fila_trans):
            fila = fila_instru
        ######################## REPITE DATOS DAILY ########################
        for j in range(fila - fila_copy):
            for i, (field, descripcion) in enumerate(fields):
                valor = mygetattr(obj, field)
                if valor == 'P':
                    valor = 'ARS'
                if valor == 'D':
                    valor = 'USD'
                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_copy, i, unicode(valor))
                if type(valor) is Decimal:
                    ws.row(fila_copy).set_cell_number(i, Decimal(valor))
                if type(valor) is LongType:
                    ws.row(fila_copy).set_cell_number(i, valor)
            fila_copy += 1
        ######################## REPITE DATOS DAILY ########################
    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 generic_export_pdf(queryset, fields):
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'

    # Create the PDF object, using the response object as its "file."
    p = canvas.Canvas(response)

    p.drawString(100, 100, "Hello world.")

    # Close the PDF object cleanly, and we're done.
    p.showPage()
    p.save()
    return response

# *******************************************************************************


class MesesListFilter(SimpleListFilter):
    title = ('Mes')
    parameter_name = 'month'

    def lookups(self, request, model_admin):
        return (
            ('1', 'Enero'),
            ('2', 'Febrero'),
            ('3', 'Marzo'),
            ('4', 'Abril'),
            ('5', 'Mayo'),
            ('6', 'Junio'),
            ('7', 'Julio'),
            ('8', 'Agosto'),
            ('9', 'Septiembre'),
            ('10', 'Octubre'),
            ('11', 'Noviembre'),
            ('12', 'Diciembre'),
        )

    def queryset(self, request, queryset):
        if self.value() == '1':
            return queryset.filter(fecha__month=1,
                                   fecha__year=datetime.date.today().year)
        if self.value() == '2':
            return queryset.filter(fecha__month=2,
                                   fecha__year=datetime.date.today().year)
        if self.value() == '3':
            return queryset.filter(fecha__month=3,
                                   fecha__year=datetime.date.today().year)
        if self.value() == '4':
            return queryset.filter(fecha__month=4,
                                   fecha__year=datetime.date.today().year)
        if self.value() == '5':
            return queryset.filter(fecha__month=5,
                                   fecha__year=datetime.date.today().year)
        if self.value() == '6':
            return queryset.filter(fecha__month=6,
                                   fecha__year=datetime.date.today().year)
        if self.value() == '7':
            return queryset.filter(fecha__month=7,
                                   fecha__year=datetime.date.today().year)
        if self.value() == '8':
            return queryset.filter(fecha__month=8,
                                   fecha__year=datetime.date.today().year)
        if self.value() == '9':
            return queryset.filter(fecha__month=9,
                                   fecha__year=datetime.date.today().year)
        if self.value() == '10':
            return queryset.filter(fecha__month=10,
                                   fecha__year=datetime.date.today().year)
        if self.value() == '11':
            return queryset.filter(fecha__month=11,
                                   fecha__year=datetime.date.today().year)
        if self.value() == '12':
            return queryset.filter(fecha__month=12,
                                   fecha__year=datetime.date.today().year)
# *******************************************************************************
#*************** Convierte todos los campos en ReadOnly ***********************#


class ReadOnlyAdmin(object):
    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            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 ***********************#
# ******************************* CLASE MEDIAMIXIN ******************************


class MediaMixin(object):
    class Media:
        css = {
            "all": (settings.STATIC_URL + "reservas_abm/css/chosen.css", 'reservas_abm/css/owner.css')
        }
        js = (settings.STATIC_URL + 'reservas_abm/js/jquery-1.6.4.min.js', 'reservas_abm/js/chosen.jquery.min.js',
              'reservas_abm/js/chosen.jquery.daily.js'
              )
# ******************************* CLASE MEDIAMIXIN ******************************


class ReciboDebitoInLine(ReadOnlyAdmin, admin.TabularInline):
    model = ReciboDebito
    extra = 1
    readonly_fields = ('fecha_recibo_debito',)
    # Solo muestro en el inline los campos que necesito

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('fecha_recibo_debito', 'direccion', 'cuit',
                        'recibimos_suma', 'importe_aplicado')})]

    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 + ('fecha_recibo_debito', 'nro_contrato',
                                               'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado',
                                               'anulado')
        if obj is not None:
            return self.readonly_fields + ('fecha_recibo_debito', 'nro_contrato',
                                           'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado',
                                           'anulado')
        return self.readonly_fields


class ReciboInLine(ReadOnlyAdmin, admin.TabularInline):
    model = Recibo
    extra = 1
    readonly_fields = ('fecha_recibo',)
    # Solo muestro en el inline los campos que necesito

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('fecha_recibo', 'direccion', 'cuit',
                        'recibimos_suma', 'importe_aplicado')})]

    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 + ('fecha_recibo', 'nro_contrato',
                                               'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado',
                                               'anulado')
        if obj is not None:
            return self.readonly_fields + ('fecha_recibo', 'nro_contrato',
                                           'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado',
                                           'anulado')
        return self.readonly_fields


class ReciboVentaPeruInLine(ReadOnlyAdmin, admin.TabularInline):
    model = ReciboVentaPeru
    extra = 1
    readonly_fields = ('fecha_recibo_venta',)
    # Solo muestro en el inline los campos que necesito

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('fecha_recibo_venta', 'direccion', 'cuit',
                        'recibimos_suma', 'importe_aplicado')})]

    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 + ('fecha_recibo_venta', 'nro_contrato',
                                               'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado',
                                               'anulado')
        if obj is not None:
            return self.readonly_fields + ('fecha_recibo_venta', 'nro_contrato',
                                           'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado',
                                           'anulado')
        return self.readonly_fields


class ReciboVentaInLine(ReadOnlyAdmin, admin.TabularInline):
    model = ReciboVenta
    extra = 1
    readonly_fields = ('fecha_recibo_venta',)
    # Solo muestro en el inline los campos que necesito

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('fecha_recibo_venta', 'direccion', 'cuit',
                        'recibimos_suma', 'importe_aplicado')})]

    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 + ('fecha_recibo_venta', 'nro_contrato',
                                               'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado',
                                               'anulado')
        if obj is not None:
            return self.readonly_fields + ('fecha_recibo_venta', 'nro_contrato',
                                           'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado',
                                           'anulado')
        return self.readonly_fields


class DetalleTransactionInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleTransaction
    extra = 0
    can_delete = True

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('daily', 'items_transaction',
                                   'transaction_codeid', 'nro_folio', 'importe_usd', 'importe_pesos')})]

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return self.readonly_fields
        if obj is not None:
            self.max_num = obj.detalletransaction_set.count()
            self.extra = 0
            return self.readonly_fields + ('daily', 'items_transaction',
                                           'transaction_codeid', 'nro_folio', 'importe_usd', 'importe_pesos')
        return self.readonly_fields


class DetalleTransactionVentaInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleTransactionVenta
    extra = 0
    can_delete = True

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('daily_venta', 'items_transaction',
                                   'transaction_codeid', 'nro_folio', 'importe_usd', 'importe_pesos')})]

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                self.max_num = obj.detalletransactionventa_set.count()
                self.extra = 0
                self.can_delete = False
                return self.readonly_fields + ('daily_venta', 'items_transaction',
                                               'transaction_codeid', 'nro_folio', 'importe_usd', 'importe_pesos')
        if obj is not None:
            self.max_num = obj.detalletransactionventa_set.count()
            self.extra = 0
            self.can_delete = False
            return self.readonly_fields + ('daily_venta', 'items_transaction',
                                           'transaction_codeid', 'nro_folio', 'importe_usd', 'importe_pesos')
        return self.readonly_fields


class DetalleTransactionVentaPeruInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleTransactionVentaPeru
    extra = 0
    can_delete = True

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('daily_venta', 'items_transaction',
                                   'transaction_codeid', 'nro_folio', 'importe_usd', 'importe_pesos')})]

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                self.max_num = obj.detalletransactionventaperu_set.count()
                self.extra = 0
                self.can_delete = False
                return self.readonly_fields + ('daily_venta', 'items_transaction',
                                               'transaction_codeid', 'nro_folio', 'importe_usd', 'importe_pesos')
        if obj is not None:
            self.max_num = obj.detalletransactionventaperu_set.count()
            self.extra = 0
            self.can_delete = False
            return self.readonly_fields + ('daily_venta', 'items_transaction',
                                           'transaction_codeid', 'nro_folio', 'importe_usd', 'importe_pesos')
        return self.readonly_fields


class DetallePagoInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetallePago
    extra = 0
    readonly_fields = ('tipo_cambio_dia',)

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('daily', 'instrument_id', 'fecha_dep',
                                   'tipo_cambio_dia', 'reference', 'nro_lote', 'nro_tarjeta', 'cant_cuotas', 'nro_cheque',
                                   'monto_usd', 'monto_pesos', 'intereses_pesos')})]

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                self.max_num = obj.detallepago_set.count()
                self.extra = 0
                self.can_delete = False
                return self.readonly_fields + ('daily', 'instrument_id', 'fecha_dep',
                                               'tipo_cambio_dia', 'reference', 'nro_lote', 'nro_tarjeta', 'cant_cuotas', 'monto_usd',
                                               'monto_pesos', 'intereses_pesos', 'nro_cheque')
        return self.readonly_fields


class DetallePagoVentaPeruInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetallePagoVentaPeru
    extra = 0
    readonly_fields = ('tipo_cambio_dia',)

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('daily_venta', 'instrument_id', 'fecha_dep',
                                   'tipo_cambio_dia', 'reference', 'nro_lote', 'nro_cupon', 'cant_cuotas', 'nro_cheque',
                                   'monto_usd', 'monto_pesos', 'intereses_pesos')})]

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                self.max_num = obj.detallepagoventaperu_set.count()
                self.extra = 0
                self.can_delete = False
                return self.readonly_fields + ('daily_venta', 'instrument_id',
                                               'fecha_dep', 'tipo_cambio_dia', 'reference', 'nro_lote', 'nro_cupon', 'cant_cuotas',
                                               'monto_usd', 'monto_pesos', 'intereses_pesos', 'nro_cheque')
        if obj is not None:
            self.max_num = obj.detallepagoventaperu_set.count()
            self.extra = 0
            self.can_delete = False
            return self.readonly_fields + ('daily_venta', 'instrument_id', 'fecha_dep',
                                           'tipo_cambio_dia', 'reference', 'nro_lote', 'nro_cupon', 'cant_cuotas', 'monto_usd',
                                           'monto_pesos', 'intereses_pesos', 'nro_cheque')
        return self.readonly_fields


class DetallePagoVentaInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetallePagoVenta
    #formset = DetallePagoInLineFormSet
    extra = 0
    readonly_fields = ('tipo_cambio_dia',)

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('daily_venta', 'instrument_id', 'fecha_dep',
                                   'tipo_cambio_dia', 'reference', 'nro_lote', 'nro_cupon', 'cant_cuotas', 'nro_cheque',
                                   'monto_usd', 'monto_pesos', 'intereses_pesos')})]

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                self.max_num = obj.detallepagoventa_set.count()
                self.extra = 0
                self.can_delete = False
                return self.readonly_fields + ('daily_venta', 'instrument_id',
                                               'fecha_dep', 'tipo_cambio_dia', 'reference', 'nro_lote', 'nro_cupon', 'cant_cuotas',
                                               'monto_usd', 'monto_pesos', 'intereses_pesos', 'nro_cheque')
        if obj is not None:
            self.max_num = obj.detallepagoventa_set.count()
            self.extra = 0
            self.can_delete = False
            return self.readonly_fields + ('daily_venta', 'instrument_id', 'fecha_dep',
                                           'tipo_cambio_dia', 'reference', 'nro_lote', 'nro_cupon', 'cant_cuotas', 'monto_usd',
                                           'monto_pesos', 'intereses_pesos', 'nro_cheque')
        return self.readonly_fields


class DailyAdmin(ReadOnlyAdmin, admin.ModelAdmin):

    class Media:
        js = (
            settings.STATIC_URL + "reservas_abm/js/jquery-1.6.4.min.js",
            settings.STATIC_URL + "reservas_abm/js/jquery.simplemodal.js",
            settings.STATIC_URL + "reservas_abm/js/disable_enter.js",
            settings.STATIC_URL + "reservas_abm/js/daily_form.js",
            settings.STATIC_URL + "reservas_abm/js/basic.js",
            settings.STATIC_URL + 'reservas_abm/js/chosen.jquery.min.js',
            settings.STATIC_URL + 'reservas_abm/js/chosen.jquery.daily.js',
        )
        css = {
            'all': (settings.STATIC_URL + "reservas_abm/css/style.css",
                    settings.STATIC_URL + "reservas_abm/css/chosen.css",
                    settings.STATIC_URL + 'reservas_abm/css/owner.css'
                    )
        }

    list_display = ('nro_contrato', 'socio', 'tipo_socio', 'ownerid', 'auth_code',
                    'date', 'bank', 'total_amount', 'foreign_amount', 'trxcurrency',
                    'tipo_cambio', 'usuario', 'recibo')
    search_fields = ('auth_code',)
    list_filter = ('usuario', 'tipo_socio', ('date', DateRangeFilter),)
    readonly_fields = ('date',)
    actions = ['Exportar_a_Excel', ]

    exportable_fields = (
        ('nro_contrato', 'Nro. Contrato'),
        ('socio', 'Socio'),
        ('tipo_socio', 'T. Socio'),
        ('ownerid', 'Ownerid'),
        ('auth_code', 'Auth Code'),
        ('date', 'Date'),
        ('bank', 'Bank'),
        ('total_amount', 'Total Amount'),
        ('foreign_amount', 'Foreign Amount'),
        ('trxcurrency', 'TRX Currency'),
        ('tipo_cambio', 'TC'),
        ('usuario', 'Usuario'),
    )
    exportable_fields_transactions = (
        ('items_transaction', 'items_transaction'),
        ('transaction_codeid', 'transaction_codeid'),
        ('nro_folio', 'Folio'),
        ('importe_usd', 'USD'),
        ('importe_pesos', 'pesos'),
    )
    exportable_fields_instruments = (
        ('instrument_id', 'instrument_id'),
        ('fecha_dep', 'fecha_dep'),
        ('tipo_cambio_dia', 'tipo_cambio_dia'),
        ('reference', 'reference'),
        ('nro_aprobacion', 'nro_aprobacion'),
        ('nro_cupon', 'nro_cupon'),
        ('nro_lote', 'nro_lote'),
        ('monto_pesos', 'monto_pesos'),
        ('cant_cuotas', 'cant_cuotas'),
        ('intereses_pesos', 'intereses'),
        ('nro_cheque', 'nro_cheque'),
    )

    admin_fieldsets = (
        ('Datos Owner', {
            'classes': ('expand',),
            'fields': (('owner', 'tipo_socio'),),
        }),
        # ('Datos Contrato', {
        #    'classes' : ('expand',),
        #    'fields' : (('nro_contrato', 'socio', 'tipo_socio'),),
        # }),
        ('Datos Transaccion', {
            'classes': ('expand',),
            'fields': (('bank', 'date'), ('trxcurrency', 'tipo_cambio'),
                       ('total_amount', 'foreign_amount')),
        }),
    )
    restricted_user_fieldsets = (
        ('Datos Usuario', {
            'classes': ('expand',),
            'fields': (('usuario',),),
        }),
    )

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

    def get_form(self, request, *args, **kwargs):
        form = super(DailyAdmin, self).get_form(request, *args, **kwargs)
        form.request = request
        return form

    def Exportar_a_Excel(self, request, queryset):
        return daily_export_xls(queryset, self.exportable_fields,
                                self.exportable_fields_transactions, self.exportable_fields_instruments)

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

    def Exportar_a_Pdf(self, request, queryset):
        return generic_export_pdf(queryset, self.exportable_fields)

    def get_fieldsets(self, request, obj=None):
        fieldsets = self.admin_fieldsets
        if request.user.is_superuser:
            fieldsets = self.admin_fieldsets + self.restricted_user_fieldsets
            return fieldsets
        return fieldsets

    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 + ('nro_contrato', 'socio', 'tipo_socio',
                                               'ownerid', 'date', 'bank', 'total_amount', 'foreign_amount',
                                               'trxcurrency', 'tipo_cambio', 'usuario')
        return self.readonly_fields

    def save_model(self, request, obj, form, change):
        if getattr(obj, 'usuario', None) is None:
            obj.usuario = request.user
        obj.save()

    def queryset(self, request):
        qs = super(DailyAdmin, self).queryset(request)
        if (request.user.is_superuser) or (request.user.groups.values_list('name', flat=True)[0] == 'admin_mx'):
            return qs
        return qs.filter(usuario=request.user)

    inlines = [
        DetalleTransactionInLine, DetallePagoInLine, ReciboInLine,
    ]


class DailyVentaAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    #    form = DailyVentaAdminForm
    class Media:

        js = (settings.STATIC_URL + "reservas_abm/js/jquery-1.6.4.min.js",
              settings.STATIC_URL + "reservas_abm/js/daily_form.js",
              settings.STATIC_URL + "reservas_abm/js/disable_enter.js",
              settings.STATIC_URL + 'reservas_abm/js/chosen.jquery.min.js',
              settings.STATIC_URL + 'reservas_abm/js/chosen.jquery.daily.js',
              )
        css = {
            'all': (settings.STATIC_URL + "reservas_abm/css/style.css", "reservas_abm/css/chosen.css", 'reservas_abm/css/owner.css'
                    )
        }
    list_display = ('nro_contrato', 'socio', 'tipo_socio', 'ownerid', 'auth_code_venta',
                    'date', 'bank', 'total_amount', 'foreign_amount', 'trxcurrency',
                    'tipo_cambio', 'usuario', 'reciboventa')
    search_fields = ('auth_code',)
    list_filter = ('usuario', 'tipo_socio', ('date', DateRangeFilter),)
    readonly_fields = ('date',)
    actions = ['Exportar_a_Excel', ]

    exportable_fields = (
        ('nro_contrato', 'Nro. Contrato'),
        ('socio', 'Socio'),
        ('tipo_socio', 'T. Socio'),
        ('ownerid', 'Ownerid'),
        ('auth_code_venta', 'Auth Code'),
        ('date', 'Date'),
        ('bank', 'Bank'),
        ('total_amount', 'Total Amount'),
        ('foreign_amount', 'Foreign Amount'),
        ('trxcurrency', 'TRX Currency'),
        ('tipo_cambio', 'TC'),
        ('usuario', 'Usuario'),
    )
    exportable_fields_transactions = (
        ('items_transaction', 'items_transaction'),
        ('transaction_codeid', 'transaction_codeid'),
        ('nro_folio', 'Folio'),
        ('importe_usd', 'USD'),
        ('importe_pesos', 'pesos'),
    )
    exportable_fields_instruments = (
        ('instrument_id', 'instrument_id'),
        ('fecha_dep', 'fecha_dep'),
        ('tipo_cambio_dia', 'tipo_cambio_dia'),
        ('reference', 'reference'),
        ('nro_aprobacion', 'nro_aprobacion'),
        ('nro_cupon', 'nro_cupon'),
        ('nro_lote', 'nro_lote'),
        ('monto_pesos', 'monto_pesos'),
        ('cant_cuotas', 'cant_cuotas'),
        ('intereses_pesos', 'intereses'),
        ('nro_cheque', 'nro_cheque'),
    )

    admin_fieldsets = (
        # ('Datos Owner', {
        #    'classes' : ('expand',),
        #    'fields' : (('owner', 'tipo_socio'),),
        # }),
        ('Datos Contrato', {
            'classes': ('expand',),
            'fields': (('nro_contrato', 'socio'), ('tipo_socio', 'ownerid')),
        }),
        ('Datos Transaccion', {
            'classes': ('expand',),
            'fields': (('bank', 'date'), ('trxcurrency', 'tipo_cambio'),
                       ('total_amount', 'foreign_amount')),
        }),
    )
    restricted_user_fieldsets = (
        ('Datos Usuario', {
            'classes': ('expand',),
            'fields': (('usuario',),),
        }),
    )

    def reciboventa(self, obj):
        return '<a href="%s">Ver o Imprimir Recibo</a>' % reverse('recibov', args=[obj.reciboventa.pk])
    reciboventa.allow_tags = True

    def get_form(self, request, *args, **kwargs):
        form = super(DailyVentaAdmin, self).get_form(request, *args, **kwargs)
        form.request = request
        return form

    def Exportar_a_Excel(self, request, queryset):
        return daily_venta_export_xls(queryset, self.exportable_fields,
                                      self.exportable_fields_transactions, self.exportable_fields_instruments)

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

    def Exportar_a_Pdf(self, request, queryset):
        return generic_export_pdf(queryset, self.exportable_fields)

    def get_fieldsets(self, request, obj=None):
        fieldsets = self.admin_fieldsets
        if request.user.is_superuser:
            fieldsets = self.admin_fieldsets + self.restricted_user_fieldsets
            return fieldsets
        return fieldsets

    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 + ('nro_contrato', 'socio', 'tipo_socio',
                                               'ownerid', 'date', 'bank', 'total_amount', 'foreign_amount',
                                               'trxcurrency', 'tipo_cambio', 'usuario')
        if obj is not None:
            return self.readonly_fields
        return self.readonly_fields

    def save_model(self, request, obj, form, change):
        if getattr(obj, 'usuario', None) is None:
            obj.usuario = request.user
        obj.save()

    def queryset(self, request):
        qs = super(DailyVentaAdmin, self).queryset(request)
        if (request.user.is_superuser) or (request.user.username == 'sburgos') or (request.user.username == 'roestrada') or (request.user.username == 'ventas'):
            return qs
        return qs.filter(usuario=request.user)

    inlines = [
        DetalleTransactionVentaInLine, DetallePagoVentaInLine, ReciboVentaInLine,
    ]


class TipoCambioDiaAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('id', 'valor', 'fecha')

    def get_readonly_fields(self, request, obj=None):
        if not (request.user.is_superuser) or (request.user.username == 'sburgos'):
            return self.readonly_fields
        return self.readonly_fields


class FormaPagoAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('forma_pago', 'observaciones')


class TransactionAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('id', 'code', 'descripcion', 'item')
    list_filter = ('item',)
    ordering = ('code',)


class InstrumentAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('id', 'instrument_id', 'forma_pago',
                    'tipo_instrument', 'descripcion')
    list_filter = ('tipo_instrument',)

    fieldsets = (
        ('', {
            'classes': ('expand',),
            'fields': (('instrument_id', 'forma_pago', 'tipo_instrument'),),
        }),
        ('', {
            'classes': ('expand',),
            'fields': (('descripcion',)),
        }),
    )


class BancoAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('id', 'banco', 'descripcion')


class BancoChileAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('id', 'banco', 'descripcion')

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            return self.readonly_fields
        return self.readonly_fields


class BancoPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('id', 'banco', 'descripcion')

    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser:
            return self.readonly_fields
        return self.readonly_fields


class DetallePagoCargoTelefonicoAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('cargotelefonico', 'formapago', 'numero_tarjeta', 'vencimiento',
                    'cod_seguridad', 'numero_cuotas', 'transferencia')


class DetalleTransactionCargoTelefonicoAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('cargotelefonico', 'items_transaction', 'transaction_codeid',
                    'nro_folio')


class DetalleTransactionAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('daily', 'items_transaction', 'transaction_codeid', 'nro_folio',
                    'importe_usd', 'importe_pesos', 'usuario')

    exportable_fields = (
        ('items_transaction', 'items_transaction'),
        ('transaction_codeid', 'transaction_codeid'),
        ('nro_folio', 'nro_folio'),
        ('importe_usd', 'importe_usd'),
        ('importe_pesos', 'importe_pesos'),
    )

    def Exportar_a_Excel(self, request, queryset):
        return generic_export_xls(queryset, self.exportable_fields)

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.usuario = request.user
        obj.save()


class DetalleTransactionVentaAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('daily_venta', 'items_transaction', 'transaction_codeid', 'nro_folio',
                    'importe_usd', 'importe_pesos', 'usuario')

    exportable_fields = (
        ('items_transaction', 'items_transaction'),
        ('transaction_codeid', 'transaction_codeid'),
        ('nro_folio', 'nro_folio'),
        ('importe_usd', 'importe_usd'),
        ('importe_pesos', 'importe_pesos'),
    )

    def Exportar_a_Excel(self, request, queryset):
        return generic_export_xls(queryset, self.exportable_fields)
    '''
    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.usuario = request.user
        obj.save()
    '''


class DetallePagoAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('daily', 'instrument_id', 'fecha_dep', 'tipo_cambio_dia', 'reference',
                    'nro_lote', 'nro_tarjeta', 'cant_cuotas', 'monto_usd', 'monto_pesos',
                    'intereses_pesos', 'nro_cheque', 'usuario')

    readonly_fields = ('tipo_cambio_dia',)
    exportable_fields = (
        ('instrument_id', 'instrument_id'),
        ('fecha_dep', 'fecha_dep'),
        ('tipo_cambio_dia', 'tipo_cambio_dia'),
        ('reference', 'reference'),
        ('nro_lote', 'nro_lote'),
        #('nro_cupon', 'nro_cupon'),
        ('nro_tarjeta', 'nro_tarjeta'),
        ('cant_cuotas', 'cant_cuotas'),
        ('monto_usd', 'monto_usd'),
        ('monto_pesos', 'monto_pesos'),
        ('intereses_pesos', 'intereses_pesos'),
        ('nro_cheque', 'nro_cheque'),
    )


class DetallePagoVentaAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('daily_venta', 'instrument_id', 'fecha_dep', 'tipo_cambio_dia', 'reference',
                    'nro_lote', 'nro_cupon', 'cant_cuotas', 'monto_usd', 'monto_pesos',
                    'intereses_pesos', 'nro_cheque', 'usuario')

    readonly_fields = ('tipo_cambio_dia',)
    exportable_fields = (
        ('instrument_id', 'instrument_id'),
        ('fecha_dep', 'fecha_dep'),
        ('tipo_cambio_dia', 'tipo_cambio_dia'),
        ('reference', 'reference'),
        ('nro_lote', 'nro_lote'),
        ('nro_cupon', 'nro_cupon'),
        ('cant_cuotas', 'cant_cuotas'),
        ('monto_usd', 'monto_usd'),
        ('monto_pesos', 'monto_pesos'),
        ('intereses_pesos', 'intereses_pesos'),
        ('nro_cheque', 'nro_cheque'),
    )


class ReciboAdmin(ReadOnlyAdmin, admin.ModelAdmin):

    list_display = ('daily', 'nro_recibo_pago', 'fecha_recibo', 'nro_contrato', 'socio',
                    'recibo', 'anulado_change', 'usuario')
    list_filter = ('usuario', ('fecha_recibo', DateRangeFilter),)
    readonly_fields = ('fecha_recibo', 'daily')
    admin_fieldsets = (
        ('Datos Recibo', {
            'classes': ('expand',),
            'fields': (('fecha_recibo', 'daily'),),
        }),
        ('Datos Contrato', {
            'classes': ('expand',),
            'fields': (('nro_contrato', 'socio', 'direccion'), ('ownerid',)),
        }),
        ('Datos Transaccion', {
            'classes': ('expand',),
            'fields': (('cuit', 'recibimos_suma'),
                       ('tipo_cambio', 'importe_aplicado')),
        }),
    )
    restricted_user_fieldsets = (
        ('Datos Anulacion', {
            'classes': ('expand',),
            'fields': (('anulado',),),
        }),
        ('Datos Usuario', {
            'classes': ('expand',),
            'fields': (('usuario',),),
        }),
    )

    def anulado_change(self, obj):
        return not obj.anulado  # invert the boolean value
    anulado_change.boolean = True
    anulado_change.admin_order_field = 'anulado'
    anulado_change.short_description = 'Anulado'

    def recibo(self, obj):
        return '<a href="%s">Ver Recibo</a>' % reverse('recibo', args=[obj.nro_recibo_pago])
    recibo.allow_tags = True

    def get_form(self, request, *args, **kwargs):
        form = super(ReciboAdmin, self).get_form(request, *args, **kwargs)
        form.request = request
        return form

    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 + ('fecha_recibo', 'dalily', 'nro_contrato',
                                               'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado')
        if obj is not None:
            return self.readonly_fields + ('fecha_recibo', 'dalily', 'nro_contrato',
                                           'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado')
        return self.readonly_fields

    def get_fieldsets(self, request, obj=None):
        fieldsets = self.admin_fieldsets
        if request.user.is_superuser:
            fieldsets = self.admin_fieldsets + self.restricted_user_fieldsets
            return fieldsets
        return fieldsets

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.usuario = request.user
        obj.save()

    def queryset(self, request):
        qs = super(ReciboAdmin, self).queryset(request)
        if (request.user.is_superuser) or (request.user.groups.values_list('name', flat=True)[0] == 'admin_mx'):
            return qs
        return qs.filter(usuario=request.user)  # ,

######################################### CHILE #########################################


class TipoCambioDiaChileAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('id', 'valor', 'fecha')

    def get_readonly_fields(self, request, obj=None):
        # or (request.user.groups(name='usuarios_chile')):
        if not (request.user.is_superuser):
            return self.readonly_fields
        return self.readonly_fields


class DetalleTransactionChileInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleTransactionChile
    extra = 0
    can_delete = True

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('daily', 'items_transaction',
                                   'transaction_codeid', 'nro_folio', 'importe_usd', 'importe_pesos')})]

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return self.readonly_fields
        if obj is not None:
            self.max_num = obj.detalletransactionchile_set.count()
            self.extra = 0
            return self.readonly_fields + ('daily', 'items_transaction',
                                           'transaction_codeid', 'nro_folio', 'importe_usd', 'importe_pesos')
        return self.readonly_fields


class DetallePagoChileInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetallePagoChile
    extra = 0
    readonly_fields = ('tipo_cambio_dia',)

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('daily', 'instrument_id', 'fecha_dep',
                                   'tipo_cambio_dia', 'reference', 'nro_lote', 'nro_cupon', 'cant_cuotas', 'nro_cheque',
                                   'monto_usd', 'monto_pesos', 'intereses_pesos')})]

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                self.max_num = obj.detallepagochile_set.count()
                self.extra = 0
                self.can_delete = False
                return self.readonly_fields

            if obj is not None:
                self.max_num = obj.detallepagochile_set.count()
                self.extra = 0
                self.can_delete = False
                return self.readonly_fields + ('daily', 'instrument_id', 'fecha_dep',
                                               'tipo_cambio_dia', 'reference', 'nro_lote', 'nro_cupon', 'cant_cuotas', 'monto_usd',
                                               'monto_pesos', 'intereses_pesos', 'nro_cheque')
        return self.readonly_fields


class DetalleTransactionChileAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('daily', 'items_transaction', 'transaction_codeid', 'nro_folio',
                    'importe_usd', 'importe_pesos', 'usuario')

    exportable_fields = (
        ('items_transaction', 'items_transaction'),
        ('transaction_codeid', 'transaction_codeid'),
        ('nro_folio', 'nro_folio'),
        ('importe_usd', 'importe_usd'),
        ('importe_pesos', 'importe_pesos'),
    )

    def Exportar_a_Excel(self, request, queryset):
        return generic_export_xls(queryset, self.exportable_fields)

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.usuario = request.user
        obj.save()


class ReciboChileInLine(ReadOnlyAdmin, admin.TabularInline):
    model = ReciboChile
    extra = 1
    readonly_fields = ('fecha_recibo',)
    # Solo muestro en el inline los campos que necesito

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('fecha_recibo', 'direccion', 'cuit',
                        'recibimos_suma', 'importe_aplicado')})]

    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 + ('fecha_recibo', 'nro_contrato',
                                               'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado',
                                               'anulado')
        if obj is not None:
            return self.readonly_fields + ('fecha_recibo', 'nro_contrato',
                                           'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado',
                                           'anulado')
        return self.readonly_fields


class DailyChileAdmin(ReadOnlyAdmin, admin.ModelAdmin):

    class Media:
        js = (
            settings.STATIC_URL + "reservas_abm/js/jquery-1.6.4.min.js",
            settings.STATIC_URL + "reservas_abm/js/jquery.simplemodal.js",
            settings.STATIC_URL + "reservas_abm/js/disable_enter.js",
            settings.STATIC_URL + "reservas_abm/js/daily_chile_form.js",
            settings.STATIC_URL + "reservas_abm/js/basic.js",
            settings.STATIC_URL + 'reservas_abm/js/chosen.jquery.min.js',
            settings.STATIC_URL + 'reservas_abm/js/chosen.jquery.daily.js',

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

    list_display = ('nro_contrato', 'socio', 'tipo_socio', 'ownerid', 'auth_code',
                    'date', 'bank', 'total_amount', 'foreign_amount', 'trxcurrency',
                    'tipo_cambio', 'usuario', 'recibocl')
    search_fields = ('auth_code',)
    list_filter = ('usuario', 'tipo_socio', ('date', DateRangeFilter),)
    readonly_fields = ('date',)
    actions = ['Exportar_a_Excel', ]

    exportable_fields = (
        ('nro_contrato', 'Nro. Contrato'),
        ('socio', 'Socio'),
        ('tipo_socio', 'T. Socio'),
        ('ownerid', 'Ownerid'),
        ('auth_code', 'Auth Code'),
        ('date', 'Date'),
        ('bank', 'Bank'),
        ('total_amount', 'Total Amount'),
        ('foreign_amount', 'Foreign Amount'),
        ('trxcurrency', 'TRX Currency'),
        ('tipo_cambio', 'TC'),
        ('usuario', 'Usuario'),
    )
    exportable_fields_transactions = (
        ('items_transaction', 'items_transaction'),
        ('transaction_codeid', 'transaction_codeid'),
        ('nro_folio', 'Folio'),
        ('importe_usd', 'USD'),
        ('importe_pesos', 'pesos'),
    )
    exportable_fields_instruments = (
        ('instrument_id', 'instrument_id'),
        ('fecha_dep', 'fecha_dep'),
        ('tipo_cambio_dia', 'tipo_cambio_dia'),
        ('reference', 'reference'),
        ('nro_aprobacion', 'nro_aprobacion'),
        ('nro_cupon', 'nro_cupon'),
        ('nro_lote', 'nro_lote'),
        ('monto_pesos', 'monto_pesos'),
        ('cant_cuotas', 'cant_cuotas'),
        ('intereses_pesos', 'intereses'),
        ('nro_cheque', 'nro_cheque'),
    )

    admin_fieldsets = (
        ('Datos Owner', {
            'classes': ('expand',),
            'fields': (('owner', 'tipo_socio'),),
        }),
        # ('Datos Contrato', {
        #    'classes' : ('expand',),
        #    'fields' : (('nro_contrato', 'socio', 'tipo_socio'),),
        # }),
        ('Datos Transaccion', {
            'classes': ('expand',),
            'fields': (('bank', 'date'), ('trxcurrency', 'tipo_cambio'),
                       ('total_amount', 'foreign_amount')),
        }),
    )
    restricted_user_fieldsets = (
        ('Datos Usuario', {
            'classes': ('expand',),
            'fields': (('usuario',),),
        }),
    )

    def recibocl(self, obj):
        return '<a href="%s">Ver o Imprimir Recibo</a>' % reverse('recibocl', args=[obj.recibochile.pk])
    recibocl.allow_tags = True

    def get_form(self, request, *args, **kwargs):
        form = super(DailyChileAdmin, self).get_form(request, *args, **kwargs)
        form.request = request
        return form

    def Exportar_a_Excel(self, request, queryset):
        return daily_chile_export_xls(queryset, self.exportable_fields,
                                      self.exportable_fields_transactions, self.exportable_fields_instruments)

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

    def Exportar_a_Pdf(self, request, queryset):
        return generic_export_pdf(queryset, self.exportable_fields)

    def get_fieldsets(self, request, obj=None):
        fieldsets = self.admin_fieldsets
        if request.user.is_superuser:
            fieldsets = self.admin_fieldsets + self.restricted_user_fieldsets
            return fieldsets
        return fieldsets

    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 + ('nro_contrato', 'socio', 'tipo_socio',
                                               'ownerid', 'date', 'bank', 'total_amount', 'foreign_amount',
                                               'trxcurrency', 'tipo_cambio', 'usuario')
        if obj is not None:
            return self.readonly_fields
        return self.readonly_fields

    def save_model(self, request, obj, form, change):
        if getattr(obj, 'usuario', None) is None:
            obj.usuario = request.user
        obj.save()

    def queryset(self, request):
        qs = super(DailyChileAdmin, self).queryset(request)
        if (request.user.is_superuser):
            return qs
        return qs.filter(usuario=request.user)

    inlines = [
        DetalleTransactionChileInLine, DetallePagoChileInLine, ReciboChileInLine,
    ]


class DetalleTransactionChileAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('daily', 'items_transaction', 'transaction_codeid', 'nro_folio',
                    'importe_usd', 'importe_pesos', 'usuario')

    exportable_fields = (
        ('items_transaction', 'items_transaction'),
        ('transaction_codeid', 'transaction_codeid'),
        ('nro_folio', 'nro_folio'),
        ('importe_usd', 'importe_usd'),
        ('importe_pesos', 'importe_pesos'),
    )

    def Exportar_a_Excel(self, request, queryset):
        return generic_export_xls(queryset, self.exportable_fields)

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.usuario = request.user
        obj.save()


class DetallePagoChileAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('daily', 'instrument_id', 'fecha_dep', 'tipo_cambio_dia', 'reference',
                    'nro_lote', 'nro_cupon', 'cant_cuotas', 'monto_usd', 'monto_pesos',
                    'intereses_pesos', 'nro_cheque', 'usuario')

    readonly_fields = ('tipo_cambio_dia',)
    exportable_fields = (
        ('instrument_id', 'instrument_id'),
        ('fecha_dep', 'fecha_dep'),
        ('tipo_cambio_dia', 'tipo_cambio_dia'),
        ('reference', 'reference'),
        ('nro_lote', 'nro_lote'),
        ('nro_cupon', 'nro_cupon'),
        ('cant_cuotas', 'cant_cuotas'),
        ('monto_usd', 'monto_usd'),
        ('monto_pesos', 'monto_pesos'),
        ('intereses_pesos', 'intereses_pesos'),
        ('nro_cheque', 'nro_cheque'),
    )


class ReciboChileAdmin(ReadOnlyAdmin, admin.ModelAdmin):

    list_display = ('daily', 'nro_recibo_pago', 'fecha_recibo', 'nro_contrato', 'socio',
                    'recibocl', 'anulado_change', 'usuario')
    list_filter = ('usuario', ('fecha_recibo', DateRangeFilter),)
    readonly_fields = ('fecha_recibo', 'daily')
    admin_fieldsets = (
        ('Datos Recibo', {
            'classes': ('expand',),
            'fields': (('fecha_recibo', 'daily'),),
        }),
        ('Datos Contrato', {
            'classes': ('expand',),
            'fields': (('nro_contrato', 'socio', 'direccion'), ('ownerid',)),
        }),
        ('Datos Transaccion', {
            'classes': ('expand',),
            'fields': (('cuit', 'recibimos_suma'),
                       ('tipo_cambio', 'importe_aplicado')),
        }),
    )
    restricted_user_fieldsets = (
        ('Datos Anulacion', {
            'classes': ('expand',),
            'fields': (('anulado',),),
        }),
        ('Datos Usuario', {
            'classes': ('expand',),
            'fields': (('usuario',),),
        }),
    )

    def anulado_change(self, obj):
        return not obj.anulado  # invert the boolean value
    anulado_change.boolean = True
    anulado_change.admin_order_field = 'anulado'
    anulado_change.short_description = 'Anulado'

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

    def get_form(self, request, *args, **kwargs):
        form = super(ReciboChileAdmin, self).get_form(request, *args, **kwargs)
        form.request = request
        return form

    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 + ('fecha_recibo', 'dalily', 'nro_contrato',
                                               'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado')
        if obj is not None:
            return self.readonly_fields + ('fecha_recibo', 'dalily', 'nro_contrato',
                                           'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado')
        return self.readonly_fields

    def get_fieldsets(self, request, obj=None):
        fieldsets = self.admin_fieldsets
        if (request.user.is_superuser) or request.user.groups.get().name == 'usuarios_chile':
            fieldsets = self.admin_fieldsets + self.restricted_user_fieldsets
            return fieldsets
        return fieldsets

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.usuario = request.user
        obj.save()

    def queryset(self, request):
        qs = super(ReciboChileAdmin, self).queryset(request)
        if (request.user.is_superuser):
            return qs
        return qs.filter(usuario=request.user)  # ,
######################################### CHILE #########################################

######################################### PERU #########################################


class TipoCambioDiaPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('id', 'valor', 'fecha')

    def get_readonly_fields(self, request, obj=None):
        # or (request.user.groups(name='usuarios_chile')):
        if not (request.user.is_superuser):
            return self.readonly_fields
        return self.readonly_fields


class DetalleTransactionPeruInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetalleTransactionVentaPeru
    extra = 0
    can_delete = True

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('daily', 'items_transaction',
                                   'transaction_codeid', 'nro_folio', 'importe_usd', 'importe_pesos')})]

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return self.readonly_fields
        if obj is not None:
            self.max_num = obj.detalletransactionperu_set.count()
            self.extra = 0
            return self.readonly_fields + ('daily', 'items_transaction',
                                           'transaction_codeid', 'nro_folio', 'importe_usd', 'importe_pesos')
        return self.readonly_fields


class DetallePagoPeruInLine(ReadOnlyAdmin, admin.TabularInline):
    model = DetallePagoVentaPeru
    extra = 0
    readonly_fields = ('tipo_cambio_dia',)

    def get_fieldsets(self, request, obj=None):
        return [(None, {'fields': ('daily', 'instrument_id', 'fecha_dep',
                                   'tipo_cambio_dia', 'reference', 'nro_lote', 'nro_cupon', 'cant_cuotas', 'nro_cheque',
                                   'monto_usd', 'monto_pesos', 'intereses_pesos')})]

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            if obj is not None:  # El Objeto no es  nuevo
                self.max_num = obj.detallepagoperu_set.count()
                self.extra = 0
                self.can_delete = False
                return self.readonly_fields

            if obj is not None:
                self.max_num = obj.detallepagoperu_set.count()
                self.extra = 0
                self.can_delete = False
                return self.readonly_fields + ('daily', 'instrument_id', 'fecha_dep',
                                               'tipo_cambio_dia', 'reference', 'nro_lote', 'nro_cupon', 'cant_cuotas', 'monto_usd',
                                               'monto_pesos', 'intereses_pesos', 'nro_cheque')
        return self.readonly_fields


class DetalleTransactionPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('daily', 'items_transaction', 'transaction_codeid', 'nro_folio',
                    'importe_usd', 'importe_pesos', 'usuario')

    exportable_fields = (
        ('items_transaction', 'items_transaction'),
        ('transaction_codeid', 'transaction_codeid'),
        ('nro_folio', 'nro_folio'),
        ('importe_usd', 'importe_usd'),
        ('importe_pesos', 'importe_pesos'),
    )

    def Exportar_a_Excel(self, request, queryset):
        return generic_export_xls(queryset, self.exportable_fields)

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.usuario = request.user
        obj.save()


class DailyPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):

    class Media:
        js = (settings.STATIC_URL + "reservas_abm/js/jquery-1.6.4.min.js",
              settings.STATIC_URL + "reservas_abm/js/dailyventasperu_form.js",
              settings.STATIC_URL + "reservas_abm/js/disable_enter.js",
              settings.STATIC_URL + 'reservas_abm/js/chosen.jquery.min.js',
              settings.STATIC_URL + 'reservas_abm/js/chosen.jquery.daily.js',
              )
        css = {
            'all': (settings.STATIC_URL + "reservas_abm/css/style.css", "reservas_abm/css/chosen.css", 'reservas_abm/css/owner.css')
        }
    list_display = ('nro_contrato', 'socio', 'tipo_socio', 'ownerid', 'auth_code',
                    'date', 'bank', 'total_amount', 'foreign_amount', 'trxcurrency',
                    'tipo_cambio', 'usuario', 'reciboperu')
    search_fields = ('auth_code',)
    list_filter = ('usuario', 'tipo_socio', ('date', DateRangeFilter),)
    readonly_fields = ('date',)
    actions = ['Exportar_a_Excel', ]

    exportable_fields = (
        ('nro_contrato', 'Nro. Contrato'),
        ('socio', 'Socio'),
        ('tipo_socio', 'T. Socio'),
        ('ownerid', 'Ownerid'),
        ('auth_code_venta', 'Auth Code'),
        ('date', 'Date'),
        ('bank', 'Bank'),
        ('total_amount', 'Total Amount'),
        ('foreign_amount', 'Foreign Amount'),
        ('trxcurrency', 'TRX Currency'),
        ('tipo_cambio', 'TC'),
        ('usuario', 'Usuario'),
    )
    exportable_fields_transactions = (
        ('items_transaction', 'items_transaction'),
        ('transaction_codeid', 'transaction_codeid'),
        ('nro_folio', 'Folio'),
        ('importe_usd', 'USD'),
        ('importe_pesos', 'pesos'),
    )
    exportable_fields_instruments = (
        ('instrument_id', 'instrument_id'),
        ('fecha_dep', 'fecha_dep'),
        ('tipo_cambio_dia', 'tipo_cambio_dia'),
        ('reference', 'reference'),
        ('nro_aprobacion', 'nro_aprobacion'),
        ('nro_cupon', 'nro_cupon'),
        ('nro_lote', 'nro_lote'),
        ('monto_pesos', 'monto_pesos'),
        ('cant_cuotas', 'cant_cuotas'),
        ('intereses_pesos', 'intereses'),
        ('nro_cheque', 'nro_cheque'),
    )

    admin_fieldsets = (
        # ('Datos Owner', {
        #    'classes' : ('expand',),
        #    'fields' : (('owner', 'tipo_socio'),),
        # }),
        ('Datos Contrato', {
            'classes': ('expand',),
            'fields': (('nro_contrato', 'socio'), ('tipo_socio', 'ownerid')),
        }),
        ('Datos Transaccion', {
            'classes': ('expand',),
            'fields': (('bank', 'date'), ('trxcurrency', 'tipo_cambio'),
                       ('total_amount', 'foreign_amount')),
        }),
    )
    restricted_user_fieldsets = (
        ('Datos Usuario', {
            'classes': ('expand',),
            'fields': (('usuario',),),
        }),
    )

    def reciboperu(self, obj):
        return '<a href="%s">Ver o Imprimir Recibo</a>' % reverse('reciboperu', args=[obj.reciboventaperu.pk])
    reciboperu.allow_tags = True

    def get_form(self, request, *args, **kwargs):
        form = super(DailyPeruAdmin, self).get_form(request, *args, **kwargs)
        form.request = request
        return form

    def Exportar_a_Excel(self, request, queryset):
        return daily_venta_export_xls(queryset, self.exportable_fields,
                                      self.exportable_fields_transactions, self.exportable_fields_instruments)

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

    def Exportar_a_Pdf(self, request, queryset):
        return generic_export_pdf(queryset, self.exportable_fields)

    def get_fieldsets(self, request, obj=None):
        fieldsets = self.admin_fieldsets
        if request.user.is_superuser:
            fieldsets = self.admin_fieldsets + self.restricted_user_fieldsets
            return fieldsets
        return fieldsets

    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 + ('nro_contrato', 'socio', 'tipo_socio',
                                               'ownerid', 'date', 'bank', 'total_amount', 'foreign_amount',
                                               'trxcurrency', 'tipo_cambio', 'usuario')
        if obj is not None:
            return self.readonly_fields
        return self.readonly_fields

    def save_model(self, request, obj, form, change):
        if getattr(obj, 'usuario', None) is None:
            obj.usuario = request.user
        obj.save()

    def queryset(self, request):
        qs = super(DailyPeruAdmin, self).queryset(request)
        if (request.user.is_superuser) or (request.user.username == 'sburgos'):
            return qs
        return qs.filter(usuario=request.user)

    inlines = [
        DetalleTransactionVentaPeruInLine, DetallePagoVentaPeruInLine, ReciboVentaPeruInLine,
    ]


class DetalleTransactionVentaPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('daily', 'items_transaction', 'transaction_codeid', 'nro_folio',
                    'importe_usd', 'importe_pesos', 'usuario')

    exportable_fields = (
        ('items_transaction', 'items_transaction'),
        ('transaction_codeid', 'transaction_codeid'),
        ('nro_folio', 'nro_folio'),
        ('importe_usd', 'importe_usd'),
        ('importe_pesos', 'importe_pesos'),
    )

    def Exportar_a_Excel(self, request, queryset):
        return generic_export_xls(queryset, self.exportable_fields)

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.usuario = request.user
        obj.save()


class DetallePagoVentaPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('daily', 'instrument_id', 'fecha_dep', 'tipo_cambio_dia', 'reference',
                    'nro_lote', 'nro_cupon', 'cant_cuotas', 'monto_usd', 'monto_pesos',
                    'intereses_pesos', 'nro_cheque', 'usuario')

    readonly_fields = ('tipo_cambio_dia',)
    exportable_fields = (
        ('instrument_id', 'instrument_id'),
        ('fecha_dep', 'fecha_dep'),
        ('tipo_cambio_dia', 'tipo_cambio_dia'),
        ('reference', 'reference'),
        ('nro_lote', 'nro_lote'),
        ('nro_cupon', 'nro_cupon'),
        ('cant_cuotas', 'cant_cuotas'),
        ('monto_usd', 'monto_usd'),
        ('monto_pesos', 'monto_pesos'),
        ('intereses_pesos', 'intereses_pesos'),
        ('nro_cheque', 'nro_cheque'),
    )


class ReciboVentaPeruAdmin(ReadOnlyAdmin, admin.ModelAdmin):

    list_display = ('daily_peru', 'nro_recibo_pago_venta', 'fecha_recibo_venta', 'nro_contrato', 'socio',
                    'reciboperu', 'anulado_change', 'usuario')
    list_filter = ('usuario', ('fecha_recibo_venta', DateRangeFilter),)
    readonly_fields = ('fecha_recibo_venta', 'daily_peru')
    admin_fieldsets = (
        ('Datos Recibo', {
            'classes': ('expand',),
            'fields': (('fecha_recibo_venta', 'daily_peru'),),
        }),
        ('Datos Contrato', {
            'classes': ('expand',),
            'fields': (('nro_contrato', 'socio', 'direccion'), ('ownerid',)),
        }),
        ('Datos Transaccion', {
            'classes': ('expand',),
            'fields': (('cuit', 'recibimos_suma'),
                       ('tipo_cambio', 'importe_aplicado')),
        }),
    )
    restricted_user_fieldsets = (
        ('Datos Anulacion', {
            'classes': ('expand',),
            'fields': (('anulado',),),
        }),
        ('Datos Usuario', {
            'classes': ('expand',),
            'fields': (('usuario',),),
        }),
    )

    def anulado_change(self, obj):
        return not obj.anulado  # invert the boolean value
    anulado_change.boolean = True
    anulado_change.admin_order_field = 'anulado'
    anulado_change.short_description = 'Anulado'

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

    def get_form(self, request, *args, **kwargs):
        form = super(ReciboVentaPeruAdmin, self).get_form(
            request, *args, **kwargs)
        form.request = request
        return form

    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 + ('fecha_recibo_venta', 'daily_peru', 'nro_contrato',
                                               'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado')
        if obj is not None:
            return self.readonly_fields + ('fecha_recibo_venta', 'daily_peru', 'nro_contrato',
                                           'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado')
        return self.readonly_fields

    def get_fieldsets(self, request, obj=None):
        fieldsets = self.admin_fieldsets
        if (request.user.is_superuser) or request.user.groups.get().name == 'ventas_peru':
            fieldsets = self.admin_fieldsets + self.restricted_user_fieldsets
            return fieldsets
        return fieldsets

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.usuario = request.user
        obj.save()

    def queryset(self, request):
        qs = super(ReciboVentaPeruAdmin, self).queryset(request)
        if (request.user.is_superuser):
            return qs
        return qs.filter(usuario=request.user)  # ,
######################################### PERU #########################################

#########################################################################################


class ReciboVentaAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    list_display = ('daily_venta', 'nro_recibo_pago_venta', 'fecha_recibo_venta', 'nro_contrato', 'socio',
                    'recibov', 'anulado_change', 'usuario')
    list_filter = ('usuario', ('fecha_recibo_venta', DateRangeFilter),)
    readonly_fields = ('fecha_recibo_venta', 'daily_venta')
    admin_fieldsets = (
        ('Datos Recibo', {
            'classes': ('expand',),
            'fields': (('fecha_recibo_venta', 'daily_venta'),),
        }),
        ('Datos Contrato', {
            'classes': ('expand',),
            'fields': (('nro_contrato', 'socio', 'direccion'), ('ownerid',)),
        }),
        ('Datos Transaccion', {
            'classes': ('expand',),
            'fields': (('cuit', 'recibimos_suma'),
                       ('tipo_cambio', 'importe_aplicado')),
        }),
    )
    restricted_user_fieldsets = (
        ('Datos Anulacion', {
            'classes': ('expand',),
            'fields': (('anulado',),),
        }),
        ('Datos Usuario', {
            'classes': ('expand',),
            'fields': (('usuario',),),
        }),
    )

    def anulado_change(self, obj):
        return not obj.anulado  # invert the boolean value
    anulado_change.boolean = True
    anulado_change.admin_order_field = 'anulado'
    anulado_change.short_description = 'Anulado'

    def recibov(self, obj):
        return '<a href="%s">Ver Recibo</a>' % reverse('recibov', args=[obj.nro_recibo_pago_venta])
    recibov.allow_tags = True

    def get_form(self, request, *args, **kwargs):
        form = super(ReciboVentaAdmin, self).get_form(request, *args, **kwargs)
        form.request = request
        return form

    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 + ('fecha_recibo_venta', 'dalily_venta', 'nro_contrato',
                                               'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado')
        if obj is not None:
            return self.readonly_fields + ('fecha_recibo_venta', 'dalily_venta', 'nro_contrato',
                                           'ownerid', 'socio', 'tipo_cambio', 'importe_aplicado')
        return self.readonly_fields

    def get_fieldsets(self, request, obj=None):
        fieldsets = self.admin_fieldsets
        if request.user.is_superuser:
            fieldsets = self.admin_fieldsets + self.restricted_user_fieldsets
            return fieldsets
        return fieldsets

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.usuario = request.user
        obj.save()

    def queryset(self, request):
        qs = super(ReciboVentaAdmin, self).queryset(request)
        if (request.user.is_superuser) or (request.user.username == 'sburgos') or (request.user.username == 'roestrada') or (request.user.username == 'ventas'):
            return qs
        return qs.filter(usuario=request.user)


############################################ IMPORT DEBITOS ############################################


class ReciboDebitoAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin):
    list_display = ('nro_recibo_pago_debito', 'fecha_recibo_debito', 'nro_contrato', 'socio', 'recibodebito', 'tipo_cambio', 'bank', 'cuit', 'direccion',
                    'anulado_change', 'transaction_codeid', 'instrument_id', 'importe_aplicado', 'trxcurrency', 'total_amount', 'foreign_amount')
    ordering = ('nro_recibo_pago_debito',)
    admin_fieldsets = (
        ('Datos Recibo', {
            'classes': ('expand',),
            'fields': (('fecha_recibo_debito', ),),
        }),
        ('Datos Contrato', {
            'classes': ('expand',),
            'fields': (('nro_contrato', 'socio', 'direccion'),),
        }),
        ('Datos Transaccion', {
            'classes': ('expand',),
            'fields': (('cuit', 'importe_aplicado'),),
        }),
        ('Datos Transaction', {
            'classes': ('expand',),
            'fields': (('transaction_codeid', 'instrument_id', 'trxcurrency'), ('total_amount', 'foreign_amount', 'tipo_cambio'), ('bank',))
        }),
    )
    restricted_user_fieldsets = (
        ('Datos Anulacion', {
            'classes': ('expand',),
            'fields': (('anulado',),),
        }),
        ('Datos Usuario', {
            'classes': ('expand',),
            'fields': (('usuario',),),
        }),
    )

    resource_class = ReciboDebitoResources

    def anulado_change(self, obj):
        return not obj.anulado  # invert the boolean value
    anulado_change.boolean = True
    anulado_change.admin_order_field = 'anulado'
    anulado_change.short_description = 'Anulado'

    def recibodebito(self, obj):
        return '<a href="%s">Ver Recibo</a>' % reverse('recibod', args=[obj.nro_recibo_pago_debito])
    recibodebito.allow_tags = True

    def get_form(self, request, *args, **kwargs):
        form = super(ReciboDebitoAdmin, self).get_form(
            request, *args, **kwargs)
        form.request = request
        return form

    def get_fieldsets(self, request, obj=None):
        fieldsets = self.admin_fieldsets
        if request.user.is_superuser:
            fieldsets = self.admin_fieldsets + self.restricted_user_fieldsets
            return fieldsets
        return fieldsets

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.usuario = request.user
        obj.save()

    def queryset(self, request):
        qs = super(ReciboDebitoAdmin, self).queryset(request)
        if (request.user.is_superuser):
            return qs
        return qs.filter(usuario=request.user)


class DetallePagoDebitoAdmin(ReadOnlyAdmin, admin.ModelAdmin):
    pass

############################################ IMPORT DEBITOS ############################################

############################################ IMPORT VPOS ############################################


class ReciboVPosAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin):
    list_display = ('nro_recibo_pago_vpos', 'fecha_recibo_vpos', 'nro_contrato', 'socio', 'recibovpos', 'tipo_cambio', 'bank', 'cuit', 'direccion',
                    'anulado_change', 'transaction_codeid', 'instrument_id', 'importe_aplicado', 'trxcurrency', 'total_amount', 'foreign_amount')

    ordering = ('nro_recibo_pago_vpos',)

    admin_fieldsets = (
        ('Datos Recibo', {
            'classes': ('expand',),
            'fields': (('fecha_recibo_vpos', ),),
        }),
        ('Datos Contrato', {
            'classes': ('expand',),
            'fields': (('nro_contrato', 'socio', 'direccion'),),
        }),
        ('Datos Transaccion', {
            'classes': ('expand',),
            'fields': (('cuit', 'importe_aplicado'),),
        }),
        ('Datos Transaction', {
            'classes': ('expand',),
            'fields': (('transaction_codeid', 'instrument_id', 'trxcurrency'), ('total_amount', 'foreign_amount', 'tipo_cambio'), ('bank',))
        }),
    )
    restricted_user_fieldsets = (
        ('Datos Anulacion', {
            'classes': ('expand',),
            'fields': (('anulado',),),
        }),
        ('Datos Usuario', {
            'classes': ('expand',),
            'fields': (('usuario',),),
        }),
    )

    resource_class = ReciboVPosResources

    def anulado_change(self, obj):
        return not obj.anulado  # invert the boolean value
    anulado_change.boolean = True
    anulado_change.admin_order_field = 'anulado'
    anulado_change.short_description = 'Anulado'

    def recibovpos(self, obj):
        return '<a href="%s">Ver Recibo</a>' % reverse('recibovpos', args=[obj.nro_recibo_pago_vpos])
    recibovpos.allow_tags = True

    def get_form(self, request, *args, **kwargs):
        form = super(ReciboVPosAdmin, self).get_form(request, *args, **kwargs)
        form.request = request
        return form

    def get_fieldsets(self, request, obj=None):
        fieldsets = self.admin_fieldsets
        if request.user.is_superuser:
            fieldsets = self.admin_fieldsets + self.restricted_user_fieldsets
            return fieldsets
        return fieldsets

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.usuario = request.user
        obj.save()

    def queryset(self, request):
        qs = super(ReciboVPosAdmin, self).queryset(request)
        if (request.user.is_superuser):
            return qs
        return qs.filter(usuario=request.user)

############################################ IMPORT VPOS ############################################


class SocioAdmin(ReadOnlyAdmin, ImportExportModelAdmin, admin.ModelAdmin):
    list_display = ('id', 'owner_id', 'contract_number',
                    'owner_name', 'street_address')
    search_fields = ('owner_id', 'contract_number', 'owner_name')

    fieldsets = (
        ('Datos Contrato', {
            'classes': ('expand',),
            'fields': (('owner_id', 'contract_number'),),
        }),
        ('Datos Socio', {
            'classes': ('expand',),
            'fields': (('owner_name', 'street_address'),),
        }),
    )

    resource_class = SocioResources

    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
        if obj is not None:
            return self.readonly_fields
        return self.readonly_fields


class LogEntryAdmin(admin.ModelAdmin):

    date_hierarchy = 'action_time'

    readonly_fields = LogEntry._meta.get_all_field_names()

    list_filter = [
        'user',
        'content_type',
        'action_flag'
    ]

    search_fields = [
        'object_repr',
        'change_message'
    ]

    list_display = [
        # 'log_entry',
        'action_time',
        'user',
        'content_type',
        'object_link',
        'action_flag',
        'change_message',
    ]

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return request.user.is_superuser and request.method != 'POST'

    def has_delete_permission(self, request, obj=None):
        return False

    def object_link(self, obj):
        if obj.action_flag == DELETION:
            link = escape(obj.object_repr)
        else:
            ct = obj.content_type
            link = u'<a href="%s">%s</a>' % (
                reverse('admin:%s_%s_change' %
                        (ct.app_label, ct.model), args=[obj.object_id]),
                escape(obj.object_repr),
            )
        return link
    object_link.allow_tags = True
    object_link.admin_order_field = 'object_repr'
    object_link.short_description = u'object'

    def queryset(self, request):
        return super(LogEntryAdmin, self).queryset(request) \
            .prefetch_related('content_type')


admin.site.register(TipoCambioDia, TipoCambioDiaAdmin)
#admin.site.register(TipoCambioDiaChile, TipoCambioDiaChileAdmin)
#admin.site.register(TipoCambioDiaPeru, TipoCambioDiaPeruAdmin)
admin.site.register(Transaction, TransactionAdmin)
admin.site.register(Instrument, InstrumentAdmin)
admin.site.register(Banco, BancoAdmin)
#admin.site.register(BancoChile, BancoChileAdmin)
#admin.site.register(BancoPeru, BancoPeruAdmin)
admin.site.register(Recibo, ReciboAdmin)
#admin.site.register(ReciboChile, ReciboChileAdmin)
#admin.site.register(ReciboVentaPeru, ReciboVentaPeruAdmin)
admin.site.register(ReciboVPos, ReciboVPosAdmin)
admin.site.register(ReciboDebito, ReciboDebitoAdmin)
admin.site.register(ReciboVenta, ReciboVentaAdmin)
admin.site.register(FormaPago, FormaPagoAdmin)
admin.site.register(Daily, DailyAdmin)
#admin.site.register(DailyChile, DailyChileAdmin)
#admin.site.register(DailyPeru, DailyPeruAdmin)
admin.site.register(DailyVenta, DailyVentaAdmin)
admin.site.register(Socio, SocioAdmin)
admin.site.register(LogEntry, LogEntryAdmin)
#admin.site.register(CoeficienteTarjeta, CoeficienteTarjetaAdmin)
#admin.site.register(DetalleTransactionCargoTelefonico, DetalleTransactionCargoTelefonicoAdmin)
#admin.site.register(DetallePagoCargoTelefonico, DetallePagoCargoTelefonicoAdmin)
#admin.site.register(DetallePago, DetallePagoAdmin)
#admin.site.register(DetallePagoDebito, DetallePagoDebitoAdmin)
#admin.site.register(DetallePagoVenta, DetallePagoVentaAdmin)
#admin.site.register(DetalleTransaction, DetalleTransactionAdmin)
#admin.site.register(DetalleTransactionVenta, DetalleTransactionVentaAdmin)
#admin.site.register(CargoTelefonico, CargoTelefonicoAdmin)
#admin.site.register(ReportesAnteriores, ReportesAnterioresAdmin)
#admin.site.register(CashOut, CashOutAdmin)
#admin.site.register(EjecutivoNuevoSocio, EjecutivoNuevoSocioAdmin)
#admin.site.register(WelcomeCall, WelcomeCallAdmin)
#admin.site.register(CobranzaSobreMantenimiento, CobranzaSobreMantenimientoAdmin)
#admin.site.register(Cobranza, CobranzaAdmin)
#admin.site.register(LlamadaDeBienvenida, LlamadaDeBienvenidaAdmin)
#admin.site.register(UserProfile, UserProfileAdmin)
#admin.site.register(NuevosSocio, NuevosSocioAdmin)
