Dropped many columns for Prodct Table.
Merged product and account menu on page top. Product working now.
This commit is contained in:
parent
a71999e3c8
commit
eb8568b471
Conversion
brewman/brewman
__init__.pyhelpers.py
models
static
partial
account-detail.htmlaccount-list.htmlcost-center-list.htmlproduct-detail.htmlproduct-list.htmluser-detail.htmluser-list.html
scripts
templates
views
@ -16,3 +16,27 @@ CREATE TABLE "Entities_Ledgers" ("LedgerID" guid NOT NULL, "Code" integer NOT NU
|
||||
INSERT INTO "Entities_Ledgers" SELECT "LedgerID", "Code", "Name", "Type", '', "IsActive", "CostCenterID" FROM "Entities_Ledgers_old";
|
||||
UPDATE "Entities_Ledgers" SET ledger_type = 'employees' where type = 10;
|
||||
DROP TABLE "Entities_Ledgers_old";
|
||||
|
||||
ALTER TABLE "Entities_Products" RENAME TO "Entities_Products_old";
|
||||
CREATE TABLE [Entities_Products] (
|
||||
"ProductID" guid NOT NULL,
|
||||
"Code" integer NOT NULL,
|
||||
"Name" nvarchar(150) NOT NULL COLLATE NOCASE,
|
||||
"Units" nvarchar(50) NOT NULL COLLATE NOCASE,
|
||||
"Fraction" numeric NOT NULL,
|
||||
"FractionUnits" nvarchar(255) NOT NULL COLLATE NOCASE,
|
||||
"Yeild" numeric NOT NULL,
|
||||
"ShowForPurchase" bit NOT NULL,
|
||||
"Price" numeric,
|
||||
"Discontinued" bit NOT NULL,
|
||||
"ProductGroupID" guid,
|
||||
"LedgerID" guid,
|
||||
PRIMARY KEY ([ProductID])
|
||||
,
|
||||
FOREIGN KEY ([LedgerID])
|
||||
REFERENCES [Entities_Ledgers]([LedgerID]),
|
||||
FOREIGN KEY ([ProductGroupID])
|
||||
REFERENCES [Entities_ProductGroups]([ProductGroupID])
|
||||
);
|
||||
INSERT INTO "Entities_Products" SELECT "ProductID", "Code", "Name", "Units", "Fraction", "FractionUnits", "Yeild", "ShowForPurchase", "PurchasePrice", "Discontinued", "ProductGroupID", "PurchaseLedgerID" FROM "Entities_Products_old";
|
||||
DROP TABLE "Entities_Products_old";
|
||||
|
@ -135,6 +135,7 @@ def main(global_config, **settings):
|
||||
|
||||
config.add_route('user_permissions', '/Permissions')
|
||||
config.add_route('account_type_list', '/AccountTypes')
|
||||
config.add_route('product_group_list', '/ProductGroups')
|
||||
|
||||
config.add_route('services_batch_list', '/Services/Batches')
|
||||
config.add_route('services_batch_add_inventory', '/Services/AddBatch')
|
||||
|
@ -1,6 +1,6 @@
|
||||
import string
|
||||
|
||||
from brewman.views.nav_bar import login_menu, report_menu, voucher_menu, entry_menu, employee_menu, account_menu, product_menu
|
||||
from brewman.views.nav_bar import login_menu, report_menu, voucher_menu, entry_menu, employee_menu, master_menu
|
||||
|
||||
class Form(object):
|
||||
"""Make absolute URL from the relative one.
|
||||
|
@ -19,26 +19,18 @@ class Product(Base):
|
||||
yeild = Column('Yeild', Numeric)
|
||||
show_for_purchase = Column('ShowForPurchase', Boolean)
|
||||
product_group_id = Column('ProductGroupID', GUID(), ForeignKey('entities_productgroups.ProductGroupID'))
|
||||
sale_ledger_id = Column('SaleLedgerID', GUID(), ForeignKey('entities_ledgers.LedgerID'))
|
||||
sale_tax_id = Column('SaleTaxID', GUID(), ForeignKey('entities_taxes.TaxID'))
|
||||
sale_price = Column('SalePrice', Numeric)
|
||||
purchase_ledger_id = Column('PurchaseLedgerID', GUID(), ForeignKey('entities_ledgers.LedgerID'))
|
||||
purchase_tax_id = Column('PurchaseTaxID', GUID(), ForeignKey('entities_taxes.TaxID'))
|
||||
purchase_price = Column('PurchasePrice', Numeric)
|
||||
ledger_id = Column('LedgerID', GUID(), ForeignKey('entities_ledgers.LedgerID'))
|
||||
price = Column('Price', Numeric)
|
||||
discontinued = Column('Discontinued', Boolean)
|
||||
|
||||
batches = relationship('Batch', backref='product')
|
||||
inventories = relationship('Inventory', backref='product')
|
||||
|
||||
sale_ledger = relationship('Ledger', primaryjoin="Ledger.id==Product.sale_ledger_id")
|
||||
sale_tax = relationship('Tax', primaryjoin="Tax.id==Product.sale_tax_id")
|
||||
|
||||
purchase_ledger = relationship('Ledger', primaryjoin="Ledger.id==Product.purchase_ledger_id")
|
||||
purchase_tax = relationship('Tax', primaryjoin="Tax.id==Product.purchase_tax_id")
|
||||
ledger = relationship('Ledger', primaryjoin="Ledger.id==Product.ledger_id")
|
||||
|
||||
def __init__(self, code=None, name=None, units=None, fraction=None, fraction_units=None, yeild=None,
|
||||
show_for_purchase=None, product_group_id=None, sale_ledger_id=None, sale_tax_id=None, sale_price=None,
|
||||
purchase_ledger_id=None, purchase_tax_id=None, purchase_price=None, discontinued=None):
|
||||
show_for_purchase=None, product_group_id=None, ledger_id=None, price=None, discontinued=None):
|
||||
self.code = code
|
||||
self.name = name
|
||||
self.units = units
|
||||
@ -47,12 +39,8 @@ class Product(Base):
|
||||
self.yeild = yeild
|
||||
self.show_for_purchase = show_for_purchase
|
||||
self.product_group_id = product_group_id
|
||||
self.sale_ledger_id = sale_ledger_id
|
||||
self.sale_tax_id = sale_tax_id
|
||||
self.sale_price = sale_price
|
||||
self.purchase_ledger_id = purchase_ledger_id
|
||||
self.purchase_tax_id = purchase_tax_id
|
||||
self.purchase_price = purchase_price
|
||||
self.ledger_id = ledger_id
|
||||
self.price = price
|
||||
self.discontinued = discontinued
|
||||
|
||||
@property
|
||||
@ -94,6 +82,10 @@ class ProductGroup(Base):
|
||||
def __init__(self, name=None):
|
||||
self.name = name
|
||||
|
||||
@classmethod
|
||||
def list(cls):
|
||||
return DBSession.query(cls).order_by(cls.name)
|
||||
|
||||
|
||||
class CostCenter(Base):
|
||||
__tablename__ = 'entities_costcenters'
|
||||
|
@ -28,7 +28,7 @@
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" ng-checked="account.IsActive"> Is Active
|
||||
<input type="checkbox" ng-model="account.IsActive"> Is Active
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,4 +1,4 @@
|
||||
<legend>Accounts</legend>
|
||||
<legend>Accounts <a href="/Account" class="btn btn-success pull-right">Add <i class="icon-plus icon-white"></i></a></legend>
|
||||
<table class="clean-table" ng-controller="AccountListCtrl">
|
||||
<thead>
|
||||
<tr>
|
||||
|
@ -1,4 +1,4 @@
|
||||
<legend>Cost Centers</legend>
|
||||
<legend>Cost Centers <a href="/CostCenter" class="btn btn-success pull-right">Add <i class="icon-plus icon-white"></i></a></legend>
|
||||
<table class="clean-table" ng-controller="CostCenterListCtrl">
|
||||
<thead>
|
||||
<tr>
|
||||
|
88
brewman/brewman/static/partial/product-detail.html
Normal file
88
brewman/brewman/static/partial/product-detail.html
Normal file
@ -0,0 +1,88 @@
|
||||
<form method="post" class="form-horizontal" ng-controller="ProductCtrl">
|
||||
<legend>Product Detail</legend>
|
||||
<div class="control-group">
|
||||
<label for="txtCode" class="control-label">Code</label>
|
||||
|
||||
<div class="controls">
|
||||
<input type="text" id="txtCode" class="non-search-box" disabled="disabled" ng-model="product.Code"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label for="txtName" class="control-label">Name</label>
|
||||
|
||||
<div class="controls">
|
||||
<input type="text" id="txtName" ng-model="product.Name"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label for="txtUnits" class="control-label">Units</label>
|
||||
|
||||
<div class="controls">
|
||||
<input type="text" id="txtUnits" ng-model="product.Units"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label for="txtPrice" class="control-label">Price</label>
|
||||
|
||||
<div class="controls">
|
||||
<input type="text" id="txtPrice" ng-model="product.Price"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label for="txtFraction" class="control-label">Fraction</label>
|
||||
|
||||
<div class="controls">
|
||||
<input type="text" id="txtFraction" ng-model="product.Fraction"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label for="txtFractionUnits" class="control-label">FractionUnits</label>
|
||||
|
||||
<div class="controls">
|
||||
<input type="text" id="txtFractionUnits" ng-model="product.FractionUnits"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label for="txtYeild" class="control-label">Yeild</label>
|
||||
|
||||
<div class="controls">
|
||||
<input type="text" id="txtYeild" ng-model="product.Yeild"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" ng-model="product.ShowForPurchase"> Show for Purchase
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" ng-model="product.Discontinued"> Discontinued
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label for="ddlType" class="control-label">Type</label>
|
||||
|
||||
<div class="controls">
|
||||
<select id="ddlType" class="select-box" ng-model="product.ProductGroup.ProductGroupID"
|
||||
ng-options="l.ProductGroupID as l.Name for l in product_groups"> </select>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" control-group">
|
||||
|
||||
<div class="controls">
|
||||
<button ng-click="save()">Save</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
21
brewman/brewman/static/partial/product-list.html
Normal file
21
brewman/brewman/static/partial/product-list.html
Normal file
@ -0,0 +1,21 @@
|
||||
<legend>Products <a href="/Product" class="btn btn-success pull-right">Add <i class="icon-plus icon-white"></i></a></legend>
|
||||
<table class="clean-table" ng-controller="ProductListCtrl">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Code</th>
|
||||
<th>Name</th>
|
||||
<th>Price</th>
|
||||
<th>Type</th>
|
||||
<th>Discontinued</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="item in info">
|
||||
<td>{{item.Code}}</td>
|
||||
<td><a href="{{item.Url}}">{{item.Name}} ({{item.Units}})</a></td>
|
||||
<td>₹ {{item.Price}}</td>
|
||||
<td>{{item.ProductGroup}}</td>
|
||||
<td>{{item.Discontinued}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
@ -20,7 +20,7 @@
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" ng-checked="user.LockedOut"> Locked Out
|
||||
<input type="checkbox" ng-model="user.LockedOut"> Locked Out
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,4 +1,4 @@
|
||||
<legend>Accounts</legend>
|
||||
<legend>Users <a href="/User" class="btn btn-success pull-right">Add <i class="icon-plus icon-white"></i></a></legend>
|
||||
<table class="clean-table" ng-controller="UserListCtrl">
|
||||
<thead>
|
||||
<tr>
|
||||
@ -19,3 +19,4 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
$scope.info = Account.query();
|
||||
}
|
||||
|
||||
function AccountCtrl($scope, $routeParams, Account, AccountType, CostCenter) {
|
||||
function AccountCtrl($scope, $routeParams, $location, Account, AccountType, CostCenter) {
|
||||
$scope.account = Account.get({id: $routeParams.id});
|
||||
|
||||
$scope.account_types = AccountType.query();
|
||||
@ -11,6 +11,7 @@ function AccountCtrl($scope, $routeParams, Account, AccountType, CostCenter) {
|
||||
$scope.save = function () {
|
||||
$scope.account.$save(function (u, putResponseHeaders) {
|
||||
$scope.toasts.push({Type:'Success', Message:u.Code});
|
||||
$location.path('/Accounts')
|
||||
}, function (data, status) {
|
||||
$scope.toasts.push({Type:'Error', Message:data.data});
|
||||
});
|
||||
@ -19,10 +20,11 @@ function AccountCtrl($scope, $routeParams, Account, AccountType, CostCenter) {
|
||||
$scope.delete = function () {
|
||||
$scope.account.$delete(function (u, putResponseHeaders) {
|
||||
$scope.toasts.push({Type:'Success', Message:''});
|
||||
$location.path('/Accounts')
|
||||
}, function (data, status) {
|
||||
$scope.toasts.push({Type:'Error', Message:data.data});
|
||||
});
|
||||
};
|
||||
$('#txtLedger').focus();
|
||||
$('#txtName').focus();
|
||||
|
||||
}
|
||||
|
@ -119,3 +119,16 @@ overlord_service.factory('User', ['$resource', function ($resource) {
|
||||
});
|
||||
}]);
|
||||
|
||||
// TODO: Replace hardcoded url with route_url
|
||||
overlord_service.factory('Product', ['$resource', function ($resource) {
|
||||
return $resource('/Product/:id',
|
||||
{id:'@ProductID'}, {
|
||||
query:{method:'GET', params:{list:true}, isArray:true}
|
||||
});
|
||||
}]);
|
||||
|
||||
// TODO: Replace hardcoded url with route_url
|
||||
overlord_service.factory('ProductGroup', ['$resource', function ($resource) {
|
||||
return $resource('/ProductGroups');
|
||||
}]);
|
||||
|
||||
|
@ -5,12 +5,19 @@
|
||||
when('/Journal/:id', {templateUrl: '/partial/journal.html', controller: JournalCtrl}).
|
||||
|
||||
when('/Accounts', {templateUrl: '/partial/account-list.html', controller: AccountListCtrl}).
|
||||
when('/Account', {templateUrl: '/partial/account-detail.html', controller: AccountCtrl}).
|
||||
when('/Account/:id', {templateUrl: '/partial/account-detail.html', controller: AccountCtrl}).
|
||||
|
||||
when('/CostCenters', {templateUrl: '/partial/cost-center-list.html', controller: CostCenterListCtrl}).
|
||||
when('/CostCenter', {templateUrl: '/partial/cost-center-detail.html', controller: CostCenterCtrl}).
|
||||
when('/CostCenter/:id', {templateUrl: '/partial/cost-center-detail.html', controller: CostCenterCtrl}).
|
||||
|
||||
when('/Products', {templateUrl: '/partial/product-list.html', controller: ProductListCtrl}).
|
||||
when('/Product', {templateUrl: '/partial/product-detail.html', controller: ProductCtrl}).
|
||||
when('/Product/:id', {templateUrl: '/partial/product-detail.html', controller: ProductCtrl}).
|
||||
|
||||
when('/Users', {templateUrl: '/partial/user-list.html', controller: UserListCtrl}).
|
||||
when('/User', {templateUrl: '/partial/user-detail.html', controller: UserCtrl}).
|
||||
when('/User/:id', {templateUrl: '/partial/user-detail.html', controller: UserCtrl});
|
||||
// .otherwise({redirectTo: '/phones'});
|
||||
$locationProvider.html5Mode(true);
|
||||
|
@ -22,6 +22,6 @@ function CostCenterCtrl($scope, $routeParams, $location, CostCenter) {
|
||||
$scope.toasts.push({Type:'Error', Message:data.data});
|
||||
});
|
||||
};
|
||||
$('#txtLedger').focus();
|
||||
$('#txtName').focus();
|
||||
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
if (typeof $routeParams.id === 'undefined'){
|
||||
$scope.voucher = Voucher.get({type:'Journal'});
|
||||
} else {
|
||||
console.log('getting voucher' + $routeParams.id)
|
||||
$scope.voucher = Voucher.get({id:$routeParams.id});
|
||||
}
|
||||
|
||||
|
@ -1,73 +1,28 @@
|
||||
function GetProducts(productGroupID, page) {
|
||||
if (productGroupID == -1) {
|
||||
productGroupID = product_group_id;
|
||||
}
|
||||
product_group_id = productGroupID;
|
||||
if (page == 0) {
|
||||
page = 1;
|
||||
}
|
||||
else {
|
||||
page = product_page + page;
|
||||
if (page < 1){
|
||||
page = 1
|
||||
}
|
||||
}
|
||||
product_page = page;
|
||||
$.ajax({
|
||||
type:"POST",
|
||||
url:products_route,
|
||||
contentType:"application/json; charset=utf-8",
|
||||
data:JSON.stringify({ productGroupID:productGroupID, page_size:product_page_size, page:page }),
|
||||
dataType:"json",
|
||||
success:function (response) {
|
||||
var rows = "";
|
||||
$.each(response, function (index, row) {
|
||||
rows += "<li><div class=\"thumbnail\"><button onclick=\"return GetProducts('" + row.id + "', '');\" class=\"btn btn-large btn-success\">" + row.name + "</button></div></li>";
|
||||
})
|
||||
|
||||
$("#products").html(rows);
|
||||
},
|
||||
error:ShowError
|
||||
});
|
||||
return false;
|
||||
function ProductListCtrl($scope, Product) {
|
||||
$scope.info = Product.query();
|
||||
}
|
||||
|
||||
function ProductCtrl($scope, $routeParams, $location, Product, ProductGroup) {
|
||||
$scope.product = Product.get({id:$routeParams.id});
|
||||
$scope.product_groups = ProductGroup.query();
|
||||
|
||||
function GetProductGroups(page) {
|
||||
if (page == 0) {
|
||||
page = 1;
|
||||
}
|
||||
else {
|
||||
page = product_group_page + page;
|
||||
if (page < 1){
|
||||
page = 1
|
||||
}
|
||||
}
|
||||
product_group_page = page;
|
||||
$.ajax({
|
||||
type:"POST",
|
||||
url:product_groups_route,
|
||||
contentType:"application/json; charset=utf-8",
|
||||
data:JSON.stringify({ page_size:product_group_page_size, page:page }),
|
||||
dataType:"json",
|
||||
success:function (response) {
|
||||
var rows = "";
|
||||
$.each(response, function (index, row) {
|
||||
rows += "<li><div class=\"thumbnail\"><button onclick=\"return GetProducts(" + row.id + ", 0);\" class=\"btn btn-large btn-success\">" + row.name + "</button></div></li>";
|
||||
})
|
||||
$scope.save = function () {
|
||||
$scope.product.$save(function (u, putResponseHeaders) {
|
||||
$scope.toasts.push({Type:'Success', Message:u.Code});
|
||||
$location.path('/Products')
|
||||
}, function (data, status) {
|
||||
$scope.toasts.push({Type:'Error', Message:data.data});
|
||||
});
|
||||
};
|
||||
|
||||
$scope.delete = function () {
|
||||
$scope.product.$delete(function (u, putResponseHeaders) {
|
||||
$scope.toasts.push({Type:'Success', Message:''});
|
||||
$location.path('/Products')
|
||||
}, function (data, status) {
|
||||
$scope.toasts.push({Type:'Error', Message:data.data});
|
||||
});
|
||||
};
|
||||
$('#txtName').focus();
|
||||
|
||||
$("#product_groups").html(rows);
|
||||
},
|
||||
error:function (jqXHR, textStatus) {
|
||||
var msg = jqXHR.responseText;
|
||||
$("#status").append('<div id="status" class="alert alert-error"><button class="close" data-dismiss="alert">×</button> <strong>Error!</strong> ' + msg + '</div>');
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
function ShowError(jqXHR, textStatus) {
|
||||
var msg = jqXHR.responseText;
|
||||
$("#status").append('<div id="status" class="alert alert-error"><button class="close" data-dismiss="alert">×</button> <strong>Error!</strong> ' + msg + '</div>');
|
||||
|
||||
}
|
@ -2,12 +2,13 @@
|
||||
$scope.info = User.query();
|
||||
}
|
||||
|
||||
function UserCtrl($scope, $routeParams, User) {
|
||||
function UserCtrl($scope, $routeParams, $location, User) {
|
||||
$scope.user = User.get({id: $routeParams.id});
|
||||
|
||||
$scope.save = function () {
|
||||
$scope.user.$save(function (u, putResponseHeaders) {
|
||||
$scope.toasts.push({Type:'Success', Message:u.Code});
|
||||
$location.path('/Users')
|
||||
}, function (data, status) {
|
||||
$scope.toasts.push({Type:'Error', Message:data.data});
|
||||
});
|
||||
@ -16,6 +17,7 @@ function UserCtrl($scope, $routeParams, User) {
|
||||
$scope.delete = function () {
|
||||
$scope.user.$delete(function (u, putResponseHeaders) {
|
||||
$scope.toasts.push({Type:'Success', Message:''});
|
||||
$location.path('/Users')
|
||||
}, function (data, status) {
|
||||
$scope.toasts.push({Type:'Error', Message:data.data});
|
||||
});
|
||||
|
@ -42,6 +42,7 @@
|
||||
${h.ScriptLink(request, 'account.js')}
|
||||
${h.ScriptLink(request, 'user.js')}
|
||||
${h.ScriptLink(request, 'cost-center.js')}
|
||||
${h.ScriptLink(request, 'product.js')}
|
||||
|
||||
<!-- Le fav and touch icons -->
|
||||
<link rel="shortcut icon" href="${request.static_url('brewman:static/img/favicon.ico')}">
|
||||
@ -75,8 +76,7 @@
|
||||
${h.report_menu(request) | n }
|
||||
${h.entry_menu(request) | n }
|
||||
${h.employee_menu(request) | n }
|
||||
${h.account_menu(request) | n }
|
||||
${h.product_menu(request) | n }
|
||||
${h.master_menu(request) | n }
|
||||
${h.login_menu(request) | n }
|
||||
</div>
|
||||
<!--/.nav-collapse -->
|
||||
|
@ -35,8 +35,13 @@
|
||||
${h.ScriptLink(request, 'angular_filter.js')}
|
||||
${h.ScriptLink(request, 'angular_service.js')}
|
||||
${h.ScriptLink(request, 'session.js')}
|
||||
|
||||
${h.ScriptLink(request, 'journal.js')}
|
||||
|
||||
${h.ScriptLink(request, 'account.js')}
|
||||
${h.ScriptLink(request, 'user.js')}
|
||||
${h.ScriptLink(request, 'cost-center.js')}
|
||||
${h.ScriptLink(request, 'product.js')}
|
||||
|
||||
<%block name="header" />
|
||||
|
||||
@ -72,8 +77,7 @@
|
||||
${h.report_menu(request) | n }
|
||||
${h.entry_menu(request) | n }
|
||||
${h.employee_menu(request) | n }
|
||||
${h.account_menu(request) | n }
|
||||
${h.product_menu(request) | n }
|
||||
${h.master_menu(request) | n }
|
||||
${h.login_menu(request) | n }
|
||||
</div>
|
||||
<!--/.nav-collapse -->
|
||||
|
@ -1,10 +0,0 @@
|
||||
<ul class="nav">
|
||||
<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Accounts <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="${request.route_url('account_list')}">Accounts List</a></li>
|
||||
<li><a href="${request.route_url('account')}">Add New Account</a></li>
|
||||
<li><a href="${request.route_url('cost_center_list')}">Cost Center List</a></li>
|
||||
<li><a href="${request.route_url('cost_center')}">Add Cost Center</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
9
brewman/brewman/templates/nav_bar/master.mako
Normal file
9
brewman/brewman/templates/nav_bar/master.mako
Normal file
@ -0,0 +1,9 @@
|
||||
<ul class="nav">
|
||||
<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Masters <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="${request.route_url('account_list')}">Accounts</a></li>
|
||||
<li><a href="${request.route_url('cost_center_list')}">Cost Centers</a></li>
|
||||
<li><a href="${request.route_url('product_list')}">Products</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
@ -1,9 +0,0 @@
|
||||
<ul class="nav">
|
||||
<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Product <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="${request.route_url('product_list')}">Product List</a></li>
|
||||
<li><a href="${request.route_url('product')}">Add Product</a></li>
|
||||
<li><a href="${request.route_url('product')}">Recipe List</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
@ -1,38 +0,0 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:tal="http://xml.zope.org/namespaces/tal"
|
||||
xmlns:metal="http://xml.zope.org/namespaces/metal"
|
||||
metal:use-macro="base">
|
||||
<tal:block metal:fill-slot="content">
|
||||
<article tal:attributes="class pagecontentclass">
|
||||
<section>
|
||||
<h2 class="ribbon-header">Products</h2>
|
||||
<table id="gvGrid" class="clean-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="id hide">Product ID</th>
|
||||
<th class="code hide">Code</th>
|
||||
<th class="name">Name</th>
|
||||
<th class="units">Units</th>
|
||||
<th class="group">Group</th>
|
||||
<th class="discontinued">Discontinued?</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tbodyMain">
|
||||
<tr tal:repeat="item list">
|
||||
<td class="id hide">${item.id}</td>
|
||||
<td class="code hide">${item.code}</td>
|
||||
<td class="name"><a href="${request.route_url('product_id', id=item.id)}">${item.name}</a></td>
|
||||
<td class="units">${item.units}</td>
|
||||
<td class="group">${item.product_group.name}</td>
|
||||
<td class="IsActive">${item.discontinued}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot id="tfootMain">
|
||||
</tfoot>
|
||||
</table>
|
||||
|
||||
</section>
|
||||
</article>
|
||||
<!-- /Page content -->
|
||||
</tal:block>
|
||||
</html>
|
@ -22,7 +22,7 @@ def save_update(request):
|
||||
try:
|
||||
id = request.matchdict.get('id', None)
|
||||
if id is None:
|
||||
Ledger(0, request.json_body['Name'], int(request.json_body['Type']), request.json_body['IsActive'],
|
||||
item = Ledger(0, request.json_body['Name'], int(request.json_body['Type']), request.json_body['IsActive'],
|
||||
uuid.UUID(request.json_body['CostCenter']['CostCenterID'])).create()
|
||||
else:
|
||||
new_type = int(request.json_body['Type'])
|
||||
@ -35,8 +35,6 @@ def save_update(request):
|
||||
item.costcenter_id = uuid.UUID(request.json_body['CostCenter']['CostCenterID'])
|
||||
transaction.commit()
|
||||
return account_info(item.id)
|
||||
# url = request.route_url('account_list')
|
||||
# return HTTPFound(location=url)
|
||||
except ValidationError as ex:
|
||||
transaction.abort()
|
||||
response = Response("Failed validation: {0}".format(ex.message))
|
||||
|
@ -85,13 +85,15 @@ def show(request):
|
||||
|
||||
def user_info(id):
|
||||
if id is None:
|
||||
return {'Name': '', 'LockedOut': False, 'Groups': []}
|
||||
account = {'Name': '', 'LockedOut': False, 'Groups': []}
|
||||
for item in Group.list():
|
||||
account['Groups'].append({'GroupID': item.id, 'Name': item.name, 'Enabled': False})
|
||||
else:
|
||||
user = User.get_by_id(id)
|
||||
account = {'UserID': user.id, 'Name': user.name, 'Password': '', 'LockedOut': user.locked_out, 'Groups': []}
|
||||
for item in Group.list():
|
||||
account['Groups'].append(
|
||||
{'GroupID': item.id, 'Name': item.name, 'Enabled': True if item in user.groups else False})
|
||||
return account
|
||||
return account
|
||||
|
||||
|
||||
|
@ -23,14 +23,12 @@ def save_update(request):
|
||||
try:
|
||||
id = request.matchdict.get('id', None)
|
||||
if id is None:
|
||||
CostCenter(0, request.json_body['Name']).create()
|
||||
item = CostCenter(0, request.json_body['Name']).create()
|
||||
else:
|
||||
item = CostCenter.by_id(uuid.UUID(id))
|
||||
item.name = request.json_body['Name']
|
||||
transaction.commit()
|
||||
return cost_center_info(item.id)
|
||||
# url = request.route_url('account_list')
|
||||
# return HTTPFound(location=url)
|
||||
except ValidationError as ex:
|
||||
transaction.abort()
|
||||
response = Response("Failed validation: {0}".format(ex.message))
|
||||
|
@ -18,11 +18,8 @@ def entry_menu(request):
|
||||
def employee_menu(request):
|
||||
return render('brewman:templates/nav_bar/employee.pt', {'request': request})
|
||||
|
||||
def account_menu(request):
|
||||
return render('brewman:templates/nav_bar/account.mako', {'request': request})
|
||||
|
||||
def product_menu(request):
|
||||
return render('brewman:templates/nav_bar/product.pt', {'request': request})
|
||||
def master_menu(request):
|
||||
return render('brewman:templates/nav_bar/master.mako', {'request': request})
|
||||
|
||||
def login_menu(request):
|
||||
user_id = authenticated_userid(request)
|
||||
|
@ -1,83 +1,104 @@
|
||||
import datetime
|
||||
from decimal import Decimal
|
||||
import uuid
|
||||
|
||||
from pyramid.httpexceptions import HTTPFound
|
||||
from pyramid.renderers import render
|
||||
from pyramid.security import authenticated_userid
|
||||
from pyramid.view import view_config
|
||||
from sqlalchemy.sql.expression import or_
|
||||
import transaction
|
||||
from brewman.helpers import Literal
|
||||
|
||||
from brewman.models import DBSession
|
||||
from brewman.models.master import Product, CostCenter, Employee, AttendanceType, LedgerType
|
||||
from brewman.models.master import Product, CostCenter, LedgerType, Ledger, ProductGroup
|
||||
from brewman.models.validation_exception import ValidationError
|
||||
from brewman.models.voucher import Attendance
|
||||
|
||||
@view_config(request_method='GET', route_name='product_id', renderer='brewman:templates/product/edit.pt',
|
||||
permission='ProductsUpdate')
|
||||
@view_config(request_method='GET', route_name='product', renderer='brewman:templates/product/edit.pt',
|
||||
permission='ProductsCreate')
|
||||
def product_edit(request):
|
||||
id = request.matchdict.get('id', None)
|
||||
if id is None:
|
||||
item = Employee('(Auto)', '')
|
||||
else:
|
||||
item = Product.by_id(uuid.UUID(id))
|
||||
print(item.code)
|
||||
return {'title': 'Edit / Add Product',
|
||||
'pageclass': "page-blogpost page-sidebar-right",
|
||||
'pagecontentclass': "page-content grid_12",
|
||||
'page_header': '',
|
||||
'item': item,
|
||||
'types': LedgerType.list(),
|
||||
'cost_centers': CostCenter.list()}
|
||||
@view_config(route_name='product_list', renderer='brewman:templates/angular_base.mako', permission='Products')
|
||||
@view_config(request_method='GET', route_name='product_id', renderer='brewman:templates/angular_base.mako',
|
||||
xhr=False, permission='ProductsUpdate')
|
||||
@view_config(request_method='GET', route_name='product', renderer='brewman:templates/angular_base.mako',
|
||||
xhr=False, permission='ProductsUpdate')
|
||||
def html(request):
|
||||
return {}
|
||||
|
||||
|
||||
@view_config(request_method='POST', route_name='product_id', permission='ProductsUpdate')
|
||||
@view_config(request_method='POST', route_name='product', permission='ProductsCreate')
|
||||
def employee_submit(request):
|
||||
@view_config(request_method='POST', route_name='product_id', renderer='json', xhr=True)
|
||||
@view_config(request_method='POST', route_name='product', renderer='json', xhr=True)
|
||||
def save_update(request):
|
||||
try:
|
||||
id = request.matchdict.get('id', None)
|
||||
if id is None:
|
||||
is_active = True if request.POST.has_key('is_active') else False
|
||||
joining_date = datetime.datetime.strptime(request.POST['joining_date'], '%d-%b-%Y')
|
||||
leaving_date = None if is_active else datetime.datetime.strptime(request.POST['leaving_date'], '%d-%b-%Y')
|
||||
Employee(0, request.POST['name'], 10, None, is_active, uuid.UUID(request.POST['cost_center_id']),
|
||||
request.POST['designation'], int(request.POST['salary']), int(request.POST['service_points']),
|
||||
joining_date, leaving_date).create()
|
||||
request.session.flash('Employee created')
|
||||
item = Product(0, request.json_body['Name'], request.json_body['Units'],
|
||||
Decimal(request.json_body['Fraction']), request.json_body['FractionUnits'],
|
||||
Decimal(request.json_body['Yeild']), request.json_body['ShowForPurchase'],
|
||||
uuid.UUID(request.json_body['ProductGroup']['ProductGroupID']), Ledger.all_purchases(),
|
||||
Decimal(request.json_body['Price']), request.json_body['Discontinued']).create()
|
||||
else:
|
||||
item = Employee.by_id(uuid.UUID(id))
|
||||
item.name = request.POST['name']
|
||||
item.is_active = True if request.POST.has_key('is_active') else False
|
||||
item.costcenter_id = uuid.UUID(request.POST['cost_center_id'])
|
||||
item.designation = request.POST['designation']
|
||||
item.salary = int(request.POST['salary'])
|
||||
item.service_points = int(request.POST['service_points'])
|
||||
item.joining_date = datetime.datetime.strptime(request.POST['joining_date'], '%d-%b-%Y')
|
||||
item.leaving_date = None if item.is_active else datetime.datetime.strptime(request.POST['leaving_date'],
|
||||
'%d-%b-%Y')
|
||||
request.session.flash('Employee Updated')
|
||||
item = Product.by_id(uuid.UUID(id))
|
||||
item.name = request.json_body['Name']
|
||||
item.units = request.json_body['Units']
|
||||
item.fraction = Decimal(request.json_body['Fraction'])
|
||||
item.fraction_units = request.json_body['FractionUnits']
|
||||
item.yeild = Decimal(request.json_body['Yeild'])
|
||||
item.show_for_purchase = request.json_body['ShowForPurchase']
|
||||
item.product_group_id = uuid.UUID(request.json_body['ProductGroup']['ProductGroupID'])
|
||||
item.ledger_id = Ledger.all_purchases()
|
||||
item.price = Decimal(request.json_body['Price'])
|
||||
item.discontinued = request.json_body['Discontinued']
|
||||
|
||||
transaction.commit()
|
||||
url = request.route_url('employee_list')
|
||||
return HTTPFound(location=url)
|
||||
return product_info(item.id)
|
||||
except ValidationError as ex:
|
||||
request.session.flash(ex)
|
||||
transaction.abort()
|
||||
request.session.flash(ex.message)
|
||||
return request
|
||||
response = Response("Failed validation: {0}".format(ex.message))
|
||||
response.status_int = 500
|
||||
return response
|
||||
|
||||
|
||||
@view_config(route_name='product_list', renderer='brewman:templates/product/list.pt', permission='Products')
|
||||
def employee_list(request):
|
||||
dbsession = DBSession()
|
||||
list = dbsession.query(Product)\
|
||||
.order_by(Product.discontinued)\
|
||||
.all()
|
||||
@view_config(request_method='DELETE', route_name='product_id', renderer='json', xhr=True)
|
||||
def delete(request):
|
||||
id = request.matchdict.get('id', None)
|
||||
if id is None:
|
||||
response = Response("Product is Null")
|
||||
response.status_int = 500
|
||||
return response
|
||||
else:
|
||||
response = Response("Product deletion not implemented")
|
||||
response.status_int = 500
|
||||
return response
|
||||
|
||||
return {'title': 'Products',
|
||||
'pageclass': "page-blogpost page-sidebar-right",
|
||||
'pagecontentclass': "page-content grid_12",
|
||||
'page_header': '',
|
||||
'list': list}
|
||||
|
||||
@view_config(request_method='GET', route_name='product_id', renderer='json', xhr=True)
|
||||
@view_config(request_method='GET', route_name='product', renderer='json', xhr=True)
|
||||
def show(request):
|
||||
list = request.GET.get('list', None)
|
||||
|
||||
if list:
|
||||
list = Product.query().order_by(Product.discontinued).order_by(Product.product_group_id).order_by(
|
||||
Product.name).all()
|
||||
products = []
|
||||
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)})
|
||||
return products
|
||||
else:
|
||||
id = request.matchdict.get('id', None)
|
||||
id = None if id is None else uuid.UUID(id)
|
||||
return product_info(id)
|
||||
|
||||
|
||||
@view_config(request_method='GET', route_name='product_group_list', renderer='json', xhr=True)
|
||||
def product_group_list(request):
|
||||
product_groups = []
|
||||
for item in ProductGroup.list():
|
||||
product_groups.append({'ProductGroupID': item.id, 'Name': item.name})
|
||||
return product_groups
|
||||
|
||||
|
||||
def product_info(id):
|
||||
if id is None:
|
||||
product = {'Code': '(Auto)', 'Type': LedgerType.by_name('Creditors').id, 'IsActive': True,
|
||||
'CostCenter': CostCenter.overall()}
|
||||
else:
|
||||
product = Product.by_id(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},
|
||||
'Ledger': {'LedgerID': product.ledger_id}, 'Price': product.price}
|
||||
return product
|
||||
|
Loading…
x
Reference in New Issue
Block a user