From 517b56431acfc902a9cf984eb6c4ae3dfe41e145 Mon Sep 17 00:00:00 2001 From: Tanshu Date: Tue, 20 Nov 2012 23:21:10 +0530 Subject: [PATCH] Removed redundant operations. Removed Unnecessary update in Journal model. Added refresh button to Unposted page. Base, Account, Attendance, Journal, Login, Logout, Unposted, Controllers are Minifiable. Modal Service and Directives are Minifiable. Fixed EmployeeAttendanceCtrl. Fixed Save Account. Added validation to vouchers. Added rounding to Journal Voucher. Purchase now updates product price. --- brewman/brewman/models/operations.py | 90 ------------------- brewman/brewman/models/voucher.py | 3 - .../brewman/static/partial/credit-esi-pf.html | 88 ++++++++++++++++++ brewman/brewman/static/partial/login.html | 4 +- .../brewman/static/partial/trial-balance.html | 2 +- brewman/brewman/static/partial/unposted.html | 2 +- brewman/brewman/static/scripts/account.js | 24 ++--- .../static/scripts/angular_directive.js | 16 ++-- brewman/brewman/static/scripts/attendance.js | 12 +-- brewman/brewman/static/scripts/default.js | 29 ++++++ .../static/scripts/employee-attendance.js | 4 +- brewman/brewman/static/scripts/journal.js | 8 +- brewman/brewman/static/scripts/login.js | 9 +- .../brewman/static/scripts/modal-service.js | 4 +- brewman/brewman/static/scripts/overlord.js | 30 ++++--- brewman/brewman/static/scripts/unposted.js | 18 ++-- brewman/brewman/views/account.py | 2 +- brewman/brewman/views/auth/group.py | 1 + brewman/brewman/views/reports/ledger.py | 3 +- .../brewman/views/services/voucher/issue.py | 6 +- .../brewman/views/services/voucher/journal.py | 23 ++--- .../views/services/voucher/purchase.py | 20 +++-- .../views/services/voucher/purchase_return.py | 6 +- serve.cmd | 1 - 24 files changed, 228 insertions(+), 177 deletions(-) create mode 100644 brewman/brewman/static/partial/credit-esi-pf.html create mode 100644 brewman/brewman/static/scripts/default.js delete mode 100644 serve.cmd diff --git a/brewman/brewman/models/operations.py b/brewman/brewman/models/operations.py index a31ce084..f8b135cc 100644 --- a/brewman/brewman/models/operations.py +++ b/brewman/brewman/models/operations.py @@ -1,100 +1,10 @@ from datetime import datetime -from sqlalchemy.sql.expression import func from brewman.models import DBSession from brewman.models.master import CostCenter from brewman.models.validation_exception import ValidationError -from brewman.models.voucher import Voucher, Batch __author__ = 'tanshu' -def create_basic(voucher): - voucher.creation_date = datetime.now() - voucher.last_edit_date = datetime.now() - DBSession.add(voucher) - DBSession.flush() - - -def update_basic(voucher): - voucher.last_edit_date = datetime.now() - DBSession.add(voucher) - DBSession.flush() - - -def create_journal_voucher(voucher): - journals_valid(voucher) - create_basic(voucher) - for item in voucher.journals: - item.voucher_id = voucher.id - DBSession.add(item) - DBSession.flush() - - -def update_journal_voucher(voucher): - journals_valid(voucher) - update_basic(voucher) - - -def validate_new_purchase_voucher(voucher): - journals_valid(voucher) - for item in voucher.inventories: - batch = item.batch - if not batch.id is None: - raise ValidationError("New Purchase cannot have a Batch") - - -def update_purchase_voucher(voucher): - journals_valid(voucher) - # integrity has been checked by purchase update controller - update_basic(voucher) - DBSession.flush() - - -def create(voucher): - validate(voucher) - voucher.creation_date = datetime.now() - voucher.last_edit_date = datetime.now() - DBSession.add(voucher) - DBSession.flush() - for item in voucher.journals: - item.voucher_id = voucher.id - DBSession.add(item) - DBSession.flush() - - consuming = None - for item in voucher.inventories: - item.voucher_id = voucher.id - if item.batch.id == None: - if voucher.type == 2: # new purchase - item.batch.quantity_remaining = item.quantity - DBSession.add(item.batch) - DBSession.flush() - else: - raise ValidationError("This is not possible, no batch on entries other than new purchase") - else: - if voucher.type == 9: - raise ValidationError("Verification Vouchers have been disabled") - elif voucher.type == 6: - # Purchase Return - item.batch.quantity_remaining -= item.quantity - elif voucher.type == 2: - # Purchase - raise ValidationError("This is not possible, batch entries on new purchase") - elif voucher.type == 3: - # Issue - if consuming is None: - consuming = filter(lambda x: x.cost_center_id == CostCenter.cost_center_purchase(), - voucher.journals) - if not len(consuming): - consuming = 0 - else: - consuming = consuming[0].debit - item.batch.quantity_remaining += item.quantity * consuming - - item.batch_id = item.batch.id - DBSession.add(item) - DBSession.flush() - - def validate(voucher): journals_valid(voucher) if voucher.type in [2, 3, 6]: diff --git a/brewman/brewman/models/voucher.py b/brewman/brewman/models/voucher.py index de5bd197..8469b6a6 100644 --- a/brewman/brewman/models/voucher.py +++ b/brewman/brewman/models/voucher.py @@ -112,9 +112,6 @@ class Journal(Base): def query(cls): return DBSession.query(cls) - def update(self): - DBSession.flush() - class VoucherType: def __init__(self, id, name): diff --git a/brewman/brewman/static/partial/credit-esi-pf.html b/brewman/brewman/static/partial/credit-esi-pf.html new file mode 100644 index 00000000..e3d182ae --- /dev/null +++ b/brewman/brewman/static/partial/credit-esi-pf.html @@ -0,0 +1,88 @@ +
+ Credit Esi Pf +
+ + +
+ +
+
+
+ + +
+ + + + +
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDesignationDepartmentGross SalaryDays WorkedEsi EEPf EEEsi ERPf ERDeleteDelete
{{deduction.Employee.Name}}{{deduction.Employee.Designation}}{{deduction.Employee.Department}}{{deduction.GrossSalary}}{{deduction.DaysWorked}}{{deduction.EsiEmployee}}{{deduction.PfEmployee}}{{deduction.EsiEmployer}}{{deduction.PfEmployer}} + +
+
+
+
+ + +
+ +
+
+
+ + + +
+
+ Created on {{voucher.CreationDate}} and Last Edited on {{voucher.LastEditDate}} by {{voucher.User.Name}}. Posted + by {{voucher.Poster}} +
+
diff --git a/brewman/brewman/static/partial/login.html b/brewman/brewman/static/partial/login.html index 25de278a..94422ef1 100644 --- a/brewman/brewman/static/partial/login.html +++ b/brewman/brewman/static/partial/login.html @@ -23,10 +23,10 @@
- +
- +
diff --git a/brewman/brewman/static/partial/trial-balance.html b/brewman/brewman/static/partial/trial-balance.html index 0ece9409..a362ced8 100644 --- a/brewman/brewman/static/partial/trial-balance.html +++ b/brewman/brewman/static/partial/trial-balance.html @@ -4,7 +4,7 @@
- +
diff --git a/brewman/brewman/static/partial/unposted.html b/brewman/brewman/static/partial/unposted.html index c749fae4..0fdc20de 100644 --- a/brewman/brewman/static/partial/unposted.html +++ b/brewman/brewman/static/partial/unposted.html @@ -1,5 +1,5 @@
- Unposted Entries + Unposted Entries Refresh
diff --git a/brewman/brewman/static/scripts/account.js b/brewman/brewman/static/scripts/account.js index dd346213..d5def3fe 100644 --- a/brewman/brewman/static/scripts/account.js +++ b/brewman/brewman/static/scripts/account.js @@ -1,10 +1,10 @@ 'use strict'; -function AccountListCtrl($scope, accounts) { +var AccountListCtrl = ['$scope', 'accounts', function ($scope, accounts) { $scope.info = accounts; -} +}]; AccountListCtrl.resolve = { - accounts:function ($q, $route, Account) { + accounts:['$q', '$route', 'Account', function ($q, $route, Account) { var deferred = $q.defer(); var successCb = function (result) { @@ -13,10 +13,10 @@ AccountListCtrl.resolve = { Account.query({}, successCb); return deferred.promise; - } + }] }; -function AccountCtrl($scope, $location, account, account_types, cost_centers) { +var AccountCtrl = ['$scope', '$location', 'account', 'account_types', 'cost_centers', function ($scope, $location, account, account_types, cost_centers) { $scope.account = account; $scope.account_types = account_types; @@ -41,10 +41,10 @@ function AccountCtrl($scope, $location, account, account_types, cost_centers) { }; $('#txtName').focus(); -} +}] AccountCtrl.resolve = { - account:function ($q, $route, Account) { + account:['$q', '$route', 'Account', function ($q, $route, Account) { var deferred = $q.defer(); var id = $route.current.params.id; @@ -54,8 +54,8 @@ AccountCtrl.resolve = { Account.get({id: id}, successCb); return deferred.promise; - }, - account_types:function ($q, $route, AccountType) { + }], + account_types:['$q', 'AccountType', function ($q, AccountType) { var deferred = $q.defer(); var successCb = function (result) { @@ -64,8 +64,8 @@ AccountCtrl.resolve = { AccountType.query({}, successCb); return deferred.promise; - }, - cost_centers:function ($q, $route, CostCenter) { + }], + cost_centers:['$q', 'CostCenter', function ($q, CostCenter) { var deferred = $q.defer(); var successCb = function (result) { @@ -74,5 +74,5 @@ AccountCtrl.resolve = { CostCenter.query({}, successCb); return deferred.promise; - } + }] }; diff --git a/brewman/brewman/static/scripts/angular_directive.js b/brewman/brewman/static/scripts/angular_directive.js index 802d9845..5553d3ca 100644 --- a/brewman/brewman/static/scripts/angular_directive.js +++ b/brewman/brewman/static/scripts/angular_directive.js @@ -1,7 +1,7 @@ 'use strict'; var overlord_directive = angular.module('overlord.directive', []); -overlord_directive.directive('ngAutocomplete', function ($q, $parse) { +overlord_directive.directive('ngAutocomplete', ['$q', '$parse', function ($q, $parse) { return { restrict:'A', link:function (scope, element, attrs, ngModel) { @@ -31,9 +31,9 @@ overlord_directive.directive('ngAutocomplete', function ($q, $parse) { }); } }; -}); +}]); -overlord_directive.directive('datepicker', function ($parse) { +overlord_directive.directive('datepicker', ['$parse', function ($parse) { return { restrict:'E', replace:true, @@ -53,7 +53,7 @@ overlord_directive.directive('datepicker', function ($parse) { }); } }; -}); +}]); overlord_directive.directive('fadey', function () { return { @@ -76,7 +76,7 @@ overlord_directive.directive('fadey', function () { }; }); -overlord_directive.directive('ngConfirm', function (modal, $parse) { +overlord_directive.directive('ngConfirm', ['modal', '$parse', function (modal, $parse) { return { restrict:'A', link:function postLink(scope, element, attrs) { @@ -102,7 +102,7 @@ overlord_directive.directive('ngConfirm', function (modal, $parse) { } }; -}); +}]); (function (angular) { /* @@ -161,7 +161,7 @@ overlord_directive.directive('journal-edit', function () { }; }); -overlord_directive.directive('ngEditRepeat', function (modal, $parse) { +overlord_directive.directive('ngEditRepeat', ['modal','$parse', function (modal, $parse) { return { restrict:'E', template:'' + @@ -195,5 +195,5 @@ overlord_directive.directive('ngEditRepeat', function (modal, $parse) { } } }; -}); +}]); diff --git a/brewman/brewman/static/scripts/attendance.js b/brewman/brewman/static/scripts/attendance.js index 2fdb98f4..c6da4e03 100644 --- a/brewman/brewman/static/scripts/attendance.js +++ b/brewman/brewman/static/scripts/attendance.js @@ -1,6 +1,6 @@ 'use strict'; -function AttendanceCtrl($scope, $location, Attendance, attendance_types, info) { +var AttendanceCtrl = ['$scope', '$location', 'Attendance', 'attendance_types', 'info', function ($scope, $location, Attendance, attendance_types, info) { $scope.attendance_types = attendance_types; $scope.info = info; $scope.show = function () { @@ -14,9 +14,9 @@ function AttendanceCtrl($scope, $location, Attendance, attendance_types, info) { }); }; $('#txtDate').focus(); -} +}]; AttendanceCtrl.resolve = { - info:function ($q, $route, Attendance) { + info:['$q', '$route', 'Attendance', function ($q, $route, Attendance) { var deferred = $q.defer(); var date = $route.current.params.date; var successCb = function (result) { @@ -29,13 +29,13 @@ AttendanceCtrl.resolve = { Attendance.get({date:date}, successCb); } return deferred.promise; - }, - attendance_types:function ($q, AttendanceTypes) { + }], + attendance_types:['$q', 'AttendanceTypes', function ($q, AttendanceTypes) { var deferred = $q.defer(); var successCb = function (result) { deferred.resolve(result); }; AttendanceTypes.query({}, successCb); return deferred.promise; - } + }] }; \ No newline at end of file diff --git a/brewman/brewman/static/scripts/default.js b/brewman/brewman/static/scripts/default.js new file mode 100644 index 00000000..bbd3f626 --- /dev/null +++ b/brewman/brewman/static/scripts/default.js @@ -0,0 +1,29 @@ +'use strict';var overlord=angular.module("overlord",["overlord.directive","overlord.filter","overlord.service","ngCookies"]).config(["$routeProvider","$locationProvider",function(a,c){a.when("/",{templateUrl:"/partial/home.html"}).when("/login",{templateUrl:"/partial/login.html",controller:LoginCtrl}).when("/logout",{templateUrl:"/partial/home.html",controller:LogoutCtrl}).when("/Journal",{templateUrl:"/partial/journal.html",controller:JournalCtrl,resolve:JournalCtrl.resolve}).when("/Journal/:id", +{templateUrl:"/partial/journal.html",controller:JournalCtrl,resolve:JournalCtrl.resolve}).when("/Payment",{templateUrl:"/partial/payment.html",controller:PaymentCtrl,resolve:PaymentCtrl.resolve}).when("/Payment/:id",{templateUrl:"/partial/payment.html",controller:PaymentCtrl,resolve:PaymentCtrl.resolve}).when("/Receipt",{templateUrl:"/partial/receipt.html",controller:ReceiptCtrl,resolve:ReceiptCtrl.resolve}).when("/Receipt/:id",{templateUrl:"/partial/receipt.html",controller:ReceiptCtrl,resolve:ReceiptCtrl.resolve}).when("/Purchase", +{templateUrl:"/partial/purchase.html",controller:PurchaseCtrl,resolve:PurchaseCtrl.resolve}).when("/Purchase/:id",{templateUrl:"/partial/purchase.html",controller:PurchaseCtrl,resolve:PurchaseCtrl.resolve}).when("/Return",{templateUrl:"/partial/purchase-return.html",controller:PurchaseReturnCtrl,resolve:PurchaseReturnCtrl.resolve}).when("/Return/:id",{templateUrl:"/partial/purchase-return.html",controller:PurchaseReturnCtrl,resolve:PurchaseReturnCtrl.resolve}).when("/Issue",{templateUrl:"/partial/issue.html", +controller:IssueCtrl,resolve:IssueCtrl.resolve}).when("/Issue/:id",{templateUrl:"/partial/issue.html",controller:IssueCtrl,resolve:IssueCtrl.resolve}).when("/Ledger",{templateUrl:"/partial/ledger.html",controller:LedgerCtrl,resolve:LedgerCtrl.resolve}).when("/Ledger/:id",{templateUrl:"/partial/ledger.html",controller:LedgerCtrl,resolve:LedgerCtrl.resolve}).when("/ProductLedger",{templateUrl:"/partial/product-ledger.html",controller:ProductLedgerCtrl,resolve:ProductLedgerCtrl.resolve}).when("/ProductLedger/:id", +{templateUrl:"/partial/product-ledger.html",controller:ProductLedgerCtrl,resolve:ProductLedgerCtrl.resolve}).when("/CashFlow",{templateUrl:"/partial/cash-flow.html",controller:CashFlowCtrl,resolve:CashFlowCtrl.resolve}).when("/CashFlow/:id",{templateUrl:"/partial/cash-flow.html",controller:CashFlowCtrl,resolve:CashFlowCtrl.resolve}).when("/RawMaterialCost",{templateUrl:"/partial/raw-material-cost.html",controller:RawMaterialCostCtrl,resolve:RawMaterialCostCtrl.resolve}).when("/RawMaterialCost/:id", +{templateUrl:"/partial/raw-material-cost-detail.html",controller:RawMaterialCostCtrl,resolve:RawMaterialCostCtrl.resolve}).when("/Attendance",{templateUrl:"/partial/attendance.html",controller:AttendanceCtrl,resolve:AttendanceCtrl.resolve}).when("/Attendance/:date",{templateUrl:"/partial/attendance.html",controller:AttendanceCtrl,resolve:AttendanceCtrl.resolve}).when("/EmployeeAttendance",{templateUrl:"/partial/employee-attendance.html",controller:EmployeeAttendanceCtrl,resolve:EmployeeAttendanceCtrl.resolve}).when("/EmployeeAttendance/:id", +{templateUrl:"/partial/employee-attendance.html",controller:EmployeeAttendanceCtrl,resolve:EmployeeAttendanceCtrl.resolve}).when("/Daybook",{templateUrl:"/partial/daybook.html",controller:DaybookCtrl,resolve:DaybookCtrl.resolve}).when("/Unposted",{templateUrl:"/partial/unposted.html",controller:UnpostedCtrl,resolve:UnpostedCtrl.resolve}).when("/ProfitLoss",{templateUrl:"/partial/profit-loss.html",controller:ProfitLossCtrl,resolve:ProfitLossCtrl.resolve}).when("/PurchaseEntries",{templateUrl:"/partial/purchase-entries.html", +controller:PurchaseEntriesCtrl,resolve:PurchaseEntriesCtrl.resolve}).when("/EmployeeFunctions",{templateUrl:"/partial/employee-functions.html",controller:EmployeeFunctionsCtrl}).when("/TrialBalance",{templateUrl:"/partial/trial-balance.html",controller:TrialBalanceCtrl,resolve:TrialBalanceCtrl.resolve}).when("/TrialBalance/:date",{templateUrl:"/partial/trial-balance.html",controller:TrialBalanceCtrl,resolve:TrialBalanceCtrl.resolve}).when("/ClosingStock",{templateUrl:"/partial/closing-stock.html", +controller:ClosingStockCtrl,resolve:ClosingStockCtrl.resolve}).when("/ClosingStock/:date",{templateUrl:"/partial/closing-stock.html",controller:ClosingStockCtrl,resolve:ClosingStockCtrl.resolve}).when("/Accounts",{templateUrl:"/partial/account-list.html",controller:AccountListCtrl,resolve:AccountListCtrl.resolve}).when("/Account",{templateUrl:"/partial/account-detail.html",controller:AccountCtrl,resolve:AccountCtrl.resolve}).when("/Account/:id",{templateUrl:"/partial/account-detail.html",controller:AccountCtrl, +resolve:AccountCtrl.resolve}).when("/Employees",{templateUrl:"/partial/employee-list.html",controller:EmployeeListCtrl,resolve:EmployeeListCtrl.resolve}).when("/Employee",{templateUrl:"/partial/employee-detail.html",controller:EmployeeCtrl,resolve:EmployeeCtrl.resolve}).when("/Employee/:id",{templateUrl:"/partial/employee-detail.html",controller:EmployeeCtrl,resolve:EmployeeCtrl.resolve}).when("/CostCenters",{templateUrl:"/partial/cost-center-list.html",controller:CostCenterListCtrl,resolve:CostCenterListCtrl.resolve}).when("/CostCenter", +{templateUrl:"/partial/cost-center-detail.html",controller:CostCenterCtrl,resolve:CostCenterCtrl.resolve}).when("/CostCenter/:id",{templateUrl:"/partial/cost-center-detail.html",controller:CostCenterCtrl,resolve:CostCenterCtrl.resolve}).when("/Products",{templateUrl:"/partial/product-list.html",controller:ProductListCtrl,resolve:ProductListCtrl.resolve}).when("/Product",{templateUrl:"/partial/product-detail.html",controller:ProductCtrl,resolve:ProductCtrl.resolve}).when("/Product/:id",{templateUrl:"/partial/product-detail.html", +controller:ProductCtrl,resolve:ProductCtrl.resolve}).when("/ProductGroups",{templateUrl:"/partial/product-group-list.html",controller:ProductGroupListCtrl,resolve:ProductGroupListCtrl.resolve}).when("/ProductGroup",{templateUrl:"/partial/product-group-detail.html",controller:ProductGroupCtrl,resolve:ProductGroupCtrl.resolve}).when("/ProductGroup/:id",{templateUrl:"/partial/product-group-detail.html",controller:ProductGroupCtrl,resolve:ProductGroupCtrl.resolve}).when("/Users",{templateUrl:"/partial/user-list.html", +controller:UserListCtrl,resolve:UserListCtrl.resolve}).when("/User",{templateUrl:"/partial/user-detail.html",controller:UserCtrl,resolve:UserCtrl.resolve}).when("/User/:id",{templateUrl:"/partial/user-detail.html",controller:UserCtrl,resolve:UserCtrl.resolve}).when("/Groups",{templateUrl:"/partial/group-list.html",controller:GroupListCtrl,resolve:GroupListCtrl.resolve}).when("/Group",{templateUrl:"/partial/group-detail.html",controller:GroupCtrl,resolve:GroupCtrl.resolve}).when("/Group/:id",{templateUrl:"/partial/group-detail.html", +controller:GroupCtrl,resolve:GroupCtrl.resolve}).when("/Clients",{templateUrl:"/partial/client-list.html",controller:ClientCtrl,resolve:ClientCtrl.resolve}).otherwise({templateUrl:"/partial/404.html"});c.html5Mode(!0).hashPrefix("!")}]).config(["$httpProvider",function(a){a.responseInterceptors.push("spinnerInterceptor");a.defaults.transformRequest.push(function(a,b){var d=angular.injector(["ng"]).get("$rootScope");"application/json"===b()["Content-Type"]&&d&&d.$broadcast("spinnerStart","http");return a})}]).factory("spinnerInterceptor", +["$q","$rootScope",function(a,c){return function(b){return b.then(function(a){"application/json; charset=utf-8"===a.headers()["content-type"]&&c.$broadcast("spinnerStop","http");return a},function(b){var e="application/json; charset=utf-8"===b.headers()["content-type"];e&&c.$broadcast("spinnerStop","http");401==b.status&&!e&&c.$broadcast("event:loginRequired");return a.reject(b)})}}]); +overlord.controller("BaseCtrl",["$rootScope","$scope","Auth","$location","$routeParams",function(a,c,b,d,e){a.spinner={http:0,route:!1};a.$on("event:loginRequired",function(){if(a.auth.isAuthenticated)d.path("/");else{var b=e.came_from;"undefined"===typeof b&&"/login"!==d.path()&&(b=d.path());d.path("/login").search({came_from:b})}});c.$on("spinnerStart",function(b,c){"http"===c?a.spinner.http+=1:a.spinner.route=!1;$("#spinner").show()});c.$on("spinnerStop",function(b,c){"http"===c?a.spinner.http-= +1:a.spinner.route=!1;0>=a.spinner.http&&!1===a.spinner.route&&$("#spinner").hide()});c.toasts=[];c.clearToast=function(a){var b=c.toasts.indexOf(a);-1!==b&&this.destroy(function(){c.toasts.splice(b,1)})};a.$on("$routeChangeStart",function(){a.$broadcast("spinnerStart","route");b.get(function(b){a.auth=b;a.perms=b.perms})});a.$on("$routeChangeSuccess",function(){a.$broadcast("spinnerStop","route")});a.$on("$routeChangeError",function(){a.$broadcast("spinnerStop","route")})}]); +var overlord_directive=angular.module("overlord.directive",[]);overlord_directive.directive("ngAutocomplete",["$q","$parse",function(a,c){return{restrict:"A",link:function(b,d,e){d.autocomplete({source:function(c,d){var f=angular.injector(["overlord.service"]).get(e.resource),h=a.defer();h.promise.then(function(a){d(a)});f.autocomplete({term:c.term,count:20},function(a){b.$apply(function(){h.resolve(a)})})},minLength:1,autoFocus:!0,select:function(a,d){var f=c(e.model).assign;f(b,d.item.model);b.$apply()}})}}}]); +overlord_directive.directive("datepicker",["$parse",function(a){return{restrict:"E",replace:!0,transclude:!0,template:'',link:function(c,b,d){b.datepicker({dateFormat:"dd-M-yy",showOtherMonths:!0,selectOtherMonths:!0,onSelect:function(b){var g=a(d.model).assign;g(c,b);c.$apply()}})}}}]);overlord_directive.directive("fadey",function(){return{restrict:"A",link:function(a,c){c=jQuery(c);c.hide();c.fadeIn(500);a.destroy=function(b){c.fadeOut(500,function(){b&&b.apply(a)})}}}}); +overlord_directive.directive("ngConfirm",["modal","$parse",function(a,c){return{restrict:"A",link:function(b,d,e){var g={};"undefined"!==typeof e.url?d.bind("click",function(){if("undefined"!==typeof e.before){var d=c(e.before);b.$apply(function(){d(b)})}a.template(e.url,e.onAction,e.onCancel,b,g)}):d.bind("click",function(){a.confirm(e.title,e.actionText,{text:e.actionButtonText,click:e.actionFunction,"class":e["class"]},{text:e.cancelButtonText,click:e.cancelFunction},b,g)})}}}]); +(function(){var a={transclude:"element",priority:1E3,terminal:!0,compile:function(a,b,d){return function(a,b,c){b[0].doNotMove=!0;var f,h;a.$watch(c.ngmIf,function(c){f&&(f.remove(),f=null);h&&h.$destroy();c&&(h=a.$new(),d(h,function(a){f=a;b.after(a)}));b.parent().trigger("$childrenChanged")})}}};overlord_directive.directive("ngmIf",function(){return a})})(angular); +overlord_directive.directive("journal-edit",function(){return{restrict:"A",replace:!0,transclude:!0,templateUrl:"/partial/journal-modal.html",link:function(a,c,b){c.bind("click",function(){modal.confirm(b.title,b.actionText,{text:b.actionButtonText,click:b.actionFunction,"class":b["class"]},{text:b.cancelButtonText,click:b.cancelFunction},a,options)})}}}); +overlord_directive.directive("ngEditRepeat",["modal","$parse",function(a,c){return{restrict:"E",template:'',link:function(b, +d,e){var g={};"undefined"!==typeof e.url?d.bind("click",function(){if("undefined"!==typeof e.before){var d=c(e.before);b.$apply(function(){d(b)})}a.template(e.url,e.onAction,e.onCancel,b,g)}):d.bind("click",function(){a.confirm(e.title,e.actionText,{text:e.actionButtonText,click:e.actionFunction,"class":e["class"]},{text:e.cancelButtonText,click:e.cancelFunction},b,g)})}}}]); +var AttendanceCtrl=["$scope","$location","Attendance","attendance_types","info",function(a,c,b,d,e){a.attendance_types=d;a.info=e;a.show=function(){c.path("/Attendance/"+a.info.Date)};a.save=function(){a.info.$save(function(b){a.toasts.push({Type:"Success",Message:b.Code})},function(b){a.toasts.push({Type:"Error",Message:b.data})})};$("#txtDate").focus()}]; +AttendanceCtrl.resolve={info:["$q","$route","Attendance",function(a,c,b){var d=a.defer(),a=c.current.params.date,c=function(a){d.resolve(a)};"undefined"===typeof a?b.get({},c):b.get({date:a},c);return d.promise}],attendance_types:["$q","AttendanceTypes",function(a,c){var b=a.defer();c.query({},function(a){b.resolve(a)});return b.promise}]};var AccountListCtrl=["$scope","accounts",function(a,c){a.info=c}]; +AccountListCtrl.resolve={accounts:["$q","$route","Account",function(a,c,b){var d=a.defer();b.query({},function(a){d.resolve(a)});return d.promise}]}; +var AccountCtrl=["$scope","$location","account","account_types","cost_centers",function(a,c,b,d,e){a.account=b;a.account_types=d;a.cost_centers=e;a.save=function(){a.account.$save(function(){a.toasts.push({Type:"Success",Message:""});c.path("/Accounts")},function(b){a.toasts.push({Type:"Error",Message:b.data})})};a.delete=function(){a.account.$delete(function(){a.toasts.push({Type:"Success",Message:""});c.path("/Accounts")},function(b){a.toasts.push({Type:"Error",Message:b.data})})};$("#txtName").focus()}]; +AccountCtrl.resolve={account:["$q","$route","Account",function(a,c,b){var d=a.defer();b.get({id:c.current.params.id},function(a){d.resolve(a)});return d.promise}],account_types:["$q","AccountType",function(a,c){var b=a.defer();c.query({},function(a){b.resolve(a)});return b.promise}],cost_centers:["$q","CostCenter",function(a,c){var b=a.defer();c.query({},function(a){b.resolve(a)});return b.promise}]}; \ No newline at end of file diff --git a/brewman/brewman/static/scripts/employee-attendance.js b/brewman/brewman/static/scripts/employee-attendance.js index 485c0667..ae181bb1 100644 --- a/brewman/brewman/static/scripts/employee-attendance.js +++ b/brewman/brewman/static/scripts/employee-attendance.js @@ -1,10 +1,10 @@ 'use strict'; -function EmployeeAttendanceCtrl($scope, $location, EmployeeAttendance, attendance_types, info) { +function EmployeeAttendanceCtrl($scope, $location, $routeParams, EmployeeAttendance, attendance_types, info) { $scope.attendance_types = attendance_types; $scope.info = info; $scope.show = function () { - var id = $scope.info.Ledger.LedgerID; + var id = $scope.info.Employee.LedgerID; var start_date = $scope.info.StartDate; var finish_date = $scope.info.FinishDate; if (id == $routeParams.id && start_date == $routeParams.StartDate && finish_date == $routeParams.FinishDate) { diff --git a/brewman/brewman/static/scripts/journal.js b/brewman/brewman/static/scripts/journal.js index d6b042c9..7ad2a8bd 100644 --- a/brewman/brewman/static/scripts/journal.js +++ b/brewman/brewman/static/scripts/journal.js @@ -1,6 +1,6 @@ 'use strict'; -function JournalCtrl($scope, $location, voucher) { +var JournalCtrl = ['$scope', '$location', 'voucher', function ($scope, $location, voucher) { $scope.voucher = voucher; $scope.name = ''; $scope.debit = 1; @@ -121,10 +121,10 @@ function JournalCtrl($scope, $location, voucher) { } } } -} +}] JournalCtrl.resolve = { - voucher:function ($q, $route, Voucher) { + voucher:['$q', '$route', 'Voucher', function ($q, $route, Voucher) { var deferred = $q.defer(); var id = $route.current.params.id; @@ -139,5 +139,5 @@ JournalCtrl.resolve = { Voucher.get({id:id}, successCb); } return deferred.promise; - } + }] }; \ No newline at end of file diff --git a/brewman/brewman/static/scripts/login.js b/brewman/brewman/static/scripts/login.js index 302e5243..f6813404 100644 --- a/brewman/brewman/static/scripts/login.js +++ b/brewman/brewman/static/scripts/login.js @@ -1,6 +1,6 @@ 'use strict'; -function LoginCtrl($scope, $http, $location, $routeParams, $cookieStore) { +var LoginCtrl = ['$scope', '$http', '$location', '$routeParams', '$cookieStore', function ($scope, $http, $location, $routeParams, $cookieStore) { $scope.showOTP = false; $scope.submit = function () { if ($scope.showOTP) { @@ -23,14 +23,15 @@ function LoginCtrl($scope, $http, $location, $routeParams, $cookieStore) { if (status === 403 && ['Unknown Client', 'OTP not supplied', 'OTP is wrong'].indexOf(data) !== -1) { $scope.showOTP = true; $scope.clientID = $cookieStore.get('ClientID'); + $scope.$apply(); } $scope.toasts.push({Type:'Error', Message:data}); }); }; $('#username').focus(); -} +}] -function LogoutCtrl($scope, $http, $location) { +var LogoutCtrl = ['$scope', '$http', '$location', function ($scope, $http, $location) { $http. post('/logout'). success(function () { @@ -40,4 +41,4 @@ function LogoutCtrl($scope, $http, $location) { error(function (errorMessage) { $scope.toasts.push({Type:'Error', Message:errorMessage}); }); -} +}] diff --git a/brewman/brewman/static/scripts/modal-service.js b/brewman/brewman/static/scripts/modal-service.js index 06eb76e5..8cc1ff3a 100644 --- a/brewman/brewman/static/scripts/modal-service.js +++ b/brewman/brewman/static/scripts/modal-service.js @@ -1,6 +1,6 @@ 'use strict'; -overlord_service.factory('modal', function ($http, $compile) { +overlord_service.factory('modal', ['$http', '$compile', function ($http, $compile) { var modal = {}; modal.get = function (create) { @@ -116,4 +116,4 @@ overlord_service.factory('modal', function ($http, $compile) { return modal; -}); +}]); diff --git a/brewman/brewman/static/scripts/overlord.js b/brewman/brewman/static/scripts/overlord.js index 99e1b952..d8c92996 100644 --- a/brewman/brewman/static/scripts/overlord.js +++ b/brewman/brewman/static/scripts/overlord.js @@ -88,20 +88,20 @@ var overlord = angular.module('overlord', ['overlord.directive', 'overlord.filte otherwise({templateUrl:'/partial/404.html'}); $locationProvider.html5Mode(true).hashPrefix('!'); }]) - .config(function ($httpProvider) { - $httpProvider.responseInterceptors.push('spinnerInterceptor'); - var spinnerFunction = function (data, headersGetter) { - var scope = angular.injector(['ng']).get('$rootScope'), - headers = headersGetter(), - isResourceRequest = headers['Content-Type'] === "application/json"; + .config(['$httpProvider', function ($httpProvider) { + $httpProvider.responseInterceptors.push('spinnerInterceptor'); + var spinnerFunction = function (data, headersGetter) { + var scope = angular.injector(['ng']).get('$rootScope'), + headers = headersGetter(), + isResourceRequest = headers['Content-Type'] === "application/json"; - if (isResourceRequest && scope) { - scope.$broadcast('spinnerStart', 'http'); - } - return data; - }; - $httpProvider.defaults.transformRequest.push(spinnerFunction); - }) + if (isResourceRequest && scope) { + scope.$broadcast('spinnerStart', 'http'); + } + return data; + }; + $httpProvider.defaults.transformRequest.push(spinnerFunction); +}]) .factory('spinnerInterceptor', ['$q', '$rootScope', function ($q, $rootScope) { return function (promise) { return promise.then(function (response) { @@ -128,7 +128,7 @@ var overlord = angular.module('overlord', ['overlord.directive', 'overlord.filte }; }]); -function BaseCtrl($rootScope, $scope, Auth, $location, $routeParams) { +overlord.controller('BaseCtrl', ['$rootScope', '$scope', 'Auth', '$location', '$routeParams', function ($rootScope, $scope, Auth, $location, $routeParams) { $rootScope.spinner = {http:0, route:false}; $rootScope.$on('event:loginRequired', function () { if ($rootScope.auth.isAuthenticated) { @@ -186,3 +186,5 @@ function BaseCtrl($rootScope, $scope, Auth, $location, $routeParams) { $rootScope.$broadcast('spinnerStop', 'route'); }); } +]); + diff --git a/brewman/brewman/static/scripts/unposted.js b/brewman/brewman/static/scripts/unposted.js index 2bb03329..8ded8c0c 100644 --- a/brewman/brewman/static/scripts/unposted.js +++ b/brewman/brewman/static/scripts/unposted.js @@ -1,17 +1,23 @@ 'use strict'; -function UnpostedCtrl($scope, info) { +var UnpostedCtrl = ['$scope', 'info', 'Unposted', function ($scope, info, Unposted) { $scope.info = info; -} + $scope.refresh = function () { + Unposted.query({}, function (result) { + $scope.info = result; + $scope.apply(); + }); + } +}] UnpostedCtrl.resolve = { - info:function ($q, Unposted) { + info:['$q', 'Unposted', function ($q, Unposted) { var deferred = $q.defer(); - var successCb = function(result){ + var successCb = function (result) { deferred.resolve(result); }; Unposted.query({}, successCb); return deferred.promise; - } -}; \ No newline at end of file + }] +} \ No newline at end of file diff --git a/brewman/brewman/views/account.py b/brewman/brewman/views/account.py index 5d5def47..cd4c9dc6 100644 --- a/brewman/brewman/views/account.py +++ b/brewman/brewman/views/account.py @@ -20,7 +20,7 @@ def html(request): def save(request): try: item = Ledger(code=0, name=request.json_body['Name'], type=int(request.json_body['Type']), - is_active=request.json_body['IsActive'], is_reconcilble=request.json_body['IsReconcilable'], + is_active=request.json_body['IsActive'], is_reconcilable=request.json_body['IsReconcilable'], costcenter_id=uuid.UUID(request.json_body['CostCenter']['CostCenterID'])).create() transaction.commit() return account_info(item.id) diff --git a/brewman/brewman/views/auth/group.py b/brewman/brewman/views/auth/group.py index 0e47347a..75701362 100644 --- a/brewman/brewman/views/auth/group.py +++ b/brewman/brewman/views/auth/group.py @@ -1,5 +1,6 @@ import uuid +from pyramid.response import Response from pyramid.view import view_config import transaction from brewman.models import DBSession diff --git a/brewman/brewman/views/reports/ledger.py b/brewman/brewman/views/reports/ledger.py index b12489d5..42c6c066 100644 --- a/brewman/brewman/views/reports/ledger.py +++ b/brewman/brewman/views/reports/ledger.py @@ -38,7 +38,6 @@ def show_data(request): build_report(request, info) return info - def build_report(request, info): ledger_id = info['Ledger']['LedgerID'] start_date = info['StartDate'] @@ -118,3 +117,5 @@ def opening_balance(ledgerID, start_date): return debit, credit, runningTotal, {'Date': start_date, 'Name': 'Opening Balance', 'Type': 'Opening Balance', 'Narration': '', 'Debit': debitShow, 'Credit': creditShow, 'Running': running, 'Posted': True} + + diff --git a/brewman/brewman/views/services/voucher/issue.py b/brewman/brewman/views/services/voucher/issue.py index e0a16861..0bb31551 100644 --- a/brewman/brewman/views/services/voucher/issue.py +++ b/brewman/brewman/views/services/voucher/issue.py @@ -3,6 +3,7 @@ from decimal import Decimal import uuid from brewman.models import DBSession from brewman.models.master import Product, CostCenter, LedgerBase +from brewman.models.operations import journals_valid, inventory_valid from brewman.models.validation_exception import ValidationError from brewman.models.voucher import Voucher, VoucherType, Batch, Inventory, Journal @@ -26,7 +27,8 @@ def issue_create_voucher(json, user): for item in issue_create_journals(voucher.inventories, source, destination): DBSession.add(item) voucher.journals.append(item) - DBSession.flush() + journals_valid(voucher) + inventory_valid(voucher) return voucher @@ -89,6 +91,8 @@ def issue_update_voucher(voucher, json, user): issue_update_inventory(voucher, json['Inventories'], old_batch_consumed) issue_update_journals(voucher, source, destination) + journals_valid(voucher) + inventory_valid(voucher) return voucher diff --git a/brewman/brewman/views/services/voucher/journal.py b/brewman/brewman/views/services/voucher/journal.py index 870478fe..ecd887e7 100644 --- a/brewman/brewman/views/services/voucher/journal.py +++ b/brewman/brewman/views/services/voucher/journal.py @@ -3,22 +3,24 @@ from decimal import Decimal import uuid from brewman.models import DBSession from brewman.models.master import LedgerBase -from brewman.models.operations import update_journal_voucher, create_journal_voucher +from brewman.models.operations import journals_valid from brewman.models.voucher import Journal, Voucher, VoucherType __author__ = 'tanshu' def journal_create_voucher(json, user): 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']), - posted=False) + voucher = Voucher(date=dt, narration=json['Narration'], user_id=user.id, type=VoucherType.by_name(json['Type'])) + DBSession.add(voucher) for item in json['Journals']: ledger = LedgerBase.by_id(uuid.UUID(item['Ledger']['LedgerID'])) journal_id = uuid.UUID(item['JournalID']) if 'JournalID' in item else None - voucher.journals.append( - Journal(id=journal_id, amount=Decimal(item['Amount']), debit=int(item['Debit']), ledger_id=ledger.id, - cost_center_id=ledger.costcenter_id)) - create_journal_voucher(voucher) + amount = round(Decimal(item['Amount']), 2) + journal = Journal(id=journal_id, amount=amount, debit=int(item['Debit']), ledger_id=ledger.id, + cost_center_id=ledger.costcenter_id) + voucher.journals.append(journal) + DBSession.add(journal) + journals_valid(voucher) return voucher @@ -39,7 +41,7 @@ def journal_update_voucher(voucher, json, user): ledger = LedgerBase.by_id(uuid.UUID(j['Ledger']['LedgerID'])) found = True item.debit = int(j['Debit']) - item.amount = Decimal(j['Amount']) + item.amount = round(Decimal(j['Amount']), 2) item.ledger_id = ledger.id item.cost_center_id = ledger.costcenter_id newJournals.remove(j) @@ -48,12 +50,11 @@ def journal_update_voucher(voucher, json, user): voucher.journals.remove(item) for j in newJournals: ledger = LedgerBase.by_id(uuid.UUID(j['Ledger']['LedgerID'])) - journal = Journal(id=None, amount=Decimal(j['Amount']), debit=int(j['Debit']), ledger_id=ledger.id, + journal = Journal(id=None, amount=round(Decimal(j['Amount']), 2), debit=int(j['Debit']), ledger_id=ledger.id, cost_center_id=ledger.costcenter_id) DBSession.add(journal) voucher.journals.append(journal) - update_journal_voucher(voucher) - # voucher.validate() + journals_valid(voucher) return voucher diff --git a/brewman/brewman/views/services/voucher/purchase.py b/brewman/brewman/views/services/voucher/purchase.py index d84c5d82..2676c2c4 100644 --- a/brewman/brewman/views/services/voucher/purchase.py +++ b/brewman/brewman/views/services/voucher/purchase.py @@ -3,6 +3,7 @@ from decimal import Decimal import uuid from brewman.models import DBSession from brewman.models.master import Product, LedgerBase +from brewman.models.operations import journals_valid, inventory_valid from brewman.models.validation_exception import ValidationError from brewman.models.voucher import Voucher, VoucherType, Batch, Inventory, Journal @@ -14,11 +15,12 @@ def purchase_create_voucher(json, user): DBSession.add(voucher) for item in json['Inventories']: - voucher.inventories.append(purchase_create_inventory(voucher, item, json['Date'])) + purchase_create_inventory(voucher, item, json['Date']) for item in purchase_create_journals(voucher.inventories, json['Journals'][0]['Ledger']['LedgerID']): DBSession.add(item) voucher.journals.append(item) - DBSession.flush() + journals_valid(voucher) + inventory_valid(voucher) return voucher @@ -34,8 +36,9 @@ def purchase_create_inventory(voucher, item, date): DBSession.add(batch) inventory = Inventory(id=inventory_id, product_id=product.id, batch=batch, quantity=quantity, rate=rate, tax=tax, discount=discount) + product.price = rate DBSession.add(inventory) - voucher.inventories.append(item) + voucher.inventories.append(inventory) @@ -45,12 +48,13 @@ def purchase_create_journals(inventories, ledgerID): amount = 0 for item in inventories: ledger = Product.by_id(item.product_id).ledger - amount += round(item.amount, 2) + item_amount = round(item.amount, 2) + amount += item_amount if ledger.id in journals: - journals[ledger.id].amount += item.amount + journals[ledger.id].amount += item_amount else: 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, amount=amount) return list(journals.values()) @@ -65,6 +69,8 @@ def purchase_update_voucher(voucher, json, user): purchase_update_inventory(voucher, json['Inventories'], json['Date']) purchase_update_journals(voucher, json['Journals']) + journals_valid(voucher) + inventory_valid(voucher) return voucher @@ -98,6 +104,7 @@ def purchase_update_inventory(voucher, newInventories, date): item.batch.discount = discount item.tax = tax item.batch.tax = tax + product.price = rate newInventories.remove(i) #TODO: Update all references of the batch with the new rates break @@ -122,6 +129,7 @@ def purchase_update_inventory(voucher, newInventories, date): inventory.voucher_id = voucher.id DBSession.add(batch) inventory.batch_id = batch.id + product.price = rate DBSession.add(inventory) voucher.inventories.append(inventory) diff --git a/brewman/brewman/views/services/voucher/purchase_return.py b/brewman/brewman/views/services/voucher/purchase_return.py index b6783923..280fafb2 100644 --- a/brewman/brewman/views/services/voucher/purchase_return.py +++ b/brewman/brewman/views/services/voucher/purchase_return.py @@ -3,6 +3,7 @@ from decimal import Decimal import uuid from brewman.models import DBSession from brewman.models.master import Product, LedgerBase +from brewman.models.operations import inventory_valid, journals_valid from brewman.models.validation_exception import ValidationError from brewman.models.voucher import Voucher, VoucherType, Batch, Inventory, Journal @@ -18,7 +19,8 @@ def purchase_return_create_voucher(json, user): for item in purchase_return_create_journals(voucher.inventories, json['Journals'][0]['Ledger']['LedgerID']): DBSession.add(item) voucher.journals.append(item) - DBSession.flush() + journals_valid(voucher) + inventory_valid(voucher) return voucher @@ -66,6 +68,8 @@ def purchase_return_update_voucher(voucher, json, user): purchase_return_update_inventory(voucher, json['Inventories'], json['Date']) purchase_return_update_journals(voucher, json['Journals']) + journals_valid(voucher) + inventory_valid(voucher) return voucher diff --git a/serve.cmd b/serve.cmd deleted file mode 100644 index 0b7bf75d..00000000 --- a/serve.cmd +++ /dev/null @@ -1 +0,0 @@ -env\Scripts\pserve brewman\development.ini --reload \ No newline at end of file