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()
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