Feature: Batch is not allowed to be issued to a previous date. Only exception is if purchase is made in a new date, product issued and then the purchase is moved to an old date. Will fix that in future commit.
This commit is contained in:
parent
414a1717a5
commit
f8bdf9d731
|
@ -240,10 +240,12 @@ class Batch(Base):
|
||||||
return self.quantity_remaining * self.rate * (1 + self.tax) * (1 - self.discount)
|
return self.quantity_remaining * self.rate * (1 + self.tax) * (1 - self.discount)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def list(cls, name, include_nil):
|
def list(cls, name, include_nil, date):
|
||||||
query = DBSession.query(Batch).join(Batch.product)
|
query = DBSession.query(Batch).join(Batch.product)
|
||||||
if not include_nil:
|
if not include_nil:
|
||||||
query = query.filter(cls.quantity_remaining > 0)
|
query = query.filter(cls.quantity_remaining > 0)
|
||||||
|
if date is not None:
|
||||||
|
query = query.filter(cls.name <= date)
|
||||||
for item in name.split():
|
for item in name.split():
|
||||||
query = query.filter(Product.name.ilike('%' + item + '%'))
|
query = query.filter(Product.name.ilike('%' + item + '%'))
|
||||||
return query.order_by(Product.name).order_by(cls.name).all()
|
return query.order_by(Product.name).order_by(cls.name).all()
|
||||||
|
|
|
@ -225,12 +225,18 @@ var IssueCtrl = ['$scope', '$routeParams', '$location', '$q', 'dateFilter', 'vou
|
||||||
|
|
||||||
$scope.batches = function ($viewValue) {
|
$scope.batches = function ($viewValue) {
|
||||||
var deferred = $q.defer();
|
var deferred = $q.defer();
|
||||||
Batch.autocomplete({term: $viewValue, count: 20}, function (result) {
|
var params = {term: $viewValue, count: 20};
|
||||||
|
if (angular.isDate($scope.voucher.Date)) {
|
||||||
|
params.date = dateFilter($scope.voucher.Date, 'dd-MMM-yyyy');
|
||||||
|
} else {
|
||||||
|
params.date = $scope.voucher.Date;
|
||||||
|
}
|
||||||
|
Batch.autocomplete(params, function (result) {
|
||||||
deferred.resolve(result);
|
deferred.resolve(result);
|
||||||
});
|
});
|
||||||
return deferred.promise;
|
return deferred.promise;
|
||||||
}
|
};
|
||||||
}]
|
}];
|
||||||
|
|
||||||
IssueCtrl.resolve = {
|
IssueCtrl.resolve = {
|
||||||
voucher: ['$q', '$route', 'Voucher', function ($q, $route, Voucher) {
|
voucher: ['$q', '$route', 'Voucher', function ($q, $route, Voucher) {
|
||||||
|
|
|
@ -163,15 +163,21 @@ var PurchaseReturnCtrl = ['$scope', '$location', '$q', 'dateFilter', '$modal', '
|
||||||
deferred.resolve(result);
|
deferred.resolve(result);
|
||||||
});
|
});
|
||||||
return deferred.promise;
|
return deferred.promise;
|
||||||
}
|
};
|
||||||
$scope.batches = function ($viewValue) {
|
$scope.batches = function ($viewValue) {
|
||||||
var deferred = $q.defer();
|
var deferred = $q.defer();
|
||||||
Batch.autocomplete({term: $viewValue, count: 20}, function (result) {
|
var params = {term: $viewValue, count: 20};
|
||||||
|
if (angular.isDate($scope.voucher.Date)) {
|
||||||
|
params.date = dateFilter($scope.voucher.Date, 'dd-MMM-yyyy');
|
||||||
|
} else {
|
||||||
|
params.date = $scope.voucher.Date;
|
||||||
|
}
|
||||||
|
Batch.autocomplete(params, function (result) {
|
||||||
deferred.resolve(result);
|
deferred.resolve(result);
|
||||||
});
|
});
|
||||||
return deferred.promise;
|
return deferred.promise;
|
||||||
}
|
};
|
||||||
}]
|
}];
|
||||||
|
|
||||||
PurchaseReturnCtrl.resolve = {
|
PurchaseReturnCtrl.resolve = {
|
||||||
voucher: ['$q', '$route', 'Voucher', function ($q, $route, Voucher) {
|
voucher: ['$q', '$route', 'Voucher', function ($q, $route, Voucher) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import datetime
|
||||||
from pyramid.view import view_config
|
from pyramid.view import view_config
|
||||||
from brewman.models.voucher import Batch
|
from brewman.models.voucher import Batch
|
||||||
|
|
||||||
|
@ -8,8 +9,10 @@ def batch_term(request):
|
||||||
filter = filter if filter is not None and filter is not '' else None
|
filter = filter if filter is not None and filter is not '' else None
|
||||||
count = request.GET.get('count', None)
|
count = request.GET.get('count', None)
|
||||||
count = None if count is None or count == '' else int(count)
|
count = None if count is None or count == '' else int(count)
|
||||||
|
date = request.GET.get('date', None)
|
||||||
|
date = None if count is None or count == '' else datetime.datetime.strptime(date, '%d-%b-%Y')
|
||||||
list = []
|
list = []
|
||||||
for index, item in enumerate(Batch.list(filter, include_nil=False)):
|
for index, item in enumerate(Batch.list(filter, include_nil=False, date=date)):
|
||||||
text = "{0} ({1}) {2:.2f}@{3:.2f} from {4}".format(item.product.name, item.product.units,
|
text = "{0} ({1}) {2:.2f}@{3:.2f} from {4}".format(item.product.name, item.product.units,
|
||||||
item.quantity_remaining, item.rate, item.name.strftime('%d-%b-%Y'))
|
item.quantity_remaining, item.rate, item.name.strftime('%d-%b-%Y'))
|
||||||
list.append({'BatchID': item.id, 'Name': text, 'QuantityRemaining': item.quantity_remaining,
|
list.append({'BatchID': item.id, 'Name': text, 'QuantityRemaining': item.quantity_remaining,
|
||||||
|
|
|
@ -41,7 +41,8 @@ def issue_create_inventory(voucher, item, batch_consumed):
|
||||||
raise ValidationError("Quantity of {0} cannot be zero".format(item.product.name))
|
raise ValidationError("Quantity of {0} cannot be zero".format(item.product.name))
|
||||||
if batch_consumed == True and quantity > batch.quantity_remaining:
|
if batch_consumed == True and quantity > batch.quantity_remaining:
|
||||||
raise ValidationError("Quantity available is {0} only".format(batch.quantity_remaining))
|
raise ValidationError("Quantity available is {0} only".format(batch.quantity_remaining))
|
||||||
|
if batch.name < voucher.date:
|
||||||
|
raise ValidationError("Batch of {0} was purchased after the issue date".format(item.product.name))
|
||||||
if batch_consumed is None:
|
if batch_consumed is None:
|
||||||
pass
|
pass
|
||||||
elif batch_consumed:
|
elif batch_consumed:
|
||||||
|
@ -116,6 +117,8 @@ def issue_update_inventory(voucher, newInventories, batch_consumed):
|
||||||
if batch_consumed == True and new_quantity - old_quantity > quantity_remaining:
|
if batch_consumed == True and new_quantity - old_quantity > quantity_remaining:
|
||||||
raise ValidationError("Maximum quantity available for {0} is {1}".format(item.product.full_name,
|
raise ValidationError("Maximum quantity available for {0} is {1}".format(item.product.full_name,
|
||||||
old_quantity + quantity_remaining))
|
old_quantity + quantity_remaining))
|
||||||
|
if item.batch.name < voucher.date:
|
||||||
|
raise ValidationError("Batch of {0} was purchased after the issue date".format(item.product.name))
|
||||||
|
|
||||||
if batch_consumed is None:
|
if batch_consumed is None:
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -10,6 +10,7 @@ from brewman.models.voucher import Voucher, VoucherType, Batch, Inventory, Journ
|
||||||
|
|
||||||
__author__ = 'tanshu'
|
__author__ = 'tanshu'
|
||||||
|
|
||||||
|
|
||||||
def purchase_create_voucher(json, user):
|
def purchase_create_voucher(json, user):
|
||||||
dt = datetime.datetime.strptime(json['Date'], '%d-%b-%Y')
|
dt = datetime.datetime.strptime(json['Date'], '%d-%b-%Y')
|
||||||
voucher = Voucher(date=dt, narration=json['Narration'], user_id=user.id, type=VoucherType.by_name(json['Type']))
|
voucher = Voucher(date=dt, narration=json['Narration'], user_id=user.id, type=VoucherType.by_name(json['Type']))
|
||||||
|
@ -37,16 +38,15 @@ def purchase_create_inventory(voucher, item, date):
|
||||||
tax = round(Decimal(item['Tax']), 5)
|
tax = round(Decimal(item['Tax']), 5)
|
||||||
discount = round(Decimal(item['Discount']), 5)
|
discount = round(Decimal(item['Discount']), 5)
|
||||||
batch = Batch(name=date, product_id=product.id, quantity_remaining=quantity, rate=rate, tax=tax,
|
batch = Batch(name=date, product_id=product.id, quantity_remaining=quantity, rate=rate, tax=tax,
|
||||||
discount=discount)
|
discount=discount)
|
||||||
DBSession.add(batch)
|
DBSession.add(batch)
|
||||||
inventory = Inventory(id=inventory_id, product_id=product.id, batch=batch, quantity=quantity, rate=rate, tax=tax,
|
inventory = Inventory(id=inventory_id, product_id=product.id, batch=batch, quantity=quantity, rate=rate, tax=tax,
|
||||||
discount=discount)
|
discount=discount)
|
||||||
product.price = rate
|
product.price = rate
|
||||||
voucher.inventories.append(inventory)
|
voucher.inventories.append(inventory)
|
||||||
DBSession.add(inventory)
|
DBSession.add(inventory)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def purchase_create_journals(inventories, ledgerID):
|
def purchase_create_journals(inventories, ledgerID):
|
||||||
otherLedger = LedgerBase.by_id(uuid.UUID(ledgerID))
|
otherLedger = LedgerBase.by_id(uuid.UUID(ledgerID))
|
||||||
journals = dict()
|
journals = dict()
|
||||||
|
@ -59,9 +59,9 @@ def purchase_create_journals(inventories, ledgerID):
|
||||||
journals[ledger.id].amount += item_amount
|
journals[ledger.id].amount += item_amount
|
||||||
else:
|
else:
|
||||||
journals[ledger.id] = Journal(debit=1, cost_center_id=ledger.costcenter_id, ledger_id=ledger.id,
|
journals[ledger.id] = Journal(debit=1, cost_center_id=ledger.costcenter_id, ledger_id=ledger.id,
|
||||||
amount=item_amount)
|
amount=item_amount)
|
||||||
journals[otherLedger.id] = Journal(debit=-1, cost_center_id=otherLedger.costcenter_id, ledger_id=otherLedger.id,
|
journals[otherLedger.id] = Journal(debit=-1, cost_center_id=otherLedger.costcenter_id, ledger_id=otherLedger.id,
|
||||||
amount=amount)
|
amount=amount)
|
||||||
return list(journals.values())
|
return list(journals.values())
|
||||||
|
|
||||||
|
|
||||||
|
@ -103,7 +103,11 @@ def purchase_update_inventory(voucher, newInventories):
|
||||||
rate = round(Decimal(i['Rate']), 2)
|
rate = round(Decimal(i['Rate']), 2)
|
||||||
discount = round(Decimal(i['Discount']), 5)
|
discount = round(Decimal(i['Discount']), 5)
|
||||||
tax = round(Decimal(i['Tax']), 5)
|
tax = round(Decimal(i['Tax']), 5)
|
||||||
item.batch.name = voucher.date
|
if voucher.date != item.batch.name:
|
||||||
|
item.batch.name = voucher.date
|
||||||
|
if voucher.date < item.batch.date:
|
||||||
|
# TODO: check for issued products which might have been in a back date
|
||||||
|
pass
|
||||||
item.rate = rate
|
item.rate = rate
|
||||||
item.batch.rate = rate
|
item.batch.rate = rate
|
||||||
item.discount = discount
|
item.discount = discount
|
||||||
|
@ -131,9 +135,9 @@ def purchase_update_inventory(voucher, newInventories):
|
||||||
tax = round(Decimal(i['Tax']), 5)
|
tax = round(Decimal(i['Tax']), 5)
|
||||||
discount = round(Decimal(i['Discount']), 5)
|
discount = round(Decimal(i['Discount']), 5)
|
||||||
batch = Batch(name=voucher.date, product_id=product.id, quantity_remaining=new_quantity, rate=rate, tax=tax,
|
batch = Batch(name=voucher.date, product_id=product.id, quantity_remaining=new_quantity, rate=rate, tax=tax,
|
||||||
discount=discount)
|
discount=discount)
|
||||||
inventory = Inventory(id=None, product_id=product.id, batch=batch, quantity=new_quantity, rate=rate, tax=tax,
|
inventory = Inventory(id=None, product_id=product.id, batch=batch, quantity=new_quantity, rate=rate, tax=tax,
|
||||||
discount=discount)
|
discount=discount)
|
||||||
inventory.voucher_id = voucher.id
|
inventory.voucher_id = voucher.id
|
||||||
DBSession.add(batch)
|
DBSession.add(batch)
|
||||||
inventory.batch_id = batch.id
|
inventory.batch_id = batch.id
|
||||||
|
@ -154,9 +158,9 @@ def purchase_update_journals(voucher, journals):
|
||||||
journals[ledger.id].amount += item.amount
|
journals[ledger.id].amount += item.amount
|
||||||
else:
|
else:
|
||||||
journals[ledger.id] = Journal(debit=1, cost_center_id=ledger.costcenter_id, ledger_id=ledger.id,
|
journals[ledger.id] = Journal(debit=1, cost_center_id=ledger.costcenter_id, ledger_id=ledger.id,
|
||||||
amount=item.amount)
|
amount=item.amount)
|
||||||
journals[otherLedger.id] = Journal(debit=-1, cost_center_id=otherLedger.costcenter_id, ledger_id=otherLedger.id,
|
journals[otherLedger.id] = Journal(debit=-1, cost_center_id=otherLedger.costcenter_id, ledger_id=otherLedger.id,
|
||||||
amount=amount)
|
amount=amount)
|
||||||
for i in range(len(voucher.journals), 0, -1):
|
for i in range(len(voucher.journals), 0, -1):
|
||||||
item = voucher.journals[i - 1]
|
item = voucher.journals[i - 1]
|
||||||
if item.ledger_id in journals:
|
if item.ledger_id in journals:
|
||||||
|
|
|
@ -34,6 +34,8 @@ def purchase_return_create_inventory(voucher, item):
|
||||||
raise ValidationError("Quantity of {0} cannot be zero".format(item.product.name))
|
raise ValidationError("Quantity of {0} cannot be zero".format(item.product.name))
|
||||||
if quantity > batch.quantity_remaining:
|
if quantity > batch.quantity_remaining:
|
||||||
raise ValidationError("Quantity available is {0} only".format(batch.quantity_remaining))
|
raise ValidationError("Quantity available is {0} only".format(batch.quantity_remaining))
|
||||||
|
if batch.name < voucher.date:
|
||||||
|
raise ValidationError("Batch of {0} was purchased after the issue date".format(item.product.name))
|
||||||
|
|
||||||
batch.quantity_remaining -= quantity
|
batch.quantity_remaining -= quantity
|
||||||
|
|
||||||
|
@ -91,6 +93,8 @@ def purchase_return_update_inventory(voucher, newInventories, date):
|
||||||
if quantity - item.quantity > item.batch.quantity_remaining:
|
if quantity - item.quantity > item.batch.quantity_remaining:
|
||||||
raise ValidationError("Maximum quantity available for {0} is {1}".format(item.product.full_name,
|
raise ValidationError("Maximum quantity available for {0} is {1}".format(item.product.full_name,
|
||||||
item.quantity + item.batch.quantity_remaining))
|
item.quantity + item.batch.quantity_remaining))
|
||||||
|
if item.batch.name < voucher.date:
|
||||||
|
raise ValidationError("Batch of {0} was purchased after the issue date".format(item.product.name))
|
||||||
item.batch.quantity_remaining -= (quantity - item.quantity)
|
item.batch.quantity_remaining -= (quantity - item.quantity)
|
||||||
item.quantity = quantity
|
item.quantity = quantity
|
||||||
newInventories.remove(i)
|
newInventories.remove(i)
|
||||||
|
|
Loading…
Reference in New Issue