Source: services/incidente.js

    /**
     * @ngdoc service
     * @name Incidente
     * @module s4c.services.Incidente
     * 
     * @description  Componente para acesso a api do backend e/ou comunicação entre controllers
     * 
     *
     */
     
(function () {
    'use strict';

    IncidentesService.$inject = [
        '$rootScope',
        '$http',
        '$q',
        'API_ENDPOINT',
        'Base',
        '$mdDialog',
        '$timeout',
        'MsiService'

    ];
  
   /**	
	* @method IncidentesService
	* @param {*} $rootScope
	* @param {*} $http
	* @param {*} $q
	* @param {*} API_ENDPOINT
	* @param {*} Base
	* @param {*} $mdDialog
	* @param {*} $timeout
	* @param {*} MsiService
	*/	     
    function IncidentesService($rootScope, $http, $q, API_ENDPOINT, Base, $mdDialog, $timeout, MsiService) {

        var res = $rootScope.res;
        var showDialog = true;
        var self = this;
        self.tipos = undefined;
        self.canLoad = true;
        self.p = $q.defer();

	   /**	
		* @method getIncidenteTipos
		*/
        function getIncidenteTipos() {
            $http.get(API_ENDPOINT + 'tipo_incidentes/')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        self.canLoad = true;
                        self.tipos = res.data;
                        self.p.resolve(res.data);
                    } else {
                        self.p.reject();
                    }
                }, function (err) {
                    self.p.reject(err);

                    if (showDialog) {
                        if (err.data.message) {
                            $mdDialog
                                .show($mdDialog.alert()
                                    .title(res('COMUM_ERRO'))
                                    .content(res(err.data.message))
                                    .ok(res('COMUM_OK')));

                            showDialog = false;

                            $timeout(function () {
                                showDialog = true;
                            }, 30000);
                        }
                    }

                });

            return self.p.promise;
        }

	   /**	
		* @method salvarTipos
		* @param {*} tipos
		*/
        function salvarTipos(tipos) {
            return Base.salvar('tipo_incidentes/', tipos);
        }

	   /**	
		* @method salvarGravidades
		* @param {*} gravidades
		*/
        function salvarGravidades(gravidades) {
            return Base.salvar('gravidade_incidentes/', gravidades);
        }

	   /**	
		* @method salvarCategorias
		* @param {*} categorias
		*/
        function salvarCategorias(categorias) {
            return Base.salvar('categoriaIncidentes/', categorias);
        }

  	   /**	
		* @method getIncidentesByDepartamentoId
		* @param {*} id
		*/
        function getIncidentesByDepartamentoId(id) {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'departamentos/' + id + '/incidentes/')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);

                    if (showDialog) {
                        if (err.data.message) {
                            $mdDialog
                                .show($mdDialog.alert()
                                    .title(res('COMUM_ERRO'))
                                    .content(res(err.data.message))
                                    .ok(res('COMUM_OK')));

                            showDialog = false;

                            $timeout(function () {
                                showDialog = true;
                            }, 30000);
                        }
                    }

                });

            return deferred.promise;
        }

	   /**	
		* @method getCategoriasIncidente
		*/
        function getCategoriasIncidente() {
            return MsiService.getCategorias();
        }

	   /**	
		* @method getIncidentesPorInput
		* @param {*} input
		*/
        function getIncidentesPorInput(input) {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'incidentes/inputs/' + encodeURIComponent(input))
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }
     
	   /**	
		* @method getIncidentes
		*/      
        function getIncidentes() {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'incidentes/')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);

                    if (showDialog) {
                        if (err.data.message) {
                            $mdDialog
                                .show($mdDialog.alert()
                                    .title(res('COMUM_ERRO'))
                                    .content(res(err.data.message))
                                    .ok(res('COMUM_OK')));

                            showDialog = false;

                            $timeout(function () {
                                showDialog = true;
                            }, 30000);
                        }
                    }

                });

            return deferred.promise;
        }

 	   /**	
		* @method pegarDepartamentos
		*/        
        function pegarDepartamentos() {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'departamentos')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

	   /**	
		* @method pegarCamerasProximas
		* @param {*} ponto
		*/
        function pegarCamerasProximas(ponto) {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'cameras/proxima/' + ponto.lat + '/' + ponto.lng)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

	   /**	
		* @method saveIncidente
		* @param {*} incidente
		*/
        function saveIncidente(incidente) {
            var deferred = $q.defer();

            $http.post(API_ENDPOINT + 'incidentes', incidente)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);

                    if (showDialog) {
                        if (err.data.message) {
                            $mdDialog
                                .show($mdDialog.alert()
                                    .title(res('COMUM_ERRO'))
                                    .content(res(err.data.message))
                                    .ok(res('COMUM_OK')));

                            showDialog = false;

                            $timeout(function () {
                                showDialog = true;
                            }, 30000);
                        }
                    }

                });

            return deferred.promise;
        }

	   /**	
		* @method findAbertos
		* @param {*} from
		* @param {*} to
		*/
        function findAbertos(from, to) {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'incidentes/abertos')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

	   /**	
		* @method findByFilter
		* @param {*} filtro
		*/
        function findByFilter(filtro) {
            return Base.obter('incidentes/', {
                filtro: filtro || {}
            });
        }

	   /**	
		* @method findSimpleByFilter
		* @param {*} filtro
		*/
        function findSimpleByFilter(filtro) {
            return Base.obter('incidentes/simple/', {
                filtro: filtro || {}
            });
        }

	   /**	
		* @method getCountStatus
		* @param {*} filtro
		*/
        function getCountStatus(filtro) {
            return Base.obter('incidentes/countbystatus/', {
                filtro: filtro || {}
            });
        }

	   /**	
		* @method findIncidenteGeoJSONById
		* @param {*} id
		*/
        function findIncidenteGeoJSONById(id) {
            return Base.obter('incidentes/geojson/?filtro={"where":{"id":' + id + '}}');
        }

	   /**	
		* @method getAnalytics
		* @param {*} dataInicio
		* @param {*} dataFim
		*/
        function getAnalytics(dataInicio, dataFim) {
            return Base.obter('incidentes/analytics/' + dataInicio + '/' + dataFim, {});
        }

        var self = this;
        self.deferred = $q.defer();
        self.gravidades = undefined;
        self.canLoad = true;

	   /**	
		* @method getIncidenteGravidades
		*/
        function getIncidenteGravidades() {
            $http.get(API_ENDPOINT + 'gravidade_incidentes/')
                .then(function (res) {

                    self.canLoad = true;
                    self.gravidades = res.data;
                    if (typeof res.data === 'object') {
                        self.deferred.resolve(res.data);
                    } else {
                        self.deferred.reject();
                    }
                }, function (err) {
                    self.deferred.reject(err);
                });

            return self.deferred.promise;
        }

        var self = this;
        self.categoriaPromisse = $q.defer();
        self.categorias = undefined;
        self.canLoad = true;

	   /**	
		* @method getIncidenteCategorias
		*/
        function getIncidenteCategorias() {
            $http.get(API_ENDPOINT + 'categoriaIncidentes/')
                .then(function (res) {

                    self.canLoad = true;
                    self.categorias = res.data;
                    if (typeof res.data === 'object') {
                        self.categoriaPromisse.resolve(res.data);
                    } else {
                        self.categoriaPromisse.reject();
                    }
                }, function (err) {
                    self.categoriaPromisse.reject(err);
                });

            return self.categoriaPromisse.promise;
        }

	   /**	
		* @method atualizarIncidente
		* @param {*} id
		* @param {*} incidente
		*/
        function atualizarIncidente(id, incidente) {
            var deferred = $q.defer();

            $http.put(API_ENDPOINT + 'incidentes/' + id, incidente)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject();
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

	   /**	
		* @method getPdfReport
		* @param {*} id
		*/
        function getPdfReport(ids) {
            var deferred = $q.defer();

            $http
                .post(API_ENDPOINT + 'dashboard/incidentes/export', ids, { responseType: 'arraybuffer' })
                .then(function (res) {
                    deferred.resolve(res.data);
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

	   /**	
		* @method findIncidentesByCategoriaGeoJson
		* @param {*} categoriaId
		* @param {*} status
		*/
        function findIncidentesByCategoriaGeoJson(categoriaId, status) {
            return Base.obter('/incidentes/categorias/' + categoriaId + '/geojson/' + status);
        }

	   /**	
		* @method parseIncidente
		* @param {*} incidente
		*/
        function parseIncidente(incidente) {
            var data = '';
            var icons = {
                green: '/data-s4c/teste/ic_incidentes_green_26px.svg',
                red: '/data-s4c/teste/ic_incidentes_grey_26px.svg',
                purple: '/data-s4c/teste/ic_incidentes_purple_24px.svg'
            };
            incidente.icon = icons.green; // Default icon


            /* Formata o Início e o Fim */
            if (incidente.inicio) {
                incidente.inicio = moment(moment(incidente.inicio).toDate());
            }

            if (incidente.fim) {
                incidente.fim = moment(moment(incidente.fim).toDate());
            }

            if (incidente.inicio && incidente.fim) {
                data = _formatDataIncidenteToString(incidente.inicio, incidente.fim);
            }

            var gravidades = IncidenteFilter.getInstance('filtro-incidentes').gravidades;

            incidente.gravidade = _.find(gravidades, { id: incidente.GravidadeIncidenteId });

            if (incidente.status === 'ABERTO') {
                incidente.icon = icons.red;
                if (incidente.inicio) {
                    data = incidente.inicio.format('DD/MM/YYYY - HH:mm');
                    //if (moment().dayOfYear() > incidente.inicio.dayOfYear()) {
                    //   data += incidente.inicio.format(' (MMM D)');
                    //}
                }

                if (incidente.inicio.dayOfYear() < moment().dayOfYear()) {
                    incidente.icon = icons.purple;
                    incidente.urlIcone = incidente.urlIcone.replace('vermelho', 'purple');
                }
            }

            if (incidente.status === 'FECHADO') {
                incidente.urlIcone = incidente.urlIconeFechado || incidente.TipoIncidente.urlIconeFechado || incidente.CategoriaIncidente.urlIconeFechado;

                if (incidente.fim && incidente.inicio) {
                    if (moment().dayOfYear() > incidente.fim.dayOfYear()) {
                        incidente.icon = icons.purple;
                        incidente.urlIcone = incidente.urlIcone.replace('vermelho', 'purple');
                    }
                }
            }

            incidente.data = data;
            return incidente;
        }

	   /**	
		* @method _formatDataIncidenteToString
		* @param {*} dataInicio
		* @param {*} dataFim
		*/
        function _formatDataIncidenteToString(dataInicio, dataFim) {
            var dataString = '';

            /* Início do incidente menor que a data do Fim */
            if (dataInicio.dayOfYear() < dataFim.dayOfYear()) {
                dataString = dataInicio.format('HH:mm');
                dataString += dataInicio.format(' (MMM D)');
                dataString += ' - ';
                dataString += dataFim.format('HH:mm');
                dataString += dataFim.format(' (MMM D)');
            }

            /* Início do incidente igual a data do Fim */
            if (dataInicio.dayOfYear() === dataFim.dayOfYear()) {
                dataString = dataInicio.format('HH:mm');
                dataString += ' - ';
                dataString += dataFim.format('HH:mm');
            }

            return dataString;
        }


        return {
            getIncidenteTipos: getIncidenteTipos,
            findAbertos: findAbertos,
            getIncidentes: getIncidentes,
            getAnalytics: getAnalytics,
            pegarCamerasProximas: pegarCamerasProximas,
            pegarDepartamentos: pegarDepartamentos,
            getIncidentesByDepartamentoId: getIncidentesByDepartamentoId,
            getIncidentesPorInput: getIncidentesPorInput,
            findByFilter: findByFilter,
            getCountStatus: getCountStatus,
            saveIncidente: saveIncidente,
            getCategoriasIncidente: getCategoriasIncidente,
            atualizarIncidente: atualizarIncidente,
            getIncidenteGravidades: getIncidenteGravidades,
            getPdfReport: getPdfReport,
            findIncidenteGeoJSONById: findIncidenteGeoJSONById,
            findIncidentesByCategoriaGeoJson: findIncidentesByCategoriaGeoJson,
            salvarTipos: salvarTipos,
            salvarGravidades: salvarGravidades,
            salvarCategorias: salvarCategorias,
            incidentes: [],
            parseIncidente: parseIncidente,
            findSimpleByFilter: findSimpleByFilter,
            getIncidenteCategorias: getIncidenteCategorias
        };
    }

    angular.module('s4c.services')
        .service('IncidentesService', IncidentesService);

})();