fix conflicts
@ -79,7 +79,7 @@ class ItemsController extends Controller
|
|||||||
foreach ($request->taxes as $tax) {
|
foreach ($request->taxes as $tax) {
|
||||||
$item->taxes()->updateOrCreate(
|
$item->taxes()->updateOrCreate(
|
||||||
['tax_type_id' => $tax['tax_type_id']],
|
['tax_type_id' => $tax['tax_type_id']],
|
||||||
['amount' => $tax['amount'], 'percent' => $tax['percent'], 'percent' => $tax['name']]
|
['amount' => $tax['amount'], 'percent' => $tax['percent'], 'name' => $tax['name']]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,10 +15,10 @@ class UsersTableSeeder extends Seeder
|
|||||||
public function run()
|
public function run()
|
||||||
{
|
{
|
||||||
User::create([
|
User::create([
|
||||||
'email' => 'admin@crater.in',
|
'email' => 'admin@craterapp.com',
|
||||||
'name' => 'Jane Doe',
|
'name' => 'Jane Doe',
|
||||||
'role' => 'admin',
|
'role' => 'admin',
|
||||||
'password' => Hash::make('admin@123')
|
'password' => Hash::make('crater@123')
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Setting::setSetting('profile_complete', 0);
|
Setting::setSetting('profile_complete', 0);
|
||||||
|
|||||||
@ -1 +1,17 @@
|
|||||||
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="check-circle" class="svg-inline--fa fa-check-circle fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#55547A" d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z"></path></svg>
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
focusable="false"
|
||||||
|
data-prefix="fas"
|
||||||
|
data-icon="check-circle"
|
||||||
|
class="svg-inline--fa fa-check-circle fa-w-16"
|
||||||
|
role="img"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 512 512">
|
||||||
|
<path
|
||||||
|
fill="#55547A"
|
||||||
|
d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z">
|
||||||
|
</path>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 595 B After Width: | Height: | Size: 658 B |
13
public/assets/icon/envelope-solid.svg
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
focusable="false"
|
||||||
|
data-prefix="fas"
|
||||||
|
data-icon="envelope"
|
||||||
|
class="svg-inline--fa fa-envelope fa-w-16"
|
||||||
|
role="img" xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 512 512">
|
||||||
|
<path
|
||||||
|
fill="#55547A"
|
||||||
|
d="M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z">
|
||||||
|
</path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 751 B |
@ -1 +1,14 @@
|
|||||||
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="paper-plane" class="svg-inline--fa fa-paper-plane fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#55547A" d="M476 3.2L12.5 270.6c-18.1 10.4-15.8 35.6 2.2 43.2L121 358.4l287.3-253.2c5.5-4.9 13.3 2.6 8.6 8.3L176 407v80.5c0 23.6 28.5 32.9 42.5 15.8L282 426l124.6 52.2c14.2 6 30.4-2.9 33-18.2l72-432C515 7.8 493.3-6.8 476 3.2z"></path></svg>
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
focusable="false"
|
||||||
|
data-prefix="fas"
|
||||||
|
data-icon="paper-plane"
|
||||||
|
class="svg-inline--fa fa-paper-plane fa-w-16"
|
||||||
|
role="img"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 512 512">
|
||||||
|
<path
|
||||||
|
fill="#55547A"
|
||||||
|
d="M476 3.2L12.5 270.6c-18.1 10.4-15.8 35.6 2.2 43.2L121 358.4l287.3-253.2c5.5-4.9 13.3 2.6 8.6 8.3L176 407v80.5c0 23.6 28.5 32.9 42.5 15.8L282 426l124.6 52.2c14.2 6 30.4-2.9 33-18.2l72-432C515 7.8 493.3-6.8 476 3.2z">
|
||||||
|
</path>
|
||||||
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 450 B After Width: | Height: | Size: 510 B |
14
public/assets/icon/times-circle-solid.svg
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
focusable="false"
|
||||||
|
data-prefix="fas"
|
||||||
|
data-icon="times-circle"
|
||||||
|
class="svg-inline--fa fa-times-circle fa-w-16"
|
||||||
|
role="img"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 512 512">
|
||||||
|
<path
|
||||||
|
fill="#55547A"
|
||||||
|
d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm121.6 313.1c4.7 4.7 4.7 12.3 0 17L338 377.6c-4.7 4.7-12.3 4.7-17 0L256 312l-65.1 65.6c-4.7 4.7-12.3 4.7-17 0L134.4 338c-4.7-4.7-4.7-12.3 0-17l65.6-65-65.6-65.1c-4.7-4.7-4.7-12.3 0-17l39.6-39.6c4.7-4.7 12.3-4.7 17 0l65 65.7 65.1-65.6c4.7-4.7 12.3-4.7 17 0l39.6 39.6c4.7 4.7 4.7 12.3 0 17L312 256l65.6 65.1z">
|
||||||
|
</path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 674 B |
14
public/assets/icon/trash-solid.svg
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
focusable="false"
|
||||||
|
data-prefix="fas"
|
||||||
|
data-icon="trash"
|
||||||
|
class="svg-inline--fa fa-trash fa-w-14"
|
||||||
|
role="img"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 448 512">
|
||||||
|
<path
|
||||||
|
fill="#55547A"
|
||||||
|
d="M432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zM53.2 467a48 48 0 0 0 47.9 45h245.8a48 48 0 0 0 47.9-45L416 128H32z">
|
||||||
|
</path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 519 B |
@ -35,6 +35,8 @@
|
|||||||
<div v-if="$v.formData.price.$error">
|
<div v-if="$v.formData.price.$error">
|
||||||
<span v-if="!$v.formData.price.required" class="text-danger">{{ $tc('validation.required') }}</span>
|
<span v-if="!$v.formData.price.required" class="text-danger">{{ $tc('validation.required') }}</span>
|
||||||
<span v-if="!$v.formData.price.numeric" class="text-danger">{{ $tc('validation.numbers_only') }}</span>
|
<span v-if="!$v.formData.price.numeric" class="text-danger">{{ $tc('validation.numbers_only') }}</span>
|
||||||
|
<span v-if="!$v.formData.price.maxLength" class="text-danger">{{ $t('validation.price_maxlength') }}</span>
|
||||||
|
<span v-if="!$v.formData.price.minValue" class="text-danger">{{ $t('validation.price_minvalue') }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -138,7 +140,8 @@ export default {
|
|||||||
price: {
|
price: {
|
||||||
required,
|
required,
|
||||||
numeric,
|
numeric,
|
||||||
minValue: minValue(0.1)
|
minValue: minValue(0.1),
|
||||||
|
maxLength: maxLength(10)
|
||||||
},
|
},
|
||||||
description: {
|
description: {
|
||||||
maxLength: maxLength(255)
|
maxLength: maxLength(255)
|
||||||
|
|||||||
@ -9,6 +9,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import Chart from 'chart.js'
|
import Chart from 'chart.js'
|
||||||
import Utils from '../../helpers/utilities'
|
import Utils from '../../helpers/utilities'
|
||||||
|
import { mapGetters } from 'vuex'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
props: {
|
props: {
|
||||||
@ -46,9 +47,20 @@ export default {
|
|||||||
type: Function,
|
type: Function,
|
||||||
require: false,
|
require: false,
|
||||||
default: Function
|
default: Function
|
||||||
|
},
|
||||||
|
FormatGraphMoney: {
|
||||||
|
type: Function,
|
||||||
|
require: false,
|
||||||
|
default: Function
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
...mapGetters('currency', [
|
||||||
|
'defaultCurrency'
|
||||||
|
])
|
||||||
|
},
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
labels (val) {
|
labels (val) {
|
||||||
this.update()
|
this.update()
|
||||||
@ -56,6 +68,7 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
mounted () {
|
mounted () {
|
||||||
|
let self = this
|
||||||
let context = this.$refs.graph.getContext('2d')
|
let context = this.$refs.graph.getContext('2d')
|
||||||
let options = {
|
let options = {
|
||||||
responsive: true,
|
responsive: true,
|
||||||
@ -64,7 +77,7 @@ export default {
|
|||||||
enabled: true,
|
enabled: true,
|
||||||
callbacks: {
|
callbacks: {
|
||||||
label: function (tooltipItem, data) {
|
label: function (tooltipItem, data) {
|
||||||
return Utils.formatGraphMoney(tooltipItem.value)
|
return self.FormatGraphMoney(tooltipItem.value, self.defaultCurrency)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -228,6 +228,10 @@ export default {
|
|||||||
save_estimate: 'Save Estimate',
|
save_estimate: 'Save Estimate',
|
||||||
confirm_conversion: 'You want to convert this Estimate into Invoice?',
|
confirm_conversion: 'You want to convert this Estimate into Invoice?',
|
||||||
conversion_message: 'Conversion successful',
|
conversion_message: 'Conversion successful',
|
||||||
|
confirm_send_estimate: 'This estimate will be sent via email to the customer',
|
||||||
|
confirm_mark_as_sent: 'This estimate will be marked as sent',
|
||||||
|
confirm_mark_as_accepted: 'This estimate will be marked as Accepted',
|
||||||
|
confirm_mark_as_rejected: 'This estimate will be marked as Rejected',
|
||||||
no_matching_estimates: 'There are no matching estimates!',
|
no_matching_estimates: 'There are no matching estimates!',
|
||||||
errors: {
|
errors: {
|
||||||
required: 'Field is required'
|
required: 'Field is required'
|
||||||
@ -551,6 +555,16 @@ export default {
|
|||||||
action: 'Action',
|
action: 'Action',
|
||||||
add_currency: 'Add Currency'
|
add_currency: 'Add Currency'
|
||||||
},
|
},
|
||||||
|
mail: {
|
||||||
|
host: 'Mail Host',
|
||||||
|
port: 'Mail Port',
|
||||||
|
driver: 'Mail Driver',
|
||||||
|
password: 'Mail Password',
|
||||||
|
username: 'Mail Username',
|
||||||
|
mail_config: 'Mail Configuration',
|
||||||
|
encryption: 'Mail Encryption',
|
||||||
|
mail_config_desc: 'Below details will be used to update the mail environment. Also you can change the details anytime after logging in.'
|
||||||
|
},
|
||||||
pdf: {
|
pdf: {
|
||||||
title: 'PDF Setting',
|
title: 'PDF Setting',
|
||||||
footer_text: 'Footer Text',
|
footer_text: 'Footer Text',
|
||||||
@ -616,6 +630,7 @@ export default {
|
|||||||
created_message: 'Sales tax created successfully',
|
created_message: 'Sales tax created successfully',
|
||||||
updated_message: 'Sales tax updated successfully',
|
updated_message: 'Sales tax updated successfully',
|
||||||
deleted_message: 'Sales tax deleted successfully',
|
deleted_message: 'Sales tax deleted successfully',
|
||||||
|
confirm_delete: 'You will not be able to recover this Tax Type',
|
||||||
already_in_use: 'Tax is already in use'
|
already_in_use: 'Tax is already in use'
|
||||||
},
|
},
|
||||||
expense_category: {
|
expense_category: {
|
||||||
@ -628,6 +643,7 @@ export default {
|
|||||||
created_message: 'Category created successfully',
|
created_message: 'Category created successfully',
|
||||||
deleted_message: 'Expense category deleted successfully',
|
deleted_message: 'Expense category deleted successfully',
|
||||||
updated_message: 'Expense category updated successfully',
|
updated_message: 'Expense category updated successfully',
|
||||||
|
confirm_delete: 'You will not be able to recover this Expense Category',
|
||||||
already_in_use: 'Category is already in use'
|
already_in_use: 'Category is already in use'
|
||||||
},
|
},
|
||||||
preferences: {
|
preferences: {
|
||||||
@ -682,6 +698,7 @@ export default {
|
|||||||
username: 'Username',
|
username: 'Username',
|
||||||
next: 'Next',
|
next: 'Next',
|
||||||
continue: 'Continue',
|
continue: 'Continue',
|
||||||
|
skip: 'Skip',
|
||||||
database: {
|
database: {
|
||||||
database: 'Site URL & Database',
|
database: 'Site URL & Database',
|
||||||
connection: 'Database Connection',
|
connection: 'Database Connection',
|
||||||
@ -752,7 +769,9 @@ export default {
|
|||||||
payment_greater_than_due_amount: 'Entered Payment is more than due amount of this invoice.',
|
payment_greater_than_due_amount: 'Entered Payment is more than due amount of this invoice.',
|
||||||
quantity_maxlength: 'Quantity should not be greater than 10 digits.',
|
quantity_maxlength: 'Quantity should not be greater than 10 digits.',
|
||||||
price_maxlength: 'Price should not be greater than 10 digits.',
|
price_maxlength: 'Price should not be greater than 10 digits.',
|
||||||
|
price_minvalue: 'Price should be greater than 0 digits',
|
||||||
amount_maxlength: 'Amount should not be greater than 10 digits.',
|
amount_maxlength: 'Amount should not be greater than 10 digits.',
|
||||||
|
amount_minvalue: 'Amount should be greater than 0 digits',
|
||||||
description_maxlength: 'Description should not be greater than 255 characters.',
|
description_maxlength: 'Description should not be greater than 255 characters.',
|
||||||
maximum_options_error: 'Maximum of {max} options selected. First remove a selected option to select another.',
|
maximum_options_error: 'Maximum of {max} options selected. First remove a selected option to select another.',
|
||||||
notes_maxlength: 'Notes should not be greater than 255 characters.',
|
notes_maxlength: 'Notes should not be greater than 255 characters.',
|
||||||
|
|||||||
@ -224,15 +224,19 @@ export default {
|
|||||||
action: 'Acción',
|
action: 'Acción',
|
||||||
notes: 'Notas',
|
notes: 'Notas',
|
||||||
tax: 'Impuesto',
|
tax: 'Impuesto',
|
||||||
|
send_estimate: 'Enviar presupuesto',
|
||||||
estimate_template: 'Plantilla de estimación',
|
estimate_template: 'Plantilla de estimación',
|
||||||
convert_to_invoice: 'Convertir a factura',
|
convert_to_invoice: 'Convertir a factura',
|
||||||
mark_as_sent: 'Marcar como enviado',
|
mark_as_sent: 'Marcar como enviado',
|
||||||
send_estimate: 'Enviar presupuesto',
|
|
||||||
record_payment: 'Registro de pago',
|
record_payment: 'Registro de pago',
|
||||||
add_estimate: 'Agregar presupuesto',
|
add_estimate: 'Agregar presupuesto',
|
||||||
save_estimate: 'Guardar estimación',
|
save_estimate: 'Guardar estimación',
|
||||||
confirm_conversion: '¿Quiere convertir esta estimación en factura?',
|
confirm_conversion: '¿Quiere convertir esta estimación en factura?',
|
||||||
conversion_message: 'Conversión exitosa',
|
conversion_message: 'Conversión exitosa',
|
||||||
|
confirm_send_estimate: 'Esta estimación se enviará por correo electrónico al cliente',
|
||||||
|
confirm_mark_as_sent: 'Esta estimación se marcará como enviada',
|
||||||
|
confirm_mark_as_accepted: 'Esta estimación se marcará como Aceptada',
|
||||||
|
confirm_mark_as_rejected: 'Esta estimación se marcará como Rechazada',
|
||||||
errors: {
|
errors: {
|
||||||
required: 'Se requiere campo'
|
required: 'Se requiere campo'
|
||||||
},
|
},
|
||||||
@ -550,7 +554,7 @@ export default {
|
|||||||
right: 'Derecho',
|
right: 'Derecho',
|
||||||
left: 'Izquierda',
|
left: 'Izquierda',
|
||||||
action: 'Acción',
|
action: 'Acción',
|
||||||
add_currency: 'Agregar moneda',
|
add_currency: 'Agregar moneda'
|
||||||
},
|
},
|
||||||
pdf: {
|
pdf: {
|
||||||
title: 'Configuración de PDF',
|
title: 'Configuración de PDF',
|
||||||
@ -597,8 +601,6 @@ export default {
|
|||||||
estimate_viewed_desc: 'Cuando su cliente ve la estimación enviada a través del panel de control del cráter.',
|
estimate_viewed_desc: 'Cuando su cliente ve la estimación enviada a través del panel de control del cráter.',
|
||||||
save: 'Salvar',
|
save: 'Salvar',
|
||||||
email_save_message: 'Correo electrónico guardado con éxito',
|
email_save_message: 'Correo electrónico guardado con éxito',
|
||||||
invoice_viewed_message: 'Factura vista',
|
|
||||||
estimate_viewed_message: 'Estimación vista',
|
|
||||||
please_enter_email: 'Por favor, introduzca su correo electrónico'
|
please_enter_email: 'Por favor, introduzca su correo electrónico'
|
||||||
},
|
},
|
||||||
tax_types: {
|
tax_types: {
|
||||||
@ -616,6 +618,7 @@ export default {
|
|||||||
created_message: 'Impuesto sobre las ventas creado con éxito',
|
created_message: 'Impuesto sobre las ventas creado con éxito',
|
||||||
updated_message: 'Impuesto sobre ventas actualizado con éxito',
|
updated_message: 'Impuesto sobre ventas actualizado con éxito',
|
||||||
deleted_message: 'Impuesto sobre las ventas eliminado con éxito',
|
deleted_message: 'Impuesto sobre las ventas eliminado con éxito',
|
||||||
|
confirm_delete: 'No podrá recuperar este tipo de impuesto',
|
||||||
already_in_use: 'El impuesto ya está en uso.'
|
already_in_use: 'El impuesto ya está en uso.'
|
||||||
},
|
},
|
||||||
expense_category: {
|
expense_category: {
|
||||||
@ -628,6 +631,7 @@ export default {
|
|||||||
created_message: 'Categoría creada con éxito',
|
created_message: 'Categoría creada con éxito',
|
||||||
deleted_message: 'Categoría de gastos eliminada correctamente',
|
deleted_message: 'Categoría de gastos eliminada correctamente',
|
||||||
updated_message: 'Categoría de gastos actualizada con éxito',
|
updated_message: 'Categoría de gastos actualizada con éxito',
|
||||||
|
confirm_delete: 'No podrá recuperar esta categoría de gastos',
|
||||||
already_in_use: 'La categoría ya está en uso.'
|
already_in_use: 'La categoría ya está en uso.'
|
||||||
},
|
},
|
||||||
preferences: {
|
preferences: {
|
||||||
@ -643,7 +647,6 @@ export default {
|
|||||||
preference: 'Preferencia | Preferencias',
|
preference: 'Preferencia | Preferencias',
|
||||||
general_settings: 'Preferencias predeterminadas para el sistema.',
|
general_settings: 'Preferencias predeterminadas para el sistema.',
|
||||||
updated_message: 'Preferencias actualizadas exitosamente',
|
updated_message: 'Preferencias actualizadas exitosamente',
|
||||||
set_discount_per_item_message: 'Descuento establecido por artículo',
|
|
||||||
select_language: 'seleccione el idioma',
|
select_language: 'seleccione el idioma',
|
||||||
select_time_zone: 'selecciona la zona horaria',
|
select_time_zone: 'selecciona la zona horaria',
|
||||||
select_date_formate: 'seleccione formato de fecha',
|
select_date_formate: 'seleccione formato de fecha',
|
||||||
@ -669,7 +672,7 @@ export default {
|
|||||||
state: 'Estado',
|
state: 'Estado',
|
||||||
city: 'Ciudad',
|
city: 'Ciudad',
|
||||||
address: 'Habla a',
|
address: 'Habla a',
|
||||||
street: 'Calle1 '| 'Calle # 2',
|
street: 'Calle1 ' | 'Calle # 2',
|
||||||
phone: 'Teléfono',
|
phone: 'Teléfono',
|
||||||
zip_code: 'Código postal',
|
zip_code: 'Código postal',
|
||||||
go_back: 'Regresa',
|
go_back: 'Regresa',
|
||||||
@ -677,7 +680,52 @@ export default {
|
|||||||
language: 'Idioma',
|
language: 'Idioma',
|
||||||
time_zone: 'Zona horaria',
|
time_zone: 'Zona horaria',
|
||||||
fiscal_year: 'Año financiero',
|
fiscal_year: 'Año financiero',
|
||||||
date_format: 'Formato de fecha'
|
date_format: 'Formato de fecha',
|
||||||
|
from_address: 'De la Dirección',
|
||||||
|
username: 'Nombre de usuario',
|
||||||
|
next: 'Próximo',
|
||||||
|
continue: 'Hacer continuación',
|
||||||
|
database: {
|
||||||
|
database: 'URL del sitio y base de datose',
|
||||||
|
connection: 'Conexión de base de datos',
|
||||||
|
host: 'Database Host',
|
||||||
|
port: 'Host de base de datos',
|
||||||
|
password: 'Contraseña de base de datos',
|
||||||
|
app_url: 'URL de la aplicación',
|
||||||
|
username: 'Nombre de usuario de la base de datos',
|
||||||
|
db_name: 'Nombre de la base de datos',
|
||||||
|
desc: 'Cree una base de datos en su servidor y establezca las credenciales utilizando el siguiente formulario.'
|
||||||
|
},
|
||||||
|
permissions: {
|
||||||
|
permissions: 'Permisos',
|
||||||
|
permission_desc: 'A continuación se muestra la lista de permisos de carpeta necesarios para que la aplicación funcione. Si la verificación de permisos falla, asegúrese de actualizar los permisos de su carpeta.'
|
||||||
|
},
|
||||||
|
mail: {
|
||||||
|
host: 'Host de correo',
|
||||||
|
port: 'Puerto de correo',
|
||||||
|
driver: 'Conductor de correo',
|
||||||
|
password: 'Contraseña de correo',
|
||||||
|
username: 'Nombre de usuario de correo',
|
||||||
|
mail_config: 'Configuración de correo',
|
||||||
|
encryption: 'Cifrado de correo',
|
||||||
|
mail_config_desc: 'Los detalles a continuación se utilizarán para actualizar el entorno de correo. También puede cambiar los detalles en cualquier momento después de iniciar sesión.'
|
||||||
|
},
|
||||||
|
req: {
|
||||||
|
system_req: 'Requisitos del sistema',
|
||||||
|
php_req_version: 'Php (versión {version} necesario)',
|
||||||
|
check_req: 'Consultar requisitos',
|
||||||
|
system_req_desc: 'Crater tiene algunos requisitos de servidor. Asegúrese de que su servidor tenga la versión de php requerida y todas las extensiones mencionadas a continuación.'
|
||||||
|
},
|
||||||
|
errors: {
|
||||||
|
migrate_failed: 'La migración falló',
|
||||||
|
database_variables_save_error: 'No se puede conectar a la base de datos con los valores proporcionados.',
|
||||||
|
mail_variables_save_error: 'La configuración del correo electrónico ha fallado.',
|
||||||
|
connection_failed: 'Conexión de base de datos fallida'
|
||||||
|
},
|
||||||
|
success: {
|
||||||
|
mail_variables_save_successfully: 'Correo electrónico configurado correctamente',
|
||||||
|
database_variables_save_successfully: 'Base de datos configurada con éxito.'
|
||||||
|
}
|
||||||
},
|
},
|
||||||
layout_login: {
|
layout_login: {
|
||||||
copyright_crater: 'Copyright @ Crater - 2019',
|
copyright_crater: 'Copyright @ Crater - 2019',
|
||||||
@ -708,7 +756,9 @@ export default {
|
|||||||
payment_greater_than_due_amount: 'El pago ingresado es mayor al monto adeudado de esta factura.',
|
payment_greater_than_due_amount: 'El pago ingresado es mayor al monto adeudado de esta factura.',
|
||||||
quantity_maxlength: 'La cantidad no debe ser mayor de 10 dígitos.',
|
quantity_maxlength: 'La cantidad no debe ser mayor de 10 dígitos.',
|
||||||
price_maxlength: 'El precio no debe ser mayor de 10 dígitos.',
|
price_maxlength: 'El precio no debe ser mayor de 10 dígitos.',
|
||||||
|
price_minvalue: 'El precio debe ser mayor que 0 dígitos',
|
||||||
amount_maxlength: 'La cantidad no debe ser mayor de 10 dígitos.',
|
amount_maxlength: 'La cantidad no debe ser mayor de 10 dígitos.',
|
||||||
|
amount_minvalue: 'La cantidad debe ser mayor que 0 dígitos',
|
||||||
description_maxlength: 'La descripción no debe tener más de 255 caracteres.',
|
description_maxlength: 'La descripción no debe tener más de 255 caracteres.',
|
||||||
maximum_options_error: 'Máximo de {max} opciones seleccionadas. Primero elimine una opción seleccionada para seleccionar otra.',
|
maximum_options_error: 'Máximo de {max} opciones seleccionadas. Primero elimine una opción seleccionada para seleccionar otra.',
|
||||||
notes_maxlength: 'Las notas no deben tener más de 255 caracteres.',
|
notes_maxlength: 'Las notas no deben tener más de 255 caracteres.',
|
||||||
|
|||||||
@ -233,6 +233,10 @@ export default {
|
|||||||
save_estimate: 'Sauvegarder lestimation',
|
save_estimate: 'Sauvegarder lestimation',
|
||||||
confirm_conversion: 'Vous souhaitez convertir cette estimation en facture?',
|
confirm_conversion: 'Vous souhaitez convertir cette estimation en facture?',
|
||||||
conversion_message: 'Conversion réussie',
|
conversion_message: 'Conversion réussie',
|
||||||
|
confirm_send_estimate: 'Cette estimation sera envoyée par courrier électronique au client.',
|
||||||
|
confirm_mark_as_sent: 'Cette estimation sera marquée comme envoyé',
|
||||||
|
confirm_mark_as_accepted: 'Cette estimation sera marquée comme acceptée',
|
||||||
|
confirm_mark_as_rejected: 'Cette estimation sera marquée comme Rejetée',
|
||||||
errors: {
|
errors: {
|
||||||
required: 'Champ requis'
|
required: 'Champ requis'
|
||||||
},
|
},
|
||||||
@ -616,6 +620,7 @@ export default {
|
|||||||
created_message: 'La taxe de vente créée avec succès',
|
created_message: 'La taxe de vente créée avec succès',
|
||||||
updated_message: 'La taxe de vente a été mise à jour avec succès',
|
updated_message: 'La taxe de vente a été mise à jour avec succès',
|
||||||
deleted_message: 'La taxe de vente a été supprimée avec succès',
|
deleted_message: 'La taxe de vente a été supprimée avec succès',
|
||||||
|
confirm_delete: 'Vous ne pourrez pas récupérer ce type de taxe',
|
||||||
already_in_use: 'La taxe est déjà utilisée'
|
already_in_use: 'La taxe est déjà utilisée'
|
||||||
},
|
},
|
||||||
expense_category: {
|
expense_category: {
|
||||||
@ -628,6 +633,7 @@ export default {
|
|||||||
created_message: 'Catégorie créée avec succès',
|
created_message: 'Catégorie créée avec succès',
|
||||||
deleted_message: 'La catégorie de dépenses a été supprimée avec succès',
|
deleted_message: 'La catégorie de dépenses a été supprimée avec succès',
|
||||||
updated_message: 'Catégorie de dépenses mise à jour avec succès',
|
updated_message: 'Catégorie de dépenses mise à jour avec succès',
|
||||||
|
confirm_delete: 'Vous ne pourrez pas récupérer cette catégorie de dépenses',
|
||||||
already_in_use: 'La catégorie est déjà utilisée'
|
already_in_use: 'La catégorie est déjà utilisée'
|
||||||
},
|
},
|
||||||
preferences: {
|
preferences: {
|
||||||
@ -669,7 +675,7 @@ export default {
|
|||||||
state: 'Etat',
|
state: 'Etat',
|
||||||
city: 'Ville',
|
city: 'Ville',
|
||||||
address: 'Adresse',
|
address: 'Adresse',
|
||||||
street: 'Street1 '| 'Rue # 2',
|
street: 'Street1 ' | 'Rue # 2',
|
||||||
phone: 'Téléphone',
|
phone: 'Téléphone',
|
||||||
zip_code: 'Code postal',
|
zip_code: 'Code postal',
|
||||||
go_back: 'Retourner',
|
go_back: 'Retourner',
|
||||||
@ -677,7 +683,52 @@ export default {
|
|||||||
language: 'La langue',
|
language: 'La langue',
|
||||||
time_zone: 'Fuseau horaire',
|
time_zone: 'Fuseau horaire',
|
||||||
fiscal_year: 'Année financière',
|
fiscal_year: 'Année financière',
|
||||||
date_format: 'Format de date'
|
date_format: 'Format de date',
|
||||||
|
from_address: "De l'adresse",
|
||||||
|
username: "Nom d'utilisateur",
|
||||||
|
next: 'Suivant',
|
||||||
|
continue: 'Continuer',
|
||||||
|
database: {
|
||||||
|
database: 'URL du site et base de données',
|
||||||
|
connection: 'Connexion à la base de données',
|
||||||
|
host: 'Hôte de base de données',
|
||||||
|
port: 'Port de base de données',
|
||||||
|
password: 'Mot de passe de base de données',
|
||||||
|
app_url: 'Application URL',
|
||||||
|
username: "Nom d'utilisateur de la base de données",
|
||||||
|
db_name: 'Nom de la base de données',
|
||||||
|
desc: "Créez une base de données sur votre serveur et définissez les informations d'identification à l'aide du formulaire ci-dessous."
|
||||||
|
},
|
||||||
|
permissions: {
|
||||||
|
permissions: 'Les permissions',
|
||||||
|
permission_desc: "Vous trouverez ci-dessous la liste des autorisations de dossier requises pour le fonctionnement de l'application. Si la vérification des autorisations échoue, veillez à mettre à jour vos autorisations de dossier."
|
||||||
|
},
|
||||||
|
mail: {
|
||||||
|
host: 'Mail Host',
|
||||||
|
port: 'Port mail',
|
||||||
|
driver: 'Pilote de courrier',
|
||||||
|
password: 'Mot de passe mail',
|
||||||
|
username: "Mail Nom d'utilisateur",
|
||||||
|
mail_config: 'Configuration du courrier',
|
||||||
|
encryption: 'Chiffrement du courrier',
|
||||||
|
mail_config_desc: "Les détails ci-dessous seront utilisés pour mettre à jour l'environnement de messagerie. Aussi, vous pouvez modifier les détails à tout moment après la connexion."
|
||||||
|
},
|
||||||
|
req: {
|
||||||
|
system_req: 'Configuration requise',
|
||||||
|
php_req_version: 'Php (version {version} nécessaire)',
|
||||||
|
check_req: 'Vérifier les exigences',
|
||||||
|
system_req_desc: 'Crater a quelques exigences de serveur. Assurez-vous que votre serveur dispose de la version PHP requise et de toutes les extensions mentionnées ci-dessous.'
|
||||||
|
},
|
||||||
|
errors: {
|
||||||
|
migrate_failed: 'Migration impossible',
|
||||||
|
database_variables_save_error: 'Impossible de se connecter à la base de données avec les valeurs fournies.',
|
||||||
|
mail_variables_save_error: 'La configuration du courrier électronique a échoué.',
|
||||||
|
connection_failed: 'La connexion à la base de données a échoué'
|
||||||
|
},
|
||||||
|
success: {
|
||||||
|
mail_variables_save_successfully: 'Email configuré avec succès',
|
||||||
|
database_variables_save_successfully: 'Base de données configurée avec succès.'
|
||||||
|
}
|
||||||
},
|
},
|
||||||
layout_login: {
|
layout_login: {
|
||||||
copyright_crater: 'Copyright @ Crater - 2019',
|
copyright_crater: 'Copyright @ Crater - 2019',
|
||||||
@ -708,7 +759,9 @@ export default {
|
|||||||
payment_greater_than_due_amount: 'Le paiement entré est plus que le montant dû de cette facture.',
|
payment_greater_than_due_amount: 'Le paiement entré est plus que le montant dû de cette facture.',
|
||||||
quantity_maxlength: 'La quantité ne doit pas dépasser 10 chiffres.',
|
quantity_maxlength: 'La quantité ne doit pas dépasser 10 chiffres.',
|
||||||
price_maxlength: 'Le prix ne doit pas dépasser 10 chiffres.',
|
price_maxlength: 'Le prix ne doit pas dépasser 10 chiffres.',
|
||||||
|
price_minvalue: 'Le prix doit être supérieur à 0 chiffre',
|
||||||
amount_maxlength: 'Le montant ne doit pas dépasser 10 chiffres.',
|
amount_maxlength: 'Le montant ne doit pas dépasser 10 chiffres.',
|
||||||
|
amount_minvalue: 'Le montant doit être supérieur à 0 chiffre',
|
||||||
description_maxlength: 'La description ne doit pas dépasser 255 caractères.',
|
description_maxlength: 'La description ne doit pas dépasser 255 caractères.',
|
||||||
maximum_options_error: 'Maximum de {max} options sélectionnées. Commencez par supprimer une option sélectionnée pour en sélectionner une autre.',
|
maximum_options_error: 'Maximum de {max} options sélectionnées. Commencez par supprimer une option sélectionnée pour en sélectionner une autre.',
|
||||||
notes_maxlength: 'Les notes ne doivent pas dépasser 255 caractères.',
|
notes_maxlength: 'Les notes ne doivent pas dépasser 255 caractères.',
|
||||||
|
|||||||
@ -71,6 +71,7 @@ import Preferences from './views/settings/Preferences.vue'
|
|||||||
import UserProfile from './views/settings/UserProfile.vue'
|
import UserProfile from './views/settings/UserProfile.vue'
|
||||||
import TaxTypes from './views/settings/TaxTypes.vue'
|
import TaxTypes from './views/settings/TaxTypes.vue'
|
||||||
import ExpenseCategory from './views/settings/ExpenseCategory.vue'
|
import ExpenseCategory from './views/settings/ExpenseCategory.vue'
|
||||||
|
import MailConfig from './views/settings/MailConfig.vue'
|
||||||
|
|
||||||
import Wizard from './views/wizard/Index.vue'
|
import Wizard from './views/wizard/Index.vue'
|
||||||
|
|
||||||
@ -327,6 +328,11 @@ const routes = [
|
|||||||
name: 'expense.category',
|
name: 'expense.category',
|
||||||
component: ExpenseCategory
|
component: ExpenseCategory
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'mail-configuration',
|
||||||
|
name: 'mailconfig',
|
||||||
|
component: MailConfig
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: 'notifications',
|
path: 'notifications',
|
||||||
name: 'notifications',
|
name: 'notifications',
|
||||||
|
|||||||
@ -130,7 +130,7 @@ export const markAsRejected = ({ commit, dispatch, state }, data) => {
|
|||||||
|
|
||||||
export const markAsSent = ({ commit, dispatch, state }, data) => {
|
export const markAsSent = ({ commit, dispatch, state }, data) => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
window.axios.post(`/api/estimates/sent`, data).then((response) => {
|
window.axios.post(`/api/estimates/mark-as-sent`, data).then((response) => {
|
||||||
// commit(types.UPDATE_INVOICE, response.data)
|
// commit(types.UPDATE_INVOICE, response.data)
|
||||||
resolve(response)
|
resolve(response)
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
|
|||||||
@ -343,7 +343,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$tc('customers.confirm_delete'),
|
text: this.$tc('customers.confirm_delete'),
|
||||||
icon: 'error',
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
@ -363,7 +363,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$tc('customers.confirm_delete', 2),
|
text: this.$tc('customers.confirm_delete', 2),
|
||||||
icon: 'error',
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
|
|||||||
@ -96,6 +96,7 @@
|
|||||||
<line-chart
|
<line-chart
|
||||||
v-if="isLoaded"
|
v-if="isLoaded"
|
||||||
:format-money="$utils.formatMoney"
|
:format-money="$utils.formatMoney"
|
||||||
|
:format-graph-money="$utils.formatGraphMoney"
|
||||||
:invoices="getChartInvoices"
|
:invoices="getChartInvoices"
|
||||||
:expenses="getChartExpenses"
|
:expenses="getChartExpenses"
|
||||||
:receipts="getReceiptTotals"
|
:receipts="getReceiptTotals"
|
||||||
|
|||||||
@ -688,7 +688,7 @@ export default {
|
|||||||
isValid = false
|
isValid = false
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
if (this.$v.newEstimate.$invalid === false && isValid === true) {
|
if (!this.$v.selectedCustomer.$invalid && this.$v.newEstimate.$invalid === false && isValid === true) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
|||||||
@ -249,25 +249,25 @@
|
|||||||
{{ $t('estimates.convert_to_invoice') }}
|
{{ $t('estimates.convert_to_invoice') }}
|
||||||
</a>
|
</a>
|
||||||
</v-dropdown-item>
|
</v-dropdown-item>
|
||||||
<v-dropdown-item>
|
<v-dropdown-item v-if="row.status !== 'SENT'">
|
||||||
<a class="dropdown-item" href="#" @click.self="onMarkAsSent(row.id)">
|
<a class="dropdown-item" href="#" @click.self="onMarkAsSent(row.id)">
|
||||||
<font-awesome-icon icon="check-circle" class="dropdown-item-icon" />
|
<font-awesome-icon icon="check-circle" class="dropdown-item-icon" />
|
||||||
{{ $t('estimates.mark_as_sent') }}
|
{{ $t('estimates.mark_as_sent') }}
|
||||||
</a>
|
</a>
|
||||||
</v-dropdown-item>
|
</v-dropdown-item>
|
||||||
<v-dropdown-item>
|
<v-dropdown-item v-if="row.status !== 'SENT'">
|
||||||
<a class="dropdown-item" href="#" @click.self="sendEstimate(row.id)">
|
<a class="dropdown-item" href="#" @click.self="sendEstimate(row.id)">
|
||||||
<font-awesome-icon icon="paper-plane" class="dropdown-item-icon" />
|
<font-awesome-icon icon="paper-plane" class="dropdown-item-icon" />
|
||||||
{{ $t('estimates.send_estimate') }}
|
{{ $t('estimates.send_estimate') }}
|
||||||
</a>
|
</a>
|
||||||
</v-dropdown-item>
|
</v-dropdown-item>
|
||||||
<v-dropdown-item v-if="row.status === 'DRAFT'">
|
<v-dropdown-item v-if="row.status === 'DRAFT' || row.status === 'REJECTED'">
|
||||||
<a class="dropdown-item" href="#" @click.self="onMarkAsAccepted(row.id)">
|
<a class="dropdown-item" href="#" @click.self="onMarkAsAccepted(row.id)">
|
||||||
<font-awesome-icon icon="check-circle" class="dropdown-item-icon" />
|
<font-awesome-icon icon="check-circle" class="dropdown-item-icon" />
|
||||||
{{ $t('estimates.mark_as_accepted') }}
|
{{ $t('estimates.mark_as_accepted') }}
|
||||||
</a>
|
</a>
|
||||||
</v-dropdown-item>
|
</v-dropdown-item>
|
||||||
<v-dropdown-item v-if="row.status === 'DRAFT'">
|
<v-dropdown-item v-if="row.status === 'ACCEPTED' || row.status === 'DRAFT'">
|
||||||
<a class="dropdown-item" href="#" @click.self="onMarkAsRejected(row.id)">
|
<a class="dropdown-item" href="#" @click.self="onMarkAsRejected(row.id)">
|
||||||
<font-awesome-icon icon="times-circle" class="dropdown-item-icon" />
|
<font-awesome-icon icon="times-circle" class="dropdown-item-icon" />
|
||||||
{{ $t('estimates.mark_as_rejected') }}
|
{{ $t('estimates.mark_as_rejected') }}
|
||||||
@ -409,28 +409,48 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
async onMarkAsAccepted (id) {
|
async onMarkAsAccepted (id) {
|
||||||
const data = {
|
swal({
|
||||||
id: id
|
title: this.$t('general.are_you_sure'),
|
||||||
}
|
text: this.$t('estimates.confirm_mark_as_accepted'),
|
||||||
let response = await this.markAsAccepted(data)
|
icon: '/assets/icon/check-circle-solid.svg',
|
||||||
this.refreshTable()
|
buttons: true,
|
||||||
if (response.data) {
|
dangerMode: true
|
||||||
this.filters.status = 'ACCEPTED'
|
}).then(async (markedAsRejected) => {
|
||||||
this.$refs.table.refresh()
|
if (markedAsRejected) {
|
||||||
window.toastr['success'](this.$tc('estimates.marked_as_rejected_message'))
|
const data = {
|
||||||
}
|
id: id
|
||||||
|
}
|
||||||
|
let response = await this.markAsAccepted(data)
|
||||||
|
this.refreshTable()
|
||||||
|
if (response.data) {
|
||||||
|
this.filters.status = 'ACCEPTED'
|
||||||
|
this.$refs.table.refresh()
|
||||||
|
window.toastr['success'](this.$tc('estimates.marked_as_rejected_message'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
},
|
},
|
||||||
async onMarkAsRejected (id) {
|
async onMarkAsRejected (id) {
|
||||||
const data = {
|
swal({
|
||||||
id: id
|
title: this.$t('general.are_you_sure'),
|
||||||
}
|
text: this.$t('estimates.confirm_mark_as_rejected'),
|
||||||
let response = await this.markAsRejected(data)
|
icon: '/assets/icon/times-circle-solid.svg',
|
||||||
this.refreshTable()
|
buttons: true,
|
||||||
if (response.data) {
|
dangerMode: true
|
||||||
this.filters.status = 'REJECTED'
|
}).then(async (markedAsRejected) => {
|
||||||
this.$refs.table.refresh()
|
if (markedAsRejected) {
|
||||||
window.toastr['success'](this.$tc('estimates.marked_as_rejected_message'))
|
const data = {
|
||||||
}
|
id: id
|
||||||
|
}
|
||||||
|
let response = await this.markAsRejected(data)
|
||||||
|
this.refreshTable()
|
||||||
|
if (response.data) {
|
||||||
|
this.filters.status = 'REJECTED'
|
||||||
|
this.$refs.table.refresh()
|
||||||
|
window.toastr['success'](this.$tc('estimates.marked_as_rejected_message'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
},
|
},
|
||||||
setFilters () {
|
setFilters () {
|
||||||
this.filtersApplied = true
|
this.filtersApplied = true
|
||||||
@ -470,7 +490,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$tc('estimates.confirm_delete', 1),
|
text: this.$tc('estimates.confirm_delete', 1),
|
||||||
icon: 'error',
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
@ -491,7 +511,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$t('estimates.confirm_conversion'),
|
text: this.$t('estimates.confirm_conversion'),
|
||||||
icon: 'error',
|
icon: '/assets/icon/envelope-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
@ -510,7 +530,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$tc('estimates.confirm_delete', 2),
|
text: this.$tc('estimates.confirm_delete', 2),
|
||||||
icon: 'error',
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
@ -536,24 +556,44 @@ export default {
|
|||||||
this.refreshTable()
|
this.refreshTable()
|
||||||
},
|
},
|
||||||
async onMarkAsSent (id) {
|
async onMarkAsSent (id) {
|
||||||
const data = {
|
swal({
|
||||||
id: id
|
title: this.$t('general.are_you_sure'),
|
||||||
}
|
text: this.$t('estimates.confirm_mark_as_sent'),
|
||||||
let response = await this.markAsSent(data)
|
icon: '/assets/icon/check-circle-solid.svg',
|
||||||
this.refreshTable()
|
buttons: true,
|
||||||
if (response.data) {
|
dangerMode: true
|
||||||
window.toastr['success'](this.$tc('estimates.mark_as_sent'))
|
}).then(async (willDelete) => {
|
||||||
}
|
if (willDelete) {
|
||||||
|
const data = {
|
||||||
|
id: id
|
||||||
|
}
|
||||||
|
let response = await this.markAsSent(data)
|
||||||
|
this.refreshTable()
|
||||||
|
if (response.data) {
|
||||||
|
window.toastr['success'](this.$tc('estimates.mark_as_sent'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
},
|
},
|
||||||
async sendEstimate (id) {
|
async sendEstimate (id) {
|
||||||
const data = {
|
swal({
|
||||||
id: id
|
title: this.$t('general.are_you_sure'),
|
||||||
}
|
text: this.$t('estimates.confirm_send_estimate'),
|
||||||
let response = await this.sendEmail(data)
|
icon: '/assets/icon/paper-plane-solid.svg',
|
||||||
this.refreshTable()
|
buttons: true,
|
||||||
if (response.data) {
|
dangerMode: true
|
||||||
window.toastr['success'](this.$tc('estimates.mark_as_sent'))
|
}).then(async (sendEstimate) => {
|
||||||
}
|
if (sendEstimate) {
|
||||||
|
const data = {
|
||||||
|
id: id
|
||||||
|
}
|
||||||
|
let response = await this.sendEmail(data)
|
||||||
|
this.refreshTable()
|
||||||
|
if (response.data) {
|
||||||
|
window.toastr['success'](this.$tc('estimates.mark_as_sent'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,6 +28,7 @@
|
|||||||
@select="onSelectItem"
|
@select="onSelectItem"
|
||||||
@deselect="deselectItem"
|
@deselect="deselectItem"
|
||||||
@onDesriptionInput="$v.item.description.$touch()"
|
@onDesriptionInput="$v.item.description.$touch()"
|
||||||
|
@onSelectItem="isSelected = true"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
@ -193,13 +194,17 @@ export default {
|
|||||||
prefix: '$ ',
|
prefix: '$ ',
|
||||||
precision: 2,
|
precision: 2,
|
||||||
masked: false
|
masked: false
|
||||||
}
|
},
|
||||||
|
isSelected: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters('item', [
|
...mapGetters('item', [
|
||||||
'items'
|
'items'
|
||||||
]),
|
]),
|
||||||
|
...mapGetters('modal', [
|
||||||
|
'modalActive'
|
||||||
|
]),
|
||||||
...mapGetters('currency', [
|
...mapGetters('currency', [
|
||||||
'defaultCurrencyForInput'
|
'defaultCurrencyForInput'
|
||||||
]),
|
]),
|
||||||
@ -284,6 +289,11 @@ export default {
|
|||||||
if (this.item.discount_type === 'percentage') {
|
if (this.item.discount_type === 'percentage') {
|
||||||
this.item.discount_val = (this.item.discount * newValue) / 100
|
this.item.discount_val = (this.item.discount * newValue) / 100
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
modalActive (val) {
|
||||||
|
if (!val) {
|
||||||
|
this.isSelected = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
validations () {
|
validations () {
|
||||||
@ -313,7 +323,11 @@ export default {
|
|||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
window.hub.$on('checkItems', this.validateItem)
|
window.hub.$on('checkItems', this.validateItem)
|
||||||
window.hub.$on('newItem', this.onSelectItem)
|
window.hub.$on('newItem', (val) => {
|
||||||
|
if (!this.item.item_id && this.modalActive && this.isSelected) {
|
||||||
|
this.onSelectItem(val)
|
||||||
|
}
|
||||||
|
})
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
updateTax (data) {
|
updateTax (data) {
|
||||||
|
|||||||
@ -126,6 +126,7 @@ export default {
|
|||||||
this.$emit('search', val)
|
this.$emit('search', val)
|
||||||
},
|
},
|
||||||
openItemModal () {
|
openItemModal () {
|
||||||
|
this.$emit('onSelectItem')
|
||||||
this.openModal({
|
this.openModal({
|
||||||
'title': 'Add Item',
|
'title': 'Add Item',
|
||||||
'componentName': 'ItemModal'
|
'componentName': 'ItemModal'
|
||||||
|
|||||||
@ -92,13 +92,14 @@
|
|||||||
<money
|
<money
|
||||||
v-model="amount"
|
v-model="amount"
|
||||||
v-bind="defaultCurrencyForInput"
|
v-bind="defaultCurrencyForInput"
|
||||||
|
:class="{'invalid' : $v.formData.amount.$error}"
|
||||||
class="input-field"
|
class="input-field"
|
||||||
@input="$v.formData.amount.$touch()"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="$v.formData.amount.$error">
|
<div v-if="$v.formData.amount.$error">
|
||||||
<span v-if="!$v.formData.amount.required" class="text-danger">{{ $t('validation.required') }}</span>
|
<span v-if="!$v.formData.amount.required" class="text-danger">{{ $t('validation.required') }}</span>
|
||||||
<span v-if="!$v.formData.amount.maxLength" class="text-danger">{{ $t('validation.amount_maxlength') }}</span>
|
<span v-if="!$v.formData.amount.maxLength" class="text-danger">{{ $t('validation.amount_maxlength') }}</span>
|
||||||
|
<span v-if="!$v.formData.amount.maxValue" class="text-danger">{{ $t('validation.amount_minvalue') }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group col-sm-6">
|
<div class="form-group col-sm-6">
|
||||||
|
|||||||
@ -358,7 +358,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$tc('expenses.confirm_delete'),
|
text: this.$tc('expenses.confirm_delete'),
|
||||||
icon: 'error',
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
@ -378,7 +378,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$tc('expenses.confirm_delete', 2),
|
text: this.$tc('expenses.confirm_delete', 2),
|
||||||
icon: 'error',
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
|
|||||||
@ -519,14 +519,6 @@ export default {
|
|||||||
...mapActions('item', [
|
...mapActions('item', [
|
||||||
'fetchItems'
|
'fetchItems'
|
||||||
]),
|
]),
|
||||||
isEmpty (obj) {
|
|
||||||
for (let key in obj) {
|
|
||||||
if (obj.hasOwnProperty(key)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
},
|
|
||||||
selectFixed () {
|
selectFixed () {
|
||||||
if (this.newInvoice.discount_type === 'fixed') {
|
if (this.newInvoice.discount_type === 'fixed') {
|
||||||
return
|
return
|
||||||
|
|||||||
@ -496,7 +496,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$tc('invoices.confirm_delete'),
|
text: this.$tc('invoices.confirm_delete'),
|
||||||
icon: 'error',
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
@ -526,7 +526,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$tc('invoices.confirm_delete', 2),
|
text: this.$tc('invoices.confirm_delete', 2),
|
||||||
icon: 'error',
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
|
|||||||
@ -28,6 +28,7 @@
|
|||||||
@select="onSelectItem"
|
@select="onSelectItem"
|
||||||
@deselect="deselectItem"
|
@deselect="deselectItem"
|
||||||
@onDesriptionInput="$v.item.description.$touch()"
|
@onDesriptionInput="$v.item.description.$touch()"
|
||||||
|
@onSelectItem="isSelected = true"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
@ -194,13 +195,17 @@ export default {
|
|||||||
prefix: '$ ',
|
prefix: '$ ',
|
||||||
precision: 2,
|
precision: 2,
|
||||||
masked: false
|
masked: false
|
||||||
}
|
},
|
||||||
|
isSelected: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters('item', [
|
...mapGetters('item', [
|
||||||
'items'
|
'items'
|
||||||
]),
|
]),
|
||||||
|
...mapGetters('modal', [
|
||||||
|
'modalActive'
|
||||||
|
]),
|
||||||
...mapGetters('currency', [
|
...mapGetters('currency', [
|
||||||
'defaultCurrencyForInput'
|
'defaultCurrencyForInput'
|
||||||
]),
|
]),
|
||||||
@ -285,6 +290,11 @@ export default {
|
|||||||
if (this.item.discount_type === 'percentage') {
|
if (this.item.discount_type === 'percentage') {
|
||||||
this.item.discount_val = (this.item.discount * newValue) / 100
|
this.item.discount_val = (this.item.discount * newValue) / 100
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
modalActive (val) {
|
||||||
|
if (!val) {
|
||||||
|
this.isSelected = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
validations () {
|
validations () {
|
||||||
@ -314,7 +324,11 @@ export default {
|
|||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
window.hub.$on('checkItems', this.validateItem)
|
window.hub.$on('checkItems', this.validateItem)
|
||||||
window.hub.$on('newItem', this.onSelectItem)
|
window.hub.$on('newItem', (val) => {
|
||||||
|
if (!this.item.item_id && this.modalActive && this.isSelected) {
|
||||||
|
this.onSelectItem(val)
|
||||||
|
}
|
||||||
|
})
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
updateTax (data) {
|
updateTax (data) {
|
||||||
|
|||||||
@ -115,6 +115,7 @@ export default {
|
|||||||
this.$emit('search', val)
|
this.$emit('search', val)
|
||||||
},
|
},
|
||||||
openItemModal () {
|
openItemModal () {
|
||||||
|
this.$emit('onSelectItem')
|
||||||
this.openModal({
|
this.openModal({
|
||||||
'title': 'Add Item',
|
'title': 'Add Item',
|
||||||
'componentName': 'ItemModal'
|
'componentName': 'ItemModal'
|
||||||
|
|||||||
@ -34,16 +34,16 @@
|
|||||||
<label>{{ $t('items.price') }}</label><span class="text-danger"> *</span>
|
<label>{{ $t('items.price') }}</label><span class="text-danger"> *</span>
|
||||||
<div class="base-input">
|
<div class="base-input">
|
||||||
<money
|
<money
|
||||||
:invalid="$v.formData.price.$error"
|
:class="{'invalid' : $v.formData.price.$error}"
|
||||||
v-model="price"
|
v-model="price"
|
||||||
v-bind="defaultCurrencyForInput"
|
v-bind="defaultCurrencyForInput"
|
||||||
class="input-field"
|
class="input-field"
|
||||||
@input="$v.formData.price.$touch()"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="$v.formData.price.$error">
|
<div v-if="$v.formData.price.$error">
|
||||||
<span v-if="!$v.formData.price.required" class="text-danger">{{ $t('validation.required') }} </span>
|
<span v-if="!$v.formData.price.required" class="text-danger">{{ $t('validation.required') }} </span>
|
||||||
<span v-if="!$v.formData.price.maxLength" class="text-danger">{{ $t('validation.price_maxlength') }}</span>
|
<span v-if="!$v.formData.price.maxLength" class="text-danger">{{ $t('validation.price_maxlength') }}</span>
|
||||||
|
<span v-if="!$v.formData.price.minValue" class="text-danger">{{ $t('validation.price_minvalue') }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@ -92,7 +92,8 @@
|
|||||||
<script>
|
<script>
|
||||||
import { validationMixin } from 'vuelidate'
|
import { validationMixin } from 'vuelidate'
|
||||||
import { mapActions, mapGetters } from 'vuex'
|
import { mapActions, mapGetters } from 'vuex'
|
||||||
const { required, minLength, numeric, alpha, minValue, maxLength} = require('vuelidate/lib/validators')
|
const { required, minLength, numeric, alpha, minValue, maxLength } = require('vuelidate/lib/validators')
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
mixins: {
|
mixins: {
|
||||||
validationMixin
|
validationMixin
|
||||||
|
|||||||
@ -362,7 +362,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$tc('items.confirm_delete'),
|
text: this.$tc('items.confirm_delete'),
|
||||||
icon: 'error',
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
@ -388,7 +388,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$tc('items.confirm_delete', 2),
|
text: this.$tc('items.confirm_delete', 2),
|
||||||
icon: 'error',
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
|
|||||||
@ -101,7 +101,6 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="$v.formData.amount.$error">
|
<div v-if="$v.formData.amount.$error">
|
||||||
<span v-if="!$v.formData.amount.required" class="text-danger">{{ $t('validation.required') }}</span>
|
<span v-if="!$v.formData.amount.required" class="text-danger">{{ $t('validation.required') }}</span>
|
||||||
<span v-if="!$v.formData.amount.numeric" class="text-danger">{{ $t('validation.numbers_only') }}</span>
|
|
||||||
<span v-if="!$v.formData.amount.between && $v.formData.amount.numeric && amount <= 0" class="text-danger">{{ $t('validation.payment_greater_than_zero') }}</span>
|
<span v-if="!$v.formData.amount.between && $v.formData.amount.numeric && amount <= 0" class="text-danger">{{ $t('validation.payment_greater_than_zero') }}</span>
|
||||||
<span v-if="!$v.formData.amount.between && amount > 0" class="text-danger">{{ $t('validation.payment_greater_than_due_amount') }}</span>
|
<span v-if="!$v.formData.amount.between && amount > 0" class="text-danger">{{ $t('validation.payment_greater_than_due_amount') }}</span>
|
||||||
</div>
|
</div>
|
||||||
@ -156,7 +155,7 @@ import { mapActions, mapGetters } from 'vuex'
|
|||||||
import MultiSelect from 'vue-multiselect'
|
import MultiSelect from 'vue-multiselect'
|
||||||
import { validationMixin } from 'vuelidate'
|
import { validationMixin } from 'vuelidate'
|
||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
const { required, numeric, between, maxLength } = require('vuelidate/lib/validators')
|
const { required, between, maxLength } = require('vuelidate/lib/validators')
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: { MultiSelect },
|
components: { MultiSelect },
|
||||||
@ -201,7 +200,6 @@ export default {
|
|||||||
},
|
},
|
||||||
amount: {
|
amount: {
|
||||||
required,
|
required,
|
||||||
numeric,
|
|
||||||
between: between(1, this.maxPayableAmount + 1)
|
between: between(1, this.maxPayableAmount + 1)
|
||||||
},
|
},
|
||||||
notes: {
|
notes: {
|
||||||
|
|||||||
@ -368,7 +368,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$tc('payments.confirm_delete'),
|
text: this.$tc('payments.confirm_delete'),
|
||||||
icon: 'error',
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
@ -388,7 +388,7 @@ export default {
|
|||||||
swal({
|
swal({
|
||||||
title: this.$t('general.are_you_sure'),
|
title: this.$t('general.are_you_sure'),
|
||||||
text: this.$tc('payments.confirm_delete', 2),
|
text: this.$tc('payments.confirm_delete', 2),
|
||||||
icon: 'error',
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
buttons: true,
|
buttons: true,
|
||||||
dangerMode: true
|
dangerMode: true
|
||||||
}).then(async (willDelete) => {
|
}).then(async (willDelete) => {
|
||||||
|
|||||||
@ -48,7 +48,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-sm-8 reports-tab-container">
|
<div class="col-sm-8 reports-tab-container">
|
||||||
<iframe :src="getReportUrl" class="reports-frame-style"/>
|
<iframe :src="getReportUrl" class="reports-frame-style"/>
|
||||||
<a :href="getReportUrl" class="base-button btn btn-primary btn-lg report-view-button" target="_blank">
|
<a class="base-button btn btn-primary btn-lg report-view-button" @click="viewReportsPDF">
|
||||||
<font-awesome-icon icon="file-pdf" class="vue-icon icon-left svg-inline--fa fa-download fa-w-16 mr-2" /> <span>{{ $t('reports.view_pdf') }}</span>
|
<font-awesome-icon icon="file-pdf" class="vue-icon icon-left svg-inline--fa fa-download fa-w-16 mr-2" /> <span>{{ $t('reports.view_pdf') }}</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@ -179,6 +179,11 @@ export default {
|
|||||||
setRangeToCustom () {
|
setRangeToCustom () {
|
||||||
this.selectedRange = 'Custom'
|
this.selectedRange = 'Custom'
|
||||||
},
|
},
|
||||||
|
async viewReportsPDF () {
|
||||||
|
let data = await this.getReports()
|
||||||
|
window.open(this.getReportUrl, '_blank')
|
||||||
|
return data
|
||||||
|
},
|
||||||
async getReports (isDownload = false) {
|
async getReports (isDownload = false) {
|
||||||
this.$v.range.$touch()
|
this.$v.range.$touch()
|
||||||
this.$v.formData.$touch()
|
this.$v.formData.$touch()
|
||||||
|
|||||||
@ -48,7 +48,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-sm-8 reports-tab-container">
|
<div class="col-sm-8 reports-tab-container">
|
||||||
<iframe :src="getReportUrl" class="reports-frame-style"/>
|
<iframe :src="getReportUrl" class="reports-frame-style"/>
|
||||||
<a :href="getReportUrl" class="base-button btn btn-primary btn-lg report-view-button" target="_blank">
|
<a class="base-button btn btn-primary btn-lg report-view-button" @click="viewReportsPDF">
|
||||||
<font-awesome-icon icon="file-pdf" class="vue-icon icon-left svg-inline--fa fa-download fa-w-16 mr-2" /> <span>{{ $t('reports.view_pdf') }}</span>
|
<font-awesome-icon icon="file-pdf" class="vue-icon icon-left svg-inline--fa fa-download fa-w-16 mr-2" /> <span>{{ $t('reports.view_pdf') }}</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@ -184,6 +184,11 @@ export default {
|
|||||||
setRangeToCustom () {
|
setRangeToCustom () {
|
||||||
this.selectedRange = 'Custom'
|
this.selectedRange = 'Custom'
|
||||||
},
|
},
|
||||||
|
async viewReportsPDF () {
|
||||||
|
let data = await this.getReports()
|
||||||
|
window.open(this.getReportUrl, '_blank')
|
||||||
|
return data
|
||||||
|
},
|
||||||
async getReports (isDownload = false) {
|
async getReports (isDownload = false) {
|
||||||
this.$v.range.$touch()
|
this.$v.range.$touch()
|
||||||
this.$v.formData.$touch()
|
this.$v.formData.$touch()
|
||||||
|
|||||||
@ -70,7 +70,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-sm-8 reports-tab-container">
|
<div class="col-sm-8 reports-tab-container">
|
||||||
<iframe :src="getReportUrl" class="reports-frame-style"/>
|
<iframe :src="getReportUrl" class="reports-frame-style"/>
|
||||||
<a :href="getReportUrl" class="base-button btn btn-primary btn-lg report-view-button" target="_blank">
|
<a class="base-button btn btn-primary btn-lg report-view-button" @click="viewReportsPDF">
|
||||||
<font-awesome-icon icon="file-pdf" class="vue-icon icon-left svg-inline--fa fa-download fa-w-16 mr-2" /> <span>{{ $t('reports.view_pdf') }}</span>
|
<font-awesome-icon icon="file-pdf" class="vue-icon icon-left svg-inline--fa fa-download fa-w-16 mr-2" /> <span>{{ $t('reports.view_pdf') }}</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@ -217,6 +217,11 @@ export default {
|
|||||||
this.url = `${this.itemsSiteURL}?from_date=${moment(this.formData.from_date).format('DD/MM/YYYY')}&to_date=${moment(this.formData.to_date).format('DD/MM/YYYY')}`
|
this.url = `${this.itemsSiteURL}?from_date=${moment(this.formData.from_date).format('DD/MM/YYYY')}&to_date=${moment(this.formData.to_date).format('DD/MM/YYYY')}`
|
||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
|
async viewReportsPDF () {
|
||||||
|
let data = await this.getReports()
|
||||||
|
window.open(this.getReportUrl, '_blank')
|
||||||
|
return data
|
||||||
|
},
|
||||||
async getReports (isDownload = false) {
|
async getReports (isDownload = false) {
|
||||||
this.$v.range.$touch()
|
this.$v.range.$touch()
|
||||||
this.$v.formData.$touch()
|
this.$v.formData.$touch()
|
||||||
|
|||||||
@ -48,7 +48,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-sm-8 reports-tab-container">
|
<div class="col-sm-8 reports-tab-container">
|
||||||
<iframe :src="getReportUrl" class="reports-frame-style"/>
|
<iframe :src="getReportUrl" class="reports-frame-style"/>
|
||||||
<a :href="getReportUrl" class="base-button btn btn-primary btn-lg report-view-button" target="_blank">
|
<a class="base-button btn btn-primary btn-lg report-view-button" @click="viewReportsPDF">
|
||||||
<font-awesome-icon icon="file-pdf" class="vue-icon icon-left svg-inline--fa fa-download fa-w-16 mr-2" /> <span>{{ $t('reports.view_pdf') }}</span>
|
<font-awesome-icon icon="file-pdf" class="vue-icon icon-left svg-inline--fa fa-download fa-w-16 mr-2" /> <span>{{ $t('reports.view_pdf') }}</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@ -179,6 +179,11 @@ export default {
|
|||||||
setRangeToCustom () {
|
setRangeToCustom () {
|
||||||
this.selectedRange = 'Custom'
|
this.selectedRange = 'Custom'
|
||||||
},
|
},
|
||||||
|
async viewReportsPDF () {
|
||||||
|
let data = await this.getReports()
|
||||||
|
window.open(this.getReportUrl, '_blank')
|
||||||
|
return data
|
||||||
|
},
|
||||||
async getReports (isDownload = false) {
|
async getReports (isDownload = false) {
|
||||||
this.$v.range.$touch()
|
this.$v.range.$touch()
|
||||||
this.$v.formData.$touch()
|
this.$v.formData.$touch()
|
||||||
|
|||||||
@ -101,13 +101,23 @@ export default {
|
|||||||
'deleteCategory'
|
'deleteCategory'
|
||||||
]),
|
]),
|
||||||
async removeExpenseCategory (id, index) {
|
async removeExpenseCategory (id, index) {
|
||||||
let response = await this.deleteCategory(id)
|
swal({
|
||||||
if (response.data.success) {
|
title: this.$t('general.are_you_sure'),
|
||||||
window.toastr['success'](this.$tc('settings.expense_category.deleted_message'))
|
text: this.$t('settings.expense_category.confirm_delete'),
|
||||||
this.id = null
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
this.$refs.table.refresh()
|
buttons: true,
|
||||||
return true
|
dangerMode: true
|
||||||
} window.toastr['success'](this.$t('settings.expense_category.already_in_use'))
|
}).then(async (willDelete) => {
|
||||||
|
if (willDelete) {
|
||||||
|
let response = await this.deleteCategory(id)
|
||||||
|
if (response.data.success) {
|
||||||
|
window.toastr['success'](this.$tc('settings.expense_category.deleted_message'))
|
||||||
|
this.id = null
|
||||||
|
this.$refs.table.refresh()
|
||||||
|
return true
|
||||||
|
} window.toastr['error'](this.$t('settings.expense_category.already_in_use'))
|
||||||
|
}
|
||||||
|
})
|
||||||
},
|
},
|
||||||
openCategoryModal () {
|
openCategoryModal () {
|
||||||
this.openModal({
|
this.openModal({
|
||||||
|
|||||||
213
resources/assets/js/views/settings/MailConfig.vue
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
<template>
|
||||||
|
<div class="setting-main-container">
|
||||||
|
<div class="card setting-card">
|
||||||
|
<div class="page-header">
|
||||||
|
<h3 class="page-title">{{ $t('settings.mail.mail_config') }}</h3>
|
||||||
|
<p class="page-sub-title">
|
||||||
|
{{ $t('settings.mail.mail_config_desc') }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<form action="" @submit.prevent="saveEmailConfig()">
|
||||||
|
<div class="row my-2 mt-5">
|
||||||
|
<div class="col-md-6 my-2">
|
||||||
|
<label class="form-label">{{ $t('settings.mail.driver') }}</label>
|
||||||
|
<span class="text-danger"> *</span>
|
||||||
|
<base-select
|
||||||
|
v-model="mailConfigData.mail_driver"
|
||||||
|
:invalid="$v.mailConfigData.mail_driver.$error"
|
||||||
|
:options="mail_drivers"
|
||||||
|
:searchable="true"
|
||||||
|
:show-labels="false"
|
||||||
|
@change="$v.mailConfigData.mail_driver.$touch()"
|
||||||
|
/>
|
||||||
|
<div v-if="$v.mailConfigData.mail_driver.$error">
|
||||||
|
<span v-if="!$v.mailConfigData.mail_driver.required" class="text-danger">
|
||||||
|
{{ $tc('validation.required') }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 my-2">
|
||||||
|
<label class="form-label">{{ $t('settings.mail.host') }}</label>
|
||||||
|
<span class="text-danger"> *</span>
|
||||||
|
<base-input
|
||||||
|
:invalid="$v.mailConfigData.mail_host.$error"
|
||||||
|
v-model.trim="mailConfigData.mail_host"
|
||||||
|
type="text"
|
||||||
|
name="mail_host"
|
||||||
|
@input="$v.mailConfigData.mail_host.$touch()"
|
||||||
|
/>
|
||||||
|
<div v-if="$v.mailConfigData.mail_host.$error">
|
||||||
|
<span v-if="!$v.mailConfigData.mail_host.required" class="text-danger">
|
||||||
|
{{ $tc('validation.required') }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row my-2">
|
||||||
|
<div class="col-md-6 my-2">
|
||||||
|
<label class="form-label">{{ $t('settings.mail.username') }}</label>
|
||||||
|
<span class="text-danger"> *</span>
|
||||||
|
<base-input
|
||||||
|
:invalid="$v.mailConfigData.mail_username.$error"
|
||||||
|
v-model.trim="mailConfigData.mail_username"
|
||||||
|
type="text"
|
||||||
|
name="db_name"
|
||||||
|
@input="$v.mailConfigData.mail_username.$touch()"
|
||||||
|
/>
|
||||||
|
<div v-if="$v.mailConfigData.mail_username.$error">
|
||||||
|
<span v-if="!$v.mailConfigData.mail_username.required" class="text-danger">
|
||||||
|
{{ $tc('validation.required') }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 my-2">
|
||||||
|
<label class="form-label">{{ $t('settings.mail.password') }}</label>
|
||||||
|
<span class="text-danger"> *</span>
|
||||||
|
<base-input
|
||||||
|
:invalid="$v.mailConfigData.mail_password.$error"
|
||||||
|
v-model.trim="mailConfigData.mail_password"
|
||||||
|
type="mail_password"
|
||||||
|
name="name"
|
||||||
|
@input="$v.mailConfigData.mail_password.$touch()"
|
||||||
|
/>
|
||||||
|
<div v-if="$v.mailConfigData.mail_password.$error">
|
||||||
|
<span v-if="!$v.mailConfigData.mail_password.required" class="text-danger">
|
||||||
|
{{ $tc('validation.required') }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row my-2">
|
||||||
|
<div class="col-md-6 my-2">
|
||||||
|
<label class="form-label">{{ $t('settings.mail.port') }}</label>
|
||||||
|
<span class="text-danger"> *</span>
|
||||||
|
<base-input
|
||||||
|
:invalid="$v.mailConfigData.mail_port.$error"
|
||||||
|
v-model.trim="mailConfigData.mail_port"
|
||||||
|
type="text"
|
||||||
|
name="mail_port"
|
||||||
|
@input="$v.mailConfigData.mail_port.$touch()"
|
||||||
|
/>
|
||||||
|
<div v-if="$v.mailConfigData.mail_port.$error">
|
||||||
|
<span v-if="!$v.mailConfigData.mail_port.required" class="text-danger">
|
||||||
|
{{ $tc('validation.required') }}
|
||||||
|
</span>
|
||||||
|
<span v-if="!$v.mailConfigData.mail_port.numeric" class="text-danger">
|
||||||
|
{{ $tc('validation.numbers_only') }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 my-2">
|
||||||
|
<label class="form-label">{{ $t('settings.mail.encryption') }}</label>
|
||||||
|
<span class="text-danger"> *</span>
|
||||||
|
<base-input
|
||||||
|
:invalid="$v.mailConfigData.mail_encryption.$error"
|
||||||
|
v-model.trim="mailConfigData.mail_encryption"
|
||||||
|
type="text"
|
||||||
|
name="name"
|
||||||
|
@input="$v.mailConfigData.mail_encryption.$touch()"
|
||||||
|
/>
|
||||||
|
<div v-if="$v.mailConfigData.mail_encryption.$error">
|
||||||
|
<span v-if="!$v.mailConfigData.mail_encryption.required" class="text-danger">
|
||||||
|
{{ $tc('validation.required') }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<base-button
|
||||||
|
:loading="loading"
|
||||||
|
class="pull-right mt-5"
|
||||||
|
icon="save"
|
||||||
|
color="theme"
|
||||||
|
type="submit"
|
||||||
|
>
|
||||||
|
{{ $t('wizard.save_cont') }}
|
||||||
|
</base-button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import MultiSelect from 'vue-multiselect'
|
||||||
|
import { validationMixin } from 'vuelidate'
|
||||||
|
import Ls from '../../services/ls'
|
||||||
|
const { required, email, numeric } = require('vuelidate/lib/validators')
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
MultiSelect
|
||||||
|
},
|
||||||
|
mixins: [validationMixin],
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
mailConfigData: {
|
||||||
|
mail_driver: 'smtp',
|
||||||
|
mail_host: 'mailtrap.io',
|
||||||
|
mail_port: 2525,
|
||||||
|
mail_username: 'cc3c64516febd4',
|
||||||
|
mail_password: 'e6a0176301f587',
|
||||||
|
mail_encryption: 'tls'
|
||||||
|
},
|
||||||
|
loading: false,
|
||||||
|
mail_drivers: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
validations: {
|
||||||
|
mailConfigData: {
|
||||||
|
mail_driver: {
|
||||||
|
required
|
||||||
|
},
|
||||||
|
mail_host: {
|
||||||
|
required
|
||||||
|
},
|
||||||
|
mail_port: {
|
||||||
|
required,
|
||||||
|
numeric
|
||||||
|
},
|
||||||
|
mail_username: {
|
||||||
|
required
|
||||||
|
},
|
||||||
|
mail_password: {
|
||||||
|
required
|
||||||
|
},
|
||||||
|
mail_encryption: {
|
||||||
|
required
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted () {
|
||||||
|
// this.getMailDrivers()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async getMailDrivers () {
|
||||||
|
this.loading = true
|
||||||
|
|
||||||
|
let response = await window.axios.get('/api/admin/onboarding/environment/mail')
|
||||||
|
|
||||||
|
if (response.data) {
|
||||||
|
this.mail_drivers = response.data
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async saveEmailConfig () {
|
||||||
|
this.$v.mailConfigData.$touch()
|
||||||
|
if (this.$v.mailConfigData.$invalid) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
this.loading = true
|
||||||
|
try {
|
||||||
|
let response = await window.axios.post('/api/admin/onboarding/environment/mail', this.mailConfigData)
|
||||||
|
if (response.data.success) {
|
||||||
|
window.toastr['success'](this.$t('wizard.success.' + response.data.success))
|
||||||
|
} else {
|
||||||
|
window.toastr['error'](this.$t('wizard.errors.' + response.data.error))
|
||||||
|
}
|
||||||
|
this.loading = false
|
||||||
|
return true
|
||||||
|
} catch (e) {
|
||||||
|
window.toastr['error']('Something went wrong')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@ -113,7 +113,11 @@
|
|||||||
<h3 class="page-title">{{ $t('settings.preferences.discount_setting') }}</h3>
|
<h3 class="page-title">{{ $t('settings.preferences.discount_setting') }}</h3>
|
||||||
<div class="flex-box">
|
<div class="flex-box">
|
||||||
<div class="left">
|
<div class="left">
|
||||||
<base-switch v-model="discount_per_item" class="btn-switch" @change="setDiscount" />
|
<base-switch
|
||||||
|
v-model="discount_per_item"
|
||||||
|
class="btn-switch"
|
||||||
|
@change="setDiscount"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="right ml-15">
|
<div class="right ml-15">
|
||||||
<p class="box-title"> {{ $t('settings.preferences.discount_per_item') }} </p>
|
<p class="box-title"> {{ $t('settings.preferences.discount_per_item') }} </p>
|
||||||
|
|||||||
@ -34,7 +34,7 @@
|
|||||||
>
|
>
|
||||||
<template slot-scope="row">
|
<template slot-scope="row">
|
||||||
<span>{{ $t('settings.tax_types.tax_name') }}</span>
|
<span>{{ $t('settings.tax_types.tax_name') }}</span>
|
||||||
<span class="tax-name">
|
<span class="tax-name mt-3">
|
||||||
{{ row.name }}
|
{{ row.name }}
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
@ -159,13 +159,23 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
async removeTax (id, index) {
|
async removeTax (id, index) {
|
||||||
let response = await this.deleteTaxType(id)
|
swal({
|
||||||
if (response.data.success) {
|
title: this.$t('general.are_you_sure'),
|
||||||
window.toastr['success'](this.$t('settings.tax_types.deleted_message'))
|
text: this.$t('settings.tax_types.confirm_delete'),
|
||||||
this.id = null
|
icon: '/assets/icon/trash-solid.svg',
|
||||||
this.$refs.table.refresh()
|
buttons: true,
|
||||||
return true
|
dangerMode: true
|
||||||
}window.toastr['success'](this.$t('settings.tax_types.already_in_use'))
|
}).then(async (willDelete) => {
|
||||||
|
if (willDelete) {
|
||||||
|
let response = await this.deleteTaxType(id)
|
||||||
|
if (response.data.success) {
|
||||||
|
window.toastr['success'](this.$t('settings.tax_types.deleted_message'))
|
||||||
|
this.id = null
|
||||||
|
this.$refs.table.refresh()
|
||||||
|
return true
|
||||||
|
}window.toastr['error'](this.$t('settings.tax_types.already_in_use'))
|
||||||
|
}
|
||||||
|
})
|
||||||
},
|
},
|
||||||
openTaxModal () {
|
openTaxModal () {
|
||||||
this.openModal({
|
this.openModal({
|
||||||
|
|||||||
@ -63,6 +63,12 @@ export default {
|
|||||||
icon: 'list-alt',
|
icon: 'list-alt',
|
||||||
iconType: 'far'
|
iconType: 'far'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
link: '/admin/settings/mail-configuration',
|
||||||
|
title: 'settings.mail.mail_config',
|
||||||
|
icon: 'envelope',
|
||||||
|
iconType: 'fa'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
link: '/admin/settings/notifications',
|
link: '/admin/settings/notifications',
|
||||||
title: 'settings.menu_title.notifications',
|
title: 'settings.menu_title.notifications',
|
||||||
|
|||||||
@ -109,15 +109,26 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<base-button
|
<div class="row mt-5">
|
||||||
:loading="loading"
|
<base-button
|
||||||
class="pull-right mt-5"
|
:loading="loading"
|
||||||
icon="save"
|
class="pull-right"
|
||||||
color="theme"
|
icon="save"
|
||||||
type="submit"
|
color="theme"
|
||||||
>
|
type="submit"
|
||||||
{{ $t('wizard.save_cont') }}
|
>
|
||||||
</base-button>
|
{{ $t('wizard.save_cont') }}
|
||||||
|
</base-button>
|
||||||
|
<base-button
|
||||||
|
:loading="loading"
|
||||||
|
class="pull-right ml-4"
|
||||||
|
outline
|
||||||
|
color="theme"
|
||||||
|
@click="$emit('next')"
|
||||||
|
>
|
||||||
|
{{ $t('wizard.skip') }}
|
||||||
|
</base-button>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -137,10 +148,10 @@ export default {
|
|||||||
mailConfigData: {
|
mailConfigData: {
|
||||||
mail_driver: 'smtp',
|
mail_driver: 'smtp',
|
||||||
mail_host: 'mailtrap.io',
|
mail_host: 'mailtrap.io',
|
||||||
mail_port: 2525,
|
mail_port: null,
|
||||||
mail_username: 'cc3c64516febd4',
|
mail_username: null,
|
||||||
mail_password: 'e6a0176301f587',
|
mail_password: null,
|
||||||
mail_encryption: 'tls'
|
mail_encryption: null
|
||||||
},
|
},
|
||||||
loading: false,
|
loading: false,
|
||||||
mail_drivers: []
|
mail_drivers: []
|
||||||
|
|||||||
8
resources/assets/sass/base.scss
vendored
@ -111,7 +111,13 @@ code, .code {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
<<<<<<< HEAD
|
||||||
|
|
||||||
.swal-icon--custom {
|
.swal-icon--custom {
|
||||||
height: 50px !important;
|
height: 50px !important;
|
||||||
}
|
}
|
||||||
|
=======
|
||||||
|
.swal-icon--custom {
|
||||||
|
height: 50px !important;
|
||||||
|
}
|
||||||
|
>>>>>>> 9192b26b9da40898dd5213b7b4257bde662f4a6b
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
fieldset[disabled] .multiselect {
|
fieldset[disabled] .multiselect {
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.in-valid {
|
.in-valid {
|
||||||
border: 1px solid $ls-color-red !important;
|
border: 1px solid $ls-color-red !important;
|
||||||
}
|
}
|
||||||
@ -18,6 +19,7 @@ fieldset[disabled] .multiselect {
|
|||||||
background: #fff;
|
background: #fff;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__spinner:before,
|
.multiselect__spinner:before,
|
||||||
.multiselect__spinner:after {
|
.multiselect__spinner:after {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -33,23 +35,28 @@ fieldset[disabled] .multiselect {
|
|||||||
border-width: 2px;
|
border-width: 2px;
|
||||||
box-shadow: 0 0 0 1px transparent;
|
box-shadow: 0 0 0 1px transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__spinner:before {
|
.multiselect__spinner:before {
|
||||||
animation: spinning 2.4s cubic-bezier(0.41, 0.26, 0.2, 0.62);
|
animation: spinning 2.4s cubic-bezier(0.41, 0.26, 0.2, 0.62);
|
||||||
animation-iteration-count: infinite;
|
animation-iteration-count: infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__spinner:after {
|
.multiselect__spinner:after {
|
||||||
animation: spinning 2.4s cubic-bezier(0.51, 0.09, 0.21, 0.8);
|
animation: spinning 2.4s cubic-bezier(0.51, 0.09, 0.21, 0.8);
|
||||||
animation-iteration-count: infinite;
|
animation-iteration-count: infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__loading-enter-active,
|
.multiselect__loading-enter-active,
|
||||||
.multiselect__loading-leave-active {
|
.multiselect__loading-leave-active {
|
||||||
transition: opacity 0.4s ease-in-out;
|
transition: opacity 0.4s ease-in-out;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__loading-enter,
|
.multiselect__loading-enter,
|
||||||
.multiselect__loading-leave-active {
|
.multiselect__loading-leave-active {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect,
|
.multiselect,
|
||||||
.multiselect__input,
|
.multiselect__input,
|
||||||
.multiselect__single {
|
.multiselect__single {
|
||||||
@ -57,34 +64,41 @@ fieldset[disabled] .multiselect {
|
|||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
touch-action: manipulation;
|
touch-action: manipulation;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect {
|
.multiselect {
|
||||||
box-sizing: content-box;
|
box-sizing: content-box;
|
||||||
display: block;
|
display: block;
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-height: 45px;
|
min-height: 40px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
color: #35495e;
|
color: #35495e;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect * {
|
.multiselect * {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect:focus {
|
.multiselect:focus {
|
||||||
border: 1px solid #817ae3 !important;
|
border: 1px solid #817ae3 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect--disabled {
|
.multiselect--disabled {
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect--active {
|
.multiselect--active {
|
||||||
z-index: 50;
|
z-index: 50;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect--active:not(.multiselect--above) .multiselect__current,
|
.multiselect--active:not(.multiselect--above) .multiselect__current,
|
||||||
.multiselect--active:not(.multiselect--above) .multiselect__input,
|
.multiselect--active:not(.multiselect--above) .multiselect__input,
|
||||||
.multiselect--active:not(.multiselect--above) .multiselect__tags {
|
.multiselect--active:not(.multiselect--above) .multiselect__tags {
|
||||||
border-bottom-left-radius: 0;
|
border-bottom-left-radius: 0;
|
||||||
border-bottom-right-radius: 0;
|
border-bottom-right-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect--active .multiselect__select {
|
.multiselect--active .multiselect__select {
|
||||||
transform: rotateZ(180deg);
|
transform: rotateZ(180deg);
|
||||||
}
|
}
|
||||||
@ -94,6 +108,7 @@ fieldset[disabled] .multiselect {
|
|||||||
border-top-left-radius: 0;
|
border-top-left-radius: 0;
|
||||||
border-top-right-radius: 0;
|
border-top-right-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__input,
|
.multiselect__input,
|
||||||
.multiselect__single {
|
.multiselect__single {
|
||||||
position: relative;
|
position: relative;
|
||||||
@ -110,9 +125,11 @@ fieldset[disabled] .multiselect {
|
|||||||
// margin-bottom: 8px;
|
// margin-bottom: 8px;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__input::placeholder {
|
.multiselect__input::placeholder {
|
||||||
color: $ls-color-gray;
|
color: $ls-color-gray;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__tag ~ .multiselect__input,
|
.multiselect__tag ~ .multiselect__input,
|
||||||
.multiselect__tag ~ .multiselect__single {
|
.multiselect__tag ~ .multiselect__single {
|
||||||
width: auto;
|
width: auto;
|
||||||
@ -345,68 +362,85 @@ fieldset[disabled] .multiselect {
|
|||||||
cursor: text;
|
cursor: text;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__option--group {
|
.multiselect__option--group {
|
||||||
background: #ededed;
|
background: #ededed;
|
||||||
color: #35495e;
|
color: #35495e;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__option--group.multiselect__option--highlight {
|
.multiselect__option--group.multiselect__option--highlight {
|
||||||
background: #35495e;
|
background: #35495e;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__option--group.multiselect__option--highlight:after {
|
.multiselect__option--group.multiselect__option--highlight:after {
|
||||||
background: #35495e;
|
background: #35495e;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__option--disabled.multiselect__option--highlight {
|
.multiselect__option--disabled.multiselect__option--highlight {
|
||||||
background: #dedede;
|
background: #dedede;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__option--group-selected.multiselect__option--highlight {
|
.multiselect__option--group-selected.multiselect__option--highlight {
|
||||||
background: #ff6a6a;
|
background: #ff6a6a;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__option--group-selected.multiselect__option--highlight:after {
|
.multiselect__option--group-selected.multiselect__option--highlight:after {
|
||||||
background: #ff6a6a;
|
background: #ff6a6a;
|
||||||
content: attr(data-deselect);
|
content: attr(data-deselect);
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect-enter-active,
|
.multiselect-enter-active,
|
||||||
.multiselect-leave-active {
|
.multiselect-leave-active {
|
||||||
transition: all 0.15s ease;
|
transition: all 0.15s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect-enter,
|
.multiselect-enter,
|
||||||
.multiselect-leave-active {
|
.multiselect-leave-active {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect__strong {
|
.multiselect__strong {
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
|
||||||
*[dir="rtl"] .multiselect {
|
*[dir="rtl"] .multiselect {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
*[dir="rtl"] .multiselect__select {
|
*[dir="rtl"] .multiselect__select {
|
||||||
right: auto;
|
right: auto;
|
||||||
left: 1px;
|
left: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
*[dir="rtl"] .multiselect__tags {
|
*[dir="rtl"] .multiselect__tags {
|
||||||
padding: 8px 8px 0px 40px;
|
padding: 8px 8px 0px 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
*[dir="rtl"] .multiselect__content {
|
*[dir="rtl"] .multiselect__content {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
*[dir="rtl"] .multiselect__option:after {
|
*[dir="rtl"] .multiselect__option:after {
|
||||||
right: auto;
|
right: auto;
|
||||||
left: 0;
|
left: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*[dir="rtl"] .multiselect__clear {
|
*[dir="rtl"] .multiselect__clear {
|
||||||
right: auto;
|
right: auto;
|
||||||
left: 12px;
|
left: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
*[dir="rtl"] .multiselect__spinner {
|
*[dir="rtl"] .multiselect__spinner {
|
||||||
right: auto;
|
right: auto;
|
||||||
left: 1px;
|
left: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes spinning {
|
@keyframes spinning {
|
||||||
from {
|
from {
|
||||||
transform: rotate(0);
|
transform: rotate(0);
|
||||||
@ -417,6 +451,7 @@ fieldset[disabled] .multiselect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.multiselect {
|
.multiselect {
|
||||||
|
|
||||||
.multiselect__option--highlight {
|
.multiselect__option--highlight {
|
||||||
background: $ls-color-primary;
|
background: $ls-color-primary;
|
||||||
color: $ls-color-black;
|
color: $ls-color-black;
|
||||||
@ -459,6 +494,7 @@ fieldset[disabled] .multiselect {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.error {
|
&.error {
|
||||||
border: 1px solid $ls-color-red;
|
border: 1px solid $ls-color-red;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
|
|||||||
@ -490,7 +490,7 @@
|
|||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
padding-top: 2px;
|
padding-top: 2px;
|
||||||
padding-left: 10px;
|
// padding-left: 10px;
|
||||||
|
|
||||||
textarea {
|
textarea {
|
||||||
|
|
||||||
@ -504,6 +504,7 @@
|
|||||||
border: none;
|
border: none;
|
||||||
resize: none;
|
resize: none;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
padding-left: 11px;
|
||||||
color: $ls-color-gray--very-dark;
|
color: $ls-color-gray--very-dark;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
6
resources/assets/sass/pages/reports.scss
vendored
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
.report-view-button {
|
.report-view-button {
|
||||||
display: none;
|
display: none;
|
||||||
|
color: $btn-secondary-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.report-fields-container {
|
.report-fields-container {
|
||||||
@ -61,8 +62,13 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.report-submit-button-container {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.report-view-button {
|
.report-view-button {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
color: $btn-secondary-color !important;
|
||||||
justify-content: center
|
justify-content: center
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -72,6 +72,7 @@
|
|||||||
.wrapper {
|
.wrapper {
|
||||||
display: block;
|
display: block;
|
||||||
padding-top: 60px;
|
padding-top: 60px;
|
||||||
|
padding-bottom: 60px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.address {
|
.address {
|
||||||
@ -244,6 +245,8 @@
|
|||||||
margin-top: 35px;
|
margin-top: 35px;
|
||||||
border-bottom: 1px solid #EAF1FB;
|
border-bottom: 1px solid #EAF1FB;
|
||||||
padding: 0px 30px 0 30px;
|
padding: 0px 30px 0 30px;
|
||||||
|
page-break-before: avoid;
|
||||||
|
page-break-after: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table2 hr {
|
.table2 hr {
|
||||||
@ -257,7 +260,7 @@
|
|||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
tr.main-table-header td {
|
tr.main-table-header th {
|
||||||
border-bottom: 1px solid #EAF1FB;
|
border-bottom: 1px solid #EAF1FB;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
@ -284,28 +287,33 @@
|
|||||||
padding-bottom: 8px;
|
padding-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.padd2 {
|
||||||
|
padding-top: 2px;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
}
|
||||||
.table3 {
|
.table3 {
|
||||||
border: 1px solid #EAF1FB;
|
|
||||||
border-top: none;
|
border-top: none;
|
||||||
padding-right: 30px;
|
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 230px;
|
width: 630px;
|
||||||
height: 100px;
|
page-break-inside: avoid;
|
||||||
position: absolute;
|
page-break-before: auto;
|
||||||
right: -25;
|
page-break-after: auto;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-per-item-table3 {
|
.total-border-left {
|
||||||
border: 1px solid #EAF1FB;
|
border: 1px solid #E8E8E8!important;
|
||||||
border-top: none;
|
border-right: 0px !important;
|
||||||
padding-right: 30px;
|
padding-top: 0px;
|
||||||
box-sizing: border-box;
|
padding:8px !important;
|
||||||
width: 260px;
|
|
||||||
/* height: 100px; */
|
|
||||||
position: absolute;
|
|
||||||
right: -25;
|
|
||||||
}
|
}
|
||||||
|
.total-border-right {
|
||||||
|
border: 1px solid #E8E8E8!important;
|
||||||
|
border-left: 0px !important;
|
||||||
|
padding-top: 0px;
|
||||||
|
padding:8px !important;
|
||||||
|
|
||||||
|
}
|
||||||
.inv-item {
|
.inv-item {
|
||||||
border-color: #d9d9d9;
|
border-color: #d9d9d9;
|
||||||
}
|
}
|
||||||
@ -323,6 +331,30 @@
|
|||||||
color:rgba(0, 0, 0, 0.85);
|
color:rgba(0, 0, 0, 0.85);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.notes {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #595959;
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-left: 30px;
|
||||||
|
width: 442px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notes-label {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 22px;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
color: #040405;
|
||||||
|
width: 108px;
|
||||||
|
height: 19.87px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
@ -380,6 +412,7 @@
|
|||||||
<div style="clear: both;"></div>
|
<div style="clear: both;"></div>
|
||||||
</div>
|
</div>
|
||||||
@include('app.pdf.estimate.partials.table')
|
@include('app.pdf.estimate.partials.table')
|
||||||
|
@include('app.pdf.estimate.partials.notes')
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -74,6 +74,7 @@
|
|||||||
.wrapper {
|
.wrapper {
|
||||||
display: block;
|
display: block;
|
||||||
padding-top: 110px;
|
padding-top: 110px;
|
||||||
|
padding-bottom: 60px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.address {
|
.address {
|
||||||
@ -245,6 +246,8 @@
|
|||||||
margin-top: 200px;
|
margin-top: 200px;
|
||||||
border-bottom: 1px solid #EAF1FB;
|
border-bottom: 1px solid #EAF1FB;
|
||||||
padding: 0px 30px 0 30px;
|
padding: 0px 30px 0 30px;
|
||||||
|
page-break-before: avoid;
|
||||||
|
page-break-after: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table2 hr {
|
.table2 hr {
|
||||||
@ -258,7 +261,7 @@
|
|||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
tr.main-table-header td {
|
tr.main-table-header th {
|
||||||
border-bottom: 1px solid #EAF1FB;
|
border-bottom: 1px solid #EAF1FB;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
@ -295,27 +298,21 @@
|
|||||||
padding-bottom: 8px;
|
padding-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.padd2 {
|
||||||
|
padding-top: 2px;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
.table3 {
|
.table3 {
|
||||||
border: 1px solid #EAF1FB;
|
border: 1px solid #EAF1FB;
|
||||||
border-top: none;
|
border-top: none;
|
||||||
padding-right: 30px;
|
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 230px;
|
width: 630px;
|
||||||
height: 100px;
|
page-break-inside: avoid;
|
||||||
position: absolute;
|
page-break-before: auto;
|
||||||
right: -25;
|
page-break-after: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-per-item-table3 {
|
|
||||||
border: 1px solid #EAF1FB;
|
|
||||||
border-top: none;
|
|
||||||
padding-right: 30px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
width: 260px;
|
|
||||||
/* height: 100px; */
|
|
||||||
position: absolute;
|
|
||||||
right: -25;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inv-item {
|
.inv-item {
|
||||||
border-color: #d9d9d9;
|
border-color: #d9d9d9;
|
||||||
@ -361,6 +358,32 @@
|
|||||||
margin-bottom:1px;
|
margin-bottom:1px;
|
||||||
margin-top:0;
|
margin-top:0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.notes {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #595959;
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-left: 30px;
|
||||||
|
width: 442px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notes-label {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 22px;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
color: #040405;
|
||||||
|
width: 108px;
|
||||||
|
height: 19.87px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@ -402,6 +425,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@include('app.pdf.estimate.partials.table')
|
@include('app.pdf.estimate.partials.table')
|
||||||
|
@include('app.pdf.estimate.partials.notes')
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -80,6 +80,7 @@
|
|||||||
.wrapper {
|
.wrapper {
|
||||||
display: block;
|
display: block;
|
||||||
padding-top: 110px;
|
padding-top: 110px;
|
||||||
|
padding-bottom: 60px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.address {
|
.address {
|
||||||
@ -233,7 +234,7 @@
|
|||||||
.main-table-header {
|
.main-table-header {
|
||||||
border-bottom: 1px solid red;
|
border-bottom: 1px solid red;
|
||||||
}
|
}
|
||||||
tr.main-table-header td {
|
tr.main-table-header th {
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
@ -249,6 +250,8 @@
|
|||||||
margin-top: 188px;
|
margin-top: 188px;
|
||||||
border-bottom: 1px solid #EAF1FB;
|
border-bottom: 1px solid #EAF1FB;
|
||||||
padding: 0px 30px 0 30px;
|
padding: 0px 30px 0 30px;
|
||||||
|
page-break-before: avoid;
|
||||||
|
page-break-after: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table2 hr {
|
.table2 hr {
|
||||||
@ -284,26 +287,19 @@
|
|||||||
padding-bottom: 8px;
|
padding-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table3 {
|
.padd2 {
|
||||||
border: 1px solid #EAF1FB;
|
padding-top: 2px;
|
||||||
border-top: none;
|
padding-bottom: 2px;
|
||||||
padding-right: 30px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
width: 230px;
|
|
||||||
height: 100px;
|
|
||||||
position: absolute;
|
|
||||||
right: -25;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-per-item-table3 {
|
.table3 {
|
||||||
border: 1px solid #EAF1FB;
|
border: 1px solid #EAF1FB;
|
||||||
border-top: none;
|
border-top: none;
|
||||||
padding-right: 30px;
|
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 260px;
|
width: 630px;
|
||||||
/* height: 100px; */
|
page-break-inside: avoid;
|
||||||
position: absolute;
|
page-break-before: auto;
|
||||||
right: -25;
|
page-break-after: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
td.estimate-total1 {
|
td.estimate-total1 {
|
||||||
@ -370,6 +366,32 @@
|
|||||||
border-bottom:1px solid #E8E8E8;
|
border-bottom:1px solid #E8E8E8;
|
||||||
border-top:1px solid #E8E8E8;
|
border-top:1px solid #E8E8E8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.notes {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #595959;
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-left: 30px;
|
||||||
|
width: 442px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notes-label {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 22px;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
color: #040405;
|
||||||
|
width: 108px;
|
||||||
|
height: 19.87px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@ -427,6 +449,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@include('app.pdf.estimate.partials.table')
|
@include('app.pdf.estimate.partials.table')
|
||||||
|
@include('app.pdf.estimate.partials.notes')
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -0,0 +1,6 @@
|
|||||||
|
<div class="notes">
|
||||||
|
<div class="notes-label">
|
||||||
|
Notes
|
||||||
|
</div>
|
||||||
|
{{$estimate->notes}}
|
||||||
|
</div>
|
||||||
@ -1,47 +1,54 @@
|
|||||||
<table width="100%" class="table2" cellspacing="0" border="0">
|
<table width="100%" class="table2" cellspacing="0" border="0">
|
||||||
<tr class="main-table-header">
|
<tr class="main-table-header">
|
||||||
<td width="40%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 0px">Items</td>
|
@if($estimate->discount_per_item === 'NO')
|
||||||
<td width="17%" class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">Quantity</td>
|
<th width="80%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 0px">Items</th>
|
||||||
<td width="18%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 40px">Price</td>
|
@else
|
||||||
<td width="10%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 10px">Discount</td>
|
<th width="40%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 0px">Items</th>
|
||||||
<td width="15%" class="ItemTableHeader" style="text-align: right; color: #55547A;">Amount</td>
|
@endif
|
||||||
|
<th width="17%" class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">Quantity</th>
|
||||||
|
<th width="18%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 40px">Price</th>
|
||||||
|
@if($estimate->discount_per_item === 'YES')
|
||||||
|
<th width="10%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 10px">Discount</th>
|
||||||
|
@endif
|
||||||
|
<th width="15%" class="ItemTableHeader" style="text-align: right; color: #55547A;">Amount</th>
|
||||||
</tr>
|
</tr>
|
||||||
@foreach ($estimate->items as $item)
|
@foreach ($estimate->items as $item)
|
||||||
<tr class="item-details">
|
<tr class="item-details">
|
||||||
<td width="40%" class="inv-item items" style="text-align: left; color: #040405;padding-left: 0px">
|
<td class="inv-item items" style="text-align: left; color: #040405;padding-left: 0px">
|
||||||
<span>{{ $item->name }}</span><br>
|
<span>{{ $item->name }}</span><br>
|
||||||
<span style="text-align: left; color: #595959; font-size: 9px; font-weight:300; line-height: 12px;">{{ $item->description }}</span>
|
<span style="text-align: left; color: #595959; font-size: 9px; font-weight:300; line-height: 12px;">{{ $item->description }}</span>
|
||||||
</td>
|
</td>
|
||||||
<td width="17%" class="inv-item items" style="text-align: right; color: #040405; padding-right: 20px">{{$item->quantity}}</td>
|
<td class="inv-item items" style="text-align: right; color: #040405; padding-right: 20px">{{$item->quantity}}</td>
|
||||||
<td width="18%" class="inv-item items" style="text-align: left; color: #040405; padding-left: 40px">{{$item->price/100}}</td>
|
<td class="inv-item items" style="text-align: left; color: #040405; padding-left: 40px">{{$item->price/100}}</td>
|
||||||
{{-- <td width="10%" class="inv-item items" style="text-align: left; color: #040405; padding-left: 10px">{{$item->discount/100}}%</td> --}}
|
@if($estimate->discount_per_item === 'YES')
|
||||||
<td width="10%" class="inv-item items" style="text-align: left; color: #040405; padding-left: 10px">
|
<td class="inv-item items" style="text-align: left; color: #040405; padding-left: 10px">
|
||||||
@if($item->discount_type === 'fixed')
|
@if($item->discount_type === 'fixed')
|
||||||
{{$item->discount_val/100}}
|
{{$item->discount_val/100}}
|
||||||
@endif
|
@endif
|
||||||
@if($item->discount_type === 'percentage')
|
@if($item->discount_type === 'percentage')
|
||||||
{{$item->discount}}%
|
{{$item->discount}}%
|
||||||
@endif
|
@endif
|
||||||
</td>
|
</td>
|
||||||
<td width="15%" class="inv-item items" style="text-align: right; color: #040405">{{$item->total/100}}</td>
|
@endif
|
||||||
|
<td class="inv-item items" style="text-align: right; color: #040405">{{$item->total/100}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@endforeach
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<table width="100%" cellspacing="0px" border="0" class="text-per-item-table3 @if(count($estimate->items) > 12) page-break @endif">
|
<table width="100%" style="margin-left:420px" cellspacing="0px" border="0" class="table3">
|
||||||
<tr>
|
<tr>
|
||||||
<td class="no-borde" style="color: #55547A; padding-left:10px; line-height: 18px; font-size:12px;">Subtotal</td>
|
<td class="no-borde" style="color: #55547A; padding-left:10px; font-size:12px;">Subtotal</td>
|
||||||
<td class="no-border items"
|
<td class="no-border items"
|
||||||
style="padding-right:10px; text-align: right; line-height: 18px; font-size:12px; color: #040405; font-weight: 500;">{!! format_money_pdf($estimate->sub_total) !!}</td>
|
style="padding-right:10px; text-align: right; font-size:12px; color: #040405; font-weight: 500;">{!! format_money_pdf($estimate->sub_total) !!}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
@if ($estimate->tax_per_item === 'YES')
|
@if ($estimate->tax_per_item === 'YES')
|
||||||
@for ($i = 0; $i < count($labels); $i++)
|
@for ($i = 0; $i < count($labels); $i++)
|
||||||
<tr>
|
<tr>
|
||||||
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; line-height: 18px; color: #55547A;">
|
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
|
||||||
{{$labels[$i]}}
|
{{$labels[$i]}}
|
||||||
</td>
|
</td>
|
||||||
<td class="no-border items padd8" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; line-height: 18px; color: #040405">
|
<td class="no-border items padd2" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
|
||||||
{!! format_money_pdf($taxes[$i]) !!}
|
{!! format_money_pdf($taxes[$i]) !!}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -49,10 +56,10 @@
|
|||||||
@else
|
@else
|
||||||
@foreach ($estimate->taxes as $tax)
|
@foreach ($estimate->taxes as $tax)
|
||||||
<tr>
|
<tr>
|
||||||
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; line-height: 18px; color: #55547A;">
|
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
|
||||||
{{$tax->name.' ('.$tax->percent.'%)'}}
|
{{$tax->name.' ('.$tax->percent.'%)'}}
|
||||||
</td>
|
</td>
|
||||||
<td class="no-border items padd8" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; line-height: 18px; color: #040405">
|
<td class="no-border items padd2" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
|
||||||
{!! format_money_pdf($tax->amount) !!}
|
{!! format_money_pdf($tax->amount) !!}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -62,29 +69,33 @@
|
|||||||
@if ($estimate->discount_per_item === 'NO')
|
@if ($estimate->discount_per_item === 'NO')
|
||||||
<tr>
|
<tr>
|
||||||
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
|
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
|
||||||
Discount
|
Discount ({{$estimate->discount}}%)
|
||||||
</td>
|
</td>
|
||||||
<td class="no-border items padd8" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
|
<td class="no-border items padd2" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
|
||||||
@if($estimate->discount_type === 'fixed')
|
@if($estimate->discount_type === 'fixed')
|
||||||
{!! format_money_pdf($estimate->discount_val) !!}
|
{!! format_money_pdf($estimate->discount_val) !!}
|
||||||
@endif
|
@endif
|
||||||
@if($estimate->discount_type === 'percentage')
|
@if($estimate->discount_type === 'percentage')
|
||||||
{{$estimate->discount}}% ({!! format_money_pdf($estimate->discount_val) !!})
|
{!! format_money_pdf($estimate->discount_val) !!}
|
||||||
@endif
|
@endif
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endif
|
@endif
|
||||||
<tr >
|
<tr>
|
||||||
|
<td style="padding:3px 0px"></td>
|
||||||
|
<td style="padding:3px 0px"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
<td class="no-border total-border-left"
|
<td class="no-border total-border-left"
|
||||||
style="padding-left:10px; padding-bottom:10px; text-align:left; padding-top:20px; font-size:12px; line-height: 18px; color: #55547A;"
|
style="padding-left:10px; padding-bottom:10px; text-align:left; padding-top:20px; font-size:12px; color: #55547A;"
|
||||||
>
|
>
|
||||||
<label class="total-bottom"> Total </label>
|
<label class="total-bottom"> Total </label>
|
||||||
</td>
|
</td>
|
||||||
<td
|
<td
|
||||||
class="no-border total-border-right items padd8"
|
class="no-border total-border-right items padd8"
|
||||||
style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; line-height: 18px; padding-top:20px; color: #5851DB"
|
style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; padding-top:20px; color: #5851DB"
|
||||||
>
|
>
|
||||||
{!! format_money_pdf($estimate->total)!!}
|
{!! format_money_pdf($estimate->total)!!}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@ -72,6 +72,7 @@
|
|||||||
.wrapper {
|
.wrapper {
|
||||||
display: block;
|
display: block;
|
||||||
padding-top: 60px;
|
padding-top: 60px;
|
||||||
|
padding-bottom: 60px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.address {
|
.address {
|
||||||
@ -244,6 +245,8 @@
|
|||||||
margin-top: 35px;
|
margin-top: 35px;
|
||||||
border-bottom: 1px solid #EAF1FB;
|
border-bottom: 1px solid #EAF1FB;
|
||||||
padding: 0px 30px 0 30px;
|
padding: 0px 30px 0 30px;
|
||||||
|
page-break-before: avoid;
|
||||||
|
page-break-after: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table2 hr {
|
.table2 hr {
|
||||||
@ -257,7 +260,7 @@
|
|||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
tr.main-table-header td {
|
tr.main-table-header th {
|
||||||
border-bottom: 1px solid #EAF1FB;
|
border-bottom: 1px solid #EAF1FB;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
@ -284,26 +287,36 @@
|
|||||||
padding-bottom: 8px;
|
padding-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table3 {
|
.padd2 {
|
||||||
border: 1px solid #EAF1FB;
|
padding-top: 2px;
|
||||||
border-top: none;
|
padding-bottom: 2px;
|
||||||
padding-right: 30px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
width: 230px;
|
|
||||||
height: 100px;
|
|
||||||
position: absolute;
|
|
||||||
right: -25;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-per-item-table3 {
|
.table3 {
|
||||||
border: 1px solid #EAF1FB;
|
/* border: 1px solid #EAF1FB; */
|
||||||
border-top: none;
|
border-top: none;
|
||||||
padding-right: 30px;
|
/* padding-right: 30px; */
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 260px;
|
width: 630px;
|
||||||
/* height: 100px; */
|
/* position: absolute;
|
||||||
position: absolute;
|
right: -25; */
|
||||||
right: -25;
|
page-break-inside: avoid;
|
||||||
|
page-break-before: auto;
|
||||||
|
page-break-after: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.total-border-left {
|
||||||
|
border: 1px solid #E8E8E8!important;
|
||||||
|
border-right: 0px !important;
|
||||||
|
padding-top: 0px;
|
||||||
|
padding:8px !important;
|
||||||
|
}
|
||||||
|
.total-border-right {
|
||||||
|
border: 1px solid #E8E8E8!important;
|
||||||
|
border-left: 0px !important;
|
||||||
|
padding-top: 0px;
|
||||||
|
padding:8px !important;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.inv-item {
|
.inv-item {
|
||||||
@ -323,6 +336,30 @@
|
|||||||
color:rgba(0, 0, 0, 0.85);
|
color:rgba(0, 0, 0, 0.85);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.notes {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #595959;
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-left: 30px;
|
||||||
|
width: 442px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notes-label {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 22px;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
color: #040405;
|
||||||
|
width: 108px;
|
||||||
|
height: 19.87px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
@ -380,7 +417,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div style="clear: both;"></div>
|
<div style="clear: both;"></div>
|
||||||
</div>
|
</div>
|
||||||
@include('app.pdf.invoice.partials.table')
|
<div style="position:relative">
|
||||||
|
@include('app.pdf.invoice.partials.table')
|
||||||
|
</div>
|
||||||
|
@include('app.pdf.invoice.partials.notes')
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -74,6 +74,7 @@
|
|||||||
.wrapper {
|
.wrapper {
|
||||||
display: block;
|
display: block;
|
||||||
padding-top: 110px;
|
padding-top: 110px;
|
||||||
|
padding-bottom: 60px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.address {
|
.address {
|
||||||
@ -245,6 +246,8 @@
|
|||||||
margin-top: 200px;
|
margin-top: 200px;
|
||||||
border-bottom: 1px solid #EAF1FB;
|
border-bottom: 1px solid #EAF1FB;
|
||||||
padding: 0px 30px 0 30px;
|
padding: 0px 30px 0 30px;
|
||||||
|
page-break-before: avoid;
|
||||||
|
page-break-after: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table2 hr {
|
.table2 hr {
|
||||||
@ -258,7 +261,7 @@
|
|||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
tr.main-table-header td {
|
tr.main-table-header th {
|
||||||
border-bottom: 1px solid #EAF1FB;
|
border-bottom: 1px solid #EAF1FB;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
@ -295,15 +298,19 @@
|
|||||||
padding-bottom: 8px;
|
padding-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.padd2 {
|
||||||
|
padding-top: 2px;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
.table3 {
|
.table3 {
|
||||||
border: 1px solid #EAF1FB;
|
border: 1px solid #EAF1FB;
|
||||||
border-top: none;
|
border-top: none;
|
||||||
padding-right: 30px;
|
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 230px;
|
width: 630px;
|
||||||
height: 100px;
|
page-break-inside: avoid;
|
||||||
position: absolute;
|
page-break-before: auto;
|
||||||
right: -25;
|
page-break-after: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-per-item-table3 {
|
.text-per-item-table3 {
|
||||||
@ -361,6 +368,32 @@
|
|||||||
margin-bottom:1px;
|
margin-bottom:1px;
|
||||||
margin-top:0;
|
margin-top:0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.notes {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #595959;
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-left: 30px;
|
||||||
|
width: 442px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notes-label {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 22px;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
color: #040405;
|
||||||
|
width: 108px;
|
||||||
|
height: 19.87px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@ -403,6 +436,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@include('app.pdf.invoice.partials.table')
|
@include('app.pdf.invoice.partials.table')
|
||||||
|
@include('app.pdf.invoice.partials.notes')
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -80,6 +80,7 @@
|
|||||||
.wrapper {
|
.wrapper {
|
||||||
display: block;
|
display: block;
|
||||||
padding-top: 110px;
|
padding-top: 110px;
|
||||||
|
padding-bottom: 60px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.address {
|
.address {
|
||||||
@ -233,7 +234,7 @@
|
|||||||
.main-table-header {
|
.main-table-header {
|
||||||
border-bottom: 1px solid red;
|
border-bottom: 1px solid red;
|
||||||
}
|
}
|
||||||
tr.main-table-header td {
|
tr.main-table-header th {
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
@ -249,6 +250,8 @@
|
|||||||
margin-top: 188px;
|
margin-top: 188px;
|
||||||
border-bottom: 1px solid #EAF1FB;
|
border-bottom: 1px solid #EAF1FB;
|
||||||
padding: 0px 30px 0 30px;
|
padding: 0px 30px 0 30px;
|
||||||
|
page-break-before: avoid;
|
||||||
|
page-break-after: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.table2 hr {
|
.table2 hr {
|
||||||
@ -284,15 +287,19 @@
|
|||||||
padding-bottom: 8px;
|
padding-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.padd2 {
|
||||||
|
padding-top: 2px;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
.table3 {
|
.table3 {
|
||||||
border: 1px solid #EAF1FB;
|
border: 1px solid #EAF1FB;
|
||||||
border-top: none;
|
border-top: none;
|
||||||
padding-right: 30px;
|
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 230px;
|
width: 630px;
|
||||||
height: 100px;
|
page-break-inside: avoid;
|
||||||
position: absolute;
|
page-break-before: auto;
|
||||||
right: -25;
|
page-break-after: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-per-item-table3 {
|
.text-per-item-table3 {
|
||||||
@ -370,6 +377,32 @@
|
|||||||
border-bottom:1px solid #E8E8E8;
|
border-bottom:1px solid #E8E8E8;
|
||||||
border-top:1px solid #E8E8E8;
|
border-top:1px solid #E8E8E8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.notes {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #595959;
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-left: 30px;
|
||||||
|
width: 442px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notes-label {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 22px;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
color: #040405;
|
||||||
|
width: 108px;
|
||||||
|
height: 19.87px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@ -427,6 +460,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@include('app.pdf.invoice.partials.table')
|
@include('app.pdf.invoice.partials.table')
|
||||||
|
@include('app.pdf.invoice.partials.notes')
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
6
resources/views/app/pdf/invoice/partials/notes.blade.php
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<div class="notes">
|
||||||
|
<div class="notes-label">
|
||||||
|
Notes
|
||||||
|
</div>
|
||||||
|
{{$invoice->notes}}
|
||||||
|
</div>
|
||||||
@ -1,46 +1,54 @@
|
|||||||
<table width="100%" class="table2" cellspacing="0" border="0">
|
<table width="100%" class="table2" cellspacing="0" border="0">
|
||||||
<tr class="main-table-header">
|
<tr class="main-table-header">
|
||||||
<td width="40%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 0px">Items</td>
|
@if($invoice->discount_per_item === 'NO')
|
||||||
<td width="17%" class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">Quantity</td>
|
<th width="80%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 0px">Items</th>
|
||||||
<td width="18%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 40px">Price</td>
|
@else
|
||||||
<td width="10%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 10px">Discount</td>
|
<th width="40%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 0px">Items</th>
|
||||||
<td width="15%" class="ItemTableHeader" style="text-align: right; color: #55547A;">Amount</td>
|
@endif
|
||||||
|
<th width="17%" class="ItemTableHeader" style="text-align: right; color: #55547A; padding-right: 20px">Quantity</th>
|
||||||
|
<th width="18%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 40px">Price</th>
|
||||||
|
@if($invoice->discount_per_item === 'YES')
|
||||||
|
<th width="10%" class="ItemTableHeader" style="text-align: left; color: #55547A; padding-left: 10px">Discount</th>
|
||||||
|
@endif
|
||||||
|
<th width="15%" class="ItemTableHeader" style="text-align: right; color: #55547A;">Amount</th>
|
||||||
</tr>
|
</tr>
|
||||||
@foreach ($invoice->items as $item)
|
@foreach ($invoice->items as $item)
|
||||||
<tr class="item-details">
|
<tr class="item-details">
|
||||||
<td width="40%" class="inv-item items" style="text-align: left; color: #040405;padding-left: 0px">
|
<td class="inv-item items" style="text-align: left; color: #040405;padding-left: 0px">
|
||||||
<span>{{ $item->name }}</span><br>
|
<span>{{ $item->name }}</span><br>
|
||||||
<span style="text-align: left; color: #595959; font-size: 9px; font-weight:300; line-height: 12px;">{{ $item->description }}</span>
|
<span style="text-align: left; color: #595959; font-size: 9px; font-weight:300; line-height: 12px;">{{ $item->description }}</span>
|
||||||
</td>
|
</td>
|
||||||
<td width="17%" class="inv-item items" style="text-align: right; color: #040405; padding-right: 20px">{{$item->quantity}}</td>
|
<td class="inv-item items" style="text-align: right; color: #040405; padding-right: 20px">{{$item->quantity}}</td>
|
||||||
<td width="18%" class="inv-item items" style="text-align: left; color: #040405; padding-left: 40px">{{$item->price/100}}</td>
|
<td class="inv-item items" style="text-align: left; color: #040405; padding-left: 40px">{{$item->price/100}}</td>
|
||||||
<td width="10%" class="inv-item items" style="text-align: left; color: #040405; padding-left: 10px">
|
@if($invoice->discount_per_item === 'YES')
|
||||||
@if($item->discount_type === 'fixed')
|
<td class="inv-item items" style="text-align: left; color: #040405; padding-left: 10px">
|
||||||
{{$item->discount_val/100}}
|
@if($item->discount_type === 'fixed')
|
||||||
@endif
|
{{$item->discount_val/100}}
|
||||||
@if($item->discount_type === 'percentage')
|
@endif
|
||||||
{{$item->discount}}%
|
@if($item->discount_type === 'percentage')
|
||||||
@endif
|
{{$item->discount}}%
|
||||||
</td>
|
@endif
|
||||||
<td width="15%" class="inv-item items" style="text-align: right; color: #040405">{{$item->total/100}}</td>
|
</td>
|
||||||
|
@endif
|
||||||
|
<td class="inv-item items" style="text-align: right; color: #040405">{{$item->total/100}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@endforeach
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<table width="100%" cellspacing="0px" border="0" class="text-per-item-table3 @if(count($invoice->items) > 12) page-break @endif">
|
<table width="100%" cellspacing="0px" style="margin-left:420px" border="0" class="table3 @if(count($invoice->items) > 12) page-break @endif">
|
||||||
<tr>
|
<tr>
|
||||||
<td class="no-borde" style="color: #55547A; padding-left:10px; line-height: 18px; font-size:12px;">Subtotal</td>
|
<td class="no-borde" style="color: #55547A; padding-left:10px; font-size:12px;">Subtotal</td>
|
||||||
<td class="no-border items"
|
<td class="no-border items"
|
||||||
style="padding-right:10px; text-align: right; line-height: 18px; font-size:12px; color: #040405; font-weight: 500;">{!! format_money_pdf($invoice->sub_total) !!}</td>
|
style="padding-right:10px; text-align: right; font-size:12px; color: #040405; font-weight: 500;">{!! format_money_pdf($invoice->sub_total) !!}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
@if ($invoice->tax_per_item === 'YES')
|
@if ($invoice->tax_per_item === 'YES')
|
||||||
@for ($i = 0; $i < count($labels); $i++)
|
@for ($i = 0; $i < count($labels); $i++)
|
||||||
<tr>
|
<tr>
|
||||||
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; line-height: 18px; color: #55547A;">
|
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
|
||||||
{{$labels[$i]}}
|
{{$labels[$i]}}
|
||||||
</td>
|
</td>
|
||||||
<td class="no-border items padd8" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; line-height: 18px; color: #040405">
|
<td class="no-border items padd2" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
|
||||||
{!! format_money_pdf($taxes[$i]) !!}
|
{!! format_money_pdf($taxes[$i]) !!}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -48,10 +56,10 @@
|
|||||||
@else
|
@else
|
||||||
@foreach ($invoice->taxes as $tax)
|
@foreach ($invoice->taxes as $tax)
|
||||||
<tr>
|
<tr>
|
||||||
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; line-height: 18px; color: #55547A;">
|
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
|
||||||
{{$tax->name.' ('.$tax->percent.'%)'}}
|
{{$tax->name.' ('.$tax->percent.'%)'}}
|
||||||
</td>
|
</td>
|
||||||
<td class="no-border items padd8" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; line-height: 18px; color: #040405">
|
<td class="no-border items padd2" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
|
||||||
{!! format_money_pdf($tax->amount) !!}
|
{!! format_money_pdf($tax->amount) !!}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -61,27 +69,31 @@
|
|||||||
@if ($invoice->discount_per_item === 'NO')
|
@if ($invoice->discount_per_item === 'NO')
|
||||||
<tr>
|
<tr>
|
||||||
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
|
<td class="no-border" style="padding-left:10px; text-align:left; font-size:12px; color: #55547A;">
|
||||||
Discount
|
Discount ({{$invoice->discount}}%)
|
||||||
</td>
|
</td>
|
||||||
<td class="no-border items padd8" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
|
<td class="no-border items padd2" style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; color: #040405">
|
||||||
@if($invoice->discount_type === 'fixed')
|
@if($invoice->discount_type === 'fixed')
|
||||||
{!! format_money_pdf($invoice->discount_val) !!}
|
{!! format_money_pdf($invoice->discount_val) !!}
|
||||||
@endif
|
@endif
|
||||||
@if($invoice->discount_type === 'percentage')
|
@if($invoice->discount_type === 'percentage')
|
||||||
{{$invoice->discount}}% ({!! format_money_pdf($invoice->discount_val) !!})
|
{!! format_money_pdf($invoice->discount_val) !!}
|
||||||
@endif
|
@endif
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endif
|
@endif
|
||||||
<tr style="border: 1px solid;" >
|
<tr>
|
||||||
|
<td style="padding:3px 0px"></td>
|
||||||
|
<td style="padding:3px 0px"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
<td class="no-border total-border-left"
|
<td class="no-border total-border-left"
|
||||||
style="padding-left:10px; padding-bottom:10px; text-align:left; padding-top:20px; font-size:12px; line-height: 18px; color: #55547A;"
|
style="padding-left:10px; padding-bottom:10px; text-align:left; padding-top:20px; font-size:12px; color: #55547A;"
|
||||||
>
|
>
|
||||||
<label class="total-bottom"> Total </label>
|
<label class="total-bottom"> Total </label>
|
||||||
</td>
|
</td>
|
||||||
<td
|
<td
|
||||||
class="no-border total-border-right items padd8"
|
class="no-border total-border-right items padd8"
|
||||||
style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; line-height: 18px; padding-top:20px; color: #5851DB"
|
style="padding-right:10px; font-weight: 500; text-align: right; font-size:12px; padding-top:20px; color: #5851DB"
|
||||||
>
|
>
|
||||||
{!! format_money_pdf($invoice->total)!!}
|
{!! format_money_pdf($invoice->total)!!}
|
||||||
</td>
|
</td>
|
||||||
|
|||||||