Example #1
0
    def _delete(self, *args, **options):
        older_than = {}
        for rule in options['older_than'].split(';'):
            if ':' in rule:
                days, method = map(lambda x: x.strip(), rule.split(':', 1))
            else:
                days = rule
                method = None
            try:
                older_than[method] = int(days)
            except ValueError:
                raise CommandError('invalid int value: %s' % days)

        default = older_than.get(None)
        today = datetime.datetime.now()
        if options['conference']:
            qs = models.Order.objects.filter(
                orderitem__ticket__fare__conference=options['conference'])
        else:
            qs = models.Order.objects.all()
        for o in qs.exclude(assopy_id=None).filter(_complete=False):
            limit = older_than.get(o.method, default)
            if limit is None:
                continue
            # Non voglio cancellare degli ordini che hanno una fattura
            # collegata, in teoria basterebbe interrogare il backend, ma la
            # .count(); utilizzo la chiamata remota solo per essere sicuro che
            # non sia stata registrata una fattura tra due sincornizzazioni (v.
            # _sync)
            if o.invoices.count() > 0:
                continue
            if genro.order_invoices(o.assopy_id):
                continue
            if (today - o.created).days >= limit:
                log.info('remove "%s" method=%s created=%s', o, o.method,
                         o.created)
                for item in o.orderitem_set.exclude(ticket=None):
                    item.ticket.delete()
                o.delete()
    def _delete(self, *args, **options):
        older_than = {}
        for rule in options['older_than'].split(';'):
            if ':' in rule:
                days, method = map(lambda x: x.strip(), rule.split(':', 1))
            else:
                days = rule
                method = None
            try:
                older_than[method] = int(days)
            except ValueError:
                raise CommandError('invalid int value: %s' % days)

        default = older_than.get(None)
        today = datetime.datetime.now()
        if options['conference']:
            qs = models.Order.objects.filter(orderitem__ticket__fare__conference=options['conference'])
        else:
            qs = models.Order.objects.all()
        for o in qs.exclude(assopy_id=None).filter(_complete=False):
            limit = older_than.get(o.method, default)
            if limit is None:
                continue
            # Non voglio cancellare degli ordini che hanno una fattura
            # collegata, in teoria basterebbe interrogare il backend, ma la
            # .count(); utilizzo la chiamata remota solo per essere sicuro che
            # non sia stata registrata una fattura tra due sincornizzazioni (v.
            # _sync)
            if o.invoices.count() > 0:
                continue
            if genro.order_invoices(o.assopy_id):
                continue
            if (today - o.created).days >= limit:
                log.info('remove "%s" method=%s created=%s', o, o.method, o.created)
                for item in o.orderitem_set.exclude(ticket=None):
                    item.ticket.delete()
                o.delete()
Example #3
0
    def creates_from_order(self, order, update=False, payment_date=None):
        if settings.GENRO_BACKEND:
            if not order.assopy_id:
                return

            remote = dict((x['number'], x) for x in genro.order_invoices(order.assopy_id))

            def _copy(invoice, data):
                invoice.code = data['number']
                invoice.assopy_id = data['id']
                invoice.emit_date = data['invoice_date']
                invoice.payment_date = data['payment_date']
                invoice.price = str(data['gross_price'])
                return invoice

            invoices = []
            if update:
                for i in order.invoices.all():
                    try:
                        data = remote.pop(i.code)
                    except KeyError:
                        i.delete()
                    else:
                        _copy(i, data)
                        i.save()
                        invoices.append(i)

            for data in remote.values():
                i = Invoice(order=order)
                _copy(i, data)
                i.save()
                invoices.append(i)
            return invoices
        else:
            assert update is False

            if order.total() == 0:
                return

            def invoices_code(o, fake=False):
                output = []

                def icode(buff=[None]):

                    if fake is False:
                        last = settings.LAST_INVOICE_CODE
                        next = settings.NEXT_INVOICE_CODE
                    else:
                        last = settings.LAST_FAKE_INVOICE_CODE
                        next = settings.NEXT_FAKE_INVOICE_CODE

                    if buff[0] is None:
                        buff[0] = last(o)
                    buff[0] = next(buff[0],o)
                    return buff[0]

                for item in o.vat_list():
                    item.update({
                        'code': icode(),
                    })
                    output.append(item)
                return output

            # Genero un save point almeno isolo la transazione
            from django.db import connection
            cursor = connection.cursor()
            cursor.execute(
                'savepoint pregenerateinvoice;'
            )
            # salvo almeno sono sicuro di aver effettuato
            # un operazione di insert nella transazione
            # in modo da crere un lock su db che gestisce la concorrenza
            # nella creazione di un indice univoco nella fattura
            # questo รจ valido solo per db SQLITE
            order.save()

            invoices = []
            vat_list = invoices_code(order, fake=payment_date is None)

            emit_date = payment_date or datetime.now()

            for vat_item in vat_list:
                i, created = Invoice.objects.get_or_create(
                    order=order,
                    vat=vat_item['vat'],
                    price=vat_item['price'],
                    defaults={
                        'code' : vat_item['code'],
                        'payment_date' : payment_date,
                        'emit_date' : emit_date,
                    }
                )
                if not created:
                    if not payment_date or i.payment_date:
                        raise RuntimeError('Payment date mismatch')
                    else:
                        i.payment_date = payment_date
                        i.emit_date = emit_date
                        i.code = vat_item['code']
                        i.save()

                invoices.append(i)
            return invoices