Feature: Sale Analysis is working
Fix: Cashier Checkout multiple entries
This commit is contained in:
@ -357,6 +357,11 @@ def includeme(config):
|
||||
config.add_route("v1_checkout_id", "/v1/checkout/{id}")
|
||||
config.add_route("v1_checkout_blank", "/v1/checkout")
|
||||
|
||||
config.add_route("v1_sa_sale", "/v1/sale-analysis/sale")
|
||||
config.add_route("v1_sa_settlements", "/v1_sale-analysis/settlements")
|
||||
config.add_route("v1_sa_tax", "/v1_sale-analysis/tax")
|
||||
config.add_route("v1_sale_analysis", "/v1/sale-analysis")
|
||||
|
||||
# Done till here
|
||||
|
||||
config.add_route("customer", "/Customer.json")
|
||||
@ -388,10 +393,6 @@ def includeme(config):
|
||||
config.add_route("setting_list", "/Settings.json")
|
||||
config.add_route("setting_id", "/Setting/{id}.json")
|
||||
|
||||
config.add_route("sa_sale", "/SaleAnalysis/Sale.json")
|
||||
config.add_route("sa_settlements", "/SaleAnalysis/Settlements.json")
|
||||
config.add_route("sa_tax", "/SaleAnalysis/Tax.json")
|
||||
|
||||
config.add_route("voucher_reprint", "/ReprintVoucher/{id}.json")
|
||||
|
||||
config.add_route("api_lock_info", "/api/LockInfo")
|
||||
|
||||
@ -1 +1,17 @@
|
||||
__author__ = 'tanshu'
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
__author__ = "tanshu"
|
||||
|
||||
|
||||
def get_start_date(s):
|
||||
if not s:
|
||||
return datetime.today().replace(hour=7)
|
||||
else:
|
||||
return datetime.strptime(s, "%d-%b-%Y").replace(hour=7)
|
||||
|
||||
|
||||
def get_finish_date(f):
|
||||
if not f:
|
||||
return datetime.today().replace(hour=7) + timedelta(days=1)
|
||||
else:
|
||||
return datetime.strptime(f, "%d-%b-%Y").replace(hour=7) + timedelta(days=1)
|
||||
|
||||
@ -5,6 +5,8 @@ from barker.models import Voucher, User, Settlement
|
||||
from pyramid.view import view_config
|
||||
from sqlalchemy.orm import joinedload
|
||||
|
||||
from barker.views.reports import get_start_date, get_finish_date
|
||||
|
||||
__author__ = "tanshu"
|
||||
|
||||
|
||||
@ -12,20 +14,11 @@ __author__ = "tanshu"
|
||||
request_method="GET",
|
||||
route_name="v1_active_cashiers",
|
||||
renderer="json",
|
||||
permission="Cashier Checkout"
|
||||
permission="Cashier Checkout",
|
||||
)
|
||||
def active_cashiers(request):
|
||||
start_date = request.GET.get("s", None)
|
||||
if not start_date:
|
||||
start_date = datetime.today().replace(hour=7, minute=0)
|
||||
else:
|
||||
start_date = datetime.strptime(start_date, "%d-%b-%Y").replace(hour=7, minute=0)
|
||||
|
||||
finish_date = request.GET.get("f", None)
|
||||
if not finish_date:
|
||||
finish_date = datetime.today().replace(hour=7, minute=0) + timedelta(days=1)
|
||||
else:
|
||||
finish_date = datetime.strptime(finish_date, "%d-%b-%Y").replace(hour=7, minute=0) + timedelta(days=1)
|
||||
start_date = get_start_date(request.GET.get("s", None))
|
||||
finish_date = get_finish_date(request.GET.get("f", None))
|
||||
|
||||
user_ids = (
|
||||
request.dbsession.query(Voucher.user_id)
|
||||
@ -47,15 +40,15 @@ def active_cashiers(request):
|
||||
request_method="GET",
|
||||
route_name="v1_checkout_blank",
|
||||
renderer="json",
|
||||
permission="Cashier Checkout"
|
||||
permission="Cashier Checkout",
|
||||
)
|
||||
def blank_out(request):
|
||||
return {
|
||||
"startDate": datetime.today().strftime("%d-%b-%Y"),
|
||||
"finishDate": datetime.today().strftime("%d-%b-%Y"),
|
||||
"user": {"id": ''},
|
||||
"user": {"id": ""},
|
||||
"amounts": [],
|
||||
"info": []
|
||||
"info": [],
|
||||
}
|
||||
|
||||
|
||||
@ -68,8 +61,8 @@ def blank_out(request):
|
||||
)
|
||||
def check_me_out(request):
|
||||
id_ = uuid.UUID(request.matchdict["id"])
|
||||
start_date = datetime.strptime(request.GET["s"], "%d-%b-%Y").replace(hour=7, minute=0)
|
||||
finish_date = datetime.strptime(request.GET["f"], "%d-%b-%Y").replace(hour=7, minute=0) + timedelta(days=1)
|
||||
start_date = get_start_date(request.GET.get("s", None))
|
||||
finish_date = get_finish_date(request.GET.get("f", None))
|
||||
|
||||
vouchers = (
|
||||
request.dbsession.query(Voucher)
|
||||
@ -105,8 +98,9 @@ def check_me_out(request):
|
||||
)
|
||||
amounts[so.settle_option.name] += so.amount
|
||||
return {
|
||||
"startDate": request.GET["s"],
|
||||
"finishDate": request.GET["f"],
|
||||
"startDate": start_date.date().strftime("%d-%b-%Y"),
|
||||
"finishDate": (finish_date - timedelta(days=1)).date().strftime("%d-%b-%Y"),
|
||||
"user": {"id": id_},
|
||||
"amounts": [{'name': key, 'amount': value} for key, value in amounts.items()], "info": info
|
||||
"amounts": [{"name": key, "amount": value} for key, value in amounts.items()],
|
||||
"info": info,
|
||||
}
|
||||
|
||||
@ -1,106 +1,195 @@
|
||||
import datetime
|
||||
|
||||
from pyramid.httpexceptions import HTTPForbidden
|
||||
from datetime import datetime, timedelta
|
||||
from pyramid.view import view_config
|
||||
from sqlalchemy import func
|
||||
|
||||
from barker.models import Inventory, Kot, Product, MenuCategory, Settlement, SettleOption, Tax, Voucher
|
||||
import datetime
|
||||
|
||||
from pyramid.httpexceptions import HTTPForbidden
|
||||
from pyramid.view import view_config
|
||||
from sqlalchemy import func
|
||||
|
||||
from barker.models import Inventory, Kot, Product, MenuCategory, Settlement, SettleOption, Tax, Voucher
|
||||
from barker.models import (
|
||||
Inventory,
|
||||
Kot,
|
||||
Product,
|
||||
Settlement,
|
||||
SettleOption,
|
||||
Tax,
|
||||
Voucher,
|
||||
SaleCategory,
|
||||
VoucherType,
|
||||
)
|
||||
from barker.models.validation_exception import ValidationError
|
||||
from barker.views.reports import get_start_date, get_finish_date
|
||||
|
||||
|
||||
@view_config(request_method='GET', route_name='sa_sale', renderer='json', permission='Sales Analysis',
|
||||
request_param=('s', 'f'))
|
||||
def get_sale(request):
|
||||
start_date = datetime.datetime.strptime(request.GET['s'], '%d-%b-%Y %H:%M')
|
||||
finish_date = datetime.datetime.strptime(request.GET['f'], '%d-%b-%Y %H:%M')
|
||||
@view_config(
|
||||
request_method="GET",
|
||||
route_name="v1_sale_analysis",
|
||||
renderer="json",
|
||||
permission="Sales Analysis",
|
||||
)
|
||||
def get_sale_analysis(request):
|
||||
start_date = get_start_date(request.GET.get("s", None))
|
||||
finish_date = get_finish_date(request.GET.get("f", None))
|
||||
|
||||
if (datetime.date.today() - start_date.date()).days > 5 and 'Accounts Audit' not in request.effective_principals:
|
||||
raise HTTPForbidden("Accounts Audit")
|
||||
if (
|
||||
datetime.today() - start_date.replace(hour=0)
|
||||
).days > 5 and "Accounts Audit" not in request.effective_principals:
|
||||
raise ValidationError("Accounts Audit")
|
||||
|
||||
amount = func.sum(Inventory.quantity * Inventory.effective_price * (1 - Inventory.discount)).label('Amount')
|
||||
list = request.dbsession.query(
|
||||
MenuCategory.group_type, amount
|
||||
).join(Voucher.kots).join(Kot.inventories).join(Inventory.product).join(Product.menu_category).filter(
|
||||
Voucher.date >= start_date,
|
||||
Voucher.date <= finish_date,
|
||||
Voucher.is_void == False,
|
||||
Voucher.settlements.any(~Settlement.settled.in_([1, 4, 7, 8, 9, 10]))
|
||||
).group_by(
|
||||
MenuCategory.group_type
|
||||
).order_by(
|
||||
MenuCategory.group_type
|
||||
).all()
|
||||
return {
|
||||
"startDate": start_date.date().strftime("%d-%b-%Y"),
|
||||
"finishDate": (finish_date - timedelta(days=1)).date().strftime("%d-%b-%Y"),
|
||||
"amounts": (
|
||||
get_sale(start_date, finish_date, request.dbsession)
|
||||
+ [{"name": "--", "amount": 0}]
|
||||
+ get_settlements(start_date, finish_date, request.dbsession)
|
||||
+ [{"name": "--", "amount": 0}]
|
||||
+ get_tax(start_date, finish_date, request.dbsession)
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
@view_config(
|
||||
request_method="GET",
|
||||
route_name="v1_sa_sale",
|
||||
renderer="json",
|
||||
permission="Sales Analysis",
|
||||
)
|
||||
def get_sale_view(request):
|
||||
start_date = get_start_date(request.GET.get("s", None))
|
||||
finish_date = get_finish_date(request.GET.get("f", None))
|
||||
|
||||
if (
|
||||
datetime.today() - start_date.replace(hour=0)
|
||||
).days > 5 and "Accounts Audit" not in request.effective_principals:
|
||||
raise ValidationError("Accounts Audit")
|
||||
|
||||
return {
|
||||
"startDate": start_date.date().strftime("%d-%b-%Y"),
|
||||
"finishDate": (finish_date - timedelta(days=1)).date().strftime("%d-%b-%Y"),
|
||||
"amounts": get_sale(start_date, finish_date, request.dbsession),
|
||||
}
|
||||
|
||||
|
||||
def get_sale(start_date, finish_date, dbsession):
|
||||
list_ = (
|
||||
dbsession.query(SaleCategory.name, func.sum(Inventory.net))
|
||||
.join(Inventory.kot)
|
||||
.join(Kot.voucher)
|
||||
.join(Inventory.product)
|
||||
.join(Product.sale_category)
|
||||
.filter(
|
||||
Voucher.date >= start_date,
|
||||
Voucher.date <= finish_date,
|
||||
Voucher.voucher_type == VoucherType.REGULAR_BILL.value,
|
||||
)
|
||||
.group_by(SaleCategory.name)
|
||||
.order_by(SaleCategory.name)
|
||||
.all()
|
||||
)
|
||||
total = 0
|
||||
info = []
|
||||
for gt, am in list:
|
||||
for gt, am in list_:
|
||||
total += am
|
||||
info.append({'GroupType': gt, 'Amount': am})
|
||||
return info + [{'GroupType': 'Total Settled', 'Amount': total}]
|
||||
info.append({"name": gt, "amount": am})
|
||||
return info + [{"name": "Total Settled", "amount": total}]
|
||||
|
||||
|
||||
@view_config(request_method='GET', route_name='sa_settlements', renderer='json', permission='Sales Analysis',
|
||||
request_param=('s', 'f'))
|
||||
def get_settlements(request):
|
||||
start_date = datetime.datetime.strptime(request.GET['s'], '%d-%b-%Y %H:%M')
|
||||
finish_date = datetime.datetime.strptime(request.GET['f'], '%d-%b-%Y %H:%M')
|
||||
@view_config(
|
||||
request_method="GET",
|
||||
route_name="v1_sa_settlements",
|
||||
renderer="json",
|
||||
permission="Sales Analysis",
|
||||
)
|
||||
def get_settlements_view(request):
|
||||
start_date = get_start_date(request.GET.get("s", None))
|
||||
finish_date = get_finish_date(request.GET.get("f", None))
|
||||
|
||||
if (datetime.date.today() - start_date.date()).days > 5 and 'Accounts Audit' not in request.effective_principals:
|
||||
raise HTTPForbidden("Accounts Audit")
|
||||
if (
|
||||
datetime.today() - start_date.replace(hour=0)
|
||||
).days > 5 and "Accounts Audit" not in request.effective_principals:
|
||||
raise ValidationError("Accounts Audit")
|
||||
|
||||
list = request.dbsession.query(
|
||||
SettleOption.name, func.sum(Settlement.amount)
|
||||
).join(Voucher.settlements).join(Settlement.settle_option).filter(
|
||||
Voucher.date >= start_date,
|
||||
Voucher.date <= finish_date,
|
||||
Voucher.is_void == False
|
||||
).group_by(
|
||||
SettleOption.name
|
||||
).order_by(
|
||||
SettleOption.name
|
||||
).all()
|
||||
return {
|
||||
"startDate": start_date.date().strftime("%d-%b-%Y"),
|
||||
"finishDate": (finish_date - timedelta(days=1)).date().strftime("%d-%b-%Y"),
|
||||
"amounts": get_settlements(start_date, finish_date, request.dbsession),
|
||||
}
|
||||
|
||||
|
||||
def get_settlements(start_date, finish_date, dbsession):
|
||||
list_ = (
|
||||
dbsession.query(SettleOption.name, func.sum(Settlement.amount))
|
||||
.join(Voucher.settlements)
|
||||
.join(Settlement.settle_option)
|
||||
.filter(Voucher.date >= start_date, Voucher.date <= finish_date)
|
||||
.group_by(SettleOption.name)
|
||||
.order_by(SettleOption.name)
|
||||
.all()
|
||||
)
|
||||
total = 0
|
||||
info = []
|
||||
for gt, am in list:
|
||||
for gt, am in list_:
|
||||
total += am
|
||||
info.append({'GroupType': gt, 'Amount': am})
|
||||
return info + [{'GroupType': 'Total', 'Amount': total}]
|
||||
info.append({"name": gt, "amount": am})
|
||||
return info + [{"name": "Total", "amount": total}]
|
||||
|
||||
|
||||
@view_config(request_method='GET', route_name='sa_tax', renderer='json', permission=('Tax Analysis', 'Sales Analysis'),
|
||||
request_param=('s', 'f'))
|
||||
def get_tax(request):
|
||||
start_date = datetime.datetime.strptime(request.GET['s'], '%d-%b-%Y %H:%M')
|
||||
finish_date = datetime.datetime.strptime(request.GET['f'], '%d-%b-%Y %H:%M')
|
||||
@view_config(
|
||||
request_method="GET",
|
||||
route_name="v1_sa_tax",
|
||||
renderer="json",
|
||||
permission=("Tax Analysis", "Sales Analysis"),
|
||||
)
|
||||
def get_tax_view(request):
|
||||
start_date = request.GET.get("s", None)
|
||||
if not start_date:
|
||||
start_date = datetime.today().replace(hour=7, minute=0)
|
||||
else:
|
||||
start_date = datetime.strptime(start_date, "%d-%b-%Y").replace(hour=7, minute=0)
|
||||
|
||||
if (datetime.date.today() - start_date.date()).days > 5 and 'Accounts Audit' not in request.effective_principals:
|
||||
raise HTTPForbidden("Accounts Audit")
|
||||
finish_date = request.GET.get("f", None)
|
||||
if not finish_date:
|
||||
finish_date = datetime.today().replace(hour=7, minute=0) + timedelta(days=1)
|
||||
else:
|
||||
finish_date = datetime.strptime(finish_date, "%d-%b-%Y").replace(
|
||||
hour=7, minute=0
|
||||
) + timedelta(days=1)
|
||||
|
||||
amounts = request.dbsession.query(
|
||||
Tax.name,
|
||||
Inventory.tax_rate,
|
||||
func.coalesce(func.sum(Inventory.net_taxable), 0),
|
||||
func.coalesce(func.sum(Inventory.tax_amount), 0)
|
||||
).join(Voucher.kots).join(Kot.inventories).join(Inventory.tax).filter(
|
||||
Voucher.date >= start_date,
|
||||
Voucher.date <= finish_date,
|
||||
Voucher.is_void == False,
|
||||
Voucher.settlements.any(~Settlement.settled.in_([1, 4, 7, 8, 9, 10]))
|
||||
).group_by(
|
||||
Tax.name,
|
||||
Inventory.tax_rate
|
||||
).order_by(
|
||||
Tax.name,
|
||||
Inventory.tax_rate
|
||||
).all()
|
||||
return [{
|
||||
'Name': "{0} - {1:.2%}".format(i[0], i[1]),
|
||||
'TaxRate': i[1],
|
||||
'NetSale': i[2],
|
||||
'TaxAmount': i[3]
|
||||
} for i in amounts]
|
||||
if (
|
||||
datetime.date().today() - start_date.date()
|
||||
).days > 5 and "Accounts Audit" not in request.effective_principals:
|
||||
raise ValidationError("Accounts Audit")
|
||||
|
||||
return {
|
||||
"startDate": start_date.date().strftime("%d-%b-%Y"),
|
||||
"finishDate": (finish_date - timedelta(days=1)).date().strftime("%d-%b-%Y"),
|
||||
"amounts": get_settlements(start_date, finish_date, request.dbsession),
|
||||
}
|
||||
|
||||
|
||||
def get_tax(start_date, finish_date, dbsession):
|
||||
amounts = (
|
||||
dbsession.query(
|
||||
Tax.name,
|
||||
Inventory.tax_rate,
|
||||
func.coalesce(func.sum(Inventory.net), 0),
|
||||
func.coalesce(func.sum(Inventory.tax_amount), 0),
|
||||
)
|
||||
.join(Voucher.kots)
|
||||
.join(Kot.inventories)
|
||||
.join(Inventory.tax)
|
||||
.filter(
|
||||
Voucher.date >= start_date,
|
||||
Voucher.date <= finish_date,
|
||||
Voucher.voucher_type == VoucherType.REGULAR_BILL.value,
|
||||
)
|
||||
.group_by(Tax.name, Inventory.tax_rate)
|
||||
.order_by(Tax.name, Inventory.tax_rate)
|
||||
.all()
|
||||
)
|
||||
return [
|
||||
{
|
||||
"name": "{0} - {1:.2%}".format(i[0], i[1]),
|
||||
"taxRate": i[1],
|
||||
"netSale": i[2],
|
||||
"amount": i[3],
|
||||
}
|
||||
for i in amounts
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user