mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2025-01-30 19:52:20 +01:00
[bug] updating a setting without any changes triggers an error
Also: - Invoices interface for managers - Refactoring of admin/invoices template: split into multiple files
This commit is contained in:
parent
18895b6a85
commit
6a8746b110
@ -6,6 +6,7 @@
|
|||||||
- Fix a bug: unable to create events or trainings that are not multiples of SLOT_DURATION
|
- Fix a bug: unable to create events or trainings that are not multiples of SLOT_DURATION
|
||||||
- Fix a bug: unable to delete an unreserved event
|
- Fix a bug: unable to delete an unreserved event
|
||||||
- Fix a bug: "Free entry" label for events without reservation
|
- Fix a bug: "Free entry" label for events without reservation
|
||||||
|
- Fix a bug: updating a setting without any changes triggers an error
|
||||||
|
|
||||||
## v4.3.4 2020 April 14
|
## v4.3.4 2020 April 14
|
||||||
|
|
||||||
|
@ -291,6 +291,8 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
growl.success(_t('app.admin.invoices.invoice_reference_successfully_saved'));
|
growl.success(_t('app.admin.invoices.invoice_reference_successfully_saved'));
|
||||||
}
|
}
|
||||||
, function (error) {
|
, function (error) {
|
||||||
|
if (error.status === 304) return;
|
||||||
|
|
||||||
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_invoice_reference'));
|
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_invoice_reference'));
|
||||||
console.error(error);
|
console.error(error);
|
||||||
});
|
});
|
||||||
@ -330,8 +332,10 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
, function (error) {
|
, function (error) {
|
||||||
|
if (error.status === 304) return;
|
||||||
|
|
||||||
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_invoicing_code'));
|
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_invoicing_code'));
|
||||||
return console.error(error);
|
console.error(error);
|
||||||
});
|
});
|
||||||
|
|
||||||
return Setting.update({ name: 'invoice_code-active' }, { value: result.active ? 'true' : 'false' }, function (data) {
|
return Setting.update({ name: 'invoice_code-active' }, { value: result.active ? 'true' : 'false' }, function (data) {
|
||||||
@ -343,8 +347,10 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
, function (error) {
|
, function (error) {
|
||||||
|
if (error.status === 304) return;
|
||||||
|
|
||||||
growl.error(_t('app.admin.invoices.an_error_occurred_while_activating_the_invoicing_code'));
|
growl.error(_t('app.admin.invoices.an_error_occurred_while_activating_the_invoicing_code'));
|
||||||
return console.error(error);
|
console.error(error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@ -375,8 +381,10 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
return growl.success(_t('app.admin.invoices.order_number_successfully_saved'));
|
return growl.success(_t('app.admin.invoices.order_number_successfully_saved'));
|
||||||
}
|
}
|
||||||
, function (error) {
|
, function (error) {
|
||||||
|
if (error.status === 304) return;
|
||||||
|
|
||||||
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_order_number'));
|
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_order_number'));
|
||||||
return console.error(error);
|
console.error(error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@ -434,8 +442,10 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
, function (error) {
|
, function (error) {
|
||||||
|
if (error.status === 304) return;
|
||||||
|
|
||||||
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_VAT_rate'));
|
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_VAT_rate'));
|
||||||
return console.error(error);
|
console.error(error);
|
||||||
});
|
});
|
||||||
|
|
||||||
return Setting.update({ name: 'invoice_VAT-active' }, { value: result.active ? 'true' : 'false' }, function (data) {
|
return Setting.update({ name: 'invoice_VAT-active' }, { value: result.active ? 'true' : 'false' }, function (data) {
|
||||||
@ -447,8 +457,10 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
, function (error) {
|
, function (error) {
|
||||||
|
if (error.status === 304) return;
|
||||||
|
|
||||||
growl.error(_t('app.admin.invoices.an_error_occurred_while_activating_the_VAT'));
|
growl.error(_t('app.admin.invoices.an_error_occurred_while_activating_the_VAT'));
|
||||||
return console.error(error);
|
console.error(error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@ -463,8 +475,10 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
return growl.success(_t('app.admin.invoices.text_successfully_saved'));
|
return growl.success(_t('app.admin.invoices.text_successfully_saved'));
|
||||||
}
|
}
|
||||||
, function (error) {
|
, function (error) {
|
||||||
|
if (error.status === 304) return;
|
||||||
|
|
||||||
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_text'));
|
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_text'));
|
||||||
return console.error(error);
|
console.error(error);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -478,8 +492,10 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
return growl.success(_t('app.admin.invoices.address_and_legal_information_successfully_saved'));
|
return growl.success(_t('app.admin.invoices.address_and_legal_information_successfully_saved'));
|
||||||
}
|
}
|
||||||
, function (error) {
|
, function (error) {
|
||||||
|
if (error.status === 304) return;
|
||||||
|
|
||||||
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_address_and_the_legal_information'));
|
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_address_and_the_legal_information'));
|
||||||
return console.error(error);
|
console.error(error);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -710,8 +726,10 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
|
|||||||
{ value: $scope.invoice.logo.base64 },
|
{ value: $scope.invoice.logo.base64 },
|
||||||
function (data) { growl.success(_t('app.admin.invoices.logo_successfully_saved')); },
|
function (data) { growl.success(_t('app.admin.invoices.logo_successfully_saved')); },
|
||||||
function (error) {
|
function (error) {
|
||||||
|
if (error.status === 304) return;
|
||||||
|
|
||||||
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_logo'));
|
growl.error(_t('app.admin.invoices.an_error_occurred_while_saving_the_logo'));
|
||||||
return console.error(error);
|
console.error(error);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -209,7 +209,12 @@ Application.Controllers.controller('SettingsController', ['$scope', '$rootScope'
|
|||||||
{ name: setting.name },
|
{ name: setting.name },
|
||||||
{ value },
|
{ value },
|
||||||
function () { growl.success(_t('app.admin.settings.customization_of_SETTING_successfully_saved', { SETTING: _t(`app.admin.settings.${setting.name}`) })); },
|
function () { growl.success(_t('app.admin.settings.customization_of_SETTING_successfully_saved', { SETTING: _t(`app.admin.settings.${setting.name}`) })); },
|
||||||
function (error) { console.log(error); }
|
function (error) {
|
||||||
|
if (error.status === 304) return;
|
||||||
|
|
||||||
|
growl.error(_t('app.admin.settings.an_error_occurred_saving_the_setting'));
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ Application.Controllers.controller('MainNavController', ['$scope', function ($sc
|
|||||||
state: 'app.admin.invoices',
|
state: 'app.admin.invoices',
|
||||||
linkText: 'app.public.common.manage_the_invoices',
|
linkText: 'app.public.common.manage_the_invoices',
|
||||||
linkIcon: 'file-pdf-o',
|
linkIcon: 'file-pdf-o',
|
||||||
authorizedRoles: ['admin']
|
authorizedRoles: ['admin', 'manager']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
state: 'app.admin.statistics',
|
state: 'app.admin.statistics',
|
||||||
@ -127,7 +127,10 @@ Application.Controllers.controller('MainNavController', ['$scope', function ($sc
|
|||||||
linkIcon: 'bar-chart-o',
|
linkIcon: 'bar-chart-o',
|
||||||
authorizedRoles: ['admin']
|
authorizedRoles: ['admin']
|
||||||
},
|
},
|
||||||
{ class: 'menu-spacer' },
|
{
|
||||||
|
class: 'menu-spacer',
|
||||||
|
authorizedRoles: ['admin']
|
||||||
|
},
|
||||||
{
|
{
|
||||||
state: 'app.admin.settings',
|
state: 'app.admin.settings',
|
||||||
linkText: 'app.public.common.customization',
|
linkText: 'app.public.common.customization',
|
||||||
|
111
app/assets/templates/admin/invoices/codes.html.erb
Normal file
111
app/assets/templates/admin/invoices/codes.html.erb
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
<div class="panel panel-default m-t-md accounting-codes">
|
||||||
|
<div class="panel-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="journalCode" translate>{{ 'app.admin.invoices.accounting_journal_code' }}</label>
|
||||||
|
<input type="text" id="journalCode" ng-model="settings.journalCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_journal_code' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="cardClientCode" translate>{{ 'app.admin.invoices.accounting_card_client_code' }}</label>
|
||||||
|
<input type="text" id="cardClientCode" ng-model="settings.cardClientCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.card_client_code' | translate }}" />
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="cardClientLabel" translate>{{ 'app.admin.invoices.accounting_card_client_label' }}</label>
|
||||||
|
<input type="text" id="cardClientLabel" ng-model="settings.cardClientLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.card_client_label' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="walletClientCode" translate>{{ 'app.admin.invoices.accounting_wallet_client_code' }}</label>
|
||||||
|
<input type="text" id="walletClientCode" ng-model="settings.walletClientCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.wallet_client_code' | translate }}" />
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="walletClientLabel" translate>{{ 'app.admin.invoices.accounting_wallet_client_label' }}</label>
|
||||||
|
<input type="text" id="walletClientLabel" ng-model="settings.walletClientLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.wallet_client_label' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="otherClientCode" translate>{{ 'app.admin.invoices.accounting_other_client_code' }}</label>
|
||||||
|
<input type="text" id="otherClientCode" ng-model="settings.otherClientCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.other_client_code' | translate }}" />
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="otherClientLabel" translate>{{ 'app.admin.invoices.accounting_other_client_label' }}</label>
|
||||||
|
<input type="text" id="otherClientLabel" ng-model="settings.otherClientLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.other_client_label' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="walletCode" translate>{{ 'app.admin.invoices.accounting_wallet_code' }}</label>
|
||||||
|
<input type="text" id="walletCode" ng-model="settings.walletCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_wallet_code' | translate }}" />
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="walletLabel" translate>{{ 'app.admin.invoices.accounting_wallet_label' }}</label>
|
||||||
|
<input type="text" id="walletLabel" ng-model="settings.walletLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_wallet_label' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="vatCode" translate>{{ 'app.admin.invoices.accounting_vat_code' }}</label>
|
||||||
|
<input type="text" id="vatCode" ng-model="settings.vatCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_vat_code' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="vatLabel" translate>{{ 'app.admin.invoices.accounting_vat_label' }}</label>
|
||||||
|
<input type="text" id="vatLabel" ng-model="settings.vatLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_vat_label' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="subscriptionCode" translate>{{ 'app.admin.invoices.accounting_subscription_code' }}</label>
|
||||||
|
<input type="text" id="subscriptionCode" ng-model="settings.subscriptionCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_subscription_code' | translate }}" />
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="subscriptionLabel" translate>{{ 'app.admin.invoices.accounting_subscription_label' }}</label>
|
||||||
|
<input type="text" id="subscriptionLabel" ng-model="settings.subscriptionLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_subscription_label' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="machineCode" translate>{{ 'app.admin.invoices.accounting_Machine_code' }}</label>
|
||||||
|
<input type="text" id="machineCode" ng-model="settings.machineCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_machine_code' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="machineLabel" translate>{{ 'app.admin.invoices.accounting_Machine_label' }}</label>
|
||||||
|
<input type="text" id="machineLabel" ng-model="settings.machineLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_machine_label' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="trainingCode" translate>{{ 'app.admin.invoices.accounting_Training_code' }}</label>
|
||||||
|
<input type="text" id="trainingCode" ng-model="settings.trainingCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_training_code' | translate }}" />
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="trainingLabel" translate>{{ 'app.admin.invoices.accounting_Training_label' }}</label>
|
||||||
|
<input type="text" id="trainingLabel" ng-model="settings.trainingLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_training_label' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="eventCode" translate>{{ 'app.admin.invoices.accounting_Event_code' }}</label>
|
||||||
|
<input type="text" id="eventCode" ng-model="settings.eventCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_event_code' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="eventLabel" translate>{{ 'app.admin.invoices.accounting_Event_label' }}</label>
|
||||||
|
<input type="text" id="eventLabel" ng-model="settings.eventLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_event_label' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="spaceCode" translate>{{ 'app.admin.invoices.accounting_Space_code' }}</label>
|
||||||
|
<input type="text" id="spaceCode" ng-model="settings.spaceCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_space_code' | translate }}" />
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="spaceLabel" translate>{{ 'app.admin.invoices.accounting_Space_label' }}</label>
|
||||||
|
<input type="text" id="spaceLabel" ng-model="settings.spaceLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_space_label' | translate }}"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button name="button" class="btn btn-warning m-t-lg" ng-click="save()" translate>{{ 'app.shared.buttons.save' }}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -31,527 +31,18 @@
|
|||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<uib-tabset justified="true" active="tabs.active">
|
<uib-tabset justified="true" active="tabs.active">
|
||||||
<uib-tab heading="{{ 'app.admin.invoices.invoices_list' | translate }}" ng-hide="fablabWithoutInvoices" index="0">
|
<uib-tab heading="{{ 'app.admin.invoices.invoices_list' | translate }}" ng-hide="fablabWithoutInvoices" index="0">
|
||||||
<h3 class="m-t-xs"><i class="fa fa-filter"></i> {{ 'app.admin.invoices.filter_invoices' | translate }}</h3>
|
<ng-include src="'<%= asset_path "admin/invoices/list.html" %>'"></ng-include>
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-4">
|
|
||||||
<div class="form-group">
|
|
||||||
<div class="input-group">
|
|
||||||
<span class="input-group-addon" translate>{{ 'app.admin.invoices.invoice_num_' }}</span>
|
|
||||||
<input type="text" ng-model="searchInvoice.reference" class="form-control" placeholder="" ng-change="handleFilterChange()">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-md-4">
|
|
||||||
<div class="form-group">
|
|
||||||
<div class="input-group">
|
|
||||||
<span class="input-group-addon" translate>{{ 'app.admin.invoices.customer_' }}</span>
|
|
||||||
<input type="text" ng-model="searchInvoice.name" class="form-control" placeholder="" ng-change="handleFilterChange()">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-md-4">
|
|
||||||
<div class="form-group">
|
|
||||||
<div class="input-group">
|
|
||||||
<span class="input-group-addon">{{ "app.admin.invoices.date_" | translate }}</span>
|
|
||||||
<input type="date" ng-model="searchInvoice.date" class="form-control" ng-change="handleFilterChange()">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12">
|
|
||||||
|
|
||||||
<table class="table invoices-list" ng-if="invoices.length > 0">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th style="width:5%"></th>
|
|
||||||
<th style="width:15%"><a href="" ng-click="setOrderInvoice('reference')">{{ 'app.admin.invoices.invoice_num' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-numeric-asc': orderInvoice=='reference', 'fa fa-sort-numeric-desc': orderInvoice=='-reference', 'fa fa-arrows-v': orderInvoice }"></i></a></th>
|
|
||||||
|
|
||||||
<th style="width:20%"><a href="" ng-click="setOrderInvoice('date')">{{ 'app.admin.invoices.date' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-numeric-asc': orderInvoice=='date', 'fa fa-sort-numeric-desc': orderInvoice=='-date', 'fa fa-arrows-v': orderInvoice }"></i></a></th>
|
|
||||||
|
|
||||||
<th style="width:10%"><a href="" ng-click="setOrderInvoice('total')"> {{ 'app.admin.invoices.price' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-numeric-asc': orderInvoice=='total', 'fa fa-sort-numeric-desc': orderInvoice=='-total', 'fa fa-arrows-v': orderInvoice }"></i></a></th>
|
|
||||||
|
|
||||||
<th style="width:20%"><a href="" ng-click="setOrderInvoice('name')">{{ 'app.admin.invoices.customer' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': orderInvoice=='name', 'fa fa-sort-alpha-desc': orderInvoice=='-name', 'fa fa-arrows-v': orderInvoice }"></i></a></th>
|
|
||||||
|
|
||||||
<th style="width:30%"></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr ng-repeat="invoice in invoices">
|
|
||||||
<td class="chained-indicator">
|
|
||||||
<i class="fa fa-link chained" ng-show="invoice.chained_footprint"/>
|
|
||||||
<i class="fa fa-chain-broken broken" ng-hide="invoice.chained_footprint"/>
|
|
||||||
</td>
|
|
||||||
<td>{{ invoice.reference }}</td>
|
|
||||||
<td ng-if="!invoice.is_avoir">{{ invoice.date | amDateFormat:'L LTS' }}</td>
|
|
||||||
<td ng-if="invoice.is_avoir">{{ invoice.date | amDateFormat:'L' }}</td>
|
|
||||||
<td>{{ invoice.total | currency}}</td>
|
|
||||||
<td>
|
|
||||||
<a href="" ui-sref="app.admin.members_edit({id: invoice.user_id})" ng-show="invoice.user_id">{{ invoice.name }}</a>
|
|
||||||
<span ng-hide="invoice.user_id">{{ invoice.name }}</span>
|
|
||||||
<td>
|
|
||||||
<div class="buttons">
|
|
||||||
<a class="btn btn-default download-button" ng-href="api/invoices/{{invoice.id}}/download" target="_blank" ng-if="!invoice.is_avoir">
|
|
||||||
<i class="fa fa-file-pdf-o"></i> {{ 'app.admin.invoices.download_the_invoice' | translate }}
|
|
||||||
</a>
|
|
||||||
<a class="btn btn-default" ng-href="api/invoices/{{invoice.id}}/download" target="_blank" ng-if="invoice.is_avoir">
|
|
||||||
<i class="fa fa-file-pdf-o"></i> {{ 'app.admin.invoices.download_the_credit_note' | translate }}
|
|
||||||
</a>
|
|
||||||
<a class="btn btn-default refund-button" ng-click="generateAvoirForInvoice(invoice)" ng-if="(!invoice.has_avoir || invoice.has_avoir == 'partial') && !invoice.is_avoir && !invoice.prevent_refund && !isDateClosed(invoice.created_at)">
|
|
||||||
<i class="fa fa-reply"></i> {{ 'app.admin.invoices.credit_note' | translate }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<div class="text-center">
|
|
||||||
<button class="btn btn-warning" ng-click="showNextInvoices()" ng-hide="noMoreResults"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'app.admin.invoices.display_more_invoices' | translate }}</button>
|
|
||||||
</div>
|
|
||||||
<p ng-if="invoices.length == 0" translate>{{ 'app.admin.invoices.no_invoices_for_now' }}</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</uib-tab>
|
</uib-tab>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<uib-tab heading="{{ 'app.admin.invoices.invoicing_settings' | translate }}" index="1" class="invoices-settings">
|
<uib-tab heading="{{ 'app.admin.invoices.invoicing_settings' | translate }}" index="1" class="invoices-settings">
|
||||||
<div class="alert alert-warning p-md m-t" role="alert" ng-show="fablabWithoutInvoices">
|
<ng-include src="'<%= asset_path "admin/invoices/settings.html" %>'"></ng-include>
|
||||||
<i class="fa fa-warning m-r"></i>
|
|
||||||
<span translate>{{ 'app.admin.invoices.warning_invoices_disabled' }}</span>
|
|
||||||
</div>
|
|
||||||
<form class="invoice-placeholder">
|
|
||||||
<div class="invoice-logo">
|
|
||||||
<img src="data:image/png;base64," data-src="holder.js/100%x100%/text:/font:FontAwesome/icon" bs-holder ng-if="!invoice.logo" class="img-responsive">
|
|
||||||
<img base-sixty-four-image="invoice.logo" ng-if="invoice.logo && invoice.logo.base64">
|
|
||||||
<div class="tools-box">
|
|
||||||
<div class="btn-group">
|
|
||||||
<div class="btn btn-default btn-file">
|
|
||||||
<i class="fa fa-edit"></i> {{ 'app.admin.invoices.change_logo' | translate }}
|
|
||||||
<input type="file" accept="image/png,image/jpeg,image/x-png,image/pjpeg" name="invoice[logo][attachment]" ng-model="invoice.logo" base-sixty-four-input>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="invoice-buyer-infos">
|
|
||||||
<strong translate>{{ 'app.admin.invoices.john_smith' }}</strong>
|
|
||||||
<div translate>{{ 'app.admin.invoices.john_smith_at_example_com' }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="invoice-reference invoice-editable" ng-click="openEditReference()">{{ 'app.admin.invoices.invoice_reference_' | translate }} {{mkReference()}}</div>
|
|
||||||
<div class="invoice-code invoice-editable" ng-show="invoice.code.active" ng-click="openEditCode()">{{ 'app.admin.invoices.code_' | translate }} {{invoice.code.model}}</div>
|
|
||||||
<div class="invoice-code invoice-activable" ng-show="!invoice.code.active" ng-click="openEditCode()" translate>{{ 'app.admin.invoices.code_disabled' }}</div>
|
|
||||||
<div class="invoice-order invoice-editable" ng-click="openEditInvoiceNb()"> {{ 'app.admin.invoices.order_num' | translate }} {{mkNumber()}}</div>
|
|
||||||
<div class="invoice-date">{{ 'app.admin.invoices.invoice_issued_on_DATE_at_TIME' | translate:{DATE:(today | amDateFormat:'L'), TIME:(today | amDateFormat:'LT')} }}</div>
|
|
||||||
<div class="invoice-object">
|
|
||||||
{{ 'app.admin.invoices.object_reservation_of_john_smith_on_DATE_at_TIME' | translate:{DATE:(inOneWeek | amDateFormat:'L'), TIME:(inOneWeek | amDateFormat:'LT')} }}
|
|
||||||
</div>
|
|
||||||
<div class="invoice-data">
|
|
||||||
{{ 'app.admin.invoices.order_summary' | translate }}
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th translate>{{ 'app.admin.invoices.details' }}</th>
|
|
||||||
<th class="right" translate>{{ 'app.admin.invoices.amount' }}</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>{{ 'app.admin.invoices.machine_booking-3D_printer' | translate }} {{inOneWeek | amDateFormat:'LLL'}} - {{inOneWeekAndOneHour | amDateFormat:'LT'}}</td>
|
|
||||||
<td class="right">{{30.0 | currency}}</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr class="invoice-total" ng-class="{'bold vat-line':invoice.VAT.active}">
|
|
||||||
<td ng-show="!invoice.VAT.active" translate>{{ 'app.admin.invoices.total_amount' }}</td>
|
|
||||||
<td ng-show="invoice.VAT.active" translate>{{ 'app.admin.invoices.total_including_all_taxes' }}</td>
|
|
||||||
<td class="right">{{30.0 | currency}}</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr class="invoice-vat invoice-activable" ng-click="openEditVAT()" ng-show="!invoice.VAT.active">
|
|
||||||
<td translate>{{ 'app.admin.invoices.VAT_disabled' }}</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<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>{{30-(30/(invoice.VAT.rate/100+1)) | currency}}</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="invoice-ht vat-line italic" ng-show="invoice.VAT.active">
|
|
||||||
<td translate>{{ 'app.admin.invoices.including_total_excluding_taxes' }}</td>
|
|
||||||
<td>{{30/(invoice.VAT.rate/100+1) | currency}}</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="invoice-payed vat-line bold" ng-show="invoice.VAT.active">
|
|
||||||
<td translate>{{ 'app.admin.invoices.including_amount_payed_on_ordering' }}</td>
|
|
||||||
<td>{{30.0 | currency}}</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p class="invoice-payment" translate translate-values="{DATE:(today | amDateFormat:'L'), TIME:(today | amDateFormat:'LT'), AMOUNT:(30.0 | currency)}">
|
|
||||||
{{ 'app.admin.invoices.settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT' }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div medium-editor class="invoice-text invoice-editable" ng-model="invoice.text.content"
|
|
||||||
options='{
|
|
||||||
"placeholder": "{{ "app.admin.invoices.important_notes" | translate }}",
|
|
||||||
"buttons": ["underline"]
|
|
||||||
}'
|
|
||||||
ng-blur="textEditEnd($event)">
|
|
||||||
</div>
|
|
||||||
<div medium-editor class="invoice-legals invoice-editable" ng-model="invoice.legals.content"
|
|
||||||
options='{
|
|
||||||
"placeholder": "{{ "app.admin.invoices.address_and_legal_information" | translate }}",
|
|
||||||
"buttons": ["bold", "underline"]
|
|
||||||
}'
|
|
||||||
ng-blur="legalsEditEnd($event)">
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</uib-tab>
|
</uib-tab>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<uib-tab heading="{{ 'app.admin.invoices.accounting_codes' | translate }}" index="2" class="accounting-codes-tab">
|
<uib-tab heading="{{ 'app.admin.invoices.accounting_codes' | translate }}" index="2" class="accounting-codes-tab">
|
||||||
<div class="panel panel-default m-t-md accounting-codes">
|
<ng-include src="'<%= asset_path "admin/invoices/codes.html" %>'"></ng-include>
|
||||||
<div class="panel-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="journalCode" translate>{{ 'app.admin.invoices.accounting_journal_code' }}</label>
|
|
||||||
<input type="text" id="journalCode" ng-model="settings.journalCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_journal_code' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="cardClientCode" translate>{{ 'app.admin.invoices.accounting_card_client_code' }}</label>
|
|
||||||
<input type="text" id="cardClientCode" ng-model="settings.cardClientCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.card_client_code' | translate }}" />
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="cardClientLabel" translate>{{ 'app.admin.invoices.accounting_card_client_label' }}</label>
|
|
||||||
<input type="text" id="cardClientLabel" ng-model="settings.cardClientLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.card_client_label' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="walletClientCode" translate>{{ 'app.admin.invoices.accounting_wallet_client_code' }}</label>
|
|
||||||
<input type="text" id="walletClientCode" ng-model="settings.walletClientCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.wallet_client_code' | translate }}" />
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="walletClientLabel" translate>{{ 'app.admin.invoices.accounting_wallet_client_label' }}</label>
|
|
||||||
<input type="text" id="walletClientLabel" ng-model="settings.walletClientLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.wallet_client_label' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="otherClientCode" translate>{{ 'app.admin.invoices.accounting_other_client_code' }}</label>
|
|
||||||
<input type="text" id="otherClientCode" ng-model="settings.otherClientCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.other_client_code' | translate }}" />
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="otherClientLabel" translate>{{ 'app.admin.invoices.accounting_other_client_label' }}</label>
|
|
||||||
<input type="text" id="otherClientLabel" ng-model="settings.otherClientLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.other_client_label' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="walletCode" translate>{{ 'app.admin.invoices.accounting_wallet_code' }}</label>
|
|
||||||
<input type="text" id="walletCode" ng-model="settings.walletCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_wallet_code' | translate }}" />
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="walletLabel" translate>{{ 'app.admin.invoices.accounting_wallet_label' }}</label>
|
|
||||||
<input type="text" id="walletLabel" ng-model="settings.walletLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_wallet_label' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="vatCode" translate>{{ 'app.admin.invoices.accounting_vat_code' }}</label>
|
|
||||||
<input type="text" id="vatCode" ng-model="settings.vatCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_vat_code' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="vatLabel" translate>{{ 'app.admin.invoices.accounting_vat_label' }}</label>
|
|
||||||
<input type="text" id="vatLabel" ng-model="settings.vatLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_vat_label' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="subscriptionCode" translate>{{ 'app.admin.invoices.accounting_subscription_code' }}</label>
|
|
||||||
<input type="text" id="subscriptionCode" ng-model="settings.subscriptionCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_subscription_code' | translate }}" />
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="subscriptionLabel" translate>{{ 'app.admin.invoices.accounting_subscription_label' }}</label>
|
|
||||||
<input type="text" id="subscriptionLabel" ng-model="settings.subscriptionLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_subscription_label' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="machineCode" translate>{{ 'app.admin.invoices.accounting_Machine_code' }}</label>
|
|
||||||
<input type="text" id="machineCode" ng-model="settings.machineCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_machine_code' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="machineLabel" translate>{{ 'app.admin.invoices.accounting_Machine_label' }}</label>
|
|
||||||
<input type="text" id="machineLabel" ng-model="settings.machineLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_machine_label' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="trainingCode" translate>{{ 'app.admin.invoices.accounting_Training_code' }}</label>
|
|
||||||
<input type="text" id="trainingCode" ng-model="settings.trainingCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_training_code' | translate }}" />
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="trainingLabel" translate>{{ 'app.admin.invoices.accounting_Training_label' }}</label>
|
|
||||||
<input type="text" id="trainingLabel" ng-model="settings.trainingLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_training_label' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="eventCode" translate>{{ 'app.admin.invoices.accounting_Event_code' }}</label>
|
|
||||||
<input type="text" id="eventCode" ng-model="settings.eventCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_event_code' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="eventLabel" translate>{{ 'app.admin.invoices.accounting_Event_label' }}</label>
|
|
||||||
<input type="text" id="eventLabel" ng-model="settings.eventLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_event_label' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="spaceCode" translate>{{ 'app.admin.invoices.accounting_Space_code' }}</label>
|
|
||||||
<input type="text" id="spaceCode" ng-model="settings.spaceCode.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_space_code' | translate }}" />
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<label for="spaceLabel" translate>{{ 'app.admin.invoices.accounting_Space_label' }}</label>
|
|
||||||
<input type="text" id="spaceLabel" ng-model="settings.spaceLabel.value" class="form-control" placeholder="{{ 'app.admin.invoices.general_space_label' | translate }}"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<button name="button" class="btn btn-warning m-t-lg" ng-click="save()" translate>{{ 'app.shared.buttons.save' }}</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</uib-tab>
|
</uib-tab>
|
||||||
</uib-tabset>
|
</uib-tabset>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
||||||
<script type="text/ng-template" id="editReference.html">
|
|
||||||
<div class="custom-invoice">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h3 class="modal-title" translate>{{ 'app.admin.invoices.invoice_reference' }}</h3>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body row">
|
|
||||||
<div class="elements col-md-4">
|
|
||||||
<h4>Éléments</h4>
|
|
||||||
<ul>
|
|
||||||
<li ng-click="invoice.reference.help = 'addYear.html'">{{ 'app.admin.invoices.year' | translate }}</li>
|
|
||||||
<li ng-click="invoice.reference.help = 'addMonth.html'">{{ 'app.admin.invoices.month' | translate }}</li>
|
|
||||||
<li ng-click="invoice.reference.help = 'addDay.html'">{{ 'app.admin.invoices.day' | translate }}</li>
|
|
||||||
<li ng-click="invoice.reference.help = 'addInvoiceNumber.html'">{{ 'app.admin.invoices.num_of_invoice' | translate }}</li>
|
|
||||||
<li ng-click="invoice.reference.help = 'addOnlineInfo.html'">{{ 'app.admin.invoices.online_sales' | translate }}</li>
|
|
||||||
<%# <li ng-click="invoice.reference.help = 'addWalletInfo.html'">{{ 'app.admin.invoices.wallet' | translate }}</li> %>
|
|
||||||
<li ng-click="invoice.reference.help = 'addRefundInfo.html'">{{ 'app.admin.invoices.refund' | translate }}</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-8">
|
|
||||||
<div class="model">
|
|
||||||
<h4 translate>{{ 'app.admin.invoices.model' }}</h4>
|
|
||||||
<input type="text" class="form-control" ng-model="model">
|
|
||||||
</div>
|
|
||||||
<div class="help">
|
|
||||||
<h4 translate>{{ 'app.admin.invoices.documentation' }}</h4>
|
|
||||||
<ng-include src="invoice.reference.help" autoscroll="true">
|
|
||||||
</ng-include>
|
|
||||||
</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>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/ng-template" id="addYear.html">
|
|
||||||
<table class="invoice-element-legend">
|
|
||||||
<tr><td><strong>YY</strong></td><td translate>{{ 'app.admin.invoices.2_digits_year' }}</td></tr>
|
|
||||||
<tr><td><strong>YYYY</strong></td><td translate>{{ 'app.admin.invoices.4_digits_year' }}</td></tr>
|
|
||||||
</table>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/ng-template" id="addMonth.html">
|
|
||||||
<table class="invoice-element-legend">
|
|
||||||
<tr><td><strong>M</strong></td><td translate>{{ 'app.admin.invoices.month_number' }}</td></tr>
|
|
||||||
<tr><td><strong>MM</strong></td><td translate>{{ 'app.admin.invoices.2_digits_month_number' }}</td></tr>
|
|
||||||
<tr><td><strong>MMM</strong></td><td translate>{{ 'app.admin.invoices.3_characters_month_name' }}</td></tr>
|
|
||||||
</table>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/ng-template" id="addDay.html">
|
|
||||||
<table class="invoice-element-legend">
|
|
||||||
<tr><td><strong>D</strong></td><td translate>{{ 'app.admin.invoices.day_in_the_month' }}</td></tr>
|
|
||||||
<tr><td><strong>DD</strong></td><td translate>{{ 'app.admin.invoices.2_digits_day_in_the_month' }}</td></tr>
|
|
||||||
</table>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/ng-template" id="addInvoiceNumber.html">
|
|
||||||
<table class="invoice-element-legend">
|
|
||||||
<tr><td><strong>dd...dd</strong></td><td translate>{{ 'app.admin.invoices.n_digits_daily_count_of_invoices' }}</td></tr>
|
|
||||||
<tr><td><strong>mm...mm</strong></td><td translate>{{ 'app.admin.invoices.n_digits_monthly_count_of_invoices' }}</td></tr>
|
|
||||||
<tr><td><strong>yy...yy</strong></td><td translate>{{ 'app.admin.invoices.n_digits_annual_amount_of_invoices' }}</td></tr>
|
|
||||||
</table>
|
|
||||||
<span class="bottom-notes" translate>{{ 'app.admin.invoices.beware_if_the_number_exceed_the_specified_length_it_will_be_truncated_by_the_left' }}</span>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/ng-template" id="addOrderNumber.html">
|
|
||||||
<table class="invoice-element-legend">
|
|
||||||
<tr><td><strong>nn...nn</strong></td><td translate>{{ 'app.admin.invoices.n_digits_count_of_orders' }}</td></tr>
|
|
||||||
<tr><td><strong>dd...dd</strong></td><td translate>{{ 'app.admin.invoices.n_digits_daily_count_of_orders' }}</td></tr>
|
|
||||||
<tr><td><strong>mm...mm</strong></td><td translate>{{ 'app.admin.invoices.n_digits_monthly_count_of_orders' }}</td></tr>
|
|
||||||
<tr><td><strong>yy...yy</strong></td><td translate>{{ 'app.admin.invoices.n_digits_annual_amount_of_orders' }}</td></tr>
|
|
||||||
</table>
|
|
||||||
<span class="bottom-notes" translate>{{ 'app.admin.invoices.beware_if_the_number_exceed_the_specified_length_it_will_be_truncated_by_the_left' }}</span>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/ng-template" id="addOnlineInfo.html">
|
|
||||||
<table class="invoice-element-legend">
|
|
||||||
<tr><td><strong>X[texte]</strong></td><td>{{ 'app.admin.invoices.add_a_notice_regarding_the_online_sales_only_if_the_invoice_is_concerned' | translate }} <mark translate>{{ 'app.admin.invoices.this_will_never_be_added_when_a_refund_notice_is_present' }}</mark> {{ 'app.admin.invoices.eg_XVL_will_add_VL_to_the_invoices_settled_with_stripe' | translate }}</td></tr>
|
|
||||||
</table>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/ng-template" id="addWalletInfo.html">
|
|
||||||
<table class="invoice-element-legend">
|
|
||||||
<tr><td><strong>W[texte]</strong></td><td>{{ 'app.admin.invoices.add_a_notice_regarding_the_wallet_only_if_the_invoice_is_concerned' | translate }} <mark translate>{{ 'app.admin.invoices.this_will_never_be_added_when_a_refund_notice_is_present' }}</mark> {{ 'app.admin.invoices.eg_WPM_will_add_PM_to_the_invoices_settled_with_wallet' | translate }}</td></tr>
|
|
||||||
</table>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/ng-template" id="addRefundInfo.html">
|
|
||||||
<table class="invoice-element-legend">
|
|
||||||
<tr><td><strong>R[texte]</strong></td><td>{{ 'app.admin.invoices.add_a_notice_regarding_refunds_only_if_the_invoice_is_concerned' | translate }}<mark translate>{{ 'app.admin.invoices.this_will_never_be_added_when_an_online_sales_notice_is_present' }}</mark> {{ 'app.admin.invoices.eg_RA_will_add_A_to_the_refund_invoices' | translate }}</td></tr>
|
|
||||||
</table>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/ng-template" id="editCode.html">
|
|
||||||
<div class="custom-invoice">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h3 class="modal-title" translate>{{ 'app.admin.invoices.code' }}</h3>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="enableCode" class="control-label" translate>{{ 'app.admin.invoices.enable_the_code' }}</label>
|
|
||||||
<input bs-switch
|
|
||||||
ng-model="isSelected"
|
|
||||||
id="enableCode"
|
|
||||||
type="checkbox"
|
|
||||||
class="form-control m-l-sm"
|
|
||||||
switch-on-text="{{ 'app.admin.invoices.enabled' | translate }}"
|
|
||||||
switch-off-text="{{ 'app.admin.invoices.disabled' | translate }}"
|
|
||||||
switch-animate="true"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group" ng-show="isSelected">
|
|
||||||
<label for="codeModel" class="control-label" translate>{{ 'app.admin.invoices.code' }}</label>
|
|
||||||
<input id="codeModel" type="text" ng-model="codeModel" class="form-control"/>
|
|
||||||
</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>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script type="text/ng-template" id="editNumber.html">
|
|
||||||
<div class="custom-invoice">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h3 class="modal-title" translate>{{ 'app.admin.invoices.order_number' }}</h3>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body row">
|
|
||||||
<div class="elements col-md-4">
|
|
||||||
<h4 translate>{{ 'app.admin.invoices.elements' }}</h4>
|
|
||||||
<ul>
|
|
||||||
<li ng-click="invoice.number.help = 'addYear.html'">{{ 'app.admin.invoices.year' | translate }}</li>
|
|
||||||
<li ng-click="invoice.number.help = 'addMonth.html'">{{ 'app.admin.invoices.month' | translate }}</li>
|
|
||||||
<li ng-click="invoice.number.help = 'addDay.html'">{{ 'app.admin.invoices.day' | translate }}</li>
|
|
||||||
<li ng-click="invoice.number.help = 'addOrderNumber.html'">{{ 'app.admin.invoices.order_num' | translate }}</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-8">
|
|
||||||
<div class="model">
|
|
||||||
<h4 translate>{{ 'app.admin.invoices.model' }}</h4>
|
|
||||||
<input type="text" class="form-control" ng-model="model">
|
|
||||||
</div>
|
|
||||||
<div class="help">
|
|
||||||
<h4 translate>{{ 'app.admin.invoices.documentation' }}</h4>
|
|
||||||
<ng-include src="invoice.number.help" autoscroll="true">
|
|
||||||
</ng-include>
|
|
||||||
</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>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
<script type="text/ng-template" id="editVAT.html">
|
|
||||||
<div class="custom-invoice">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h3 class="modal-title" translate>{{ 'app.admin.invoices.VAT' }}</h3>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="enableVAT" class="control-label" translate>{{ 'app.admin.invoices.enable_VAT' }}</label>
|
|
||||||
<input bs-switch
|
|
||||||
ng-model="isSelected"
|
|
||||||
id="enableVAT"
|
|
||||||
type="checkbox"
|
|
||||||
class="form-control m-l-sm"
|
|
||||||
switch-on-text="{{ 'app.admin.invoices.enabled' | translate }}"
|
|
||||||
switch-off-text="{{ 'app.admin.invoices.disabled' | translate }}"
|
|
||||||
switch-animate="true"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group" ng-show="isSelected">
|
|
||||||
<label for="vatRate" class="control-label" translate>{{ 'app.admin.invoices.VAT_rate' }}</label>
|
|
||||||
<div class="input-group">
|
|
||||||
<span class="input-group-addon">% </span>
|
|
||||||
<input id="vatRate" type="number" ng-model="rate" class="form-control" min="0" max="100"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="m-t-lg">
|
|
||||||
<h4 translate>{{ 'app.admin.invoices.VAT_history' }}</h4>
|
|
||||||
<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-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>
|
|
||||||
</script>
|
|
||||||
|
86
app/assets/templates/admin/invoices/list.html.erb
Normal file
86
app/assets/templates/admin/invoices/list.html.erb
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
<h3 class="m-t-xs"><i class="fa fa-filter"></i> {{ 'app.admin.invoices.filter_invoices' | translate }}</h3>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-addon" translate>{{ 'app.admin.invoices.invoice_num_' }}</span>
|
||||||
|
<input type="text" ng-model="searchInvoice.reference" class="form-control" placeholder="" ng-change="handleFilterChange()">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-addon" translate>{{ 'app.admin.invoices.customer_' }}</span>
|
||||||
|
<input type="text" ng-model="searchInvoice.name" class="form-control" placeholder="" ng-change="handleFilterChange()">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-addon">{{ "app.admin.invoices.date_" | translate }}</span>
|
||||||
|
<input type="date" ng-model="searchInvoice.date" class="form-control" ng-change="handleFilterChange()">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
|
||||||
|
<table class="table invoices-list" ng-if="invoices.length > 0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th style="width:5%"></th>
|
||||||
|
<th style="width:15%"><a href="" ng-click="setOrderInvoice('reference')">{{ 'app.admin.invoices.invoice_num' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-numeric-asc': orderInvoice=='reference', 'fa fa-sort-numeric-desc': orderInvoice=='-reference', 'fa fa-arrows-v': orderInvoice }"></i></a></th>
|
||||||
|
|
||||||
|
<th style="width:20%"><a href="" ng-click="setOrderInvoice('date')">{{ 'app.admin.invoices.date' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-numeric-asc': orderInvoice=='date', 'fa fa-sort-numeric-desc': orderInvoice=='-date', 'fa fa-arrows-v': orderInvoice }"></i></a></th>
|
||||||
|
|
||||||
|
<th style="width:10%"><a href="" ng-click="setOrderInvoice('total')"> {{ 'app.admin.invoices.price' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-numeric-asc': orderInvoice=='total', 'fa fa-sort-numeric-desc': orderInvoice=='-total', 'fa fa-arrows-v': orderInvoice }"></i></a></th>
|
||||||
|
|
||||||
|
<th style="width:20%"><a href="" ng-click="setOrderInvoice('name')">{{ 'app.admin.invoices.customer' | translate }} <i class="fa fa-arrows-v" ng-class="{'fa fa-sort-alpha-asc': orderInvoice=='name', 'fa fa-sort-alpha-desc': orderInvoice=='-name', 'fa fa-arrows-v': orderInvoice }"></i></a></th>
|
||||||
|
|
||||||
|
<th style="width:30%"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr ng-repeat="invoice in invoices">
|
||||||
|
<td class="chained-indicator">
|
||||||
|
<i class="fa fa-link chained" ng-show="invoice.chained_footprint"/>
|
||||||
|
<i class="fa fa-chain-broken broken" ng-hide="invoice.chained_footprint"/>
|
||||||
|
</td>
|
||||||
|
<td>{{ invoice.reference }}</td>
|
||||||
|
<td ng-if="!invoice.is_avoir">{{ invoice.date | amDateFormat:'L LTS' }}</td>
|
||||||
|
<td ng-if="invoice.is_avoir">{{ invoice.date | amDateFormat:'L' }}</td>
|
||||||
|
<td>{{ invoice.total | currency}}</td>
|
||||||
|
<td>
|
||||||
|
<a href="" ui-sref="app.admin.members_edit({id: invoice.user_id})" ng-show="invoice.user_id">{{ invoice.name }}</a>
|
||||||
|
<span ng-hide="invoice.user_id">{{ invoice.name }}</span>
|
||||||
|
<td>
|
||||||
|
<div class="buttons">
|
||||||
|
<a class="btn btn-default download-button" ng-href="api/invoices/{{invoice.id}}/download" target="_blank" ng-if="!invoice.is_avoir">
|
||||||
|
<i class="fa fa-file-pdf-o"></i> {{ 'app.admin.invoices.download_the_invoice' | translate }}
|
||||||
|
</a>
|
||||||
|
<a class="btn btn-default" ng-href="api/invoices/{{invoice.id}}/download" target="_blank" ng-if="invoice.is_avoir">
|
||||||
|
<i class="fa fa-file-pdf-o"></i> {{ 'app.admin.invoices.download_the_credit_note' | translate }}
|
||||||
|
</a>
|
||||||
|
<a class="btn btn-default refund-button" ng-click="generateAvoirForInvoice(invoice)" ng-if="(!invoice.has_avoir || invoice.has_avoir == 'partial') && !invoice.is_avoir && !invoice.prevent_refund && !isDateClosed(invoice.created_at)">
|
||||||
|
<i class="fa fa-reply"></i> {{ 'app.admin.invoices.credit_note' | translate }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div class="text-center">
|
||||||
|
<button class="btn btn-warning" ng-click="showNextInvoices()" ng-hide="noMoreResults"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'app.admin.invoices.display_more_invoices' | translate }}</button>
|
||||||
|
</div>
|
||||||
|
<p ng-if="invoices.length == 0" translate>{{ 'app.admin.invoices.no_invoices_for_now' }}</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
310
app/assets/templates/admin/invoices/settings.html.erb
Normal file
310
app/assets/templates/admin/invoices/settings.html.erb
Normal file
@ -0,0 +1,310 @@
|
|||||||
|
<div class="alert alert-warning p-md m-t" role="alert" ng-show="fablabWithoutInvoices">
|
||||||
|
<i class="fa fa-warning m-r"></i>
|
||||||
|
<span translate>{{ 'app.admin.invoices.warning_invoices_disabled' }}</span>
|
||||||
|
</div>
|
||||||
|
<form class="invoice-placeholder">
|
||||||
|
<div class="invoice-logo">
|
||||||
|
<img src="data:image/png;base64," data-src="holder.js/100%x100%/text:/font:FontAwesome/icon" bs-holder ng-if="!invoice.logo" class="img-responsive">
|
||||||
|
<img base-sixty-four-image="invoice.logo" ng-if="invoice.logo && invoice.logo.base64">
|
||||||
|
<div class="tools-box">
|
||||||
|
<div class="btn-group">
|
||||||
|
<div class="btn btn-default btn-file">
|
||||||
|
<i class="fa fa-edit"></i> {{ 'app.admin.invoices.change_logo' | translate }}
|
||||||
|
<input type="file" accept="image/png,image/jpeg,image/x-png,image/pjpeg" name="invoice[logo][attachment]" ng-model="invoice.logo" base-sixty-four-input>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="invoice-buyer-infos">
|
||||||
|
<strong translate>{{ 'app.admin.invoices.john_smith' }}</strong>
|
||||||
|
<div translate>{{ 'app.admin.invoices.john_smith_at_example_com' }}</div>
|
||||||
|
</div>
|
||||||
|
<div class="invoice-reference invoice-editable" ng-click="openEditReference()">{{ 'app.admin.invoices.invoice_reference_' | translate }} {{mkReference()}}</div>
|
||||||
|
<div class="invoice-code invoice-editable" ng-show="invoice.code.active" ng-click="openEditCode()">{{ 'app.admin.invoices.code_' | translate }} {{invoice.code.model}}</div>
|
||||||
|
<div class="invoice-code invoice-activable" ng-show="!invoice.code.active" ng-click="openEditCode()" translate>{{ 'app.admin.invoices.code_disabled' }}</div>
|
||||||
|
<div class="invoice-order invoice-editable" ng-click="openEditInvoiceNb()"> {{ 'app.admin.invoices.order_num' | translate }} {{mkNumber()}}</div>
|
||||||
|
<div class="invoice-date">{{ 'app.admin.invoices.invoice_issued_on_DATE_at_TIME' | translate:{DATE:(today | amDateFormat:'L'), TIME:(today | amDateFormat:'LT')} }}</div>
|
||||||
|
<div class="invoice-object">
|
||||||
|
{{ 'app.admin.invoices.object_reservation_of_john_smith_on_DATE_at_TIME' | translate:{DATE:(inOneWeek | amDateFormat:'L'), TIME:(inOneWeek | amDateFormat:'LT')} }}
|
||||||
|
</div>
|
||||||
|
<div class="invoice-data">
|
||||||
|
{{ 'app.admin.invoices.order_summary' | translate }}
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th translate>{{ 'app.admin.invoices.details' }}</th>
|
||||||
|
<th class="right" translate>{{ 'app.admin.invoices.amount' }}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{ 'app.admin.invoices.machine_booking-3D_printer' | translate }} {{inOneWeek | amDateFormat:'LLL'}} - {{inOneWeekAndOneHour | amDateFormat:'LT'}}</td>
|
||||||
|
<td class="right">{{30.0 | currency}}</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr class="invoice-total" ng-class="{'bold vat-line':invoice.VAT.active}">
|
||||||
|
<td ng-show="!invoice.VAT.active" translate>{{ 'app.admin.invoices.total_amount' }}</td>
|
||||||
|
<td ng-show="invoice.VAT.active" translate>{{ 'app.admin.invoices.total_including_all_taxes' }}</td>
|
||||||
|
<td class="right">{{30.0 | currency}}</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr class="invoice-vat invoice-activable" ng-click="openEditVAT()" ng-show="!invoice.VAT.active">
|
||||||
|
<td translate>{{ 'app.admin.invoices.VAT_disabled' }}</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<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>{{30-(30/(invoice.VAT.rate/100+1)) | currency}}</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="invoice-ht vat-line italic" ng-show="invoice.VAT.active">
|
||||||
|
<td translate>{{ 'app.admin.invoices.including_total_excluding_taxes' }}</td>
|
||||||
|
<td>{{30/(invoice.VAT.rate/100+1) | currency}}</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="invoice-payed vat-line bold" ng-show="invoice.VAT.active">
|
||||||
|
<td translate>{{ 'app.admin.invoices.including_amount_payed_on_ordering' }}</td>
|
||||||
|
<td>{{30.0 | currency}}</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p class="invoice-payment" translate translate-values="{DATE:(today | amDateFormat:'L'), TIME:(today | amDateFormat:'LT'), AMOUNT:(30.0 | currency)}">
|
||||||
|
{{ 'app.admin.invoices.settlement_by_debit_card_on_DATE_at_TIME_for_an_amount_of_AMOUNT' }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div medium-editor class="invoice-text invoice-editable" ng-model="invoice.text.content"
|
||||||
|
options='{
|
||||||
|
"placeholder": "{{ "app.admin.invoices.important_notes" | translate }}",
|
||||||
|
"buttons": ["underline"]
|
||||||
|
}'
|
||||||
|
ng-blur="textEditEnd($event)">
|
||||||
|
</div>
|
||||||
|
<div medium-editor class="invoice-legals invoice-editable" ng-model="invoice.legals.content"
|
||||||
|
options='{
|
||||||
|
"placeholder": "{{ "app.admin.invoices.address_and_legal_information" | translate }}",
|
||||||
|
"buttons": ["bold", "underline"]
|
||||||
|
}'
|
||||||
|
ng-blur="legalsEditEnd($event)">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/ng-template" id="editReference.html">
|
||||||
|
<div class="custom-invoice">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h3 class="modal-title" translate>{{ 'app.admin.invoices.invoice_reference' }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body row">
|
||||||
|
<div class="elements col-md-4">
|
||||||
|
<h4>Éléments</h4>
|
||||||
|
<ul>
|
||||||
|
<li ng-click="invoice.reference.help = 'addYear.html'">{{ 'app.admin.invoices.year' | translate }}</li>
|
||||||
|
<li ng-click="invoice.reference.help = 'addMonth.html'">{{ 'app.admin.invoices.month' | translate }}</li>
|
||||||
|
<li ng-click="invoice.reference.help = 'addDay.html'">{{ 'app.admin.invoices.day' | translate }}</li>
|
||||||
|
<li ng-click="invoice.reference.help = 'addInvoiceNumber.html'">{{ 'app.admin.invoices.num_of_invoice' | translate }}</li>
|
||||||
|
<li ng-click="invoice.reference.help = 'addOnlineInfo.html'">{{ 'app.admin.invoices.online_sales' | translate }}</li>
|
||||||
|
<%# <li ng-click="invoice.reference.help = 'addWalletInfo.html'">{{ 'app.admin.invoices.wallet' | translate }}</li> %>
|
||||||
|
<li ng-click="invoice.reference.help = 'addRefundInfo.html'">{{ 'app.admin.invoices.refund' | translate }}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-8">
|
||||||
|
<div class="model">
|
||||||
|
<h4 translate>{{ 'app.admin.invoices.model' }}</h4>
|
||||||
|
<input type="text" class="form-control" ng-model="model">
|
||||||
|
</div>
|
||||||
|
<div class="help">
|
||||||
|
<h4 translate>{{ 'app.admin.invoices.documentation' }}</h4>
|
||||||
|
<ng-include src="invoice.reference.help" autoscroll="true">
|
||||||
|
</ng-include>
|
||||||
|
</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>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/ng-template" id="addYear.html">
|
||||||
|
<table class="invoice-element-legend">
|
||||||
|
<tr><td><strong>YY</strong></td><td translate>{{ 'app.admin.invoices.2_digits_year' }}</td></tr>
|
||||||
|
<tr><td><strong>YYYY</strong></td><td translate>{{ 'app.admin.invoices.4_digits_year' }}</td></tr>
|
||||||
|
</table>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/ng-template" id="addMonth.html">
|
||||||
|
<table class="invoice-element-legend">
|
||||||
|
<tr><td><strong>M</strong></td><td translate>{{ 'app.admin.invoices.month_number' }}</td></tr>
|
||||||
|
<tr><td><strong>MM</strong></td><td translate>{{ 'app.admin.invoices.2_digits_month_number' }}</td></tr>
|
||||||
|
<tr><td><strong>MMM</strong></td><td translate>{{ 'app.admin.invoices.3_characters_month_name' }}</td></tr>
|
||||||
|
</table>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/ng-template" id="addDay.html">
|
||||||
|
<table class="invoice-element-legend">
|
||||||
|
<tr><td><strong>D</strong></td><td translate>{{ 'app.admin.invoices.day_in_the_month' }}</td></tr>
|
||||||
|
<tr><td><strong>DD</strong></td><td translate>{{ 'app.admin.invoices.2_digits_day_in_the_month' }}</td></tr>
|
||||||
|
</table>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/ng-template" id="addInvoiceNumber.html">
|
||||||
|
<table class="invoice-element-legend">
|
||||||
|
<tr><td><strong>dd...dd</strong></td><td translate>{{ 'app.admin.invoices.n_digits_daily_count_of_invoices' }}</td></tr>
|
||||||
|
<tr><td><strong>mm...mm</strong></td><td translate>{{ 'app.admin.invoices.n_digits_monthly_count_of_invoices' }}</td></tr>
|
||||||
|
<tr><td><strong>yy...yy</strong></td><td translate>{{ 'app.admin.invoices.n_digits_annual_amount_of_invoices' }}</td></tr>
|
||||||
|
</table>
|
||||||
|
<span class="bottom-notes" translate>{{ 'app.admin.invoices.beware_if_the_number_exceed_the_specified_length_it_will_be_truncated_by_the_left' }}</span>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/ng-template" id="addOrderNumber.html">
|
||||||
|
<table class="invoice-element-legend">
|
||||||
|
<tr><td><strong>nn...nn</strong></td><td translate>{{ 'app.admin.invoices.n_digits_count_of_orders' }}</td></tr>
|
||||||
|
<tr><td><strong>dd...dd</strong></td><td translate>{{ 'app.admin.invoices.n_digits_daily_count_of_orders' }}</td></tr>
|
||||||
|
<tr><td><strong>mm...mm</strong></td><td translate>{{ 'app.admin.invoices.n_digits_monthly_count_of_orders' }}</td></tr>
|
||||||
|
<tr><td><strong>yy...yy</strong></td><td translate>{{ 'app.admin.invoices.n_digits_annual_amount_of_orders' }}</td></tr>
|
||||||
|
</table>
|
||||||
|
<span class="bottom-notes" translate>{{ 'app.admin.invoices.beware_if_the_number_exceed_the_specified_length_it_will_be_truncated_by_the_left' }}</span>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/ng-template" id="addOnlineInfo.html">
|
||||||
|
<table class="invoice-element-legend">
|
||||||
|
<tr><td><strong>X[texte]</strong></td><td>{{ 'app.admin.invoices.add_a_notice_regarding_the_online_sales_only_if_the_invoice_is_concerned' | translate }} <mark translate>{{ 'app.admin.invoices.this_will_never_be_added_when_a_refund_notice_is_present' }}</mark> {{ 'app.admin.invoices.eg_XVL_will_add_VL_to_the_invoices_settled_with_stripe' | translate }}</td></tr>
|
||||||
|
</table>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/ng-template" id="addWalletInfo.html">
|
||||||
|
<table class="invoice-element-legend">
|
||||||
|
<tr><td><strong>W[texte]</strong></td><td>{{ 'app.admin.invoices.add_a_notice_regarding_the_wallet_only_if_the_invoice_is_concerned' | translate }} <mark translate>{{ 'app.admin.invoices.this_will_never_be_added_when_a_refund_notice_is_present' }}</mark> {{ 'app.admin.invoices.eg_WPM_will_add_PM_to_the_invoices_settled_with_wallet' | translate }}</td></tr>
|
||||||
|
</table>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/ng-template" id="addRefundInfo.html">
|
||||||
|
<table class="invoice-element-legend">
|
||||||
|
<tr><td><strong>R[texte]</strong></td><td>{{ 'app.admin.invoices.add_a_notice_regarding_refunds_only_if_the_invoice_is_concerned' | translate }}<mark translate>{{ 'app.admin.invoices.this_will_never_be_added_when_an_online_sales_notice_is_present' }}</mark> {{ 'app.admin.invoices.eg_RA_will_add_A_to_the_refund_invoices' | translate }}</td></tr>
|
||||||
|
</table>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/ng-template" id="editCode.html">
|
||||||
|
<div class="custom-invoice">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h3 class="modal-title" translate>{{ 'app.admin.invoices.code' }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="enableCode" class="control-label" translate>{{ 'app.admin.invoices.enable_the_code' }}</label>
|
||||||
|
<input bs-switch
|
||||||
|
ng-model="isSelected"
|
||||||
|
id="enableCode"
|
||||||
|
type="checkbox"
|
||||||
|
class="form-control m-l-sm"
|
||||||
|
switch-on-text="{{ 'app.admin.invoices.enabled' | translate }}"
|
||||||
|
switch-off-text="{{ 'app.admin.invoices.disabled' | translate }}"
|
||||||
|
switch-animate="true"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group" ng-show="isSelected">
|
||||||
|
<label for="codeModel" class="control-label" translate>{{ 'app.admin.invoices.code' }}</label>
|
||||||
|
<input id="codeModel" type="text" ng-model="codeModel" class="form-control"/>
|
||||||
|
</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>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/ng-template" id="editNumber.html">
|
||||||
|
<div class="custom-invoice">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h3 class="modal-title" translate>{{ 'app.admin.invoices.order_number' }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body row">
|
||||||
|
<div class="elements col-md-4">
|
||||||
|
<h4 translate>{{ 'app.admin.invoices.elements' }}</h4>
|
||||||
|
<ul>
|
||||||
|
<li ng-click="invoice.number.help = 'addYear.html'">{{ 'app.admin.invoices.year' | translate }}</li>
|
||||||
|
<li ng-click="invoice.number.help = 'addMonth.html'">{{ 'app.admin.invoices.month' | translate }}</li>
|
||||||
|
<li ng-click="invoice.number.help = 'addDay.html'">{{ 'app.admin.invoices.day' | translate }}</li>
|
||||||
|
<li ng-click="invoice.number.help = 'addOrderNumber.html'">{{ 'app.admin.invoices.order_num' | translate }}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-8">
|
||||||
|
<div class="model">
|
||||||
|
<h4 translate>{{ 'app.admin.invoices.model' }}</h4>
|
||||||
|
<input type="text" class="form-control" ng-model="model">
|
||||||
|
</div>
|
||||||
|
<div class="help">
|
||||||
|
<h4 translate>{{ 'app.admin.invoices.documentation' }}</h4>
|
||||||
|
<ng-include src="invoice.number.help" autoscroll="true">
|
||||||
|
</ng-include>
|
||||||
|
</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>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/ng-template" id="editVAT.html">
|
||||||
|
<div class="custom-invoice">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h3 class="modal-title" translate>{{ 'app.admin.invoices.VAT' }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="enableVAT" class="control-label" translate>{{ 'app.admin.invoices.enable_VAT' }}</label>
|
||||||
|
<input bs-switch
|
||||||
|
ng-model="isSelected"
|
||||||
|
id="enableVAT"
|
||||||
|
type="checkbox"
|
||||||
|
class="form-control m-l-sm"
|
||||||
|
switch-on-text="{{ 'app.admin.invoices.enabled' | translate }}"
|
||||||
|
switch-off-text="{{ 'app.admin.invoices.disabled' | translate }}"
|
||||||
|
switch-animate="true"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group" ng-show="isSelected">
|
||||||
|
<label for="vatRate" class="control-label" translate>{{ 'app.admin.invoices.VAT_rate' }}</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-addon">% </span>
|
||||||
|
<input id="vatRate" type="number" ng-model="rate" class="form-control" min="0" max="100"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="m-t-lg">
|
||||||
|
<h4 translate>{{ 'app.admin.invoices.VAT_history' }}</h4>
|
||||||
|
<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-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>
|
||||||
|
</script>
|
@ -12,7 +12,7 @@ class InvoicePolicy < ApplicationPolicy
|
|||||||
end
|
end
|
||||||
|
|
||||||
def list?
|
def list?
|
||||||
user.admin?
|
user.admin? || user.manager?
|
||||||
end
|
end
|
||||||
|
|
||||||
def first?
|
def first?
|
||||||
|
@ -1011,6 +1011,7 @@ en:
|
|||||||
advanced: "Advanced settings"
|
advanced: "Advanced settings"
|
||||||
customize_home_page_css: "Customise the stylesheet og the home page"
|
customize_home_page_css: "Customise the stylesheet og the home page"
|
||||||
home_css_notice_html: "You can customize the stylesheet which will apply to the home page, using the <a href=\"https://sass-lang.com/documentation\" target=\"_blank\">SASS</a> syntax. These styles will be automatically subordinated to the <code>.home-page</code> selector to prevent any risk of breaking the application. Meanwhile please be careful, any changes in the home page editor at the top of the page may broke your styles, always refer to the HTML code."
|
home_css_notice_html: "You can customize the stylesheet which will apply to the home page, using the <a href=\"https://sass-lang.com/documentation\" target=\"_blank\">SASS</a> syntax. These styles will be automatically subordinated to the <code>.home-page</code> selector to prevent any risk of breaking the application. Meanwhile please be careful, any changes in the home page editor at the top of the page may broke your styles, always refer to the HTML code."
|
||||||
|
an_error_occurred_saving_the_setting: "An error occurred while saving the setting. Please try again later."
|
||||||
sort_by:
|
sort_by:
|
||||||
default: "Default"
|
default: "Default"
|
||||||
name: "Name"
|
name: "Name"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user