Quellcode durchsuchen

refactor: mostra descontos na seção de carrinho

Gustavo Mantovani vor 4 Tagen
Ursprung
Commit
4598131d35

+ 125 - 63
src/components/dashboard/NextSchedulesDetailsDialog.vue

@@ -5,20 +5,27 @@
       <q-card-section class="column items-center q-pt-lg q-pb-sm">
         <q-avatar size="80px" :style="avatarStyle" class="fontbold text-h5 q-mb-sm">
           <img v-if="details?.provider_photo" :src="details.provider_photo" />
-          <span v-else>{{ schedule.provider_name?.slice(0, 2).toUpperCase() ?? '??' }}</span>
+
+          <span v-else>
+            {{ schedule.provider_name?.slice(0, 2).toUpperCase() ?? '??' }}
+          </span>
         </q-avatar>
 
         <div class="provider-name font16 fontbold">
           {{ schedule.provider_name }}
+
           <span v-if="providerAge !== null" class=" text-grey-6">
             {{ '(' + providerAge + ' ' + $t('dashboard_client.next_schedules.provider_age_unit') + ')' }}
           </span>
         </div>
+
         <div class="text-text font12 fontbold">
           {{ schedule.address?.district }}
         </div>
+
         <div v-if="schedule.address" class="font9 fontmedium text-grey-7 q-mt-xs">
           <q-icon name="mdi-map-marker" color="text" size="14px" class="q-mr-xs" />
+
           {{ formatAddress(schedule.address) }}
         </div>
       </q-card-section>
@@ -31,6 +38,7 @@
             <q-spinner-dots color="primary" size="24px" />
           </div>
         </template>
+
         <template v-else>
           <div
             v-for="sp in details?.specialities"
@@ -43,12 +51,19 @@
                 color="primary"
                 size="12px"
               />
-              <span class="text-grey-8 font10 fontmedium q-pl-sm">{{ sp.description }}</span>
+
+              <span class="text-grey-8 font10 fontmedium q-pl-sm">
+                {{ sp.description }}
+              </span>
             </div>
           </div>
+
           <div v-if="!details?.specialities?.length" class="row items-center q-gutter-x-sm">
-            <q-icon name="mdi-check" color="secondary" size="16px" />
-            <span class="text-grey-8 font10 fontmedium">{{ $t('dashboard_client.next_schedules.default_service') }}</span>
+            <q-icon color="secondary" name="mdi-check" size="16px" />
+
+            <span class="text-grey-8 font10 fontmedium">
+              {{ $t('dashboard_client.next_schedules.default_service') }}
+            </span>
           </div>
         </template>
       </q-card-section>
@@ -57,27 +72,53 @@
 
       <q-card-section class="q-py-md q-px-lg font12 fontmedium">
         <div class="detail-row">
-          <span class="detail-label text-primary q-pr-sm">{{ $t('dashboard_client.pending_schedules.detail_date') }}</span>
-          <span class="detail-value">{{ fullDateLabel }}</span>
+          <span class="detail-label text-primary q-pr-sm">
+            {{ $t('dashboard_client.pending_schedules.detail_date') }}
+          </span>
+
+          <span class="detail-value">
+            {{ fullDateLabel }}
+          </span>
         </div>
+
         <div class="detail-row">
-          <span class="detail-label text-primary q-pr-sm">{{ $t('dashboard_client.pending_schedules.detail_time') }}</span>
+          <span class="detail-label text-primary q-pr-sm">
+            {{ $t('dashboard_client.pending_schedules.detail_time') }}
+          </span>
+
           <span class="detail-value">
             {{ schedule.start_time?.slice(0, 5) }} {{ $t('dashboard_client.next_schedules.to') }} {{ schedule.end_time?.slice(0, 5) }}
           </span>
         </div>
+
         <div class="detail-row">
-          <span class="detail-label text-primary q-pr-sm">{{ $t('dashboard_client.pending_schedules.detail_value') }}</span>
-          <span class="detail-value">{{ formatCurrency(schedule.total_amount) }}</span>
+          <span class="detail-label text-primary q-pr-sm">
+            {{ $t('dashboard_client.pending_schedules.detail_value') }}
+          </span>
+
+          <span class="detail-value">
+            {{ formatCurrency(schedule.total_amount) }}
+          </span>
         </div>
+
         <div class="detail-row">
-          <span class="detail-label text-primary q-pr-sm">{{ $t('dashboard_client.pending_schedules.detail_service_fee') }}</span>
-          <span class="detail-value">{{ formatCurrency(serviceFee) }}</span>
+          <span class="detail-label text-primary q-pr-sm">
+            {{ $t('dashboard_client.pending_schedules.detail_service_fee') }}
+          </span>
+
+          <span class="detail-value">
+            {{ formatCurrency(serviceFee) }}
+          </span>
         </div>
 
         <div class="detail-row-total font16 fontbold">
-          <span class="detail-label text-primary q-pr-sm">{{ $t('dashboard_client.pending_schedules.detail_total') }}</span>
-          <span class="total-value">{{ formatCurrency(total) }}</span>
+          <span class="detail-label text-primary q-pr-sm">
+            {{ $t('dashboard_client.pending_schedules.detail_total') }}
+          </span>
+
+          <span class="total-value">
+            {{ formatCurrency(total) }}
+          </span>
         </div>
         
         <q-separator class="q-my-sm divisoria-tracejada" />
@@ -85,11 +126,11 @@
 
       <q-card-section class="q-pt-none q-pb-sm q-px-lg">
         <q-btn
-          unelevated
-          rounded
-          no-caps
-          color="primary"
           class="close-btn full-width"
+          color="primary"
+          no-caps
+          rounded
+          unelevated
           :label="$t('dashboard_client.next_schedules.btn_close')"
           @click="onDialogCancel"
         />
@@ -98,104 +139,113 @@
       <q-card-section class="q-pt-xs q-pb-md text-center">
         <div class="row justify-center q-gutter-x-lg">
           <q-btn
+            color="grey-7"
             flat
             no-caps
-            color="grey-7"
             size="sm"
             :label="$t('dashboard_client.pending_schedules.btn_cancel')"
             @click="openCancelDialog"
           />
+
           <q-btn
+            color="grey-7"
             flat
             no-caps
-            color="grey-7"
             size="sm"
             :label="$t('dashboard_client.next_schedules.btn_help')"
             @click="openHelp"
           />
         </div>
       </q-card-section>
-
     </q-card>
   </q-dialog>
 </template>
 
 <script setup>
 import { computed, onMounted, ref } from 'vue'
-import { useDialogPluginComponent, useQuasar } from 'quasar'
-import { useI18n } from 'vue-i18n'
+import { formatAddress } from 'src/helpers/utils';
 import { formatCurrency } from 'src/helpers/utils'
 import { getScheduleClienteDetails } from 'src/api/dashboard'
+import { getSchedulePlatformFeeRate } from 'src/helpers/paymentPlatformFees'
+import { useDialogPluginComponent, useQuasar } from 'quasar'
+import { useI18n } from 'vue-i18n'
 import { usePaymentPlatformFees } from 'src/composables/usePaymentPlatformFees'
-import ScheduleCancelDialog from './ScheduleCancelDialog.vue'
+
 import ProfileHelpDialog from 'src/components/profile/ProfileHelpDialog.vue'
-import { formatAddress } from 'src/helpers/utils';
+import ScheduleCancelDialog from './ScheduleCancelDialog.vue'
 
 const props = defineProps({
-  schedule: {
-    type: Object,
-    required: true
-  }
+  schedule: { type: Object, required: true }
 })
 
 defineEmits([...useDialogPluginComponent.emits])
 
 const { t } = useI18n()
-const $q = useQuasar()
+const $q    = useQuasar()
+
 const { dialogRef, onDialogHide, onDialogCancel } = useDialogPluginComponent()
 
-const details = ref(null)
-const loadingDetails = ref(true)
 const { platformFees, loadPlatformFees } = usePaymentPlatformFees()
 
-onMounted(async () => {
-  try {
-    details.value = await getScheduleClienteDetails(props.schedule.id)
-    loadPlatformFees().catch(() => {})
-  } catch {
-    $q.notify({ message: t('http.errors.failed'), color: 'negative' })
-  } finally {
-    loadingDetails.value = false
-  }
-})
-
-const serviceFee = computed(() => {
-  const base = parseFloat(props.schedule.total_amount) || 0
-  return parseFloat((base * platformFees.value.pix).toFixed(2))
-})
-
-const total = computed(() => {
-  const base = parseFloat(props.schedule.total_amount) || 0
-  return parseFloat((base + serviceFee.value).toFixed(2))
-})
-
-const providerAge = computed(() => {
-  if (!details.value?.provider_birth_date) return null
-  const birth = new Date(details.value.provider_birth_date)
-  const today = new Date()
-  let age = today.getFullYear() - birth.getFullYear()
-  const m = today.getMonth() - birth.getMonth()
-  if (m < 0 || (m === 0 && today.getDate() < birth.getDate())) age--
-  return age
-})
+const details        = ref(null)
+const loadingDetails = ref(true)
 
 const parseLocalDate = (dateStr) => {
   if (!dateStr) return null
+
   const s = String(dateStr)
+
   const iso = s.match(/^(\d{4})-(\d{2})-(\d{2})/)
+
   if (iso) return new Date(+iso[1], +iso[2] - 1, +iso[3])
+
   const dmy = s.match(/^(\d{2})\/(\d{2})\/(\d{4})/)
+
   if (dmy) return new Date(+dmy[3], +dmy[2] - 1, +dmy[1])
+
   return null
 }
 
 const fullDateLabel = computed(() => {
   if (props.schedule.formatted_date) return props.schedule.formatted_date
+
   const d = parseLocalDate(props.schedule.date)
+
   if (!d) return props.schedule.date ?? ''
+
   return d.toLocaleDateString('pt-BR', { day: '2-digit', month: 'long', year: 'numeric' })
 })
 
+const providerAge = computed(() => {
+  if (!details.value?.provider_birth_date) return null
+
+  const birth = new Date(details.value.provider_birth_date)
+
+  const today = new Date()
+
+  let age = today.getFullYear() - birth.getFullYear()
+
+  const m = today.getMonth() - birth.getMonth()
+
+  if (m < 0 || (m === 0 && today.getDate() < birth.getDate())) age--
+
+  return age
+})
+
+const serviceFee = computed(() => {
+  const base = parseFloat(props.schedule.total_amount) || 0
+
+  const feeRate = getSchedulePlatformFeeRate(props.schedule, 'pix', platformFees.value)
+
+  return parseFloat((base * (feeRate ?? 0)).toFixed(2))
+})
+
+const total = computed(() => {
+  const base = parseFloat(props.schedule.total_amount) || 0
+
+  return parseFloat((base + serviceFee.value).toFixed(2))
+})
+
 const avatarColors = [
   { background: '#ffd5df', color: '#932e57' },
   { background: '#d7e8ff', color: '#2158a8' },
@@ -206,14 +256,26 @@ const avatarStyle = computed(() => avatarColors[props.schedule.id % avatarColors
 
 const openCancelDialog = () => {
   $q.dialog({
-    component: ScheduleCancelDialog,
-    componentProps: { schedule: props.schedule }
+    component: ScheduleCancelDialog, componentProps: { schedule: props.schedule }
   })
 }
 
 const openHelp = () => {
   $q.dialog({ component: ProfileHelpDialog })
 }
+
+onMounted(async () => {
+  try {
+    details.value = await getScheduleClienteDetails(props.schedule.id)
+
+    loadPlatformFees().catch(() => {})
+  } catch {
+    $q.notify({ message: t('http.errors.failed'), color: 'negative' })
+  } finally {
+    loadingDetails.value = false
+  }
+})
+
 </script>
 
 <style scoped lang="scss">

+ 88 - 39
src/components/dashboard/ScheduleAcceptedDialog.vue

@@ -7,8 +7,13 @@
           {{ schedule.provider_name?.slice(0, 2).toUpperCase() ?? '??' }}
         </q-avatar>
 
-        <div class="font16 fontbold provider-name">{{ schedule.provider_name }}</div>
-        <div class="font14 fontmedium text-text">{{ schedule.address?.district || '' }}</div>
+        <div class="font16 fontbold provider-name">
+          {{ schedule.provider_name }}
+        </div>
+
+        <div class="font14 fontmedium text-text">
+          {{ schedule.address?.district || '' }}
+        </div>
       </q-card-section>
 
       <q-card-section class="text-center q-pt-xs q-pb-md">
@@ -21,50 +26,82 @@
 
       <q-card-section class="q-py-md q-px-lg">
         <div class="detail-row">
-          <span class="text-primary font14 fontmedium">{{ $t('dashboard_client.pending_schedules.detail_date') }}</span>
-          <span class="detail-value">{{ formattedDate }}</span>
+          <span class="text-primary font14 fontmedium">
+            {{ $t('dashboard_client.pending_schedules.detail_date') }}
+          </span>
+
+          <span class="detail-value">
+            {{ formattedDate }}
+          </span>
         </div>
         <div class="detail-row">
-          <span class="text-primary font14 fontmedium">{{ $t('dashboard_client.pending_schedules.detail_time') }}</span>
+          <span class="text-primary font14 fontmedium">
+            {{ $t('dashboard_client.pending_schedules.detail_time') }}
+          </span>
+
           <span class="detail-valued text-text">
             {{ schedule.start_time?.slice(0, 5) }} {{ $t('dashboard_client.next_schedules.to') }} {{ schedule.end_time?.slice(0, 5) }}
           </span>
         </div>
+
         <div class="detail-row">
-          <span class="text-primary font14 fontmedium">{{ $t('dashboard_client.pending_schedules.detail_value') }}</span>
-          <span class="detail-value">{{ formatCurrency(baseAmount) }}</span>
+          <span class="text-primary font14 fontmedium">
+            {{ $t('dashboard_client.pending_schedules.detail_value') }}
+          </span>
+
+          <span class="detail-value">
+            {{ formatCurrency(baseAmount) }}
+          </span>
         </div>
 
         <q-separator class="q-my-sm" />
 
         <div class="detail-row">
-          <span class="text-primary font14 fontmedium">{{ $t('dashboard_client.pending_schedules.detail_pix_total') }}</span>
-          <span class="total-value font14 fontbold">{{ formatCurrency(pixTotal) }}</span>
+          <span class="text-primary font14 fontmedium">
+            {{ $t('dashboard_client.pending_schedules.detail_pix_total') }}
+          </span>
+
+          <span class="total-value font14 fontbold">
+            {{ formatCurrency(pixTotal) }}
+          </span>
         </div>
+
         <div v-if="pixDiscount > 0" class="detail-row discount-row">
-          <span class="font13 fontmedium">{{ $t('dashboard_client.pending_schedules.detail_pix_discount') }}</span>
-          <span class="font13 fontbold">{{ formatCurrency(pixDiscount) }}</span>
+          <span class="font13 fontmedium">
+            {{ $t('dashboard_client.pending_schedules.detail_pix_discount') }}
+          </span>
+
+          <span class="font13 fontbold">
+            {{ formatCurrency(pixDiscount) }}
+          </span>
         </div>
+
         <div class="detail-row">
-          <span class="text-primary font14 fontmedium">{{ $t('dashboard_client.pending_schedules.detail_credit_card_total') }}</span>
-          <span class="total-value font14 fontbold">{{ formatCurrency(creditCardTotal) }}</span>
+          <span class="text-primary font14 fontmedium">
+            {{ $t('dashboard_client.pending_schedules.detail_credit_card_total') }}
+          </span>
+
+          <span class="total-value font14 fontbold">
+            {{ formatCurrency(creditCardTotal) }}
+          </span>
         </div>
       </q-card-section>
 
       <q-card-section class="q-pt-none q-pb-lg q-px-lg column q-gutter-y-sm">
         <q-btn
-          rounded
-          color="primary"
           class="payment-btn full-width"
+          color="primary"
           padding="4px 12px"
+          rounded
           :label="$t('dashboard_client.pending_schedules.btn_payment')"
           @click="onGoToPayment"
         />
+
         <q-btn
+          class="full-width"
+          color="grey-6"
           flat
           no-caps
-          color="grey-6"
-          class="full-width"
           padding="4px 12px"
           :label="$t('dashboard_client.pending_schedules.btn_cancel')"
           @click="onDialogHide"
@@ -77,18 +114,16 @@
 
 <script setup>
 import { computed, onMounted } from 'vue'
-import { useDialogPluginComponent, useQuasar } from 'quasar'
 import { formatCurrency } from 'src/helpers/utils'
+import { getSchedulePlatformFeeRate } from 'src/helpers/paymentPlatformFees'
+import { useDialogPluginComponent, useQuasar } from 'quasar'
 import { usePaymentStore } from 'src/stores/payment'
 import { usePaymentPlatformFees } from 'src/composables/usePaymentPlatformFees'
 import SchedulePaymentDialog from './SchedulePaymentDialog.vue'
 import SchedulePaymentPixDialog from './SchedulePaymentPixDialog.vue'
 
 const props = defineProps({
-  schedule: {
-    type: Object,
-    required: true
-  }
+  schedule: { type: Object, required: true }
 })
 
 defineEmits([...useDialogPluginComponent.emits])
@@ -96,18 +131,37 @@ defineEmits([...useDialogPluginComponent.emits])
 const { dialogRef, onDialogHide, onDialogOK } = useDialogPluginComponent()
 
 const $q = useQuasar()
+
 const paymentStore = usePaymentStore()
-const { platformFees, loadPlatformFees } = usePaymentPlatformFees()
 
-onMounted(() => {
-  loadPlatformFees().catch(() => {})
-})
+const { platformFees, loadPlatformFees } = usePaymentPlatformFees()
 
 const baseAmount = computed(() => Number(props.schedule.total_amount) || 0)
-const platformFee = (paymentType) => parseFloat((baseAmount.value * (platformFees.value[paymentType] ?? 0)).toFixed(2))
-const pixTotal = computed(() => parseFloat((baseAmount.value + platformFee('pix')).toFixed(2)))
+
 const creditCardTotal = computed(() => parseFloat((baseAmount.value + platformFee('credit_card')).toFixed(2)))
+
+const formattedDate = computed(() => {
+  if (props.schedule.formatted_date) return props.schedule.formatted_date
+
+  const raw = String(props.schedule.date || '')
+
+  const m = raw.match(/^(\d{4})-(\d{2})-(\d{2})/)
+
+  if (!m) return raw
+
+  const d = new Date(+m[1], +m[2] - 1, +m[3])
+
+  return d.toLocaleDateString('pt-BR', { day: '2-digit', month: 'long', year: 'numeric' })
+})
+
 const pixDiscount = computed(() => Math.max(0, parseFloat((creditCardTotal.value - pixTotal.value).toFixed(2))))
+const pixTotal    = computed(() => parseFloat((baseAmount.value + platformFee('pix')).toFixed(2)))
+
+const platformFee = (paymentType) => {
+  const feeRate = getSchedulePlatformFeeRate(props.schedule, paymentType, platformFees.value)
+
+  return parseFloat((baseAmount.value * (feeRate ?? 0)).toFixed(2))
+}
 
 const onGoToPayment = () => {
   const hasValidPixPayment = !!paymentStore.getValidPixPayment(props.schedule.id)
@@ -115,30 +169,25 @@ const onGoToPayment = () => {
   $q.dialog({
     component: hasValidPixPayment ? SchedulePaymentPixDialog : SchedulePaymentDialog,
     componentProps: {
-      schedule: props.schedule,
-      ...(hasValidPixPayment ? { total: pixTotal.value } : {}),
+      schedule: props.schedule, ...(hasValidPixPayment ? { total: pixTotal.value } : {}),
     },
   }).onOk(() => {
     onDialogOK()
   })
 }
 
-const formattedDate = computed(() => {
-  if (props.schedule.formatted_date) return props.schedule.formatted_date
-  const raw = String(props.schedule.date || '')
-  const m = raw.match(/^(\d{4})-(\d{2})-(\d{2})/)
-  if (!m) return raw
-  const d = new Date(+m[1], +m[2] - 1, +m[3])
-  return d.toLocaleDateString('pt-BR', { day: '2-digit', month: 'long', year: 'numeric' })
-})
-
 const avatarColors = [
   { background: '#ffd5df', color: '#932e57' },
   { background: '#d7e8ff', color: '#2158a8' },
   { background: '#dfd',    color: '#2a7a3b' },
   { background: '#ffe5cc', color: '#8a4500' },
 ]
+
 const avatarStyle = computed(() => avatarColors[props.schedule.id % avatarColors.length])
+
+onMounted(() => {
+  loadPlatformFees().catch(() => {})
+})
 </script>
 
 <style scoped lang="scss">

+ 2 - 1
src/components/dashboard/SchedulePaymentDialog.vue

@@ -122,6 +122,7 @@ import { userStore } from 'src/stores/user'
 import { usePaymentStore } from 'src/stores/payment'
 import { getClientPaymentMethods } from 'src/api/clientPaymentMethod'
 import { formatCurrency } from 'src/helpers/utils'
+import { getSchedulePlatformFeeRate } from 'src/helpers/paymentPlatformFees'
 import { usePaymentPlatformFees } from 'src/composables/usePaymentPlatformFees'
 import ProfilePaymentAddDialog from 'src/components/profile/ProfilePaymentAddDialog.vue'
 import SchedulePaymentPixDialog from './SchedulePaymentPixDialog.vue'
@@ -150,7 +151,7 @@ const loadingCards = ref(false)
 
 const baseAmount = computed(() => Number(props.schedule.total_amount) || 0)
 const selectedPaymentType = computed(() => selectedMethod.value === 'pix' ? 'pix' : 'credit_card')
-const selectedPlatformFeeRate = computed(() => platformFees.value[selectedPaymentType.value] ?? platformFees.value.pix)
+const selectedPlatformFeeRate = computed(() => getSchedulePlatformFeeRate(props.schedule, selectedPaymentType.value, platformFees.value) ?? platformFees.value.pix)
 const selectedPlatformFee = computed(() => parseFloat((baseAmount.value * selectedPlatformFeeRate.value).toFixed(2)))
 const selectedTotal = computed(() => parseFloat((baseAmount.value + selectedPlatformFee.value).toFixed(2)))
 

+ 12 - 0
src/helpers/paymentPlatformFees.js

@@ -0,0 +1,12 @@
+export const scheduleUsesCartDiscount = (schedule) =>
+  Number(schedule?.cart_items_count ?? schedule?.cartItemsCount ?? schedule?.cart?.items_count ?? 0) >= 3
+
+export const getSchedulePlatformFeeRate = (schedule, paymentType, platformFees) => {
+  const fees = platformFees?.value ?? platformFees ?? {}
+
+  if (scheduleUsesCartDiscount(schedule) && fees.cart_min_3_schedules !== null && fees.cart_min_3_schedules !== undefined) {
+    return fees.cart_min_3_schedules
+  }
+
+  return fees[paymentType]
+}

+ 1 - 0
src/i18n/locales/en.json

@@ -810,6 +810,7 @@
     "cart_fee_discount": "Cart fee discount: R$ {value}",
     "cart_discount_hint": "Add {count} more time slot(s) to get the cart discount.",
     "cart_discount_applied": "Discount applied: 3 or more time slots in the cart.",
+    "cart_discount_total": "With discount",
     "provider": "Professional",
     "address": "Address",
     "quantity": "Quantity",

+ 1 - 0
src/i18n/locales/es.json

@@ -806,6 +806,7 @@
     "cart_fee_discount": "Descuento de la tarifa del carrito: R$ {value}",
     "cart_discount_hint": "Agregue {count} horario(s) más para recibir descuento en el carrito.",
     "cart_discount_applied": "Descuento aplicado: 3 o más horarios en el carrito.",
+    "cart_discount_total": "Con descuento",
     "provider": "Profesional",
     "address": "Dirección",
     "quantity": "Cantidad",

+ 1 - 0
src/i18n/locales/pt.json

@@ -818,6 +818,7 @@
     "cart_fee_discount": "Desconto da taxa do carrinho: R$ {value}",
     "cart_discount_hint": "Adicione mais {count} horário(s) para receber desconto no carrinho.",
     "cart_discount_applied": "Desconto aplicado: 3 ou mais horários no carrinho.",
+    "cart_discount_total": "Com desconto",
     "provider": "Profissional",
     "address": "Endereço",
     "quantity": "Quantidade",

+ 30 - 6
src/pages/schedule-cart/ScheduleCartPage.vue

@@ -132,7 +132,7 @@
                   <q-space />
 
                   <span class="font12 fontbold text-primary">
-                    {{ formatCurrencyValue(getPixItemTotal(item)) }}
+                    {{ formatCurrencyValue(getStandardPixItemTotal(item)) }}
                   </span>
                 </div>
 
@@ -147,6 +147,18 @@
                     {{ formatCurrencyValue(getCreditCardItemTotal(item)) }}
                   </span>
                 </div>
+
+                <div v-if="hasCartDiscount" class="row items-center no-wrap q-mt-xs">
+                  <span class="font11 fontbold text-positive">
+                    {{ $t('schedule_cart.cart_discount_total') }}
+                  </span>
+
+                  <q-space />
+
+                  <span class="font12 fontbold text-positive">
+                    {{ formatCurrencyValue(getCartDiscountItemTotal(item)) }}
+                  </span>
+                </div>
               </div>
             </div>
 
@@ -221,6 +233,18 @@
               </span>
             </div>
 
+            <div v-if="hasCartDiscount" class="summary-row row items-center no-wrap q-py-xs">
+              <span class="font12 fontbold text-positive">
+                {{ $t('schedule_cart.cart_discount_total') }}
+              </span>
+
+              <q-space />
+
+              <span class="font14 fontbold text-positive">
+                {{ formatCurrencyValue(cartDiscountTotalAmount) }}
+              </span>
+            </div>
+
             <div v-if="pixDiscountAmount > 0" class="summary-discount row items-center no-wrap q-py-xs q-px-sm q-mt-sm">
               <q-icon color="positive" name="mdi-tag-outline" size="18px" />
 
@@ -282,7 +306,7 @@ const cartDiscountMessage = computed(() => {
   return t("schedule_cart.cart_discount_hint", { count: missingSchedulesForDiscount.value });
 });
 
-const effectivePixFee = computed(() => hasCartDiscount.value ? platformFees.value.cart_min_3_schedules : platformFees.value.pix);
+const cartDiscountTotalAmount = computed(() => roundNullableMoney(sumCartItems(getCartDiscountItemTotal)));
 
 const hasCartDiscount = computed(() => cart.items.length >= 3);
 
@@ -299,7 +323,7 @@ const pixDiscountAmount = computed(() => {
 
   return roundNullableMoney(sumCartItems((item) => {
     const standardPixItemTotal   = getStandardPixItemTotal(item);
-    const discountedPixItemTotal = getPixItemTotal(item);
+    const discountedPixItemTotal = getCartDiscountItemTotal(item);
 
     if (standardPixItemTotal === null || discountedPixItemTotal === null) return null;
 
@@ -307,7 +331,7 @@ const pixDiscountAmount = computed(() => {
   })) ?? 0;
 });
 
-const pixTotalAmount = computed(() => roundNullableMoney(sumCartItems(getPixItemTotal)));
+const pixTotalAmount = computed(() => roundNullableMoney(sumCartItems(getStandardPixItemTotal)));
 
 const primaryAddressLabel = computed(() => {
   if (addressLoading.value)  return t("schedule_cart.loading");
@@ -351,9 +375,9 @@ const formatPrice = (value) => {
   return Number(value ?? 0).toLocaleString("pt-BR", { minimumFractionDigits: 2, maximumFractionDigits: 2 });
 };
 
-const getCreditCardItemTotal = (item) => getTotalWithFee(item, platformFees.value.credit_card);
+const getCartDiscountItemTotal = (item) => getTotalWithFee(item, platformFees.value.cart_min_3_schedules);
 
-const getPixItemTotal = (item) => getTotalWithFee(item, effectivePixFee.value);
+const getCreditCardItemTotal = (item) => getTotalWithFee(item, platformFees.value.credit_card);
 
 const getProviderInitial = (item) => item.provider_name?.slice(0, 1).toUpperCase() ?? t("schedule_cart.provider_initial");