mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2024-12-01 12:24:28 +01:00
Merge branch 'dev' for release 5.3.0
This commit is contained in:
commit
1b6db70a43
@ -1,5 +1,12 @@
|
|||||||
# Changelog Fab-manager
|
# Changelog Fab-manager
|
||||||
|
|
||||||
|
# v5.3.0 2021 December 29
|
||||||
|
|
||||||
|
- Ability to configure multiple VAT rates, per kind of invoiced item
|
||||||
|
- Refactored the extended prices frontend code to allow future customization
|
||||||
|
- Fix a bug: the amount label in not correctly shown in the extended prices modal
|
||||||
|
- Fix a bug: `extended_prices_in_same_day` apply the extended prices to each days
|
||||||
|
|
||||||
## v5.2.0 2021 December 23
|
## v5.2.0 2021 December 23
|
||||||
|
|
||||||
- Ability to configure prices for spaces by time slots different than the default hourly rate
|
- Ability to configure prices for spaces by time slots different than the default hourly rate
|
||||||
|
@ -70,6 +70,8 @@ class API::ExportsController < API::ApiController
|
|||||||
case type
|
case type
|
||||||
when 'acd'
|
when 'acd'
|
||||||
export = export.where('created_at > ?', Invoice.maximum('updated_at'))
|
export = export.where('created_at > ?', Invoice.maximum('updated_at'))
|
||||||
|
when 'vat'
|
||||||
|
export = export.where('created_at > ?', Invoice.maximum('updated_at'))
|
||||||
else
|
else
|
||||||
raise ArgumentError, "Unknown type accounting/#{type}"
|
raise ArgumentError, "Unknown type accounting/#{type}"
|
||||||
end
|
end
|
||||||
|
@ -36,7 +36,7 @@ class API::PricesController < API::ApiController
|
|||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
authorize @price
|
authorize @price
|
||||||
@price.destroy
|
@price.safe_destroy
|
||||||
head :no_content
|
head :no_content
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -12,4 +12,5 @@ export default class SpaceAPI {
|
|||||||
const res: AxiosResponse<Space> = await apiClient.get(`/api/spaces/${id}`);
|
const res: AxiosResponse<Space> = await apiClient.get(`/api/spaces/${id}`);
|
||||||
return res?.data;
|
return res?.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -64,8 +64,8 @@ export const ConfigurePacksButton: React.FC<ConfigurePacksButtonProps> = ({ pack
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="configure-group">
|
<div className="configure-packs-button">
|
||||||
<button className="configure-group-button" onClick={toggleShowList}>
|
<button className="packs-button" onClick={toggleShowList}>
|
||||||
<i className="fas fa-box" />
|
<i className="fas fa-box" />
|
||||||
</button>
|
</button>
|
||||||
{showList && <FabPopover title={t('app.admin.configure_packs_button.packs')} headerButton={renderAddButton()} className="fab-popover__right">
|
{showList && <FabPopover title={t('app.admin.configure_packs_button.packs')} headerButton={renderAddButton()} className="fab-popover__right">
|
||||||
@ -73,7 +73,7 @@ export const ConfigurePacksButton: React.FC<ConfigurePacksButtonProps> = ({ pack
|
|||||||
{packs?.map(p =>
|
{packs?.map(p =>
|
||||||
<li key={p.id} className={p.disabled ? 'disabled' : ''}>
|
<li key={p.id} className={p.disabled ? 'disabled' : ''}>
|
||||||
{formatDuration(p.minutes)} - {FormatLib.price(p.amount)}
|
{formatDuration(p.minutes)} - {FormatLib.price(p.amount)}
|
||||||
<span className="group-actions">
|
<span className="pack-actions">
|
||||||
<EditPack onSuccess={handleSuccess} onError={onError} pack={p} />
|
<EditPack onSuccess={handleSuccess} onError={onError} pack={p} />
|
||||||
<DeletePack onSuccess={handleSuccess} onError={onError} pack={p} />
|
<DeletePack onSuccess={handleSuccess} onError={onError} pack={p} />
|
||||||
</span>
|
</span>
|
||||||
|
@ -42,8 +42,8 @@ const DeletePackComponent: React.FC<DeletePackProps> = ({ onSuccess, onError, pa
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="delete-group">
|
<div className="delete-pack">
|
||||||
<FabButton type='button' className="delete-group-button" icon={<i className="fa fa-trash" />} onClick={toggleDeletionModal} />
|
<FabButton type='button' className="remove-pack-button" icon={<i className="fa fa-trash" />} onClick={toggleDeletionModal} />
|
||||||
<FabModal title={t('app.admin.delete_pack.delete_pack')}
|
<FabModal title={t('app.admin.delete_pack.delete_pack')}
|
||||||
isOpen={deletionModal}
|
isOpen={deletionModal}
|
||||||
toggleModal={toggleDeletionModal}
|
toggleModal={toggleDeletionModal}
|
||||||
|
@ -54,15 +54,16 @@ export const EditPack: React.FC<EditPackProps> = ({ pack, onSuccess, onError })
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="edit-group">
|
<div className="edit-pack">
|
||||||
<FabButton type='button' icon={<i className="fas fa-edit" />} onClick={handleRequestEdit} />
|
<FabButton type='button' className="edit-pack-button" icon={<i className="fas fa-edit" />} onClick={handleRequestEdit} />
|
||||||
<FabModal isOpen={isOpen}
|
<FabModal isOpen={isOpen}
|
||||||
toggleModal={toggleModal}
|
toggleModal={toggleModal}
|
||||||
title={t('app.admin.edit_pack.edit_pack')}
|
title={t('app.admin.edit_pack.edit_pack')}
|
||||||
|
className="edit-pack-modal"
|
||||||
closeButton
|
closeButton
|
||||||
confirmButton={t('app.admin.edit_pack.confirm_changes')}
|
confirmButton={t('app.admin.edit_pack.confirm_changes')}
|
||||||
onConfirmSendFormId="edit-group">
|
onConfirmSendFormId="edit-pack">
|
||||||
{packData && <PackForm formId="edit-group" onSubmit={handleUpdate} pack={packData} />}
|
{packData && <PackForm formId="edit-pack" onSubmit={handleUpdate} pack={packData} />}
|
||||||
</FabModal>
|
</FabModal>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -107,7 +107,7 @@ const MachinesPricing: React.FC<MachinesPricingProps> = ({ onError, onSuccess })
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="pricing-list">
|
<div className="machines-pricing">
|
||||||
<FabAlert level="warning">
|
<FabAlert level="warning">
|
||||||
<p><HtmlTranslate trKey="app.admin.machines_pricing.prices_match_machine_hours_rates_html"/></p>
|
<p><HtmlTranslate trKey="app.admin.machines_pricing.prices_match_machine_hours_rates_html"/></p>
|
||||||
<p><HtmlTranslate trKey="app.admin.machines_pricing.prices_calculated_on_hourly_rate_html" options={{ DURATION: `${EXEMPLE_DURATION}`, RATE: examplePrice('hourly_rate'), PRICE: examplePrice('final_price') }} /></p>
|
<p><HtmlTranslate trKey="app.admin.machines_pricing.prices_calculated_on_hourly_rate_html" options={{ DURATION: `${EXEMPLE_DURATION}`, RATE: examplePrice('hourly_rate'), PRICE: examplePrice('final_price') }} /></p>
|
||||||
|
@ -103,7 +103,7 @@ export const PackForm: React.FC<PackFormProps> = ({ formId, onSubmit, pack }) =>
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form id={formId} onSubmit={handleSubmit} className="group-form">
|
<form id={formId} onSubmit={handleSubmit} className="pack-form">
|
||||||
<label htmlFor="hours">{t('app.admin.pack_form.hours')} *</label>
|
<label htmlFor="hours">{t('app.admin.pack_form.hours')} *</label>
|
||||||
<FabInput id="hours"
|
<FabInput id="hours"
|
||||||
type="number"
|
type="number"
|
||||||
|
@ -28,7 +28,14 @@ export const ConfigureExtendedPriceButton: React.FC<ConfigureExtendedPriceButton
|
|||||||
const [showList, setShowList] = useState<boolean>(false);
|
const [showList, setShowList] = useState<boolean>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open/closes the popover listing the existing extended prices
|
* Return the number of minutes, user-friendly formatted
|
||||||
|
*/
|
||||||
|
const formatDuration = (minutes: number): string => {
|
||||||
|
return t('app.admin.configure_extended_prices_button.extended_price_DURATION', { DURATION: minutes });
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open/closes the popover listing the existing packs
|
||||||
*/
|
*/
|
||||||
const toggleShowList = (): void => {
|
const toggleShowList = (): void => {
|
||||||
setShowList(!showList);
|
setShowList(!showList);
|
||||||
@ -57,22 +64,22 @@ export const ConfigureExtendedPriceButton: React.FC<ConfigureExtendedPriceButton
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="configure-group">
|
<div className="configure-extended-prices-button">
|
||||||
<button className="configure-group-button" onClick={toggleShowList}>
|
<button className="extended-prices-button" onClick={toggleShowList}>
|
||||||
<i className="fas fa-stopwatch" />
|
<i className="fas fa-stopwatch" />
|
||||||
</button>
|
</button>
|
||||||
{showList && <FabPopover title={t('app.admin.configure_extendedPrices_button.extendedPrices')} headerButton={renderAddButton()} className="fab-popover__right">
|
{showList && <FabPopover title={t('app.admin.configure_extended_prices_button.extended_prices')} headerButton={renderAddButton()} className="fab-popover__right">
|
||||||
<ul>
|
<ul>
|
||||||
{extendedPrices?.map(extendedPrice =>
|
{extendedPrices?.map(extendedPrice =>
|
||||||
<li key={extendedPrice.id}>
|
<li key={extendedPrice.id}>
|
||||||
{extendedPrice.duration} {t('app.admin.calendar.minutes')} - {FormatLib.price(extendedPrice.amount)}
|
{formatDuration(extendedPrice.duration)} - {FormatLib.price(extendedPrice.amount)}
|
||||||
<span className="group-actions">
|
<span className="extended-prices-actions">
|
||||||
<EditExtendedPrice onSuccess={handleSuccess} onError={onError} price={extendedPrice} />
|
<EditExtendedPrice onSuccess={handleSuccess} onError={onError} price={extendedPrice} />
|
||||||
<DeleteExtendedPrice onSuccess={handleSuccess} onError={onError} price={extendedPrice} />
|
<DeleteExtendedPrice onSuccess={handleSuccess} onError={onError} price={extendedPrice} />
|
||||||
</span>
|
</span>
|
||||||
</li>)}
|
</li>)}
|
||||||
</ul>
|
</ul>
|
||||||
{extendedPrices?.length === 0 && <span>{t('app.admin.configure_extendedPrices_button.no_extendedPrices')}</span>}
|
{extendedPrices?.length === 0 && <span>{t('app.admin.configure_extended_prices_button.no_extended_prices')}</span>}
|
||||||
</FabPopover>}
|
</FabPopover>}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -43,24 +43,24 @@ export const CreateExtendedPrice: React.FC<CreateExtendedPriceProps> = ({ onSucc
|
|||||||
// create it on the API
|
// create it on the API
|
||||||
PriceAPI.create(newExtendedPrice)
|
PriceAPI.create(newExtendedPrice)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
onSuccess(t('app.admin.create_extendedPrice.extendedPrice_successfully_created'));
|
onSuccess(t('app.admin.create_extended_price.extended_price_successfully_created'));
|
||||||
toggleModal();
|
toggleModal();
|
||||||
})
|
})
|
||||||
.catch(error => onError(error));
|
.catch(error => onError(error));
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="create-pack">
|
<div className="create-extended-price">
|
||||||
<button className="add-pack-button" onClick={toggleModal}><i className="fas fa-plus"/></button>
|
<button className="add-price-button" onClick={toggleModal}><i className="fas fa-plus"/></button>
|
||||||
<FabModal isOpen={isOpen}
|
<FabModal isOpen={isOpen}
|
||||||
toggleModal={toggleModal}
|
toggleModal={toggleModal}
|
||||||
title={t('app.admin.create_extendedPrice.new_extendedPrice')}
|
title={t('app.admin.create_extended_price.new_extended_price')}
|
||||||
className="new-pack-modal"
|
className="new-extended-price-modal"
|
||||||
closeButton
|
closeButton
|
||||||
confirmButton={t('app.admin.create_extendedPrice.create_extendedPrice')}
|
confirmButton={t('app.admin.create_extended_price.create_extended_price')}
|
||||||
onConfirmSendFormId="new-extended-price">
|
onConfirmSendFormId="new-extended-price">
|
||||||
<FabAlert level="info">
|
<FabAlert level="info">
|
||||||
{t('app.admin.create_extendedPrice.new_extendedPrice_info', { TYPE: priceableType })}
|
{t('app.admin.create_extended_price.new_extended_price_info', { TYPE: priceableType })}
|
||||||
</FabAlert>
|
</FabAlert>
|
||||||
<ExtendedPriceForm formId="new-extended-price" onSubmit={handleSubmit} />
|
<ExtendedPriceForm formId="new-extended-price" onSubmit={handleSubmit} />
|
||||||
</FabModal>
|
</FabModal>
|
||||||
|
@ -33,23 +33,23 @@ export const DeleteExtendedPrice: React.FC<DeleteExtendedPriceProps> = ({ onSucc
|
|||||||
*/
|
*/
|
||||||
const onDeleteConfirmed = (): void => {
|
const onDeleteConfirmed = (): void => {
|
||||||
PriceAPI.destroy(price.id).then(() => {
|
PriceAPI.destroy(price.id).then(() => {
|
||||||
onSuccess(t('app.admin.delete_extendedPrice.extendedPrice_deleted'));
|
onSuccess(t('app.admin.delete_extended_price.extended_price_deleted'));
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
onError(t('app.admin.delete_extendedPrice.unable_to_delete') + error);
|
onError(t('app.admin.delete_extended_price.unable_to_delete') + error);
|
||||||
});
|
});
|
||||||
toggleDeletionModal();
|
toggleDeletionModal();
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="delete-group">
|
<div className="delete-extended-price">
|
||||||
<FabButton type='button' className="delete-group-button" icon={<i className="fa fa-trash" />} onClick={toggleDeletionModal} />
|
<FabButton type='button' className="remove-price-button" icon={<i className="fa fa-trash" />} onClick={toggleDeletionModal} />
|
||||||
<FabModal title={t('app.admin.delete_extendedPrice.delete_extendedPrice')}
|
<FabModal title={t('app.admin.delete_extended_price.delete_extended_price')}
|
||||||
isOpen={deletionModal}
|
isOpen={deletionModal}
|
||||||
toggleModal={toggleDeletionModal}
|
toggleModal={toggleDeletionModal}
|
||||||
closeButton={true}
|
closeButton={true}
|
||||||
confirmButton={t('app.admin.delete_extendedPrice.confirm_delete')}
|
confirmButton={t('app.admin.delete_extended_price.confirm_delete')}
|
||||||
onConfirm={onDeleteConfirmed}>
|
onConfirm={onDeleteConfirmed}>
|
||||||
<span>{t('app.admin.delete_extendedPrice.delete_confirmation')}</span>
|
<span>{t('app.admin.delete_extended_price.delete_confirmation')}</span>
|
||||||
</FabModal>
|
</FabModal>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -42,7 +42,7 @@ export const EditExtendedPrice: React.FC<EditExtendedPriceProps> = ({ price, onS
|
|||||||
const handleUpdate = (price: Price): void => {
|
const handleUpdate = (price: Price): void => {
|
||||||
PriceAPI.update(price)
|
PriceAPI.update(price)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
onSuccess(t('app.admin.edit_extendedPrice.extendedPrice_successfully_updated'));
|
onSuccess(t('app.admin.edit_extended_price.extended_price_successfully_updated'));
|
||||||
setExtendedPriceData(price);
|
setExtendedPriceData(price);
|
||||||
toggleModal();
|
toggleModal();
|
||||||
})
|
})
|
||||||
@ -50,15 +50,16 @@ export const EditExtendedPrice: React.FC<EditExtendedPriceProps> = ({ price, onS
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="edit-group">
|
<div className="edit-extended-price">
|
||||||
<FabButton type='button' icon={<i className="fas fa-edit" />} onClick={handleRequestEdit} />
|
<FabButton type='button' className="edit-price-button" icon={<i className="fas fa-edit" />} onClick={handleRequestEdit} />
|
||||||
<FabModal isOpen={isOpen}
|
<FabModal isOpen={isOpen}
|
||||||
toggleModal={toggleModal}
|
toggleModal={toggleModal}
|
||||||
title={t('app.admin.edit_extendedPrice.edit_extendedPrice')}
|
title={t('app.admin.edit_extended_price.edit_extended_price')}
|
||||||
|
className="edit-pack-modal"
|
||||||
closeButton
|
closeButton
|
||||||
confirmButton={t('app.admin.edit_extendedPrice.confirm_changes')}
|
confirmButton={t('app.admin.edit_extended_price.confirm_changes')}
|
||||||
onConfirmSendFormId="edit-group">
|
onConfirmSendFormId="edit-extended-price">
|
||||||
{extendedPriceData && <ExtendedPriceForm formId="edit-group" onSubmit={handleUpdate} price={extendedPriceData} />}
|
{extendedPriceData && <ExtendedPriceForm formId="edit-extended-price" onSubmit={handleUpdate} price={extendedPriceData} />}
|
||||||
</FabModal>
|
</FabModal>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -9,7 +9,7 @@ declare let Fablab: IFablab;
|
|||||||
|
|
||||||
interface ExtendedPriceFormProps {
|
interface ExtendedPriceFormProps {
|
||||||
formId: string,
|
formId: string,
|
||||||
onSubmit: (pack: Price) => void,
|
onSubmit: (price: Price) => void,
|
||||||
price?: Price,
|
price?: Price,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,8 +49,8 @@ export const ExtendedPriceForm: React.FC<ExtendedPriceFormProps> = ({ formId, on
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form id={formId} onSubmit={handleSubmit} className="group-form">
|
<form id={formId} onSubmit={handleSubmit} className="extended-price-form">
|
||||||
<label htmlFor="duration">{t('app.admin.calendar.minutes')} *</label>
|
<label htmlFor="duration">{t('app.admin.extended_price_form.duration')} *</label>
|
||||||
<FabInput id="duration"
|
<FabInput id="duration"
|
||||||
type="number"
|
type="number"
|
||||||
defaultValue={extendedPriceData?.duration || ''}
|
defaultValue={extendedPriceData?.duration || ''}
|
||||||
|
@ -101,16 +101,17 @@ const SpacesPricing: React.FC<SpacesPricingProps> = ({ onError, onSuccess }) =>
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="pricing-list">
|
<div className="spaces-pricing">
|
||||||
<FabAlert level="warning">
|
<FabAlert level="warning">
|
||||||
<p><HtmlTranslate trKey="app.admin.pricing.these_prices_match_space_hours_rates_html"/></p>
|
<p><HtmlTranslate trKey="app.admin.spaces_pricing.prices_match_space_hours_rates_html"/></p>
|
||||||
<p><HtmlTranslate trKey="app.admin.pricing.prices_calculated_on_hourly_rate_html" options={{ DURATION: `${EXEMPLE_DURATION}`, RATE: examplePrice('hourly_rate'), PRICE: examplePrice('final_price') }} /></p>
|
<p><HtmlTranslate trKey="app.admin.spaces_pricing.prices_calculated_on_hourly_rate_html" options={{ DURATION: `${EXEMPLE_DURATION}`, RATE: examplePrice('hourly_rate'), PRICE: examplePrice('final_price') }} /></p>
|
||||||
<p>{t('app.admin.pricing.you_can_override')}</p>
|
<p>{t('app.admin.spaces_pricing.you_can_override')}</p>
|
||||||
|
<p>{t('app.admin.spaces_pricing.extended_prices')}</p>
|
||||||
</FabAlert>
|
</FabAlert>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{t('app.admin.pricing.spaces')}</th>
|
<th>{t('app.admin.spaces_pricing.spaces')}</th>
|
||||||
{groups?.map(group => <th key={group.id} className="group-name">{group.name}</th>)}
|
{groups?.map(group => <th key={group.id} className="group-name">{group.name}</th>)}
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@ -92,6 +92,15 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
active: false,
|
active: false,
|
||||||
templateUrl: '/admin/invoices/settings/editVAT.html'
|
templateUrl: '/admin/invoices/settings/editVAT.html'
|
||||||
},
|
},
|
||||||
|
multiVAT: {
|
||||||
|
rateMachine: '',
|
||||||
|
rateSpace: '',
|
||||||
|
rateTraining: '',
|
||||||
|
rateEvent: '',
|
||||||
|
rateSubscription: '',
|
||||||
|
editTemplateUrl: '/admin/invoices/settings/editMultiVAT.html',
|
||||||
|
historyTemplateUrl: '/admin/invoices/settings/multiVATHistory.html'
|
||||||
|
},
|
||||||
text: {
|
text: {
|
||||||
content: ''
|
content: ''
|
||||||
},
|
},
|
||||||
@ -217,6 +226,14 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
// Is shown the modal dialog to select a payment gateway
|
// Is shown the modal dialog to select a payment gateway
|
||||||
$scope.openSelectGatewayModal = false;
|
$scope.openSelectGatewayModal = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the VAT rate applicable to the machine reservations
|
||||||
|
* @return {number}
|
||||||
|
*/
|
||||||
|
$scope.getMachineExampleRate = function () {
|
||||||
|
return $scope.invoice.multiVAT.rateMachine || $scope.invoice.VAT.rate;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the invoices ordering criterion to the one provided
|
* Change the invoices ordering criterion to the one provided
|
||||||
* @param orderBy {string} ordering criterion
|
* @param orderBy {string} ordering criterion
|
||||||
@ -446,6 +463,9 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
active () {
|
active () {
|
||||||
return $scope.invoice.VAT.active;
|
return $scope.invoice.VAT.active;
|
||||||
},
|
},
|
||||||
|
multiVAT () {
|
||||||
|
return $scope.invoice.multiVAT;
|
||||||
|
},
|
||||||
rateHistory () {
|
rateHistory () {
|
||||||
return Setting.get({ name: 'invoice_VAT-rate', history: true }).$promise;
|
return Setting.get({ name: 'invoice_VAT-rate', history: true }).$promise;
|
||||||
},
|
},
|
||||||
@ -453,13 +473,74 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
return Setting.get({ name: 'invoice_VAT-active', history: true }).$promise;
|
return Setting.get({ name: 'invoice_VAT-active', history: true }).$promise;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
controller: ['$scope', '$uibModalInstance', 'rate', 'active', 'rateHistory', 'activeHistory', function ($scope, $uibModalInstance, rate, active, rateHistory, activeHistory) {
|
controller: ['$scope', '$uibModalInstance', 'rate', 'active', 'rateHistory', 'activeHistory', 'multiVAT', function ($scope, $uibModalInstance, rate, active, rateHistory, activeHistory, multiVAT) {
|
||||||
$scope.rate = rate;
|
$scope.rate = rate;
|
||||||
$scope.isSelected = active;
|
$scope.isSelected = active;
|
||||||
$scope.history = [];
|
$scope.history = [];
|
||||||
|
|
||||||
$scope.ok = function () { $uibModalInstance.close({ rate: $scope.rate, active: $scope.isSelected }); };
|
$scope.ok = function () { $uibModalInstance.close({ rate: $scope.rate, active: $scope.isSelected }); };
|
||||||
$scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };
|
$scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };
|
||||||
|
$scope.editMultiVAT = function () {
|
||||||
|
const editMultiVATModalInstance = $uibModal.open({
|
||||||
|
animation: true,
|
||||||
|
templateUrl: multiVAT.editTemplateUrl,
|
||||||
|
size: 'lg',
|
||||||
|
resolve: {
|
||||||
|
rate () {
|
||||||
|
return $scope.rate;
|
||||||
|
},
|
||||||
|
multiVAT () {
|
||||||
|
return multiVAT;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
controller: ['$scope', '$uibModalInstance', 'rate', 'multiVAT', function ($scope, $uibModalInstance, rate, multiVAT) {
|
||||||
|
$scope.rate = rate;
|
||||||
|
$scope.multiVAT = multiVAT;
|
||||||
|
|
||||||
|
$scope.ok = function () { $uibModalInstance.close({ multiVAT: $scope.multiVAT }); };
|
||||||
|
$scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };
|
||||||
|
|
||||||
|
$scope.showMultiRateHistory = function (rateType) {
|
||||||
|
$uibModal.open({
|
||||||
|
animation: true,
|
||||||
|
templateUrl: multiVAT.historyTemplateUrl,
|
||||||
|
size: 'lg',
|
||||||
|
resolve: {
|
||||||
|
rateHistory () {
|
||||||
|
return Setting.get({ name: `invoice_VAT-rate_${rateType}`, history: true }).$promise;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
controller: ['$scope', '$uibModalInstance', 'rateHistory', function ($scope, $uibModalInstance, rateHistory) {
|
||||||
|
$scope.history = [];
|
||||||
|
|
||||||
|
$scope.cancel = function () { $uibModalInstance.dismiss('cancel'); };
|
||||||
|
|
||||||
|
const initialize = function () {
|
||||||
|
rateHistory.setting.history.forEach(function (rate) {
|
||||||
|
$scope.history.push({ date: rate.created_at, rate: rate.value, user: rate.user });
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
initialize();
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
return editMultiVATModalInstance.result.then(function (result) {
|
||||||
|
['Machine', 'Space', 'Training', 'Event', 'Subscription'].forEach(rateType => {
|
||||||
|
Setting.update({ name: `invoice_VAT-rate_${rateType}` }, { value: result.multiVAT[`rate${rateType}`] + '' }, function (data) {
|
||||||
|
return growl.success(_t('app.admin.invoices.VAT_rate_successfully_saved'));
|
||||||
|
}
|
||||||
|
, function (error) {
|
||||||
|
if (error.status === 304) return;
|
||||||
|
|
||||||
|
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_VAT_rate'));
|
||||||
|
console.error(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const initialize = function () {
|
const initialize = function () {
|
||||||
rateHistory.setting.history.forEach(function (rate) {
|
rateHistory.setting.history.forEach(function (rate) {
|
||||||
@ -943,6 +1024,11 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
$scope.invoice.text.content = settings.invoice_text;
|
$scope.invoice.text.content = settings.invoice_text;
|
||||||
$scope.invoice.VAT.rate = parseFloat(settings['invoice_VAT-rate']);
|
$scope.invoice.VAT.rate = parseFloat(settings['invoice_VAT-rate']);
|
||||||
$scope.invoice.VAT.active = (settings['invoice_VAT-active'] === 'true');
|
$scope.invoice.VAT.active = (settings['invoice_VAT-active'] === 'true');
|
||||||
|
$scope.invoice.multiVAT.rateMachine = settings['invoice_VAT-rate_Machine'] ? parseFloat(settings['invoice_VAT-rate_Machine']) : '';
|
||||||
|
$scope.invoice.multiVAT.rateSpace = settings['invoice_VAT-rate_Space'] ? parseFloat(settings['invoice_VAT-rate_Space']) : '';
|
||||||
|
$scope.invoice.multiVAT.rateTraining = settings['invoice_VAT-rate_Training'] ? parseFloat(settings['invoice_VAT-rate_Training']) : '';
|
||||||
|
$scope.invoice.multiVAT.rateEvent = settings['invoice_VAT-rate_Event'] ? parseFloat(settings['invoice_VAT-rate_Event']) : '';
|
||||||
|
$scope.invoice.multiVAT.rateSubscription = settings['invoice_VAT-rate_Subscription'] ? parseFloat(settings['invoice_VAT-rate_Subscription']) : '';
|
||||||
$scope.invoice.number.model = settings['invoice_order-nb'];
|
$scope.invoice.number.model = settings['invoice_order-nb'];
|
||||||
$scope.invoice.code.model = settings['invoice_code-value'];
|
$scope.invoice.code.model = settings['invoice_code-value'];
|
||||||
$scope.invoice.code.active = (settings['invoice_code-active'] === 'true');
|
$scope.invoice.code.active = (settings['invoice_code-active'] === 'true');
|
||||||
@ -1328,6 +1414,16 @@ Application.Controllers.controller('AccountingExportModalController', ['$scope',
|
|||||||
decimalSeparator: ',',
|
decimalSeparator: ',',
|
||||||
exportInvoicesAtZero: false,
|
exportInvoicesAtZero: false,
|
||||||
columns: ['journal_code', 'date', 'account_code', 'account_label', 'piece', 'line_label', 'debit_origin', 'credit_origin', 'debit_euro', 'credit_euro', 'lettering']
|
columns: ['journal_code', 'date', 'account_code', 'account_label', 'piece', 'line_label', 'debit_origin', 'credit_origin', 'debit_euro', 'credit_euro', 'lettering']
|
||||||
|
},
|
||||||
|
vat: {
|
||||||
|
format: 'csv',
|
||||||
|
encoding: 'UTF-8',
|
||||||
|
separator: ';',
|
||||||
|
dateFormat: '%Y-%m-%d',
|
||||||
|
labelMaxLength: 'N/A',
|
||||||
|
decimalSeparator: '.',
|
||||||
|
exportInvoicesAtZero: false,
|
||||||
|
columns: ['start_date', 'end_date', 'vat_rate', 'amount']
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1347,6 +1443,7 @@ Application.Controllers.controller('AccountingExportModalController', ['$scope',
|
|||||||
|
|
||||||
// binding to radio button "export to"
|
// binding to radio button "export to"
|
||||||
$scope.exportTarget = {
|
$scope.exportTarget = {
|
||||||
|
type: null,
|
||||||
software: null,
|
software: null,
|
||||||
startDate: null,
|
startDate: null,
|
||||||
endDate: null,
|
endDate: null,
|
||||||
|
@ -20,6 +20,11 @@ export enum SettingName {
|
|||||||
InvoiceOrderNb = 'invoice_order-nb',
|
InvoiceOrderNb = 'invoice_order-nb',
|
||||||
InvoiceVATActive = 'invoice_VAT-active',
|
InvoiceVATActive = 'invoice_VAT-active',
|
||||||
InvoiceVATRate = 'invoice_VAT-rate',
|
InvoiceVATRate = 'invoice_VAT-rate',
|
||||||
|
InvoiceVATRateMachine = 'invoice_VAT-rate_Machine',
|
||||||
|
InvoiceVATRateTraining = 'invoice_VAT-rate_Training',
|
||||||
|
InvoiceVATRateSpace = 'invoice_VAT-rate_Space',
|
||||||
|
InvoiceVATRateEvent = 'invoice_VAT-rate_Event',
|
||||||
|
InvoiceVATRateSubscription = 'invoice_VAT-rate_Subscription',
|
||||||
InvoiceText = 'invoice_text',
|
InvoiceText = 'invoice_text',
|
||||||
InvoiceLegals = 'invoice_legals',
|
InvoiceLegals = 'invoice_legals',
|
||||||
BookingWindowStart = 'booking_window_start',
|
BookingWindowStart = 'booking_window_start',
|
||||||
|
@ -869,7 +869,8 @@ angular.module('application.router', ['ui.router'])
|
|||||||
resolve: {
|
resolve: {
|
||||||
settings: ['Setting', function (Setting) {
|
settings: ['Setting', function (Setting) {
|
||||||
return Setting.query({
|
return Setting.query({
|
||||||
names: "['invoice_legals', 'invoice_text', 'invoice_VAT-rate', 'invoice_VAT-active', 'invoice_order-nb', 'invoice_code-value', " +
|
names: "['invoice_legals', 'invoice_text', 'invoice_VAT-rate', 'invoice_VAT-rate_Machine', 'invoice_VAT-rate_Training', 'invoice_VAT-rate_Space', " +
|
||||||
|
"'invoice_VAT-rate_Event', 'invoice_VAT-rate_Subscription', 'invoice_VAT-active', 'invoice_order-nb', 'invoice_code-value', " +
|
||||||
"'invoice_code-active', 'invoice_reference', 'invoice_logo', 'accounting_journal_code', 'accounting_card_client_code', " +
|
"'invoice_code-active', 'invoice_reference', 'invoice_logo', 'accounting_journal_code', 'accounting_card_client_code', " +
|
||||||
"'accounting_card_client_label', 'accounting_wallet_client_code', 'accounting_wallet_client_label', 'invoicing_module', " +
|
"'accounting_card_client_label', 'accounting_wallet_client_code', 'accounting_wallet_client_label', 'invoicing_module', " +
|
||||||
"'accounting_other_client_code', 'accounting_other_client_label', 'accounting_wallet_code', 'accounting_wallet_label', " +
|
"'accounting_other_client_code', 'accounting_other_client_label', 'accounting_wallet_code', 'accounting_wallet_label', " +
|
||||||
|
@ -57,12 +57,18 @@
|
|||||||
@import "modules/machines/machines-filters";
|
@import "modules/machines/machines-filters";
|
||||||
@import "modules/machines/required-training-modal";
|
@import "modules/machines/required-training-modal";
|
||||||
@import "modules/user/avatar";
|
@import "modules/user/avatar";
|
||||||
@import "modules/pricing/pricing-list";
|
|
||||||
@import "modules/pricing/editable-price";
|
@import "modules/pricing/editable-price";
|
||||||
@import "modules/pricing/configure-group-button";
|
@import "modules/pricing/machines/machines-pricing";
|
||||||
@import "modules/pricing/group-form";
|
@import "modules/pricing/machines/configure-packs-button";
|
||||||
@import "modules/pricing/delete-group";
|
@import "modules/pricing/machines/pack-form";
|
||||||
@import "modules/pricing/edit-group";
|
@import "modules/pricing/machines/delete-pack";
|
||||||
|
@import "modules/pricing/machines/edit-pack";
|
||||||
|
@import "modules/pricing/machines/create-pack";
|
||||||
|
@import "modules/pricing/spaces/configure-extended-prices-button";
|
||||||
|
@import "modules/pricing/spaces/create-extended-price";
|
||||||
|
@import "modules/pricing/spaces/delete-extended-price";
|
||||||
|
@import "modules/pricing/spaces/edit-extended-price";
|
||||||
|
@import "modules/pricing/spaces/spaces-pricing";
|
||||||
@import "modules/settings/check-list-setting";
|
@import "modules/settings/check-list-setting";
|
||||||
@import "modules/prepaid-packs/propose-packs-modal";
|
@import "modules/prepaid-packs/propose-packs-modal";
|
||||||
@import "modules/prepaid-packs/packs-summary";
|
@import "modules/prepaid-packs/packs-summary";
|
||||||
|
@ -367,3 +367,7 @@ table.export-table-template {
|
|||||||
height: 30px;
|
height: 30px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.multi-vat-rate-input {
|
||||||
|
width: 90% !important;
|
||||||
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
.configure-group {
|
.configure-packs-button {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-left: 6px;
|
margin-left: 6px;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&-button {
|
.packs-button {
|
||||||
border: 1px solid #d0cccc;
|
border: 1px solid #d0cccc;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@ -18,13 +18,6 @@
|
|||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.popover-title {
|
|
||||||
.add-pack-button {
|
|
||||||
position: absolute;
|
|
||||||
right: 5px;
|
|
||||||
top: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.popover-content {
|
.popover-content {
|
||||||
ul {
|
ul {
|
||||||
@ -44,7 +37,7 @@
|
|||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.group-actions button {
|
.pack-actions button {
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
line-height: 10px;
|
line-height: 10px;
|
@ -0,0 +1,7 @@
|
|||||||
|
.create-pack {
|
||||||
|
.add-pack-button {
|
||||||
|
position: absolute;
|
||||||
|
right: 5px;
|
||||||
|
top: 10px;
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
.delete-group {
|
.delete-pack {
|
||||||
display: inline;
|
display: inline;
|
||||||
|
|
||||||
&-button {
|
.remove-pack-button {
|
||||||
background-color: #cb1117;
|
background-color: #cb1117;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
@ -1,3 +1,3 @@
|
|||||||
.edit-group {
|
.edit-pack {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
.machines-pricing {
|
||||||
|
.fab-alert {
|
||||||
|
margin: 15px 0;
|
||||||
|
}
|
||||||
|
table {
|
||||||
|
overflow-y: scroll;
|
||||||
|
thead > tr > th:first-child {
|
||||||
|
width: 20%;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead > tr > th.group-name {
|
||||||
|
width: 20%;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: 1.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead > tr > th {
|
||||||
|
vertical-align: bottom;
|
||||||
|
border-bottom: 2px solid #ddd;
|
||||||
|
padding: 8px;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody > tr > td {
|
||||||
|
padding: 8px;
|
||||||
|
line-height: 1.5;
|
||||||
|
vertical-align: top;
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
.group-form {
|
.pack-form {
|
||||||
.interval-inputs {
|
.interval-inputs {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
@ -0,0 +1,49 @@
|
|||||||
|
.configure-extended-prices-button {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: 6px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.extended-prices-button {
|
||||||
|
border: 1px solid #d0cccc;
|
||||||
|
border-radius: 50%;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 2px 6px;
|
||||||
|
box-shadow: 0 1px 1px 0 #abaaaa;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #b9b9b9;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.popover-content {
|
||||||
|
ul {
|
||||||
|
padding-left: 19px;
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
&::before {
|
||||||
|
content: '\f466';
|
||||||
|
font-family: 'Font Awesome 5 Free';
|
||||||
|
position: absolute;
|
||||||
|
left: 11px;
|
||||||
|
font-weight: 800;
|
||||||
|
font-size: 12px;
|
||||||
|
vertical-align: middle;
|
||||||
|
line-height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.extended-prices-actions button {
|
||||||
|
font-size: 10px;
|
||||||
|
vertical-align: middle;
|
||||||
|
line-height: 10px;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
.create-extended-price {
|
||||||
|
.add-price-button {
|
||||||
|
position: absolute;
|
||||||
|
right: 5px;
|
||||||
|
top: 10px;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
.delete-extended-price {
|
||||||
|
display: inline;
|
||||||
|
|
||||||
|
.remove-price-button {
|
||||||
|
background-color: #cb1117;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
.edit-extended-price {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
.extended-price-form {
|
||||||
|
.interval-inputs {
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
.select-interval {
|
||||||
|
min-width: 49%;
|
||||||
|
margin-left: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
.pricing-list {
|
.spaces-pricing {
|
||||||
.fab-alert {
|
.fab-alert {
|
||||||
margin: 15px 0;
|
margin: 15px 0;
|
||||||
}
|
}
|
@ -42,11 +42,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<h4 class="control-label m-l" translate>{{ 'app.admin.invoices.export_to' }}</h4>
|
<h4 class="control-label m-l" translate>{{ 'app.admin.invoices.export_what' }}</h4>
|
||||||
<div class="form-group m-l-lg">
|
<div class="form-group m-l-lg">
|
||||||
<label for="acd">
|
<label for="vat" class="block">
|
||||||
|
<input type="radio" name="vat" id="vat" ng-model="exportTarget.software" ng-value="'vat'" ng-click="fillSettings('vat')" required/>
|
||||||
|
{{ 'app.admin.invoices.export_VAT' | translate }}
|
||||||
|
</label>
|
||||||
|
<label for="acd" class="block">
|
||||||
<input type="radio" name="acd" id="acd" ng-model="exportTarget.software" ng-value="'acd'" ng-click="fillSettings('acd')" required/>
|
<input type="radio" name="acd" id="acd" ng-model="exportTarget.software" ng-value="'acd'" ng-click="fillSettings('acd')" required/>
|
||||||
{{ 'app.admin.invoices.acd' | translate }}
|
{{ 'app.admin.invoices.export_to_ACD' | translate }}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -54,12 +54,12 @@
|
|||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr class="invoice-vat invoice-editable vat-line italic" ng-click="openEditVAT()" ng-show="invoice.VAT.active">
|
<tr class="invoice-vat invoice-editable vat-line italic" ng-click="openEditVAT()" ng-show="invoice.VAT.active">
|
||||||
<td>{{ 'app.admin.invoices.including_VAT' | translate }} {{invoice.VAT.rate}} %</td>
|
<td translate translate-values="{RATE:getMachineExampleRate(), AMOUNT:(30.0 | currency)}">{{ 'app.admin.invoices.including_VAT' }}</td>
|
||||||
<td>{{30-(30/(invoice.VAT.rate/100+1)) | currency}}</td>
|
<td>{{30-(30/(getMachineExampleRate()/100+1)) | currency}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="invoice-ht vat-line italic" ng-show="invoice.VAT.active">
|
<tr class="invoice-ht vat-line italic" ng-show="invoice.VAT.active">
|
||||||
<td translate>{{ 'app.admin.invoices.including_total_excluding_taxes' }}</td>
|
<td translate>{{ 'app.admin.invoices.including_total_excluding_taxes' }}</td>
|
||||||
<td>{{30/(invoice.VAT.rate/100+1) | currency}}</td>
|
<td>{{30/(getMachineExampleRate()/100+1) | currency}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="invoice-payed vat-line bold" ng-show="invoice.VAT.active">
|
<tr class="invoice-payed vat-line bold" ng-show="invoice.VAT.active">
|
||||||
<td translate>{{ 'app.admin.invoices.including_amount_payed_on_ordering' }}</td>
|
<td translate>{{ 'app.admin.invoices.including_amount_payed_on_ordering' }}</td>
|
||||||
|
@ -0,0 +1,57 @@
|
|||||||
|
<div class="custom-invoice">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h3 class="modal-title" translate>{{ 'app.admin.invoices.multiVAT' }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<uib-alert type="warning">
|
||||||
|
<p class="text-sm">
|
||||||
|
<i class="fa fa-warning"></i>
|
||||||
|
<span ng-bind-html="'app.admin.invoices.multi_VAT_notice' | translate:{ RATE: rate }"></span>
|
||||||
|
</p>
|
||||||
|
</uib-alert>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="vatRateMachine" class="control-label" translate>{{ 'app.admin.invoices.VAT_rate_machine' }}</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-addon">% </span>
|
||||||
|
<input id="vatRateMachine" type="number" ng-model="multiVAT.rateMachine" class="form-control multi-vat-rate-input" min="0" max="100"/>
|
||||||
|
<button class="btn pull-right" ng-click="showMultiRateHistory('Machine')"><i class="fa fa-history"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="vatRateSpace" class="control-label" translate>{{ 'app.admin.invoices.VAT_rate_space' }}</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-addon">% </span>
|
||||||
|
<input id="vatRateSpace" type="number" ng-model="multiVAT.rateSpace" class="form-control multi-vat-rate-input" min="0" max="100"/>
|
||||||
|
<button class="btn pull-right" ng-click="showMultiRateHistory('Space')"><i class="fa fa-history"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="vatRateTraining" class="control-label" translate>{{ 'app.admin.invoices.VAT_rate_training' }}</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-addon">% </span>
|
||||||
|
<input id="vatRateTraining" type="number" ng-model="multiVAT.rateTraining" class="form-control multi-vat-rate-input" min="0" max="100"/>
|
||||||
|
<button class="btn pull-right" ng-click="showMultiRateHistory('Training')"><i class="fa fa-history"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="vatRateEvent" class="control-label" translate>{{ 'app.admin.invoices.VAT_rate_event' }}</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-addon">% </span>
|
||||||
|
<input id="vatRateEvent" type="number" ng-model="multiVAT.rateEvent" class="form-control multi-vat-rate-input" min="0" max="100"/>
|
||||||
|
<button class="btn pull-right" ng-click="showMultiRateHistory('Event')"><i class="fa fa-history"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="vatRateSubscription" class="control-label" translate>{{ 'app.admin.invoices.VAT_rate_subscription' }}</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-addon">% </span>
|
||||||
|
<input id="vatRateSubscription" type="number" ng-model="multiVAT.rateSubscription" class="form-control multi-vat-rate-input" min="0" max="100"/>
|
||||||
|
<button class="btn pull-right" ng-click="showMultiRateHistory('Subscription')"><i class="fa fa-history"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button class="btn btn-warning" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
|
||||||
|
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -22,6 +22,12 @@
|
|||||||
<input id="vatRate" type="number" ng-model="rate" class="form-control" min="0" max="100"/>
|
<input id="vatRate" type="number" ng-model="rate" class="form-control" min="0" max="100"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<uib-alert type="warning" ng-show="isSelected">
|
||||||
|
<p class="text-sm">
|
||||||
|
<i class="fa fa-warning"></i>
|
||||||
|
<span>{{ 'app.admin.invoices.VAT_notice' | translate }}</span>
|
||||||
|
</p>
|
||||||
|
</uib-alert>
|
||||||
|
|
||||||
<div class="m-t-lg">
|
<div class="m-t-lg">
|
||||||
<h4 translate>{{ 'app.admin.invoices.VAT_history' }}</h4>
|
<h4 translate>{{ 'app.admin.invoices.VAT_history' }}</h4>
|
||||||
@ -48,6 +54,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
|
<button class="btn btn-warning pull-left" ng-click="editMultiVAT()" ng-show="isSelected" translate>{{ 'app.admin.invoices.edit_multi_VAT_button' }}</button>
|
||||||
<button class="btn btn-warning" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
|
<button class="btn btn-warning" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
|
||||||
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
|
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
<div class="custom-invoice">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h3 class="modal-title" translate>{{ 'app.admin.invoices.VAT_history' }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div>
|
||||||
|
<table class="table scrollable-3-cols">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th translate>{{ 'app.admin.invoices.VAT_rate' }}</th>
|
||||||
|
<th translate>{{ 'app.admin.invoices.changed_at' }}</th>
|
||||||
|
<th translate>{{ 'app.admin.invoices.changed_by' }}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr ng-repeat="value in history | orderBy:'-date'">
|
||||||
|
<td>
|
||||||
|
<span class="no-user-label" ng-show="value.enabled === false" translate>{{'app.admin.invoices.VAT_disabled'}}</span>
|
||||||
|
<span class="no-user-label" ng-show="value.enabled === true" translate>{{'app.admin.invoices.VAT_enabled'}}</span>
|
||||||
|
<span ng-show="value.rate">{{value.rate}}</span>
|
||||||
|
</td>
|
||||||
|
<td>{{value.date | amDateFormat:'L LT'}}</td>
|
||||||
|
<td>{{value.user.name}}<span class="no-user-label" ng-hide="value.user" translate>{{ 'app.admin.invoices.deleted_user' }}</span></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -34,7 +34,12 @@ class AccountingPeriod < ApplicationRecord
|
|||||||
def invoices_with_vat(invoices)
|
def invoices_with_vat(invoices)
|
||||||
vat_service = VatHistoryService.new
|
vat_service = VatHistoryService.new
|
||||||
invoices.map do |i|
|
invoices.map do |i|
|
||||||
{ invoice: i, vat_rate: vat_service.invoice_vat(i) / 100.0 }
|
vat_rate_group = {}
|
||||||
|
i.invoice_items.each do |item|
|
||||||
|
vat_type = item.invoice_item_type
|
||||||
|
vat_rate_group[vat_type] = vat_service.invoice_item_vat(item) / 100.0 unless vat_rate_group[vat_type]
|
||||||
|
end
|
||||||
|
{ invoice: i, vat_rate: vat_rate_group }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -70,7 +75,7 @@ class AccountingPeriod < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def price_without_taxe(invoice)
|
def price_without_taxe(invoice)
|
||||||
invoice[:invoice].total - (invoice[:invoice].total * invoice[:vat_rate])
|
invoice[:invoice].invoice_items.map(&:net_amount).sum
|
||||||
end
|
end
|
||||||
|
|
||||||
def compute_totals
|
def compute_totals
|
||||||
|
@ -18,18 +18,20 @@ class CartItem::Reservation < CartItem::BaseItem
|
|||||||
def price
|
def price
|
||||||
is_privileged = @operator.privileged? && @operator.id != @customer.id
|
is_privileged = @operator.privileged? && @operator.id != @customer.id
|
||||||
prepaid = { minutes: PrepaidPackService.minutes_available(@customer, @reservable) }
|
prepaid = { minutes: PrepaidPackService.minutes_available(@customer, @reservable) }
|
||||||
prices = applicable_prices
|
|
||||||
|
|
||||||
elements = { slots: [] }
|
elements = { slots: [] }
|
||||||
amount = 0
|
amount = 0
|
||||||
|
|
||||||
hours_available = credits
|
hours_available = credits
|
||||||
@slots.each_with_index do |slot, index|
|
grouped_slots.values.each do |slots|
|
||||||
|
prices = applicable_prices(slots)
|
||||||
|
slots.each_with_index do |slot, index|
|
||||||
amount += get_slot_price_from_prices(prices, slot, is_privileged,
|
amount += get_slot_price_from_prices(prices, slot, is_privileged,
|
||||||
elements: elements,
|
elements: elements,
|
||||||
has_credits: (index < hours_available),
|
has_credits: (index < hours_available),
|
||||||
prepaid: prepaid)
|
prepaid: prepaid)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
{ elements: elements, amount: amount }
|
{ elements: elements, amount: amount }
|
||||||
end
|
end
|
||||||
@ -61,6 +63,15 @@ class CartItem::Reservation < CartItem::BaseItem
|
|||||||
0
|
0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Group the slots by date, if the extended_prices_in_same_day option is set to true
|
||||||
|
##
|
||||||
|
def grouped_slots
|
||||||
|
return { all: @slots } unless Setting.get('extended_prices_in_same_day')
|
||||||
|
|
||||||
|
@slots.group_by { |slot| slot[:start_at].to_date }
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Compute the price of a single slot, according to the list of applicable prices.
|
# Compute the price of a single slot, according to the list of applicable prices.
|
||||||
# @param prices {{ prices: Array<{price: Price, duration: number}> }} list of prices to use with the current reservation
|
# @param prices {{ prices: Array<{price: Price, duration: number}> }} list of prices to use with the current reservation
|
||||||
@ -129,10 +140,8 @@ class CartItem::Reservation < CartItem::BaseItem
|
|||||||
# Eg. If the reservation is for 12 hours, and there are prices for 3 hours, 7 hours,
|
# Eg. If the reservation is for 12 hours, and there are prices for 3 hours, 7 hours,
|
||||||
# and the base price (1 hours), we use the 7 hours price, then 3 hours price, and finally the base price twice (7+3+1+1 = 12).
|
# and the base price (1 hours), we use the 7 hours price, then 3 hours price, and finally the base price twice (7+3+1+1 = 12).
|
||||||
# All these prices are returned to be applied to the reservation.
|
# All these prices are returned to be applied to the reservation.
|
||||||
def applicable_prices
|
def applicable_prices(slots)
|
||||||
all_slots_in_same_day = @slots.map { |slot| slot[:start_at].to_date }.uniq.size == 1
|
total_duration = slots.map { |slot| (slot[:end_at].to_time - slot[:start_at].to_time) / SECONDS_PER_MINUTE }.reduce(:+)
|
||||||
|
|
||||||
total_duration = @slots.map { |slot| (slot[:end_at].to_time - slot[:start_at].to_time) / SECONDS_PER_MINUTE }.reduce(:+)
|
|
||||||
rates = { prices: [] }
|
rates = { prices: [] }
|
||||||
|
|
||||||
remaining_duration = total_duration
|
remaining_duration = total_duration
|
||||||
@ -140,7 +149,7 @@ class CartItem::Reservation < CartItem::BaseItem
|
|||||||
max_duration = @reservable.prices.where(group_id: @customer.group_id, plan_id: @plan.try(:id))
|
max_duration = @reservable.prices.where(group_id: @customer.group_id, plan_id: @plan.try(:id))
|
||||||
.where(Price.arel_table[:duration].lteq(remaining_duration))
|
.where(Price.arel_table[:duration].lteq(remaining_duration))
|
||||||
.maximum(:duration)
|
.maximum(:duration)
|
||||||
max_duration = 60 if max_duration.nil? || Setting.get('extended_prices_in_same_day') && !all_slots_in_same_day
|
max_duration = 60 if max_duration.nil?
|
||||||
max_duration_price = @reservable.prices.find_by(group_id: @customer.group_id, plan_id: @plan.try(:id), duration: max_duration)
|
max_duration_price = @reservable.prices.find_by(group_id: @customer.group_id, plan_id: @plan.try(:id), duration: max_duration)
|
||||||
|
|
||||||
current_duration = [remaining_duration, max_duration].min
|
current_duration = [remaining_duration, max_duration].min
|
||||||
|
@ -27,7 +27,7 @@ class InvoiceItem < Footprintable
|
|||||||
def net_amount
|
def net_amount
|
||||||
# deduct VAT
|
# deduct VAT
|
||||||
vat_service = VatHistoryService.new
|
vat_service = VatHistoryService.new
|
||||||
vat_rate = vat_service.invoice_vat(invoice)
|
vat_rate = vat_service.invoice_item_vat(self)
|
||||||
Rational(amount_after_coupon / (vat_rate / 100.00 + 1)).round.to_f
|
Rational(amount_after_coupon / (vat_rate / 100.00 + 1)).round.to_f
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -36,6 +36,19 @@ class InvoiceItem < Footprintable
|
|||||||
amount_after_coupon - net_amount
|
amount_after_coupon - net_amount
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# return invoice item type (Machine/Training/Space/Event/Subscription) used to determine the VAT rate
|
||||||
|
def invoice_item_type
|
||||||
|
if object_type == Reservation.name
|
||||||
|
object.try(:reservable_type) || ''
|
||||||
|
elsif [Subscription.name, OfferDay.name].include? object_type
|
||||||
|
Subscription.name
|
||||||
|
elsif object_type == StatisticProfilePrepaidPack.name
|
||||||
|
object.prepaid_pack.priceable_type
|
||||||
|
else
|
||||||
|
''
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def log_changes
|
def log_changes
|
||||||
|
@ -8,4 +8,8 @@ class Price < ApplicationRecord
|
|||||||
|
|
||||||
validates :priceable, :group_id, :amount, presence: true
|
validates :priceable, :group_id, :amount, presence: true
|
||||||
validates :priceable_id, uniqueness: { scope: %i[priceable_type plan_id group_id duration] }
|
validates :priceable_id, uniqueness: { scope: %i[priceable_type plan_id group_id duration] }
|
||||||
|
|
||||||
|
def safe_destroy
|
||||||
|
destroy unless duration == 60
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -28,6 +28,11 @@ class Setting < ApplicationRecord
|
|||||||
invoice_order-nb
|
invoice_order-nb
|
||||||
invoice_VAT-active
|
invoice_VAT-active
|
||||||
invoice_VAT-rate
|
invoice_VAT-rate
|
||||||
|
invoice_VAT-rate_Machine
|
||||||
|
invoice_VAT-rate_Training
|
||||||
|
invoice_VAT-rate_Space
|
||||||
|
invoice_VAT-rate_Event
|
||||||
|
invoice_VAT-rate_Subscription
|
||||||
invoice_text
|
invoice_text
|
||||||
invoice_legals
|
invoice_legals
|
||||||
booking_window_start
|
booking_window_start
|
||||||
|
@ -230,10 +230,12 @@ class PDF::Invoice < Prawn::Document
|
|||||||
|
|
||||||
# TVA
|
# TVA
|
||||||
vat_service = VatHistoryService.new
|
vat_service = VatHistoryService.new
|
||||||
vat_rate = vat_service.invoice_vat(invoice)
|
vat_rate_group = vat_service.invoice_vat(invoice)
|
||||||
if vat_rate != 0
|
if total_vat != 0
|
||||||
data += [[I18n.t('invoices.total_including_all_taxes'), number_to_currency(total)]]
|
data += [[I18n.t('invoices.total_including_all_taxes'), number_to_currency(total)]]
|
||||||
data += [[I18n.t('invoices.including_VAT_RATE', RATE: vat_rate), number_to_currency(total_vat / 100.00)]]
|
vat_rate_group.each do |_type, rate|
|
||||||
|
data += [[I18n.t('invoices.including_VAT_RATE', RATE: rate[:vat_rate], AMOUNT: number_to_currency(rate[:amount] / 100.00)), number_to_currency(rate[:total_vat] / 100.00)]]
|
||||||
|
end
|
||||||
data += [[I18n.t('invoices.including_total_excluding_taxes'), number_to_currency(total_ht / 100.00)]]
|
data += [[I18n.t('invoices.including_total_excluding_taxes'), number_to_currency(total_ht / 100.00)]]
|
||||||
data += [[I18n.t('invoices.including_amount_payed_on_ordering'), number_to_currency(total)]]
|
data += [[I18n.t('invoices.including_amount_payed_on_ordering'), number_to_currency(total)]]
|
||||||
|
|
||||||
@ -252,23 +254,25 @@ class PDF::Invoice < Prawn::Document
|
|||||||
row(0).font_style = :bold
|
row(0).font_style = :bold
|
||||||
column(1).style align: :right
|
column(1).style align: :right
|
||||||
|
|
||||||
if Setting.get('invoice_VAT-active')
|
if total_vat != 0
|
||||||
# Total incl. taxes
|
# Total incl. taxes
|
||||||
row(-1).style align: :right
|
row(-1).style align: :right
|
||||||
row(-1).background_color = 'E4E4E4'
|
row(-1).background_color = 'E4E4E4'
|
||||||
row(-1).font_style = :bold
|
row(-1).font_style = :bold
|
||||||
|
vat_rate_group.size.times do |i|
|
||||||
# including VAT xx%
|
# including VAT xx%
|
||||||
row(-2).style align: :right
|
row(-2 - i).style align: :right
|
||||||
row(-2).background_color = 'E4E4E4'
|
row(-2 - i).background_color = 'E4E4E4'
|
||||||
row(-2).font_style = :italic
|
row(-2 - i).font_style = :italic
|
||||||
|
end
|
||||||
# including total excl. taxes
|
# including total excl. taxes
|
||||||
row(-3).style align: :right
|
row(-3 - vat_rate_group.size + 1).style align: :right
|
||||||
row(-3).background_color = 'E4E4E4'
|
row(-3 - vat_rate_group.size + 1).background_color = 'E4E4E4'
|
||||||
row(-3).font_style = :italic
|
row(-3 - vat_rate_group.size + 1).font_style = :italic
|
||||||
# including amount payed on ordering
|
# including amount payed on ordering
|
||||||
row(-4).style align: :right
|
row(-4 - vat_rate_group.size + 1).style align: :right
|
||||||
row(-4).background_color = 'E4E4E4'
|
row(-4 - vat_rate_group.size + 1).background_color = 'E4E4E4'
|
||||||
row(-4).font_style = :bold
|
row(-4 - vat_rate_group.size + 1).font_style = :bold
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -16,7 +16,6 @@ class AccountingExportService
|
|||||||
@label_max_length = 50
|
@label_max_length = 50
|
||||||
@export_zeros = false
|
@export_zeros = false
|
||||||
@journal_code = Setting.get('accounting_journal_code') || ''
|
@journal_code = Setting.get('accounting_journal_code') || ''
|
||||||
@date_format = date_format
|
|
||||||
@columns = columns
|
@columns = columns
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -134,9 +133,9 @@ class AccountingExportService
|
|||||||
|
|
||||||
# Generate the "VAT" row, which contains the credit to the VAT account, with VAT amount only
|
# Generate the "VAT" row, which contains the credit to the VAT account, with VAT amount only
|
||||||
def vat_row(invoice)
|
def vat_row(invoice)
|
||||||
rate = VatHistoryService.new.invoice_vat(invoice)
|
total = invoice.invoice_items.map(&:net_amount).sum
|
||||||
# we do not render the VAT row if it was disabled for this invoice
|
# we do not render the VAT row if it was disabled for this invoice
|
||||||
return nil if rate.zero?
|
return nil if total == invoice.total
|
||||||
|
|
||||||
row(
|
row(
|
||||||
invoice,
|
invoice,
|
||||||
|
97
app/services/vat_export_service.rb
Normal file
97
app/services/vat_export_service.rb
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
# frozen_string_literal: false
|
||||||
|
|
||||||
|
# Provides the routine to export the collected VAT data to a CSV file.
|
||||||
|
class VatExportService
|
||||||
|
include ActionView::Helpers::NumberHelper
|
||||||
|
|
||||||
|
attr_reader :encoding, :format, :separator, :date_format, :columns, :decimal_separator
|
||||||
|
|
||||||
|
def initialize(columns, encoding: 'UTF-8', format: 'CSV', separator: ';')
|
||||||
|
@encoding = encoding
|
||||||
|
@format = format
|
||||||
|
@separator = separator
|
||||||
|
@decimal_separator = '.'
|
||||||
|
@date_format = '%Y-%m-%d'
|
||||||
|
@columns = columns
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_options(decimal_separator: ',', date_format: '%d/%m/%Y', label_max_length: nil, export_zeros: nil)
|
||||||
|
@decimal_separator = decimal_separator
|
||||||
|
@date_format = date_format
|
||||||
|
end
|
||||||
|
|
||||||
|
def export(start_date, end_date, file)
|
||||||
|
# build CSV content
|
||||||
|
content = header_row
|
||||||
|
invoices = Invoice.where('created_at >= ? AND created_at <= ?', start_date, end_date).order('created_at ASC')
|
||||||
|
vat_totals = compute_vat_totals(invoices)
|
||||||
|
content << generate_rows(vat_totals, start_date, end_date)
|
||||||
|
|
||||||
|
# write content to file
|
||||||
|
File.open(file, "w:#{encoding}") { |f| f.puts content.encode(encoding, invalid: :replace, undef: :replace) }
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def header_row
|
||||||
|
row = ''
|
||||||
|
columns.each do |column|
|
||||||
|
row << I18n.t("vat_export.#{column}") << separator
|
||||||
|
end
|
||||||
|
"#{row}\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_rows(vat_totals, start_date, end_date)
|
||||||
|
rows = ''
|
||||||
|
|
||||||
|
vat_totals.each do |rate, total|
|
||||||
|
next if rate.zero?
|
||||||
|
|
||||||
|
rows += "#{row(
|
||||||
|
start_date,
|
||||||
|
end_date,
|
||||||
|
rate,
|
||||||
|
total
|
||||||
|
)}\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
rows
|
||||||
|
end
|
||||||
|
|
||||||
|
def compute_vat_totals(invoices)
|
||||||
|
vat_total = []
|
||||||
|
service = VatHistoryService.new
|
||||||
|
invoices.each do |i|
|
||||||
|
puts "processing invoice #{i.id}..." unless Rails.env.test?
|
||||||
|
vat_total.push service.invoice_vat(i)
|
||||||
|
end
|
||||||
|
|
||||||
|
vat_total.map(&:values).flatten.group_by { |tot| tot[:vat_rate] }.map { |k, v| [k, v.map { |t| t[:total_vat] }.reduce(:+)] }.to_h
|
||||||
|
end
|
||||||
|
|
||||||
|
# Generate a row of the export, filling the configured columns with the provided values
|
||||||
|
def row(start_date, end_date, vat_rate, amount)
|
||||||
|
row = ''
|
||||||
|
columns.each do |column|
|
||||||
|
case column
|
||||||
|
when 'start_date'
|
||||||
|
row << DateTime.parse(start_date).strftime(date_format)
|
||||||
|
when 'end_date'
|
||||||
|
row << DateTime.parse(end_date).strftime(date_format)
|
||||||
|
when 'vat_rate'
|
||||||
|
row << vat_rate.to_s
|
||||||
|
when 'amount'
|
||||||
|
row << format_number(amount / 100.0)
|
||||||
|
else
|
||||||
|
puts "Unsupported column: #{column}"
|
||||||
|
end
|
||||||
|
row << separator
|
||||||
|
end
|
||||||
|
row
|
||||||
|
end
|
||||||
|
|
||||||
|
# Format the given number as a string, using the configured separator
|
||||||
|
def format_number(num)
|
||||||
|
number_to_currency(num, unit: '', separator: decimal_separator, delimiter: '', precision: 2)
|
||||||
|
end
|
||||||
|
end
|
@ -2,30 +2,42 @@
|
|||||||
|
|
||||||
# Provides the VAT rate in use at the given date
|
# Provides the VAT rate in use at the given date
|
||||||
class VatHistoryService
|
class VatHistoryService
|
||||||
# return the VAT rate for the given Invoice/Avoir
|
# @return the VAT rate for the given Invoice
|
||||||
def invoice_vat(invoice)
|
def invoice_vat(invoice)
|
||||||
if invoice.is_a?(Avoir)
|
vat_rate_group = {}
|
||||||
vat_rate(invoice.avoir_date)
|
invoice.invoice_items.each do |item|
|
||||||
|
vat_type = item.invoice_item_type
|
||||||
|
vat_rate_group[vat_type] = { vat_rate: invoice_item_vat(item), total_vat: 0, amount: 0 } unless vat_rate_group[vat_type]
|
||||||
|
vat_rate_group[vat_type][:total_vat] += item.vat
|
||||||
|
vat_rate_group[vat_type][:amount] += item.amount.to_i
|
||||||
|
end
|
||||||
|
vat_rate_group
|
||||||
|
end
|
||||||
|
|
||||||
|
# return the VAT rate for the given InvoiceItem
|
||||||
|
def invoice_item_vat(invoice_item)
|
||||||
|
if invoice_item.invoice.is_a?(Avoir)
|
||||||
|
vat_rate(invoice_item.invoice.avoir_date, invoice_item.invoice_item_type)
|
||||||
else
|
else
|
||||||
vat_rate(invoice.created_at)
|
vat_rate(invoice_item.invoice.created_at, invoice_item.invoice_item_type)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# return the VAT rate for the given date
|
# return the VAT rate for the given date and vat type
|
||||||
def vat_rate(date)
|
def vat_rate(date, vat_rate_type)
|
||||||
@vat_rates = vat_history if @vat_rates.nil?
|
vat_rates = vat_history(vat_rate_type)
|
||||||
|
|
||||||
first_rate = @vat_rates.first
|
first_rate = vat_rates.first
|
||||||
return first_rate[:rate] if date < first_rate[:date]
|
return first_rate[:rate] if date < first_rate[:date]
|
||||||
|
|
||||||
@vat_rates.each_index do |i|
|
vat_rates.each_index do |i|
|
||||||
return @vat_rates[i][:rate] if date >= @vat_rates[i][:date] && (@vat_rates[i + 1].nil? || date < @vat_rates[i + 1][:date])
|
return vat_rates[i][:rate] if date >= vat_rates[i][:date] && (vat_rates[i + 1].nil? || date < vat_rates[i + 1][:date])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def vat_history
|
def vat_history(vat_rate_type)
|
||||||
chronology = []
|
chronology = []
|
||||||
end_date = DateTime.current
|
end_date = DateTime.current
|
||||||
Setting.find_by(name: 'invoice_VAT-active').history_values.order(created_at: 'DESC').each do |v|
|
Setting.find_by(name: 'invoice_VAT-active').history_values.order(created_at: 'DESC').each do |v|
|
||||||
@ -33,15 +45,65 @@ class VatHistoryService
|
|||||||
end_date = v.created_at
|
end_date = v.created_at
|
||||||
end
|
end
|
||||||
chronology.push(start: DateTime.new(0), end: end_date, enabled: false)
|
chronology.push(start: DateTime.new(0), end: end_date, enabled: false)
|
||||||
|
# now chronology contains something like one of the following:
|
||||||
|
# - [{start: 0000-01-01, end: now, enabled: false}] => VAT was never enabled
|
||||||
|
# - [
|
||||||
|
# {start: fab-manager initial setup date, end: now, enabled: true},
|
||||||
|
# {start: 0000-01-01, end: fab-manager initial setup date, enabled: false}
|
||||||
|
# ] => VAT was enabled from the beginning
|
||||||
|
# - [
|
||||||
|
# {start: [date disabled], end: now, enabled: false},
|
||||||
|
# {start: [date enable], end: [date disabled], enabled: true},
|
||||||
|
# {start: fab-manager initial setup date, end: [date enabled], enabled: false},
|
||||||
|
# {start: 0000-01-01, end: fab-manager initial setup date, enabled: false}
|
||||||
|
# ] => VAT was enabled at some point, and disabled at some other point later
|
||||||
|
|
||||||
date_rates = []
|
date_rates = []
|
||||||
Setting.find_by(name: 'invoice_VAT-rate').history_values.order(created_at: 'ASC').each do |rate|
|
if vat_rate_type.present?
|
||||||
|
vat_rate_by_type = Setting.find_by(name: "invoice_VAT-rate_#{vat_rate_type}")&.history_values&.order(created_at: 'ASC')
|
||||||
|
first_vat_rate_by_type = vat_rate_by_type&.select { |v| v.value.present? }&.first
|
||||||
|
if first_vat_rate_by_type
|
||||||
|
# before the first VAT rate was defined for the given type, the general VAT rate is used
|
||||||
|
vat_rate_history_values = Setting.find_by(name: 'invoice_VAT-rate')
|
||||||
|
.history_values.where('created_at < ?', first_vat_rate_by_type.created_at)
|
||||||
|
.order(created_at: 'ASC').to_a
|
||||||
|
# after that, the VAT rate for the given type is used
|
||||||
|
vat_rate_by_type = Setting.find_by(name: "invoice_VAT-rate_#{vat_rate_type}")
|
||||||
|
.history_values.where('created_at >= ?', first_vat_rate_by_type.created_at)
|
||||||
|
.order(created_at: 'ASC')
|
||||||
|
vat_rate_by_type.each do |rate|
|
||||||
|
if rate.value.blank?
|
||||||
|
# if, at some point in the history, a blank rate was set, the general VAT rate is used instead
|
||||||
|
vat_rate = Setting.find_by(name: 'invoice_VAT-rate')
|
||||||
|
.history_values.where('created_at < ?', rate.created_at)
|
||||||
|
.order(created_at: 'DESC')
|
||||||
|
.first
|
||||||
|
rate.value = vat_rate.value
|
||||||
|
end
|
||||||
|
vat_rate_history_values.push(rate)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
# if no VAT rate is defined for the given type, the general VAT rate is always used
|
||||||
|
vat_rate_history_values = Setting.find_by(name: 'invoice_VAT-rate').history_values.order(created_at: 'ASC').to_a
|
||||||
|
end
|
||||||
|
|
||||||
|
# Now we have all the rates history, we can build the final chronology, depending on whether VAT was enabled or not
|
||||||
|
vat_rate_history_values.each do |rate|
|
||||||
|
# when the VAT rate was enabled, set the date it was enabled and the rate
|
||||||
range = chronology.select { |p| rate.created_at.to_i.between?(p[:start].to_i, p[:end].to_i) }.first
|
range = chronology.select { |p| rate.created_at.to_i.between?(p[:start].to_i, p[:end].to_i) }.first
|
||||||
date = range[:enabled] ? rate.created_at : range[:end]
|
date = range[:enabled] ? rate.created_at : range[:end]
|
||||||
date_rates.push(date: date, rate: rate.value.to_i)
|
date_rates.push(date: date, rate: rate.value.to_i)
|
||||||
end
|
end
|
||||||
chronology.reverse_each do |period|
|
chronology.reverse_each do |period|
|
||||||
|
# when the VAT rate was disabled, set the date it was disabled and rate=0
|
||||||
date_rates.push(date: period[:start], rate: 0) unless period[:enabled]
|
date_rates.push(date: period[:start], rate: 0) unless period[:enabled]
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
# if no VAT rate type is given, we return rate=0 from 0000-01-01
|
||||||
|
date_rates.push(date: chronology[-1][:start], rate: 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
# finally, we return the chronology, sorted by dates (ascending)
|
||||||
date_rates.sort_by { |k| k[:date] }
|
date_rates.sort_by { |k| k[:date] }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -34,7 +34,7 @@ json.invoices do
|
|||||||
json.id item.object_id
|
json.id item.object_id
|
||||||
json.main item.main
|
json.main item.main
|
||||||
end
|
end
|
||||||
json.partial! 'archive/vat', price: item.amount, vat_rate: invoice[:vat_rate]
|
json.partial! 'archive/vat', price: item.amount, vat_rate: invoice[:vat_rate][item.invoice_item_type]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -10,7 +10,8 @@ class AccountingExportWorker
|
|||||||
raise SecurityError, 'Not allowed to export' unless export.user.admin?
|
raise SecurityError, 'Not allowed to export' unless export.user.admin?
|
||||||
|
|
||||||
data = JSON.parse(export.query)
|
data = JSON.parse(export.query)
|
||||||
service = AccountingExportService.new(
|
service = export.export_type == 'vat' ? VatExportService : AccountingExportService
|
||||||
|
service = service.new(
|
||||||
data['columns'],
|
data['columns'],
|
||||||
encoding: data['encoding'], format: export.extension, separator: export.key
|
encoding: data['encoding'], format: export.extension, separator: export.key
|
||||||
)
|
)
|
||||||
|
@ -368,6 +368,13 @@ de:
|
|||||||
status_enabled: "Aktiviert"
|
status_enabled: "Aktiviert"
|
||||||
status_disabled: "Deaktiviert"
|
status_disabled: "Deaktiviert"
|
||||||
status_all: "Alle"
|
status_all: "Alle"
|
||||||
|
spaces_pricing:
|
||||||
|
prices_match_space_hours_rates_html: "The prices below match one hour of space reservation, <strong>without subscription</strong>."
|
||||||
|
prices_calculated_on_hourly_rate_html: "All the prices will be automatically calculated based on the hourly rate defined here.<br/><em>For example</em>, if you define an hourly rate at {RATE}: a slot of {DURATION} minutes, will be charged <strong>{PRICE}</strong>."
|
||||||
|
you_can_override: "You can override this duration for each availability you create in the agenda. The price will then be adjusted accordingly."
|
||||||
|
extended_prices: "Moreover, you can define extended prices which will apply in priority over the hourly rate below. Extended prices allow you, for example, to set a favorable price for a booking of several hours."
|
||||||
|
spaces: "Spaces"
|
||||||
|
price_updated: "Price successfully updated"
|
||||||
machines_pricing:
|
machines_pricing:
|
||||||
prices_match_machine_hours_rates_html: "Die unten aufgeführten Preise entsprechen einer Stunde Maschinengebrauch, <strong>ohne Abonnement</strong>."
|
prices_match_machine_hours_rates_html: "Die unten aufgeführten Preise entsprechen einer Stunde Maschinengebrauch, <strong>ohne Abonnement</strong>."
|
||||||
prices_calculated_on_hourly_rate_html: "Alle Preise werden automatisch nach dem hier definierten Stundensatz berechnet.<br/><em>Zum Beispiel</em> wird bei einem veranschlagten Stundensatz von {RATE} ein Slot von {DURATION} Minuten, zum Preis von <strong>{PRICE}</strong> berechnet."
|
prices_calculated_on_hourly_rate_html: "Alle Preise werden automatisch nach dem hier definierten Stundensatz berechnet.<br/><em>Zum Beispiel</em> wird bei einem veranschlagten Stundensatz von {RATE} ein Slot von {DURATION} Minuten, zum Preis von <strong>{PRICE}</strong> berechnet."
|
||||||
@ -378,6 +385,13 @@ de:
|
|||||||
packs: "Prepaid packs"
|
packs: "Prepaid packs"
|
||||||
no_packs: "No packs for now"
|
no_packs: "No packs for now"
|
||||||
pack_DURATION: "{DURATION} hours"
|
pack_DURATION: "{DURATION} hours"
|
||||||
|
configure_extended_prices_button:
|
||||||
|
extended_prices: "Extended prices"
|
||||||
|
no_extended_prices: "No extended price for now"
|
||||||
|
extended_price_DURATION: "{DURATION} minutes"
|
||||||
|
extended_price_form:
|
||||||
|
duration: "Duration (minutes)"
|
||||||
|
amount: "Price"
|
||||||
pack_form:
|
pack_form:
|
||||||
hours: "Hours"
|
hours: "Hours"
|
||||||
amount: "Price"
|
amount: "Price"
|
||||||
@ -404,6 +418,21 @@ de:
|
|||||||
edit_pack: "Edit the pack"
|
edit_pack: "Edit the pack"
|
||||||
confirm_changes: "Confirm changes"
|
confirm_changes: "Confirm changes"
|
||||||
pack_successfully_updated: "The prepaid pack was successfully updated."
|
pack_successfully_updated: "The prepaid pack was successfully updated."
|
||||||
|
create_extended_price:
|
||||||
|
new_extended_price: "New extended price"
|
||||||
|
new_extended_price_info: "Extended prices allows you to define prices based on custom durations, instead of the default hourly rates."
|
||||||
|
create_extended_price: "Create extended price"
|
||||||
|
extended_price_successfully_created: "The new extended price was successfully created."
|
||||||
|
delete_extended_price:
|
||||||
|
extended_price_deleted: "The extended price was successfully deleted."
|
||||||
|
unable_to_delete: "Unable to delete the extended price: "
|
||||||
|
delete_extended_price: "Delete the extended price"
|
||||||
|
confirm_delete: "Delete"
|
||||||
|
delete_confirmation: "Are you sure you want to delete this extended price?"
|
||||||
|
edit_extended_price:
|
||||||
|
edit_extended_price: "Edit the extended price"
|
||||||
|
confirm_changes: "Confirm changes"
|
||||||
|
extended_price_successfully_updated: "The extended price was successfully updated."
|
||||||
#ajouter un code promotionnel
|
#ajouter un code promotionnel
|
||||||
coupons_new:
|
coupons_new:
|
||||||
add_a_coupon: "Gutschein hinzufügen"
|
add_a_coupon: "Gutschein hinzufügen"
|
||||||
@ -466,13 +495,14 @@ de:
|
|||||||
details: "Details"
|
details: "Details"
|
||||||
amount: "Betrag"
|
amount: "Betrag"
|
||||||
machine_booking-3D_printer: "Maschinen-Buchung - 3D-Drucker"
|
machine_booking-3D_printer: "Maschinen-Buchung - 3D-Drucker"
|
||||||
|
training_booking-3D_print: "Training booking - initiation to 3d printing"
|
||||||
total_amount: "Gesamtbetrag"
|
total_amount: "Gesamtbetrag"
|
||||||
total_including_all_taxes: "Gesamtpreis inkl. Steuern"
|
total_including_all_taxes: "Gesamtpreis inkl. Steuern"
|
||||||
VAT_disabled: "MwSt. deaktiviert"
|
VAT_disabled: "MwSt. deaktiviert"
|
||||||
VAT_enabled: "MwSt. aktiviert"
|
VAT_enabled: "MwSt. aktiviert"
|
||||||
including_VAT: "Inklusive MwSt."
|
including_VAT: "Inklusive MwSt. {RATE}% von {AMOUNT}"
|
||||||
including_total_excluding_taxes: "Gesamtbetrag zzgl. Steuern"
|
including_total_excluding_taxes: "Gesamtbetrag zzgl. Steuern"
|
||||||
including_amount_payed_on_ordering: "Inklusive bei Bestellung bezahlter Betrag"
|
including_amount_payed_on_ordering: "Inklusive bei Bestellung gezahlter Betrag"
|
||||||
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Begleichung mit Debitkarte am {DATE} um {TIME}, über den Betrag von {AMOUNT}"
|
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Begleichung mit Debitkarte am {DATE} um {TIME}, über den Betrag von {AMOUNT}"
|
||||||
important_notes: "Wichtige Hinweise"
|
important_notes: "Wichtige Hinweise"
|
||||||
address_and_legal_information: "Adresse und rechtliche Informationen"
|
address_and_legal_information: "Adresse und rechtliche Informationen"
|
||||||
@ -522,6 +552,15 @@ de:
|
|||||||
enable_VAT: "MwSt. aktivieren"
|
enable_VAT: "MwSt. aktivieren"
|
||||||
VAT_rate: "MwSt.-Satz"
|
VAT_rate: "MwSt.-Satz"
|
||||||
VAT_history: "MwSt.-Sätze Historie"
|
VAT_history: "MwSt.-Sätze Historie"
|
||||||
|
VAT_notice: "This parameter configures the general case of the VAT rate and applies to everything sold by the Fablab. It is possible to override this parameter by setting a specific VAT rate for each object."
|
||||||
|
edit_multi_VAT_button: "More options"
|
||||||
|
multiVAT: "Advanced VAT"
|
||||||
|
multi_VAT_notice: "<strong>Please note</strong>: The current general rate is {RATE}%. Here you can define different VAT rates for each category.</br></br>For example, you can override this value, only for machine reservations, by filling in the corresponding field below. If no value is filled in, the general rate will apply."
|
||||||
|
VAT_rate_machine: "Machine reservation"
|
||||||
|
VAT_rate_space: "Space reservation"
|
||||||
|
VAT_rate_training: "Training reservation"
|
||||||
|
VAT_rate_event: "Event reservation"
|
||||||
|
VAT_rate_subscription: "Subscription"
|
||||||
changed_at: "Geändert am"
|
changed_at: "Geändert am"
|
||||||
changed_by: "Von"
|
changed_by: "Von"
|
||||||
deleted_user: "Gelöschter Nutzer"
|
deleted_user: "Gelöschter Nutzer"
|
||||||
@ -640,9 +679,10 @@ de:
|
|||||||
codes_customization_success: "Anpassung der Abrechnungscodes erfolgreich gespeichert."
|
codes_customization_success: "Anpassung der Abrechnungscodes erfolgreich gespeichert."
|
||||||
unexpected_error_occurred: "Beim Speichern der Codes ist ein unerwarteter Fehler aufgetreten. Bitte versuchen Sie es später erneut."
|
unexpected_error_occurred: "Beim Speichern der Codes ist ein unerwarteter Fehler aufgetreten. Bitte versuchen Sie es später erneut."
|
||||||
export_accounting_data: "Abrechnungsdaten exportieren"
|
export_accounting_data: "Abrechnungsdaten exportieren"
|
||||||
export_to: "In die Buchhaltungssoftware exportieren"
|
export_what: "What do you want to export?"
|
||||||
|
export_VAT: "Export the collected VAT"
|
||||||
|
export_to_ACD: "Export all data to the accounting software ACD"
|
||||||
export_is_running: "Export wird ausgeführt. Sie werden nach Fertigstellung benachrichtigt."
|
export_is_running: "Export wird ausgeführt. Sie werden nach Fertigstellung benachrichtigt."
|
||||||
acd: "ACD"
|
|
||||||
export_form_date: "Exportieren ab"
|
export_form_date: "Exportieren ab"
|
||||||
export_to_date: "Exportieren bis"
|
export_to_date: "Exportieren bis"
|
||||||
format: "Dateiformat"
|
format: "Dateiformat"
|
||||||
@ -665,6 +705,10 @@ de:
|
|||||||
debit_euro: "Soll in Euro"
|
debit_euro: "Soll in Euro"
|
||||||
credit_euro: "Guthaben in Euro"
|
credit_euro: "Guthaben in Euro"
|
||||||
lettering: "Beschriftung"
|
lettering: "Beschriftung"
|
||||||
|
start_date: "Start date"
|
||||||
|
end_date: "End date"
|
||||||
|
vat_rate: "VAT rate"
|
||||||
|
amount: "Total amount"
|
||||||
payment:
|
payment:
|
||||||
payment_settings: "Bezahlungseinstellungen"
|
payment_settings: "Bezahlungseinstellungen"
|
||||||
online_payment: "Online-Bezahlung"
|
online_payment: "Online-Bezahlung"
|
||||||
@ -1235,6 +1279,9 @@ de:
|
|||||||
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
|
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
|
||||||
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
|
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
|
||||||
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
|
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
|
||||||
|
extended_prices: "Extended prices"
|
||||||
|
extended_prices_info_html: "Spaces can have different prices depending on the cumulated duration of the booking. You can choose if this apply to all bookings or only to those starting within the same day."
|
||||||
|
extended_prices_in_same_day: "Extended prices in the same day"
|
||||||
overlapping_options:
|
overlapping_options:
|
||||||
training_reservations: "Trainings"
|
training_reservations: "Trainings"
|
||||||
machine_reservations: "Machines"
|
machine_reservations: "Machines"
|
||||||
|
@ -369,6 +369,11 @@ en:
|
|||||||
status_disabled: "Disabled"
|
status_disabled: "Disabled"
|
||||||
status_all: "All"
|
status_all: "All"
|
||||||
spaces_pricing:
|
spaces_pricing:
|
||||||
|
prices_match_space_hours_rates_html: "The prices below match one hour of space reservation, <strong>without subscription</strong>."
|
||||||
|
prices_calculated_on_hourly_rate_html: "All the prices will be automatically calculated based on the hourly rate defined here.<br/><em>For example</em>, if you define an hourly rate at {RATE}: a slot of {DURATION} minutes, will be charged <strong>{PRICE}</strong>."
|
||||||
|
you_can_override: "You can override this duration for each availability you create in the agenda. The price will then be adjusted accordingly."
|
||||||
|
extended_prices: "Moreover, you can define extended prices which will apply in priority over the hourly rate below. Extended prices allow you, for example, to set a favorable price for a booking of several hours."
|
||||||
|
spaces: "Spaces"
|
||||||
price_updated: "Price successfully updated"
|
price_updated: "Price successfully updated"
|
||||||
machines_pricing:
|
machines_pricing:
|
||||||
prices_match_machine_hours_rates_html: "The prices below match one hour of machine usage, <strong>without subscription</strong>."
|
prices_match_machine_hours_rates_html: "The prices below match one hour of machine usage, <strong>without subscription</strong>."
|
||||||
@ -380,10 +385,12 @@ en:
|
|||||||
packs: "Prepaid packs"
|
packs: "Prepaid packs"
|
||||||
no_packs: "No packs for now"
|
no_packs: "No packs for now"
|
||||||
pack_DURATION: "{DURATION} hours"
|
pack_DURATION: "{DURATION} hours"
|
||||||
configure_extendedPrices_button:
|
configure_extended_prices_button:
|
||||||
extendedPrices: "Extended prices"
|
extended_prices: "Extended prices"
|
||||||
no_extendedPrices: "No extended price for now"
|
no_extended_prices: "No extended price for now"
|
||||||
extended_prices_form:
|
extended_price_DURATION: "{DURATION} minutes"
|
||||||
|
extended_price_form:
|
||||||
|
duration: "Duration (minutes)"
|
||||||
amount: "Price"
|
amount: "Price"
|
||||||
pack_form:
|
pack_form:
|
||||||
hours: "Hours"
|
hours: "Hours"
|
||||||
@ -411,21 +418,21 @@ en:
|
|||||||
edit_pack: "Edit the pack"
|
edit_pack: "Edit the pack"
|
||||||
confirm_changes: "Confirm changes"
|
confirm_changes: "Confirm changes"
|
||||||
pack_successfully_updated: "The prepaid pack was successfully updated."
|
pack_successfully_updated: "The prepaid pack was successfully updated."
|
||||||
create_extendedPrice:
|
create_extended_price:
|
||||||
new_extendedPrice: "New extended price"
|
new_extended_price: "New extended price"
|
||||||
new_extendedPrice_info: "Extended prices allows you to define prices based on custom durations, intead on the default hourly rates."
|
new_extended_price_info: "Extended prices allows you to define prices based on custom durations, instead of the default hourly rates."
|
||||||
create_extendedPrice: "Create extended price"
|
create_extended_price: "Create extended price"
|
||||||
extendedPrice_successfully_created: "The new extended price was successfully created."
|
extended_price_successfully_created: "The new extended price was successfully created."
|
||||||
delete_extendedPrice:
|
delete_extended_price:
|
||||||
extendedPrice_deleted: "The extended price was successfully deleted."
|
extended_price_deleted: "The extended price was successfully deleted."
|
||||||
unable_to_delete: "Unable to delete the extended price: "
|
unable_to_delete: "Unable to delete the extended price: "
|
||||||
delete_extendedPrice: "Delete the extended price"
|
delete_extended_price: "Delete the extended price"
|
||||||
confirm_delete: "Delete"
|
confirm_delete: "Delete"
|
||||||
delete_confirmation: "Are you sure you want to delete this extended price? This won't be possible if it was already bought by users."
|
delete_confirmation: "Are you sure you want to delete this extended price?"
|
||||||
edit_extendedPrice:
|
edit_extended_price:
|
||||||
edit_extendedPrice: "Edit the extended price"
|
edit_extended_price: "Edit the extended price"
|
||||||
confirm_changes: "Confirm changes"
|
confirm_changes: "Confirm changes"
|
||||||
extendedPrice_successfully_updated: "The extended price was successfully updated."
|
extended_price_successfully_updated: "The extended price was successfully updated."
|
||||||
#ajouter un code promotionnel
|
#ajouter un code promotionnel
|
||||||
coupons_new:
|
coupons_new:
|
||||||
add_a_coupon: "Add a coupon"
|
add_a_coupon: "Add a coupon"
|
||||||
@ -488,13 +495,14 @@ en:
|
|||||||
details: "Details"
|
details: "Details"
|
||||||
amount: "Amount"
|
amount: "Amount"
|
||||||
machine_booking-3D_printer: "Machine booking - 3D printer"
|
machine_booking-3D_printer: "Machine booking - 3D printer"
|
||||||
|
training_booking-3D_print: "Training booking - initiation to 3d printing"
|
||||||
total_amount: "Total amount"
|
total_amount: "Total amount"
|
||||||
total_including_all_taxes: "Total incl. all taxes"
|
total_including_all_taxes: "Total incl. all taxes"
|
||||||
VAT_disabled: "VAT disabled"
|
VAT_disabled: "VAT disabled"
|
||||||
VAT_enabled: "VAT enabled"
|
VAT_enabled: "VAT enabled"
|
||||||
including_VAT: "Including VAT"
|
including_VAT: "Including VAT {RATE}% of {AMOUNT}"
|
||||||
including_total_excluding_taxes: "Including Total excl. taxes"
|
including_total_excluding_taxes: "Including Total excl. taxes"
|
||||||
including_amount_payed_on_ordering: "Including Amount payed on ordering"
|
including_amount_payed_on_ordering: "Including amount payed on ordering"
|
||||||
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Settlement by debit card on {DATE} at {TIME}, for an amount of {AMOUNT}"
|
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Settlement by debit card on {DATE} at {TIME}, for an amount of {AMOUNT}"
|
||||||
important_notes: "Important notes"
|
important_notes: "Important notes"
|
||||||
address_and_legal_information: "Address and legal information"
|
address_and_legal_information: "Address and legal information"
|
||||||
@ -544,6 +552,15 @@ en:
|
|||||||
enable_VAT: "Enable VAT"
|
enable_VAT: "Enable VAT"
|
||||||
VAT_rate: "VAT rate"
|
VAT_rate: "VAT rate"
|
||||||
VAT_history: "VAT rates history"
|
VAT_history: "VAT rates history"
|
||||||
|
VAT_notice: "This parameter configures the general case of the VAT rate and applies to everything sold by the Fablab. It is possible to override this parameter by setting a specific VAT rate for each object."
|
||||||
|
edit_multi_VAT_button: "More options"
|
||||||
|
multiVAT: "Advanced VAT"
|
||||||
|
multi_VAT_notice: "<strong>Please note</strong>: The current general rate is {RATE}%. Here you can define different VAT rates for each category.</br></br>For example, you can override this value, only for machine reservations, by filling in the corresponding field below. If no value is filled in, the general rate will apply."
|
||||||
|
VAT_rate_machine: "Machine reservation"
|
||||||
|
VAT_rate_space: "Space reservation"
|
||||||
|
VAT_rate_training: "Training reservation"
|
||||||
|
VAT_rate_event: "Event reservation"
|
||||||
|
VAT_rate_subscription: "Subscription"
|
||||||
changed_at: "Changed at"
|
changed_at: "Changed at"
|
||||||
changed_by: "By"
|
changed_by: "By"
|
||||||
deleted_user: "Deleted user"
|
deleted_user: "Deleted user"
|
||||||
@ -662,9 +679,10 @@ en:
|
|||||||
codes_customization_success: "Customization of the accounting codes successfully saved."
|
codes_customization_success: "Customization of the accounting codes successfully saved."
|
||||||
unexpected_error_occurred: "An unexpected error occurred while saving the codes. Please try again later."
|
unexpected_error_occurred: "An unexpected error occurred while saving the codes. Please try again later."
|
||||||
export_accounting_data: "Export accounting data"
|
export_accounting_data: "Export accounting data"
|
||||||
export_to: "Export to the accounting software"
|
export_what: "What do you want to export?"
|
||||||
|
export_VAT: "Export the collected VAT"
|
||||||
|
export_to_ACD: "Export all data to the accounting software ACD"
|
||||||
export_is_running: "Export is running. You'll be notified when it's ready."
|
export_is_running: "Export is running. You'll be notified when it's ready."
|
||||||
acd: "ACD"
|
|
||||||
export_form_date: "Export from"
|
export_form_date: "Export from"
|
||||||
export_to_date: "Export until"
|
export_to_date: "Export until"
|
||||||
format: "File format"
|
format: "File format"
|
||||||
@ -687,6 +705,10 @@ en:
|
|||||||
debit_euro: "Euro debit"
|
debit_euro: "Euro debit"
|
||||||
credit_euro: "Euro credit"
|
credit_euro: "Euro credit"
|
||||||
lettering: "Lettering"
|
lettering: "Lettering"
|
||||||
|
start_date: "Start date"
|
||||||
|
end_date: "End date"
|
||||||
|
vat_rate: "VAT rate"
|
||||||
|
amount: "Total amount"
|
||||||
payment:
|
payment:
|
||||||
payment_settings: "Payment settings"
|
payment_settings: "Payment settings"
|
||||||
online_payment: "Online payment"
|
online_payment: "Online payment"
|
||||||
|
@ -368,6 +368,13 @@ es:
|
|||||||
status_enabled: "Enabled"
|
status_enabled: "Enabled"
|
||||||
status_disabled: "Disabled"
|
status_disabled: "Disabled"
|
||||||
status_all: "All"
|
status_all: "All"
|
||||||
|
spaces_pricing:
|
||||||
|
prices_match_space_hours_rates_html: "The prices below match one hour of space reservation, <strong>without subscription</strong>."
|
||||||
|
prices_calculated_on_hourly_rate_html: "All the prices will be automatically calculated based on the hourly rate defined here.<br/><em>For example</em>, if you define an hourly rate at {RATE}: a slot of {DURATION} minutes, will be charged <strong>{PRICE}</strong>."
|
||||||
|
you_can_override: "You can override this duration for each availability you create in the agenda. The price will then be adjusted accordingly."
|
||||||
|
extended_prices: "Moreover, you can define extended prices which will apply in priority over the hourly rate below. Extended prices allow you, for example, to set a favorable price for a booking of several hours."
|
||||||
|
spaces: "Spaces"
|
||||||
|
price_updated: "Price successfully updated"
|
||||||
machines_pricing:
|
machines_pricing:
|
||||||
prices_match_machine_hours_rates_html: "The prices below match one hour of machine usage, <strong>without subscription</strong>."
|
prices_match_machine_hours_rates_html: "The prices below match one hour of machine usage, <strong>without subscription</strong>."
|
||||||
prices_calculated_on_hourly_rate_html: "All the prices will be automatically calculated based on the hourly rate defined here.<br/><em>For example</em>, if you define an hourly rate at {RATE}: a slot of {DURATION} minutes, will be charged <strong>{PRICE}</strong>."
|
prices_calculated_on_hourly_rate_html: "All the prices will be automatically calculated based on the hourly rate defined here.<br/><em>For example</em>, if you define an hourly rate at {RATE}: a slot of {DURATION} minutes, will be charged <strong>{PRICE}</strong>."
|
||||||
@ -378,6 +385,13 @@ es:
|
|||||||
packs: "Prepaid packs"
|
packs: "Prepaid packs"
|
||||||
no_packs: "No packs for now"
|
no_packs: "No packs for now"
|
||||||
pack_DURATION: "{DURATION} hours"
|
pack_DURATION: "{DURATION} hours"
|
||||||
|
configure_extended_prices_button:
|
||||||
|
extended_prices: "Extended prices"
|
||||||
|
no_extended_prices: "No extended price for now"
|
||||||
|
extended_price_DURATION: "{DURATION} minutes"
|
||||||
|
extended_price_form:
|
||||||
|
duration: "Duration (minutes)"
|
||||||
|
amount: "Price"
|
||||||
pack_form:
|
pack_form:
|
||||||
hours: "Hours"
|
hours: "Hours"
|
||||||
amount: "Price"
|
amount: "Price"
|
||||||
@ -404,6 +418,21 @@ es:
|
|||||||
edit_pack: "Edit the pack"
|
edit_pack: "Edit the pack"
|
||||||
confirm_changes: "Confirm changes"
|
confirm_changes: "Confirm changes"
|
||||||
pack_successfully_updated: "The prepaid pack was successfully updated."
|
pack_successfully_updated: "The prepaid pack was successfully updated."
|
||||||
|
create_extended_price:
|
||||||
|
new_extended_price: "New extended price"
|
||||||
|
new_extended_price_info: "Extended prices allows you to define prices based on custom durations, instead of the default hourly rates."
|
||||||
|
create_extended_price: "Create extended price"
|
||||||
|
extended_price_successfully_created: "The new extended price was successfully created."
|
||||||
|
delete_extended_price:
|
||||||
|
extended_price_deleted: "The extended price was successfully deleted."
|
||||||
|
unable_to_delete: "Unable to delete the extended price: "
|
||||||
|
delete_extended_price: "Delete the extended price"
|
||||||
|
confirm_delete: "Delete"
|
||||||
|
delete_confirmation: "Are you sure you want to delete this extended price?"
|
||||||
|
edit_extended_price:
|
||||||
|
edit_extended_price: "Edit the extended price"
|
||||||
|
confirm_changes: "Confirm changes"
|
||||||
|
extended_price_successfully_updated: "The extended price was successfully updated."
|
||||||
#ajouter un code promotionnel
|
#ajouter un code promotionnel
|
||||||
coupons_new:
|
coupons_new:
|
||||||
add_a_coupon: "Añadir un cupón"
|
add_a_coupon: "Añadir un cupón"
|
||||||
@ -466,11 +495,12 @@ es:
|
|||||||
details: "Detalles"
|
details: "Detalles"
|
||||||
amount: "Cantidad"
|
amount: "Cantidad"
|
||||||
machine_booking-3D_printer: "Reserva de la máquina- Impresora 3D"
|
machine_booking-3D_printer: "Reserva de la máquina- Impresora 3D"
|
||||||
|
training_booking-3D_print: "Training booking - initiation to 3d printing"
|
||||||
total_amount: "Cantidad total"
|
total_amount: "Cantidad total"
|
||||||
total_including_all_taxes: "Total incl. todos los impuestos"
|
total_including_all_taxes: "Total incl. todos los impuestos"
|
||||||
VAT_disabled: "IVA desactivado"
|
VAT_disabled: "IVA desactivado"
|
||||||
VAT_enabled: "IVA activado"
|
VAT_enabled: "IVA activado"
|
||||||
including_VAT: "Incluido IVA"
|
including_VAT: "Incluido IVA {RATE}% de {AMOUNT}"
|
||||||
including_total_excluding_taxes: "Incluido Total excl. impuestos"
|
including_total_excluding_taxes: "Incluido Total excl. impuestos"
|
||||||
including_amount_payed_on_ordering: "Incluido el monto pagado en el pedido"
|
including_amount_payed_on_ordering: "Incluido el monto pagado en el pedido"
|
||||||
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Liquidación por tarjeta de débito el {DATE} a las {TIME}, por una cantidad de {AMOUNT}"
|
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Liquidación por tarjeta de débito el {DATE} a las {TIME}, por una cantidad de {AMOUNT}"
|
||||||
@ -522,6 +552,15 @@ es:
|
|||||||
enable_VAT: "Habilitar IVA"
|
enable_VAT: "Habilitar IVA"
|
||||||
VAT_rate: "Ratio IVA"
|
VAT_rate: "Ratio IVA"
|
||||||
VAT_history: "Historial de ratios de IVA"
|
VAT_history: "Historial de ratios de IVA"
|
||||||
|
VAT_notice: "This parameter configures the general case of the VAT rate and applies to everything sold by the Fablab. It is possible to override this parameter by setting a specific VAT rate for each object."
|
||||||
|
edit_multi_VAT_button: "More options"
|
||||||
|
multiVAT: "Advanced VAT"
|
||||||
|
multi_VAT_notice: "<strong>Please note</strong>: The current general rate is {RATE}%. Here you can define different VAT rates for each category.</br></br>For example, you can override this value, only for machine reservations, by filling in the corresponding field below. If no value is filled in, the general rate will apply."
|
||||||
|
VAT_rate_machine: "Machine reservation"
|
||||||
|
VAT_rate_space: "Space reservation"
|
||||||
|
VAT_rate_training: "Training reservation"
|
||||||
|
VAT_rate_event: "Event reservation"
|
||||||
|
VAT_rate_subscription: "Subscription"
|
||||||
changed_at: "Cambiado en"
|
changed_at: "Cambiado en"
|
||||||
changed_by: "Por"
|
changed_by: "Por"
|
||||||
deleted_user: "Usario eliminado"
|
deleted_user: "Usario eliminado"
|
||||||
@ -640,9 +679,10 @@ es:
|
|||||||
codes_customization_success: "Customization of accounting codes successfully saved."
|
codes_customization_success: "Customization of accounting codes successfully saved."
|
||||||
unexpected_error_occurred: "An unexpected error occurred while saving the codes. Please try again later."
|
unexpected_error_occurred: "An unexpected error occurred while saving the codes. Please try again later."
|
||||||
export_accounting_data: "Export accounting data"
|
export_accounting_data: "Export accounting data"
|
||||||
export_to: "Export to the accounting software"
|
export_what: "What do you want to export?"
|
||||||
|
export_VAT: "Export the collected VAT"
|
||||||
|
export_to_ACD: "Export all data to the accounting software ACD"
|
||||||
export_is_running: "Exportando, será notificado cuando esté listo."
|
export_is_running: "Exportando, será notificado cuando esté listo."
|
||||||
acd: "ACD"
|
|
||||||
export_form_date: "Export from"
|
export_form_date: "Export from"
|
||||||
export_to_date: "Export until"
|
export_to_date: "Export until"
|
||||||
format: "File format"
|
format: "File format"
|
||||||
@ -665,6 +705,10 @@ es:
|
|||||||
debit_euro: "Euro debit"
|
debit_euro: "Euro debit"
|
||||||
credit_euro: "Euro credit"
|
credit_euro: "Euro credit"
|
||||||
lettering: "Lettering"
|
lettering: "Lettering"
|
||||||
|
start_date: "Start date"
|
||||||
|
end_date: "End date"
|
||||||
|
vat_rate: "VAT rate"
|
||||||
|
amount: "Total amount"
|
||||||
payment:
|
payment:
|
||||||
payment_settings: "Payment settings"
|
payment_settings: "Payment settings"
|
||||||
online_payment: "Online payment"
|
online_payment: "Online payment"
|
||||||
@ -1235,6 +1279,9 @@ es:
|
|||||||
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
|
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
|
||||||
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
|
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
|
||||||
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
|
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
|
||||||
|
extended_prices: "Extended prices"
|
||||||
|
extended_prices_info_html: "Spaces can have different prices depending on the cumulated duration of the booking. You can choose if this apply to all bookings or only to those starting within the same day."
|
||||||
|
extended_prices_in_same_day: "Extended prices in the same day"
|
||||||
overlapping_options:
|
overlapping_options:
|
||||||
training_reservations: "Trainings"
|
training_reservations: "Trainings"
|
||||||
machine_reservations: "Machines"
|
machine_reservations: "Machines"
|
||||||
|
@ -368,6 +368,13 @@ fr:
|
|||||||
status_enabled: "Actifs"
|
status_enabled: "Actifs"
|
||||||
status_disabled: "Désactivés"
|
status_disabled: "Désactivés"
|
||||||
status_all: "Tous"
|
status_all: "Tous"
|
||||||
|
spaces_pricing:
|
||||||
|
prices_match_space_hours_rates_html: "Les tarifs ci-dessous correspondent à une heure de réservation d'espace, <strong>sans abonnement</strong>."
|
||||||
|
prices_calculated_on_hourly_rate_html: "Tous les prix seront automatiquement calculés par rapport au tarif horaire défini ici.<br/><em>Par exemple</em>, si vous définissez un tarif horaire à {RATE} : un créneau de {DURATION} minutes, sera facturé <strong>{PRICE}</strong>."
|
||||||
|
you_can_override: "Vous pouvez surcharger cette durée pour chaque disponibilité que vous créez dans l'agenda. Le prix sera alors ajusté en conséquence."
|
||||||
|
extended_prices: "De plus, vous pouvez définir des prix étendus qui prévaudront sur le tarif horaire ci-dessous. Les prix étendus vous permettent, par exemple, de fixer un prix favorable pour une réservation de plusieurs heures."
|
||||||
|
spaces: "Espaces"
|
||||||
|
price_updated: "Le prix a bien été mis à jour"
|
||||||
machines_pricing:
|
machines_pricing:
|
||||||
prices_match_machine_hours_rates_html: "Les tarifs ci-dessous correspondent à une heure d'utilisation machine, <strong>sans abonnement</strong>."
|
prices_match_machine_hours_rates_html: "Les tarifs ci-dessous correspondent à une heure d'utilisation machine, <strong>sans abonnement</strong>."
|
||||||
prices_calculated_on_hourly_rate_html: "Tous les prix seront automatiquement calculés par rapport au tarif horaire défini ici.<br/><em>Par exemple</em>, si vous définissez un tarif horaire à {RATE} : un créneau de {DURATION} minutes, sera facturé <strong>{PRICE}</strong>."
|
prices_calculated_on_hourly_rate_html: "Tous les prix seront automatiquement calculés par rapport au tarif horaire défini ici.<br/><em>Par exemple</em>, si vous définissez un tarif horaire à {RATE} : un créneau de {DURATION} minutes, sera facturé <strong>{PRICE}</strong>."
|
||||||
@ -378,6 +385,13 @@ fr:
|
|||||||
packs: "Packs prépayés"
|
packs: "Packs prépayés"
|
||||||
no_packs: "Aucun pack pour le moment"
|
no_packs: "Aucun pack pour le moment"
|
||||||
pack_DURATION: "{DURATION} heures"
|
pack_DURATION: "{DURATION} heures"
|
||||||
|
configure_extended_prices_button:
|
||||||
|
extended_prices: "Prix étendus"
|
||||||
|
no_extended_prices: "Aucun prix étendu pour l'instant"
|
||||||
|
extended_price_DURATION: "{DURATION} minutes"
|
||||||
|
extended_price_form:
|
||||||
|
duration: "Durée (minutes)"
|
||||||
|
amount: "Prix"
|
||||||
pack_form:
|
pack_form:
|
||||||
hours: "Heures"
|
hours: "Heures"
|
||||||
amount: "Prix"
|
amount: "Prix"
|
||||||
@ -404,6 +418,21 @@ fr:
|
|||||||
edit_pack: "Modifier le pack"
|
edit_pack: "Modifier le pack"
|
||||||
confirm_changes: "Valider les modifications"
|
confirm_changes: "Valider les modifications"
|
||||||
pack_successfully_updated: "Le pack prépayé a bien été mis à jour."
|
pack_successfully_updated: "Le pack prépayé a bien été mis à jour."
|
||||||
|
create_extended_price:
|
||||||
|
new_extended_price: "Nouveau prix étendu"
|
||||||
|
new_extended_price_info: "Les prix étendus vous permettent de définir des prix basés sur des durées personnalisées, au lieu du tarif horaire par défaut."
|
||||||
|
create_extended_price: "Créer un prix étendu"
|
||||||
|
extended_price_successfully_created: "Le nouveau prix étendu a bien été créé."
|
||||||
|
delete_extended_price:
|
||||||
|
extended_price_deleted: "Le prix étendu a bien été supprimé."
|
||||||
|
unable_to_delete: "Impossible de supprimer le prix étendu : "
|
||||||
|
delete_extended_price: "Supprimer le prix étendu"
|
||||||
|
confirm_delete: "Supprimer"
|
||||||
|
delete_confirmation: "Êtes-vous sûr de vouloir supprimer ce prix étendu ?"
|
||||||
|
edit_extended_price:
|
||||||
|
edit_extended_price: "Modifier le prix étendu"
|
||||||
|
confirm_changes: "Valider les modifications"
|
||||||
|
extended_price_successfully_updated: "Le prix étendu a bien été mis à jour."
|
||||||
#ajouter un code promotionnel
|
#ajouter un code promotionnel
|
||||||
coupons_new:
|
coupons_new:
|
||||||
add_a_coupon: "Ajouter un code promotionnel"
|
add_a_coupon: "Ajouter un code promotionnel"
|
||||||
@ -466,11 +495,12 @@ fr:
|
|||||||
details: "Détails"
|
details: "Détails"
|
||||||
amount: "Montant"
|
amount: "Montant"
|
||||||
machine_booking-3D_printer: "Réservation Machine - Imprimante 3D"
|
machine_booking-3D_printer: "Réservation Machine - Imprimante 3D"
|
||||||
|
training_booking-3D_print: "Réservation de formation - initiation à l'impression 3D"
|
||||||
total_amount: "Montant total"
|
total_amount: "Montant total"
|
||||||
total_including_all_taxes: "Total TTC"
|
total_including_all_taxes: "Total TTC"
|
||||||
VAT_disabled: "TVA désactivée"
|
VAT_disabled: "TVA désactivée"
|
||||||
VAT_enabled: "TVA activée"
|
VAT_enabled: "TVA activée"
|
||||||
including_VAT: "Dont TVA"
|
including_VAT: "Dont TVA {RATE} % de {AMOUNT}"
|
||||||
including_total_excluding_taxes: "Dont total HT"
|
including_total_excluding_taxes: "Dont total HT"
|
||||||
including_amount_payed_on_ordering: "Dont montant payé à la commande"
|
including_amount_payed_on_ordering: "Dont montant payé à la commande"
|
||||||
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Règlement effectué par carte bancaire le {DATE} à {TIME}, pour un montant de {AMOUNT}"
|
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Règlement effectué par carte bancaire le {DATE} à {TIME}, pour un montant de {AMOUNT}"
|
||||||
@ -522,6 +552,15 @@ fr:
|
|||||||
enable_VAT: "Activer la TVA"
|
enable_VAT: "Activer la TVA"
|
||||||
VAT_rate: "Taux de TVA"
|
VAT_rate: "Taux de TVA"
|
||||||
VAT_history: "Historique des taux de TVA"
|
VAT_history: "Historique des taux de TVA"
|
||||||
|
VAT_notice: "Ce paramètre configure le cas général du taux de TVA et s'applique à tout ce qui est vendu par le Fablab. Il est possible de surcharger ce paramètre en définissant un taux de TVA spécifique pour chaque objet."
|
||||||
|
edit_multi_VAT_button: "Plus d'options"
|
||||||
|
multiVAT: "TVA avancée"
|
||||||
|
multi_VAT_notice: "<strong>Veuillez noter</strong> : Le taux général actuel est de {RATE} %. Ici, vous pouvez définir des taux de TVA différents pour chaque catégorie.</br></br>Par exemple, vous pouvez surcharger cette valeur, uniquement pour les réservations de machines, en remplissant le champ correspondant ci-dessous. Si aucune valeur n'est remplie, le tarif général s'appliquera."
|
||||||
|
VAT_rate_machine: "Réservation de machines"
|
||||||
|
VAT_rate_space: "Réservation d'espaces"
|
||||||
|
VAT_rate_training: "Réservation de formations"
|
||||||
|
VAT_rate_event: "Réservation d'événements"
|
||||||
|
VAT_rate_subscription: "Abonnements"
|
||||||
changed_at: "Changé le"
|
changed_at: "Changé le"
|
||||||
changed_by: "Par"
|
changed_by: "Par"
|
||||||
deleted_user: "Utilisateur supprimé"
|
deleted_user: "Utilisateur supprimé"
|
||||||
@ -640,9 +679,10 @@ fr:
|
|||||||
codes_customization_success: "La personnalisation des codes comptables a bien été enregistrée."
|
codes_customization_success: "La personnalisation des codes comptables a bien été enregistrée."
|
||||||
unexpected_error_occurred: "Une erreur inattendue est survenue lors de l’enregistrement des codes. Veuillez réessayer plus tard."
|
unexpected_error_occurred: "Une erreur inattendue est survenue lors de l’enregistrement des codes. Veuillez réessayer plus tard."
|
||||||
export_accounting_data: "Exporter les données comptables"
|
export_accounting_data: "Exporter les données comptables"
|
||||||
export_to: "Exporter vers le logiciel comptable"
|
export_what: "Que voulez-vous exporter ?"
|
||||||
|
export_VAT: "Exporter la TVA collectée"
|
||||||
|
export_to_ACD: "Exporter toutes les données vers le logiciel de comptabilité ACD"
|
||||||
export_is_running: "L'export est en cours. Vous serez notifié lorsqu'il sera prêt."
|
export_is_running: "L'export est en cours. Vous serez notifié lorsqu'il sera prêt."
|
||||||
acd: "ACD"
|
|
||||||
export_form_date: "Exporter depuis le"
|
export_form_date: "Exporter depuis le"
|
||||||
export_to_date: "Exporter jusqu'au"
|
export_to_date: "Exporter jusqu'au"
|
||||||
format: "Format de fichier"
|
format: "Format de fichier"
|
||||||
@ -665,6 +705,10 @@ fr:
|
|||||||
debit_euro: "Débit euro"
|
debit_euro: "Débit euro"
|
||||||
credit_euro: "Crédit euro"
|
credit_euro: "Crédit euro"
|
||||||
lettering: "Lettrage"
|
lettering: "Lettrage"
|
||||||
|
start_date: "Date de début"
|
||||||
|
end_date: "Date de fin"
|
||||||
|
vat_rate: "Taux de TVA"
|
||||||
|
amount: "Montant total"
|
||||||
payment:
|
payment:
|
||||||
payment_settings: "Paramètres de paiement"
|
payment_settings: "Paramètres de paiement"
|
||||||
online_payment: "Paiement en ligne"
|
online_payment: "Paiement en ligne"
|
||||||
@ -1235,6 +1279,9 @@ fr:
|
|||||||
pack_only_for_subscription_info_html: "Si cette option est activée, l'achat et l'utilisation d'un pack prépayé n'est possible que pour l'utilisateur possédant un abonnement en cours de validité."
|
pack_only_for_subscription_info_html: "Si cette option est activée, l'achat et l'utilisation d'un pack prépayé n'est possible que pour l'utilisateur possédant un abonnement en cours de validité."
|
||||||
pack_only_for_subscription: "Abonnement valide pour l'achat et l'utilisation d'un pack prépayé"
|
pack_only_for_subscription: "Abonnement valide pour l'achat et l'utilisation d'un pack prépayé"
|
||||||
pack_only_for_subscription_info: "Rendre l'abonnement obligatoire pour les packs prépayés"
|
pack_only_for_subscription_info: "Rendre l'abonnement obligatoire pour les packs prépayés"
|
||||||
|
extended_prices: "Prix étendus"
|
||||||
|
extended_prices_info_html: "Les espaces peuvent avoir des prix différents selon la durée cumulée de la réservation. Vous pouvez choisir si cela s'applique à toutes les réservations ou seulement à celles qui commencent dans la même journée."
|
||||||
|
extended_prices_in_same_day: "Prix étendus le même jour"
|
||||||
overlapping_options:
|
overlapping_options:
|
||||||
training_reservations: "Formations"
|
training_reservations: "Formations"
|
||||||
machine_reservations: "Machines"
|
machine_reservations: "Machines"
|
||||||
|
@ -368,6 +368,13 @@
|
|||||||
status_enabled: "Aktivert"
|
status_enabled: "Aktivert"
|
||||||
status_disabled: "Deaktivert"
|
status_disabled: "Deaktivert"
|
||||||
status_all: "Alle"
|
status_all: "Alle"
|
||||||
|
spaces_pricing:
|
||||||
|
prices_match_space_hours_rates_html: "The prices below match one hour of space reservation, <strong>without subscription</strong>."
|
||||||
|
prices_calculated_on_hourly_rate_html: "All the prices will be automatically calculated based on the hourly rate defined here.<br/><em>For example</em>, if you define an hourly rate at {RATE}: a slot of {DURATION} minutes, will be charged <strong>{PRICE}</strong>."
|
||||||
|
you_can_override: "You can override this duration for each availability you create in the agenda. The price will then be adjusted accordingly."
|
||||||
|
extended_prices: "Moreover, you can define extended prices which will apply in priority over the hourly rate below. Extended prices allow you, for example, to set a favorable price for a booking of several hours."
|
||||||
|
spaces: "Spaces"
|
||||||
|
price_updated: "Price successfully updated"
|
||||||
machines_pricing:
|
machines_pricing:
|
||||||
prices_match_machine_hours_rates_html: "Prisene under samsvarer med en time maskinbruk <strong>uten medlemskap</strong>."
|
prices_match_machine_hours_rates_html: "Prisene under samsvarer med en time maskinbruk <strong>uten medlemskap</strong>."
|
||||||
prices_calculated_on_hourly_rate_html: "Alle priser vil bli automatisk kalkulert basert på oppgitt timepris her.<br/><em>For eksempel</em>, hvis du definerer en timepris på {RATE}: en plass på {DURATION} minutter, vil bli belastet <strong>{PRICE}</strong>."
|
prices_calculated_on_hourly_rate_html: "Alle priser vil bli automatisk kalkulert basert på oppgitt timepris her.<br/><em>For eksempel</em>, hvis du definerer en timepris på {RATE}: en plass på {DURATION} minutter, vil bli belastet <strong>{PRICE}</strong>."
|
||||||
@ -378,6 +385,13 @@
|
|||||||
packs: "Forhåndsbetalte pakker"
|
packs: "Forhåndsbetalte pakker"
|
||||||
no_packs: "Ingen pakker tilgjengelig nå"
|
no_packs: "Ingen pakker tilgjengelig nå"
|
||||||
pack_DURATION: "{DURATION} timer"
|
pack_DURATION: "{DURATION} timer"
|
||||||
|
configure_extended_prices_button:
|
||||||
|
extended_prices: "Extended prices"
|
||||||
|
no_extended_prices: "No extended price for now"
|
||||||
|
extended_price_DURATION: "{DURATION} minutes"
|
||||||
|
extended_price_form:
|
||||||
|
duration: "Duration (minutes)"
|
||||||
|
amount: "Price"
|
||||||
pack_form:
|
pack_form:
|
||||||
hours: "Timer"
|
hours: "Timer"
|
||||||
amount: "Pris"
|
amount: "Pris"
|
||||||
@ -404,6 +418,21 @@
|
|||||||
edit_pack: "Rediger pakken"
|
edit_pack: "Rediger pakken"
|
||||||
confirm_changes: "Bekreft endringer"
|
confirm_changes: "Bekreft endringer"
|
||||||
pack_successfully_updated: "Den forhåndsbetalte pakken ble oppdatert."
|
pack_successfully_updated: "Den forhåndsbetalte pakken ble oppdatert."
|
||||||
|
create_extended_price:
|
||||||
|
new_extended_price: "New extended price"
|
||||||
|
new_extended_price_info: "Extended prices allows you to define prices based on custom durations, instead of the default hourly rates."
|
||||||
|
create_extended_price: "Create extended price"
|
||||||
|
extended_price_successfully_created: "The new extended price was successfully created."
|
||||||
|
delete_extended_price:
|
||||||
|
extended_price_deleted: "The extended price was successfully deleted."
|
||||||
|
unable_to_delete: "Unable to delete the extended price: "
|
||||||
|
delete_extended_price: "Delete the extended price"
|
||||||
|
confirm_delete: "Delete"
|
||||||
|
delete_confirmation: "Are you sure you want to delete this extended price?"
|
||||||
|
edit_extended_price:
|
||||||
|
edit_extended_price: "Edit the extended price"
|
||||||
|
confirm_changes: "Confirm changes"
|
||||||
|
extended_price_successfully_updated: "The extended price was successfully updated."
|
||||||
#ajouter un code promotionnel
|
#ajouter un code promotionnel
|
||||||
coupons_new:
|
coupons_new:
|
||||||
add_a_coupon: "Legg til rabattkupong"
|
add_a_coupon: "Legg til rabattkupong"
|
||||||
@ -466,11 +495,12 @@
|
|||||||
details: "Detaljer"
|
details: "Detaljer"
|
||||||
amount: "Beløp"
|
amount: "Beløp"
|
||||||
machine_booking-3D_printer: "Reservere 3D-printer"
|
machine_booking-3D_printer: "Reservere 3D-printer"
|
||||||
|
training_booking-3D_print: "Training booking - initiation to 3d printing"
|
||||||
total_amount: "Totalbeløp"
|
total_amount: "Totalbeløp"
|
||||||
total_including_all_taxes: "Sum inkl. MVA"
|
total_including_all_taxes: "Sum inkl. MVA"
|
||||||
VAT_disabled: "MVA deaktivert"
|
VAT_disabled: "MVA deaktivert"
|
||||||
VAT_enabled: "MVA aktivert"
|
VAT_enabled: "MVA aktivert"
|
||||||
including_VAT: "Inkludert MVA"
|
including_VAT: "Inkludert MVA {RATE}% av {AMOUNT}"
|
||||||
including_total_excluding_taxes: "Totalpris, eks. MVA"
|
including_total_excluding_taxes: "Totalpris, eks. MVA"
|
||||||
including_amount_payed_on_ordering: "Inkludert beløp betalt ved bestilling"
|
including_amount_payed_on_ordering: "Inkludert beløp betalt ved bestilling"
|
||||||
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Oppgjør med betalingskort på {DATE} hos {TIME} for et beløp på {AMOUNT}"
|
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Oppgjør med betalingskort på {DATE} hos {TIME} for et beløp på {AMOUNT}"
|
||||||
@ -522,6 +552,15 @@
|
|||||||
enable_VAT: "Aktiver MVA"
|
enable_VAT: "Aktiver MVA"
|
||||||
VAT_rate: "MVA sats"
|
VAT_rate: "MVA sats"
|
||||||
VAT_history: "MVA-sats, historikk"
|
VAT_history: "MVA-sats, historikk"
|
||||||
|
VAT_notice: "This parameter configures the general case of the VAT rate and applies to everything sold by the Fablab. It is possible to override this parameter by setting a specific VAT rate for each object."
|
||||||
|
edit_multi_VAT_button: "More options"
|
||||||
|
multiVAT: "Advanced VAT"
|
||||||
|
multi_VAT_notice: "<strong>Please note</strong>: The current general rate is {RATE}%. Here you can define different VAT rates for each category.</br></br>For example, you can override this value, only for machine reservations, by filling in the corresponding field below. If no value is filled in, the general rate will apply."
|
||||||
|
VAT_rate_machine: "Machine reservation"
|
||||||
|
VAT_rate_space: "Space reservation"
|
||||||
|
VAT_rate_training: "Training reservation"
|
||||||
|
VAT_rate_event: "Event reservation"
|
||||||
|
VAT_rate_subscription: "Subscription"
|
||||||
changed_at: "Endret"
|
changed_at: "Endret"
|
||||||
changed_by: "Av"
|
changed_by: "Av"
|
||||||
deleted_user: "Slettet bruker"
|
deleted_user: "Slettet bruker"
|
||||||
@ -640,9 +679,10 @@
|
|||||||
codes_customization_success: "Tilpasning av regnskapskodene ble lagret."
|
codes_customization_success: "Tilpasning av regnskapskodene ble lagret."
|
||||||
unexpected_error_occurred: "Det oppstod en uventet feil under lagring av kodene. Prøv igjen senere."
|
unexpected_error_occurred: "Det oppstod en uventet feil under lagring av kodene. Prøv igjen senere."
|
||||||
export_accounting_data: "Eksporter regnskapsdata"
|
export_accounting_data: "Eksporter regnskapsdata"
|
||||||
export_to: "Eksporter til regnskapsprogramvare"
|
export_what: "What do you want to export?"
|
||||||
|
export_VAT: "Export the collected VAT"
|
||||||
|
export_to_ACD: "Export all data to the accounting software ACD"
|
||||||
export_is_running: "Eksport er startet. Du vil bli varslet når den er klar."
|
export_is_running: "Eksport er startet. Du vil bli varslet når den er klar."
|
||||||
acd: "ACD"
|
|
||||||
export_form_date: "Eksporter fra"
|
export_form_date: "Eksporter fra"
|
||||||
export_to_date: "Eksporter til"
|
export_to_date: "Eksporter til"
|
||||||
format: "Filformat"
|
format: "Filformat"
|
||||||
@ -665,6 +705,10 @@
|
|||||||
debit_euro: "Kreditt i Euro"
|
debit_euro: "Kreditt i Euro"
|
||||||
credit_euro: "Kreditt i Euro"
|
credit_euro: "Kreditt i Euro"
|
||||||
lettering: "Lettering"
|
lettering: "Lettering"
|
||||||
|
start_date: "Start date"
|
||||||
|
end_date: "End date"
|
||||||
|
vat_rate: "VAT rate"
|
||||||
|
amount: "Total amount"
|
||||||
payment:
|
payment:
|
||||||
payment_settings: "Betalingsinnstillinger"
|
payment_settings: "Betalingsinnstillinger"
|
||||||
online_payment: "Online betaling"
|
online_payment: "Online betaling"
|
||||||
@ -1235,6 +1279,9 @@
|
|||||||
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
|
pack_only_for_subscription_info_html: "If this option is activated, the purchase and use of a prepaid pack is only possible for the user with a valid subscription."
|
||||||
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
|
pack_only_for_subscription: "Subscription valid for purchase and use of a prepaid pack"
|
||||||
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
|
pack_only_for_subscription_info: "Make subscription mandatory for prepaid packs"
|
||||||
|
extended_prices: "Extended prices"
|
||||||
|
extended_prices_info_html: "Spaces can have different prices depending on the cumulated duration of the booking. You can choose if this apply to all bookings or only to those starting within the same day."
|
||||||
|
extended_prices_in_same_day: "Extended prices in the same day"
|
||||||
overlapping_options:
|
overlapping_options:
|
||||||
training_reservations: "Trainings"
|
training_reservations: "Trainings"
|
||||||
machine_reservations: "Machines"
|
machine_reservations: "Machines"
|
||||||
|
@ -368,6 +368,13 @@ pt:
|
|||||||
status_enabled: "Ativos"
|
status_enabled: "Ativos"
|
||||||
status_disabled: "Desabilitados"
|
status_disabled: "Desabilitados"
|
||||||
status_all: "Todos"
|
status_all: "Todos"
|
||||||
|
spaces_pricing:
|
||||||
|
prices_match_space_hours_rates_html: "The prices below match one hour of space reservation, <strong>without subscription</strong>."
|
||||||
|
prices_calculated_on_hourly_rate_html: "All the prices will be automatically calculated based on the hourly rate defined here.<br/><em>For example</em>, if you define an hourly rate at {RATE}: a slot of {DURATION} minutes, will be charged <strong>{PRICE}</strong>."
|
||||||
|
you_can_override: "You can override this duration for each availability you create in the agenda. The price will then be adjusted accordingly."
|
||||||
|
extended_prices: "Moreover, you can define extended prices which will apply in priority over the hourly rate below. Extended prices allow you, for example, to set a favorable price for a booking of several hours."
|
||||||
|
spaces: "Spaces"
|
||||||
|
price_updated: "Price successfully updated"
|
||||||
machines_pricing:
|
machines_pricing:
|
||||||
prices_match_machine_hours_rates_html: "Os preços abaixo correspondem a uma hora de uso de máquina, <strong>sem assinatura</strong>."
|
prices_match_machine_hours_rates_html: "Os preços abaixo correspondem a uma hora de uso de máquina, <strong>sem assinatura</strong>."
|
||||||
prices_calculated_on_hourly_rate_html: "Todos os preços serão calculados automaticamente com base na taxa horária definida aqui.<br/><em>Por exemplo</em>, se você definir uma taxa horária em {RATE}: um slot de {DURATION} minutos, será cobrada a tarifa <strong>{PRICE}</strong>."
|
prices_calculated_on_hourly_rate_html: "Todos os preços serão calculados automaticamente com base na taxa horária definida aqui.<br/><em>Por exemplo</em>, se você definir uma taxa horária em {RATE}: um slot de {DURATION} minutos, será cobrada a tarifa <strong>{PRICE}</strong>."
|
||||||
@ -378,6 +385,13 @@ pt:
|
|||||||
packs: "Pacotes pré-pagos"
|
packs: "Pacotes pré-pagos"
|
||||||
no_packs: "Não há pacotes no momento"
|
no_packs: "Não há pacotes no momento"
|
||||||
pack_DURATION: "{DURATION} horas"
|
pack_DURATION: "{DURATION} horas"
|
||||||
|
configure_extended_prices_button:
|
||||||
|
extended_prices: "Extended prices"
|
||||||
|
no_extended_prices: "No extended price for now"
|
||||||
|
extended_price_DURATION: "{DURATION} minutes"
|
||||||
|
extended_price_form:
|
||||||
|
duration: "Duration (minutes)"
|
||||||
|
amount: "Price"
|
||||||
pack_form:
|
pack_form:
|
||||||
hours: "Horas"
|
hours: "Horas"
|
||||||
amount: "Preço"
|
amount: "Preço"
|
||||||
@ -404,6 +418,21 @@ pt:
|
|||||||
edit_pack: "Editar o pacote"
|
edit_pack: "Editar o pacote"
|
||||||
confirm_changes: "Confirmar alterações"
|
confirm_changes: "Confirmar alterações"
|
||||||
pack_successfully_updated: "O pacote pré-pago foi atualizado com sucesso."
|
pack_successfully_updated: "O pacote pré-pago foi atualizado com sucesso."
|
||||||
|
create_extended_price:
|
||||||
|
new_extended_price: "New extended price"
|
||||||
|
new_extended_price_info: "Extended prices allows you to define prices based on custom durations, instead of the default hourly rates."
|
||||||
|
create_extended_price: "Create extended price"
|
||||||
|
extended_price_successfully_created: "The new extended price was successfully created."
|
||||||
|
delete_extended_price:
|
||||||
|
extended_price_deleted: "The extended price was successfully deleted."
|
||||||
|
unable_to_delete: "Unable to delete the extended price: "
|
||||||
|
delete_extended_price: "Delete the extended price"
|
||||||
|
confirm_delete: "Delete"
|
||||||
|
delete_confirmation: "Are you sure you want to delete this extended price?"
|
||||||
|
edit_extended_price:
|
||||||
|
edit_extended_price: "Edit the extended price"
|
||||||
|
confirm_changes: "Confirm changes"
|
||||||
|
extended_price_successfully_updated: "The extended price was successfully updated."
|
||||||
#ajouter un code promotionnel
|
#ajouter un code promotionnel
|
||||||
coupons_new:
|
coupons_new:
|
||||||
add_a_coupon: "Adicionar cupom"
|
add_a_coupon: "Adicionar cupom"
|
||||||
@ -466,11 +495,12 @@ pt:
|
|||||||
details: "Detalhes"
|
details: "Detalhes"
|
||||||
amount: "Montante"
|
amount: "Montante"
|
||||||
machine_booking-3D_printer: "Reserva de máquina - 3D printer"
|
machine_booking-3D_printer: "Reserva de máquina - 3D printer"
|
||||||
|
training_booking-3D_print: "Training booking - initiation to 3d printing"
|
||||||
total_amount: "Montante total"
|
total_amount: "Montante total"
|
||||||
total_including_all_taxes: "Total incluindo todas as taxas"
|
total_including_all_taxes: "Total incluindo todas as taxas"
|
||||||
VAT_disabled: "IVA desativado"
|
VAT_disabled: "IVA desativado"
|
||||||
VAT_enabled: "IVA activado"
|
VAT_enabled: "IVA activado"
|
||||||
including_VAT: "Incluindo IVA"
|
including_VAT: "Incluindo IVA {RATE}% de {AMOUNT}"
|
||||||
including_total_excluding_taxes: "Incluindo o total de taxas excluidas"
|
including_total_excluding_taxes: "Incluindo o total de taxas excluidas"
|
||||||
including_amount_payed_on_ordering: "Incluindo o valor pago na compra"
|
including_amount_payed_on_ordering: "Incluindo o valor pago na compra"
|
||||||
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Pagamento por cartão de débito em {DATE} ás {TIME}, no valor de {AMOUNT}"
|
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "Pagamento por cartão de débito em {DATE} ás {TIME}, no valor de {AMOUNT}"
|
||||||
@ -522,6 +552,15 @@ pt:
|
|||||||
enable_VAT: "Ativar VAT"
|
enable_VAT: "Ativar VAT"
|
||||||
VAT_rate: "VAT taxa"
|
VAT_rate: "VAT taxa"
|
||||||
VAT_history: "Histórico de taxas"
|
VAT_history: "Histórico de taxas"
|
||||||
|
VAT_notice: "This parameter configures the general case of the VAT rate and applies to everything sold by the Fablab. It is possible to override this parameter by setting a specific VAT rate for each object."
|
||||||
|
edit_multi_VAT_button: "More options"
|
||||||
|
multiVAT: "Advanced VAT"
|
||||||
|
multi_VAT_notice: "<strong>Please note</strong>: The current general rate is {RATE}%. Here you can define different VAT rates for each category.</br></br>For example, you can override this value, only for machine reservations, by filling in the corresponding field below. If no value is filled in, the general rate will apply."
|
||||||
|
VAT_rate_machine: "Machine reservation"
|
||||||
|
VAT_rate_space: "Space reservation"
|
||||||
|
VAT_rate_training: "Training reservation"
|
||||||
|
VAT_rate_event: "Event reservation"
|
||||||
|
VAT_rate_subscription: "Subscription"
|
||||||
changed_at: "Alterado em"
|
changed_at: "Alterado em"
|
||||||
changed_by: "Por"
|
changed_by: "Por"
|
||||||
deleted_user: "Usuário deletado"
|
deleted_user: "Usuário deletado"
|
||||||
@ -640,9 +679,10 @@ pt:
|
|||||||
codes_customization_success: "Customization of accounting codes successfully saved."
|
codes_customization_success: "Customization of accounting codes successfully saved."
|
||||||
unexpected_error_occurred: "Ocorreu um erro inesperado ao salvar os códigos. Tente novamente mais tarde."
|
unexpected_error_occurred: "Ocorreu um erro inesperado ao salvar os códigos. Tente novamente mais tarde."
|
||||||
export_accounting_data: "Exportar dados de contabilidade"
|
export_accounting_data: "Exportar dados de contabilidade"
|
||||||
export_to: "Exportar para o software de contabilidade"
|
export_what: "What do you want to export?"
|
||||||
|
export_VAT: "Export the collected VAT"
|
||||||
|
export_to_ACD: "Export all data to the accounting software ACD"
|
||||||
export_is_running: "A Exportação está em andamento. Você será notificado quando terminar."
|
export_is_running: "A Exportação está em andamento. Você será notificado quando terminar."
|
||||||
acd: "ACD"
|
|
||||||
export_form_date: "Exportar de"
|
export_form_date: "Exportar de"
|
||||||
export_to_date: "Exportar até"
|
export_to_date: "Exportar até"
|
||||||
format: "Formato do arquivo"
|
format: "Formato do arquivo"
|
||||||
@ -665,6 +705,10 @@ pt:
|
|||||||
debit_euro: "Débito em euro"
|
debit_euro: "Débito em euro"
|
||||||
credit_euro: "Crédito em euro"
|
credit_euro: "Crédito em euro"
|
||||||
lettering: "Letras"
|
lettering: "Letras"
|
||||||
|
start_date: "Start date"
|
||||||
|
end_date: "End date"
|
||||||
|
vat_rate: "VAT rate"
|
||||||
|
amount: "Total amount"
|
||||||
payment:
|
payment:
|
||||||
payment_settings: "Configurações de pagamento"
|
payment_settings: "Configurações de pagamento"
|
||||||
online_payment: "Pagamento Online"
|
online_payment: "Pagamento Online"
|
||||||
@ -1235,6 +1279,9 @@ pt:
|
|||||||
pack_only_for_subscription_info_html: "Se esta opção estiver ativada, a compra e uso de um pacote pré-pago só é possível para o usuário com uma assinatura válida."
|
pack_only_for_subscription_info_html: "Se esta opção estiver ativada, a compra e uso de um pacote pré-pago só é possível para o usuário com uma assinatura válida."
|
||||||
pack_only_for_subscription: "Assinatura válida para compra e uso de um pacote pré-pago"
|
pack_only_for_subscription: "Assinatura válida para compra e uso de um pacote pré-pago"
|
||||||
pack_only_for_subscription_info: "Tornar obrigatória a assinatura para pacotes pré-pagos"
|
pack_only_for_subscription_info: "Tornar obrigatória a assinatura para pacotes pré-pagos"
|
||||||
|
extended_prices: "Extended prices"
|
||||||
|
extended_prices_info_html: "Spaces can have different prices depending on the cumulated duration of the booking. You can choose if this apply to all bookings or only to those starting within the same day."
|
||||||
|
extended_prices_in_same_day: "Extended prices in the same day"
|
||||||
overlapping_options:
|
overlapping_options:
|
||||||
training_reservations: "Treinamentos"
|
training_reservations: "Treinamentos"
|
||||||
machine_reservations: "Máquinas"
|
machine_reservations: "Máquinas"
|
||||||
|
@ -368,6 +368,13 @@ zu:
|
|||||||
status_enabled: "crwdns7265:0crwdne7265:0"
|
status_enabled: "crwdns7265:0crwdne7265:0"
|
||||||
status_disabled: "crwdns7267:0crwdne7267:0"
|
status_disabled: "crwdns7267:0crwdne7267:0"
|
||||||
status_all: "crwdns7269:0crwdne7269:0"
|
status_all: "crwdns7269:0crwdne7269:0"
|
||||||
|
spaces_pricing:
|
||||||
|
prices_match_space_hours_rates_html: "crwdns22175:0crwdne22175:0"
|
||||||
|
prices_calculated_on_hourly_rate_html: "crwdns22177:0{RATE}crwdnd22177:0{DURATION}crwdnd22177:0{PRICE}crwdne22177:0"
|
||||||
|
you_can_override: "crwdns22179:0crwdne22179:0"
|
||||||
|
extended_prices: "crwdns22181:0crwdne22181:0"
|
||||||
|
spaces: "crwdns22183:0crwdne22183:0"
|
||||||
|
price_updated: "crwdns22135:0crwdne22135:0"
|
||||||
machines_pricing:
|
machines_pricing:
|
||||||
prices_match_machine_hours_rates_html: "crwdns21942:0crwdne21942:0"
|
prices_match_machine_hours_rates_html: "crwdns21942:0crwdne21942:0"
|
||||||
prices_calculated_on_hourly_rate_html: "crwdns22028:0{RATE}crwdnd22028:0{DURATION}crwdnd22028:0{PRICE}crwdne22028:0"
|
prices_calculated_on_hourly_rate_html: "crwdns22028:0{RATE}crwdnd22028:0{DURATION}crwdnd22028:0{PRICE}crwdne22028:0"
|
||||||
@ -378,6 +385,13 @@ zu:
|
|||||||
packs: "crwdns21952:0crwdne21952:0"
|
packs: "crwdns21952:0crwdne21952:0"
|
||||||
no_packs: "crwdns21954:0crwdne21954:0"
|
no_packs: "crwdns21954:0crwdne21954:0"
|
||||||
pack_DURATION: "crwdns21956:0{DURATION}crwdne21956:0"
|
pack_DURATION: "crwdns21956:0{DURATION}crwdne21956:0"
|
||||||
|
configure_extended_prices_button:
|
||||||
|
extended_prices: "crwdns22185:0crwdne22185:0"
|
||||||
|
no_extended_prices: "crwdns22187:0crwdne22187:0"
|
||||||
|
extended_price_DURATION: "crwdns22189:0{DURATION}crwdne22189:0"
|
||||||
|
extended_price_form:
|
||||||
|
duration: "crwdns22191:0crwdne22191:0"
|
||||||
|
amount: "crwdns22193:0crwdne22193:0"
|
||||||
pack_form:
|
pack_form:
|
||||||
hours: "crwdns21958:0crwdne21958:0"
|
hours: "crwdns21958:0crwdne21958:0"
|
||||||
amount: "crwdns21960:0crwdne21960:0"
|
amount: "crwdns21960:0crwdne21960:0"
|
||||||
@ -404,6 +418,21 @@ zu:
|
|||||||
edit_pack: "crwdns21994:0crwdne21994:0"
|
edit_pack: "crwdns21994:0crwdne21994:0"
|
||||||
confirm_changes: "crwdns21996:0crwdne21996:0"
|
confirm_changes: "crwdns21996:0crwdne21996:0"
|
||||||
pack_successfully_updated: "crwdns21998:0crwdne21998:0"
|
pack_successfully_updated: "crwdns21998:0crwdne21998:0"
|
||||||
|
create_extended_price:
|
||||||
|
new_extended_price: "crwdns22195:0crwdne22195:0"
|
||||||
|
new_extended_price_info: "crwdns22197:0crwdne22197:0"
|
||||||
|
create_extended_price: "crwdns22199:0crwdne22199:0"
|
||||||
|
extended_price_successfully_created: "crwdns22201:0crwdne22201:0"
|
||||||
|
delete_extended_price:
|
||||||
|
extended_price_deleted: "crwdns22203:0crwdne22203:0"
|
||||||
|
unable_to_delete: "crwdns22205:0crwdne22205:0"
|
||||||
|
delete_extended_price: "crwdns22207:0crwdne22207:0"
|
||||||
|
confirm_delete: "crwdns22209:0crwdne22209:0"
|
||||||
|
delete_confirmation: "crwdns22211:0crwdne22211:0"
|
||||||
|
edit_extended_price:
|
||||||
|
edit_extended_price: "crwdns22213:0crwdne22213:0"
|
||||||
|
confirm_changes: "crwdns22215:0crwdne22215:0"
|
||||||
|
extended_price_successfully_updated: "crwdns22217:0crwdne22217:0"
|
||||||
#ajouter un code promotionnel
|
#ajouter un code promotionnel
|
||||||
coupons_new:
|
coupons_new:
|
||||||
add_a_coupon: "crwdns7271:0crwdne7271:0"
|
add_a_coupon: "crwdns7271:0crwdne7271:0"
|
||||||
@ -466,13 +495,14 @@ zu:
|
|||||||
details: "crwdns7363:0crwdne7363:0"
|
details: "crwdns7363:0crwdne7363:0"
|
||||||
amount: "crwdns7365:0crwdne7365:0"
|
amount: "crwdns7365:0crwdne7365:0"
|
||||||
machine_booking-3D_printer: "crwdns7367:0crwdne7367:0"
|
machine_booking-3D_printer: "crwdns7367:0crwdne7367:0"
|
||||||
|
training_booking-3D_print: "crwdns22219:0crwdne22219:0"
|
||||||
total_amount: "crwdns7369:0crwdne7369:0"
|
total_amount: "crwdns7369:0crwdne7369:0"
|
||||||
total_including_all_taxes: "crwdns7371:0crwdne7371:0"
|
total_including_all_taxes: "crwdns7371:0crwdne7371:0"
|
||||||
VAT_disabled: "crwdns7373:0crwdne7373:0"
|
VAT_disabled: "crwdns7373:0crwdne7373:0"
|
||||||
VAT_enabled: "crwdns7375:0crwdne7375:0"
|
VAT_enabled: "crwdns7375:0crwdne7375:0"
|
||||||
including_VAT: "crwdns7377:0crwdne7377:0"
|
including_VAT: "crwdns22221:0{RATE}crwdnd22221:0{AMOUNT}crwdne22221:0"
|
||||||
including_total_excluding_taxes: "crwdns7379:0crwdne7379:0"
|
including_total_excluding_taxes: "crwdns7379:0crwdne7379:0"
|
||||||
including_amount_payed_on_ordering: "crwdns7381:0crwdne7381:0"
|
including_amount_payed_on_ordering: "crwdns22223:0crwdne22223:0"
|
||||||
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "crwdns7383:0{DATE}crwdnd7383:0{TIME}crwdnd7383:0{AMOUNT}crwdne7383:0"
|
settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT: "crwdns7383:0{DATE}crwdnd7383:0{TIME}crwdnd7383:0{AMOUNT}crwdne7383:0"
|
||||||
important_notes: "crwdns7385:0crwdne7385:0"
|
important_notes: "crwdns7385:0crwdne7385:0"
|
||||||
address_and_legal_information: "crwdns7387:0crwdne7387:0"
|
address_and_legal_information: "crwdns7387:0crwdne7387:0"
|
||||||
@ -522,6 +552,15 @@ zu:
|
|||||||
enable_VAT: "crwdns7469:0crwdne7469:0"
|
enable_VAT: "crwdns7469:0crwdne7469:0"
|
||||||
VAT_rate: "crwdns7471:0crwdne7471:0"
|
VAT_rate: "crwdns7471:0crwdne7471:0"
|
||||||
VAT_history: "crwdns7473:0crwdne7473:0"
|
VAT_history: "crwdns7473:0crwdne7473:0"
|
||||||
|
VAT_notice: "crwdns22225:0crwdne22225:0"
|
||||||
|
edit_multi_VAT_button: "crwdns22227:0crwdne22227:0"
|
||||||
|
multiVAT: "crwdns22229:0crwdne22229:0"
|
||||||
|
multi_VAT_notice: "crwdns22231:0{RATE}crwdne22231:0"
|
||||||
|
VAT_rate_machine: "crwdns22233:0crwdne22233:0"
|
||||||
|
VAT_rate_space: "crwdns22235:0crwdne22235:0"
|
||||||
|
VAT_rate_training: "crwdns22237:0crwdne22237:0"
|
||||||
|
VAT_rate_event: "crwdns22239:0crwdne22239:0"
|
||||||
|
VAT_rate_subscription: "crwdns22241:0crwdne22241:0"
|
||||||
changed_at: "crwdns7475:0crwdne7475:0"
|
changed_at: "crwdns7475:0crwdne7475:0"
|
||||||
changed_by: "crwdns7477:0crwdne7477:0"
|
changed_by: "crwdns7477:0crwdne7477:0"
|
||||||
deleted_user: "crwdns7479:0crwdne7479:0"
|
deleted_user: "crwdns7479:0crwdne7479:0"
|
||||||
@ -640,9 +679,10 @@ zu:
|
|||||||
codes_customization_success: "crwdns7683:0crwdne7683:0"
|
codes_customization_success: "crwdns7683:0crwdne7683:0"
|
||||||
unexpected_error_occurred: "crwdns20578:0crwdne20578:0"
|
unexpected_error_occurred: "crwdns20578:0crwdne20578:0"
|
||||||
export_accounting_data: "crwdns7685:0crwdne7685:0"
|
export_accounting_data: "crwdns7685:0crwdne7685:0"
|
||||||
export_to: "crwdns7687:0crwdne7687:0"
|
export_what: "crwdns22243:0crwdne22243:0"
|
||||||
|
export_VAT: "crwdns22245:0crwdne22245:0"
|
||||||
|
export_to_ACD: "crwdns22247:0crwdne22247:0"
|
||||||
export_is_running: "crwdns7689:0crwdne7689:0"
|
export_is_running: "crwdns7689:0crwdne7689:0"
|
||||||
acd: "crwdns7691:0crwdne7691:0"
|
|
||||||
export_form_date: "crwdns7693:0crwdne7693:0"
|
export_form_date: "crwdns7693:0crwdne7693:0"
|
||||||
export_to_date: "crwdns7695:0crwdne7695:0"
|
export_to_date: "crwdns7695:0crwdne7695:0"
|
||||||
format: "crwdns7697:0crwdne7697:0"
|
format: "crwdns7697:0crwdne7697:0"
|
||||||
@ -665,6 +705,10 @@ zu:
|
|||||||
debit_euro: "crwdns7729:0crwdne7729:0"
|
debit_euro: "crwdns7729:0crwdne7729:0"
|
||||||
credit_euro: "crwdns7731:0crwdne7731:0"
|
credit_euro: "crwdns7731:0crwdne7731:0"
|
||||||
lettering: "crwdns7733:0crwdne7733:0"
|
lettering: "crwdns7733:0crwdne7733:0"
|
||||||
|
start_date: "crwdns22249:0crwdne22249:0"
|
||||||
|
end_date: "crwdns22251:0crwdne22251:0"
|
||||||
|
vat_rate: "crwdns22253:0crwdne22253:0"
|
||||||
|
amount: "crwdns22255:0crwdne22255:0"
|
||||||
payment:
|
payment:
|
||||||
payment_settings: "crwdns20580:0crwdne20580:0"
|
payment_settings: "crwdns20580:0crwdne20580:0"
|
||||||
online_payment: "crwdns20582:0crwdne20582:0"
|
online_payment: "crwdns20582:0crwdne20582:0"
|
||||||
@ -1235,6 +1279,9 @@ zu:
|
|||||||
pack_only_for_subscription_info_html: "crwdns22037:0crwdne22037:0"
|
pack_only_for_subscription_info_html: "crwdns22037:0crwdne22037:0"
|
||||||
pack_only_for_subscription: "crwdns22039:0crwdne22039:0"
|
pack_only_for_subscription: "crwdns22039:0crwdne22039:0"
|
||||||
pack_only_for_subscription_info: "crwdns22041:0crwdne22041:0"
|
pack_only_for_subscription_info: "crwdns22041:0crwdne22041:0"
|
||||||
|
extended_prices: "crwdns22167:0crwdne22167:0"
|
||||||
|
extended_prices_info_html: "crwdns22169:0crwdne22169:0"
|
||||||
|
extended_prices_in_same_day: "crwdns22171:0crwdne22171:0"
|
||||||
overlapping_options:
|
overlapping_options:
|
||||||
training_reservations: "crwdns22111:0crwdne22111:0"
|
training_reservations: "crwdns22111:0crwdne22111:0"
|
||||||
machine_reservations: "crwdns22113:0crwdne22113:0"
|
machine_reservations: "crwdns22113:0crwdne22113:0"
|
||||||
|
@ -90,7 +90,7 @@ de:
|
|||||||
other: "%{count} %{NAME}-Tickets"
|
other: "%{count} %{NAME}-Tickets"
|
||||||
coupon_CODE_discount_of_DISCOUNT: "Gutschein {CODE}: Rabatt von {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation
|
coupon_CODE_discount_of_DISCOUNT: "Gutschein {CODE}: Rabatt von {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation
|
||||||
total_including_all_taxes: "Gesamtpreis inkl. Steuern"
|
total_including_all_taxes: "Gesamtpreis inkl. Steuern"
|
||||||
including_VAT_RATE: "Inklusive MwSt. %{RATE}%"
|
including_VAT_RATE: "Inklusive MwSt. %{RATE}% von %{AMOUNT}"
|
||||||
including_total_excluding_taxes: "Gesamtbetrag zzgl. Steuern"
|
including_total_excluding_taxes: "Gesamtbetrag zzgl. Steuern"
|
||||||
including_amount_payed_on_ordering: "Inklusive bei Bestellung bezahlter Betrag"
|
including_amount_payed_on_ordering: "Inklusive bei Bestellung bezahlter Betrag"
|
||||||
total_amount: "Gesamtbetrag"
|
total_amount: "Gesamtbetrag"
|
||||||
@ -123,7 +123,7 @@ de:
|
|||||||
subscription_of_NAME_for_DURATION_starting_from_DATE: "the subscription of %{NAME} for %{DURATION} starting from %{DATE}"
|
subscription_of_NAME_for_DURATION_starting_from_DATE: "the subscription of %{NAME} for %{DURATION} starting from %{DATE}"
|
||||||
deadlines: "Table of your deadlines"
|
deadlines: "Table of your deadlines"
|
||||||
deadline_date: "Payment date"
|
deadline_date: "Payment date"
|
||||||
deadline_amount: "Amount including tax"
|
deadline_amount: "Betrag inklusive Steuern"
|
||||||
total_amount: "Total amount"
|
total_amount: "Total amount"
|
||||||
settlement_by_METHOD: "Debits will be made by {METHOD, select, card{card} other{check}} for each deadlines."
|
settlement_by_METHOD: "Debits will be made by {METHOD, select, card{card} other{check}} for each deadlines."
|
||||||
settlement_by_wallet: "%{AMOUNT} will be debited from your wallet to settle the first deadline."
|
settlement_by_wallet: "%{AMOUNT} will be debited from your wallet to settle the first deadline."
|
||||||
@ -147,6 +147,11 @@ de:
|
|||||||
Event_reservation: "Veranstaltungsreservierung"
|
Event_reservation: "Veranstaltungsreservierung"
|
||||||
Space_reservation: "Raumreservierung"
|
Space_reservation: "Raumreservierung"
|
||||||
wallet: "Guthabenkonto"
|
wallet: "Guthabenkonto"
|
||||||
|
vat_export:
|
||||||
|
start_date: "Start date"
|
||||||
|
end_date: "End date"
|
||||||
|
vat_rate: "VAT rate"
|
||||||
|
amount: "Total amount"
|
||||||
#training availabilities
|
#training availabilities
|
||||||
trainings:
|
trainings:
|
||||||
i_ve_reserved: "Ich reservierte"
|
i_ve_reserved: "Ich reservierte"
|
||||||
@ -331,6 +336,7 @@ de:
|
|||||||
users_reservations: "der Reservierungsliste"
|
users_reservations: "der Reservierungsliste"
|
||||||
availabilities_index: "der Verfügbarkeit der Reservierungen"
|
availabilities_index: "der Verfügbarkeit der Reservierungen"
|
||||||
accounting_acd: "der Rechnungsdaten für ACD"
|
accounting_acd: "der Rechnungsdaten für ACD"
|
||||||
|
accounting_vat: "of the collected VAT"
|
||||||
is_over: "ist beendet."
|
is_over: "ist beendet."
|
||||||
download_here: "Hier herunterladen"
|
download_here: "Hier herunterladen"
|
||||||
notify_admin_import_complete:
|
notify_admin_import_complete:
|
||||||
@ -535,3 +541,4 @@ de:
|
|||||||
renew_pack_threshold: "Threshold for packs renewal"
|
renew_pack_threshold: "Threshold for packs renewal"
|
||||||
pack_only_for_subscription: "Restrict packs for subscribers"
|
pack_only_for_subscription: "Restrict packs for subscribers"
|
||||||
overlapping_categories: "Categories for overlapping booking prevention"
|
overlapping_categories: "Categories for overlapping booking prevention"
|
||||||
|
extended_prices_in_same_day: "Extended prices in the same day"
|
||||||
|
@ -90,7 +90,7 @@ en:
|
|||||||
other: "%{count} %{NAME} tickets"
|
other: "%{count} %{NAME} tickets"
|
||||||
coupon_CODE_discount_of_DISCOUNT: "Coupon {CODE}: discount of {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation
|
coupon_CODE_discount_of_DISCOUNT: "Coupon {CODE}: discount of {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation
|
||||||
total_including_all_taxes: "Total incl. all taxes"
|
total_including_all_taxes: "Total incl. all taxes"
|
||||||
including_VAT_RATE: "Including VAT %{RATE}%"
|
including_VAT_RATE: "Including VAT %{RATE}% of %{AMOUNT}"
|
||||||
including_total_excluding_taxes: "Including Total excl. taxes"
|
including_total_excluding_taxes: "Including Total excl. taxes"
|
||||||
including_amount_payed_on_ordering: "Including amount payed on ordering"
|
including_amount_payed_on_ordering: "Including amount payed on ordering"
|
||||||
total_amount: "Total amount"
|
total_amount: "Total amount"
|
||||||
@ -147,6 +147,11 @@ en:
|
|||||||
Event_reservation: "event reserv."
|
Event_reservation: "event reserv."
|
||||||
Space_reservation: "space reserv."
|
Space_reservation: "space reserv."
|
||||||
wallet: "wallet"
|
wallet: "wallet"
|
||||||
|
vat_export:
|
||||||
|
start_date: "Start date"
|
||||||
|
end_date: "End date"
|
||||||
|
vat_rate: "VAT rate"
|
||||||
|
amount: "Total amount"
|
||||||
#training availabilities
|
#training availabilities
|
||||||
trainings:
|
trainings:
|
||||||
i_ve_reserved: "I've reserved"
|
i_ve_reserved: "I've reserved"
|
||||||
@ -331,6 +336,7 @@ en:
|
|||||||
users_reservations: "of the reservations' list"
|
users_reservations: "of the reservations' list"
|
||||||
availabilities_index: "of the reservations availabilities"
|
availabilities_index: "of the reservations availabilities"
|
||||||
accounting_acd: "of the accounting data to ACD"
|
accounting_acd: "of the accounting data to ACD"
|
||||||
|
accounting_vat: "of the collected VAT"
|
||||||
is_over: "is over."
|
is_over: "is over."
|
||||||
download_here: "Download here"
|
download_here: "Download here"
|
||||||
notify_admin_import_complete:
|
notify_admin_import_complete:
|
||||||
|
@ -90,7 +90,7 @@ es:
|
|||||||
other: "%{count} %{NAME} entradas"
|
other: "%{count} %{NAME} entradas"
|
||||||
coupon_CODE_discount_of_DISCOUNT: "Cupón {CODE}: descuento de {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation
|
coupon_CODE_discount_of_DISCOUNT: "Cupón {CODE}: descuento de {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation
|
||||||
total_including_all_taxes: "Total impuestos incluidos"
|
total_including_all_taxes: "Total impuestos incluidos"
|
||||||
including_VAT_RATE: "Incluyendo IVA %{RATE}%"
|
including_VAT_RATE: "Incluido IVA %{RATE}% de %{AMOUNT}"
|
||||||
including_total_excluding_taxes: "Excluyendo IVA"
|
including_total_excluding_taxes: "Excluyendo IVA"
|
||||||
including_amount_payed_on_ordering: "Incluyendo cantidad pagada en el pedido"
|
including_amount_payed_on_ordering: "Incluyendo cantidad pagada en el pedido"
|
||||||
total_amount: "Precio total"
|
total_amount: "Precio total"
|
||||||
@ -123,7 +123,7 @@ es:
|
|||||||
subscription_of_NAME_for_DURATION_starting_from_DATE: "the subscription of %{NAME} for %{DURATION} starting from %{DATE}"
|
subscription_of_NAME_for_DURATION_starting_from_DATE: "the subscription of %{NAME} for %{DURATION} starting from %{DATE}"
|
||||||
deadlines: "Table of your deadlines"
|
deadlines: "Table of your deadlines"
|
||||||
deadline_date: "Payment date"
|
deadline_date: "Payment date"
|
||||||
deadline_amount: "Amount including tax"
|
deadline_amount: "Total Incluyendo Impuesto"
|
||||||
total_amount: "Total amount"
|
total_amount: "Total amount"
|
||||||
settlement_by_METHOD: "Debits will be made by {METHOD, select, card{card} other{check}} for each deadlines."
|
settlement_by_METHOD: "Debits will be made by {METHOD, select, card{card} other{check}} for each deadlines."
|
||||||
settlement_by_wallet: "%{AMOUNT} will be debited from your wallet to settle the first deadline."
|
settlement_by_wallet: "%{AMOUNT} will be debited from your wallet to settle the first deadline."
|
||||||
@ -147,6 +147,11 @@ es:
|
|||||||
Event_reservation: "reserv. evento"
|
Event_reservation: "reserv. evento"
|
||||||
Space_reservation: "reserv. espacio"
|
Space_reservation: "reserv. espacio"
|
||||||
wallet: "cartera"
|
wallet: "cartera"
|
||||||
|
vat_export:
|
||||||
|
start_date: "Start date"
|
||||||
|
end_date: "End date"
|
||||||
|
vat_rate: "VAT rate"
|
||||||
|
amount: "Total amount"
|
||||||
#training availabilities
|
#training availabilities
|
||||||
trainings:
|
trainings:
|
||||||
i_ve_reserved: "Reservé"
|
i_ve_reserved: "Reservé"
|
||||||
@ -331,6 +336,7 @@ es:
|
|||||||
users_reservations: "de la lista de reservas"
|
users_reservations: "de la lista de reservas"
|
||||||
availabilities_index: "de las reservas disponibles"
|
availabilities_index: "de las reservas disponibles"
|
||||||
accounting_acd: "de los datos contables para ACD"
|
accounting_acd: "de los datos contables para ACD"
|
||||||
|
accounting_vat: "of the collected VAT"
|
||||||
is_over: "se ha acabado."
|
is_over: "se ha acabado."
|
||||||
download_here: "Descargar aquí"
|
download_here: "Descargar aquí"
|
||||||
notify_admin_import_complete:
|
notify_admin_import_complete:
|
||||||
@ -535,3 +541,4 @@ es:
|
|||||||
renew_pack_threshold: "Threshold for packs renewal"
|
renew_pack_threshold: "Threshold for packs renewal"
|
||||||
pack_only_for_subscription: "Restrict packs for subscribers"
|
pack_only_for_subscription: "Restrict packs for subscribers"
|
||||||
overlapping_categories: "Categories for overlapping booking prevention"
|
overlapping_categories: "Categories for overlapping booking prevention"
|
||||||
|
extended_prices_in_same_day: "Extended prices in the same day"
|
||||||
|
@ -90,7 +90,7 @@ fr:
|
|||||||
other: "%{count} places %{NAME}"
|
other: "%{count} places %{NAME}"
|
||||||
coupon_CODE_discount_of_DISCOUNT: "Code {CODE} : remise de {DISCOUNT} {TYPE, select, percent_off{%} other{}}" #messageFormat interpolation
|
coupon_CODE_discount_of_DISCOUNT: "Code {CODE} : remise de {DISCOUNT} {TYPE, select, percent_off{%} other{}}" #messageFormat interpolation
|
||||||
total_including_all_taxes: "Total TTC"
|
total_including_all_taxes: "Total TTC"
|
||||||
including_VAT_RATE: "Dont TVA %{RATE}%"
|
including_VAT_RATE: "Dont TVA %{RATE} % de %{AMOUNT}"
|
||||||
including_total_excluding_taxes: "Dont total HT"
|
including_total_excluding_taxes: "Dont total HT"
|
||||||
including_amount_payed_on_ordering: "Dont montant payé à la commande"
|
including_amount_payed_on_ordering: "Dont montant payé à la commande"
|
||||||
total_amount: "Montant total"
|
total_amount: "Montant total"
|
||||||
@ -147,6 +147,11 @@ fr:
|
|||||||
Event_reservation: "réserv. événement"
|
Event_reservation: "réserv. événement"
|
||||||
Space_reservation: "réserv. espace"
|
Space_reservation: "réserv. espace"
|
||||||
wallet: "porte-monnaie"
|
wallet: "porte-monnaie"
|
||||||
|
vat_export:
|
||||||
|
start_date: "Date de début"
|
||||||
|
end_date: "Date de fin"
|
||||||
|
vat_rate: "Taux de TVA"
|
||||||
|
amount: "Montant total"
|
||||||
#training availabilities
|
#training availabilities
|
||||||
trainings:
|
trainings:
|
||||||
i_ve_reserved: "J'ai réservé"
|
i_ve_reserved: "J'ai réservé"
|
||||||
@ -331,6 +336,7 @@ fr:
|
|||||||
users_reservations: "de la liste des réservations"
|
users_reservations: "de la liste des réservations"
|
||||||
availabilities_index: "des disponibilités de réservations"
|
availabilities_index: "des disponibilités de réservations"
|
||||||
accounting_acd: "des données comptables pour ACD"
|
accounting_acd: "des données comptables pour ACD"
|
||||||
|
accounting_vat: "de la TVA collectée"
|
||||||
is_over: "est terminé."
|
is_over: "est terminé."
|
||||||
download_here: "Téléchargez ici"
|
download_here: "Téléchargez ici"
|
||||||
notify_admin_import_complete:
|
notify_admin_import_complete:
|
||||||
@ -535,3 +541,4 @@ fr:
|
|||||||
renew_pack_threshold: "Seuil de renouvellement des packs"
|
renew_pack_threshold: "Seuil de renouvellement des packs"
|
||||||
pack_only_for_subscription: "Restreindre les packs pour les abonnés"
|
pack_only_for_subscription: "Restreindre les packs pour les abonnés"
|
||||||
overlapping_categories: "Catégories pour la prévention du chevauchement des réservations"
|
overlapping_categories: "Catégories pour la prévention du chevauchement des réservations"
|
||||||
|
extended_prices_in_same_day: "Prix étendus le même jour"
|
||||||
|
@ -231,7 +231,8 @@ de:
|
|||||||
users_subscriptions: "der Abonnementliste"
|
users_subscriptions: "der Abonnementliste"
|
||||||
users_reservations: "der Reservierungsliste"
|
users_reservations: "der Reservierungsliste"
|
||||||
availabilities_index: "der Verfügbarkeit der Reservierungen"
|
availabilities_index: "der Verfügbarkeit der Reservierungen"
|
||||||
accounting_accounting-software: "der Buchhaltungsdaten"
|
accounting_acd: "of the accounting data to ACD"
|
||||||
|
accounting_vat: "of the collected VAT data"
|
||||||
click_to_download: "Excel-Datei erfolgreich erstellt. Zum Herunterladen klicken Sie"
|
click_to_download: "Excel-Datei erfolgreich erstellt. Zum Herunterladen klicken Sie"
|
||||||
here: "hier"
|
here: "hier"
|
||||||
file_type:
|
file_type:
|
||||||
|
@ -231,7 +231,8 @@ en:
|
|||||||
users_subscriptions: "of the subscriptions' list"
|
users_subscriptions: "of the subscriptions' list"
|
||||||
users_reservations: "of the reservations' list"
|
users_reservations: "of the reservations' list"
|
||||||
availabilities_index: "of the reservations availabilities"
|
availabilities_index: "of the reservations availabilities"
|
||||||
accounting_accounting-software: "of the accounting data"
|
accounting_acd: "of the accounting data to ACD"
|
||||||
|
accounting_vat: "of the collected VAT data"
|
||||||
click_to_download: "Excel file generated successfully. To download it, click"
|
click_to_download: "Excel file generated successfully. To download it, click"
|
||||||
here: "here"
|
here: "here"
|
||||||
file_type:
|
file_type:
|
||||||
|
@ -231,7 +231,8 @@ es:
|
|||||||
users_subscriptions: "de la lista de suscripciones"
|
users_subscriptions: "de la lista de suscripciones"
|
||||||
users_reservations: "de la lista de reservas"
|
users_reservations: "de la lista de reservas"
|
||||||
availabilities_index: "de las reservas disponibles"
|
availabilities_index: "de las reservas disponibles"
|
||||||
accounting_accounting-software: "de los datos contables"
|
accounting_acd: "of the accounting data to ACD"
|
||||||
|
accounting_vat: "of the collected VAT data"
|
||||||
click_to_download: " archivo Excel generado correctamente. Para descargarlo, haga clic "
|
click_to_download: " archivo Excel generado correctamente. Para descargarlo, haga clic "
|
||||||
here: "aquí"
|
here: "aquí"
|
||||||
file_type:
|
file_type:
|
||||||
|
@ -231,7 +231,8 @@ fr:
|
|||||||
users_subscriptions: "de la liste des abonnements"
|
users_subscriptions: "de la liste des abonnements"
|
||||||
users_reservations: "de la liste des réservations"
|
users_reservations: "de la liste des réservations"
|
||||||
availabilities_index: "des disponibilités de réservations"
|
availabilities_index: "des disponibilités de réservations"
|
||||||
accounting_accounting-software: "des données comptables"
|
accounting_acd: "des données comptables pour ACD"
|
||||||
|
accounting_vat: "des données de TVA collectée"
|
||||||
click_to_download: "La génération est terminée. Pour télécharger le fichier %{TYPE}, cliquez"
|
click_to_download: "La génération est terminée. Pour télécharger le fichier %{TYPE}, cliquez"
|
||||||
here: "ici"
|
here: "ici"
|
||||||
file_type:
|
file_type:
|
||||||
|
@ -231,7 +231,8 @@
|
|||||||
users_subscriptions: "of the subscriptions' list"
|
users_subscriptions: "of the subscriptions' list"
|
||||||
users_reservations: "of the reservations' list"
|
users_reservations: "of the reservations' list"
|
||||||
availabilities_index: "of the reservations availabilities"
|
availabilities_index: "of the reservations availabilities"
|
||||||
accounting_accounting-software: "of the accounting data"
|
accounting_acd: "of the accounting data to ACD"
|
||||||
|
accounting_vat: "of the collected VAT data"
|
||||||
click_to_download: "Excel file generated successfully. To download it, click"
|
click_to_download: "Excel file generated successfully. To download it, click"
|
||||||
here: "here"
|
here: "here"
|
||||||
file_type:
|
file_type:
|
||||||
|
@ -231,7 +231,8 @@ pt:
|
|||||||
users_subscriptions: "da lista de assinaturas"
|
users_subscriptions: "da lista de assinaturas"
|
||||||
users_reservations: "da lista de reservas"
|
users_reservations: "da lista de reservas"
|
||||||
availabilities_index: "as reservas disponíveis"
|
availabilities_index: "as reservas disponíveis"
|
||||||
accounting_accounting-software: "de dados contábeis"
|
accounting_acd: "of the accounting data to ACD"
|
||||||
|
accounting_vat: "of the collected VAT data"
|
||||||
click_to_download: "Arquivo do Excel gerado com êxito. Para fazer o download, clique"
|
click_to_download: "Arquivo do Excel gerado com êxito. Para fazer o download, clique"
|
||||||
here: "aqui"
|
here: "aqui"
|
||||||
file_type:
|
file_type:
|
||||||
|
@ -231,7 +231,8 @@ zu:
|
|||||||
users_subscriptions: "crwdns4157:0crwdne4157:0"
|
users_subscriptions: "crwdns4157:0crwdne4157:0"
|
||||||
users_reservations: "crwdns4159:0crwdne4159:0"
|
users_reservations: "crwdns4159:0crwdne4159:0"
|
||||||
availabilities_index: "crwdns4161:0crwdne4161:0"
|
availabilities_index: "crwdns4161:0crwdne4161:0"
|
||||||
accounting_accounting-software: "crwdns4163:0crwdne4163:0"
|
accounting_acd: "crwdns22269:0crwdne22269:0"
|
||||||
|
accounting_vat: "crwdns22271:0crwdne22271:0"
|
||||||
click_to_download: "crwdns4165:0crwdne4165:0"
|
click_to_download: "crwdns4165:0crwdne4165:0"
|
||||||
here: "crwdns4167:0crwdne4167:0"
|
here: "crwdns4167:0crwdne4167:0"
|
||||||
file_type:
|
file_type:
|
||||||
|
@ -90,7 +90,7 @@
|
|||||||
other: "%{count} %{NAME} tickets"
|
other: "%{count} %{NAME} tickets"
|
||||||
coupon_CODE_discount_of_DISCOUNT: "Kupong {CODE}: rabatt på {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation
|
coupon_CODE_discount_of_DISCOUNT: "Kupong {CODE}: rabatt på {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation
|
||||||
total_including_all_taxes: "Sum inkl. MVA"
|
total_including_all_taxes: "Sum inkl. MVA"
|
||||||
including_VAT_RATE: "Inkludert MVA %{RATE}%"
|
including_VAT_RATE: "Inkludert MVA %{RATE}% av %{AMOUNT}"
|
||||||
including_total_excluding_taxes: "Inkludert total ekskl. MVA"
|
including_total_excluding_taxes: "Inkludert total ekskl. MVA"
|
||||||
including_amount_payed_on_ordering: "Inkludert beløp betalt ved bestilling"
|
including_amount_payed_on_ordering: "Inkludert beløp betalt ved bestilling"
|
||||||
total_amount: "Totalbeløp"
|
total_amount: "Totalbeløp"
|
||||||
@ -147,6 +147,11 @@
|
|||||||
Event_reservation: "arrangementetsreserv."
|
Event_reservation: "arrangementetsreserv."
|
||||||
Space_reservation: "reserv., plass/rom"
|
Space_reservation: "reserv., plass/rom"
|
||||||
wallet: "lommebok"
|
wallet: "lommebok"
|
||||||
|
vat_export:
|
||||||
|
start_date: "Start date"
|
||||||
|
end_date: "End date"
|
||||||
|
vat_rate: "VAT rate"
|
||||||
|
amount: "Total amount"
|
||||||
#training availabilities
|
#training availabilities
|
||||||
trainings:
|
trainings:
|
||||||
i_ve_reserved: "Jeg har reservert"
|
i_ve_reserved: "Jeg har reservert"
|
||||||
@ -331,6 +336,7 @@
|
|||||||
users_reservations: "fra reservasjonslisten"
|
users_reservations: "fra reservasjonslisten"
|
||||||
availabilities_index: "of the reservations availabilities"
|
availabilities_index: "of the reservations availabilities"
|
||||||
accounting_acd: "of the accounting data to ACD"
|
accounting_acd: "of the accounting data to ACD"
|
||||||
|
accounting_vat: "of the collected VAT"
|
||||||
is_over: "is over."
|
is_over: "is over."
|
||||||
download_here: "Download here"
|
download_here: "Download here"
|
||||||
notify_admin_import_complete:
|
notify_admin_import_complete:
|
||||||
@ -535,3 +541,4 @@
|
|||||||
renew_pack_threshold: "Threshold for packs renewal"
|
renew_pack_threshold: "Threshold for packs renewal"
|
||||||
pack_only_for_subscription: "Restrict packs for subscribers"
|
pack_only_for_subscription: "Restrict packs for subscribers"
|
||||||
overlapping_categories: "Categories for overlapping booking prevention"
|
overlapping_categories: "Categories for overlapping booking prevention"
|
||||||
|
extended_prices_in_same_day: "Extended prices in the same day"
|
||||||
|
@ -90,7 +90,7 @@ pt:
|
|||||||
other: "%{count} %{NAME} tickets"
|
other: "%{count} %{NAME} tickets"
|
||||||
coupon_CODE_discount_of_DISCOUNT: "Cupom {CODE}: desconto de {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation
|
coupon_CODE_discount_of_DISCOUNT: "Cupom {CODE}: desconto de {DISCOUNT}{TYPE, select, percent_off{%} other{}}" #messageFormat interpolation
|
||||||
total_including_all_taxes: "Total de taxas inclusas"
|
total_including_all_taxes: "Total de taxas inclusas"
|
||||||
including_VAT_RATE: "Incluindo VAT %{RATE}%"
|
including_VAT_RATE: "Incluindo IVA %{RATE}% de %{AMOUNT}"
|
||||||
including_total_excluding_taxes: "Incluindo total de faixas exclusas"
|
including_total_excluding_taxes: "Incluindo total de faixas exclusas"
|
||||||
including_amount_payed_on_ordering: "Incluindo o valor pago na encomenda"
|
including_amount_payed_on_ordering: "Incluindo o valor pago na encomenda"
|
||||||
total_amount: "Montante total"
|
total_amount: "Montante total"
|
||||||
@ -147,6 +147,11 @@ pt:
|
|||||||
Event_reservation: "reserva de evento."
|
Event_reservation: "reserva de evento."
|
||||||
Space_reservation: "reserva de espaço."
|
Space_reservation: "reserva de espaço."
|
||||||
wallet: "carteira"
|
wallet: "carteira"
|
||||||
|
vat_export:
|
||||||
|
start_date: "Start date"
|
||||||
|
end_date: "End date"
|
||||||
|
vat_rate: "VAT rate"
|
||||||
|
amount: "Total amount"
|
||||||
#training availabilities
|
#training availabilities
|
||||||
trainings:
|
trainings:
|
||||||
i_ve_reserved: "Eu reservei"
|
i_ve_reserved: "Eu reservei"
|
||||||
@ -331,6 +336,7 @@ pt:
|
|||||||
users_reservations: "da lista de reservas"
|
users_reservations: "da lista de reservas"
|
||||||
availabilities_index: "de reservas disponíveis"
|
availabilities_index: "de reservas disponíveis"
|
||||||
accounting_acd: "de dados contábeis para ACD"
|
accounting_acd: "de dados contábeis para ACD"
|
||||||
|
accounting_vat: "of the collected VAT"
|
||||||
is_over: "está finalizado."
|
is_over: "está finalizado."
|
||||||
download_here: "Baixe aqui"
|
download_here: "Baixe aqui"
|
||||||
notify_admin_import_complete:
|
notify_admin_import_complete:
|
||||||
@ -535,3 +541,4 @@ pt:
|
|||||||
renew_pack_threshold: "Limite para renovação de pacotes"
|
renew_pack_threshold: "Limite para renovação de pacotes"
|
||||||
pack_only_for_subscription: "Restringir pacotes para assinantes"
|
pack_only_for_subscription: "Restringir pacotes para assinantes"
|
||||||
overlapping_categories: "Categorias para prevenção de reservas sobrepostas"
|
overlapping_categories: "Categorias para prevenção de reservas sobrepostas"
|
||||||
|
extended_prices_in_same_day: "Extended prices in the same day"
|
||||||
|
@ -90,7 +90,7 @@ zu:
|
|||||||
other: "crwdns3327:5%{count}crwdnd3327:5%{NAME}crwdne3327:5"
|
other: "crwdns3327:5%{count}crwdnd3327:5%{NAME}crwdne3327:5"
|
||||||
coupon_CODE_discount_of_DISCOUNT: "crwdns3331:0CODE={CODE}crwdnd3331:0DISCOUNT={DISCOUNT}crwdnd3331:0TYPE={TYPE}crwdne3331:0" #messageFormat interpolation
|
coupon_CODE_discount_of_DISCOUNT: "crwdns3331:0CODE={CODE}crwdnd3331:0DISCOUNT={DISCOUNT}crwdnd3331:0TYPE={TYPE}crwdne3331:0" #messageFormat interpolation
|
||||||
total_including_all_taxes: "crwdns3333:0crwdne3333:0"
|
total_including_all_taxes: "crwdns3333:0crwdne3333:0"
|
||||||
including_VAT_RATE: "crwdns3335:0%{RATE}crwdne3335:0"
|
including_VAT_RATE: "crwdns22257:0%{RATE}crwdnd22257:0%{AMOUNT}crwdne22257:0"
|
||||||
including_total_excluding_taxes: "crwdns3337:0crwdne3337:0"
|
including_total_excluding_taxes: "crwdns3337:0crwdne3337:0"
|
||||||
including_amount_payed_on_ordering: "crwdns3339:0crwdne3339:0"
|
including_amount_payed_on_ordering: "crwdns3339:0crwdne3339:0"
|
||||||
total_amount: "crwdns3341:0crwdne3341:0"
|
total_amount: "crwdns3341:0crwdne3341:0"
|
||||||
@ -147,6 +147,11 @@ zu:
|
|||||||
Event_reservation: "crwdns3407:0crwdne3407:0"
|
Event_reservation: "crwdns3407:0crwdne3407:0"
|
||||||
Space_reservation: "crwdns3409:0crwdne3409:0"
|
Space_reservation: "crwdns3409:0crwdne3409:0"
|
||||||
wallet: "crwdns3411:0crwdne3411:0"
|
wallet: "crwdns3411:0crwdne3411:0"
|
||||||
|
vat_export:
|
||||||
|
start_date: "crwdns22259:0crwdne22259:0"
|
||||||
|
end_date: "crwdns22261:0crwdne22261:0"
|
||||||
|
vat_rate: "crwdns22263:0crwdne22263:0"
|
||||||
|
amount: "crwdns22265:0crwdne22265:0"
|
||||||
#training availabilities
|
#training availabilities
|
||||||
trainings:
|
trainings:
|
||||||
i_ve_reserved: "crwdns3413:0crwdne3413:0"
|
i_ve_reserved: "crwdns3413:0crwdne3413:0"
|
||||||
@ -331,6 +336,7 @@ zu:
|
|||||||
users_reservations: "crwdns3657:0crwdne3657:0"
|
users_reservations: "crwdns3657:0crwdne3657:0"
|
||||||
availabilities_index: "crwdns3659:0crwdne3659:0"
|
availabilities_index: "crwdns3659:0crwdne3659:0"
|
||||||
accounting_acd: "crwdns3661:0crwdne3661:0"
|
accounting_acd: "crwdns3661:0crwdne3661:0"
|
||||||
|
accounting_vat: "crwdns22267:0crwdne22267:0"
|
||||||
is_over: "crwdns3663:0crwdne3663:0"
|
is_over: "crwdns3663:0crwdne3663:0"
|
||||||
download_here: "crwdns3665:0crwdne3665:0"
|
download_here: "crwdns3665:0crwdne3665:0"
|
||||||
notify_admin_import_complete:
|
notify_admin_import_complete:
|
||||||
@ -535,3 +541,4 @@ zu:
|
|||||||
renew_pack_threshold: "crwdns22032:0crwdne22032:0"
|
renew_pack_threshold: "crwdns22032:0crwdne22032:0"
|
||||||
pack_only_for_subscription: "crwdns22093:0crwdne22093:0"
|
pack_only_for_subscription: "crwdns22093:0crwdne22093:0"
|
||||||
overlapping_categories: "crwdns22129:0crwdne22129:0"
|
overlapping_categories: "crwdns22129:0crwdne22129:0"
|
||||||
|
extended_prices_in_same_day: "crwdns22173:0crwdne22173:0"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "fab-manager",
|
"name": "fab-manager",
|
||||||
"version": "5.2.0",
|
"version": "5.3.0",
|
||||||
"description": "Fab-manager is the FabLab management solution. It provides a comprehensive, web-based, open-source tool to simplify your administrative tasks and your marker's projects.",
|
"description": "Fab-manager is the FabLab management solution. It provides a comprehensive, web-based, open-source tool to simplify your administrative tasks and your marker's projects.",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"fablab",
|
"fablab",
|
||||||
|
@ -104,13 +104,15 @@ class ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
vat_service = VatHistoryService.new
|
vat_service = VatHistoryService.new
|
||||||
vat_rate = vat_service.invoice_vat(invoice)
|
invoice.invoice_items.each do |item|
|
||||||
|
vat_rate = vat_service.invoice_item_vat(item)
|
||||||
if vat_rate.positive?
|
if vat_rate.positive?
|
||||||
computed_ht = sprintf('%.2f', (invoice.total / (vat_rate / 100.00 + 1)) / 100.00).to_f
|
computed_ht = sprintf('%.2f', (item.amount_after_coupon / (vat_rate / 100.00 + 1)) / 100.00).to_f
|
||||||
|
|
||||||
assert_equal computed_ht, ht_amount, 'Total excluding taxes rendered in the PDF file is not computed correctly'
|
assert_equal computed_ht, item.net_amount / 100.00, 'Total excluding taxes rendered in the PDF file is not computed correctly'
|
||||||
else
|
else
|
||||||
assert_equal invoice.total, ht_amount, 'VAT information was rendered in the PDF file despite that VAT was disabled'
|
assert_equal item.amount_after_coupon, item.net_amount, 'VAT information was rendered in the PDF file despite that VAT was disabled'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# check the recipient & the address
|
# check the recipient & the address
|
||||||
|
Loading…
Reference in New Issue
Block a user