Переглянути джерело

feat: update contract dialogs to disable early payment discount and interest rate fields

alvesantos 15 годин тому
батько
коміт
e88f5f3c03

+ 138 - 143
src/pages/students/components/AddEditContractDialog.vue

@@ -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;
       }

+ 0 - 16
src/pages/students/components/ViewContractDialog.vue

@@ -255,14 +255,6 @@
                 />
               </div>
 
-              <div class="col-6">
-                <DefaultInput
-                  :model-value="contract.early_payment_discount"
-                  disable
-                  label="Desconto até o vencimento (%)"
-                />
-              </div>
-
               <div class="col-3">
                 <DefaultCurrencyInput
                   :model-value="contract.materials_value"
@@ -283,14 +275,6 @@
                 />
               </div>
 
-              <div class="col-6">
-                <DefaultInput
-                  :model-value="contract.interest_rate"
-                  disable
-                  label="Juros (%) a.m"
-                />
-              </div>
-
               <div class="col-3">
                 <DefaultCurrencyInput
                   :model-value="contract.total_value"