|
|
@@ -16,32 +16,6 @@
|
|
|
label="Valor da Matrícula"
|
|
|
/>
|
|
|
|
|
|
- <ExclusiveCheckboxPair
|
|
|
- class="col-12"
|
|
|
- :included="modelValue.registration_included_in_course"
|
|
|
- :installments="modelValue.registration_installments_allowed"
|
|
|
- @update:included="setExclusive('registration', 'included')"
|
|
|
- @update:installments="setExclusive('registration', 'installments')"
|
|
|
- />
|
|
|
-
|
|
|
- <div v-if="sectionError('registration')" class="col-12 text-negative text-caption">
|
|
|
- {{ sectionError('registration') }}
|
|
|
- </div>
|
|
|
-
|
|
|
- <template v-if="modelValue.registration_installments_allowed">
|
|
|
- <DefaultInput
|
|
|
- v-model="modelValue.registration_max_installments"
|
|
|
- class="col-6"
|
|
|
- label="Quantidade de Parcelas Máximas"
|
|
|
- min="1"
|
|
|
- type="number"
|
|
|
- />
|
|
|
-
|
|
|
- <div class="col-6 installment-hint">
|
|
|
- Valor da Parcela: {{ formatInstallment(registrationInstallmentValue) }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
-
|
|
|
<q-separator class="col-12" />
|
|
|
|
|
|
<!-- Aulas -->
|
|
|
@@ -51,41 +25,15 @@
|
|
|
label="Valor de Aulas"
|
|
|
/>
|
|
|
|
|
|
- <ExclusiveCheckboxPair
|
|
|
+ <DefaultInput
|
|
|
+ v-model="modelValue.classes_discount_percentage"
|
|
|
class="col-12"
|
|
|
- :included="modelValue.classes_included_in_course"
|
|
|
- :installments="modelValue.classes_installments_allowed"
|
|
|
- @update:included="setExclusive('classes', 'included')"
|
|
|
- @update:installments="setExclusive('classes', 'installments')"
|
|
|
+ label="Desconto de Aulas (%)"
|
|
|
+ max="100"
|
|
|
+ min="0"
|
|
|
+ type="number"
|
|
|
/>
|
|
|
|
|
|
- <div v-if="sectionError('classes')" class="col-12 text-negative text-caption">
|
|
|
- {{ sectionError('classes') }}
|
|
|
- </div>
|
|
|
-
|
|
|
- <template v-if="modelValue.classes_installments_allowed">
|
|
|
- <DefaultInput
|
|
|
- v-model="modelValue.classes_max_installments"
|
|
|
- class="col-4"
|
|
|
- label="Quantidade de Parcelas Máximas"
|
|
|
- min="1"
|
|
|
- type="number"
|
|
|
- />
|
|
|
-
|
|
|
- <div class="col-4 installment-hint">
|
|
|
- Valor da Parcela: {{ formatInstallment(classesInstallmentValue) }}
|
|
|
- </div>
|
|
|
-
|
|
|
- <DefaultInput
|
|
|
- v-model="modelValue.classes_discount_percentage"
|
|
|
- class="col-4"
|
|
|
- label="Desconto (%)"
|
|
|
- max="100"
|
|
|
- min="0"
|
|
|
- type="number"
|
|
|
- />
|
|
|
- </template>
|
|
|
-
|
|
|
<q-separator class="col-12" />
|
|
|
|
|
|
<!-- Materiais -->
|
|
|
@@ -144,32 +92,6 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <ExclusiveCheckboxPair
|
|
|
- class="col-12"
|
|
|
- :included="modelValue.materials_included_in_course"
|
|
|
- :installments="modelValue.materials_installments_allowed"
|
|
|
- @update:included="setExclusive('materials', 'included')"
|
|
|
- @update:installments="setExclusive('materials', 'installments')"
|
|
|
- />
|
|
|
-
|
|
|
- <div v-if="sectionError('materials')" class="col-12 text-negative text-caption">
|
|
|
- {{ sectionError('materials') }}
|
|
|
- </div>
|
|
|
-
|
|
|
- <template v-if="modelValue.materials_installments_allowed">
|
|
|
- <DefaultInput
|
|
|
- v-model="modelValue.materials_max_installments"
|
|
|
- class="col-6"
|
|
|
- label="Quantidade de Parcelas Máximas"
|
|
|
- min="1"
|
|
|
- type="number"
|
|
|
- />
|
|
|
-
|
|
|
- <div class="col-6 installment-hint">
|
|
|
- Valor da Parcela: {{ formatInstallment(materialsInstallmentValue) }}
|
|
|
- </div>
|
|
|
- </template>
|
|
|
-
|
|
|
<q-separator class="col-12" />
|
|
|
|
|
|
<!-- Valor Total do Curso -->
|
|
|
@@ -179,6 +101,7 @@
|
|
|
v-model="modelValue.total_value"
|
|
|
class="col-12"
|
|
|
label="Valor Total do Curso"
|
|
|
+ readonly
|
|
|
/>
|
|
|
|
|
|
<DefaultInput
|
|
|
@@ -216,7 +139,6 @@ import { computed, watch } from "vue";
|
|
|
import { formatToBRLCurrency } from "src/helpers/utils";
|
|
|
import { useInputRules } from "src/composables/useInputRules";
|
|
|
|
|
|
-import ExclusiveCheckboxPair from "./ExclusiveCheckboxPair.vue";
|
|
|
import DefaultCurrencyInput from "src/components/defaults/DefaultCurrencyInput.vue";
|
|
|
import DefaultInput from "src/components/defaults/DefaultInput.vue";
|
|
|
import DefaultSelect from "src/components/defaults/DefaultSelect.vue";
|
|
|
@@ -249,9 +171,6 @@ const props = defineProps({
|
|
|
},
|
|
|
});
|
|
|
|
|
|
-const sectionError = (section) =>
|
|
|
- props.validationErrors[`${props.fieldPrefix}.${section}_included_in_course`];
|
|
|
-
|
|
|
const materialsTotalValue = computed(() =>
|
|
|
modelValue.value.materials.reduce(
|
|
|
(sum, material) =>
|
|
|
@@ -260,27 +179,6 @@ const materialsTotalValue = computed(() =>
|
|
|
),
|
|
|
);
|
|
|
|
|
|
-const registrationInstallmentValue = computed(() =>
|
|
|
- installmentValue(
|
|
|
- modelValue.value.registration_value,
|
|
|
- modelValue.value.registration_max_installments,
|
|
|
- ),
|
|
|
-);
|
|
|
-
|
|
|
-const classesInstallmentValue = computed(() =>
|
|
|
- installmentValue(
|
|
|
- modelValue.value.classes_value,
|
|
|
- modelValue.value.classes_max_installments,
|
|
|
- ),
|
|
|
-);
|
|
|
-
|
|
|
-const materialsInstallmentValue = computed(() =>
|
|
|
- installmentValue(
|
|
|
- materialsTotalValue.value,
|
|
|
- modelValue.value.materials_max_installments,
|
|
|
- ),
|
|
|
-);
|
|
|
-
|
|
|
const totalInstallmentValue = computed(() =>
|
|
|
installmentValue(
|
|
|
modelValue.value.total_value,
|
|
|
@@ -288,52 +186,22 @@ const totalInstallmentValue = computed(() =>
|
|
|
),
|
|
|
);
|
|
|
|
|
|
-// Soma sugerida do Valor Total, considerando só as seções marcadas como
|
|
|
-// "incluso no valor do curso". O campo continua editável: só reaplicamos a
|
|
|
-// sugestão enquanto o usuário não tiver digitado um valor diferente dela.
|
|
|
-let lastSuggestedTotal = null;
|
|
|
-
|
|
|
const suggestedTotal = computed(() => {
|
|
|
let total = 0;
|
|
|
-
|
|
|
- if (modelValue.value.registration_included_in_course) {
|
|
|
- total += Number(modelValue.value.registration_value) || 0;
|
|
|
- }
|
|
|
-
|
|
|
- if (modelValue.value.classes_included_in_course) {
|
|
|
- total += Number(modelValue.value.classes_value) || 0;
|
|
|
- }
|
|
|
-
|
|
|
- if (modelValue.value.materials_included_in_course) {
|
|
|
- total += materialsTotalValue.value;
|
|
|
- }
|
|
|
-
|
|
|
+ total += Number(modelValue.value.registration_value) || 0;
|
|
|
+ total += Number(modelValue.value.classes_value) || 0;
|
|
|
+ total += materialsTotalValue.value;
|
|
|
return total;
|
|
|
});
|
|
|
|
|
|
watch(
|
|
|
suggestedTotal,
|
|
|
(newTotal) => {
|
|
|
- if (
|
|
|
- modelValue.value.total_value === null ||
|
|
|
- modelValue.value.total_value === lastSuggestedTotal
|
|
|
- ) {
|
|
|
- modelValue.value.total_value = newTotal;
|
|
|
- }
|
|
|
-
|
|
|
- lastSuggestedTotal = newTotal;
|
|
|
+ modelValue.value.total_value = newTotal;
|
|
|
},
|
|
|
{ immediate: true },
|
|
|
);
|
|
|
|
|
|
-const setExclusive = (section, option) => {
|
|
|
- const includedKey = `${section}_included_in_course`;
|
|
|
- const installmentsKey = `${section}_installments_allowed`;
|
|
|
-
|
|
|
- modelValue.value[includedKey] = option === "included";
|
|
|
- modelValue.value[installmentsKey] = option === "installments";
|
|
|
-};
|
|
|
-
|
|
|
const addMaterial = () => {
|
|
|
modelValue.value.materials.push({
|
|
|
price: null,
|