@senior-gestao-empresarial/erpx-components 4.10.0 → 4.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -33403,10 +33403,6 @@
33403
33403
  this.editingCCContaIndex = null;
33404
33404
  this.editingCCIndex = null;
33405
33405
  this.ngUnsubscribe = new rxjs.Subject();
33406
- /** Cache de opções de menu por conta (referência estável evita loop de change detection). */
33407
- this.contaMenuOptionsCache = new Map();
33408
- /** Cache de opções de menu por centro de custo (referência estável). */
33409
- this.ccMenuOptionsCache = new Map();
33410
33406
  this.formGroup = this.fb.group({
33411
33407
  contas: this.fb.array([])
33412
33408
  });
@@ -33431,6 +33427,20 @@
33431
33427
  enumerable: true,
33432
33428
  configurable: true
33433
33429
  });
33430
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "requiresCentroCusto", {
33431
+ /**
33432
+ * Indica se o critério de rateio exige distribuição por centro de custo.
33433
+ * O critério 'V5' (Nenhum) não distribui por C. Custos; os demais exigem
33434
+ * ao menos um centro de custo por conta financeira.
33435
+ */
33436
+ get: function () {
33437
+ var _a, _b;
33438
+ var criterio = (_b = (_a = this.loadedContext) === null || _a === void 0 ? void 0 : _a.criRat) !== null && _b !== void 0 ? _b : this.criRat;
33439
+ return criterio !== ErpRateioEditorComponent_1.CRITERIO_SEM_CENTRO_CUSTO;
33440
+ },
33441
+ enumerable: true,
33442
+ configurable: true
33443
+ });
33434
33444
  Object.defineProperty(ErpRateioEditorComponent.prototype, "valorBase", {
33435
33445
  get: function () {
33436
33446
  var _a, _b;
@@ -33457,6 +33467,42 @@
33457
33467
  enumerable: true,
33458
33468
  configurable: true
33459
33469
  });
33470
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "valorRestanteDisplay", {
33471
+ /**
33472
+ * Valor restante a ser exibido nos cards de resumo.
33473
+ * Quando o critério exige centro de custo, considera o total já distribuído
33474
+ * nos CCs de todas as contas em vez do total das contas financeiras.
33475
+ * Assim o card reflete a distribuição real ponta-a-ponta.
33476
+ */
33477
+ get: function () {
33478
+ var _a;
33479
+ if (!this.requiresCentroCusto) {
33480
+ return this.valorRestante;
33481
+ }
33482
+ var totalCC = this.contasDataSource.reduce(function (acc, conta) { return acc + (conta.rateiosCCusto || []).reduce(function (ccAcc, cc) { return ccAcc + (cc.valor || 0); }, 0); }, 0);
33483
+ return +(this.valorBase - totalCC).toFixed((_a = this.config.currencyScale) !== null && _a !== void 0 ? _a : 2);
33484
+ },
33485
+ enumerable: true,
33486
+ configurable: true
33487
+ });
33488
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "percentualRestanteDisplay", {
33489
+ /**
33490
+ * Percentual restante a ser exibido nos cards de resumo.
33491
+ * Derivado de `valorRestanteDisplay` para manter consistência com o valor.
33492
+ */
33493
+ get: function () {
33494
+ var _a;
33495
+ if (!this.requiresCentroCusto) {
33496
+ return this.percentualRestante;
33497
+ }
33498
+ if (!this.valorBase) {
33499
+ return 0;
33500
+ }
33501
+ return +(this.valorRestanteDisplay / this.valorBase * 100).toFixed((_a = this.config.percentageScale) !== null && _a !== void 0 ? _a : 4);
33502
+ },
33503
+ enumerable: true,
33504
+ configurable: true
33505
+ });
33460
33506
  Object.defineProperty(ErpRateioEditorComponent.prototype, "numberFormatOptions", {
33461
33507
  get: function () {
33462
33508
  var _a, _b;
@@ -33536,6 +33582,16 @@
33536
33582
  if (this.effectiveReadOnly) {
33537
33583
  return;
33538
33584
  }
33585
+ if (this.requiresCentroCusto && this.hasContaSemCentroCusto()) {
33586
+ var message = this.translate.instant('erpx.rateio_editor.erro_centro_custo_obrigatorio');
33587
+ this.messageService.add({
33588
+ severity: 'error',
33589
+ summary: this.translate.instant('erpx.rateio_editor.erro_titulo'),
33590
+ detail: message
33591
+ });
33592
+ this.error.emit({ operacao: 'save', message: message });
33593
+ return;
33594
+ }
33539
33595
  if (!this.isDistribuicaoCompleta()) {
33540
33596
  var message = this.translate.instant('erpx.rateio_editor.erro_distribuicao_incompleta');
33541
33597
  this.messageService.add({
@@ -33659,11 +33715,14 @@
33659
33715
  var remainingPct = this.editingContaIndex != null
33660
33716
  ? this.percentualRestante + this.contasDataSource[this.editingContaIndex].percentual
33661
33717
  : this.percentualRestante;
33718
+ // Usa o valor restante real em vez de recalcular via percentual, evitando
33719
+ // diferenças de arredondamento acumuladas nas entradas anteriores.
33720
+ var remainingValor = this.editingContaIndex != null
33721
+ ? +(this.valorRestante + this.contasDataSource[this.editingContaIndex].valorRateadoConta).toFixed((_a = this.config.currencyScale) !== null && _a !== void 0 ? _a : 2)
33722
+ : this.valorRestante;
33662
33723
  var contaValue = null;
33663
33724
  var percentualValue = remainingPct > 0 ? remainingPct : null;
33664
- var valorValue = percentualValue != null
33665
- ? +((percentualValue / 100) * this.valorBase).toFixed((_a = this.config.currencyScale) !== null && _a !== void 0 ? _a : 2)
33666
- : null;
33725
+ var valorValue = percentualValue != null ? remainingValor : null;
33667
33726
  if (this.editingContaIndex != null) {
33668
33727
  var conta = this.contasDataSource[this.editingContaIndex];
33669
33728
  contaValue = { id: conta.idContaFinanceira, label: conta.contaFinanceira };
@@ -33673,8 +33732,8 @@
33673
33732
  this.selectedConta = contaValue;
33674
33733
  this.contaDialogFormGroup = this.fb.group({
33675
33734
  contaFinanceira: [{ value: contaValue, disabled: this.editingContaIndex != null }, forms.Validators.required],
33676
- percentual: [{ value: percentualValue, disabled: false }, forms.Validators.required],
33677
- valor: [{ value: valorValue, disabled: false }, [forms.Validators.required, forms.Validators.max(this.valorBase)]]
33735
+ percentual: [{ value: percentualValue, disabled: false }, [forms.Validators.required, forms.Validators.max(remainingPct)]],
33736
+ valor: [{ value: valorValue, disabled: false }, [forms.Validators.required, forms.Validators.max(remainingValor)]]
33678
33737
  });
33679
33738
  this.contaDialogFormGroup.get('contaFinanceira').valueChanges
33680
33739
  .pipe(operators.takeUntil(this.ngUnsubscribe))
@@ -33685,7 +33744,7 @@
33685
33744
  };
33686
33745
  ErpRateioEditorComponent.prototype.onSaveContaDialog = function () {
33687
33746
  var _this = this;
33688
- var _a, _b, _c;
33747
+ var _a, _b, _c, _d, _e;
33689
33748
  if (this.contaDialogFormGroup.invalid) {
33690
33749
  return;
33691
33750
  }
@@ -33710,6 +33769,12 @@
33710
33769
  var conta = this.contasDataSource[this.editingContaIndex];
33711
33770
  conta.percentual = percentual;
33712
33771
  conta.valorRateadoConta = valor;
33772
+ // Recalcula os valores dos CCs proporcionalmente ao novo valor da conta,
33773
+ // mantendo os percentuais intactos.
33774
+ if ((_d = conta.rateiosCCusto) === null || _d === void 0 ? void 0 : _d.length) {
33775
+ var currencyScale_1 = (_e = this.config.currencyScale) !== null && _e !== void 0 ? _e : 2;
33776
+ conta.rateiosCCusto = conta.rateiosCCusto.map(function (cc) { return (__assign(__assign({}, cc), { valor: +((cc.percentual / 100) * valor).toFixed(currencyScale_1) })); });
33777
+ }
33713
33778
  this.contasDataSource = __spread(this.contasDataSource);
33714
33779
  }
33715
33780
  else {
@@ -33738,25 +33803,32 @@
33738
33803
  this.editingCCIndex = editCCIndex != null ? editCCIndex : null;
33739
33804
  var conta = this.contasDataSource[contaIndex];
33740
33805
  var ccList = conta.rateiosCCusto || [];
33741
- var somaCC = ccList.reduce(function (acc, cc, i) { return acc + (i === _this.editingCCIndex ? 0 : (cc.percentual || 0)); }, 0);
33742
- var remainingPct = +(100 - somaCC).toFixed((_a = this.config.percentageScale) !== null && _a !== void 0 ? _a : 4);
33743
33806
  var valorBaseCC = conta.valorRateadoConta || 0;
33807
+ // Calcula o restante excluindo o item em edição (para que edição possa manter o próprio valor)
33808
+ var somaCCPct = ccList.reduce(function (acc, cc, i) { return acc + (i === _this.editingCCIndex ? 0 : (cc.percentual || 0)); }, 0);
33809
+ var somaCCValor = ccList.reduce(function (acc, cc, i) { return acc + (i === _this.editingCCIndex ? 0 : (cc.valor || 0)); }, 0);
33810
+ var remainingPct = +(100 - somaCCPct).toFixed((_a = this.config.percentageScale) !== null && _a !== void 0 ? _a : 4);
33811
+ var remainingValor = +(valorBaseCC - somaCCValor).toFixed((_b = this.config.currencyScale) !== null && _b !== void 0 ? _b : 2);
33744
33812
  var ccValue = null;
33745
33813
  var percentualValue = remainingPct > 0 ? remainingPct : null;
33746
- var valorValue = percentualValue != null
33747
- ? +((percentualValue / 100) * valorBaseCC).toFixed((_b = this.config.currencyScale) !== null && _b !== void 0 ? _b : 2)
33748
- : null;
33814
+ // Usa o valor restante real (já calculado acima) em vez de recalcular via percentual,
33815
+ // evitando diferenças de arredondamento acumuladas nos CCs anteriores.
33816
+ var valorValue = percentualValue != null ? remainingValor : null;
33749
33817
  if (this.editingCCIndex != null) {
33750
33818
  var cc = ccList[this.editingCCIndex];
33751
33819
  ccValue = { id: cc.idCentroCusto, label: cc.descCCusto || cc.idCentroCusto };
33752
33820
  percentualValue = cc.percentual;
33753
33821
  valorValue = cc.valor;
33754
33822
  }
33823
+ // maxPct: percentual máximo que este CC pode ter (não pode ultrapassar o restante da conta)
33824
+ var maxPct = remainingPct;
33825
+ // maxValor: valor máximo que este CC pode ter (não pode ultrapassar o restante em dinheiro)
33826
+ var maxValor = remainingValor;
33755
33827
  this.selectedCC = ccValue;
33756
33828
  this.ccDialogFormGroup = this.fb.group({
33757
33829
  centroCusto: [{ value: ccValue, disabled: this.editingCCIndex != null }, forms.Validators.required],
33758
- percentual: [{ value: percentualValue, disabled: false }, forms.Validators.required],
33759
- valor: [{ value: valorValue, disabled: false }, [forms.Validators.required, forms.Validators.max(valorBaseCC)]]
33830
+ percentual: [{ value: percentualValue, disabled: false }, [forms.Validators.required, forms.Validators.max(maxPct)]],
33831
+ valor: [{ value: valorValue, disabled: false }, [forms.Validators.required, forms.Validators.max(maxValor)]]
33760
33832
  });
33761
33833
  this.ccDialogFormGroup.get('centroCusto').valueChanges
33762
33834
  .pipe(operators.takeUntil(this.ngUnsubscribe))
@@ -33851,34 +33923,6 @@
33851
33923
  this.contasDataSource = __spread(this.contasDataSource);
33852
33924
  this.emitChange();
33853
33925
  };
33854
- ErpRateioEditorComponent.prototype.getMenuOptionsPerRow = function (rowData) {
33855
- var _this = this;
33856
- var id = rowData.idContaFinanceira;
33857
- var options = this.contaMenuOptionsCache.get(id);
33858
- if (!options) {
33859
- options = [
33860
- { label: this.translate.instant('erpx.rateio_editor.editar'), command: function () { return _this.openContaDialog(_this.getContaIndex(rowData)); } },
33861
- { label: this.translate.instant('erpx.rateio_editor.adicionar_centro_custo'), command: function () { return _this.openCCDialog(_this.getContaIndex(rowData)); } },
33862
- { label: this.translate.instant('erpx.rateio_editor.remover_centro_custo'), command: function () { return _this.onDeleteSelectedCC(rowData); } },
33863
- { label: this.translate.instant('erpx.rateio_editor.excluir'), command: function () { return _this.removerConta(_this.getContaIndex(rowData)); } }
33864
- ];
33865
- this.contaMenuOptionsCache.set(id, options);
33866
- }
33867
- return options;
33868
- };
33869
- ErpRateioEditorComponent.prototype.getCCMenuOptions = function (conta, cc) {
33870
- var _this = this;
33871
- var key = conta.idContaFinanceira + "::" + cc.idCentroCusto;
33872
- var options = this.ccMenuOptionsCache.get(key);
33873
- if (!options) {
33874
- options = [
33875
- { label: this.translate.instant('erpx.rateio_editor.editar'), command: function () { return _this.openCCDialog(_this.getContaIndex(conta), _this.getCCIndex(conta, cc)); } },
33876
- { label: this.translate.instant('erpx.rateio_editor.excluir'), command: function () { return _this.removerCentroCusto(_this.getContaIndex(conta), _this.getCCIndex(conta, cc)); } }
33877
- ];
33878
- this.ccMenuOptionsCache.set(key, options);
33879
- }
33880
- return options;
33881
- };
33882
33926
  ErpRateioEditorComponent.prototype.getContaIndex = function (rowData) {
33883
33927
  return this.contasDataSource.indexOf(rowData);
33884
33928
  };
@@ -33915,26 +33959,41 @@
33915
33959
  var _this = this;
33916
33960
  this.contasDataSource = __spread(rateios);
33917
33961
  this.ccSelection = {};
33918
- this.contaMenuOptionsCache.clear();
33919
- this.ccMenuOptionsCache.clear();
33920
33962
  this.contasDataSource.forEach(function (conta) {
33921
33963
  _this.ccSelection[conta.idContaFinanceira] = [];
33922
33964
  });
33923
33965
  };
33924
- /** Distribuição completa: restantes globais e de cada conta iguais a zero. */
33966
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "distribuicaoCompleta", {
33967
+ /**
33968
+ * Distribuição completa: restantes globais e de cada conta iguais a zero.
33969
+ * Exposto publicamente para que o template possa reagir ao estado real de
33970
+ * completude (contas + centros de custo).
33971
+ */
33972
+ get: function () {
33973
+ var _this = this;
33974
+ if (this.percentualRestante !== 0 || this.valorRestante !== 0) {
33975
+ return false;
33976
+ }
33977
+ return this.contasDataSource.every(function (conta) { return _this.isContaCCCompleta(conta); });
33978
+ },
33979
+ enumerable: true,
33980
+ configurable: true
33981
+ });
33982
+ /** @deprecated Usar o getter `distribuicaoCompleta`. Mantido para compatibilidade interna. */
33925
33983
  ErpRateioEditorComponent.prototype.isDistribuicaoCompleta = function () {
33926
- var _this = this;
33927
- if (this.percentualRestante !== 0 || this.valorRestante !== 0) {
33928
- return false;
33929
- }
33930
- return this.contasDataSource.every(function (conta) { return _this.isContaCCCompleta(conta); });
33984
+ return this.distribuicaoCompleta;
33985
+ };
33986
+ /** Indica se há ao menos uma conta financeira sem nenhum centro de custo vinculado. */
33987
+ ErpRateioEditorComponent.prototype.hasContaSemCentroCusto = function () {
33988
+ return this.contasDataSource.some(function (conta) { return (conta.rateiosCCusto || []).length === 0; });
33931
33989
  };
33932
33990
  /** Restante de % e de valor dos centros de custo de uma conta igual a zero. */
33933
33991
  ErpRateioEditorComponent.prototype.isContaCCCompleta = function (conta) {
33934
33992
  var _a, _b;
33935
33993
  var ccs = conta.rateiosCCusto || [];
33936
33994
  if (ccs.length === 0) {
33937
- return true;
33995
+ // Sem centro de custo só é válido quando o critério não exige rateio por C. Custos.
33996
+ return !this.requiresCentroCusto;
33938
33997
  }
33939
33998
  var somaPct = ccs.reduce(function (acc, cc) { return acc + (cc.percentual || 0); }, 0);
33940
33999
  var somaValor = ccs.reduce(function (acc, cc) { return acc + (cc.valor || 0); }, 0);
@@ -34059,13 +34118,15 @@
34059
34118
  ErpRateioEditorComponent.prototype.emitChange = function () {
34060
34119
  this.change.emit({
34061
34120
  isDirty: true,
34062
- isValid: this.percentualRestante === 0 && this.valorRestante === 0,
34121
+ isValid: this.isDistribuicaoCompleta(),
34063
34122
  rateios: this.contasDataSource
34064
34123
  });
34065
34124
  };
34066
34125
  var ErpRateioEditorComponent_1;
34067
34126
  /** Valor de anaSin que indica registro sintético (não analítico). */
34068
34127
  ErpRateioEditorComponent.ANA_SIN_SINTETICO = 'VS';
34128
+ /** Critério de rateio que não distribui por centro de custo (Nenhum). */
34129
+ ErpRateioEditorComponent.CRITERIO_SEM_CENTRO_CUSTO = 'V5';
34069
34130
  ErpRateioEditorComponent.ctorParameters = function () { return [
34070
34131
  { type: forms.FormBuilder },
34071
34132
  { type: ErpRateioEditorService },
@@ -34149,7 +34210,8 @@
34149
34210
  ErpRateioEditorComponent = ErpRateioEditorComponent_1 = __decorate([
34150
34211
  core.Component({
34151
34212
  selector: 'erp-rateio-editor',
34152
- template: "<s-loading-state [loading]=\"loading\" [blockWindow]=\"true\">\n <!-- Se\u00E7\u00E3o 1: Informa\u00E7\u00F5es do movimento -->\n <div class=\"sds-section-title\" *ngIf=\"isReady\">\n {{ 'erpx.rateio_editor.titulo' | translate }}\n </div>\n\n <div class=\"ui-g custom-stats\" *ngIf=\"isReady\">\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#0C9348\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"'erpx.rateio_editor.valor_base' | translate\"\n [value]=\"valorBase | numeric:numberFormatOptions | async\"\n ></s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#428BCA\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-percent\"\n [label]=\"'erpx.rateio_editor.percentual_restante' | translate\"\n [value]=\"percentualRestante + '%'\"\n ></s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n [color]=\"valorRestante === 0 ? '#0C9348' : '#C13018'\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"'erpx.rateio_editor.valor_restante' | translate\"\n [value]=\"valorRestante | numeric:numberFormatOptions | async\"\n ></s-stats-card>\n </div>\n </div>\n\n <!-- Se\u00E7\u00E3o 2: Tabela de rateios -->\n <div class=\"sds-section-title\" *ngIf=\"isReady\">\n {{ 'erpx.rateio_editor.lista_rateios' | translate }}\n </div>\n\n <s-empty-state\n *ngIf=\"isReady && contasDataSource?.length === 0\"\n iconClass=\"far fa-dollar-sign\"\n [title]=\"'erpx.rateio_editor.sem_rateios_titulo' | translate\"\n [description]=\"'erpx.rateio_editor.sem_rateios_descricao' | translate\"\n ></s-empty-state>\n\n <div class=\"ui-g\" *ngIf=\"isReady && contasDataSource?.length > 0\">\n <div class=\"ui-g-12\" *ngIf=\"!effectiveReadOnly\">\n <s-button\n [label]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n iconClass=\"fa fa-plus\"\n (onClick)=\"openContaDialog()\"\n ></s-button>\n <s-button\n *ngIf=\"showSugestaoButton\"\n [label]=\"'erpx.rateio_editor.sugerir_rateio' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n iconClass=\"fa fa-magic\"\n (onClick)=\"onSugerir()\"\n ></s-button>\n <s-button\n [label]=\"'erpx.rateio_editor.remover_conta' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n (onClick)=\"onDeleteSelected()\"\n [disabled]=\"!selection.length\"\n ></s-button>\n </div>\n <div class=\"ui-g-12\">\n <p-table\n #tableRateio\n [value]=\"contasDataSource\"\n [columns]=\"gridColumns\"\n dataKey=\"idContaFinanceira\"\n [resizableColumns]=\"true\"\n [totalRecords]=\"contasDataSource.length\"\n [(selection)]=\"selection\"\n [paginator]=\"false\"\n [rows]=\"10\"\n >\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th scope=\"col\" style=\"width: 3em\"></th>\n <th scope=\"col\" class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableHeaderCheckbox *ngIf=\"!effectiveReadOnly\"></p-tableHeaderCheckbox>\n </th>\n <th *ngFor=\"let col of columns\" scope=\"col\" pResizableColumn>\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.header }}</span>\n </div>\n </th>\n <th scope=\"col\" *ngIf=\"!effectiveReadOnly\">\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ 'erpx.rateio_editor.acoes' | translate }}</span>\n </div>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\">\n <tr>\n <td style=\"width: 3em; text-align: center\">\n <a *ngIf=\"rowData.rateiosCCusto?.length\" [pRowToggler]=\"rowData\" role=\"button\" tabindex=\"0\">\n <i [class]=\"expanded ? 'fa fa-minus' : 'fa fa-plus'\"></i>\n </a>\n </td>\n <td class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableCheckbox *ngIf=\"!effectiveReadOnly\" [value]=\"rowData\"></p-tableCheckbox>\n </td>\n <td>{{ rowData.contaFinanceira || rowData.idContaFinanceira }}</td>\n <td style=\"text-align: right\">{{ rowData.percentual }}</td>\n <td style=\"text-align: right\">{{ rowData.valorRateadoConta | numeric:numberFormatOptions | async }}</td>\n <td *ngIf=\"!effectiveReadOnly\">\n <s-button\n [auxiliary]=\"true\"\n [priority]=\"ButtonPriority.Default\"\n [size]=\"ButtonSize.Small\"\n [label]=\"'erpx.rateio_editor.acoes' | translate\"\n [menuOptions]=\"getMenuOptionsPerRow(rowData)\"\n ></s-button>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"rowexpansion\" let-rowData let-rowIndex=\"rowIndex\">\n <tr>\n <td [attr.colspan]=\"effectiveReadOnly ? gridColumns.length + 2 : gridColumns.length + 3\">\n <div class=\"ui-g\" style=\"padding: 8px 16px\">\n <p-table\n [value]=\"rowData.rateiosCCusto\"\n dataKey=\"idCentroCusto\"\n [(selection)]=\"ccSelection[rowData.idContaFinanceira]\"\n [responsive]=\"true\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"col\" class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableHeaderCheckbox *ngIf=\"!effectiveReadOnly\"></p-tableHeaderCheckbox>\n </th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.centro_custo' | translate }}</th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.percentual' | translate }}</th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.valor' | translate }}</th>\n <th scope=\"col\" *ngIf=\"!effectiveReadOnly\">{{ 'erpx.rateio_editor.acoes' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-cc let-ccIndex=\"rowIndex\">\n <tr>\n <td class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableCheckbox *ngIf=\"!effectiveReadOnly\" [value]=\"cc\"></p-tableCheckbox>\n </td>\n <td>{{ cc.descCCusto || cc.idCentroCusto }}</td>\n <td style=\"text-align: right\">{{ cc.percentual }}</td>\n <td style=\"text-align: right\">{{ cc.valor | numeric:numberFormatOptions | async }}</td>\n <td *ngIf=\"!effectiveReadOnly\">\n <s-button\n [auxiliary]=\"true\"\n [priority]=\"ButtonPriority.Default\"\n [size]=\"ButtonSize.Small\"\n [label]=\"'erpx.rateio_editor.acoes' | translate\"\n [menuOptions]=\"getCCMenuOptions(rowData, cc)\"\n ></s-button>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"effectiveReadOnly ? 3 : 5\">\n {{ 'erpx.rateio_editor.sem_centros_custo' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n\n <!-- Bot\u00F5es de a\u00E7\u00E3o -->\n <div *ngIf=\"isReady\" class=\"ui-g rateio-editor-actions\">\n <div class=\"ui-g-12\">\n <div *ngIf=\"!effectiveReadOnly && contasDataSource?.length === 0\" style=\"margin-bottom: 8px\">\n <s-button\n [label]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n iconClass=\"fa fa-plus\"\n (onClick)=\"openContaDialog()\"\n ></s-button>\n <s-button\n *ngIf=\"showSugestaoButton\"\n [label]=\"'erpx.rateio_editor.sugerir_rateio' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n iconClass=\"fa fa-magic\"\n (onClick)=\"onSugerir()\"\n ></s-button>\n </div>\n <s-button\n *ngIf=\"!effectiveReadOnly && !isStandalone\"\n priority=\"primary\"\n iconClass=\"fa fa-check\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSalvar()\"\n ></s-button>\n </div>\n </div>\n</s-loading-state>\n\n<!-- Modal: Adicionar/Editar Conta Financeira -->\n<p-dialog\n [header]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n appendTo=\"body\"\n [modal]=\"true\"\n [(visible)]=\"displayContaDialog\"\n (onHide)=\"onHideContaDialog()\"\n [blockScroll]=\"true\"\n [focusOnShow]=\"false\"\n styleClass=\"custom-dialog\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{width: '40%'}\"\n>\n <form *ngIf=\"contaDialogFormGroup\" [formGroup]=\"contaDialogFormGroup\" (ngSubmit)=\"onSaveContaDialog()\">\n <div class=\"ui-fluid\">\n <s-dynamic-form\n [fields]=\"contaDialogFields\"\n [form]=\"contaDialogFormGroup\"\n [errorMessages]=\"{\n required: ('erpx.rateio_editor.erro_obrigatorio' | translate),\n duplicate: ('erpx.rateio_editor.conta_duplicada' | translate),\n contaSintetica: ('erpx.rateio_editor.erro_conta_sintetica' | translate),\n max: ('erpx.rateio_editor.erro_valor_maximo_conta' | translate)\n }\"\n ></s-dynamic-form>\n </div>\n </form>\n <p-footer>\n <s-button\n id=\"dialog-conta-save\"\n type=\"button\"\n priority=\"primary\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSaveContaDialog()\"\n ></s-button>\n <s-button\n id=\"dialog-conta-cancel\"\n type=\"button\"\n priority=\"secondary\"\n [label]=\"'erpx.rateio_editor.cancelar' | translate\"\n (onClick)=\"onHideContaDialog()\"\n ></s-button>\n </p-footer>\n</p-dialog>\n\n<!-- Modal: Adicionar/Editar Centro de Custo -->\n<p-dialog\n [header]=\"'erpx.rateio_editor.adicionar_centro_custo' | translate\"\n appendTo=\"body\"\n [modal]=\"true\"\n [(visible)]=\"displayCCDialog\"\n (onHide)=\"onHideCCDialog()\"\n [blockScroll]=\"true\"\n [focusOnShow]=\"false\"\n styleClass=\"custom-dialog\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{width: '40%'}\"\n>\n <form *ngIf=\"ccDialogFormGroup\" [formGroup]=\"ccDialogFormGroup\" (ngSubmit)=\"onSaveCCDialog()\">\n <div class=\"ui-fluid\">\n <s-dynamic-form\n [fields]=\"ccDialogFields\"\n [form]=\"ccDialogFormGroup\"\n [errorMessages]=\"{\n required: ('erpx.rateio_editor.erro_obrigatorio' | translate),\n duplicate: ('erpx.rateio_editor.centro_custo_duplicado' | translate),\n centroCustoInvalido: ('erpx.rateio_editor.erro_centro_custo_invalido' | translate),\n max: ('erpx.rateio_editor.erro_valor_maximo_centro_custo' | translate)\n }\"\n ></s-dynamic-form>\n </div>\n </form>\n <p-footer>\n <s-button\n id=\"dialog-cc-save\"\n type=\"button\"\n priority=\"primary\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSaveCCDialog()\"\n ></s-button>\n <s-button\n id=\"dialog-cc-cancel\"\n type=\"button\"\n priority=\"secondary\"\n [label]=\"'erpx.rateio_editor.cancelar' | translate\"\n (onClick)=\"onHideCCDialog()\"\n ></s-button>\n </p-footer>\n</p-dialog>\n"
34213
+ template: "<s-loading-state [loading]=\"loading\" [blockWindow]=\"true\">\n <!-- Se\u00E7\u00E3o 1: Informa\u00E7\u00F5es do movimento -->\n <div class=\"sds-section-title\" *ngIf=\"isReady\">\n {{ 'erpx.rateio_editor.titulo' | translate }}\n </div>\n\n <div class=\"ui-g custom-stats\" *ngIf=\"isReady\">\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#0C9348\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"'erpx.rateio_editor.valor_base' | translate\"\n [value]=\"valorBase | numeric:numberFormatOptions | async\"\n ></s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#428BCA\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-percent\"\n [label]=\"'erpx.rateio_editor.percentual_restante' | translate\"\n [value]=\"percentualRestanteDisplay + '%'\"\n ></s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n [color]=\"distribuicaoCompleta ? '#0C9348' : '#C13018'\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"'erpx.rateio_editor.valor_restante' | translate\"\n [value]=\"valorRestanteDisplay | numeric:numberFormatOptions | async\"\n ></s-stats-card>\n </div>\n </div>\n\n <!-- Se\u00E7\u00E3o 2: Tabela de rateios -->\n <div class=\"sds-section-title\" *ngIf=\"isReady\">\n {{ 'erpx.rateio_editor.lista_rateios' | translate }}\n </div>\n\n <s-empty-state\n *ngIf=\"isReady && contasDataSource?.length === 0\"\n iconClass=\"far fa-dollar-sign\"\n [title]=\"'erpx.rateio_editor.sem_rateios_titulo' | translate\"\n [description]=\"'erpx.rateio_editor.sem_rateios_descricao' | translate\"\n [showPrimaryAction]=\"!effectiveReadOnly\"\n [primaryActionLabel]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n (primaryAction)=\"openContaDialog()\"\n [showSecondaryAction]=\"!effectiveReadOnly && showSugestaoButton\"\n [secondaryActionLabel]=\"'erpx.rateio_editor.sugerir_rateio' | translate\"\n (secondaryAction)=\"onSugerir()\"\n ></s-empty-state>\n\n <div class=\"ui-g\" *ngIf=\"isReady && contasDataSource?.length > 0\">\n <div class=\"ui-g-12\" *ngIf=\"!effectiveReadOnly\">\n <s-button\n [label]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n iconClass=\"fa fa-plus\"\n (onClick)=\"openContaDialog()\"\n ></s-button>\n <s-button\n *ngIf=\"showSugestaoButton\"\n [label]=\"'erpx.rateio_editor.sugerir_rateio' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n iconClass=\"fa fa-magic\"\n (onClick)=\"onSugerir()\"\n ></s-button>\n <s-button\n [label]=\"'erpx.rateio_editor.remover_conta' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n (onClick)=\"onDeleteSelected()\"\n [disabled]=\"!selection.length\"\n ></s-button>\n </div>\n\n <div class=\"ui-g-12\">\n <p-table\n #tableRateio\n [value]=\"contasDataSource\"\n [columns]=\"gridColumns\"\n dataKey=\"idContaFinanceira\"\n [resizableColumns]=\"true\"\n [totalRecords]=\"contasDataSource.length\"\n [(selection)]=\"selection\"\n [paginator]=\"false\"\n [rows]=\"10\"\n >\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th scope=\"col\" style=\"width: 3em\"></th>\n <th scope=\"col\" class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableHeaderCheckbox *ngIf=\"!effectiveReadOnly\"></p-tableHeaderCheckbox>\n </th>\n <th *ngFor=\"let col of columns\" scope=\"col\" pResizableColumn>\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.header }}</span>\n </div>\n </th>\n <th scope=\"col\" *ngIf=\"!effectiveReadOnly\">\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ 'erpx.rateio_editor.acoes' | translate }}</span>\n </div>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\">\n <tr>\n <td style=\"width: 3em; text-align: center\">\n <a *ngIf=\"rowData.rateiosCCusto?.length || (!effectiveReadOnly && requiresCentroCusto)\" [pRowToggler]=\"rowData\" role=\"button\" tabindex=\"0\">\n <i [class]=\"expanded ? 'fa fa-minus' : 'fa fa-plus'\"></i>\n </a>\n </td>\n <td class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableCheckbox *ngIf=\"!effectiveReadOnly\" [value]=\"rowData\"></p-tableCheckbox>\n </td>\n <td>{{ rowData.contaFinanceira || rowData.idContaFinanceira }}</td>\n <td style=\"text-align: right\">{{ rowData.percentual }}</td>\n <td style=\"text-align: right\">{{ rowData.valorRateadoConta | numeric:numberFormatOptions | async }}</td>\n <td *ngIf=\"!effectiveReadOnly\">\n <s-button\n [auxiliary]=\"true\"\n [priority]=\"ButtonPriority.Default\"\n [size]=\"ButtonSize.Small\"\n iconClass=\"fa fa-pencil\"\n [label]=\"'erpx.rateio_editor.editar' | translate\"\n (onClick)=\"openContaDialog(getContaIndex(rowData))\"\n ></s-button>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"rowexpansion\" let-rowData let-rowIndex=\"rowIndex\">\n <tr>\n <td [attr.colspan]=\"effectiveReadOnly ? gridColumns.length + 2 : gridColumns.length + 3\">\n <div class=\"ui-g\" style=\"padding: 8px 16px\">\n <div class=\"ui-g-12 rateio-cc-toolbar\" *ngIf=\"!effectiveReadOnly\">\n <s-button\n [label]=\"'erpx.rateio_editor.adicionar_centro_custo' | translate\"\n iconClass=\"fa fa-plus\"\n (onClick)=\"openCCDialog(getContaIndex(rowData))\"\n ></s-button>\n <s-button\n [label]=\"'erpx.rateio_editor.remover_centro_custo' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n (onClick)=\"onDeleteSelectedCC(rowData)\"\n [disabled]=\"!(ccSelection[rowData.idContaFinanceira]?.length)\"\n ></s-button>\n </div>\n <div class=\"ui-g-12\">\n <p-table\n [value]=\"rowData.rateiosCCusto\"\n dataKey=\"idCentroCusto\"\n [(selection)]=\"ccSelection[rowData.idContaFinanceira]\"\n [responsive]=\"true\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"col\" class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableHeaderCheckbox *ngIf=\"!effectiveReadOnly\"></p-tableHeaderCheckbox>\n </th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.centro_custo' | translate }}</th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.percentual' | translate }}</th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.valor' | translate }}</th>\n <th scope=\"col\" *ngIf=\"!effectiveReadOnly\">{{ 'erpx.rateio_editor.acoes' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-cc let-ccIndex=\"rowIndex\">\n <tr>\n <td class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableCheckbox *ngIf=\"!effectiveReadOnly\" [value]=\"cc\"></p-tableCheckbox>\n </td>\n <td>{{ cc.descCCusto || cc.idCentroCusto }}</td>\n <td style=\"text-align: right\">{{ cc.percentual }}</td>\n <td style=\"text-align: right\">{{ cc.valor | numeric:numberFormatOptions | async }}</td>\n <td *ngIf=\"!effectiveReadOnly\">\n <s-button\n [auxiliary]=\"true\"\n [priority]=\"ButtonPriority.Default\"\n [size]=\"ButtonSize.Small\"\n iconClass=\"fa fa-pencil\"\n [label]=\"'erpx.rateio_editor.editar' | translate\"\n (onClick)=\"openCCDialog(getContaIndex(rowData), getCCIndex(rowData, cc))\"\n ></s-button>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"effectiveReadOnly ? 3 : 5\">\n {{ 'erpx.rateio_editor.sem_centros_custo' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n\n <!-- Bot\u00F5es de a\u00E7\u00E3o -->\n <div *ngIf=\"isReady\" class=\"ui-g rateio-editor-actions\">\n <div class=\"ui-g-12\">\n <s-button\n *ngIf=\"!effectiveReadOnly && !isStandalone\"\n priority=\"primary\"\n iconClass=\"fa fa-check\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSalvar()\"\n ></s-button>\n </div>\n </div>\n</s-loading-state>\n\n<!-- Modal: Adicionar/Editar Conta Financeira -->\n<p-dialog\n [header]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n appendTo=\"body\"\n [modal]=\"true\"\n [(visible)]=\"displayContaDialog\"\n (onHide)=\"onHideContaDialog()\"\n [blockScroll]=\"true\"\n [focusOnShow]=\"false\"\n styleClass=\"custom-dialog\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{width: '40%'}\"\n>\n <form *ngIf=\"contaDialogFormGroup\" [formGroup]=\"contaDialogFormGroup\" (ngSubmit)=\"onSaveContaDialog()\">\n <div class=\"ui-fluid\">\n <s-dynamic-form\n [fields]=\"contaDialogFields\"\n [form]=\"contaDialogFormGroup\"\n [errorMessages]=\"{\n required: ('erpx.rateio_editor.erro_obrigatorio' | translate),\n duplicate: ('erpx.rateio_editor.conta_duplicada' | translate),\n contaSintetica: ('erpx.rateio_editor.erro_conta_sintetica' | translate),\n max: ('erpx.rateio_editor.erro_valor_maximo_conta' | translate)\n }\"\n ></s-dynamic-form>\n </div>\n </form>\n <p-footer>\n <s-button\n id=\"dialog-conta-save\"\n type=\"button\"\n priority=\"primary\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSaveContaDialog()\"\n ></s-button>\n <s-button\n id=\"dialog-conta-cancel\"\n type=\"button\"\n priority=\"secondary\"\n [label]=\"'erpx.rateio_editor.cancelar' | translate\"\n (onClick)=\"onHideContaDialog()\"\n ></s-button>\n </p-footer>\n</p-dialog>\n\n<!-- Modal: Adicionar/Editar Centro de Custo -->\n<p-dialog\n [header]=\"'erpx.rateio_editor.adicionar_centro_custo' | translate\"\n appendTo=\"body\"\n [modal]=\"true\"\n [(visible)]=\"displayCCDialog\"\n (onHide)=\"onHideCCDialog()\"\n [blockScroll]=\"true\"\n [focusOnShow]=\"false\"\n styleClass=\"custom-dialog\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{width: '40%'}\"\n>\n <form *ngIf=\"ccDialogFormGroup\" [formGroup]=\"ccDialogFormGroup\" (ngSubmit)=\"onSaveCCDialog()\">\n <div class=\"ui-fluid\">\n <s-dynamic-form\n [fields]=\"ccDialogFields\"\n [form]=\"ccDialogFormGroup\"\n [errorMessages]=\"{\n required: ('erpx.rateio_editor.erro_obrigatorio' | translate),\n duplicate: ('erpx.rateio_editor.centro_custo_duplicado' | translate),\n centroCustoInvalido: ('erpx.rateio_editor.erro_centro_custo_invalido' | translate),\n max: ('erpx.rateio_editor.erro_maximo_centro_custo' | translate)\n }\"\n ></s-dynamic-form>\n </div>\n </form>\n <p-footer>\n <s-button\n id=\"dialog-cc-save\"\n type=\"button\"\n priority=\"primary\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSaveCCDialog()\"\n ></s-button>\n <s-button\n id=\"dialog-cc-cancel\"\n type=\"button\"\n priority=\"secondary\"\n [label]=\"'erpx.rateio_editor.cancelar' | translate\"\n (onClick)=\"onHideCCDialog()\"\n ></s-button>\n </p-footer>\n</p-dialog>\n",
34214
+ styles: [":host ::ng-deep .rateio-cc-toolbar .s-button-text{overflow:visible;-ms-flex-pack:start;justify-content:flex-start}"]
34153
34215
  })
34154
34216
  ], ErpRateioEditorComponent);
34155
34217
  return ErpRateioEditorComponent;