Source: directives/planejamento/planejamento.js

/**
 * @ngdoc directives
 * @name Planejamento
 * @module s4c.directives.planejamento.Planejamento
 *
 * @description
 * `Planejamento` Controller do módulo de Planejamento 
 * 
 * 
 */
(function () {
    'use strict';

    function s4cPlanejamento() {

        return {
            restrict: 'EA',
            templateUrl: 'app/directives/planejamento/planejamento.html',
            replace: true,
            scope: {},
            controller: planejamentoCtrl,
            link: function ($scope, $elem, $attrs) {
                $scope.res = $scope.$root.res;
                $scope.timeStep = 30;
                $scope.startDatetimepicker = $elem.find('#startDatetimepicker');

                var language;
                if ($scope.res("COMUM_LOCALE") == "pt-BR") {
                    language = 'pt-BR';
                } else {
                    language = 'en';
                }
                $scope.startDatetimepicker.datetimepicker({
                    theme: 'dark',
                    format: 'd/m/Y H:i',
                    lang: language,
                    step: $scope.timeStep,
                    onChangeDateTime: function (dp, input) {
                        this.setOptions({
                            maxTime: $scope.planejamentoModel.fim ? (input.val().split(' ')[0] == $scope.planejamentoModel.fim.split(' ')[0] ? $scope.planejamentoModel.fim.split(' ')[1] : false) : false
                        });
                    },
                    onShow: function () {
                        this.setOptions({
                            maxDate: $scope.planejamentoModel.fim ? $scope.planejamentoModel.fim.split(' ')[0] : false,
                            formatDate: 'd.m.Y',
                        });
                    }
                });

                $scope.endDatetimepicker = $elem.find('#endDatetimepicker');
                $scope.endDatetimepicker.datetimepicker({
                    theme: 'dark',
                    format: 'd/m/Y H:i',
                    lang: language,
                    step: $scope.timeStep,
                    onChangeDateTime: function (dp, input) {
                        this.setOptions({
                            minTime: $scope.planejamentoModel.inicio ? (input.val().split(' ')[0] == $scope.planejamentoModel.inicio.split(' ')[0] ? $scope.planejamentoModel.inicio.split(' ')[1] : false) : false
                        });
                    },
                    onShow: function () {
                        this.setOptions({
                            minDate: $scope.planejamentoModel.inicio ? $scope.planejamentoModel.inicio.split(' ')[0] : false,
                            formatDate: 'd.m.Y'
                        });
                    }
                });

                $scope.input = $elem.find('.uploadArquivoDois');
                $scope.inputKml = $elem.find('.uploadArquivoKml');
                $scope.inputExcel = $elem.find('#excelFile');
            }
        };
    }

    planejamentoCtrl.$inject = [
        '$scope',
        '$q',
        'PlanejamentoService',
        'FileUploader',
        'API_ENDPOINT',
        '$mdDialog',
        'ngTableParams',
        'AuthService',
        'CommService',
        'TipoEvento',
        'toasty',
        'CamadasService',
        '$http',
        'MainState',
        'PlanejamentoManager',
        'BotoesManager',
        'MapaManager',
        'EditPTarefaManager',
        'MapaService',
        'BaseConhecimentoManager',
        'IncidenteEnterManager',
        'localize',
        'PermissoesService'
    ];

    function planejamentoCtrl($scope,
        $q,
        PlanejamentoService,
        FileUploader,
        API_ENDPOINT,
        $mdDialog,
        ngTableParams,
        AuthService,
        CommService,
        TipoEvento,
        toasty,
        CamadasService,
        $http,
        MainState,
        PlanejamentoManager,
        BotoesManager,
        MapaManager,
        EditPTarefaManager,
        MapaService,
        BaseConhecimentoManager,
        IncidenteEnterManager,
        localize,
        PermissoesService) {


        PermissoesService.getPermissoes().then(function (perms) {
            $scope.permissoesVisualizacao = perms.permissoesVisualizacao;
            $scope.permissoesCriacao = perms.permissoesCriacao;
            $scope.permissoesEdicao = perms.permissoesEdicao;
            $scope.permissoesRemocao = perms.permissoesRemocao;
        });

        CommService.on('planejamentoNewDesenho', function (data) {
            $scope.planejamentoModel.Camadas.push(data);
            popularDesenhos();
        });

        $scope.terminoLTinicio = false;
        $scope.res = $scope.$root.res;

        var desenhando = false,
            usuario = {},
            novo = false,
            salvo = false,
            desenhos = {},
            kmls = {},
            editandoAtualmente = null;

        $scope.$botoes = BotoesManager;

        $scope.botoesItems = [{
            title: 'Twitter',
            icon: '/assets/images/Incidentes/ic_social_twitter_color_24px.svg',
            action: function () {
                $scope.planejamentoModel.tipoObjeto = 'planejamento';

                var geojson = JSON.parse($scope.planejamentoModel.geojson);
                var lat = geojson.coordinates[1];
                var long = geojson.coordinates[0];

                var info = { latitude: lat, longitude: long };

                $scope.$botoes.abrirTwitter(info);
            }
        }, {
            title: $scope.res('MAIN_MENU_MENSAGERIA'),
            icon: '/assets/images/Incidentes/ic_social_telegram_color_24px.svg',
            action: function () {
                $scope.planejamentoModel.tipoObjeto = 'planejamento';
                $scope.$botoes.abrirMensageria(true, $scope.planejamentoModel);
            }
        }];
        $scope.openShare = false;
        $scope.openOptionShare = function () {
            $scope.openShare = !$scope.openShare;
        };

        $scope.$watch('lineColor', function (value) {
            MapaManager.definirCorDaLinha(value);
        });

        var uploader = $scope.uploader = new FileUploader(),
            listaEquals = [];

        var uploaderKml = $scope.uploaderKml = new FileUploader();

        $scope.uploaderKml.filters.push({
            'name': 'checkIsFileKML',
            'fn': function (item, evt) {
                var extn = item.name.split(".").pop();

                if (extn !== 'kml' && extn !== 'kmz') {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title(localize.res('ARQUIVO_FORMATONAOPERMITIDO'))
                            .content(localize.res('ARQUIVO_KMLKMZINVALIDO'))
                            .ok(localize.res('COMUM_OK')));

                    return false;
                } else {
                    return true;
                }
            }
        });

        $scope.uploader.filters.push({
            'name': 'enforceMaxFileSize',
            'fn': function (item, evt) {
                var megaByte = parseInt(item.size / 1000000) + "MB";
                if (item.size <= 26214400) {
                    return item.size <= 26214400
                } else {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title(localize.res('ARQUIVO_TAMANHOULTRAPASSADO'))
                            .content(localize.res('ARQUIVO_TAMANHOMAXIMOUPLOAD'))
                            .ok(localize.res('COMUM_OK')))
                    return item.size <= 26214400
                }
            }
        });

        $scope.tableParams = new ngTableParams({ // Parameters
            page: 1,
            count: 100,
            sorting: {
                date: 'asc'
            }
        }, {
            counts: [],
            total: 1,
        });

        /**
         * @method deletePlanejamentoQuestion
         */
        $scope.deletePlanejamentoQuestion = function (evt) {

            var msgRemover = localize.getLocalizedString('COMUM_REMOVER') + ' ' + localize.getLocalizedString('PLANEJAMENTO_TITULO') + '?';
            $mdDialog.show({
                targetEvent: evt,
                scope: $scope.$new(),
                template: '<md-dialog>' +
                    '  <md-content>' + msgRemover + '</md-content>' +
                    '  <div class="md-actions">' +
                    '    <md-button ng-click="deletePlanejamento()">' + localize.res('COMUM_SIM') + '</md-button>' +
                    '    <md-button ng-click="deleteCancel()">' + localize.res('COMUM_NAO') + '</md-button>' +
                    '  </div>' +
                    '</md-dialog>'
            });
        };

        /**
         * @method deleteCancel
         */
        $scope.deleteCancel = function () {
            $mdDialog.hide();
        };

        /**
         * @method deletePlanejamento
         */
        $scope.deletePlanejamento = function () {
            $mdDialog.hide();
            var geojson = JSON.parse($scope.planejamentoModel.geojson);
            PlanejamentoService.findAndDelete($scope.planejamentoModel.id)
                .then(function (data) {
                    PlanejamentoManager.fechar();
                    //fecharPlanejamento();
                    var mensagem = '';
                    var titulo;
                    if (data.message == 'PERMISSAO_EXCLUIR_PLANEJAMENTO') {
                        mensagem = localize.getLocalizedString(data.message);
                        titulo = localize.getLocalizedString('COMUM_AVISO');
                    }
                    else {
                        mensagem = localize.getLocalizedString('PLANEJAMENTO_TITULO') + ' ' + localize.getLocalizedString('COMUM_MENSAGEMEXCLUIDOCOMSUCESSO');
                        titulo = localize.getLocalizedString('COMUM_SUCESSO');
                        MapaManager.setView([geojson.coordinates[1], geojson.coordinates[0]], 16);
                        CamadasService.reloadPlanejamentos();
                    }
                    $mdDialog
                        .show($mdDialog.alert()
                            .title(titulo)
                            .content(mensagem)
                            .ok(localize.getLocalizedString('COMUM_OK')));
                }, function (err) {
                    toasty({
                        msg: err.data.message
                    });
                });
        };


        /**
         * @method obterTiposEvento
         */
        (function obterTiposEvento() {
            TipoEvento
                .obterTiposEvento()
                .then(function (tiposEvento) {

                    tiposEvento = _.filter(tiposEvento, function (evento) {
                        return evento.status == 1;
                    });

                    $scope.tiposEvento = _.uniq(tiposEvento, 'id');
                });
        }());

        /**
         * @method date2timestamp
         * @param {*} dateString 
         */
        function date2timestamp(dateString) {
            if (!dateString) {
                return;
            }
            var dateParts = dateString.split(' ');
            var timeParts = dateParts[1].split(':');
            var date;

            dateParts = dateParts[0].split('/');

            date = new Date(dateParts[2], parseInt(dateParts[1], 10) - 1, dateParts[0], timeParts[0], timeParts[1]);

            return date.getTime();
        }

        /**
         * @method timestamp2date
         * @param {*} timestamp 
         */
        function timestamp2date(timestamp) {

            if (!timestamp) {
                return null;
            }

            var date = moment(parseInt(timestamp, 10)).format('DD/MM/YYYY HH:mm');

            return date;
        }

        /**
         * @method _removerDesenhosAtivos
         */
        function _removerDesenhosAtivos() {

            var promises = [];

            _.chain(desenhos)
                .keys()
                .each(function (key) {
                    promises.push(MapaService.removerCamada(desenhos[key]));
                })
                .value();

            desenhos = {};
            promises.push(MapaService.removerControleDesenho());

            return $q.all(promises);
        }

        /**
         * @method popularDesenhos
         */
        function popularDesenhos() {
            _removerDesenhosAtivos().then(function () {
                if ($scope.planejamentoModel.ContextoOperacional.Camada) {
                    var camada = $scope.planejamentoModel.ContextoOperacional.Camada;
                    camada.ativo = false;
                    toggleCamadaPlanejamento(camada);
                }

                var resultado = {};

                _.each($scope.planejamentoModel.Camadas, function (camada) {
                    if (camada.tipo === 'DESENHO') {
                        camada.ativo = false;

                        toggleCamadaPlanejamento(camada);

                        if (camada.id) {
                            var _d = camada.Departamento;

                            resultado[_d.id] = resultado[_d.id] || {
                                id: _d.id,
                                nome: _d.nome,
                                data: []
                            };

                            resultado[camada.Departamento.id].data.push(camada);
                        } else {
                            resultado['novo'] = resultado['novo'] || {
                                id: null,
                                data: []
                            }
                            resultado['novo'].data.push(camada);
                        }
                    }
                });

                $scope.desenhos = resultado;
            });
        }

        /**
         * @method popularKmls
         */
        function popularKmls() {
            $scope.kmls = [];

            var resultado = {};

            _.each($scope.planejamentoModel.Camadas, function (camada) {
                if (camada.tipo === 'KML') {
                    if (camada.id) {
                        var _d = camada.Departamento;
                        resultado[_d.id] = {
                            id: _d.id,
                            nome: _d.nome,
                            data: []
                        };
                    } else {
                        resultado.novo = {
                            id: null,
                            nome: localize.getLocalizedString('COMUM_NOVOARQUIVO'),
                            data: []
                        };
                    }
                }
            });

            _.each($scope.planejamentoModel.Camadas, function (camada) {
                if (camada.tipo === 'KML') {
                    if (camada.id) {
                        resultado[camada.Departamento.id].data.push(camada);
                    } else {
                        resultado.novo.data.push(camada);
                    }
                }
            });

            $scope.kmls = resultado;
        }

        /* Adicionar Camada */
        /**
         * @method adicionarCamada
         * @param {*} camada 
         */
        function adicionarCamada(camada) {

            var geojson = MapaService.pegarGeometrias();

            $mdDialog.show({
                templateUrl: 'app/directives/planejamento/dialog-camada.html',
                controller: function ($scope) {
                    $scope.res = $scope.$root.res;
                    $scope.camada = {
                        nome: camada ? camada.nome : null
                    };
                    $scope.tipo = 'Desenho';
                    $scope.rename = function () {
                        $mdDialog.hide($scope.camada.nome);
                    };
                    $scope.res = $scope.$root.res;
                },
                locals: {}
            }).then(function (nome) {

                if (camada) {
                    var camadaPlanejamento = _.find($scope.planejamentoModel.Camadas, {
                        geoJSON: camada.geoJSON
                    });
                    camadaPlanejamento.geoJSON = geojson;
                    camadaPlanejamento.nome = nome
                } else {
                    $scope.planejamentoModel.Camadas.push({
                        nome: nome,
                        geoJSON: MapaService.pegarGeometrias(),
                        tipo: 'DESENHO',
                        DepartamentoId: AuthService.user.info.DepartamentoId
                    });
                }

                popularDesenhos();
                desenhando = false;
                editandoAtualmente = null;
                MapaService.removerControleDesenho();
                MapaService.removerPontosPlanejamento();
            });
        }

        /**
         * @method adicionarTarefa
         * @param {*} tarefa 
         */
        function adicionarTarefa(tarefa) {
            if (tarefa.Camada != undefined && tarefa.Camada != null) {
                var camada = _.cloneDeep(tarefa.Camada);
                camada.geoJSON = JSON.stringify(camada.geoJSON);
                camada.departamentoId = AuthService.user.info.Departamento.id;
                delete camada.objmapa;
                tarefa.Camada = camada;
            }

            if (tarefa.dataInicio)
                tarefa.dataInicio = $scope.date2timestamp(tarefa.dataInicio);

            if (tarefa.dataFim)
                tarefa.dataFim = $scope.date2timestamp(tarefa.dataFim);

            if ($scope.planejamentoModel.Tarefas === undefined)
                $scope.planejamentoModel.Tarefas = [];

            // pop previus if exists:
            var findBy = {
                'id': tarefa.id
            };
            if (tarefa.id === undefined || tarefa.id == null)
                findBy = {
                    'tempId': tarefa.tempId
                };
            var tarefaIndex = _.findIndex($scope.planejamentoModel.Tarefas, findBy);
            if (tarefaIndex >= 0) {
                $scope.planejamentoModel.Tarefas.splice(tarefaIndex, 1);
            }

            $scope.planejamentoModel.Tarefas.push(tarefa);
        }

        /**
         * @method updateTarefa
         * @param {*} tarefa 
         */
        function updateTarefa(tarefa) {
            if ($scope.planejamentoModel.Tarefas === undefined)
                return;

            // pop previus if exists:
            var findBy = {
                'id': tarefa.id
            };
            var tarefaIndex = _.findIndex($scope.planejamentoModel.Tarefas, findBy);
            if (tarefaIndex >= 0) {
                $scope.planejamentoModel.Tarefas.splice(tarefaIndex, 1);
                $scope.planejamentoModel.Tarefas.push(tarefa);
            }
        }

        /**
         * @method toggleKmlPlanejamento
         * @param {*} camada 
         */
        function toggleKmlPlanejamento(camada) {
            if (camada.ativo) {
                PlanejamentoManager.ativarKml(API_ENDPOINT + 'camadas/' + camada.id + '/kml',
                    function (layer) {
                        kmls[camada.id] = layer;
                    });
            } else {
                MapaService.removerCamada(kmls[camada.id]);
            }
        }

        /**
         * @method toggleCamadaPlanejamento
         * @param {*} camada 
         */
        function toggleCamadaPlanejamento(camada) {

            if (typeof camada.geoJSON == 'string') {
                camada.geoJSON = JSON.parse(camada.geoJSON);
            }

            if (camada.ativo) {
                MapaService.ativarCamadaPlanejamento(camada.geoJSON).then(function (desenho) {
                    desenhos[JSON.stringify(desenho.feature)] = desenho.layer;
                });
            } else {
                MapaService.removerCamada(desenhos[JSON.stringify(camada.geoJSON)]);
            }

        }

        /**
         * @method uploadArquivos
         * @param {*} _planejamento 
         */
        function uploadArquivos(_planejamento) {
            // upload de arquivos comum
            if (uploader.queue.length > 0) {

                uploader.url = API_ENDPOINT + 'planejamento/arq/' + _planejamento.id;
                _.each(uploader.queue, function (file) {
                    file.formData = [{
                        nome: file.novonome
                    }]
                });
                uploader.uploadAll();
            }

            // upload de arquivos kml
            if (uploaderKml.queue.length > 0) {
                uploaderKml.url = API_ENDPOINT + 'planejamento/' + _planejamento.id + '/kml';
                _.each(uploaderKml.queue, function (file) {
                    file.formData = [{
                        nome: file.novonome,
                        tipo: 'KML',
                        DepartamentoId: AuthService.user.info.Departamento.id
                    }];
                });
                uploaderKml.uploadAll();
            }
        }

        $scope.tentouEnviar = false;
        /**
         * @method salvarPlanejamento
         */
        function salvarPlanejamento() {

            $scope.tentouEnviar = true;

            $("#button_salvar_planejamento").prop("disabled", true);
            _.find(listaEquals, function (arq) {
                removerArquivo(arq);
            });

            var cbOk = function (_planejamento) {
                salvo = true;
                _removerDesenhosAtivos();
                uploadArquivos(_planejamento);
                //removerArquivo(listaEquals.id);
                $mdDialog.show(
                    $mdDialog.alert()
                        .title(localize.getLocalizedString('COMUM_SUCESSO'))
                        .content(localize.getLocalizedString('PLANEJAMENTO_TITULO') + ' ' + localize.getLocalizedString('COMUM_MENSAGEM_SALVOCOMSUCESSO'))
                        .ariaLabel('')
                        .ok(localize.getLocalizedString('COMUM_OK'))
                ).then(function () {
                    CamadasService.reloadPlanejamentos();
                    //CamadasService.exibirPlanejamentos();
                });
                $scope.tentouEnviar = false;
                $("#button_salvar_planejamento").prop("disabled", false);
                PlanejamentoManager.fechar();
            };

            var cbError = function (err) {
                $("#button_salvar_planejamento").prop("disabled", false);
                $scope.tentouEnviar = false; //VERIFICAR SE VAI DAR ERRO;
                if (err.status = 403) {
                    toasty({
                        msg: err.data.message
                    });
                } else {
                    $("#button_salvar_planejamento").prop("disabled", false);
                    $mdDialog.show(
                        $mdDialog.alert()
                            .title(localize.getLocalizedString('COMUM_ERRO'))
                            .content(localize.getLocalizedString('PLANEJAMENTO_ERROAOSALVAR'))
                            .ariaLabel('')
                            .ok(localize.getLocalizedString('COMUM_OK'))
                    );
                }
            };

            _salvarPlanejamento(cbOk, cbError);
        }

        /* Enviar Planejamento */
        /**
         * @method enviarPlanejamento
         */
        function enviarPlanejamento() {
            var cbOk = function (_planejamento) {
                CamadasService.reloadPlanejamentos();
                salvo = true;
                _removerDesenhosAtivos();
                uploadArquivos(_planejamento);
                PlanejamentoService.enviarPlanejamento({
                    id: _planejamento.id
                }).then(function (_planejamento) {
                    $("#button_salvar_planejamento").prop("disabled", false);
                    $mdDialog.show(
                        $mdDialog.alert()
                            .title(localize.getLocalizedString('COMUM_SUCESSO'))
                            .content(localize.getLocalizedString('PLANEJAMENTO_MENSAGEMENVIADO'))
                            .ariaLabel('')
                            .ok(localize.getLocalizedString('COMUM_OK'))
                    ).then(function () {
                        PlanejamentoManager.fechar();
                    });
                }, function (err) {
                    $("#button_salvar_planejamento").prop("disabled", false);
                    if (err.status = 403) {
                        toasty({
                            msg: err.data.message
                        });
                        PlanejamentoManager.fechar();
                    } else {
                        $mdDialog.show(
                            $mdDialog.alert()
                                .title(localize.getLocalizedString('COMUM_ERRO'))
                                .content(localize.getLocalizedString('PLANEJAMENTO_MENSAGEMERROAOENVIAR'))
                                .ariaLabel('')
                                .ok(localize.getLocalizedString('COMUM_OK'))
                        ).then(function () {
                            PlanejamentoManager.fechar();
                        });
                    }
                });
            };

            var cbError = function (err) {
                if (err.status = 403) {
                    toasty({
                        msg: err.data.message
                    });
                } else {
                    $mdDialog.show(
                        $mdDialog.alert()
                            .title(localize.getLocalizedString('COMUM_ERRO'))
                            .content(localize.getLocalizedString('PLANEJAMENTO_ERROAOSALVAR'))
                            .ariaLabel('')
                            .ok(localize.getLocalizedString('COMUM_OK'))
                    );
                }
            };

            _salvarPlanejamento(cbOk, cbError);
        }

        /**
         * @method _salvarPlanejamento
         * @param {*} cbOk 
         * @param {*} cbError 
         */
        function _salvarPlanejamento(cbOk, cbError) {
            if (!$scope.formPlanejamento.$valid) {
                $("#button_salvar_planejamento").prop("disabled", false);
                return;
            }

            var filtroPermissao = {};
            filtroPermissao.objeto = "CRIAR_PLANEJAMENTO";
            filtroPermissao.latitude = $scope.planejamentoModel.ponto.marker.getLatLng().lat;
            filtroPermissao.longitude = $scope.planejamentoModel.ponto.marker.getLatLng().lng;

            PermissoesService.verificarPermissaoAreaAtuacao(filtroPermissao)
                .then(function (result) {
                    if (result) {

                        var filtros = [];

                        _.each($scope.planejamentoModel.Camadas, function (camada) {
                            if (camada.geoJSON != null && camada.geoJSON.features) {
                                _.each(camada.geoJSON.features, function (feature) {
                                    filtroPermissao = {};
                                    filtroPermissao.nome = camada.nome;
                                    filtroPermissao.objeto = "CRIAR_PLANEJAMENTO";
                                    filtroPermissao.geoJson = JSON.stringify(feature.geometry);
                                    filtros.push(filtroPermissao);
                                });
                            }
                        });

                        //Verifica permissão para cada desenho feito
                        PermissoesService.verificarPermissaoAreaAtuacaoLista(filtros)
                            .then(function (listPermissoes) {
                                for (var i = 0; i < listPermissoes.length; i++) {
                                    var permissao = listPermissoes[i];
                                    if (!permissao.temPermissao) {
                                        $mdDialog
                                            .show($mdDialog.alert()
                                                .title($scope.res('COMUM_AVISO'))
                                                .content(permissao.nome + ' - ' + $scope.res('PERMISSAO_AREAATUACAO_VERIFICACAO'))
                                                .ok($scope.res('COMUM_OK')));
                                        $("#button_salvar_planejamento").prop("disabled", false);
                                        return;
                                    }
                                }

                                confirmarSalvarPlanejamento(cbOk, cbError);
                            });
                    }
                    else {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_AVISO'))
                                .content($scope.res('PERMISSAO_AREAATUACAO_VERIFICACAO'))
                                .ok($scope.res('COMUM_OK')));
                        $("#button_salvar_planejamento").prop("disabled", false);
                        return;
                    }
                });
        }

        /**
         * @method confirmarSalvarPlanejamento
         * @param {*} cbOk 
         * @param {*} cbError 
         */
        function confirmarSalvarPlanejamento(cbOk, cbError) {

            var inicio, fim;
            if ($scope.planejamentoModel.inicio) {

                $scope.date2timestamp($scope.planejamentoModel.inicio);
                inicio = $scope.date2timestamp($scope.planejamentoModel.inicio);
            } else {
                inicio = null;
            }

            if ($scope.planejamentoModel.fim) {
                fim = $scope.date2timestamp($scope.planejamentoModel.fim);
            } else {
                fim = null;
            }

            if (fim <= inicio) {
                $scope.terminoLTinicio = true;
                $("#button_salvar_planejamento").prop("disabled", false);
                return;
            }

            $scope.dateOptions = {
                changeYear: true,
                changeMonth: true,
                yearRange: '1900:-0'
            };

            if ($scope.planejamentoModel.ponto) {
                $scope.planejamentoModel.latitude = $scope.planejamentoModel.ponto.marker.getLatLng().lat;
                $scope.planejamentoModel.longitude = $scope.planejamentoModel.ponto.marker.getLatLng().lng;
            }

            var camadas = _.map($scope.planejamentoModel.Camadas, function (camada) {

                var _camada = _.cloneDeep(camada);

                _camada.geoJSON = JSON.stringify(_camada.geoJSON);
                _camada.departamentoId = AuthService.user.info.Departamento.id
                delete _camada.objmapa;

                return _camada;
            })

            _.each($scope.planejamentoModel.Camadas, function (camada) {
                camada.geoJSON = JSON.stringify(camada.geoJSON);
                camada.departamentoId = AuthService.user.info.Departamento.id
            });

            var ContextoOperacional = _.cloneDeep($scope.planejamentoModel.ContextoOperacional);
            if ($scope.planejamentoModel.ContextoOperacional.Camada) {
                var camada = ContextoOperacional.Camada;
                camada.geoJSON = JSON.stringify(camada.geoJSON);
                camada.departamentoId = AuthService.user.info.Departamento.id;
                delete camada.objmapa;
                ContextoOperacional.Camada = camada;
            }

            $scope.onTimeSet = function (newDate, oldDate) { };

            _.each($scope.planejamentoModel.Tarefas, function (tarefa) {
                tarefa.createdAt = null;
                tarefa.updatedAt = null;

                if (tarefa.Camada != null && tarefa.Camada.Departamento != null) {
                    tarefa.Camada.Departamento.createdAt = null;
                    tarefa.Camada.Departamento.updatedAt = null;
                }
            });

            _.each(camadas, function (camada) {
                if (camada.Departamento != null) {
                    camada.Departamento.createdAt = null;
                    camada.Departamento.updatedAt = null;
                }
            });

            _.each($scope.planejamentoModel.Camadas, function (camada) {
                if (camada.Departamento != null) {
                    camada.Departamento.createdAt = null;
                    camada.Departamento.updatedAt = null;
                }
            });

            PlanejamentoService.salvarPlanejamento({
                id: $scope.planejamentoModel.id,
                nome: $scope.planejamentoModel.nome,
                inicio: inicio,
                fim: fim,
                tipoEvento: $scope.planejamentoModel.tipoEvento,
                camadas: camadas,
                usuariosParticipantes: $scope.usuariosParticipantes,
                departamentosParticipantes: $scope.departamentosParticipantes,
                descricao: $scope.planejamentoModel.descricao,
                latitude: $scope.planejamentoModel.latitude,
                longitude: $scope.planejamentoModel.longitude,
                Tarefas: $scope.planejamentoModel.Tarefas,
                UsuariosParticipantes: $scope.UsuariosParticipantes,
                GruposUsuariosParticipantes: $scope.GruposUsuariosParticipantes,
                ContextoOperacional: ContextoOperacional
            }).then(cbOk, cbError);
        }

        /* Abrir Planejamento */
        /**
         * @method abrirPlanejamento
         * @param {*} obj 
         * @param {*} planejamento 
         * @param {*} _usuario 
         * @param {*} evt 
         */
        function abrirPlanejamento(obj, planejamento, _usuario, evt) {

            if (BaseConhecimentoManager.ativo || IncidenteEnterManager.ativo) {

                var msgModuloAberto = localize.getLocalizedString('COMUM_MENSAGEMMODULOATIVO');
                var sim = localize.getLocalizedString('COMUM_SIM');
                var nao = localize.getLocalizedString('COMUM_NAO');

                $mdDialog.show({
                    targetEvent: evt,
                    scope: $scope.$new(),
                    template: '<md-dialog>' +
                        '  <md-content>' + msgModuloAberto + '</md-content>' +
                        '  <div class="md-actions">' +
                        '    <md-button ng-click="$api.OpenAndClose(obj);closeModal();">' + sim + '</md-button>' +
                        '    <md-button ng-click="closeModal()">' + nao + '</md-button>' +
                        '  </div>' +
                        '</md-dialog>'
                });

                PlanejamentoManager.fechar();
                //BaseConhecimentoManager.removeMarker();

            }

            desenhando = false;
            usuario = _usuario;

            $scope.ativo = true;
            $scope.planejamentoModel = {};
            $scope.planejamentoModel.Camadas = [];
            $scope.planejamentoModel.Tarefas = [];
            $scope.planejamentoModel.ContextoOperacional = {
                Categorias: [],
                Acervos: []
            }
            $scope.planejamentoModel.ponto = obj;
            //$scope.planos = planejamento.PlanoDeAcaos;
            //$scope.uploader.clearQueue();
            //$scope.uploaderKml.clearQueue();

            novo = true;
            salvo = false;

            if (planejamento) {
                novo = false;

                $scope.usuariosParticipantes = _.map(planejamento.participantes, function (usuario) {
                    usuario.usuario = true;
                    return usuario;
                });

                $scope.departamentosParticipantes = _.map(planejamento.Departamentos, function (departamento) {
                    departamento.departamento = true;
                    return departamento;
                })

                $scope.planejamentoModel = planejamento;
                $scope.planejamentoModel.autor = $scope.planejamentoModel.criador.nome + ' - ' +
                    $scope.planejamentoModel.criador.Departamento.nome;
                $scope.planejamentoModel.dataHoraCriacao =
                    moment($scope.planejamentoModel.dataHoraCriacao).format('DD/MM/YYYY - HH:mm');
                $scope.planejamentoModel = planejamento;
                $scope.planejamentoModel.ponto = obj;
                $scope.planejamentoModel.tipoEvento = planejamento.TipoEvento.id;
                $scope.planejamentoModel.inicio = timestamp2date($scope.planejamentoModel.inicio);
                $scope.planejamentoModel.fim = timestamp2date($scope.planejamentoModel.fim);
                if (!$scope.planejamentoModel.ContextoOperacional)
                    $scope.planejamentoModel.ContextoOperacional = {
                        Categorias: [],
                        Acervos: []
                    }

                $scope.UsuariosParticipantes = planejamento.UsuariosParticipantes;
                $scope.GruposUsuariosParticipantes = planejamento.GruposUsuariosParticipantes;
                popularDesenhos();
                popularKmls();
                identifyCategorias();

            } else {
                popularDesenhos();
                popularKmls();
            }

        }

        /**
         * @method OpenAndClose
         * @param {*} obj 
         */
        function OpenAndClose(obj) {

            if (BaseConhecimentoManager.ativo || IncidenteEnterManager.ativo) {
                BaseConhecimentoManager.fechar();
                IncidenteEnterManager.fechar();
            }

            PlanejamentoManager.abrir();
        }

        /**
         * @method removerArquivo
         * @param {*} arquivo 
         */
        function removerArquivo(arquivo) {
            $http.delete(API_ENDPOINT + 'filemanager/' + arquivo.id)
                .then(function (res) {
                    var index = $scope.planejamentoModel.Arquivos.indexOf(arquivo);
                    $scope.planejamentoModel.Arquivos.splice(index, 1);
                });

        }

        /**
         * @method identifyCategorias
         */
        function identifyCategorias() {
            _.each($scope.planejamentoModel.ContextoOperacional.Categorias, function (cat) {
                cat.tipo = 'c';
            });
            _.each($scope.planejamentoModel.ContextoOperacional.Acervos, function (ace) {
                ace.tipo = 'a';
            });
        }

        /* Fechar Planejamento */
        /**
         * @method fecharPlanejamento
         */
        function fecharPlanejamento() {
            $scope.openShare = false;

            _removerCamadasAtivas();
            _removerDesenhosAtivos();

            if (!novo) {
                if ($scope.planejamentoModel.ponto) {
                    $scope.planejamentoModel.ponto.undraggable();
                    if (!salvo) {
                        $scope.planejamentoModel.ponto.marker.setLatLng(new L.LatLng($scope.planejamentoModel.ponto.oldLat, $scope.planejamentoModel.ponto.oldLng));
                    }
                }
            }

            $scope.ativo = false;
            $scope.planejamentoModel = {};
            $scope.planejamentoModel.ContextoOperacional = {
                Categorias: [],
                Acervos: []
            }
            $scope.formPlanejamento.$setPristine();
            $scope.formPlanejamento.$setUntouched();
            $scope.UsuariosParticipantes = [];
            $scope.GruposUsuariosParticipantes = [];

            return desenhando;
        }

        /* Abrir Upload */
        /**
         * @method abrirUpload
         */
        function abrirUpload() {
            $scope.input.click();
        }

        /**
         * @method abrirUploadKml
         */
        function abrirUploadKml() {
            $scope.inputKml.click();
        }

        /**
         * @method abrirUploadExcel
         */
        function abrirUploadExcel() {
            $scope.inputExcel.click();
        }

        /**
         * @method adicionarDesenho
         */
        function adicionarDesenho() {
            MapaService.planejar();
            desenhando = true;
        }

        /**
         * @method criarTarefa
         */
        function criarTarefa() {
            var tarefa = {
                estado: "PENDENTE",
                tempId: Date.now()
            }
            EditPTarefaManager.abrirTarefa(tarefa);
        }

        /**
         * @method editarTarefa
         * @param {*} tarefa 
         */
        function editarTarefa(tarefa) {
            var tarefaCopy = angular.copy(tarefa);

            if (tarefaCopy.dataInicio)
                tarefaCopy.dataInicio = $scope.timestamp2date(tarefaCopy.dataInicio);

            if (tarefaCopy.dataFim)
                tarefaCopy.dataFim = $scope.timestamp2date(tarefaCopy.dataFim);

            EditPTarefaManager.abrirTarefa(tarefaCopy);
        }

        /**
         * @method changeColor
         * @param {*} pTarefaModel 
         */
        function changeColor(pTarefaModel) {
            function toUpperCase(val) {
                if (val)
                    return val.toUpperCase();
                else
                    return "";
            }
            var estadosFechada = ["FECHADA", "ENTREGUE", "EXECUTADA", "CONCLUIDA"];
            var estadosAberta = ["PENDENTE"];
            var estadosCancelada = ["CANCELADA"];

            if (estadosFechada.indexOf(toUpperCase(pTarefaModel.estado)) >= 0) {
                return { 'background-color': '#8AC249' };
            } else if (estadosAberta.indexOf(toUpperCase(pTarefaModel.estado)) >= 0) {
                return { 'background-color': '#F34235' };
            } else if (estadosCancelada.indexOf(toUpperCase(pTarefaModel.estado)) >= 0) {
                return { 'background-color': '#862490' };
            }
        }

        /**
         * @method selecionar
         * @param {*} item 
         */
        function selecionar(item) {
            if (!item) {
                return;
            }

            if (item.departamento) {
                if (_.find($scope.departamentosParticipantes, {
                    'id': item.id
                })) {
                    return;
                }
                $scope.departamentosParticipantes.push(item);
            } else {
                if (_.find($scope.usuariosParticipantes, {
                    'id': item.id
                })) {
                    return;
                }
                $scope.usuariosParticipantes.push(item);
            }
        }

        /**
         * @method removerItemCompartilhamento
         * @param {*} item 
         */
        function removerItemCompartilhamento(item) {
            if (item.departamento) {
                var agenciaIndex = _.findIndex($scope.departamentosParticipantes, {
                    'id': item.id
                })
                if (agenciaIndex < 0) {
                    return;
                }
                $scope.departamentosParticipantes.splice(agenciaIndex, 1);
            } else {
                var participanteIndex = _.findIndex($scope.usuariosParticipantes, {
                    'id': item.id
                });
                if (participanteIndex < 0) {
                    return;
                }
                $scope.usuariosParticipantes.splice(participanteIndex, 1);
            }
        }

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

            /* Roda as duas promises em paralelo e chama o callback */
            async.parallel([

                function (callback) {
                    PlanejamentoService.searchDepartamentoByName(searchTerm)
                        .then(function (departamentos) {
                            var results = departamentos || [];
                            callback(null, _.map(results, function (departamento) {
                                departamento.departamento = true;
                                return departamento;
                            }));
                        }, function (err) {
                            callback(err);
                        });
                },
                function (callback) {
                    PlanejamentoService.searchUsuarioByName(searchTerm)
                        .then(function (usuarios) {
                            var results = usuarios || [];
                            callback(null, _.map(results, function (usuario) {
                                usuario.usuario = true;
                                return usuario;
                            }));
                        }, function (err) {
                            callback(err);
                        });
                }
            ], function (err, results) {
                /*
                 * Results[0] é o resultado da primeira promise
                 * Results[1] é o resultado da segunda promise
                 * independente de qual terminou primeiro (é asíncrono)
                 */
                if (err) {
                    // Cuidar do erro..
                    deferred.reject(results);
                    return;
                }

                /* Transforma results em um array
                 * de um só nível: */
                results = _.flatten(results);
                deferred.resolve(results);
            });

            return deferred.promise;
        }

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

            async.parallel([

                function (callback) {
                    PlanejamentoService.searchCategoriaByName(searchTerm)
                        .then(function (departamentos) {
                            var results = departamentos || [];
                            callback(null, _.map(results, function (categoria) {
                                categoria.tipo = 'c';
                                return categoria;
                            }));
                        }, function (err) {
                            callback(err);
                        });
                },
                function (callback) {
                    PlanejamentoService.searchAcervoByName(searchTerm)
                        .then(function (usuarios) {
                            var results = usuarios || [];
                            callback(null, _.map(results, function (acervo) {
                                acervo.tipo = 'a';
                                return acervo;
                            }));
                        }, function (err) {
                            callback(err);
                        });
                }
            ], function (err, results) {
                /*
                 * Results[0] é o resultado da primeira promise
                 * Results[1] é o resultado da segunda promise
                 * independente de qual terminou primeiro (é asíncrono)
                 */
                if (err) {
                    // Cuidar do erro..
                    deferred.reject(results);
                    return;
                }

                /* Transforma results em um array
                 * de um só nível: */
                results = _.flatten(results);
                deferred.resolve(results);
            });

            return deferred.promise;
        }

        /**
         * @method seleccionarCategoria
         * @param {*} categoria 
         */
        function seleccionarCategoria(categoria) {
            if (categoria === undefined)
                return;

            $scope.selectedItem = null;
            $scope.searchTerm = '';

            if (categoria.tipo == 'c') {
                var index = _.findIndex($scope.planejamentoModel.ContextoOperacional.Categorias, {
                    'id': categoria.id
                });
                if (index >= 0) {
                    return;
                }

                $scope.planejamentoModel.ContextoOperacional.Categorias.push(categoria);
            } else {
                var index = _.findIndex($scope.planejamentoModel.ContextoOperacional.Acervos, {
                    'id': categoria.id
                });
                if (index >= 0) {
                    return;
                }

                $scope.planejamentoModel.ContextoOperacional.Acervos.push(categoria);
            }
        }

        /**
         * @method removerCategoria
         * @param {*} categoria 
         */
        function removerCategoria(categoria) {
            if (categoria.tipo == 'c') {
                var index = _.findIndex($scope.planejamentoModel.ContextoOperacional.Categorias, {
                    'id': categoria.id
                })
                if (index < 0) {
                    return;
                }
                $scope.planejamentoModel.ContextoOperacional.Categorias.splice(index, 1);
            } else {
                var index = _.findIndex($scope.planejamentoModel.ContextoOperacional.Acervos, {
                    'id': categoria.id
                })
                if (index < 0) {
                    return;
                }
                $scope.planejamentoModel.ContextoOperacional.Acervos.splice(index, 1);
            }

        }

        /**
         * @method removerTarefa
         * @param {*} tarefaIndex 
         */
        function removerTarefa(tarefaIndex) {
        	/*
            var tarefaIndex = _.findIndex($scope.planejamentoModel.Tarefas, {
                'nome': tarefa.nome
            });
            */
            if (tarefaIndex < 0) {
                return;
            }
            $scope.planejamentoModel.Tarefas.splice(tarefaIndex, 1);
        }

        $scope.uploader.onCompleteItem = function (item, response) {
            $scope.planejamentoModel = response;
        };

        $scope.uploader.onBeforeUploadItem = function (item) {
            item.url = uploader.url;
            var token = window.sessionStorage.getItem('s4cToken');
            var tokenObj = JSON.parse(token);
            item.headers = {
                'Authorization': 'Bearer ' + tokenObj.access_token
            };
            item.file.name = item.novoNome + ext(item.file.name);

        };


        $scope.uploaderKml.onBeforeUploadItem = function (item) {
            item.url = uploaderKml.url;
        };

        $scope.uploaderKml.onAfterAddingFile = function (item) {
            $mdDialog.show({
                templateUrl: 'app/directives/planejamento/dialog-camada.html',
                controller: function ($scope) {
                    $scope.res = $scope.$root.res;
                    $scope.camada = {};
                    $scope.tipo = 'Arquivo';
                    $scope.rename = function () {
                        item.novonome = $scope.camada.nome;
                        $mdDialog.hide();
                    }
                },
                locals: {}
            }).then(function () { }, function () {
                uploaderKml.removeFromQueue(item);
            });
        };
        $scope.closeModal = function () {
            $mdDialog.hide();
        }
        $scope.uploader.onAfterAddingFile = function (item, evt, arquivo) {
            $scope.isUploading = true;
            item.novoNome = item.file.name;
            console.log(listaEquals);
            var hasFile = _.find($scope.planejamentoModel.Arquivos, function (arq) {
                if (arq.nome === item.novoNome) {
                    listaEquals.push(arq);
                }
                return arq.nome === item.novoNome;
            });

            var msgArqExiste = localize.getLocalizedString('PLANEJAMENTO_MENSAGEMARQUIVOJAEXISTE');
            var sim = localize.getLocalizedString('COMUM_SIM');
            var nao = localize.getLocalizedString('COMUM_NAO');

            if (hasFile) {
                $mdDialog.show({
                    targetEvent: evt,
                    scope: $scope.$new(),
                    template: '<md-dialog>' +
                        '  <md-content>' + msgArqExiste + '</md-content>' +
                        '  <div class="md-actions">' +
                        '    <md-button ng-click="salvarPlanejamento()">' + sim + '</md-button>' +
                        '    <md-button ng-click="$api.fecharPlanejamento()">' + nao + '</md-button>' +
                        '  </div>' +
                        '</md-dialog>'
                });

            }
        }

        $scope.uploader.onCompleteAll = function () {
            $scope.isUploading = false;
        };

        $scope.uploader.alias = 'arquivo';
        $scope.uploader.removeAfterUpload = true;
        $scope.uploaderKml.alias = 'arquivo';
        $scope.uploaderKml.removeAfterUpload = true;

        /**
         * @method ext
         * @param {*} filename 
         */
        function ext(filename) {
            var index = _.lastIndexOf(filename, '.');
            return filename.substring(index, filename.length);
        }

        /**
         * @method salvarCODesenho
         */
        function salvarCODesenho() {
            var camada = {
                nome: 'Desenho'
            };

            camada.geoJSON = MapaService.pegarGeometrias();
            camada.tipo = 'DESENHO';
            camada.DepartamentoId = AuthService.user.info.DepartamentoId;
            $scope.planejamentoModel.ContextoOperacional.Camada = camada;
            popularDesenhos();
            desenhando = false;
            MapaService.removerControleDesenho();
            MapaService.removerPontosPlanejamento();
        }

        /**
         * @method removerCODesenho
         */
        function removerCODesenho() {
            _removerDesenhosAtivos();
            $scope.planejamentoModel.ContextoOperacional.Camada = null;
            popularDesenhos();
        }

        /**
         * @method _removerCamadasAtivas
         */
        function _removerCamadasAtivas() {

            _.each($scope.planejamentoModel.Camadas, function (camada) {
                camada.ativo = false;
                toggleKmlPlanejamento(camada);
            })

        }

        /**
         * @method _removerCamadaFrontend
         * @param {*} camada 
         */
        function _removerCamadaFrontend(camada) {
            camada.ativo = false;

            toggleCamadaPlanejamento(camada);

            _.remove($scope.planejamentoModel.Camadas, {
                geoJSON: camada.geoJSON
            });
            _.chain($scope.desenhos)
                .keys()
                .each(function (key) {
                    _.remove($scope.desenhos[key].data, {
                        geoJSON: camada.geoJSON
                    })
                })
                .value();
        }

        /**
         * @method removerCamada
         * @param {*} camada 
         * @param {*} ev 
         */
        function removerCamada(camada, ev) {
            var confirm = $mdDialog.confirm()
                .title($scope.res('COMUM_CONFIRMACAO'))
                .content(localize.getLocalizedString('PLANEJAMENTO_MENSAGEMREMOVERCAMADA'))
                .ariaLabel(localize.getLocalizedString('PLANEJAMENTO_MENSAGEMREMOVERCAMADA'))
                .targetEvent(ev)
                .ok(localize.getLocalizedString('COMUM_SIM'))
                .cancel(localize.getLocalizedString('COMUM_NAO'));

            $mdDialog.show(confirm)
                .then(function () {
                    if (camada.id) {
                        PlanejamentoService.removerCamada(camada.id).then(function () {
                            _removerCamadaFrontend(camada);
                        });
                    } else {
                        _removerCamadaFrontend(camada);
                    }

                    if (camada == editandoAtualmente) {

                        MapaService.removerControleDesenho();
                        MapaService.removerPontosPlanejamento();
                    }
                });
        }

        /**
         * @method editarCamada
         * @param {*} camada 
         */
        function editarCamada(camada) {
            editandoAtualmente = camada;

            camada.disabled = true;

            MapaService.planejar(null, {
                camadaPlanejamento: camada,
                layer: desenhos[JSON.stringify(camada.geoJSON)]
            });
        };

        /**
         * @method download
         * @param {*} id 
         * @param {*} fileName 
         */
        function download(id, fileName) {

            $http.get('/filemanager/checkexistence/' + id)
                .then(function (response) {
                    if (response.data) {

                        PlanejamentoService.getAttachedFile(id)
                            .then(function (data) {

                                var a = document.createElement("a");
                                document.body.appendChild(a);
                                a.style = "display: none";

                                var file = new Blob([data], { type: 'application/octet-stream' });
                                var fileURL = URL.createObjectURL(file);

                                a.href = fileURL;
                                a.download = fileName;
                                a.click();

                            });
                    }
                    else {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title(localize.getLocalizedString('COMUM_ERRO'))
                                .content(response.data.message)
                                .ok(localize.getLocalizedString('COMUM_OK')));
                    }
                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title(localize.getLocalizedString('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok(localize.getLocalizedString('COMUM_OK')));
                });

        }

        angular.extend($scope, {
            ativo: false,
            isUploading: false,
            planejamentoModel: {
                Camadas: [],
                Tarefas: [],
                ContextoOperacional: {
                    Categorias: [],
                    Acervos: []
                }
            },
            GruposUsuariosParticipantes: [],
            UsuariosParticipantes: [],
            selecionar: selecionar,
            planejamentoArray: [],
            suggest: suggest,
            salvarPlanejamento: salvarPlanejamento,
            enviarPlanejamento: enviarPlanejamento,
            abrirUpload: abrirUpload,
            abrirUploadKml: abrirUploadKml,
            abrirUploadExcel: abrirUploadExcel,
            date2timestamp: date2timestamp,
            download: download,
            timestamp2date: timestamp2date,
            toggleCamadaPlanejamento: toggleCamadaPlanejamento,
            toggleKmlPlanejamento: toggleKmlPlanejamento,
            adicionarDesenho: adicionarDesenho,
            criarTarefa: criarTarefa,
            editarTarefa: editarTarefa,
            removerItemCompartilhamento: removerItemCompartilhamento,
            desenhos: [],
            kmls: [],
            me: AuthService.user.info,
            suggestCategorias: suggestCategorias,
            seleccionarCategoria: seleccionarCategoria,
            removerCategoria: removerCategoria,
            removerCODesenho: removerCODesenho,
            editarCamada: editarCamada,
            removerCamada: removerCamada,
            removerArquivo: removerArquivo,
            changeColor: changeColor,
            $api: {
                abrirPlanejamento: abrirPlanejamento,
                fecharPlanejamento: fecharPlanejamento,
                OpenAndClose: OpenAndClose,
                adicionarCamada: adicionarCamada,
                adicionarTarefa: adicionarTarefa,
                removerTarefa: removerTarefa,
                updateTarefa: updateTarefa,
                salvarCODesenho: salvarCODesenho
            },
            res: $scope.$root.res
        });

        MainState.registerDirective('planejamento', $scope.$api);
        $scope.$on('$destroy', function () {
            MainState.unregisterDirective('planejamento');
        });
    }

    s4cPlanejamento.$inject = [];

    angular.module('s4c.components.planejamento')
        .directive('s4cPlanejamento', s4cPlanejamento);

}());