コード例 #1
0
    def forms_valid(self, form, formset):
        user = self.request.user

        invoice = Invoice(
            recipient=user,
            status='new',
            compound=True,
            date=timezone.now(),
            invoiced_entity=form.cleaned_data['invoiced_entity'],
            billing_address=form.cleaned_data['billing_address'],
        )
        invoice.save()

        for i, form in enumerate(formset.forms):
            if not hasattr(form, 'invoice'):
                continue
            child_invoice = form.invoice
            InvoiceLine(
                invoice_id=invoice.id,
                line_order=i,
                reference='INV#{}'.format(child_invoice.reference_number),
                description='DebConf attendance for {}'.format(
                    child_invoice.recipient.userprofile.display_name()),
                unit_price=child_invoice.total,
                quantity=1,
            ).save()

        self.reference_number = invoice.reference_number
        return super().forms_valid(form, formset)
コード例 #2
0
def test_xml_generation(sample_invoice_xml):
    invoice = Invoice()

    invoice_xml = _xml_to_string(invoice.to_xml())
    sample_xml = _xml_to_string(sample_invoice_xml)

    assert invoice_xml == sample_xml
コード例 #3
0
ファイル: logic.py プロジェクト: Sparshsing/tnmclothing
def create_invoices(startDate, endDate):
    startdatetime = datetime(startDate.year, startDate.month, startDate.day)
    enddatetime = datetime(endDate.year, endDate.month, endDate.day)

    # because sql will check on 0:00 am on end date, if shipdate was 7pm on enddate, it will not be included
    enddatetime = enddatetime + timedelta(days=1)

    # startdatetime = datetime.combine(startDate, datetime.min.time())
    # enddatetime = datetime.combine(endDate, datetime.max.time())
    shipped_orders = Order.objects.filter(shipDate__range=(startdatetime, enddatetime)).filter(orderStatus="Shipped").order_by('orderNo')
    invoice_amounts = {}
    orderNoList = []

    if len(shipped_orders) == 0:
        logger.exception(
            ' admin or system tried generated invoice for ' + str(startDate) + ' to ' + str(endDate) + ', But no shipped order during these days.')
        return 0

    for order in shipped_orders:
        try:
            invoiceno = "SFMINV-" + startDate.strftime("%m%d") + "-" + endDate.strftime("%m%d") \
                        + "-" + order.store.storeCode
            if invoiceno not in list(invoice_amounts.keys()):
                print('adding invoice for store', order.storeName)

                # invoicenote = "invoice from SFM"
                # check if the invoice already exists, if so delete the invoice and create new
                Invoice.objects.filter(invoiceNo=invoiceno).delete()
                invoice = Invoice(startDate=startDate, endDate=endDate, storeName=order.storeName, store=order.store, invoiceNo=invoiceno,
                                  status="Unpaid", notes="", subTotal=0, discount=0, taxrate=0)
                invoice.save()
                invoice_amounts[invoiceno] = 0

            # print(order.saleDate)
            orderdate = order.saleDate if order.saleDate is not None else order.shipDate.date()
            invoice = Invoice.objects.get(invoiceNo=invoiceno)
            if order.customerPaidShipping is not None and order.customerPaidShipping > 0 and order.orderNo not in orderNoList:
                invoiceshipitem = InvoiceItems(invoice=invoice, shipDate=order.shipDate.date(), orderDate=orderdate,
                                               orderNo=order.orderNo, customer=order.recipientName, description='Shipping',
                                               amount=order.customerPaidShipping)
                invoiceshipitem.save()
                invoice_amounts[invoiceno] += order.customerPaidShipping
            orderNoList.append(order.orderNo)
            product = Product.objects.get(sfmId=order.sfmId)
            amt = product.price
            desc = order.sfmId + '-' + order.design
            invoiceitem = InvoiceItems(invoice=invoice, shipDate=order.shipDate.date(), orderDate=orderdate,
                                       orderNo=order.orderNo, customer=order.recipientName, description=desc,
                                       amount=amt)
            invoiceitem.save()
            invoice_amounts[invoiceno] += amt
        except Exception as err:
            print('error ----', str(err))
            logger.exception('Error in invoice ' + invoiceno + ', item for order ' + order.sfmId + ', Aborting... details: ' + str(err))
            raise Exception('Error generating invoice')


    logger.info(' admin or system generated invoice for ' + str(startDate) + ' to ' + str(endDate) + ' , count: ' + str(len(invoice_amounts)))
    updateInvoices(invoice_amounts)
    return len(invoice_amounts)
コード例 #4
0
 def generate_invoice(cls, character, ref, amount, message):
     # generate an invoice and return it
     due = timezone.now() + timedelta(days=14)
     return Invoice(character=character,
                    amount=round(amount, -6),
                    invoice_ref=ref,
                    note=message,
                    due_date=due)
コード例 #5
0
ファイル: import.py プロジェクト: kaloyanm/webinvi
    def save(self, invoice, invoice_items, company):

        with transaction.atomic():
            instance = Invoice(**invoice)
            instance.company = company
            print(instance.released_at)
            instance.save()

            for item in invoice_items:
                entry = InvoiceItem(**item)
                entry.invoice = instance
                entry.save()
コード例 #6
0
def verifyPayment(request):
    request_body = json.loads(request.body.decode('utf-8'))
    print(request_body)

    params = {}
    try:
        params['razorpay_payment_id'] = request_body['payment_id']
        params['razorpay_signature'] = request_body['signature']
    except KeyError:
        return Response({'message': 'Provide both payment_id and signature'})

    try:
        params['razorpay_order_id'] = orders[request.user.email]['id']
    except KeyError:
        return Response({'message': 'No order found for this user'})

    env = environ.Env(
        DEBUG=(bool, False)
    )
    environ.Env.read_env()
    RAZORPAY_ID = env('RAZORPAY_ID')
    RAZORPAY_SECRET_KEY = env('RAZORPAY_SECRET_KEY')
    client = razorpay.Client(auth=(RAZORPAY_ID, RAZORPAY_SECRET_KEY))

    result = 1
    try:
        client.utility.verify_payment_signature(params)
    except razorpay.errors.SignatureVerificationError:
        result = 0

    if result == 1:
        order = client.order.fetch(params['razorpay_order_id'])
        invoice = Invoice(type='bill', order_id=order['id'])
        invoice.save()

        payment = Payment(buyer=request.user, invoice=invoice, amount=order['amount'] / 100)
        payment.save()

        bill = Bill.objects.get(id=order['notes']['bill_id'])
        bill.is_paid = True
        bill.save()
        

    return Response({'success': result})
コード例 #7
0
ファイル: views.py プロジェクト: arianbessonart/vermis
def create(request):
	next_page = 'invoices/create.html'
	clients = Client.objects.all()
	if request.method == 'POST':
		client = Client.objects.get(pk=request.POST['input_client'])
		reference_name = request.POST['input_reference_name']
		reference_number = -1 if 'input_reference_number' not in request.POST or request.POST['input_reference_number'] == '' else request.POST.get('input_reference_number', -1)
		items_description = request.POST.getlist('input_description')
		items_price = request.POST.getlist('input_price')
		if len(items_description) == 0 or len(items_price) == 0:
			message = 'Debe especificar al menos un item'
			level = 'danger'
			return render(request,'invoices/create.html',{'message': message,'message_level':level})
		input_date = request.POST['input_date_created']
		if input_date == '':
			message = 'Debe especificar la fecha'
			level = 'danger'
			return render(request,'invoices/create.html',{'clients':clients,'message': message,'message_level':level})
		else:
			date_formated = datetime.datetime.strptime(input_date,'%d/%M/%Y').strftime('%Y-%M-%d')

		i = Invoice(
			sub_total = request.POST['input_subtotal'],
			iva = request.POST['input_iva'],
			total = request.POST['input_total'],
			date_created = date_formated,
			reference_number = reference_number,
			reference_name = reference_name,
			client = client
			)
		i.save()
		print items_description
		for index in xrange(0,len(items_description)):
			item = Item(description = items_description[index], price = items_price[index], invoice = i)
			item.save()

		return HttpResponseRedirect('/invoices/%s/'%i.id)
	else:
		selected_client = request.GET.get('client_id','')

	t = loader.get_template(next_page)
	c = RequestContext(request,{'clients':clients, 'selected_client':selected_client})
	return HttpResponse(t.render(c))
コード例 #8
0
def create_consumption_and_invoice(measurer, measure):
    with transaction.atomic():
        consumption_history = ConsumptionHistory.objects.create(
            from_date = measurer.last_visit,
            consumption = measurer.calculate_consumption(measure),
            measurer = measurer
        )
        measurer.register_visit(measure)
        invoice = Invoice(
            detail = consumption_history,
            client = measurer.house.familyboss,
            place = measurer.house
        )
        invoice.save()

    return {
        'consumption' : consumption_history.consumption,
        'amount' : invoice.amount,
        'house' : measurer.house.house_id
    }
コード例 #9
0
def load_invoice(request):
    variables = {}
    if request.POST:
        invoice = Invoice()
        detail_invoice = []
        xmlfile = request.FILES['xmlfile']
        tree = ET.parse(xmlfile)
        root = tree.getroot()
        emision = int(root.attrib['emision'])
        emision = datetime.utcfromtimestamp(emision).strftime('%Y-%m-%d')
        invoice.date = emision
        tipo = root.attrib['tipo']
        invoice.type = tipo
        folio = root.attrib['folio']
        invoice.folio = int(folio)
        rut_emisor = root[0].attrib['rut']
        invoice.issuing_rut = str(rut_emisor)
        nombre_emisor = root[0].attrib['razonSocial']
        invoice.issuing_name = nombre_emisor
        rut_receptor = root[1].attrib['rut']
        invoice.receiver_rut = str(rut_receptor)
        nombre_receptor = root[1].attrib['razonSocial']
        invoice.receiver_name = nombre_receptor
        detail = []
        for r in root[2]:
            dic = {
                'monto': r.attrib['monto'],
                'iva': r.attrib['iva'],
                'detalle': r.text
            }
            detail.append(dic)
        invoice.detail = str(detail)
        try:
            invoice.save()
            variables['mensaje'] = "guardado correctamente"
            print("se guardo")
        except:
            variables['mensaje'] = "error al guardar"
            print("no se guardo")

    return render(request, 'invoices/load_invoice.html', variables)
コード例 #10
0
def test_xml_header_generation(sender, client_address, sample_summary):
    invoice = Invoice(
        sender=sender,
        invoice_number="00001A",
        invoice_type="TD01",
        invoice_currency="EUR",
        invoice_summary=sample_summary,
        invoice_date=date(2019, 6, 16),
        transmission_format="FPR12",
        recipient_code="ABCDEFG",
        recipient_tax_code="AAABBB12B34Z123D",
        recipient_first_name="Patrick",
        recipient_last_name="A",
        recipient_address=client_address,
    )

    xml = invoice.to_xml()

    assert xml is not None

    header = xml.xpath(
        "/p:FatturaElettronica/FatturaElettronicaHeader",
        namespaces={
            "p":
            "http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2"
        },
    )[0]

    t_data = header.xpath("DatiTrasmissione")[0]

    assert t_data.xpath("IdTrasmittente/IdPaese")[0].text == "IT"
    assert t_data.xpath("IdTrasmittente/IdCodice")[0].text == "PIABCDE"
    assert t_data.xpath("ProgressivoInvio")[0].text == "00001A"
    assert t_data.xpath("FormatoTrasmissione")[0].text == "FPR12"
    # TODO: test PEC address
    assert t_data.xpath("CodiceDestinatario")[0].text == "ABCDEFG"

    # TODO: might need to add this to the invoice, in order to be able to
    # TODO: use different party for invoices (if ever needed)

    # Supplier data

    s_data = header.xpath("CedentePrestatore/DatiAnagrafici")[0]

    assert s_data.xpath("IdFiscaleIVA/IdPaese")[0].text == "IT"

    # TODO: add this to the model if it is the P. IVA
    # assert s_data.xpath("IdFiscaleIVA/IdCodice")[0].text == "IT"

    assert s_data.xpath("RegimeFiscale")[0].text == "RF01"
    assert (s_data.xpath("Anagrafica/Denominazione")[0].text ==
            "Python Italia APS")

    a_data = header.xpath("CedentePrestatore/Sede")[0]

    assert a_data.xpath("Indirizzo")[0].text == "Via Mugellese 1/A"
    assert a_data.xpath("CAP")[0].text == "50013"
    assert a_data.xpath("Comune")[0].text == "Campi Bisenzio"
    assert a_data.xpath("Provincia")[0].text == "FI"
    assert a_data.xpath("Nazione")[0].text == "IT"

    # Client data

    c_data = header.xpath("CessionarioCommittente/DatiAnagrafici")[0]

    assert c_data.xpath("CodiceFiscale")[0].text == "AAABBB12B34Z123D"
    assert c_data.xpath("Anagrafica/Nome")[0].text == "Patrick"
    assert c_data.xpath("Anagrafica/Cognome")[0].text == "A"

    ca_data = header.xpath("CessionarioCommittente/Sede")[0]

    assert ca_data.xpath("Indirizzo")[0].text == "Via Roma 1"
    assert ca_data.xpath("CAP")[0].text == "83100"
    assert ca_data.xpath("Comune")[0].text == "Avellino"
    assert ca_data.xpath("Provincia")[0].text == "AV"
    assert ca_data.xpath("Nazione")[0].text == "IT"
コード例 #11
0
def test_xml_body_generation(sender, client_address, sample_summary):
    invoice = Invoice(
        sender=sender,
        invoice_number="00001A",
        invoice_type="TD01",
        invoice_currency="EUR",
        invoice_date=date(2019, 6, 16),
        invoice_summary=sample_summary,
        invoice_tax_rate=22.00,
        invoice_amount=2.00,
        invoice_tax_amount=2.00,
        causal=("A" * 200 + "B" * 200),
        transmission_format="FPR12",
        recipient_code="ABCDEFG",
        recipient_tax_code="AAABBB12B34Z123D",
        recipient_first_name="Patrick",
        recipient_last_name="A",
        recipient_address=client_address,
    )

    xml = invoice.to_xml()

    assert xml is not None

    body = xml.xpath(
        "/p:FatturaElettronica/FatturaElettronicaBody",
        namespaces={
            "p":
            "http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2"
        },
    )[0]

    general_data = body.xpath("DatiGenerali/DatiGeneraliDocumento")[0]

    assert general_data.xpath("TipoDocumento")[0].text == "TD01"
    assert general_data.xpath("Data")[0].text == "2019-06-16"
    assert general_data.xpath("Divisa")[0].text == "EUR"
    assert general_data.xpath("Numero")[0].text == "00001A"

    # make sure the limit for the causal is respected (200 chars)
    assert len(general_data.xpath("Causale")) == 2
    assert general_data.xpath("Causale")[0].text == "A" * 200
    assert general_data.xpath("Causale")[1].text == "B" * 200

    # Invoice summary

    summary = body.xpath("DatiBeniServizi")[0]

    assert len(summary.xpath("DettaglioLinee")) == 2

    first_item = summary.xpath("DettaglioLinee")[0]
    second_item = summary.xpath("DettaglioLinee")[1]

    assert first_item.xpath("NumeroLinea")[0].text == "1"
    assert first_item.xpath("Descrizione")[0].text == "item 1"
    assert first_item.xpath("Quantita")[0].text == "1.00"
    assert first_item.xpath("PrezzoUnitario")[0].text == "1.00"
    assert first_item.xpath("PrezzoTotale")[0].text == "1.00"
    assert first_item.xpath("AliquotaIVA")[0].text == "0.00"

    assert second_item.xpath("NumeroLinea")[0].text == "2"
    assert second_item.xpath("Descrizione")[0].text == "item 2"
    assert second_item.xpath("Quantita")[0].text == "2.00"
    assert second_item.xpath("PrezzoUnitario")[0].text == "2.00"
    assert second_item.xpath("PrezzoTotale")[0].text == "2.00"
    assert second_item.xpath("AliquotaIVA")[0].text == "0.00"

    # TODO: this needs to be formatted to have two decimal places
    assert summary.xpath("DatiRiepilogo/AliquotaIVA")[0].text == "22.0"
    assert summary.xpath("DatiRiepilogo/ImponibileImporto")[0].text == "2.0"
    assert summary.xpath("DatiRiepilogo/Imposta")[0].text == "2.0"
コード例 #12
0
def invoice_user(user, force=False, save=False):
    from bursary.models import Bursary

    attendee = user.attendee

    try:
        bursary = user.bursary
    except Bursary.DoesNotExist:
        bursary = Bursary()

    lines = []
    fee_info = FEE_INVOICE_INFO.get(attendee.fee)
    if fee_info:
        fee_info['quantity'] = 1
        lines.append(InvoiceLine(**fee_info))

    try:
        accomm = attendee.accomm
    except ObjectDoesNotExist:
        accomm = None

    if accomm and not bursary.potential_bursary('accommodation'):
        for line in invoice_accomm(accomm):
            lines.append(InvoiceLine(**line))

    try:
        food = attendee.food
    except ObjectDoesNotExist:
        food = None

    if food and not bursary.potential_bursary('food'):
        for line in invoice_food(food):
            lines.append(InvoiceLine(**line))

    for paid_invoice in user.invoices.filter(status='paid', compound=False):
        lines.append(
            InvoiceLine(
                reference='INV#{}'.format(paid_invoice.reference_number),
                description='Previous Payment Received',
                unit_price=-paid_invoice.total,
                quantity=1,
            ))

    invoice = Invoice(recipient=user,
                      status='new',
                      date=timezone.now(),
                      invoiced_entity=attendee.invoiced_entity,
                      billing_address=attendee.billing_address)

    # Only save invoices if non empty
    if save and lines:
        invoice.save()

    total = 0
    for i, line in enumerate(lines):
        line.line_order = i
        total += line.total
        if save:
            line.invoice_id = invoice.id
            line.save()

    return {
        'invoice': invoice,
        'lines': lines,
        'total': total,
        'total_twd': total * TWD_EXCHANGE_RATE,
    }