lingo: export transactions between 2 dates (#35988)
This commit is contained in:
parent
45fcb36131
commit
818ae481c7
|
@ -14,8 +14,11 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import datetime
|
||||
|
||||
|
||||
from django import forms
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from .models import Regie
|
||||
|
||||
|
@ -67,3 +70,20 @@ class RegieForm(forms.ModelForm):
|
|||
)
|
||||
instance.save()
|
||||
return instance
|
||||
|
||||
|
||||
class TransactionExportForm(forms.Form):
|
||||
start_date = forms.DateField(
|
||||
label=_('Start date'),
|
||||
widget=forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d')
|
||||
)
|
||||
end_date = forms.DateField(
|
||||
label=_('End date'),
|
||||
widget=forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d')
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(TransactionExportForm, self).__init__(*args, **kwargs)
|
||||
today = datetime.date.today()
|
||||
self.initial['start_date'] = today - datetime.timedelta(days=30)
|
||||
self.initial['end_date'] = today
|
||||
|
|
|
@ -24,10 +24,12 @@ from django.utils import six
|
|||
from django.utils.timezone import make_aware
|
||||
from django.views.generic import CreateView, UpdateView, ListView, DeleteView
|
||||
from django.http import HttpResponse
|
||||
from django.template.response import TemplateResponse
|
||||
|
||||
import eopayment
|
||||
|
||||
from .forms import RegieForm
|
||||
from .forms import TransactionExportForm
|
||||
from .models import PaymentBackend, Regie, Transaction
|
||||
|
||||
|
||||
|
@ -102,21 +104,33 @@ class TransactionListView(ListView):
|
|||
|
||||
|
||||
def download_transactions_csv(request):
|
||||
response = HttpResponse(content_type='text/csv')
|
||||
response['Content-Disposition'] = 'attachment; filename="transactions.csv"'
|
||||
writer = csv.writer(response)
|
||||
transactions = Transaction.objects.filter(
|
||||
status__in=(eopayment.PAID, eopayment.ACCEPTED)).order_by('-start_date')
|
||||
for transaction in transactions:
|
||||
row = [transaction.order_id,
|
||||
transaction.bank_transaction_id,
|
||||
transaction.start_date.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
transaction.get_user_name(),
|
||||
str(transaction.amount)]
|
||||
for item in transaction.items.all():
|
||||
row.extend([item.subject, str(item.amount)])
|
||||
if six.PY3:
|
||||
writer.writerow([x for x in row])
|
||||
else:
|
||||
writer.writerow([unicode(x).encode('utf-8') for x in row])
|
||||
return response
|
||||
if request.method == 'POST':
|
||||
form = TransactionExportForm(data=request.POST)
|
||||
if form.is_valid():
|
||||
response = HttpResponse(content_type='text/csv')
|
||||
response['Content-Disposition'] = 'attachment; filename="transactions.csv"'
|
||||
writer = csv.writer(response)
|
||||
transactions = (
|
||||
Transaction.objects
|
||||
.filter(
|
||||
status__in=(eopayment.PAID, eopayment.ACCEPTED),
|
||||
start_date__gte=form.cleaned_data['start_date'],
|
||||
start_date__lte=form.cleaned_data['end_date'],
|
||||
).order_by('-start_date'))
|
||||
for transaction in transactions:
|
||||
row = [transaction.order_id,
|
||||
transaction.bank_transaction_id,
|
||||
transaction.start_date.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
transaction.get_user_name(),
|
||||
str(transaction.amount)]
|
||||
for item in transaction.items.all():
|
||||
row.extend([item.subject, str(item.amount)])
|
||||
if six.PY3:
|
||||
writer.writerow([x for x in row])
|
||||
else:
|
||||
writer.writerow([unicode(x).encode('utf-8') for x in row])
|
||||
return response
|
||||
else:
|
||||
form = TransactionExportForm()
|
||||
|
||||
return TemplateResponse(request, 'lingo/transaction_export.html', {'form': form})
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
{% extends "combo/manager_base.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block appbar %}
|
||||
<h2>{% trans "download CSV" %}</h2>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<div class="buttons">
|
||||
<button class="submit-button">{% trans 'Download' %}</button>
|
||||
<a class="cancel" href="{% url 'lingo-manager-homepage' %}">{% trans 'Cancel' %}</a>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -6,7 +6,7 @@
|
|||
<span class="actions">
|
||||
<a href="{% url 'lingo-manager-paymentbackend-list' %}">{% trans 'Payment backends' %}</a>
|
||||
<a href="{% url 'lingo-manager-regie-list' %}">{% trans 'Regies' %}</a>
|
||||
<a href="{% url 'lingo-manager-transactions-download' %}">{% trans 'download CSV' %}</a>
|
||||
<a rel="popup" href="{% url 'lingo-manager-transactions-download' %}" data-autoclose-dialog="true">{% trans 'download CSV' %}</a>
|
||||
</span>
|
||||
{% endblock %}
|
||||
|
||||
|
|
|
@ -149,6 +149,7 @@ def test_add_second_regie(app, admin_user, payment_backend):
|
|||
assert Regie.objects.get(id=regie.id).is_default is True
|
||||
assert Regie.objects.exclude(id=regie.id)[0].is_default is False
|
||||
|
||||
|
||||
def test_download_transaction(app, admin_user, payment_backend):
|
||||
test_add_regie(app, admin_user, payment_backend)
|
||||
regie = Regie.objects.filter(slug='test')[0]
|
||||
|
@ -164,25 +165,43 @@ def test_download_transaction(app, admin_user, payment_backend):
|
|||
trans2 = Transaction.objects.create(regie=regie, remote_items='remote items omg', order_id='2', user=user,
|
||||
bank_transaction_id='136', status=eopayment.PAID)
|
||||
trans1.items.set([b_item])
|
||||
trans1.start_date = datetime.date(2019, 7, 29)
|
||||
trans1.save()
|
||||
trans2.items.set([b_item])
|
||||
trans2.start_date = datetime.date(2019, 10, 1)
|
||||
trans2.save()
|
||||
app = login(app)
|
||||
|
||||
resp = app.get('/manage/lingo/transactions/download-csv/', status=200)
|
||||
content = [i for i in [item.split(',') for item in resp.text.split('\r\n')]]
|
||||
for row in content[:-1]:
|
||||
if row[0] == '2':
|
||||
assert row[1] == trans2.bank_transaction_id
|
||||
assert row[3] == '%s %s' % (user.first_name, user.last_name)
|
||||
assert Decimal(row[4]) == Decimal(trans2.amount)
|
||||
assert row[5] == b_item.subject
|
||||
assert Decimal(row[6]) == b_item.amount
|
||||
else:
|
||||
assert row[1] == trans1.bank_transaction_id
|
||||
assert row[3] == '%s %s' % (user.first_name, user.last_name)
|
||||
assert Decimal(row[4]) == Decimal(trans1.amount)
|
||||
assert row[5] == b_item.subject
|
||||
assert Decimal(row[6]) == b_item.amount
|
||||
resp.forms[0]['start_date'] = datetime.date(2019, 10, 1)
|
||||
resp.forms[0]['end_date'] = datetime.date(2019, 11, 1)
|
||||
resp = resp.forms[0].submit()
|
||||
content = [i for i in [item.split(',') for item in resp.text.split('\r\n')] if len(i) > 1]
|
||||
assert len(content) == 1
|
||||
row = content[0]
|
||||
assert row[0] == '2'
|
||||
assert row[1] == trans2.bank_transaction_id
|
||||
assert row[3] == '%s %s' % (user.first_name, user.last_name)
|
||||
assert Decimal(row[4]) == Decimal(trans2.amount)
|
||||
assert row[5] == b_item.subject
|
||||
assert Decimal(row[6]) == b_item.amount
|
||||
|
||||
resp = app.get('/manage/lingo/transactions/download-csv/', status=200)
|
||||
resp.forms[0]['start_date'] = datetime.date(2019, 7, 1)
|
||||
resp.forms[0]['end_date'] = datetime.date(2019, 11, 1)
|
||||
resp = resp.forms[0].submit()
|
||||
content = [i for i in [item.split(',') for item in resp.text.split('\r\n')] if len(i) > 1]
|
||||
assert len(content) == 2
|
||||
row = content[0]
|
||||
assert row[0] == '2'
|
||||
row = content[1]
|
||||
assert row[0] == '1'
|
||||
assert row[1] == trans1.bank_transaction_id
|
||||
assert row[3] == '%s %s' % (user.first_name, user.last_name)
|
||||
assert Decimal(row[4]) == Decimal(trans1.amount)
|
||||
assert row[5] == b_item.subject
|
||||
assert Decimal(row[6]) == b_item.amount
|
||||
|
||||
|
||||
def test_transactions_search(app, admin_user):
|
||||
for i in range(50):
|
||||
|
|
Loading…
Reference in New Issue