# Path: djangovirtualpos/util.py
# def dictlist(node):
#     res = {}
#     res[node.tag] = []
#     xmltodict(node, res[node.tag])
#     reply = {}
#     reply[node.tag] = {'value': res[node.tag], 'attribs': node.attrib, 'tail': node.tail}
# 
#     return reply
# 
# def localize_datetime(_datetime):
#     """Localiza la marca de tiempo en función de la zona de tiempo del servidor. Sólo y exclusivamente si no está localizada ya."""
#     if timezone.is_naive(_datetime):
#         return as_server_datetime(_datetime)
#     return _datetime


import base64
import json
import re
import cgi
import random
import urllib2, urllib
import urlparse
import hashlib
import datetime
import time
import requests
from bs4 import BeautifulSoup
from debug import dlprint
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
from django.conf import settings
from django.core.validators import MinLengthValidator, MaxLengthValidator, RegexValidator
from django.db.models import Sum
from django.http import HttpResponse
from django.utils import timezone
from django.shortcuts import redirect
from django.core.urlresolvers import reverse
from django.utils import translation
from Crypto.Cipher import DES3
from Crypto.Hash import SHA256, HMAC
from lxml import etree
from decimal import Decimal
from djangovirtualpos.util import dictlist, localize_datetime
from django.utils.translation import ugettext_lazy as _
from bs4 import BeautifulSoup
        from forms import VPOSCecaForm
        from forms import VPOSRedsysForm
        from forms import VPOSPaypalForm
        from forms import VPOSSantanderElavonForm
    @property
    def total_amount_refunded(self):
        return self.refund_operations.filter(status='completed').aggregate(Sum('amount'))['amount__sum']

    # Comprueba si un pago ha sido totalmente debuelto y cambia el estado en coherencias.
    def compute_payment_refunded_status(self):

        if self.total_amount_refunded == self.amount:
            self.status = "completely_refunded"

        elif self.total_amount_refunded < self.amount:
            dlprint('Devolución parcial de pago.')
            self.status = "partially_refunded"

        elif self.total_amount_refunded > self.amount:
            raise ValueError(u'ERROR. Este caso es imposible, no se puede reembolsar una cantidad superior al pago.')

        self.save()


    ## Guarda el objeto en BD, en realidad lo único que hace es actualizar los datetimes
    def save(self, *args, **kwargs):
        """
        Guarda el objeto en BD, en realidad lo único que hace es actualizar los datetimes.
        El datetime de actualización se actualiza siempre, el de creación sólo al guardar de nuevas.
        """
        # Datetime con el momento actual en UTC
        now_datetime = datetime.datetime.now()
        # Si no se ha guardado aún, el datetime de creación es la fecha actual
        if not self.id:

# Path: djangovirtualpos/util.py
# def dictlist(node):
#     res = {}
#     res[node.tag] = []
#     xmltodict(node, res[node.tag])
#     reply = {}
#     reply[node.tag] = {'value': res[node.tag], 'attribs': node.attrib, 'tail': node.tail}
# 
#     return reply
# 
# def localize_datetime(_datetime):
#     """Localiza la marca de tiempo en función de la zona de tiempo del servidor. Sólo y exclusivamente si no está localizada ya."""
#     if timezone.is_naive(_datetime):
#         return as_server_datetime(_datetime)
#     return _datetime


# Path: djangovirtualpos/models.py
import base64
import json
import re
import cgi
import random
import urllib2, urllib
import urlparse
import hashlib
import datetime
import time
import requests
from bs4 import BeautifulSoup
from debug import dlprint
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
from django.conf import settings
from django.core.validators import MinLengthValidator, MaxLengthValidator, RegexValidator
from django.db.models import Sum
from django.http import HttpResponse
from django.utils import timezone
from django.shortcuts import redirect
from django.core.urlresolvers import reverse
from django.utils import translation
from Crypto.Cipher import DES3
from Crypto.Hash import SHA256, HMAC
from lxml import etree
from decimal import Decimal
from djangovirtualpos.util import dictlist, localize_datetime
from django.utils.translation import ugettext_lazy as _
from bs4 import BeautifulSoup
        from forms import VPOSCecaForm
        from forms import VPOSRedsysForm
        from forms import VPOSPaypalForm
        from forms import VPOSSantanderElavonForm

    @property
    def total_amount_refunded(self):
        return self.refund_operations.filter(status='completed').aggregate(Sum('amount'))['amount__sum']

    # Comprueba si un pago ha sido totalmente debuelto y cambia el estado en coherencias.
    def compute_payment_refunded_status(self):

        if self.total_amount_refunded == self.amount:
            self.status = "completely_refunded"

        elif self.total_amount_refunded < self.amount:
            dlprint('Devolución parcial de pago.')
            self.status = "partially_refunded"

        elif self.total_amount_refunded > self.amount:
            raise ValueError(u'ERROR. Este caso es imposible, no se puede reembolsar una cantidad superior al pago.')

        self.save()


    ## Guarda el objeto en BD, en realidad lo único que hace es actualizar los datetimes
    def save(self, *args, **kwargs):
        """
        Guarda el objeto en BD, en realidad lo único que hace es actualizar los datetimes.
        El datetime de actualización se actualiza siempre, el de creación sólo al guardar de nuevas.
        """
        # Datetime con el momento actual en UTC
        now_datetime = datetime.datetime.now()
        # Si no se ha guardado aún, el datetime de creación es la fecha actual
        if not self.id:

            self.creation_datetime = localize_datetime(now_datetime)