eHealthAfrica/direct-delivery-dashboard

View on GitHub
src/app/reports/invoice/round/round.controller.js

Summary

Maintainability
A
30 mins
Test Coverage
'use strict'

angular.module('reports')
  .controller('ReportsRoundCtrl', function (
    $stateParams,
    $window,
    drivers,
    ZONE_CLASS,
    reportsService,
    dailyDeliveries,
    log,
    $timeout,
    APP_CONSTANTS,
    $scope
  ) {
    var vm = this
    var keys = ['driverID', 'date']
    var keyRows = {}
    var lastKeyValues = []
    vm.dailyDeliveries = dailyDeliveries.results || []
    vm.deliveryRound = $stateParams.id
    vm.pagination = {
      limit: 10,
      page: 1,
      lastPage: 1
    }
    vm.limits = APP_CONSTANTS.pageSizes

    vm.drivers = drivers
    vm.zoneClass = {}

    vm.keyStates = function (delivery, index) {
      var states = {}
      var value = ''
      angular.forEach(keys, function (key) {
        value += delivery[key]

        states[key] = {
          rows: keyRows[value],
          changed: !lastKeyValues[index - 1] || value !== lastKeyValues[index - 1][key]
        }

        if (!lastKeyValues[index]) {
          lastKeyValues[index] = {}
        }

        lastKeyValues[index][key] = value
      })

      return states
    }

    vm.print = function (all) {
      if (all) {
        vm.pagination.limit = 0
        vm.getReport(1).then(function () {
          $timeout(function () {
            $window.jQuery('#report').print()
          })
        })
      } else {
        $window.jQuery('#report').print()
      }
    }

    if (!vm.dailyDeliveries.length) {
      log.warning('noInvoiceData')
    }
    formatReport()

    vm.getReport = function (page) {
      var all
      keyRows = {}
      lastKeyValues = []
      vm.pagination.page = page || vm.pagination.page
      vm.pagination.skip = (vm.pagination.page - 1) * vm.pagination.limit
      if (parseInt(vm.pagination.limit, 10) === 0) {
        vm.pagination = {}
        all = true
      }
      return reportsService.getDailyDeliveries($stateParams.id, vm.pagination)
        .then(loadReport)
        .then(function () {
          if (all) {
            vm.pagination.limit = 0
          }
        })
        .catch(function (reason) {
          log.error('invoiceDailyDeliveryErr', reason)
        })
    }

    vm.allIn = function () {
      return (vm.pagination.totalItems <= vm.pagination.limit) || angular.isUndefined(vm.pagination.limit)
    }
    vm.hasPrev = function () {
      return vm.pagination.page > 1
    }

    vm.hasNext = function () {
      return vm.pagination.page !== getLastPage()
    }
    vm.selectPage = function (type) {
      if (type === 'next' && vm.hasNext()) {
        vm.pagination.page++
        vm.getReport()
      } else if (type === 'prev' && vm.hasPrev()) {
        vm.pagination.page--
        vm.getReport()
      }
    }

    function getLastPage () {
      if (!vm.pagination.limit) {
        vm.pagination.lastPage = 1
        vm.pagination.page = 1
      } else {
        vm.pagination.lastPage = Math.ceil(vm.pagination.totalItems / vm.pagination.limit)
      }
      return vm.pagination.lastPage
    }

    function loadReport (response) {
      vm.dailyDeliveries = response.results
      vm.pagination.totalItems = response.total
      vm.pagination.lastPage = isNaN(getLastPage()) ? getLastPage() : 1
      return formatReport()
    }

    function formatReport () {
      angular.forEach(vm.dailyDeliveries, function (delivery) {
        var value = ''
        angular.forEach(keys, function (key) {
          value += delivery[key]
          if (keyRows[value]) {
            keyRows[value]++
          } else {
            keyRows[value] = 1
          }
        })
      })
    }
    vm.getReport()
    $scope.$on('stateChanged', function (event, data) {
      vm.pagination.page = 1
      vm.getReport()
    })
  })