Feature: Sale Analysis is working

Fix: Cashier Checkout multiple entries
This commit is contained in:
Amritanshu
2019-08-20 23:02:17 +05:30
parent c6b907061e
commit 70d31fea5e
35 changed files with 650 additions and 138 deletions

View File

@ -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")

View File

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

View File

@ -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,
}

View File

@ -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
]