mirror of
https://github.com/atlanticbiomedical/biomedjs.git
synced 2025-07-02 00:47:26 -04:00
Latest batch of work
This commit is contained in:
@ -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");
|
||||
|
@ -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);
|
||||
});
|
||||
|
@ -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);
|
||||
|
@ -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}}
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
||||
|
59
public/partials/accounting/index.html
Normal file
59
public/partials/accounting/index.html
Normal 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>
|
@ -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">
|
||||
|
@ -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&clientId={{pm.client._id}}&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&clientId={{pm.client._id}}&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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
Reference in New Issue
Block a user