Latest batch of work

This commit is contained in:
Dobie Wollert
2015-04-06 06:36:17 -04:00
parent d3089dcd17
commit 8cfff70ce0
11 changed files with 218 additions and 24 deletions

View File

@ -6,7 +6,7 @@ var mongoose = require('mongoose'),
var log = require('log4node');
var frequencies = ["Medical Device","Sterilizer - TT","Vaporizer","Ice Maker","Anesthesia","Waste Management System","Imaging","Medical Gas Systems","RAE","ERT","N2O Trace Gas","Sterilizer - F","Quarterly","Semi","Annual","legacy","DLLR"];
var frequencies = ["Medical Device","Sterilizer - TT","Vaporizer","Ice Maker","Anesthesia","Waste Management System","Imaging","Medical Gas Systems","RAE","ERT","N2O Trace Gas","Sterilizer - F","Quarterly","Semi","Annual","legacy","DLLR", "Isolation Panel"];
exports.index = function(req, res) {
log.info("clients.index");

View File

@ -75,7 +75,8 @@ module.exports = function(config, calendar) {
remarks: req.body.remarks || "",
status: req.body.status,
scheduling: req.body.scheduling,
techs: req.body.techs
techs: req.body.techs,
alternativeContact: req.body.alternativeContact
});
var notify = req.body._notify || "";
@ -238,6 +239,11 @@ module.exports = function(config, calendar) {
workorder.techs = req.body.techs
.filter(function(e) { return e; })
.map(function(t) { return t._id; });
workorder.invoiceNumber = req.body.invoiceNumber;
workorder.invoicedOn = req.body.invoicedOn;
workorder.checkNumber = req.body.checkNumber;
workorder.paidOn = req.body.paidOn;
workorder.alternativeContact = req.body.alternativeContact;
callback(err);
});

View File

@ -24,7 +24,12 @@ var workorderSchema = new Schema({
newValues: {},
modifiedBy: { type: ObjectId, ref: 'User' }
}],
deleted: { type: Boolean, default: false }
deleted: { type: Boolean, default: false },
invoiceNumber: String,
invoicedOn: Date,
checkNumber: String,
paidOn: Date,
alternativeContact: String
});
module.exports = mongoose.model('Workorder', workorderSchema);

View File

@ -41,27 +41,30 @@ html(lang="en", ng-app="biomed", ng-controller="biomed.PageCtrl")
ul.nav
li(data-match-route='/schedule.*')
a(href='/schedule')
i.icon-calendar
| Schedule
li
a(href='/schedule/pms')
| PM
li(data-match-route='/client.*')
a(href='/clients')
i.icon-briefcase
| Clients
li(data-match-route='/workorder.*')
a(href='/workorders')
i.icon-wrench
| Workorders
li(data-match-route='/accounting.*')
a(href='/accounting')
| Accounting
li(data-match-route='/posts.*', ng-show="accountHasPermission('system.admin')")
a(href='/posts')
i.icon-wrench
| Posts
li(data-match-route='/admin.*', ng-show="accountHasPermission('system.admin')")
a(href='/admin')
i.icon-wrench
| Admin
li.day-of-year
{{dayOfYear}}

View File

@ -57,6 +57,11 @@ angular.module('biomed', ['biomed.filters', 'biomed.services', 'biomed.directive
templateUrl: '/partials/clients/edit.html',
controller: biomed.ClientEditCtrl
})
.when('/accounting', {
templateUrl: '/partials/accounting/index.html',
controller: biomed.AccountingIndexCtrl,
reloadOnSearch: false
})
.when('/workorders', {
templateUrl: '/partials/workorders/index.html',
controller: biomed.WorkorderIndexCtrl,

View File

@ -75,15 +75,29 @@ biomed.SchedulePmsCtrl = function($scope, Clients) {
$scope.pms = [];
angular.forEach(allData, function(client) {
angular.forEach(client.frequencies, function(value, key) {
var reason = [];
angular.forEach(client.frequencies, function(value, key) {
if (value[$scope.month]) {
$scope.pms.push({
reason: key,
client: client
});
reason.push(key);
// $scope.pms.push({
// reason: key,
// client: client
// });
}
});
if (reason.length > 0) {
$scope.pms.push({
reason: reason,
client: client
});
}
});
console.log($scope.pms);
}
$scope.sort = {
@ -654,6 +668,80 @@ biomed.ClientEditCtrl = function($scope, $routeParams, Clients) {
}
};
biomed.AccountingIndexCtrl = function($scope, $filter, $routeParams, Workorders, LocationBinder) {
$scope.loading = true;
var data = {};
var defaultEnd = moment().toDate();
var defaultStart = moment(defaultEnd).subtract('days', 7).toDate();
LocationBinder($scope, ['query', 'start', 'end'], {
start: defaultStart,
end: defaultEnd
});
fetchData();
var filteredData = [];
var index = 0;
var initialPageSize = 100;
var pageSize = 5;
$scope.canLoad = true;
$scope.$watch('query', filter);
$scope.$watch('start', fetchData);
$scope.$watch('end', fetchData);
$scope.sort = {
column: 'scheduling.start',
descending: true
};
$scope.addItems = function() {
$scope.workorders = $scope.workorders.concat(filteredData.slice(index, index + pageSize));
index += pageSize;
$scope.canLoad = index < filteredData.length;
}
function filter() {
filteredData = $filter('filter')(data, $scope.query);
index = initialPageSize;
$scope.canLoad = true;
$scope.workorders = filteredData.slice(0, initialPageSize);
};
$scope.selectedCls = function(column) {
return column == $scope.sort.column && 'sort-' + $scope.sort.descending;
}
$scope.changeSorting = function(column) {
var sort = $scope.sort;
if (sort.column == column) {
sort.descending = !sort.descending;
} else {
sort.column = column;
sort.descending = false;
}
};
function fetchData() {
$scope.loading = true;
data = Workorders.index({
start: $scope.start.toJSON(),
end: $scope.end.toJSON()
}, function() {
$scope.loading = false;
filter();
});
}
}
biomed.WorkorderIndexCtrl = function($scope, $filter, $routeParams, Workorders, LocationBinder) {
$scope.loading = true;

View File

@ -0,0 +1,59 @@
<ul class="breadcrumb">
<li><a href="/clients"><i class="icon-wrench"></i> Accounting</a><li>
</ul>
<h1>Accounting</h1>
<div class="row-fluid">
<div class="span12">
<div class="toolbelt">
<div class="pull-left">
<div class="input-append">
<input type="text" ng-model="query" class="input-large" placeholder="Search">
<span class="add-on"><i class="icon-search"></i></span>
</div>
</div>
<div class="pull-right">
<span class="toolbelt-text">Start: </span>
<div class="input-append">
<input ng-model="start" datepicker type="text" class="input-medium">
<span class="add-on"><i class="icon-calendar"></i></span>
</div>
<span class="toolbelt-text">End: </span>
<div class="input-append">
<input ng-model="end" datepicker type="text" class="input-medium">
<span class="add-on"><i class="icon-calendar"></i></span>
</div>
</div>
</div>
<table class="biomed-table" infinite-scroll="addItems()" can-load="canLoad" threshold="300">
<thead>
<tr>
<th style="width: 20%" ng-class="selectedCls('biomedId')" ng-click="changeSorting('biomedId')">Workorder</th>
<th style="width: 30%" ng-class="selectedCls('client.name')" ng-click="changeSorting('client.name')">Client</th>
<th style="width: 10%" ng-class="selectedCls('scheduling.start')" ng-click="changeSorting('scheduling.start')">Date</th>
<th style="width: 10%" ng-class="selectedCls('invoiceNumber')" ng-click="changeSorting('invoiceNumber')">Invoice #</th>
<th style="width: 10%" ng-class="selectedCls('invoicedOn')" ng-click="changeSorting('invoicedOn')">Invoice Date</th>
<th style="width: 10%" ng-class="selectedCls('checkNumber')" ng-click="changeSorting('checkNumber')">Check #</th>
<th style="width: 10%" ng-class="selectedCls('paidOn')" ng-click="changeSorting('paidOn')">Paid Date</th>
<th style="width: 10%" ng-class="selectedCls('status')" ng-click="changeSorting('status')">Status</th>
</tr>
</thead>
<tbody>
<tr ng-show="loading"><td colspan="8" class="table-loading"><i class="loader"></i></td></tr>
<tr ng-hide="loading || workorders.length"><td colspan="8" class="table-message">There is no information to display.</td></tr>
<tr ng-hide="loading" ng-repeat="workorder in workorders | orderBy : sort.column : sort.descending">
<td>
<a ng-href="/workorders/{{workorder._id}}">#{{workorder.biomedId}} - {{workorder.reason}}</a><br>
</td>
<td><a ng-href="/clients/{{workorder.client._id}}">{{workorder.client.name}} ({{workorder.client.identifier}})</a></td>
<td>{{workorder.scheduling.start | date}}</td>
<td>{{workorder.invoiceNumber}}</td>
<td>{{workorder.invoicedOn | date}}</td>
<td>{{workorder.checkNumber}}</td>
<td>{{workorder.paidOn | date}}</td>
<td>{{workorder.status}}</td>
</tr>
</tbody>
</table>
</div>
</div>

View File

@ -10,7 +10,6 @@
<div class="toolbelt">
<a href="/workorders/add" class="btn btn-primary" ng-show="accountHasPermission('system.edit')">Create new Workorder</a>
<a href="/workorders/add?workorderType=meeting" class="btn" ng-show="accountHasPermission('system.edit')">Create new Meeting</a>
<a href="/schedule/pms" class="btn">View PMs</a>
<div class="pull-right">
<span class="toolbelt-text">Group: </span>
<div class="input-append">

View File

@ -33,8 +33,8 @@
<table class="biomed-table" infinite-scroll="addItems()" can-load="canLoad" threshold="300">
<thead>
<tr>
<th style="width: 48%" ng-class="selectedCls('client.name')" ng-click="changeSorting('client.name')">Client Name</th>
<th style="width: 20%" ng-class="selectedCls('reason')" ng-click="changeSorting('reason')">Reason</th>
<th style="width: 18%" ng-class="selectedCls('client.name')" ng-click="changeSorting('client.name')">Client Name</th>
<th style="width: 50%" ng-class="selectedCls('reason')" ng-click="changeSorting('reason')">Frequency</th>
<th style="width: 20%" ng-class="selectedCls('client.contacts[0].name')" ng-click="changeSorting('client.contacts[0].name')">Contact</th>
<th style="width: 12%" ng-class="selectedCls('client.contacts[0].phone')" ng-click="changeSorting('client.contacts[0].phone')">Phone</th>
</tr>
@ -43,8 +43,12 @@
<tr ng-show="loading"><td colspan="4" class="table-loading"><i class="loader"></i></td></tr>
<tr ng-hide="loading || pms.length"><td colspan="4" class="table-message">There is no information to display.</td></tr>
<tr ng-hide="loading" ng-repeat="pm in pms | orderBy : sort.column : sort.descending">
<td><a ng-href="/workorders/add?workorderType=pm&amp;clientId={{pm.client._id}}&amp;type={{pm.reason}}">{{pm.client.name}} ({{pm.client.identifier | uppercase}})</a><br>
<td>{{pm.reason}}</td>
<td colspan="2">
{{pm.client.name}} ({{pm.client.identifier | uppercase}})<br>
<span ng-repeat="reason in pm.reason">
<a ng-href="/workorders/add?workorderType=pm&amp;clientId={{pm.client._id}}&amp;type={{reason}}">{{reason}}</a><span ng-show="!$last">, </span>
</span>
</td>
<td>{{pm.client.contacts[0].name}}</td>
<td>{{pm.client.contacts[0].phone}}</td>
</tr>

View File

@ -47,6 +47,12 @@
<input type="text" ui-select2="emailsOptions" ng-model="model.emails" class="input-xxlarge" />
</div>
</div>
<div class="control-group">
<label class="control-label">Alternative Contact</label>
<div class="controls">
<input ng-model="model.alternativeContact" type="text" class="input-large">
</div>
</div>
</div>
</div>
</div>

View File

@ -12,7 +12,7 @@
<div ng-hide="loading" class="tabbable">
<div class="tab-content">
<div class="tab-pane active form" title="Details">
<div class="form-section">
<form name="form" class="form-section" style="margin-bottom: 0">
<div class="section-label">Status</div>
<div class="section-container">
<div ng-hide="status.visible" class="form-preview">
@ -32,20 +32,33 @@
</select>
</div>
</div>
<div class="control-group" ng-show="status.model.status == 'invoiced' || status.model.status == 'paid'">
<label class="control-label">Invoice Number</label>
<div class="controls">
<input ng-model="status.model.invoiceNumber" type="text" class="input-small" ng-required="status.model.status == 'invoiced' || status.model.status == 'paid'">
</div>
</div>
<div class="control-group" ng-show="status.model.status == 'paid'">
<label class="control-label">Check Number</label>
<div class="controls">
<input ng-model="status.model.checkNumber" type="text" class="input-small" ng-required="status.model.status == 'paid'">
</div>
</div>
<div class="form-actions">
<button ng-click="status.save(false)" type="button" class="btn btn-primary">Save</button>
<button ng-click="status.save(true)" type="button" class="btn">Save & Notify</button>
<button ng-disabled="form.$invalid" ng-click="status.save(false)" type="button" class="btn btn-primary">Save</button>
<button ng-disabled="form.$invalid" ng-click="status.save(true)" type="button" class="btn">Save & Notify</button>
<button ng-click="status.reset()" type="button" class="btn">Cancel</button>
</div>
</div>
</div>
</div>
</form>
<div class="form-section">
<div class="section-label">Additional E-Mails</div>
<div class="section-label">Additional Contact Information</div>
<div class="section-container">
<div ng-hide="emails.visible" class="form-preview">
<span ng-repeat="email in master.emails"><b>{{email}}</b><span ng-show="!$last">, </span></span>
<span ng-show"master.emails" ng-repeat="email in master.emails"><b>{{email}}</b><span ng-show="!$last">, </span></span>
<span ng-show="master.alternativeContact">{{master.alternativeContact}}<br></span>
<a ng-click="emails.edit()" ng-class="{disabled: editing}" ng-show="accountHasPermission('system.edit')">Edit</a>
</div>
<div ng-show="emails.visible" class="form-editor">
@ -55,6 +68,12 @@
<input type="text" ui-select2="emailsOptions" ng-model="emails.model.emails" class="input-xxlarge" />
</div>
</div>
<div class="control-group">
<label class="control-label">Alternative Contact</label>
<div class="controls">
<input ng-model="emails.model.alternativeContact" type="text" class="input-large">
</div>
</div>
<div class="form-actions">
<button ng-click="emails.save(false)" type="button" class="btn btn-primary">Save</button>
<button ng-click="emails.save(true)" type="button" class="btn">Save & Notify</button>