Added: Support for fixtures in Ledger, Employee, Product, ProductGroup and CostCenter.

Database updated accordingly.
This commit is contained in:
Tanshu 2013-09-28 15:57:17 +05:30
parent 55741f49c3
commit d452e2ada9
7 changed files with 105 additions and 67 deletions

View File

@ -13,16 +13,18 @@ class Product(Base):
id = Column('ProductID', GUID(), primary_key=True, default=uuid.uuid4)
code = Column('Code', Integer, unique=True)
name = Column('Name', Unicode(255))
units = Column('Units', Unicode(255))
fraction = Column('Fraction', Numeric)
fraction_units = Column('FractionUnits', Unicode(255))
yeild = Column('Yeild', Numeric)
show_for_purchase = Column('ShowForPurchase', Boolean)
product_group_id = Column('ProductGroupID', GUID(), ForeignKey('entities_productgroups.ProductGroupID'))
ledger_id = Column('LedgerID', GUID(), ForeignKey('entities_ledgers.LedgerID'))
price = Column('Price', Numeric)
discontinued = Column('Discontinued', Boolean)
name = Column('Name', Unicode(255), nullable=False)
units = Column('Units', Unicode(255), nullable=False)
fraction = Column('Fraction', Numeric, nullable=False)
fraction_units = Column('FractionUnits', Unicode(255), nullable=False)
yeild = Column('Yeild', Numeric, nullable=False)
show_for_purchase = Column('ShowForPurchase', Boolean, nullable=False)
product_group_id = Column('ProductGroupID', GUID(), ForeignKey('entities_productgroups.ProductGroupID'),
nullable=False)
ledger_id = Column('LedgerID', GUID(), ForeignKey('entities_ledgers.LedgerID'), nullable=False)
price = Column('Price', Numeric, nullable=False)
discontinued = Column('Discontinued', Boolean, nullable=False)
is_fixture = Column('IsFixture', Boolean, nullable=False)
batches = relationship('Batch', backref='product')
inventories = relationship('Inventory', backref='product')
@ -30,7 +32,8 @@ class Product(Base):
ledger = relationship('Ledger', primaryjoin="Ledger.id==Product.ledger_id", backref='products')
def __init__(self, code=None, name=None, units=None, fraction=None, fraction_units=None, yeild=None,
show_for_purchase=None, product_group_id=None, ledger_id=None, price=None, discontinued=None):
show_for_purchase=None, product_group_id=None, ledger_id=None, price=None, discontinued=None,
is_fixture=False):
self.code = code
self.name = name
self.units = units
@ -42,6 +45,7 @@ class Product(Base):
self.ledger_id = ledger_id
self.price = price
self.discontinued = discontinued
self.is_fixture = is_fixture
@property
def full_name(self):
@ -85,11 +89,13 @@ class ProductGroup(Base):
id = Column('ProductGroupID', GUID(), primary_key=True, default=uuid.uuid4)
name = Column('Name', Unicode(255), unique=True)
is_fixture = Column('IsFixture', Boolean, nullable=False)
products = relationship('Product', backref='product_group')
def __init__(self, name=None):
def __init__(self, name=None, is_fixture=False):
self.name = name
self.is_fixture = is_fixture
@classmethod
def list(cls):
@ -105,6 +111,7 @@ class CostCenter(Base):
id = Column('CostCenterID', GUID(), primary_key=True, default=uuid.uuid4)
name = Column('Name', Unicode(255), unique=True)
is_fixture = Column('IsFixture', Boolean, nullable=False)
ledgers = relationship('LedgerBase', backref='costcenter')
journals = relationship('Journal', backref='costcenter')
@ -113,8 +120,9 @@ class CostCenter(Base):
def __name__(self):
return self.name
def __init__(self, name=None):
def __init__(self, name=None, is_fixture=False):
self.name = name
self.is_fixture = is_fixture
@classmethod
def by_id(cls, id):
@ -152,6 +160,7 @@ class LedgerBase(Base):
is_active = Column('IsActive', Boolean)
is_reconcilable = Column('IsReconcilable', Boolean)
costcenter_id = Column('CostCenterID', GUID(), ForeignKey('entities_costcenters.CostCenterID'))
is_fixture = Column('IsFixture', Boolean, nullable=False)
__mapper_args__ = {'polymorphic_on': ledger_type}
@ -165,13 +174,14 @@ class LedgerBase(Base):
def type_object(self):
return LedgerType.by_id(self.type)
def __init__(self, code=None, name=None, type=None, is_active=None, is_reconcilable=False, costcenter_id=None):
def __init__(self, code=None, name=None, type=None, is_active=None, is_reconcilable=False, costcenter_id=None, is_fixture=False):
self.code = code
self.name = name
self.type = type
self.is_active = is_active
self.is_reconcilable = is_reconcilable
self.costcenter_id = costcenter_id
self.is_fixture = is_fixture
@classmethod
def by_id(cls, id):
@ -207,6 +217,8 @@ class LedgerBase(Base):
return self
def can_delete(self):
if self.is_fixture:
return False, "{0} is a fixture and cannot be edited or deleted.".format(self.name)
if self.is_active:
return False, 'Account is active'
if len(self.journals) > 0:
@ -231,11 +243,11 @@ class LedgerBase(Base):
@classmethod
def local_purchase(cls):
return {'LedgerID': 'd2b75912-505f-2548-9093-466dfff6a0f9', 'Name': 'local purchase'}
return {'LedgerID': 'd2b75912-505f-2548-9093-466dfff6a0f9', 'Name': 'Local Purchase'}
@classmethod
def salary(cls):
return {'LedgerID': '5c2b54d0-c174-004d-a0d5-92cdaadcefa7', 'Name': 'salary staff'}
return {'LedgerID': '5c2b54d0-c174-004d-a0d5-92cdaadcefa7', 'Name': 'Staff Salary'}
@classmethod
def esi_pf_expense(cls):

View File

@ -1,5 +1,3 @@
from datetime import datetime
from brewman.models import DBSession
from brewman.models.master import CostCenter
from brewman.models.validation_exception import ValidationError

View File

@ -8,6 +8,7 @@ from brewman.models import DBSession
from brewman.models.master import CostCenter, Ledger, LedgerType, LedgerBase
from brewman.models.validation_exception import ValidationError, TryCatchFunction
@view_config(route_name='account_list', renderer='brewman:templates/angular_base.mako', permission='Accounts')
@view_config(request_method='GET', route_name='account_id', renderer='brewman:templates/angular_base.mako',
permission='Accounts')
@ -31,6 +32,8 @@ def save(request):
@TryCatchFunction
def update(request):
item = Ledger.by_id(uuid.UUID(request.matchdict['id']))
if item.is_fixture:
raise ValidationError("{0} is a fixture and cannot be edited or deleted.".format(item.name))
new_type = int(request.json_body['Type'])
if not item.type == new_type:
item.code = Ledger.get_code(new_type)
@ -76,7 +79,7 @@ def show_list(request):
for item in list:
ledgers.append({'Name': item.name, 'Type': item.type_object.name, 'IsActive': 'Yes' if item.is_active else 'No',
'IsReconcilable': 'Yes' if item.is_reconcilable else '', 'CostCenter': item.costcenter.name,
'Url': request.route_url('account_id', id=item.id)})
'IsFixture': item.is_fixture, 'Url': request.route_url('account_id', id=item.id)})
return ledgers
@ -117,6 +120,7 @@ def account_info(id):
account = Ledger.by_id(id)
account = {'LedgerID': account.id, 'Code': account.code, 'Name': account.name, 'Type': account.type,
'IsActive': account.is_active, 'IsReconcilable': account.is_reconcilable,
'IsFixture': account.is_fixture,
'CostCenter': {'CostCenterID': account.costcenter_id, 'Name': account.costcenter.name}}
return account

View File

@ -31,6 +31,8 @@ def save(request):
@TryCatchFunction
def update(request):
item = CostCenter.by_id(uuid.UUID(request.matchdict['id']))
if item.is_fixture:
raise ValidationError("{0} is a fixture and cannot be edited or deleted.".format(item.name))
item.name = request.json_body['Name']
transaction.commit()
return cost_center_info(item.id)
@ -38,11 +40,15 @@ def update(request):
@view_config(request_method='DELETE', route_name='api_cost_center_id', renderer='json', permission='Cost Centers')
def delete(request):
id = request.matchdict.get('id', None)
if id is None:
response = Response("Cost Center is Null")
item = request.matchdict.get('id', None)
item = None if item is None else CostCenter.by_id(uuid.UUID(item))
if item is None:
response = Response("Cost Center not found")
response.status_int = 500
return response
elif item.is_fixture:
raise ValidationError("{0} is a fixture and cannot be edited or deleted.".format(item.name))
else:
response = Response("Cost Center deletion not implemented")
response.status_int = 500
@ -65,8 +71,8 @@ def show_list(request):
list = CostCenter.list()
cost_centers = []
for item in list:
cost_centers.append(
{'CostCenterID': item.id, 'Name': item.name, 'Url': request.route_url('cost_center_id', id=item.id)})
cost_centers.append({'CostCenterID': item.id, 'Name': item.name, 'IsFixture': item.is_fixture,
'Url': request.route_url('cost_center_id', id=item.id)})
return cost_centers
@ -75,6 +81,6 @@ def cost_center_info(id):
return {}
else:
cost_center = CostCenter.by_id(id)
return {'CostCenterID': cost_center.id, 'Name': cost_center.name}
return {'CostCenterID': cost_center.id, 'Name': cost_center.name, 'IsFixture': cost_center.is_fixture}

View File

@ -4,6 +4,7 @@ from pyramid.response import Response
from pyramid.view import view_config
import transaction
from brewman.models import DBSession
from brewman.models.master import CostCenter, Employee, LedgerBase
from brewman.models.validation_exception import ValidationError, TryCatchFunction
@ -40,6 +41,8 @@ def save(request):
@TryCatchFunction
def update(request):
item = Employee.by_id(uuid.UUID(request.matchdict['id']))
if item.is_fixture:
raise ValidationError("{0} is a fixture and cannot be edited or deleted.".format(item.name))
item.name = request.json_body['Name']
item.is_active = request.json_body['IsActive']
item.costcenter_id = uuid.UUID(request.json_body['CostCenter']['CostCenterID'])
@ -55,13 +58,15 @@ def update(request):
@view_config(request_method='DELETE', route_name='api_employee_id', renderer='json', permission='Employees')
def delete(request):
id = request.matchdict.get('id', None)
if id is None:
response = Response("Employee is Null")
response.status_int = 500
return response
employee = Employee.by_id(uuid.UUID(request.matchdict['id']))
can_delete, reason = employee.can_delete()
if can_delete:
DBSession.delete(employee)
transaction.commit()
return employee_info(None)
else:
response = Response("Employee deletion not implemented")
transaction.abort()
response = Response("Cannot delete account because {0}".format(reason))
response.status_int = 500
return response

View File

@ -6,7 +6,8 @@ from pyramid.view import view_config
import transaction
from brewman.models.master import Product, CostCenter, LedgerType, Ledger
from brewman.models.validation_exception import TryCatchFunction
from brewman.models.validation_exception import TryCatchFunction, ValidationError
@view_config(route_name='product_list', renderer='brewman:templates/angular_base.mako', permission='Authenticated')
@view_config(request_method='GET', route_name='product_id', renderer='brewman:templates/angular_base.mako',
@ -33,6 +34,8 @@ def save(request):
@TryCatchFunction
def update(request):
item = Product.by_id(uuid.UUID(request.matchdict['id']))
if item.is_fixture:
raise ValidationError("{0} is a fixture and cannot be edited or deleted.".format(item.full_name))
item.name = request.json_body['Name']
item.units = request.json_body['Units']
item.fraction = Decimal(request.json_body['Fraction'])
@ -49,11 +52,15 @@ def update(request):
@view_config(request_method='DELETE', route_name='api_product_id', renderer='json', permission='Products')
def delete(request):
id = request.matchdict.get('id', None)
if id is None:
response = Response("Product is Null")
item = request.matchdict.get('id', None)
item = None if item is None else Product.by_id(uuid.UUID(item))
if item is None:
response = Response("Product not found")
response.status_int = 500
return response
elif item.is_fixture:
raise ValidationError("{0} is a fixture and cannot be edited or deleted.".format(item.full_name))
else:
response = Response("Product deletion not implemented")
response.status_int = 500
@ -79,19 +86,19 @@ def show_list(request):
for item in list:
products.append({'Code': item.code, 'Name': item.name, 'Units': item.units, 'Price': item.price,
'ProductGroup': item.product_group.name, 'Discontinued': item.discontinued,
'Url': request.route_url('product_id', id=item.id)})
'IsFixture': item.is_fixture, 'Url': request.route_url('product_id', id=item.id)})
return products
@view_config(request_method='GET', route_name='api_product', renderer='json', request_param='term',
permission='Authenticated')
def show_term(request):
filter = request.GET.get('term', None)
filter = filter if filter is not None and filter is not '' else None
term = request.GET.get('term', None)
term = term if term is not None and term is not '' else None
count = request.GET.get('count', None)
count = None if count is None or count == '' else int(count)
list = []
for index, item in enumerate(Product.list(filter)):
for index, item in enumerate(Product.list(term)):
list.append({'ProductID': item.id, 'Name': item.full_name, 'Price': item.price})
if count is not None and index == count - 1:
break
@ -107,6 +114,6 @@ def product_info(id):
product = {'ProductID': product.id, 'Code': product.code, 'Name': product.name, 'Units': product.units,
'Fraction': product.fraction, 'FractionUnits': product.fraction_units, 'Yeild': product.yeild,
'ShowForPurchase': product.show_for_purchase, 'Discontinued': product.discontinued,
'ProductGroup': {'ProductGroupID': product.product_group_id},
'IsFixture':product.is_fixture, 'ProductGroup': {'ProductGroupID': product.product_group_id},
'Ledger': {'LedgerID': product.ledger_id}, 'Price': product.price}
return product

View File

@ -32,6 +32,8 @@ def save(request):
@TryCatchFunction
def update(request):
item = ProductGroup.by_id(uuid.UUID(request.matchdict['id']))
if item.is_fixture:
raise ValidationError("{0} is a fixture and cannot be edited or deleted.".format(item.name))
item.name = request.json_body['Name']
transaction.commit()
return product_group_info(item.id)
@ -39,11 +41,15 @@ def update(request):
@view_config(request_method='DELETE', route_name='api_product_group_id', renderer='json', permission='Product Groups')
def delete(request):
id = request.matchdict.get('id', None)
if id is None:
response = Response("Product Group is Null")
item = request.matchdict.get('id', None)
item = None if item is None else ProductGroup.by_id(uuid.UUID(item))
if item is None:
response = Response("Product Group not Found")
response.status_int = 500
return response
elif item.is_fixture:
raise ValidationError("{0} is a fixture and cannot be edited or deleted.".format(item.name))
else:
response = Response("Product Group deletion not implemented")
response.status_int = 500
@ -66,8 +72,8 @@ def show_list(request):
list = ProductGroup.list()
product_groups = []
for item in list:
product_groups.append(
{'ProductGroupID': item.id, 'Name': item.name, 'Url': request.route_url('product_group_id', id=item.id)})
product_groups.append({'ProductGroupID': item.id, 'Name': item.name, 'IsFixture': item.is_fixture,
'Url': request.route_url('product_group_id', id=item.id)})
return product_groups
@ -76,6 +82,6 @@ def product_group_info(id):
return {}
else:
product_group = ProductGroup.by_id(id)
return {'ProductGroupID': product_group.id, 'Name': product_group.name}
return {'ProductGroupID': product_group.id, 'Name': product_group.name, 'IsFixture': product_group.is_fixture}