set/update/delete billing alert

This commit is contained in:
Čarodej
2021-12-17 10:44:50 +01:00
parent 04e46b7fcb
commit afb8323541
13 changed files with 307 additions and 96 deletions

View File

@@ -12,7 +12,7 @@
"/chunks/admin~chunks/files~chunks/my-shared-items~chunks/platform~chunks/recent-uploads~chunks/settin~97130d1f.js": "/chunks/admin~chunks/files~chunks/my-shared-items~chunks/platform~chunks/recent-uploads~chunks/settin~97130d1f.js?id=e2d818009a4e2c1fffdf",
"/chunks/admin~chunks/files~chunks/my-shared-items~chunks/platform~chunks/recent-uploads~chunks/shared~1bec6fe4.js": "/chunks/admin~chunks/files~chunks/my-shared-items~chunks/platform~chunks/recent-uploads~chunks/shared~1bec6fe4.js?id=510e6c1b1017a73a40a6",
"/chunks/admin~chunks/platform.js": "/chunks/admin~chunks/platform.js?id=917aab9de16d3eb7039a",
"/chunks/admin~chunks/platform~chunks/settings.js": "/chunks/admin~chunks/platform~chunks/settings.js?id=5655107fc94a22804c92",
"/chunks/admin~chunks/platform~chunks/settings.js": "/chunks/admin~chunks/platform~chunks/settings.js?id=817867c331fb3943f0ff",
"/chunks/admin~chunks/platform~chunks/settings~chunks/shared.js": "/chunks/admin~chunks/platform~chunks/settings~chunks/shared.js?id=8e89d2271b17b2d78177",
"/chunks/admin~chunks/platform~chunks/shared.js": "/chunks/admin~chunks/platform~chunks/shared.js?id=0d6c4be667e46ea1303e",
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=6035ca411b2c4239d964",
@@ -74,7 +74,7 @@
"/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=093cc2fd918ee6a340d3",
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=75172fe522988795ec59",
"/chunks/settings-storage~chunks/settings-subscription~chunks/user-storage~chunks/user-subscription.js": "/chunks/settings-storage~chunks/settings-subscription~chunks/user-storage~chunks/user-subscription.js?id=147afaac8c8bacfe6433",
"/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=241cee35aba1f607aa40",
"/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=fd11a9ee3772ed65553a",
"/chunks/settings~chunks/settings-password.js": "/chunks/settings~chunks/settings-password.js?id=c33cd2341b9b04a732e5",
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=651d5accf401908724c5",
"/chunks/shared.js": "/chunks/shared.js?id=6230d050545cd1bd9b87",
@@ -1271,5 +1271,90 @@
"/chunks/settings-subscription.12fa902b3a9391e8d538.hot-update.js": "/chunks/settings-subscription.12fa902b3a9391e8d538.hot-update.js",
"/chunks/settings-subscription.453191d7a9558d27b6be.hot-update.js": "/chunks/settings-subscription.453191d7a9558d27b6be.hot-update.js",
"/chunks/settings-subscription.e6a599a3de8030a1289e.hot-update.js": "/chunks/settings-subscription.e6a599a3de8030a1289e.hot-update.js",
"/chunks/settings-subscription.68f33a64d80e06da6b44.hot-update.js": "/chunks/settings-subscription.68f33a64d80e06da6b44.hot-update.js"
"/chunks/settings-subscription.68f33a64d80e06da6b44.hot-update.js": "/chunks/settings-subscription.68f33a64d80e06da6b44.hot-update.js",
"/chunks/settings-subscription.75d1e47080c718f5c11f.hot-update.js": "/chunks/settings-subscription.75d1e47080c718f5c11f.hot-update.js",
"/chunks/settings-subscription.b8d308a387c5d684b379.hot-update.js": "/chunks/settings-subscription.b8d308a387c5d684b379.hot-update.js",
"/chunks/settings-subscription.5330149512bc437f25f1.hot-update.js": "/chunks/settings-subscription.5330149512bc437f25f1.hot-update.js",
"/chunks/settings-subscription.00b21e7f04a33eb1c503.hot-update.js": "/chunks/settings-subscription.00b21e7f04a33eb1c503.hot-update.js",
"/chunks/settings-subscription.0b264871513fb1d73206.hot-update.js": "/chunks/settings-subscription.0b264871513fb1d73206.hot-update.js",
"/chunks/settings-subscription.bcf4533771c62d9fd16a.hot-update.js": "/chunks/settings-subscription.bcf4533771c62d9fd16a.hot-update.js",
"/chunks/settings-subscription.36037d1a7d0c90cd341a.hot-update.js": "/chunks/settings-subscription.36037d1a7d0c90cd341a.hot-update.js",
"/chunks/settings-subscription.31689e82aa4699d1c0dc.hot-update.js": "/chunks/settings-subscription.31689e82aa4699d1c0dc.hot-update.js",
"/chunks/settings-subscription.1bcfed1e451c646fe1fb.hot-update.js": "/chunks/settings-subscription.1bcfed1e451c646fe1fb.hot-update.js",
"/chunks/settings-subscription.f04bb668d8b2c3ef9264.hot-update.js": "/chunks/settings-subscription.f04bb668d8b2c3ef9264.hot-update.js",
"/chunks/settings-subscription.9ca1ce700ca5e7a1dbe9.hot-update.js": "/chunks/settings-subscription.9ca1ce700ca5e7a1dbe9.hot-update.js",
"/chunks/settings-subscription.526de4a1ce27fb4a2cce.hot-update.js": "/chunks/settings-subscription.526de4a1ce27fb4a2cce.hot-update.js",
"/chunks/settings-subscription.bc25afc8968f81320095.hot-update.js": "/chunks/settings-subscription.bc25afc8968f81320095.hot-update.js",
"/chunks/settings-subscription.e23fa4c520ab101f24d5.hot-update.js": "/chunks/settings-subscription.e23fa4c520ab101f24d5.hot-update.js",
"/chunks/settings-subscription.8a0f4255c7fa63385c62.hot-update.js": "/chunks/settings-subscription.8a0f4255c7fa63385c62.hot-update.js",
"/chunks/settings-subscription.bc70448b8297a4b4116b.hot-update.js": "/chunks/settings-subscription.bc70448b8297a4b4116b.hot-update.js",
"/chunks/settings-subscription.a16bc54fb1805267f9b7.hot-update.js": "/chunks/settings-subscription.a16bc54fb1805267f9b7.hot-update.js",
"/chunks/settings-subscription.e0e102c34647846495e4.hot-update.js": "/chunks/settings-subscription.e0e102c34647846495e4.hot-update.js",
"/chunks/settings-subscription.937aec696f674f7f7922.hot-update.js": "/chunks/settings-subscription.937aec696f674f7f7922.hot-update.js",
"/chunks/settings-subscription.0588d28ca27ede122376.hot-update.js": "/chunks/settings-subscription.0588d28ca27ede122376.hot-update.js",
"/chunks/settings-subscription.e609fececfe97e329ce3.hot-update.js": "/chunks/settings-subscription.e609fececfe97e329ce3.hot-update.js",
"/chunks/settings-subscription.b3738f9237cfc23e50ca.hot-update.js": "/chunks/settings-subscription.b3738f9237cfc23e50ca.hot-update.js",
"/chunks/settings-subscription.bfdf95e39b2f70f5f2df.hot-update.js": "/chunks/settings-subscription.bfdf95e39b2f70f5f2df.hot-update.js",
"/chunks/settings-subscription.0eb72c8eac9037e2be9d.hot-update.js": "/chunks/settings-subscription.0eb72c8eac9037e2be9d.hot-update.js",
"/chunks/settings-subscription.f2c87a95f59825b525a7.hot-update.js": "/chunks/settings-subscription.f2c87a95f59825b525a7.hot-update.js",
"/chunks/settings-subscription.9308d274ec11a27280ad.hot-update.js": "/chunks/settings-subscription.9308d274ec11a27280ad.hot-update.js",
"/chunks/settings-subscription.08977856a4f422f6a4dd.hot-update.js": "/chunks/settings-subscription.08977856a4f422f6a4dd.hot-update.js",
"/chunks/settings-subscription.26f5bebc944065de1631.hot-update.js": "/chunks/settings-subscription.26f5bebc944065de1631.hot-update.js",
"/chunks/settings-subscription.57c84cbf855b9dd5ed8d.hot-update.js": "/chunks/settings-subscription.57c84cbf855b9dd5ed8d.hot-update.js",
"/chunks/settings-subscription.65a2a21e5afd1be11e14.hot-update.js": "/chunks/settings-subscription.65a2a21e5afd1be11e14.hot-update.js",
"/chunks/settings-subscription.b7ea0663f32eeaa1e1da.hot-update.js": "/chunks/settings-subscription.b7ea0663f32eeaa1e1da.hot-update.js",
"/chunks/settings-subscription.04fe701e2ab3ba497d13.hot-update.js": "/chunks/settings-subscription.04fe701e2ab3ba497d13.hot-update.js",
"/chunks/settings-subscription.be7fea7ce548b624cf6e.hot-update.js": "/chunks/settings-subscription.be7fea7ce548b624cf6e.hot-update.js",
"/chunks/settings-subscription.d86a7827277949b83fb3.hot-update.js": "/chunks/settings-subscription.d86a7827277949b83fb3.hot-update.js",
"/chunks/settings-subscription.bdd71e8a4ee52be9583e.hot-update.js": "/chunks/settings-subscription.bdd71e8a4ee52be9583e.hot-update.js",
"/chunks/settings-subscription.91ee9cb9581de7f5f6bc.hot-update.js": "/chunks/settings-subscription.91ee9cb9581de7f5f6bc.hot-update.js",
"/chunks/settings-subscription.ce2d6cc25fe318378926.hot-update.js": "/chunks/settings-subscription.ce2d6cc25fe318378926.hot-update.js",
"/chunks/settings-subscription.56b35b4f2d6e1904b552.hot-update.js": "/chunks/settings-subscription.56b35b4f2d6e1904b552.hot-update.js",
"/chunks/settings-subscription.e666778354e6b7f10221.hot-update.js": "/chunks/settings-subscription.e666778354e6b7f10221.hot-update.js",
"/chunks/settings-subscription.92de11067ad098c7c53c.hot-update.js": "/chunks/settings-subscription.92de11067ad098c7c53c.hot-update.js",
"/chunks/settings-subscription.19ad060aaedfb6b52541.hot-update.js": "/chunks/settings-subscription.19ad060aaedfb6b52541.hot-update.js",
"/chunks/settings-subscription.85794170d03ac7cb857f.hot-update.js": "/chunks/settings-subscription.85794170d03ac7cb857f.hot-update.js",
"/chunks/settings-subscription.b33147b38d8e32864744.hot-update.js": "/chunks/settings-subscription.b33147b38d8e32864744.hot-update.js",
"/chunks/settings-subscription.2c9d8bef7ee36040e67b.hot-update.js": "/chunks/settings-subscription.2c9d8bef7ee36040e67b.hot-update.js",
"/chunks/settings-subscription.d8faf143343d44c62a9d.hot-update.js": "/chunks/settings-subscription.d8faf143343d44c62a9d.hot-update.js",
"/chunks/settings-subscription.c80e7c16565259ea32a2.hot-update.js": "/chunks/settings-subscription.c80e7c16565259ea32a2.hot-update.js",
"/chunks/settings-subscription.3c7ca1c5f81fed688424.hot-update.js": "/chunks/settings-subscription.3c7ca1c5f81fed688424.hot-update.js",
"/chunks/settings-subscription.6b71fb3a94dcf7f46deb.hot-update.js": "/chunks/settings-subscription.6b71fb3a94dcf7f46deb.hot-update.js",
"/chunks/settings-subscription.5630a0e0a74b7096cb09.hot-update.js": "/chunks/settings-subscription.5630a0e0a74b7096cb09.hot-update.js",
"/chunks/settings-subscription.75498149c5a4da2160a8.hot-update.js": "/chunks/settings-subscription.75498149c5a4da2160a8.hot-update.js",
"/chunks/settings-subscription.2f1f2d64be045ee587cd.hot-update.js": "/chunks/settings-subscription.2f1f2d64be045ee587cd.hot-update.js",
"/chunks/settings-subscription.681f4115cdac57b120f5.hot-update.js": "/chunks/settings-subscription.681f4115cdac57b120f5.hot-update.js",
"/chunks/settings-subscription.130506b845c195d4d520.hot-update.js": "/chunks/settings-subscription.130506b845c195d4d520.hot-update.js",
"/chunks/settings-subscription.782d0ccc8cebc7809afc.hot-update.js": "/chunks/settings-subscription.782d0ccc8cebc7809afc.hot-update.js",
"/chunks/settings-subscription.3d669e711f263ccfc7a4.hot-update.js": "/chunks/settings-subscription.3d669e711f263ccfc7a4.hot-update.js",
"/chunks/settings-subscription.b3c7741f44f4f74a6e41.hot-update.js": "/chunks/settings-subscription.b3c7741f44f4f74a6e41.hot-update.js",
"/chunks/settings-subscription.a0fc95fa1528fbc97791.hot-update.js": "/chunks/settings-subscription.a0fc95fa1528fbc97791.hot-update.js",
"/chunks/settings-subscription.585be0b4204dcb6fe705.hot-update.js": "/chunks/settings-subscription.585be0b4204dcb6fe705.hot-update.js",
"/chunks/settings-subscription.cb315c7e87ecb9e5a920.hot-update.js": "/chunks/settings-subscription.cb315c7e87ecb9e5a920.hot-update.js",
"/chunks/settings-subscription.13f3cc5f7f9a0e590d56.hot-update.js": "/chunks/settings-subscription.13f3cc5f7f9a0e590d56.hot-update.js",
"/chunks/settings-subscription.8251dc02b0e5ad28e2e4.hot-update.js": "/chunks/settings-subscription.8251dc02b0e5ad28e2e4.hot-update.js",
"/chunks/settings-subscription.e47b7a46419f395e6014.hot-update.js": "/chunks/settings-subscription.e47b7a46419f395e6014.hot-update.js",
"/chunks/settings-subscription.faef193bea5b50d4dcd3.hot-update.js": "/chunks/settings-subscription.faef193bea5b50d4dcd3.hot-update.js",
"/chunks/settings-subscription.263eccd01d040c7c8704.hot-update.js": "/chunks/settings-subscription.263eccd01d040c7c8704.hot-update.js",
"/chunks/settings-subscription.c99ccf05e2d85b113ea4.hot-update.js": "/chunks/settings-subscription.c99ccf05e2d85b113ea4.hot-update.js",
"/chunks/settings-subscription.a0ad7b85f68c380418d5.hot-update.js": "/chunks/settings-subscription.a0ad7b85f68c380418d5.hot-update.js",
"/chunks/settings-subscription.9997dafb8e0e3c90350a.hot-update.js": "/chunks/settings-subscription.9997dafb8e0e3c90350a.hot-update.js",
"/chunks/settings-subscription.7783bbede12858b51772.hot-update.js": "/chunks/settings-subscription.7783bbede12858b51772.hot-update.js",
"/chunks/settings-subscription.5adf26b765bf47a4e579.hot-update.js": "/chunks/settings-subscription.5adf26b765bf47a4e579.hot-update.js",
"/chunks/settings-subscription.91bec091789022def4b1.hot-update.js": "/chunks/settings-subscription.91bec091789022def4b1.hot-update.js",
"/chunks/admin~chunks/platform~chunks/settings.ca45f59c6f47080ae697.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.ca45f59c6f47080ae697.hot-update.js",
"/chunks/admin~chunks/platform~chunks/settings.2d5bc7fc7a22038d7a0f.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.2d5bc7fc7a22038d7a0f.hot-update.js",
"/chunks/admin~chunks/platform~chunks/settings.6ee7303a603cf90585be.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.6ee7303a603cf90585be.hot-update.js",
"/chunks/admin~chunks/platform~chunks/settings.e88b217c56eb6e9fa8e9.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.e88b217c56eb6e9fa8e9.hot-update.js",
"/chunks/admin~chunks/platform~chunks/settings.d1010f5c66ffa6a89ebd.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.d1010f5c66ffa6a89ebd.hot-update.js",
"/chunks/admin~chunks/platform~chunks/settings.90d4dd664ca94c330354.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.90d4dd664ca94c330354.hot-update.js",
"/chunks/admin~chunks/platform~chunks/settings.86ae1335131a857b88de.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.86ae1335131a857b88de.hot-update.js",
"/chunks/admin~chunks/platform~chunks/settings.ef238483ee79c489fc11.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.ef238483ee79c489fc11.hot-update.js",
"/chunks/admin~chunks/platform~chunks/settings.9cd1c24a1a398d94f39c.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.9cd1c24a1a398d94f39c.hot-update.js",
"/chunks/admin~chunks/platform~chunks/settings.623b40c905073bdaff8d.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.623b40c905073bdaff8d.hot-update.js",
"/chunks/settings-subscription.e5d448cdc7aa0a879e7a.hot-update.js": "/chunks/settings-subscription.e5d448cdc7aa0a879e7a.hot-update.js",
"/chunks/settings-subscription.e93de9577924975edf28.hot-update.js": "/chunks/settings-subscription.e93de9577924975edf28.hot-update.js",
"/chunks/settings-subscription.c70268db92d00d51c9f9.hot-update.js": "/chunks/settings-subscription.c70268db92d00d51c9f9.hot-update.js",
"/chunks/settings-subscription.0b734f00ac49be587eb8.hot-update.js": "/chunks/settings-subscription.0b734f00ac49be587eb8.hot-update.js",
"/chunks/admin~chunks/platform~chunks/settings.5ad45c25769df1bf44e6.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.5ad45c25769df1bf44e6.hot-update.js"
}

View File

@@ -5,7 +5,7 @@
</div>
<PopupContent class="content">
<h1 v-if="title" class="title">{{ title }}</h1>
<h1 v-if="title" class="text-2xl font-bold max-w-sm mx-auto">{{ title }}</h1>
<p v-if="message" class="message">{{ message }}</p>
</PopupContent>
@@ -72,7 +72,7 @@
this.message = args.message
this.emoji = '🤔'
this.confirmationData = args.action
this.buttonColor = 'danger-solid'
this.buttonColor = 'danger'
if (args.buttonColor) {
this.buttonColor = args.buttonColor
@@ -103,13 +103,6 @@
padding-left: 20px;
padding-right: 20px;
.title {
@include font-size(22);
text-transform: uppercase;
font-weight: 800;
color: $text;
}
.message {
@include font-size(16);
color: #333;

View File

@@ -76,19 +76,51 @@
{{ $t('Billing Alert') }}
</FormLabel>
<ValidationObserver ref="changeStorageCapacity" @submit.prevent="makePayment" v-slot="{ invalid }" tag="form" class="mt-6">
<ValidationProvider tag="div" v-slot="{ errors }" mode="passive" name="Capacity" rules="required">
<div v-if="user.data.relationships.alert">
<b class="text-3xl font-extrabold -mt-3 block mb-0.5 flex items-center">
{{ user.data.relationships.alert.data.attributes.formatted }}
<edit2-icon v-if="! showUpdateBillingAlertForm" @click="showUpdateBillingAlertForm = ! showUpdateBillingAlertForm" size="12" class="vue-feather cursor-pointer ml-2 transform -translate-y-0.5" />
<trash2-icon v-if="showUpdateBillingAlertForm" @click="deleteBillingAlert" size="12" class="vue-feather cursor-pointer ml-2 transform -translate-y-0.5" />
</b>
<b class="block text-sm text-gray-400">
{{ $t('Alert will be triggered after you reach the value above.') }}
</b>
</div>
<ValidationObserver v-if="showUpdateBillingAlertForm" ref="updatebillingAlertForm" @submit.prevent="updateBillingAlert" v-slot="{ invalid }" tag="form" class="mt-6">
<ValidationProvider tag="div" v-slot="{ errors }" mode="passive" name="Billing Alert" rules="required">
<AppInputText :description="$t('You will receive an email whenever your monthly balance reaches the specified amount above.')" :error="errors[0]" :is-last="true">
<div class="flex space-x-4">
<input v-model="paymentAmount"
<input v-model="billingAlertAmount"
:placeholder="$t('Alert Amount...')"
type="number"
min="1"
max="999999999"
class="focus-border-theme input-dark"
:class="{'is-error': errors[0]}"
:class="{'border-red-700': errors[0]}"
/>
<ButtonBase type="submit" button-style="theme" class="submit-button">
<ButtonBase :loadint="isSendingBillingAlert" :disabled="isSendingBillingAlert" type="submit" button-style="theme" class="submit-button">
{{ $t('Update Alert') }}
</ButtonBase>
</div>
</AppInputText>
</ValidationProvider>
</ValidationObserver>
<ValidationObserver v-if="! user.data.relationships.alert" ref="billingAlertForm" @submit.prevent="setBillingAlert" v-slot="{ invalid }" tag="form" class="mt-6">
<ValidationProvider tag="div" v-slot="{ errors }" mode="passive" name="Billing Alert" rules="required">
<AppInputText :description="$t('You will receive an email whenever your monthly balance reaches the specified amount above.')" :error="errors[0]" :is-last="true">
<div class="flex space-x-4">
<input v-model="billingAlertAmount"
:placeholder="$t('Alert Amount...')"
type="number"
min="1"
max="999999999"
class="focus-border-theme input-dark"
:class="{'border-red-700': errors[0]}"
/>
<ButtonBase :loadint="isSendingBillingAlert" :disabled="isSendingBillingAlert" type="submit" button-style="theme" class="submit-button">
{{ $t('Set Alert') }}
</ButtonBase>
</div>
@@ -149,10 +181,15 @@
</template>
<script>
import {
XIcon,
Trash2Icon,
Edit2Icon,
} from "vue-feather-icons";
import ColorLabel from "../../components/Others/ColorLabel";
import DatatableWrapper from "../../components/Others/Tables/DatatableWrapper";
import AppInputText from "../../components/Admin/AppInputText";
import {ValidationProvider, ValidationObserver} from 'vee-validate/dist/vee-validate.full'
import {ValidationProvider, ValidationObserver} from 'vee-validate/dist/vee-validate.full'
import ButtonBase from '/resources/js/components/FilesView/ButtonBase'
import PageTab from '/resources/js/components/Others/Layout/PageTab'
import InfoBox from '/resources/js/components/Others/Forms/InfoBox'
@@ -161,6 +198,7 @@
import ProgressLine from "../../components/Admin/ProgressLine"
import {mapGetters} from 'vuex'
import axios from 'axios'
import {events} from "../../bus";
export default {
name: 'MeteredSubscription',
@@ -173,6 +211,9 @@
ProgressLine,
ButtonBase,
ColorLabel,
Trash2Icon,
Edit2Icon,
XIcon,
FormLabel,
InfoBox,
PageTab,
@@ -185,6 +226,11 @@
data() {
return {
isLoading: false,
isSendingBillingAlert: false,
billingAlertAmount: undefined,
showUpdateBillingAlertForm: false,
paymentAmount: undefined,
columns: [
{
@@ -216,12 +262,102 @@
}
},
methods: {
async updateBillingAlert() {
// Validate fields
const isValid = await this.$refs.updatebillingAlertForm.validate();
if (!isValid) return;
this.isSendingBillingAlert = true
axios
.patch(`/api/subscriptions/billing-alerts/${this.user.data.relationships.alert.data.id}`, {
amount: this.billingAlertAmount
})
.then(() => {
this.$store.dispatch('getAppData')
this.showUpdateBillingAlertForm = false
events.$emit('toaster', {
type: 'success',
message: this.$t('Your billing alert was updated successfully'),
})
})
.catch(() => {
events.$emit('toaster', {
type: 'success',
message: this.$t('popup_error.title'),
})
})
.finally(() => {
this.isSendingBillingAlert = false
})
},
async setBillingAlert() {
// Validate fields
const isValid = await this.$refs.billingAlertForm.validate();
if (!isValid) return;
this.isSendingBillingAlert = true
axios
.post('/api/subscriptions/billing-alerts', {
amount: this.billingAlertAmount
})
.then(() => {
this.$store.dispatch('getAppData')
events.$emit('toaster', {
type: 'success',
message: this.$t('Your billing alert was set successfully'),
})
})
.catch(() => {
events.$emit('toaster', {
type: 'success',
message: this.$t('popup_error.title'),
})
})
.finally(() => {
this.isSendingBillingAlert = false
})
},
deleteBillingAlert() {
events.$emit('confirm:open', {
title: this.$t('Are you sure you want to delete your alert?'),
message: this.$t('You will no longer receive any notifications that your billing limit has been exceeded.'),
action: {
id: this.user.data.relationships.alert.data.id,
operation: 'delete-billing-alert',
}
})
},
makePayment() {
// TODO: make a payment
}
},
},
created() {
events.$on('action:confirmed', data => {
if (data.operation === 'delete-billing-alert')
axios.delete(`/api/subscriptions/billing-alerts/${this.user.data.relationships.alert.data.id}`)
.then(() => {
this.$store.dispatch('getAppData')
this.showUpdateBillingAlertForm = false
this.billingAlertAmount = undefined
events.$emit('toaster', {
type: 'success',
message: this.$t('Your billing alert was deleted.'),
})
})
.catch(() => this.$isSomethingWrong())
})
}
}
</script>

View File

@@ -1093,14 +1093,14 @@ class SetupDevEnvironment extends Command
$user
->each(
fn ($user) => DB::table('traffic')
->insert([
'id' => Str::uuid(),
'user_id' => $user->id,
'upload' => random_int(1111111, 9999999),
'download' => random_int(11111111, 99999999),
'created_at' => now()->subDays($day),
'updated_at' => now()->subDays($day),
])
->insert([
'id' => Str::uuid(),
'user_id' => $user->id,
'upload' => random_int(1111111, 9999999),
'download' => random_int(11111111, 99999999),
'created_at' => now()->subDays($day),
'updated_at' => now()->subDays($day),
])
);
}
}

View File

@@ -4,11 +4,11 @@ namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use App\Console\Commands\SetupDevEnvironment;
use App\Console\Commands\SetupProdEnvironment;
use Support\Scheduler\Actions\ReportUsageAction;
use Support\Scheduler\Actions\DeleteFailedFilesAction;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Support\Scheduler\Actions\DeleteUnverifiedUsersAction;
use Support\Scheduler\Actions\DeleteExpiredShareLinksAction;
use Support\Scheduler\Actions\ReportUsageAction;
class Kernel extends ConsoleKernel
{

View File

@@ -1,5 +1,4 @@
<?php
namespace App\Users\Actions;
use ByteUnits\Metric;
@@ -10,11 +9,10 @@ class FormatUsageEstimatesAction
public function __invoke(string $currency, Collection $usage)
{
return $usage->map(function ($estimate) use ($currency) {
// Format usage
$usage = match ($estimate['feature']) {
'bandwidth' => Metric::megabytes($estimate['usage'])->format(),
'storage' => Metric::megabytes($estimate['usage'])->format(),
'storage' => Metric::megabytes($estimate['usage'])->format(),
};
// Normalize units
@@ -28,4 +26,4 @@ class FormatUsageEstimatesAction
];
});
}
}
}

View File

@@ -1,13 +1,13 @@
<?php
namespace App\Users\Resources;
use App\Users\Actions\FormatUsageEstimatesAction;
use Domain\Folders\Resources\FolderCollection;
use VueFileManager\Subscription\Domain\Usage\Actions\SumUsageForCurrentPeriodAction;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Users\Actions\FormatUsageEstimatesAction;
use VueFileManager\Subscription\Domain\Credits\Resources\BalanceResource;
use VueFileManager\Subscription\Domain\BillingAlerts\Resources\BillingAlertResource;
use VueFileManager\Subscription\Domain\Subscriptions\Resources\SubscriptionResource;
use VueFileManager\Subscription\Domain\Usage\Actions\SumUsageForCurrentPeriodAction;
class UserResource extends JsonResource
{
@@ -41,18 +41,21 @@ class UserResource extends JsonResource
'relationships' => [
'settings' => new SettingsResource($this->settings),
'favourites' => new FolderCollection($this->favouriteFolders),
$this->mergeWhen($this->hasSubscription(), fn() => [
$this->mergeWhen($this->hasSubscription(), fn () => [
'subscription' => new SubscriptionResource($this->subscription),
]),
$this->mergeWhen($isMeteredSubscription, fn() => [
$this->mergeWhen($isMeteredSubscription, fn () => [
'balance' => new BalanceResource($this->balance),
]),
$this->mergeWhen($isMeteredSubscription, fn () => [
'alert' => new BillingAlertResource($this->billingAlert),
]),
],
'meta' => [
$this->mergeWhen($isFixedSubscription, fn() => [
$this->mergeWhen($isFixedSubscription, fn () => [
'limitations' => $this->limitations->summary(),
]),
$this->mergeWhen($isMeteredSubscription, fn() => [
$this->mergeWhen($isMeteredSubscription, fn () => [
'usages' => $this->getUsageEstimates(),
]),
],

View File

@@ -1,8 +1,8 @@
<?php
namespace Domain\Traffic\Models;
use Database\Factories\TrafficFactory;
use Illuminate\Support\Str;
use Database\Factories\TrafficFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;

View File

@@ -1,5 +1,4 @@
<?php
namespace Support\Scheduler\Actions;
use DB;
@@ -12,7 +11,7 @@ class ReportUsageAction
Subscription::whereIn('type', ['pre-paid', 'auto-renew'])
->where('status', 'active')
->cursor()
->each(function($subscription) {
->each(function ($subscription) {
$this->recordBandwidth($subscription);
$this->recordStorageCapacity($subscription);
});
@@ -46,4 +45,4 @@ class ReportUsageAction
// Record storage capacity usage
$subscription->recordUsage('bandwidth', $amount);
}
}
}

View File

@@ -1,10 +1,9 @@
<?php
namespace Tests\App\Users;
use App\Users\Actions\FormatUsageEstimatesAction;
use Tests\TestCase;
use App\Users\Models\User;
use App\Users\Actions\FormatUsageEstimatesAction;
use VueFileManager\Subscription\Domain\Plans\Models\Plan;
use VueFileManager\Subscription\Domain\Plans\Models\PlanFixedFeature;
use VueFileManager\Subscription\Support\Events\SubscriptionWasCreated;
@@ -20,17 +19,17 @@ class UserSubscriptionTest extends TestCase
{
$plan = Plan::factory()
->has(PlanFixedFeature::factory()
->count(2)
->sequence(
[
'key' => 'max_storage_amount',
'value' => 200,
],
[
'key' => 'max_team_members',
'value' => 20,
],
), 'fixedFeatures')
->count(2)
->sequence(
[
'key' => 'max_storage_amount',
'value' => 200,
],
[
'key' => 'max_team_members',
'value' => 20,
],
), 'fixedFeatures')
->create();
$user = User::factory()
@@ -54,17 +53,17 @@ class UserSubscriptionTest extends TestCase
{
$plan = Plan::factory()
->has(PlanFixedFeature::factory()
->count(2)
->sequence(
[
'key' => 'max_storage_amount',
'value' => 200,
],
[
'key' => 'max_team_members',
'value' => 20,
],
), 'fixedFeatures')
->count(2)
->sequence(
[
'key' => 'max_storage_amount',
'value' => 200,
],
[
'key' => 'max_team_members',
'value' => 20,
],
), 'fixedFeatures')
->create();
$user = User::factory()
@@ -111,13 +110,13 @@ class UserSubscriptionTest extends TestCase
$usages = collect([
[
'feature' => 'bandwidth',
"amount" => 7546.96,
"usage" => 26024,
'amount' => 7546.96,
'usage' => 26024,
], [
"feature" => "storage",
"amount" => 476.28,
"usage" => 3969,
]
'feature' => 'storage',
'amount' => 476.28,
'usage' => 3969,
],
]);
// Format usage estimates
@@ -126,16 +125,16 @@ class UserSubscriptionTest extends TestCase
$expected = [
[
"feature" => "bandwidth",
"amount" => 7.54696,
"cost" => "$7.55",
"usage" => "26.02GB",
'feature' => 'bandwidth',
'amount' => 7.54696,
'cost' => '$7.55',
'usage' => '26.02GB',
], [
"feature" => "storage",
"amount" => 0.47628,
"cost" => "$0.48",
"usage" => "3.97GB",
]
'feature' => 'storage',
'amount' => 0.47628,
'cost' => '$0.48',
'usage' => '3.97GB',
],
];
$this->assertEquals($expected, $estimates);

View File

@@ -30,10 +30,10 @@ class TeamLimitsTest extends TestCase
$members->each(
fn ($member) => TeamFolderMember::factory()
->create([
'parent_id' => $user->folders[0]->id,
'user_id' => $member->id,
])
->create([
'parent_id' => $user->folders[0]->id,
'user_id' => $member->id,
])
);
// Try invite new member

View File

@@ -1,9 +1,6 @@
<?php
namespace Tests\Domain\Traffic;
use Domain\Traffic\Models\Traffic;
use Illuminate\Database\Eloquent\Model;
use Storage;
use Tests\TestCase;
use App\Users\Models\User;
@@ -12,6 +9,8 @@ use Domain\Files\Models\File;
use Domain\Sharing\Models\Share;
use Domain\Folders\Models\Folder;
use Illuminate\Http\UploadedFile;
use Domain\Traffic\Models\Traffic;
use Illuminate\Database\Eloquent\Model;
class TrafficTest extends TestCase
{

View File

@@ -1,19 +1,18 @@
<?php
namespace Tests\Support\Scheduler;
use Domain\Files\Models\File;
use Domain\Traffic\Models\Traffic;
use Storage;
use Support\Scheduler\Actions\ReportUsageAction;
use Tests\TestCase;
use App\Users\Models\User;
use Domain\Files\Models\File;
use Domain\Sharing\Models\Share;
use Illuminate\Http\UploadedFile;
use Domain\Traffic\Models\Traffic;
use Support\Scheduler\Actions\ReportUsageAction;
use Support\Scheduler\Actions\DeleteFailedFilesAction;
use VueFileManager\Subscription\Domain\Plans\Models\Plan;
use Support\Scheduler\Actions\DeleteUnverifiedUsersAction;
use Support\Scheduler\Actions\DeleteExpiredShareLinksAction;
use VueFileManager\Subscription\Domain\Plans\Models\Plan;
use VueFileManager\Subscription\Domain\Plans\Models\PlanMeteredFeature;
use VueFileManager\Subscription\Domain\Subscriptions\Models\Subscription;
@@ -58,8 +57,8 @@ class SchedulerTest extends TestCase
Traffic::factory()
->create([
'user_id' => $user->id,
'download' => 155000000,
'user_id' => $user->id,
'download' => 155000000,
'created_at' => now()->subDay(),
]);