|
|
@@ -14,8 +14,8 @@
|
|
|
<DefaultInput
|
|
|
:model-value="store.user?.name"
|
|
|
class="q-mb-md"
|
|
|
+ disable
|
|
|
label="Franqueado operador"
|
|
|
- readonly
|
|
|
/>
|
|
|
|
|
|
<div class="text-subtitle1 q-mb-md">Dados da Unidade</div>
|
|
|
@@ -25,8 +25,8 @@
|
|
|
v-model:error="validationErrors.unit_id"
|
|
|
:model-value="unitDetails.name"
|
|
|
class="col-12 col-md-6"
|
|
|
+ disable
|
|
|
label="Nome da Unidade"
|
|
|
- readonly
|
|
|
/>
|
|
|
|
|
|
<DefaultInput
|
|
|
@@ -34,8 +34,8 @@
|
|
|
:model-value="unitDetails.cnpj"
|
|
|
:mask="masks.Brasil.cnpj"
|
|
|
class="col-12 col-md-6"
|
|
|
+ disable
|
|
|
label="CNPJ"
|
|
|
- readonly
|
|
|
/>
|
|
|
</div>
|
|
|
|
|
|
@@ -308,93 +308,97 @@
|
|
|
</div>
|
|
|
|
|
|
<div class="row q-col-gutter-sm">
|
|
|
- <div class="col-3">
|
|
|
+ <div :class="registrationIncluded ? 'col-12' : 'col-3'">
|
|
|
<DefaultCurrencyInput
|
|
|
v-model="form.enrollment_fee"
|
|
|
v-model:error="validationErrors.tax_register"
|
|
|
label="Valor da Matrícula"
|
|
|
- :disable="!props.contract"
|
|
|
+ :disable="registrationIncluded || !props.contract"
|
|
|
/>
|
|
|
</div>
|
|
|
|
|
|
- <div class="col-3">
|
|
|
- <DefaultSelect
|
|
|
- v-model="form.installments"
|
|
|
- v-model:error="validationErrors.installments"
|
|
|
- emit-value
|
|
|
- label="Qtde Parcelas"
|
|
|
- map-options
|
|
|
- option-label="label"
|
|
|
- option-value="value"
|
|
|
- :options="enrollmentInstallmentOptions"
|
|
|
- :rules="[inputRules.integerRange(1, 12)]"
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <template v-if="!registrationIncluded">
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultSelect
|
|
|
+ v-model="form.installments"
|
|
|
+ v-model:error="validationErrors.installments"
|
|
|
+ emit-value
|
|
|
+ label="Qtde Parcelas"
|
|
|
+ map-options
|
|
|
+ option-label="label"
|
|
|
+ option-value="value"
|
|
|
+ :options="enrollmentInstallmentOptions"
|
|
|
+ :rules="[inputRules.integerRange(1, 12)]"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="col-3">
|
|
|
- <DefaultCurrencyInput
|
|
|
- v-model:error="validationErrors.installments"
|
|
|
- :model-value="enrollmentInstallmentValue"
|
|
|
- disable
|
|
|
- label="Valor da Parcela"
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultCurrencyInput
|
|
|
+ v-model:error="validationErrors.installments"
|
|
|
+ :model-value="enrollmentInstallmentValue"
|
|
|
+ disable
|
|
|
+ label="Valor da Parcela"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="col-3">
|
|
|
- <DefaultInputDatePicker
|
|
|
- v-model="form.enrollment_due_date"
|
|
|
- v-model:error="validationErrors.enrollment_due_date"
|
|
|
- label="Data Vencimento"
|
|
|
- :rules="[inputRules.date]"
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultInputDatePicker
|
|
|
+ v-model="form.enrollment_due_date"
|
|
|
+ v-model:error="validationErrors.enrollment_due_date"
|
|
|
+ label="Data Vencimento"
|
|
|
+ :rules="[inputRules.date]"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
</div>
|
|
|
|
|
|
<div class="text-subtitle2 q-mt-md q-mb-sm text-grey-8">
|
|
|
- Pacote
|
|
|
+ Aulas
|
|
|
</div>
|
|
|
|
|
|
<div class="row q-col-gutter-sm">
|
|
|
- <div class="col-3">
|
|
|
+ <div :class="classesIncluded ? 'col-12' : 'col-3'">
|
|
|
<DefaultCurrencyInput
|
|
|
v-model="form.package_value"
|
|
|
v-model:error="validationErrors.package_value"
|
|
|
- label="Valor do Pacote"
|
|
|
- :disable="!props.contract"
|
|
|
+ label="Valor das Aulas"
|
|
|
+ :disable="classesIncluded || !props.contract"
|
|
|
/>
|
|
|
</div>
|
|
|
|
|
|
- <div class="col-3">
|
|
|
- <DefaultSelect
|
|
|
- v-model="form.package_installments"
|
|
|
- v-model:error="validationErrors.package_installments"
|
|
|
- emit-value
|
|
|
- label="Qtde Parcelas"
|
|
|
- map-options
|
|
|
- option-label="label"
|
|
|
- option-value="value"
|
|
|
- :options="packageInstallmentOptions"
|
|
|
- :rules="[inputRules.integerRange(1, 13)]"
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <template v-if="!classesIncluded">
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultSelect
|
|
|
+ v-model="form.package_installments"
|
|
|
+ v-model:error="validationErrors.package_installments"
|
|
|
+ emit-value
|
|
|
+ label="Qtde Parcelas"
|
|
|
+ map-options
|
|
|
+ option-label="label"
|
|
|
+ option-value="value"
|
|
|
+ :options="packageInstallmentOptions"
|
|
|
+ :rules="[inputRules.integerRange(1, 13)]"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="col-3">
|
|
|
- <DefaultCurrencyInput
|
|
|
- v-model:error="validationErrors.package_installments"
|
|
|
- :model-value="packageInstallmentValue"
|
|
|
- disable
|
|
|
- label="Valor da Parcela"
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultCurrencyInput
|
|
|
+ v-model:error="validationErrors.package_installments"
|
|
|
+ :model-value="packageInstallmentValue"
|
|
|
+ disable
|
|
|
+ label="Valor da Parcela"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="col-3">
|
|
|
- <DefaultInputDatePicker
|
|
|
- v-model="form.package_due_date"
|
|
|
- v-model:error="validationErrors.package_due_date"
|
|
|
- label="Data 1ª Parcela"
|
|
|
- :rules="[inputRules.date]"
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultInputDatePicker
|
|
|
+ v-model="form.package_due_date"
|
|
|
+ v-model:error="validationErrors.package_due_date"
|
|
|
+ label="Data 1ª Parcela"
|
|
|
+ :rules="[inputRules.date]"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
</div>
|
|
|
|
|
|
<div class="text-subtitle2 q-mt-md q-mb-sm text-grey-8">
|
|
|
@@ -402,46 +406,48 @@
|
|
|
</div>
|
|
|
|
|
|
<div class="row q-col-gutter-sm">
|
|
|
- <div class="col-3">
|
|
|
+ <div :class="materialsIncluded ? 'col-12' : 'col-3'">
|
|
|
<DefaultCurrencyInput
|
|
|
v-model="form.materials_value"
|
|
|
v-model:error="validationErrors.materials_value"
|
|
|
label="Valor dos Materiais"
|
|
|
- :disable="!props.contract"
|
|
|
+ :disable="materialsIncluded || !props.contract"
|
|
|
/>
|
|
|
</div>
|
|
|
|
|
|
- <div class="col-3">
|
|
|
- <DefaultSelect
|
|
|
- v-model="form.materials_installments"
|
|
|
- v-model:error="validationErrors.materials_installments"
|
|
|
- emit-value
|
|
|
- label="Qtde Parcelas"
|
|
|
- map-options
|
|
|
- option-label="label"
|
|
|
- option-value="value"
|
|
|
- :options="packageInstallmentOptions"
|
|
|
- :rules="[inputRules.integerRange(1, 13)]"
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <template v-if="!materialsIncluded">
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultSelect
|
|
|
+ v-model="form.materials_installments"
|
|
|
+ v-model:error="validationErrors.materials_installments"
|
|
|
+ emit-value
|
|
|
+ label="Qtde Parcelas"
|
|
|
+ map-options
|
|
|
+ option-label="label"
|
|
|
+ option-value="value"
|
|
|
+ :options="packageInstallmentOptions"
|
|
|
+ :rules="[inputRules.integerRange(1, 13)]"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="col-3">
|
|
|
- <DefaultCurrencyInput
|
|
|
- v-model:error="validationErrors.materials_installments"
|
|
|
- :model-value="materialsInstallmentValue"
|
|
|
- disable
|
|
|
- label="Valor da Parcela"
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultCurrencyInput
|
|
|
+ v-model:error="validationErrors.materials_installments"
|
|
|
+ :model-value="materialsInstallmentValue"
|
|
|
+ disable
|
|
|
+ label="Valor da Parcela"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="col-3">
|
|
|
- <DefaultInputDatePicker
|
|
|
- v-model="form.materials_due_date"
|
|
|
- v-model:error="validationErrors.materials_due_date"
|
|
|
- label="Data 1ª Parcela"
|
|
|
- :rules="[inputRules.date]"
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultInputDatePicker
|
|
|
+ v-model="form.materials_due_date"
|
|
|
+ v-model:error="validationErrors.materials_due_date"
|
|
|
+ label="Data 1ª Parcela"
|
|
|
+ :rules="[inputRules.date]"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
</div>
|
|
|
|
|
|
<div class="text-subtitle2 q-mt-md q-mb-sm text-grey-8">
|
|
|
@@ -492,16 +498,6 @@
|
|
|
</div>
|
|
|
|
|
|
<div class="row q-col-gutter-sm q-mt-xs">
|
|
|
- <div class="col-6">
|
|
|
- <DefaultInput
|
|
|
- v-model="form.early_payment_discount"
|
|
|
- v-model:error="validationErrors.early_payment_discount"
|
|
|
- label="Desconto até o vencimento (%)"
|
|
|
- type="number"
|
|
|
- :rules="[inputRules.minValue(0), inputRules.maxValue(100)]"
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
<div class="col-6">
|
|
|
<DefaultSelect
|
|
|
v-model="form.payment_method"
|
|
|
@@ -518,16 +514,6 @@
|
|
|
/>
|
|
|
</div>
|
|
|
|
|
|
- <div class="col-6">
|
|
|
- <DefaultInput
|
|
|
- v-model="form.interest_rate"
|
|
|
- v-model:error="validationErrors.interest_rate"
|
|
|
- label="Juros (%) a.m"
|
|
|
- type="number"
|
|
|
- :rules="[inputRules.minValue(0)]"
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
<div class="col-6">
|
|
|
<DefaultInput
|
|
|
v-model="form.late_fee"
|
|
|
@@ -736,6 +722,30 @@ const modalityOptions = computed(() => {
|
|
|
return options;
|
|
|
});
|
|
|
|
|
|
+const selectedModality = computed(() => {
|
|
|
+ const selectedPackage = packages.value.find(
|
|
|
+ (item) => item.id === form.package_id,
|
|
|
+ );
|
|
|
+
|
|
|
+ return form.pricing_mode === "irrecusavel"
|
|
|
+ ? selectedPackage?.irrecusavel
|
|
|
+ : selectedPackage?.pavao;
|
|
|
+});
|
|
|
+
|
|
|
+// Item "incluso no valor do curso" não gera cobrança separada — só o campo
|
|
|
+// de valor aparece (informativo, desabilitado); parcelas/vencimento somem.
|
|
|
+const registrationIncluded = computed(() =>
|
|
|
+ Boolean(selectedModality.value?.registration_included_in_course),
|
|
|
+);
|
|
|
+
|
|
|
+const classesIncluded = computed(() =>
|
|
|
+ Boolean(selectedModality.value?.classes_included_in_course),
|
|
|
+);
|
|
|
+
|
|
|
+const materialsIncluded = computed(() =>
|
|
|
+ Boolean(selectedModality.value?.materials_included_in_course),
|
|
|
+);
|
|
|
+
|
|
|
const completeDatePattern = /^\d{2}\/\d{2}\/\d{4}$/;
|
|
|
|
|
|
const defaultContractDates = (() => {
|
|
|
@@ -811,8 +821,6 @@ const { form, getUpdatedFields } = useForm({
|
|
|
class_quantity: props.contract?.class_quantity ?? null,
|
|
|
due_day: props.contract?.due_day ?? null,
|
|
|
|
|
|
- early_payment_discount: props.contract?.early_payment_discount ?? null,
|
|
|
-
|
|
|
end_date: props.contract?.end_date ?? defaultContractDates?.end_date ?? null,
|
|
|
|
|
|
end_time: trimTime(props.contract?.end_time),
|
|
|
@@ -821,7 +829,6 @@ const { form, getUpdatedFields } = useForm({
|
|
|
|
|
|
enrollment_fee: props.contract?.tax_register ?? null,
|
|
|
installments: props.contract?.installments ?? null,
|
|
|
- interest_rate: props.contract?.interest_rate ?? null,
|
|
|
late_fee: props.contract?.fine_cancelled ?? null,
|
|
|
package_due_date: props.contract?.package_due_date ?? null,
|
|
|
|
|
|
@@ -904,8 +911,6 @@ const buildPayload = () => ({
|
|
|
|
|
|
due_day: form.due_day ? Number.parseInt(form.due_day) : null,
|
|
|
|
|
|
- early_payment_discount: form.early_payment_discount,
|
|
|
-
|
|
|
end_date: form.end_date ? formatDateDMYtoYMD(form.end_date) : null,
|
|
|
|
|
|
end_time: form.end_time,
|
|
|
@@ -916,7 +921,6 @@ const buildPayload = () => ({
|
|
|
|
|
|
fine_cancelled: form.late_fee,
|
|
|
installments: form.installments,
|
|
|
- interest_rate: form.interest_rate,
|
|
|
|
|
|
materials_due_date: form.materials_due_date
|
|
|
? formatDateDMYtoYMD(form.materials_due_date)
|
|
|
@@ -1015,8 +1019,6 @@ const handleSave = async () => {
|
|
|
"installments",
|
|
|
"package_value",
|
|
|
"package_installments",
|
|
|
- "early_payment_discount",
|
|
|
- "interest_rate",
|
|
|
"payment_method",
|
|
|
"pricing_mode",
|
|
|
"materials_value",
|
|
|
@@ -1239,25 +1241,21 @@ watch(
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- form.enrollment_fee = modality.registration_included_in_course
|
|
|
- ? null
|
|
|
- : modality.registration_value;
|
|
|
+ // O valor aparece sempre (informativo); parcelas só existem pro que não
|
|
|
+ // estiver incluso no curso (é o que vira cobrança separada).
|
|
|
+ form.enrollment_fee = modality.registration_value;
|
|
|
|
|
|
form.installments = modality.registration_included_in_course
|
|
|
? null
|
|
|
: modality.registration_max_installments;
|
|
|
|
|
|
- form.package_value = modality.classes_included_in_course
|
|
|
- ? null
|
|
|
- : modality.classes_value;
|
|
|
+ form.package_value = modality.classes_value;
|
|
|
|
|
|
form.package_installments = modality.classes_included_in_course
|
|
|
? null
|
|
|
: modality.classes_max_installments;
|
|
|
|
|
|
- form.materials_value = modality.materials_included_in_course
|
|
|
- ? null
|
|
|
- : modality.materials_total_value;
|
|
|
+ form.materials_value = modality.materials_total_value;
|
|
|
|
|
|
form.materials_installments = modality.materials_included_in_course
|
|
|
? null
|
|
|
@@ -1265,6 +1263,11 @@ watch(
|
|
|
|
|
|
form.total_value = modality.total_value;
|
|
|
form.total_installments = modality.total_max_installments;
|
|
|
+
|
|
|
+ // Vencimento só faz sentido pro que gera cobrança separada.
|
|
|
+ if (modality.registration_included_in_course) form.enrollment_due_date = null;
|
|
|
+ if (modality.classes_included_in_course) form.package_due_date = null;
|
|
|
+ if (modality.materials_included_in_course) form.materials_due_date = null;
|
|
|
},
|
|
|
);
|
|
|
|
|
|
@@ -1333,14 +1336,6 @@ onMounted(async () => {
|
|
|
|
|
|
if (!financial) return;
|
|
|
|
|
|
- if (financial.default_discount != null) {
|
|
|
- form.early_payment_discount = financial.default_discount;
|
|
|
- }
|
|
|
-
|
|
|
- if (financial.default_interest != null) {
|
|
|
- form.interest_rate = financial.default_interest;
|
|
|
- }
|
|
|
-
|
|
|
if (financial.default_fine != null) {
|
|
|
form.late_fee = financial.default_fine;
|
|
|
}
|