PageSourceSearch

https://app.calcbank.com.br/assets/javascripts/spreadnet-collateralhistory.js

js calcbank.com.br collected 2026-10-02 07:04:21 UTC 71,211 bytes, 1,913 lines download raw bytes

1// Generated by CoffeeScript 1.12.7
2(function() {
3  var CollateralHistoryController, CollateralHistoryGridController, CollateralHistoryItemController, CollateralLoanStatusDialogController, CollateralNoteDialogController, EditCollateralHistoryController, UpdateValuationDialogController, base, module,
4    indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
5
6  if (this.spreadnet == null) {
7    this.spreadnet = {};
8  }
9
10  this.spreadnet.collateralFilesDialogCtrl = function($scope, $http, Upload, $timeout, CollateralHistoryModel, PendingRequests, feedback, MessiService) {
11    var alreadyNames, attachmentByName, buildNewAttachments, collateralItem, editionFocus, emptyItem, eventBus, finishScreen, hide, nextSDtimeout, nextUEWtimeout, save, saveImmediately, signalDeleted, triggerUploadErrorWarning, uploadErrorWarning;
12    eventBus = spreadnet.eventBus;
13    editionFocus = spreadnet.editionFocus;
14    emptyItem = {
15      attachments: []
16    };
17    alreadyNames = [];
18    collateralItem = emptyItem;
19    saveImmediately = false;
20    $scope.collateralItem = emptyItem;
21    $scope.attachments = [];
22    $scope.showing = false;
23    $scope.show = function(payload) {
24      var item;
25      item = (payload != null ? payload.item : void 0) || emptyItem;
26      saveImmediately = !!(payload != null ? payload.immediate : void 0);
27      collateralItem = item;
28      $scope.collateralItem = collateralItem;
29      $scope.attachments = angular.copy(collateralItem.attachments || []);
30      return $scope.showing = true;
31    };
32    $scope.splitJoin = function(str, len) {
33      var re;
34      re = new RegExp(".{1," + len + "}", 'g');
35      return str.match(re).join('​');
36    };
37    hide = function() {
38      $scope.showing = false;
39      return editionFocus.close();
40    };
41    finishScreen = function() {
42      hide();
43      return $timeout(function() {
44        $scope.attachments = [];
45        collateralItem = emptyItem;
46        return $scope.collateralItem = emptyItem;
47      });
48    };
49    buildNewAttachments = function() {
50      var attachment, newAttachments;
51      newAttachments = (function() {
52        var i, len1, ref, results;
53        ref = $scope.attachments;
54        results = [];
55        for (i = 0, len1 = ref.length; i < len1; i++) {
56          attachment = ref[i];
57          if (!attachment.status) {
58            results.push({
59              _id: attachment._id,
60              name: attachment.name.replaceCharsForUpload(),
61              date: attachment.date
62            });
63          }
64        }
65        return results;
66      })();
67      newAttachments.sort(function(a, b) {
68        var s;
69        s = function(a, b) {
70          if (a === b) {
71            return 0;
72          } else if (a < b) {
73            return -1;
74          } else {
75            return 1;
76          }
77        };
78        return s(a.name, b.name);
79      });
80      return newAttachments;
81    };
82    save = function() {
83      var failedUploads, performSave;
84      performSave = function() {
85        var saveError, saveSuccess;
86        collateralItem.attachments = buildNewAttachments();
87        if (saveImmediately) {
88          saveSuccess = function(savedItem) {
89            collateralItem = savedItem;
90            finishScreen();
91            return feedback.timedSuccess("Documentos atualizados com sucesso.");
92          };
93          saveError = function(error) {
94            return feedback.timedError(error.message);
95          };
96          return CollateralHistoryModel.save(collateralItem, false, saveSuccess, saveError);
97        } else {
98          return finishScreen();
99        }
100      };
101      failedUploads = function() {
102        var attachment, i, len1, ref;
103        ref = $scope.attachments;
104        for (i = 0, len1 = ref.length; i < len1; i++) {
105          attachment = ref[i];
106          if (attachment.status === 'uploadError') {
107            return true;
108          }
109        }
110      };
111      if (saveImmediately && failedUploads()) {
112        return MessiService.confirmDialog("Os arquivos cujo carregamento falhou serão excluídos. Continuar?").then(function(answer) {
113          if (answer) {
114            return performSave();
115          }
116        });
117      } else {
118        return performSave();
119      }
120    };
121    $scope.ok = function() {
122      return save();
123    };
124    $scope.cancel = function() {
125      return finishScreen();
126    };
127    eventBus.subscribe('collateralFilesDialog', $scope.show, $scope);
128    $scope.uploading = function() {
129      return PendingRequests.pending(function(url) {
130        return url === 'upload_collateral';
131      });
132    };
133    $scope.notDeleted = function(attachment) {
134      var ref;
135      return (ref = attachment.status) !== 'deleted' && ref !== 'deleted2';
136    };
137    attachmentByName = function(name) {
138      var att, i, len1, ref;
139      ref = $scope.attachments;
140      for (i = 0, len1 = ref.length; i < len1; i++) {
141        att = ref[i];
142        if (att.name === name) {
143          return att;
144        }
145      }
146    };
147    $scope.onFileSelect = function($files) {
148      var file, largeFiles, largeFilesStr, message, uploadFiles;
149      if (!$files) {
150        return;
151      }
152      uploadFiles = function() {
153        var file, i, inputFile, len1, process, results, upload;
154        results = [];
155        for (i = 0, len1 = $files.length; i < len1; i++) {
156          inputFile = $files[i];
157          if (!(inputFile.size <= 15728640)) {
158            continue;
159          }
160          file = new File([inputFile], inputFile.name.replaceCharsForUpload());
161          upload = function(file, already) {
162            var addToAttachments, upItem;
163            addToAttachments = function() {
164              var att, withUploadError, withoutUploadError;
165              $scope.attachments.unshift({
166                _id: sn.u.UUID(),
167                name: file.name,
168                date: sn.d.fileLastModifiedDate(file).toYMD()
169              });
170              withUploadError = (function() {
171                var j, len2, ref, results1;
172                ref = $scope.attachments;
173                results1 = [];
174                for (j = 0, len2 = ref.length; j < len2; j++) {
175                  att = ref[j];
176                  if (att.status === 'uploadError') {
177                    results1.push(att);
178                  }
179                }
180                return results1;
181              })();
182              withoutUploadError = (function() {
183                var j, len2, ref, results1;
184                ref = $scope.attachments;
185                results1 = [];
186                for (j = 0, len2 = ref.length; j < len2; j++) {
187                  att = ref[j];
188                  if (att.status !== 'uploadError') {
189                    results1.push(att);
190                  }
191                }
192                return results1;
193              })();
194              if (withUploadError.length) {
195                return $scope.attachments = withUploadError.concat(withoutUploadError);
196              }
197            };
198            return upItem = Upload.upload({
199              url: 'upload_collateral',
200              data: {
201                collateralId: collateralItem._id,
202                date: sn.d.fileLastModifiedDate(file).toYMD()
203              },
204              file: file
205            }).success(function() {
206              var att;
207              if (!already) {
208                addToAttachments();
209              }
210              if (att = attachmentByName(file.name)) {
211                return att.status = '';
212              }
213            }).error(function() {
214              var att;
215              if (!already) {
216                addToAttachments();
217              }
218              if (att = attachmentByName(file.name)) {
219                att.status = 'uploadError';
220              }
221              return triggerUploadErrorWarning();
222            });
223          };
224          results.push((process = function(file) {
225            var att, attachment, confirmReplace, invalidCharMsg, ref, ref1;
226            alreadyNames = (function() {
227              var j, len2, ref, results1;
228              ref = $scope.attachments;
229              results1 = [];
230              for (j = 0, len2 = ref.length; j < len2; j++) {
231                att = ref[j];
232                results1.push(att.name);
233              }
234              return results1;
235            })();
236            attachment = attachmentByName(file.name);
237            confirmReplace = function() {
238              return MessiService.confirmDialog("Já existe o arquivo " + file.name + ". Deseja substituí-lo?").then(function(answer) {
239                if (answer) {
240                  return upload(file, true);
241                }
242              });
243            };
244            invalidCharMsg = function() {
245              if (inputFile.name !== file.name) {
246                return MessiService.alertDialog("<b>Foram alterados caracteres não permitidos no nome do arquivo</b><br><br><b>Nome anterior:</b><br>" + inputFile.name + "<br><br><b>Nome novo:</b><br>" + file.name);
247              }
248            };
249            if (ref = file.name, indexOf.call(alreadyNames, ref) >= 0) {
250              if (attachment.status === 'deleted') {
251                MessiService.confirmDialog("O arquivo  " + file.name + " foi removido. Deseja restaurá-lo?").then(function(answer) {
252                  if (answer) {
253                    attachment.status = '';
254                    return confirmReplace();
255                  }
256                });
257              } else if ((ref1 = attachment.status) === 'deleted2' || ref1 === 'uploadError') {
258                upload(file, true);
259              } else if (!attachment.status) {
260                confirmReplace();
261              }
262            } else {
263              upload(file);
264            }
265            return invalidCharMsg();
266          })(file));
267        }
268        return results;
269      };
270      largeFiles = (function() {
271        var i, len1, results;
272        results = [];
273        for (i = 0, len1 = $files.length; i < len1; i++) {
274          file = $files[i];
275          if (file.size > 15728640) {
276            results.push(file.name.replaceCharsForUpload());
277          }
278        }
279        return results;
280      })();
281      if (largeFiles.length) {
282        largeFilesStr = largeFiles.join("<br/>");
283        message = largeFiles.length > 1 ? "Os arquivos<br/>" + largeFilesStr + "<br/>tem mais de 15MB e não serão carregados." : "O arquivo<br/>" + largeFiles[0] + "<br/>tem mais de 15MB e não será carregado.";
284        feedback.timedWarning(message);
285      }
286      return uploadFiles();
287    };
288    uploadErrorWarning = false;
289    nextUEWtimeout = '';
290    triggerUploadErrorWarning = function() {
291      uploadErrorWarning = true;
292      if (nextUEWtimeout) {
293        $timeout.cancel(nextUEWtimeout);
294      }
295      return nextUEWtimeout = $timeout((function() {
296        return uploadErrorWarning = false;
297      }), 5000);
298    };
299    $scope.uploadError = function(att) {
300      return att.status === 'uploadError';
301    };
302    $scope.uploadErrorWarning = function() {
303      return uploadErrorWarning;
304    };
305    $scope.removeAttachment = function(todel) {
306      var att, i, len1, ref, results;
307      ref = $scope.attachments;
308      results = [];
309      for (i = 0, len1 = ref.length; i < len1; i++) {
310        att = ref[i];
311        if (att._id === todel._id) {
312          if (att.status === 'uploadError') {
313            results.push(att.status = 'deleted2');
314          } else {
315            att.status = 'deleted';
316            results.push(signalDeleted(att));
317          }
318        }
319      }
320      return results;
321    };
322    $scope.lastDeleted = {};
323    nextSDtimeout = '';
324    signalDeleted = function(att) {
325      if (nextSDtimeout) {
326        $timeout.cancel(nextSDtimeout);
327      }
328      $scope.lastDeleted = att;
329      return nextSDtimeout = $timeout((function() {
330        return $scope.lastDeleted = {};
331      }), 5000);
332    };
333    $scope.recoverDeleted = function() {
334      if ($scope.lastDeleted._id) {
335        $scope.lastDeleted.status = '';
336        return $scope.lastDeleted = {};
337      }
338    };
339    return $scope.download = function(att) {
340      var downloadErrorResponse, param;
341      downloadErrorResponse = function() {
342        return feedback.timedError("Erro na obtenção do arquivo " + att.name + ".");
343      };
344      if (!att.status) {
345        param = {
346          collateralId: collateralItem._id,
347          name: att.name
348        };
349        return $http.post('download_collateral', param).success(function(data) {
350          var link, trimmedData;
351          trimmedData = (data != null ? data.trim() : void 0) || '';
352          if (/^http/.test(trimmedData)) {
353            link = $("#collateralFilesDownload");
354            link.attr('href', data);
355            return link[0].click();
356          } else {
357            return downloadErrorResponse();
358          }
359        }).error(function() {
360          return downloadErrorResponse();
361        });
362      }
363    };
364  };
365
366  module = this.angular.module('snCollateralHistory');
367
368  CollateralHistoryController = function($scope, CollateralHistoryModel, CollateralHistorySettings, feedback) {
369    var editionFocus, scroller;
370    scroller = spreadnet.utils.scroll.Scroller();
371    editionFocus = spreadnet.editionFocus;
372    $scope.settings = CollateralHistorySettings;
373    $scope.mode = "grid";
374    $scope.calculating = false;
375    $scope.exporting = false;
376    $scope.collateralCurrentHistory = null;
377    $scope.startCalculation = function() {
378      return $scope.calculating = true;
379    };
380    $scope.stopCalculation = function() {
381      return $scope.calculating = false;
382    };
383    $scope.newCollateralHistory = function() {
384      $scope.collateralCurrentHistory = null;
385      return $scope.inEditMode();
386    };
387    $scope.editCollateralHistory = function(collateralHistory) {
388      $scope.collateralCurrentHistory = collateralHistory;
389      return $scope.inEditMode();
390    };
391    $scope.inEditMode = function() {
392      if ($scope.gridMode) {
393        scroller.saveTop();
394      }
395      $scope.mode = "edit";
396      return editionFocus.show();
397    };
398    $scope.inGridMode = function() {
399      editionFocus.close();
400      if ($scope.editMode) {
401        scroller.restore();
402      }
403      return $scope.mode = "grid";
404    };
405    return $scope["export"] = function() {
406      $scope.exporting = CollateralHistoryModel.calculating;
407      return CollateralHistoryModel.reportFile().then(function(result) {
408        var link, trimmedResult;
409        trimmedResult = (result != null ? result.trim() : void 0) || '';
410        if (/^http/.test(trimmedResult)) {
411          link = $("#collateralHistoryFileDownload");
412          link.attr('href', result);
413          link[0].click();
414          return $scope.exporting = false;
415        }
416      });
417    };
418  };
419
420  (function() {
421    var config;
422    config = ['$scope', 'CollateralHistoryModel', 'CollateralHistorySettings', 'feedback', CollateralHistoryController];
423    return module.controller('spreadnet.collateralHistoryCtrl', config);
424  })();
425
426  module = this.angular.module('snCollateralHistory');
427
428  CollateralHistoryGridController = function($scope, CollateralHistoryModel, feedback, $timeout, CollateralHistorySettings, UserModel, Debounce, cellWidth) {
429    var cellWidths, filterError, initCollateralHistory, reorder, updateFilterClass;
430    $scope.model = CollateralHistoryModel;
431    $scope.settings = CollateralHistorySettings;
432    $scope.previousIdentifier = "";
433    $scope.filterChanged = true;
434    $scope.filterParams = CollateralHistoryModel.filterParams;
435    $scope.filterSpec = CollateralHistoryModel.filterSpec;
436    $scope.filterFirstTime = true;
437    $scope.isAllCustomers = function() {
438      return UserModel.isAllCustomers();
439    };
440    $scope.filterHeightClass = function() {
441      var height;
442      height = $scope.isAllCustomers() ? 'h130' : 'h110';
443      return "filter cf flexColumn flexAroundSpacing " + height;
444    };
445    $scope.verticalDividerClass = function() {
446      var height;
447      height = $scope.isAllCustomers() ? 'h128' : 'h108';
448      return "verticalDivider " + height;
449    };
450    (updateFilterClass = function() {
451      return $scope.filterClass = $scope.filterChanged ? "button" : "button dark";
452    })();
453    $scope.filter = function() {
454      var checked, code;
455      $scope.startCalculation();
456      $scope.filterParams.status = (function() {
457        var ref, results;
458        ref = $scope.filterSpec.statusOptions;
459        results = [];
460        for (code in ref) {
461          checked = ref[code];
462          if (checked) {
463            results.push(code);
464          }
465        }
466        return results;
467      })();
468      $scope.filterParams.kind = $scope.filterSpec.kind != null ? $scope.filterSpec.kind : '';
469      $scope.filterParams.subKind = $scope.filterSpec.subKind != null ? $scope.filterSpec.subKind : [];
470      $scope.filterParams.bank = $scope.filterSpec.bank != null ? $scope.filterSpec.bank : [];
471      $scope.filterParams.identifier = $scope.filterSpec.identifier != null ? $scope.filterSpec.identifier : '';
472      $scope.filterParams.customers = $scope.isAllCustomers() ? $scope.filterSpec.customers : [];
473      $scope.filterChanged = false;
474      updateFilterClass();
475      return $timeout(function() {
476        return CollateralHistoryModel.filterByParam($scope.filterParams, initCollateralHistory, filterError);
477      });
478    };
479    $scope.filterButtonClick = function() {
480      return $scope.filter();
481    };
482    filterError = function() {
483      $scope.stopCalculation();
484      $scope.filterFirstTime = false;
485      return feedback.timedServerError();
486    };
487    initCollateralHistory = function() {
488      $scope.settings.orderedBy = $scope.isAllCustomers() ? "customerName" : "kindName";
489      $scope.settings.lastOrderedBy = $scope.settings.orderedBy;
490      reorder();
491      $scope.filterFirstTime = false;
492      return $scope.stopCalculation();
493    };
494    $scope.changeFilter = function() {
495      $scope.filterChanged = true;
496      return updateFilterClass();
497    };
498    $scope.changeKind = function() {
499      $scope.filterSpec.subKind = [];
500      return $scope.changeFilter();
501    };
502    $scope.changeIdentifier = function() {
503      if ($scope.filterSpec.identifier !== $scope.previousIdentifier) {
504        $scope.previousIdentifier = $scope.filterSpec.identifier;
505        return $scope.changeFilter();
506      }
507    };
508    $scope.changeIdentifierWithLag = Debounce($scope.changeIdentifier, 1000);
509    $scope.changeOrder = function(order) {
510      $scope.settings.orderedBy = order;
511      if ($scope.settings.lastOrderedBy === $scope.settings.orderedBy) {
512        $scope.settings.lastOrderedBy = "";
513        CollateralHistoryModel.orderBy(order, 1);
514      } else {
515        $scope.settings.lastOrderedBy = $scope.settings.orderedBy;
516        CollateralHistoryModel.orderBy(order, -1);
517      }
518      return $scope.stopCalculation();
519    };
520    reorder = function() {
521      var sign;
522      sign = $scope.settings.lastOrderedBy ? -1 : 1;
523      return CollateralHistoryModel.orderBy($scope.settings.orderedBy, sign);
524    };
525    $scope["delete"] = function(collateralHistory) {
526      return CollateralHistoryModel["delete"](collateralHistory, $scope.deleteCollateralHistorySuccess, feedback.timedServerError);
527    };
528    $scope.deleteCollateralHistorySuccess = function(index) {
529      return feedback.timedSuccess("Garantia removida com sucesso.");
530    };
531    $scope.collateralHistorySize = function() {
532      var length;
533      length = CollateralHistoryModel.collection.length;
534      if (length !== 1) {
535        return length + " garantias";
536      } else {
537        return "1 garantia";
538      }
539    };
540    $scope.getThClass = function(order) {
541      if (order === $scope.settings.orderedBy) {
542        return 'orderedBy';
543      } else {
544        return '';
545      }
546    };
547    $scope.getIconOrderClass = function() {
548      if ($scope.settings.lastOrderedBy) {
549        return 'fa fa-caret-up';
550      } else {
551        return 'fa fa-caret-down';
552      }
553    };
554    cellWidths = [[6, 0], [4, 4], [5, 6], [6, 6], [14, 15], [12, 13], [9, 10], [6, 6], [7, 8], [7, 7], [7, 7], [2, 2], [2, 2]];
555    return $scope.cellWidth = cellWidth.setWidths(cellWidths, $scope.isAllCustomers);
556  };
557
558  (function() {
559    var config;
560    config = ['$scope', 'CollateralHistoryModel', 'feedback', '$timeout', 'CollateralHistorySettings', 'UserModel', 'Debounce', 'cellWidth', CollateralHistoryGridController];
561    return module.controller('spreadnet.collateralHistoryGridCtrl', config);
562  })();
563
564  module = this.angular.module('snCollateralHistory');
565
566  CollateralHistoryItemController = function($scope, UserModel, CollateralHistoryModel, feedback) {
567    var duplicateError, duplicateSuccess, eventBus, events, hasAttachment, item, numbers;
568    numbers = spreadnet.utils.numbers;
569    eventBus = spreadnet.eventBus;
570    events = spreadnet.events;
571    item = $scope.item;
572    $scope.isAllCustomers = function() {
573      return UserModel.isAllCustomers();
574    };
575    $scope.customerName = function() {
576      return item.customerName;
577    };
578    $scope.updateValuation = function() {
579      return eventBus.fire('updateValuationDialog', item);
580    };
581    $scope.editItem = function() {
582      return $scope.editCollateralHistory($scope.item);
583    };
584    $scope.deleteItem = function() {
585      var loanInfo, loanInfoHtml;
586      loanInfo = item.loanInfo;
587      loanInfoHtml = loanInfo ? "<br/>\nEsta garantia possui um contrato vinculado: <strong>" + loanInfo.modalityShortName + "</strong>,\n" + loanInfo.currency + " <strong>" + (numbers.format(loanInfo.value, 2)) + "</strong>,\ncontrato <strong>" + loanInfo.contractNumber + "</strong>." : "";
588      return eventBus.fire(events.MODAL, {
589        ok: function() {
590          return $scope.$parent["delete"]($scope.item);
591        },
592        okLabel: 'Excluir garantia',
593        cancelLabel: 'Cancelar',
594        title: 'Exclusão de garantia',
595        html: "Ao excluir uma garantia, todos seus dados serão permanentemente removidos.<br/>\nTem certeza que deseja excluir a garantia <strong>" + item.identifier + "</strong>?" + loanInfoHtml
596      });
597    };
598    $scope.filesDialog = function() {
599      $scope.kmqRecord('Documentos');
600      return eventBus.fire('collateralFilesDialog', {
601        item: item,
602        immediate: true
603      });
604    };
605    $scope.noteDialog = function() {
606      if (!$scope.isReadOnlyUserOrAllCustomers()) {
607        $scope.kmqRecord('Observações');
608        return eventBus.fire('collateralNoteDialog', item);
609      }
610    };
611    $scope.changeLoanStatusDialog = function() {
612      return eventBus.fire('collateralLoanStatusDialog', item);
613    };
614    duplicateSuccess = function() {
615      return feedback.timedSuccess("Garantia duplicada com sucesso.");
616    };
617    duplicateError = function() {
618      return feedback.timedError("Erro ao duplicar garantia.");
619    };
620    $scope.duplicateItem = function() {
621      return CollateralHistoryModel.duplicate($scope.item, duplicateSuccess, duplicateError);
622    };
623    hasAttachment = function() {
624      var ref;
625      return ((ref = $scope.item.attachments) != null ? ref.length : void 0) > 0;
626    };
627    $scope.warningMessages = [];
628    $scope.buildWarningMessages = function() {
629      var ref;
630      $scope.warningMessages = [];
631      if (!hasAttachment()) {
632        $scope.warningMessages.push({
633          title: "Pendente",
634          label: "Documento",
635          disable: function() {
636            return false;
637          },
638          action: function() {
639            return $scope.filesDialog();
640          }
641        });
642      }
643      if ((ref = item.loanInfo) != null ? ref.settled : void 0) {
644        return $scope.warningMessages.push({
645          title: "Contrato liquidado",
646          label: "Alterar status",
647          disable: function() {
648            return UserModel.isReadOnlyUserOrAllCustomers();
649          },
650          action: function() {
651            return $scope.changeLoanStatusDialog();
652          }
653        });
654      }
655    };
656    $scope.showUpdateValuationMenuItem = function() {
657      return !UserModel.isReadOnlyUserOrAllCustomers();
658    };
659    $scope.showEditMenuItem = function() {
660      return !UserModel.isReadOnlyUserOrAllCustomers();
661    };
662    $scope.showDuplicateMenuItem = function() {
663      return !UserModel.isReadOnlyUserOrAllCustomers();
664    };
665    $scope.showDeleteMenuItem = function() {
666      return !UserModel.isReadOnlyUserOrAllCustomers();
667    };
668    return $scope.getTooltipHtml = function() {
669      var html;
670      $scope.buildWarningMessages();
671      if ($scope.warningMessages.length) {
672        html = $scope.warningMessages.map(function(msg, idx) {
673          var clickContents;
674          clickContents = "<br /><span class='link' ng-class='{disabled: warningMessages[" + idx + "].disable()}' ng-click='!warningMessages[" + idx + "].disable() && warningMessages[" + idx + "].action()'>- " + msg.label + "</span>";
675          return "<b>" + msg.title + "</b>" + clickContents;
676        }).join("<br />");
677        return html;
678      } else {
679        return "";
680      }
681    };
682  };
683
684  (function() {
685    var config;
686    config = ['$scope', 'UserModel', 'CollateralHistoryModel', 'feedback', CollateralHistoryItemController];
687    return module.controller('spreadnet.collateralHistoryItemCtrl', config);
688  })();
689
690  if ((base = this.spreadnet).services == null) {
691    base.services = this.angular.module('spreadnetServices', ['ngResource']);
692  }
693
694  this.spreadnet.services.factory('CollateralHistorySettings', function() {
695    return (function() {
696      return {
697        orderedBy: "kindName",
698        lastOrderedBy: "kindName"
699      };
700    })();
701  });
702
703  if (this.spreadnet == null) {
704    this.spreadnet = {};
705  }
706
707  this.spreadnet.collateralLoanLinkDialogCtrl = function($scope, HistoryModel, LoanModalityModel, cellWidth) {
708    var cellWidths, collateralForm, editionFocus, eventBus, findLoan, hide, hm, labels, savedHistoryState;
709    eventBus = spreadnet.eventBus;
710    editionFocus = spreadnet.editionFocus;
711    labels = spreadnet.utils.labels;
712    hm = HistoryModel;
713    collateralForm = {};
714    $scope.warrantyLinkOnly = true;
715    $scope.showing = false;
716    $scope.selected = {
717      selected: null
718    };
719    savedHistoryState = null;
720    findLoan = function(id) {
721      var i, item, len1, ref;
722      if (!id) {
723        return null;
724      }
725      ref = hm.collection;
726      for (i = 0, len1 = ref.length; i < len1; i++) {
727        item = ref[i];
728        if (item._id.$oid === id) {
729          return item;
730        }
731      }
732      return null;
733    };
734    hide = function() {
735      $scope.showing = false;
736      if (savedHistoryState) {
737        angular.copy(savedHistoryState.filterSpec, HistoryModel.filterSpec);
738        angular.copy(savedHistoryState.filterParams, HistoryModel.filterParams);
739        HistoryModel.collection = savedHistoryState.collection;
740        HistoryModel.isFiltered = savedHistoryState.isFiltered;
741        savedHistoryState = null;
742      }
743      return editionFocus.close();
744    };
745    $scope.show = function(form) {
746      var ref;
747      collateralForm = form;
748      savedHistoryState = {
749        filterSpec: angular.copy(HistoryModel.filterSpec),
750        filterParams: angular.copy(HistoryModel.filterParams),
751        collection: HistoryModel.collection,
752        isFiltered: HistoryModel.isFiltered
753      };
754      HistoryModel.resetFilter();
755      eventBus.fire('historyFilterReset');
756      $scope.selected.selected = findLoan((ref = collateralForm.loanInfo) != null ? ref.loanId : void 0);
757      return $scope.showing = true;
758    };
759    $scope.ok = function() {
760      var item, ref, ref1;
761      item = $scope.selected.selected;
762      if (item) {
763        collateralForm.loanInfo = {
764          loanId: item._id.$oid,
765          bankInfo: {
766            id: item.offer.bank.id,
767            branch: item.offer.bank.branch,
768            account: item.offer.bank.account
769          },
770          modalityShortName: ((ref = labels.loanModality[item.offer.loanModality]) != null ? ref.short : void 0) || '',
771          value: item.offer.value,
772          currency: ((ref1 = labels.loanModality[item.offer.loanModality]) != null ? ref1.currency : void 0) || 'R$',
773          contractNumber: item.contractNumber,
774          creditDate: item.offer.outlayDate
775        };
776        collateralForm.loanLinkKind = "L";
777        eventBus.fire('collateralLoanLinkSelected', collateralForm);
778      }
779      return hide();
780    };
781    $scope.cancel = function() {
782      return hide();
783    };
784    $scope.modality = function(modality) {
785      var ref;
786      return ((ref = labels.loanModality[modality]) != null ? ref.short : void 0) || '';
787    };
788    $scope.currency = function(offer) {
789      return LoanModalityModel.currencyFor(offer.loanModality);
790    };
791    cellWidths = [[3, 3], [5, 5], [5, 5], [6, 6], [5, 5], [5, 5], [5, 5], [6, 6], [6, 6]];
792    $scope.cellWidthPopUp = cellWidth.setWidths(cellWidths, function() {
793      return false;
794    });
795    return eventBus.subscribe('collateralLoanLinkDialog', $scope.show, $scope);
796  };
797
798  module = this.angular.module('snCollateralHistory');
799
800  CollateralLoanStatusDialogController = function($scope, CollateralHistoryModel, feedback, MessiService) {
801    var STATUS_CODE_COLLATERAL_PENDING_PERFECTION, STATUS_CODE_DISCONTINUED, STATUS_CODE_PERFECTED_COLLATERAL, STATUS_CODE_RELEASED_COLLATERAL, collateralItem, doSave, eventBus, isLoanLinkStatus, removesLoanLink, saveError, saveSuccess;
802    eventBus = spreadnet.eventBus;
803    STATUS_CODE_RELEASED_COLLATERAL = "L";
804    STATUS_CODE_DISCONTINUED = "D";
805    STATUS_CODE_COLLATERAL_PENDING_PERFECTION = "E";
806    STATUS_CODE_PERFECTED_COLLATERAL = "C";
807    collateralItem = {};
808    $scope.showing = false;
809    $scope.form = {};
810    $scope.show = function(item) {
811      collateralItem = item;
812      $scope.form = {
813        status: item.status
814      };
815      return $scope.showing = true;
816    };
817    removesLoanLink = function() {
818      var ref;
819      return (ref = $scope.form.status) === STATUS_CODE_RELEASED_COLLATERAL || ref === STATUS_CODE_DISCONTINUED;
820    };
821    saveSuccess = function() {
822      feedback.timedSuccess("Status da garantia atualizado com sucesso.");
823      return $scope.showing = false;
824    };
825    saveError = function(error) {
826      return feedback.timedError(error.message);
827    };
828    doSave = function() {
829      var itemToSave;
830      itemToSave = angular.copy(collateralItem);
831      itemToSave.status = $scope.form.status;
832      if (removesLoanLink()) {
833        itemToSave.loanInfo = void 0;
834      }
835      return CollateralHistoryModel.save(itemToSave, false, saveSuccess, saveError);
836    };
837    isLoanLinkStatus = function() {
838      var ref;
839      return (ref = $scope.form.status) === STATUS_CODE_PERFECTED_COLLATERAL || ref === STATUS_CODE_COLLATERAL_PENDING_PERFECTION;
840    };
841    $scope.save = function() {
842      if (isLoanLinkStatus()) {
843        return feedback.timedError("O contrato vinculado está finalizado. Favor selecionar status Liberada ou Descontinuada.");
844      } else {
845        if (removesLoanLink()) {
846          return MessiService.confirmDialog("O contrato vinculado será removido desta garantia. Deseja continuar?").then(function(answer) {
847            if (answer) {
848              return doSave();
849            }
850          });
851        } else {
852          return doSave();
853        }
854      }
855    };
856    $scope.cancel = function() {
857      return $scope.showing = false;
858    };
859    return eventBus.subscribe('collateralLoanStatusDialog', $scope.show, $scope);
860  };
861
862  (function() {
863    var config;
864    config = ['$scope', 'CollateralHistoryModel', 'feedback', 'MessiService', CollateralLoanStatusDialogController];
865    return module.controller('spreadnet.collateralLoanStatusDialogCtrl', config);
866  })();
867
868  module = this.angular.module('snCollateralHistory');
869
870  CollateralNoteDialogController = function($scope, CollateralHistoryModel, feedback) {
871    var collateralItem, eventBus, saveError, saveSuccess;
872    eventBus = spreadnet.eventBus;
873    $scope.noteDescription = "";
874    $scope.showing = false;
875    collateralItem = {};
876    $scope.show = function(item) {
877      collateralItem = item;
878      $scope.noteDescription = collateralItem.note ? collateralItem.note : "";
879      return $scope.showing = true;
880    };
881    saveSuccess = function(savedItem) {
882      feedback.timedSuccess("As observações foram salvas");
883      return $scope.showing = false;
884    };
885    saveError = function() {
886      return feedback.timedError("Erro ao salvar observações");
887    };
888    $scope.save = function() {
889      collateralItem.note = $scope.noteDescription;
890      return CollateralHistoryModel.save(collateralItem, false, saveSuccess, saveError);
891    };
892    $scope.cancel = function() {
893      return $scope.showing = false;
894    };
895    return eventBus.subscribe('collateralNoteDialog', $scope.show, $scope);
896  };
897
898  (function() {
899    var config;
900    config = ['$scope', 'CollateralHistoryModel', 'feedback', CollateralNoteDialogController];
901    return module.controller('spreadnet.collateralNoteController', config);
902  })();
903
904  module = this.angular.module('snCollateralHistory');
905
906  EditCollateralHistoryController = function($scope, $http, CollateralHistoryModel, ConfigurationService, FipeBrands, FipeReferences, FipeService, feedback, $timeout, MessiService, CustomerBankModel, Debounce) {
907    var AREA_UNIT_CODE_BUSCHEL, AREA_UNIT_CODE_HECTARE, AREA_UNIT_CODE_SQUARE_METER, FIPE_QUERY_KIND_BRAND_MODEL, FIPE_QUERY_KIND_CODE, KIND_CODE_PROPERTY, KIND_CODE_VEHICLE, SOURCE_CODE_PROPERTY_ESTIMATION, SOURCE_CODE_PROPERTY_REPORT, SOURCE_CODE_VEHICLE_FIPE, SOURCE_CODE_VEHICLE_MANUAL, STATUS_CODE_COLLATERAL_PENDING_PERFECTION, STATUS_CODE_DISCONTINUED, STATUS_CODE_PERFECTED_COLLATERAL, STATUS_CODE_RELEASED_COLLATERAL, SUB_KIND_CODE_CAR_VEHICLE, SUB_KIND_CODE_COMMERCIAL_PROPERTY, SUB_KIND_CODE_INDUSTRIAL_PROPERTY, SUB_KIND_CODE_LAND_PROPERTY, SUB_KIND_CODE_MOTORCYCLE_VEHICLE, SUB_KIND_CODE_OTHER_VEHICLE, SUB_KIND_CODE_RESIDENTIAL_PROPERTY, SUB_KIND_CODE_RURAL_PROPERTY, SUB_KIND_CODE_TRUCK_VEHICLE, YEAR_CODE_NEW_VEHICLE, blankAddress, blankProperty, blankVehicle, brandName, clearYearFuelSelection, confirmSaveWithoutLoanLink, defaultAreaUnit, defaultSourceForKind, doSaveCollateralHistory, eventBus, fillIdentifier, fipeCodeChangedDebounced, fipeCodeParam, fipeCodeValue, fipeCodeYearsFuelsError, fipeError, fipeModelsSuccess, fipeParam, fipePriceError, fromForm, hasLoanLinkSelected, isNewVehicleYear, isRemovingLoanLink, loadFipeOptionsForEdit, loadYearFuelOptionsByCode, newCollateralForm, originalLoanId, parseFipeValue, performFipeCodeChanged, populateModelOptions, populateYearFuelOptions, populateYearFuelOptionsKeepingSelection, referenceDate, refreshFipeValueSuccess, removeLoanLink, resetFipeValue, resolveBrandModelCodes, save, saveCollateralHistoryError, saveCollateralHistorySuccess, savingCollateralHistory, setFipeResult, setFipeValue, setHistory, statusForbidsLoanLink, statusName, statusNameInPast, statusRequiresLoanLink, toForm, validateCollateral, validateIdentifier;
908    eventBus = spreadnet.eventBus;
909    $scope.config = {};
910    savingCollateralHistory = false;
911    $scope.isNewRecord = true;
912    $scope.ufList = [
913      {
914        code: 'AC',
915        name: 'Acre'
916      }, {
917        code: 'AL',
918        name: 'Alagoas'
919      }, {
920        code: 'AP',
921        name: 'Amapá'
922      }, {
923        code: 'AM',
924        name: 'Amazonas'
925      }, {
926        code: 'BA',
927        name: 'Bahia'
928      }, {
929        code: 'CE',
930        name: 'Ceará'
931      }, {
932        code: 'DF',
933        name: 'Distrito Federal'
934      }, {
935        code: 'ES',
936        name: 'Espírito Santo'
937      }, {
938        code: 'GO',
939        name: 'Goiás'
940      }, {
941        code: 'MA',
942        name: 'Maranhão'
943      }, {
944        code: 'MT',
945        name: 'Mato Grosso'
946      }, {
947        code: 'MS',
948        name: 'Mato Grosso do Sul'
949      }, {
950        code: 'MG',
951        name: 'Minas Gerais'
952      }, {
953        code: 'PA',
954        name: 'Pará'
955      }, {
956        code: 'PB',
957        name: 'Paraíba'
958      }, {
959        code: 'PR',
960        name: 'Paraná'
961      }, {
962        code: 'PE',
963        name: 'Pernambuco'
964      }, {
965        code: 'PI',
966        name: 'Piauí'
967      }, {
968        code: 'RJ',
969        name: 'Rio de Janeiro'
970      }, {
971        code: 'RN',
972        name: 'Rio Grande do Norte'
973      }, {
974        code: 'RS',
975        name: 'Rio Grande do Sul'
976      }, {
977        code: 'RO',
978        name: 'Rondônia'
979      }, {
980        code: 'RR',
981        name: 'Roraima'
982      }, {
983        code: 'SC',
984        name: 'Santa Catarina'
985      }, {
986        code: 'SP',
987        name: 'São Paulo'
988      }, {
989        code: 'SE',
990        name: 'Sergipe'
991      }, {
992        code: 'TO',
993        name: 'Tocantins'
994      }
995    ];
996    $scope.modelOptions = [];
997    $scope.yearFuelOptions = [];
998    $scope.yearFuelSelector = "";
999    $scope.allBrands = FipeBrands.query();
1000    $scope.allReferences = FipeReferences.query();
1001    $scope.saving = CollateralHistoryModel.pendingHistorySave;
1002    $scope.processing = function() {
1003      return ConfigurationService.identifierPendingRequest();
1004    };
1005    STATUS_CODE_COLLATERAL_PENDING_PERFECTION = "E";
1006    STATUS_CODE_PERFECTED_COLLATERAL = "C";
1007    STATUS_CODE_RELEASED_COLLATERAL = "L";
1008    STATUS_CODE_DISCONTINUED = "D";
1009    KIND_CODE_PROPERTY = "I";
1010    KIND_CODE_VEHICLE = "V";
1011    SUB_KIND_CODE_RURAL_PROPERTY = "U";
1012    SUB_KIND_CODE_RESIDENTIAL_PROPERTY = "R";
1013    SUB_KIND_CODE_INDUSTRIAL_PROPERTY = "I";
1014    SUB_KIND_CODE_COMMERCIAL_PROPERTY = "C";
1015    SUB_KIND_CODE_LAND_PROPERTY = "T";
1016    SUB_KIND_CODE_CAR_VEHICLE = "1";
1017    SUB_KIND_CODE_MOTORCYCLE_VEHICLE = "2";
1018    SUB_KIND_CODE_TRUCK_VEHICLE = "3";
1019    SUB_KIND_CODE_OTHER_VEHICLE = "9";
1020    AREA_UNIT_CODE_SQUARE_METER = "M";
1021    AREA_UNIT_CODE_HECTARE = "H";
1022    AREA_UNIT_CODE_BUSCHEL = "A";
1023    SOURCE_CODE_PROPERTY_ESTIMATION = "E";
1024    SOURCE_CODE_PROPERTY_REPORT = "L";
1025    SOURCE_CODE_VEHICLE_FIPE = "F";
1026    SOURCE_CODE_VEHICLE_MANUAL = "M";
1027    YEAR_CODE_NEW_VEHICLE = "32000";
1028    FIPE_QUERY_KIND_BRAND_MODEL = "B";
1029    FIPE_QUERY_KIND_CODE = "C";
1030    $scope.isFipeQueryByCode = function() {
1031      return $scope.collateralForm.vehicle.fipeQueryKind === FIPE_QUERY_KIND_CODE;
1032    };
1033    blankAddress = function() {
1034      return {
1035        street: "",
1036        number: "",
1037        complement: "",
1038        district: "",
1039        city: "",
1040        state: "",
1041        zipCode: ""
1042      };
1043    };
1044    defaultAreaUnit = function(subKind) {
1045      if (subKind === SUB_KIND_CODE_RURAL_PROPERTY) {
1046        return AREA_UNIT_CODE_HECTARE;
1047      } else {
1048        return AREA_UNIT_CODE_SQUARE_METER;
1049      }
1050    };
1051    blankProperty = function(subKind) {
1052      return {
1053        name: "",
1054        area: 0,
1055        areaUnit: defaultAreaUnit(subKind),
1056        address: blankAddress(),
1057        titleNumber: "",
1058        titleRegistration: "",
1059        municipalTaxId: ""
1060      };
1061    };
1062    blankVehicle = function() {
1063      return {
1064        referenceDate: "",
1065        brandName: "",
1066        modelName: "",
1067        yearFuelType: "",
1068        referenceDateCode: "",
1069        brandCode: "",
1070        modelCode: "",
1071        year: "",
1072        fuelTypeCode: "",
1073        fipeCode: "",
1074        renavam: "",
1075        licensePlate: "",
1076        chassis: "",
1077        fipeQueryKind: FIPE_QUERY_KIND_BRAND_MODEL
1078      };
1079    };
1080    defaultSourceForKind = function(kind) {
1081      if (kind === KIND_CODE_VEHICLE) {
1082        return SOURCE_CODE_VEHICLE_FIPE;
1083      } else {
1084        return SOURCE_CODE_PROPERTY_ESTIMATION;
1085      }
1086    };
1087    newCollateralForm = function() {
1088      return {
1089        operationLabel: "",
1090        _id: sn.u.mongoObjectId(),
1091        identifier: "",
1092        status: STATUS_CODE_RELEASED_COLLATERAL,
1093        kind: KIND_CODE_PROPERTY,
1094        kindName: "",
1095        subKind: SUB_KIND_CODE_RURAL_PROPERTY,
1096        subKindName: "",
1097        value: 0,
1098        valuationDate: "",
1099        source: defaultSourceForKind(KIND_CODE_PROPERTY),
1100        sourceName: "",
1101        updateDate: sn.u.dates.dateToYMD(new Date()),
1102        property: blankProperty(SUB_KIND_CODE_RURAL_PROPERTY),
1103        vehicle: blankVehicle(),
1104        description: [],
1105        individualization: [],
1106        loanInfo: null,
1107        loanLinkKind: "",
1108        customerId: "",
1109        customerName: "",
1110        statusName: "",
1111        note: "",
1112        attachments: []
1113      };
1114    };
1115    $scope.collateralForm = newCollateralForm();
1116    $scope.propertyValue = 0;
1117    $scope.vehicleOtherValue = 0;
1118    $scope.vehicleFipeValue = 0;
1119    $scope.currentValue = function() {
1120      var form;
1121      form = $scope.collateralForm;
1122      if (form.kind === KIND_CODE_PROPERTY) {
1123        return $scope.propertyValue;
1124      } else if (form.subKind === SUB_KIND_CODE_OTHER_VEHICLE) {
1125        return $scope.vehicleOtherValue;
1126      } else {
1127        return $scope.vehicleFipeValue;
1128      }
1129    };
1130    $scope.propertyValuationDate = "";
1131    $scope.vehicleOtherReferenceDate = "";
1132    $scope.propertySource = SOURCE_CODE_PROPERTY_ESTIMATION;
1133    $scope.changeKind = function() {
1134      $scope.collateralForm.subKind = $scope.collateralForm.kind === KIND_CODE_VEHICLE ? SUB_KIND_CODE_TRUCK_VEHICLE : SUB_KIND_CODE_RURAL_PROPERTY;
1135      return $scope.changeSubKind();
1136    };
1137    $scope.changeSubKind = function() {
1138      var form;
1139      form = $scope.collateralForm;
1140      switch (form.kind) {
1141        case KIND_CODE_VEHICLE:
1142          form.source = form.subKind === SUB_KIND_CODE_OTHER_VEHICLE ? SOURCE_CODE_VEHICLE_MANUAL : SOURCE_CODE_VEHICLE_FIPE;
1143          $scope.modelOptions = [];
1144          return $scope.yearFuelOptions = [];
1145        case KIND_CODE_PROPERTY:
1146          if (form.subKind !== SUB_KIND_CODE_RURAL_PROPERTY) {
1147            return form.property.areaUnit = AREA_UNIT_CODE_SQUARE_METER;
1148          } else if (form.property.areaUnit === AREA_UNIT_CODE_SQUARE_METER) {
1149            return form.property.areaUnit = AREA_UNIT_CODE_HECTARE;
1150          }
1151      }
1152    };
1153    $scope.selectLoanLink = function() {
1154      return eventBus.fire('collateralLoanLinkDialog', $scope.collateralForm);
1155    };
1156    $scope.nextIdentifier = function() {
1157      return ConfigurationService.nextIdentifier().then(function(result) {
1158        return $scope.collateralForm.identifier = result.trim();
1159      });
1160    };
1161    fillIdentifier = function() {
1162      if ($scope.collateralForm.identifier.trim() === "" && $scope.config.contractNumbering.automatic) {
1163        return $scope.nextIdentifier();
1164      }
1165    };
1166    $scope.isManualNumbering = function() {
1167      var ref, ref1;
1168      if ((ref = $scope.config) != null ? (ref1 = ref.contractNumbering) != null ? ref1.automatic : void 0 : void 0) {
1169        return false;
1170      } else {
1171        return true;
1172      }
1173    };
1174    $scope.isNewIdentifierButtonDisabled = function() {
1175      return $scope.collateralForm.identifier.trim() !== '';
1176    };
1177    $scope.newIdentifierButtonClass = function() {
1178      if ($scope.isNewIdentifierButtonDisabled()) {
1179        return "button dark ml10 disabled";
1180      } else {
1181        return "button dark ml10";
1182      }
1183    };
1184    brandName = function(code, kind) {
1185      var brand;
1186      brand = _.find($scope.allBrands, function(b) {
1187        return b.code === code && b.kind === Number(kind);
1188      });
1189      if (brand) {
1190        return brand.name;
1191      } else {
1192        return "";
1193      }
1194    };
1195    referenceDate = function(code) {
1196      var reference;
1197      reference = _.find($scope.allReferences, function(r) {
1198        return ("" + r._id) === ("" + code);
1199      });
1200      if (reference) {
1201        return reference.date;
1202      } else {
1203        return "";
1204      }
1205    };
1206    fipeParam = function() {
1207      return {
1208        vehicleTypeCode: Number($scope.collateralForm.subKind),
1209        refDateCode: Number($scope.collateralForm.vehicle.referenceDateCode),
1210        brandCode: $scope.collateralForm.vehicle.brandCode,
1211        modelCode: $scope.collateralForm.vehicle.modelCode
1212      };
1213    };
1214    fipeCodeValue = function() {
1215      return ($scope.collateralForm.vehicle.fipeCode || "").trim();
1216    };
1217    fipeCodeParam = function() {
1218      return {
1219        vehicleTypeCode: Number($scope.collateralForm.subKind),
1220        refDateCode: Number($scope.collateralForm.vehicle.referenceDateCode),
1221        fipeCode: fipeCodeValue()
1222      };
1223    };
1224    fipeError = function() {
1225      return feedback.timedError("Erro ao consultar a tabela FIPE");
1226    };
1227    $scope.referenceChanged = function() {
1228      $scope.collateralForm.vehicle.referenceDate = referenceDate($scope.collateralForm.vehicle.referenceDateCode);
1229      return $scope.updateFipeValueFromCombos();
1230    };
1231    $scope.brandChanged = function() {
1232      var vehicle;
1233      vehicle = $scope.collateralForm.vehicle;
1234      vehicle.brandName = brandName(vehicle.brandCode, $scope.collateralForm.subKind);
1235      vehicle.modelCode = "";
1236      vehicle.modelName = "";
1237      vehicle.fipeCode = "";
1238      $scope.yearFuelSelector = "";
1239      vehicle.year = "";
1240      vehicle.fuelTypeCode = "";
1241      vehicle.yearFuelType = "";
1242      $scope.modelOptions = [];
1243      $scope.yearFuelOptions = [];
1244      if (vehicle.brandCode) {
1245        FipeService.models(fipeParam()).then(populateModelOptions, fipeError);
1246      }
1247      return $scope.updateFipeValueFromCombos();
1248    };
1249    populateModelOptions = function(result) {
1250      return $timeout(function() {
1251        return $scope.modelOptions = _.map(result.Modelos, function(item) {
1252          return {
1253            value: "" + item.Value,
1254            label: item.Label
1255          };
1256        });
1257      });
1258    };
1259    $scope.modelChanged = function() {
1260      var modelOption, vehicle;
1261      vehicle = $scope.collateralForm.vehicle;
1262      modelOption = _.find($scope.modelOptions, function(opt) {
1263        return opt.value === ("" + vehicle.modelCode);
1264      });
1265      vehicle.modelName = modelOption ? modelOption.label : "";
1266      vehicle.fipeCode = "";
1267      $scope.yearFuelSelector = "";
1268      vehicle.year = "";
1269      vehicle.fuelTypeCode = "";
1270      vehicle.yearFuelType = "";
1271      $scope.yearFuelOptions = [];
1272      if (vehicle.modelCode) {
1273        FipeService.yearsFuelsByBrandModel(fipeParam()).then(populateYearFuelOptions, fipeError);
1274      }
1275      return $scope.updateFipeValueFromCombos();
1276    };
1277    isNewVehicleYear = function(item) {
1278      var yearFuelSplitted;
1279      yearFuelSplitted = /^(\d+)\-\d+.*$/.exec("" + item.Value);
1280      return ((yearFuelSplitted != null) && yearFuelSplitted[1] === YEAR_CODE_NEW_VEHICLE) || ("" + item.Value) === YEAR_CODE_NEW_VEHICLE;
1281    };
1282    populateYearFuelOptions = function(result) {
1283      return $timeout(function() {
1284        var withoutZeroKm;
1285        withoutZeroKm = _.reject(result, isNewVehicleYear);
1286        return $scope.yearFuelOptions = _.map(withoutZeroKm, function(item) {
1287          return {
1288            value: item.Value,
1289            label: item.Label
1290          };
1291        });
1292      });
1293    };
1294    $scope.yearFuelChanged = function() {
1295      var vehicle, yearFuelOption, yearFuelSplitted;
1296      vehicle = $scope.collateralForm.vehicle;
1297      yearFuelOption = _.find($scope.yearFuelOptions, function(opt) {
1298        return ("" + opt.value) === ("" + $scope.yearFuelSelector);
1299      });
1300      vehicle.yearFuelType = yearFuelOption ? yearFuelOption.label : "";
1301      yearFuelSplitted = /^(\d+)\-(\d+).*$/.exec("" + $scope.yearFuelSelector);
1302      if ((yearFuelSplitted != null) && yearFuelSplitted.length > 2) {
1303        vehicle.year = yearFuelSplitted[1];
1304        vehicle.fuelTypeCode = yearFuelSplitted[2];
1305      } else {
1306        vehicle.year = "";
1307        vehicle.fuelTypeCode = "";
1308      }
1309      return $scope.updateFipeValueFromCombos();
1310    };
1311    clearYearFuelSelection = function() {
1312      var vehicle;
1313      vehicle = $scope.collateralForm.vehicle;
1314      $scope.yearFuelSelector = "";
1315      vehicle.year = "";
1316      vehicle.fuelTypeCode = "";
1317      vehicle.yearFuelType = "";
1318      return $scope.yearFuelOptions = [];
1319    };
1320    fipeCodeYearsFuelsError = function() {
1321      return feedback.timedError("Código FIPE (" + (fipeCodeValue()) + ") é inválido.");
1322    };
1323    loadYearFuelOptionsByCode = function(onSuccess) {
1324      if (fipeCodeValue() && $scope.collateralForm.vehicle.referenceDateCode) {
1325        return FipeService.yearsFuelsByCode(fipeCodeParam()).then(onSuccess, fipeCodeYearsFuelsError);
1326      }
1327    };
1328    performFipeCodeChanged = function() {
1329      clearYearFuelSelection();
1330      resetFipeValue();
1331      return loadYearFuelOptionsByCode(populateYearFuelOptions);
1332    };
1333    fipeCodeChangedDebounced = Debounce(performFipeCodeChanged, 1500);
1334    $scope.fipeCodeChanged = function() {
1335      return fipeCodeChangedDebounced();
1336    };
1337    resolveBrandModelCodes = function(brandLabel, modelLabel) {
1338      var brand, vehicle;
1339      vehicle = $scope.collateralForm.vehicle;
1340      brand = _.find($scope.allBrands, function(b) {
1341        return b.name === brandLabel && b.kind === Number($scope.collateralForm.subKind);
1342      });
1343      vehicle.brandCode = brand ? brand.code : "";
1344      vehicle.modelCode = "";
1345      $scope.modelOptions = [];
1346      if (vehicle.brandCode && modelLabel) {
1347        return FipeService.models(fipeParam()).then(function(result) {
1348          return $timeout(function() {
1349            var model;
1350            $scope.modelOptions = _.map(result.Modelos, function(item) {
1351              return {
1352                value: "" + item.Value,
1353                label: item.Label
1354              };
1355            });
1356            model = _.find(result.Modelos, function(item) {
1357              return item.Label === modelLabel;
1358            });
1359            return vehicle.modelCode = model ? "" + model.Value : "";
1360          });
1361        });
1362      }
1363    };
1364    $scope.canRefreshFipeValue = function() {
1365      var vehicle;
1366      vehicle = $scope.collateralForm.vehicle;
1367      if ($scope.isFipeQueryByCode()) {
1368        return !!(vehicle.referenceDateCode && fipeCodeValue() && $scope.yearFuelSelector);
1369      } else {
1370        return !!(vehicle.referenceDateCode && vehicle.brandCode && vehicle.modelCode && $scope.yearFuelSelector);
1371      }
1372    };
1373    setFipeValue = function(value) {
1374      $scope.vehicleFipeValue = value;
1375      return $scope.collateralForm.updateDate = sn.u.dates.dateToYMD(new Date());
1376    };
1377    setFipeResult = function(value, result) {
1378      var vehicle;
1379      if (result == null) {
1380        result = null;
1381      }
1382      vehicle = $scope.collateralForm.vehicle;
1383      setFipeValue(value);
1384      if ($scope.isFipeQueryByCode()) {
1385        vehicle.brandName = (result != null ? result.Marca : void 0) || "";
1386        vehicle.modelName = (result != null ? result.Modelo : void 0) || "";
1387        return resolveBrandModelCodes(vehicle.brandName, vehicle.modelName);
1388      } else {
1389        return vehicle.fipeCode = (result != null ? result.CodigoFipe : void 0) || "";
1390      }
1391    };
1392    resetFipeValue = function() {
1393      return setFipeResult(0);
1394    };
1395    $scope.updateFipeValueFromCombos = function() {
1396      if ($scope.canRefreshFipeValue()) {
1397        return $scope.refreshFipeValue();
1398      } else {
1399        return resetFipeValue();
1400      }
1401    };
1402    parseFipeValue = function(valorStr) {
1403      var cleaned;
1404      cleaned = ("" + valorStr).replace(/[R$\s.]/g, '').replace(',', '.');
1405      return parseFloat(cleaned) || 0;
1406    };
1407    refreshFipeValueSuccess = function(result) {
1408      return $timeout(function() {
1409        return setFipeResult(parseFipeValue(result.Valor), result);
1410      });
1411    };
1412    fipePriceError = function() {
1413      feedback.timedError("Não foi possível obter o preço do veículo com os valores informados. Favor conferir os parâmetros e tentar novamente");
1414      return resetFipeValue();
1415    };
1416    $scope.refreshFipeValue = function() {
1417      var param, yearFuelSplitted;
1418      if ($scope.canRefreshFipeValue()) {
1419        yearFuelSplitted = /^(\d+)\-(\d+).*$/.exec("" + $scope.yearFuelSelector);
1420        param = $scope.isFipeQueryByCode() ? fipeCodeParam() : fipeParam();
1421        if ((yearFuelSplitted != null) && yearFuelSplitted.length > 2) {
1422          param.yearModel = yearFuelSplitted[1];
1423          param.fuelCode = yearFuelSplitted[2];
1424        }
1425        if ($scope.isFipeQueryByCode()) {
1426          return FipeService.valueByCode(param).then(refreshFipeValueSuccess, fipePriceError);
1427        } else {
1428          return FipeService.valueByBrandModel(param).then(refreshFipeValueSuccess, fipePriceError);
1429        }
1430      }
1431    };
1432    $scope.updateFipeValue = function() {
1433      var vehicle;
1434      vehicle = $scope.collateralForm.vehicle;
1435      if ($scope.allReferences.length) {
1436        vehicle.referenceDateCode = $scope.allReferences[0]._id;
1437        vehicle.referenceDate = referenceDate(vehicle.referenceDateCode);
1438      }
1439      return $scope.updateFipeValueFromCombos();
1440    };
1441    $scope.cepBlur = function() {
1442      var cep;
1443      cep = ($scope.collateralForm.property.address.zipCode || "").replace(/\D/g, '');
1444      if (cep.length === 8) {
1445        return $http.get("https://viacep.com.br/ws/" + cep + "/json/").then(function(response) {
1446          var addr, data;
1447          data = response.data;
1448          if (!(data != null ? data.erro : void 0)) {
1449            addr = $scope.collateralForm.property.address;
1450            addr.street = data.logradouro;
1451            addr.district = data.bairro;
1452            addr.city = data.localidade;
1453            addr.state = data.uf;
1454            addr.number = "";
1455            return addr.complement = "";
1456          }
1457        });
1458      }
1459    };
1460    $scope.municipalTaxIdLabel = function() {
1461      if ($scope.collateralForm.subKind === SUB_KIND_CODE_RURAL_PROPERTY) {
1462        return 'CCIR';
1463      } else {
1464        return 'Inscrição';
1465      }
1466    };
1467    $scope.loanInfoOptionName = function() {
1468      if ($scope.collateralForm.loanInfo != null) {
1469        return "Operação vinculada:";
1470      } else {
1471        return "Contrato de crédito a ser vinculado";
1472      }
1473    };
1474    $scope.loanBankName = function() {
1475      return CustomerBankModel.nameById($scope.collateralForm.loanInfo.bankInfo.id);
1476    };
1477    $scope.filesDialog = function() {
1478      return eventBus.fire('collateralFilesDialog', {
1479        item: $scope.collateralForm,
1480        immediate: false
1481      });
1482    };
1483    populateYearFuelOptionsKeepingSelection = function(yfResult) {
1484      var vehicle;
1485      populateYearFuelOptions(yfResult);
1486      vehicle = $scope.collateralForm.vehicle;
1487      return $scope.yearFuelSelector = vehicle.year + "-" + vehicle.fuelTypeCode;
1488    };
1489    fipeModelsSuccess = function(result) {
1490      var vehicle;
1491      populateModelOptions(result);
1492      vehicle = $scope.collateralForm.vehicle;
1493      if (vehicle.modelCode) {
1494        return FipeService.yearsFuelsByBrandModel(fipeParam()).then(populateYearFuelOptionsKeepingSelection, fipeError);
1495      }
1496    };
1497    loadFipeOptionsForEdit = function() {
1498      var vehicle;
1499      vehicle = $scope.collateralForm.vehicle;
1500      if ($scope.collateralForm.kind === KIND_CODE_VEHICLE && $scope.collateralForm.source === SOURCE_CODE_VEHICLE_FIPE && vehicle.brandCode) {
1501        return FipeService.models(fipeParam()).then(fipeModelsSuccess, fipeError);
1502      }
1503    };
1504    $scope.fipeQueryKindChanged = function() {
1505      if ($scope.isFipeQueryByCode()) {
1506        if ($scope.collateralForm.kind === KIND_CODE_VEHICLE && $scope.collateralForm.source === SOURCE_CODE_VEHICLE_FIPE) {
1507          return loadYearFuelOptionsByCode(populateYearFuelOptionsKeepingSelection);
1508        }
1509      } else {
1510        return loadFipeOptionsForEdit();
1511      }
1512    };
1513    originalLoanId = "";
1514    toForm = function(collateralHistory) {
1515      var form, ref;
1516      form = angular.copy(collateralHistory);
1517      form.operationLabel = "Edição";
1518      form.property = form.property || blankProperty();
1519      form.property.address = form.property.address || blankAddress();
1520      form.vehicle = form.vehicle || blankVehicle();
1521      form.vehicle.fipeQueryKind = form.vehicle.fipeQueryKind || FIPE_QUERY_KIND_BRAND_MODEL;
1522      form.loanLinkKind = form.loanInfo ? "L" : "";
1523      if (form.vehicle.referenceDateCode) {
1524        form.vehicle.referenceDateCode = Number(form.vehicle.referenceDateCode);
1525      }
1526      $scope.collateralForm = form;
1527      $scope.propertyValue = form.value;
1528      $scope.vehicleOtherValue = form.value;
1529      $scope.vehicleFipeValue = form.value;
1530      $scope.propertyValuationDate = form.valuationDate;
1531      $scope.vehicleOtherReferenceDate = form.vehicle.referenceDate;
1532      $scope.propertySource = form.kind === KIND_CODE_PROPERTY ? form.source : SOURCE_CODE_PROPERTY_ESTIMATION;
1533      originalLoanId = ((ref = form.loanInfo) != null ? ref.loanId : void 0) || "";
1534      return $scope.fipeQueryKindChanged();
1535    };
1536    fromForm = function() {
1537      var collateralDisplay, form;
1538      form = $scope.collateralForm;
1539      collateralDisplay = angular.copy(form);
1540      collateralDisplay.statusName = "";
1541      collateralDisplay.kindName = "";
1542      collateralDisplay.subKindName = "";
1543      collateralDisplay.sourceName = "";
1544      collateralDisplay.description = [];
1545      collateralDisplay.individualization = [];
1546      if (collateralDisplay.loanLinkKind !== "L") {
1547        collateralDisplay.loanInfo = null;
1548      }
1549      delete collateralDisplay.loanLinkKind;
1550      collateralDisplay.value = $scope.currentValue();
1551      if (form.kind === KIND_CODE_VEHICLE) {
1552        collateralDisplay.property = void 0;
1553        collateralDisplay.vehicle.referenceDateCode = "" + form.vehicle.referenceDateCode;
1554        if (form.subKind === SUB_KIND_CODE_OTHER_VEHICLE) {
1555          collateralDisplay.vehicle.referenceDate = $scope.vehicleOtherReferenceDate;
1556        }
1557        collateralDisplay.valuationDate = collateralDisplay.vehicle.referenceDate;
1558      } else if (form.kind === KIND_CODE_PROPERTY) {
1559        collateralDisplay.vehicle = void 0;
1560        collateralDisplay.valuationDate = $scope.propertyValuationDate;
1561        collateralDisplay.source = $scope.propertySource;
1562      }
1563      collateralDisplay.updateDate = sn.u.dates.dateToYMD(new Date());
1564      return collateralDisplay;
1565    };
1566    setHistory = function() {
1567      if ($scope.collateralCurrentHistory) {
1568        $scope.isNewRecord = false;
1569        toForm($scope.collateralCurrentHistory);
1570      } else {
1571        $scope.isNewRecord = true;
1572        $scope.collateralForm = newCollateralForm();
1573        $scope.collateralForm.operationLabel = "Inclusão";
1574      }
1575      return fillIdentifier();
1576    };
1577    validateIdentifier = function(collateralHistoryToSave, callback) {
1578      var id, identifierInfo;
1579      if (collateralHistoryToSave.identifier.trim() !== "") {
1580        id = collateralHistoryToSave._id ? collateralHistoryToSave._id : "_";
1581        identifierInfo = {
1582          id: id,
1583          identifier: collateralHistoryToSave.identifier
1584        };
1585        return ConfigurationService.identifierAlreadyInUse(identifierInfo).then(function(result) {
1586          if (result.trim() === "YES") {
1587            return feedback.timedError("O identificador " + collateralHistoryToSave.identifier + " já está em uso. Favor alterar o identificador.");
1588          } else {
1589            return callback(collateralHistoryToSave);
1590          }
1591        }, function(error) {
1592          return feedback.timedServerError();
1593        });
1594      } else {
1595        return callback(collateralHistoryToSave);
1596      }
1597    };
1598    saveCollateralHistorySuccess = function(savedCollateralHistory) {
1599      var newLoanId, ref;
1600      savingCollateralHistory = false;
1601      $scope.isNewRecord = false;
1602      newLoanId = ((ref = savedCollateralHistory.loanInfo) != null ? ref.loanId : void 0) || "";
1603      if (newLoanId !== originalLoanId) {
1604        eventBus.fire('collateralHistoryLoanLinkChanged', {
1605          collateralId: savedCollateralHistory._id,
1606          previousLoanId: originalLoanId,
1607          newLoanId: newLoanId
1608        });
1609        originalLoanId = newLoanId;
1610      }
1611      $scope.inGridMode();
1612      return feedback.timedSuccess("Garantia salva com sucesso.");
1613    };
1614    saveCollateralHistoryError = function(error) {
1615      savingCollateralHistory = false;
1616      return feedback.timedError(error.message);
1617    };
1618    save = function(collateralDisplay) {
1619      savingCollateralHistory = true;
1620      return CollateralHistoryModel.save(collateralDisplay, $scope.isNewRecord, saveCollateralHistorySuccess, saveCollateralHistoryError);
1621    };
1622    validateCollateral = function(collateralDisplay) {
1623      return save(collateralDisplay);
1624    };
1625    isRemovingLoanLink = function() {
1626      return !$scope.isNewRecord && originalLoanId !== "" && !$scope.collateralForm.loanInfo;
1627    };
1628    statusName = function(statusCode) {
1629      switch (statusCode) {
1630        case STATUS_CODE_RELEASED_COLLATERAL:
1631          return "Liberada";
1632        case STATUS_CODE_COLLATERAL_PENDING_PERFECTION:
1633          return "Em constituição";
1634        case STATUS_CODE_PERFECTED_COLLATERAL:
1635          return "Constituída";
1636        case STATUS_CODE_DISCONTINUED:
1637          return "Descontinuada";
1638        default:
1639          return "";
1640      }
1641    };
1642    statusNameInPast = function(statusCode) {
1643      switch (statusCode) {
1644        case STATUS_CODE_RELEASED_COLLATERAL:
1645          return "liberou";
1646        case STATUS_CODE_COLLATERAL_PENDING_PERFECTION:
1647          return "deixou em constituição";
1648        case STATUS_CODE_PERFECTED_COLLATERAL:
1649          return "constituiu";
1650        case STATUS_CODE_DISCONTINUED:
1651          return "descontinuou";
1652        default:
1653          return "";
1654      }
1655    };
1656    hasLoanLinkSelected = function() {
1657      return $scope.collateralForm.loanLinkKind === "L";
1658    };
1659    statusForbidsLoanLink = function() {
1660      var ref;
1661      return (ref = $scope.collateralForm.status) === STATUS_CODE_RELEASED_COLLATERAL || ref === STATUS_CODE_DISCONTINUED;
1662    };
1663    statusRequiresLoanLink = function() {
1664      var ref;
1665      return (ref = $scope.collateralForm.status) === STATUS_CODE_COLLATERAL_PENDING_PERFECTION || ref === STATUS_CODE_PERFECTED_COLLATERAL;
1666    };
1667    removeLoanLink = function() {
1668      $scope.collateralForm.loanLinkKind = "";
1669      return $scope.collateralForm.loanInfo = null;
1670    };
1671    doSaveCollateralHistory = function() {
1672      var collateralToSave;
1673      collateralToSave = fromForm();
1674      return validateIdentifier(collateralToSave, save);
1675    };
1676    confirmSaveWithoutLoanLink = function(message) {
1677      return MessiService.confirmDialog(message).then(function(answer) {
1678        if (answer) {
1679          removeLoanLink();
1680          return doSaveCollateralHistory();
1681        }
1682      });
1683    };
1684    $scope.saveCollateralHistory = function() {
1685      if ($scope.currentValue() === 0) {
1686        return feedback.timedError("É necessário informar o valor da garantia.");
1687      } else if (statusRequiresLoanLink() && !hasLoanLinkSelected()) {
1688        return feedback.timedError("Status " + (statusName($scope.collateralForm.status)) + " requer um contrato vinculado. Favor vincular contrato.");
1689      } else if (statusForbidsLoanLink() && hasLoanLinkSelected()) {
1690        return confirmSaveWithoutLoanLink("Você " + (statusNameInPast($scope.collateralForm.status)) + " esta garantia. O vínculo da mesma será removido do contrato a que estava vinculado. Deseja continuar ?");
1691      } else if (isRemovingLoanLink()) {
1692        return MessiService.confirmDialog("O vínculo com a operação de crédito será removido. Deseja continuar?").then(function(answer) {
1693          if (answer) {
1694            return doSaveCollateralHistory();
1695          }
1696        });
1697      } else {
1698        return doSaveCollateralHistory();
1699      }
1700    };
1701    $scope.cancelEditCollateralHistory = function() {
1702      feedback.reset();
1703      return $scope.inGridMode();
1704    };
1705    return ConfigurationService.load().$promise.then(function(config) {
1706      $scope.config = config;
1707      return setHistory();
1708    });
1709  };
1710
1711  (function() {
1712    var config;
1713    config = ['$scope', '$http', 'CollateralHistoryModel', 'ConfigurationService', 'FipeBrands', 'FipeReferences', 'FipeService', 'feedback', '$timeout', 'MessiService', 'CustomerBankModel', 'Debounce', EditCollateralHistoryController];
1714    return module.controller('spreadnet.collateralHistoryEditCtrl', config);
1715  })();
1716
1717  module = this.angular.module('snCollateralHistory');
1718
1719  UpdateValuationDialogController = function($scope, CollateralHistoryModel, FipeReferences, FipeService, feedback) {
1720    var FIPE_QUERY_KIND_BRAND_MODEL, FIPE_QUERY_KIND_CODE, KIND_CODE_VEHICLE, SUB_KIND_CODE_OTHER_VEHICLE, allReferences, blankVehicle, canUpdateFipeValue, collateralItem, editionFocus, eventBus, fipeParam, fipePriceError, hasBrandModelCodes, hasFipeCode, hide, isQueryByCode, parseFipeValue, referenceDateFor, refreshFipeValueSuccess, resetFipeValue, saveError, saveSuccess, updateReferenceMonthYear;
1721    eventBus = spreadnet.eventBus;
1722    editionFocus = spreadnet.editionFocus;
1723    KIND_CODE_VEHICLE = "V";
1724    SUB_KIND_CODE_OTHER_VEHICLE = "9";
1725    FIPE_QUERY_KIND_BRAND_MODEL = "B";
1726    FIPE_QUERY_KIND_CODE = "C";
1727    allReferences = FipeReferences.query();
1728    collateralItem = {};
1729    $scope.showing = false;
1730    $scope.form = {};
1731    $scope.referenceMonthYear = "";
1732    $scope.currentReferenceMonthYear = "";
1733    $scope.currentValue = 0;
1734    $scope.fipeValueUpdated = false;
1735    $scope.isVehicle = function() {
1736      return $scope.form.kind === KIND_CODE_VEHICLE;
1737    };
1738    $scope.isVehicleOther = function() {
1739      return $scope.isVehicle() && $scope.form.subKind === SUB_KIND_CODE_OTHER_VEHICLE;
1740    };
1741    $scope.isVehicleFipe = function() {
1742      return $scope.isVehicle() && $scope.form.subKind !== SUB_KIND_CODE_OTHER_VEHICLE;
1743    };
1744    blankVehicle = function() {
1745      return {
1746        referenceDate: "",
1747        brandName: "",
1748        modelName: "",
1749        yearFuelType: "",
1750        referenceDateCode: "",
1751        brandCode: "",
1752        modelCode: "",
1753        year: "",
1754        fuelTypeCode: "",
1755        fipeCode: "",
1756        renavam: "",
1757        licensePlate: "",
1758        chassis: "",
1759        fipeQueryKind: FIPE_QUERY_KIND_BRAND_MODEL
1760      };
1761    };
1762    updateReferenceMonthYear = function() {
1763      return $scope.referenceMonthYear = $scope.form.vehicle.referenceDate !== "" ? "" + ($scope.form.vehicle.referenceDate.toDate().toXDate().toString("MM/yyyy")) : "";
1764    };
1765    hide = function() {
1766      $scope.showing = false;
1767      return editionFocus.close();
1768    };
1769    $scope.show = function(item) {
1770      var ref;
1771      collateralItem = item;
1772      $scope.form = {
1773        kind: item.kind,
1774        subKind: item.subKind,
1775        value: item.value,
1776        valuationDate: item.valuationDate,
1777        vehicle: angular.copy(item.vehicle || blankVehicle())
1778      };
1779      updateReferenceMonthYear();
1780      $scope.currentValue = item.value;
1781      $scope.currentReferenceMonthYear = $scope.referenceMonthYear;
1782      $scope.fipeValueUpdated = false;
1783      if ((ref = $scope.valuationForm) != null) {
1784        ref.$setPristine();
1785      }
1786      return $scope.showing = true;
1787    };
1788    referenceDateFor = function(code) {
1789      var reference;
1790      reference = _.find(allReferences, function(r) {
1791        return ("" + r._id) === ("" + code);
1792      });
1793      if (reference) {
1794        return reference.date;
1795      } else {
1796        return "";
1797      }
1798    };
1799    parseFipeValue = function(valorStr) {
1800      var cleaned;
1801      cleaned = ("" + valorStr).replace(/[R$\s.]/g, '').replace(',', '.');
1802      return parseFloat(cleaned) || 0;
1803    };
1804    fipeParam = function() {
1805      var vehicle;
1806      vehicle = $scope.form.vehicle;
1807      return {
1808        vehicleTypeCode: Number($scope.form.subKind),
1809        refDateCode: Number(vehicle.referenceDateCode),
1810        brandCode: vehicle.brandCode,
1811        modelCode: vehicle.modelCode,
1812        fipeCode: (vehicle.fipeCode || "").trim(),
1813        yearModel: vehicle.year,
1814        fuelCode: vehicle.fuelTypeCode
1815      };
1816    };
1817    hasBrandModelCodes = function() {
1818      var vehicle;
1819      vehicle = $scope.form.vehicle;
1820      return !!(vehicle.brandCode && vehicle.modelCode);
1821    };
1822    hasFipeCode = function() {
1823      return !!($scope.form.vehicle.fipeCode || "").trim();
1824    };
1825    isQueryByCode = function() {
1826      if ($scope.form.vehicle.fipeQueryKind === FIPE_QUERY_KIND_CODE) {
1827        return hasFipeCode() || !hasBrandModelCodes();
1828      } else {
1829        return !hasBrandModelCodes();
1830      }
1831    };
1832    canUpdateFipeValue = function() {
1833      var vehicle;
1834      vehicle = $scope.form.vehicle;
1835      return !!((hasBrandModelCodes() || hasFipeCode()) && vehicle.year);
1836    };
1837    resetFipeValue = function() {
1838      $scope.form.value = 0;
1839      return $scope.fipeValueUpdated = false;
1840    };
1841    fipePriceError = function() {
1842      updateReferenceMonthYear();
1843      feedback.timedError("Não existe o preço na tabela FIPE com o mês/ano de referência (" + referenceMonthYear + ") para a marca/modelo/ano selecionada.");
1844      return resetFipeValue();
1845    };
1846    refreshFipeValueSuccess = function(result) {
1847      $scope.form.value = parseFipeValue(result.Valor);
1848      $scope.form.vehicle.fipeCode = result.CodigoFipe || $scope.form.vehicle.fipeCode;
1849      updateReferenceMonthYear();
1850      return $scope.fipeValueUpdated = true;
1851    };
1852    $scope.updateFipeValue = function() {
1853      var vehicle;
1854      if (canUpdateFipeValue()) {
1855        if (allReferences.length) {
1856          vehicle = $scope.form.vehicle;
1857          vehicle.referenceDateCode = "" + allReferences[0]._id;
1858          vehicle.referenceDate = referenceDateFor(allReferences[0]._id);
1859        }
1860        if (isQueryByCode()) {
1861          return FipeService.valueByCode(fipeParam()).then(refreshFipeValueSuccess, fipePriceError);
1862        } else {
1863          return FipeService.valueByBrandModel(fipeParam()).then(refreshFipeValueSuccess, fipePriceError);
1864        }
1865      }
1866    };
1867    saveSuccess = function() {
1868      feedback.timedSuccess("Avaliação atualizada com sucesso.");
1869      return hide();
1870    };
1871    saveError = function(error) {
1872      return feedback.timedError(error.message);
1873    };
1874    $scope.save = function() {
1875      var itemToSave, today;
1876      if ($scope.form.value === 0) {
1877        return feedback.timedError("É necessário informar o valor da garantia.");
1878      } else {
1879        today = sn.u.dates.dateToYMD(new Date());
1880        itemToSave = angular.copy(collateralItem);
1881        itemToSave.value = $scope.form.value;
1882        if ($scope.isVehicleFipe()) {
1883          itemToSave.valuationDate = $scope.form.vehicle.referenceDate;
1884        } else {
1885          itemToSave.valuationDate = $scope.form.valuationDate;
1886        }
1887        itemToSave.updateDate = today;
1888        if ($scope.isVehicle()) {
1889          itemToSave.vehicle = angular.copy($scope.form.vehicle);
1890        }
1891        return CollateralHistoryModel.save(itemToSave, false, saveSuccess, saveError);
1892      }
1893    };
1894    $scope.cancel = function() {
1895      return hide();
1896    };
1897    $scope.canSave = function() {
1898      if ($scope.isVehicleFipe()) {
1899        return $scope.fipeValueUpdated;
1900      } else {
1901        return !!($scope.valuationForm && $scope.valuationForm.$dirty);
1902      }
1903    };
1904    return eventBus.subscribe('updateValuationDialog', $scope.show, $scope);
1905  };
1906
1907  (function() {
1908    var config;
1909    config = ['$scope', 'CollateralHistoryModel', 'FipeReferences', 'FipeService', 'feedback', UpdateValuationDialogController];
1910    return module.controller('spreadnet.updateValuationDialogCtrl', config);
1911  })();
1912
1913}).call(this);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.