Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Auto increament the invoice number in django backend for new invoice

I want to auto increament the invoice number which is 3 digits char and 4 digits number.

class Invoice:
    invoice_no = models.CharField(max_length=500, null=True, blank=True, validators=[RegexValidator(regex='^[a-zA-Z0-9]*$',message='Invoice must be Alphanumeric',code='invalid_invoice number'),])

I register this model in backend. But now when i click on create invoice in admin the invoice should be auto filled. When i again click on create new invoice in admin, the invoice_number should be incremented by one and should be auto field.

Ex for Invoice number MAG0001, MAG0002, MAG0003 etc and this should be auto field in admin when i click on create new invoice.

like image 739
Wagh Avatar asked Jan 28 '15 17:01

Wagh


2 Answers

Define a function to generate invoice number.

def increment_invoice_number():
    last_invoice = Invoice.objects.all().order_by('id').last()
    if not last_invoice:
         return 'MAG0001'
    invoice_no = last_invoice.invoice_no
    invoice_int = int(invoice_no.split('MAG')[-1])
    new_invoice_int = invoice_int + 1
    new_invoice_no = 'MAG' + str(new_invoice_int)
    return new_invoice_no

Now use this function as default value in your model filed.

invoice_no = models.CharField(max_length=500, default=increment_invoice_number, null=True, blank=True)

This is just an idea. Modify the function to match your preferred invoice number format.

like image 118
arulmr Avatar answered Sep 21 '22 09:09

arulmr


def invoiceIncrement():
    get_last_invoice_number
    incremente_last_invoice_number
    return next_invoice_number

class Invoice:
    invoice_no = models.CharField(max_length=500, null=True, blank=True, 
        validators=[RegexValidator(regex='^[a-zA-Z0-9]*$',
        message='Invoice must be Alphanumeric',code='invalid_invoice number'),], 
        default=invoiceIncrement)

Try this: there are some obvious issues:

  1. if more than one person adds an invoice at the same time, could have collision

  2. will need to make an extra db call each time you create a new invoice.

Also: you may want to just consider using either an auto_increment or UUID.

like image 20
warath-coder Avatar answered Sep 20 '22 09:09

warath-coder