Overview
Comment:Revert [729057f07841eaadbd94bae443f9f141447ad0360b9ea125b8e6090314ddc292] as it breaks
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: fc0e659ec564bc6d627d08d5c01520fb9fad1ecbcee40e844702d7e198399653
User & Date: bohwaz on 2023-01-28 01:25:14
Other Links: manifest | tags
Context
2023-01-28
01:39
Improve error message if date does not fit with the selected year, see [9e9e996dcc] check-in: 859f52234c user: bohwaz tags: trunk
01:25
Revert [729057f07841eaadbd94bae443f9f141447ad0360b9ea125b8e6090314ddc292] as it breaks check-in: fc0e659ec5 user: bohwaz tags: trunk
2023-01-27
23:47
Revert [c6ca249370] while waiting for a proper fix check-in: 2fc0cf9c4f user: bohwaz tags: trunk
17:53
Fix User interface while trying to subscribe a member to a service - and using accounting - with a fee not corresponding the current year check-in: 729057f078 user: alinaar tags: trunk
Changes

Modified src/templates/services/user/_service_user_form.tpl from [bd05dc259f] to [6e259c61e9].

93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136

		{foreach from=$grouped_services item="service"}
		<?php if (!count($service->fees)) { continue; } ?>
		<dl data-service="s{$service.id}">
			<dt><label for="f_fee">Tarif</label> <b>(obligatoire)</b></dt>
			{foreach from=$service.fees key="service_id" item="fee"}
			<dd class="radio-btn">
				{assign var="class" value=""}
				{if $session->canAccess($session::SECTION_ACCOUNTING, $session::ACCESS_READ)}
					{assign var="accounting_year" value=$accounting_years[$fee->id_year]}
					{if $today < $accounting_year->start_date || $today > $accounting_year->end_date}
						{assign var="class" value="unavailable_to_accounting"}
					{/if}
				{/if}
				{input type="radio" name="id_fee" value=$fee.id data-user-amount=$fee.user_amount data-account=$fee.id_account data-year=$fee.id_year label=null data-project=$fee.id_project source=$service_user class=$class}
				<label for="f_id_fee_{$fee.id}">
					<div>
						<h3>{$fee.label}</h3>
						<p>
							{if $fee.user_amount && $fee.formula}
								<strong>{$fee.user_amount|raw|money_currency}</strong> (montant calculé)
							{elseif $fee.formula}
								montant calculé, variable selon les membres
							{elseif $fee.user_amount}
								<strong>{$fee.user_amount|raw|money_currency}</strong>
							{else}
								prix libre ou gratuit
							{/if}
						</p>
						{if $fee.description}
						<p class="help">
							{$fee.description|escape|nl2br}
						</p>
						{/if}
						{if $session->canAccess($session::SECTION_ACCOUNTING, $session::ACCESS_READ)}
							<p class="help">{$accounting_year->label}</p>
						{/if}
					</div>
				</label>
			</dd>
			{/foreach}
		</dl>
		{/foreach}








<
<
<
<
<
<
<
|



















<
<
<







93
94
95
96
97
98
99







100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119



120
121
122
123
124
125
126

		{foreach from=$grouped_services item="service"}
		<?php if (!count($service->fees)) { continue; } ?>
		<dl data-service="s{$service.id}">
			<dt><label for="f_fee">Tarif</label> <b>(obligatoire)</b></dt>
			{foreach from=$service.fees key="service_id" item="fee"}
			<dd class="radio-btn">







				{input type="radio" name="id_fee" value=$fee.id data-user-amount=$fee.user_amount data-account=$fee.id_account data-year=$fee.id_year label=null data-project=$fee.id_project source=$service_user }
				<label for="f_id_fee_{$fee.id}">
					<div>
						<h3>{$fee.label}</h3>
						<p>
							{if $fee.user_amount && $fee.formula}
								<strong>{$fee.user_amount|raw|money_currency}</strong> (montant calculé)
							{elseif $fee.formula}
								montant calculé, variable selon les membres
							{elseif $fee.user_amount}
								<strong>{$fee.user_amount|raw|money_currency}</strong>
							{else}
								prix libre ou gratuit
							{/if}
						</p>
						{if $fee.description}
						<p class="help">
							{$fee.description|escape|nl2br}
						</p>
						{/if}



					</div>
				</label>
			</dd>
			{/foreach}
		</dl>
		{/foreach}

148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
			<dd class="help">Décocher cette case pour pouvoir suivre les règlements de personnes qui payent en plusieurs fois. Il sera possible de cocher cette case lorsque le solde aura été réglé.</dd>
		</dl>
	</fieldset>

	{if $create}
	<fieldset class="accounting">
		<legend>{input type="checkbox" name="create_payment" value=1 default=1 label="Enregistrer en comptabilité"}</legend>
		<p id="no_fee_available_message" style="display: none;" class="help">
			Non disponible pour ce tarif car il est associé à un exercice comptable ne correspondant pas à cette année {$today|date_format:"%Y"}.<br />
			{if $no_accounting_fee}
				L'activité "{$service.label}" ne posséde actuellement aucun tarif pour cette année. {linkbutton href="!services/fees/?id="|cat:$service.id label="Ajouter un tarif" shape="plus"}
			{/if}
		</p>
		<dl>
			{if !empty($users)}
			<dd class="help">Une écriture sera créée pour chaque membre inscrit.</dd>
			{/if}

			{input type="money" name="amount" label="Montant réglé par le membre" required=true help="En cas de règlement en plusieurs fois il sera possible d'ajouter des règlements via la page de suivi des activités de ce membre."}
			{input type="list" target="!acc/charts/accounts/selector.php?targets=%s&year=0"|args:$account_targets name="account_selector" label="Compte de règlement" required=true}
			{input type="text" name="reference" label="Numéro de pièce comptable" help="Numéro de facture, de reçu, de note de frais, etc."}
			{input type="text" name="payment_reference" label="Référence de paiement" help="Numéro de chèque, numéro de transaction CB, etc."}
			{input type="textarea" name="notes" label="Remarques"}
			{if count($projects) > 1}







|
<
<
<
<
<

|
|
|







138
139
140
141
142
143
144
145





146
147
148
149
150
151
152
153
154
155
156
			<dd class="help">Décocher cette case pour pouvoir suivre les règlements de personnes qui payent en plusieurs fois. Il sera possible de cocher cette case lorsque le solde aura été réglé.</dd>
		</dl>
	</fieldset>

	{if $create}
	<fieldset class="accounting">
		<legend>{input type="checkbox" name="create_payment" value=1 default=1 label="Enregistrer en comptabilité"}</legend>






		<dl>
		{if !empty($users)}
		<dd class="help">Une écriture sera créée pour chaque membre inscrit.</dd>
		{/if}

			{input type="money" name="amount" label="Montant réglé par le membre" required=true help="En cas de règlement en plusieurs fois il sera possible d'ajouter des règlements via la page de suivi des activités de ce membre."}
			{input type="list" target="!acc/charts/accounts/selector.php?targets=%s&year=0"|args:$account_targets name="account_selector" label="Compte de règlement" required=true}
			{input type="text" name="reference" label="Numéro de pièce comptable" help="Numéro de facture, de reçu, de note de frais, etc."}
			{input type="text" name="payment_reference" label="Référence de paiement" help="Numéro de chèque, numéro de transaction CB, etc."}
			{input type="textarea" name="notes" label="Remarques"}
			{if count($projects) > 1}

Modified src/www/admin/services/user/_form.php from [bacbc42c87] to [148f0505cd].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

namespace Garradin;

use Garradin\Accounting\Projects;
use Garradin\Services\Services;
use Garradin\Entities\Accounting\Year;
use KD2\DB\EntityManager;


if (!defined('\Garradin\ROOT')) {
	die();
}

assert(isset($tpl, $form_url, $create));






<
<







1
2
3
4
5
6


7
8
9
10
11
12
13
<?php

namespace Garradin;

use Garradin\Accounting\Projects;
use Garradin\Services\Services;




if (!defined('\Garradin\ROOT')) {
	die();
}

assert(isset($tpl, $form_url, $create));
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
$tpl->assign([
	'custom_js' => ['service_form.js'],
]);

$tpl->assign(compact('form_url', 'today', 'grouped_services', 'current_only', 'has_past_services',
	'create', 'copy_service', 'copy_service_only_paid', 'users'));

if ($session->canAccess($session::SECTION_ACCOUNTING, $session::ACCESS_READ)) {
	$accounting_years = [];
	foreach (EntityManager::getInstance(Year::class)->iterate(sprintf('SELECT * FROM %s;', Year::TABLE)) as $accounting_year) {
		$accounting_years[$accounting_year->id] = $accounting_year;
	}

	$no_accounting_fee = true;
	foreach ($grouped_services as $service) {
		foreach ($service->fees as $fee)
			if ($no_accounting_fee && $accounting_years[$fee->id_year]->start_date <= $today && $today <= $accounting_years[$fee->id_year]->end_date) {
				$no_accounting_fee = false;
			}
	}
	$tpl->assign(compact('accounting_years', 'no_accounting_fee'));
}

$tpl->assign('projects', Projects::listAssocWithEmpty());







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

38
39
40
41
42
43
44
















45
$tpl->assign([
	'custom_js' => ['service_form.js'],
]);

$tpl->assign(compact('form_url', 'today', 'grouped_services', 'current_only', 'has_past_services',
	'create', 'copy_service', 'copy_service_only_paid', 'users'));

















$tpl->assign('projects', Projects::listAssocWithEmpty());

Modified src/www/admin/static/scripts/service_form.js from [1131c2589a] to [d3a768cf39].

24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
		fee = first;
	}
	else if (!first) {
		document.querySelector('input[name=id_fee]:checked').checked = false;
	}

	if (fee) {
		selectFee(fee, !document.querySelector('input[name=id_fee]').classList.contains('unavailable_to_accounting'));
	}
}

function selectFee(elm, accountable) {
	var amount = parseInt(elm.getAttribute('data-user-amount'), 10);

	// Toggle accounting part of the form
	var accounting = elm.getAttribute('data-account') ? true : false;
	g.toggle('.accounting', accounting);

	if (accounting && create) {
		$('#f_create_payment_1').checked = true;
		let btn = $('#f_account_selector_container').querySelector('button');
		btn.value = btn.value.replace(/&year=\d+/, '') + '&year=' + elm.getAttribute('data-year');
	}

	// Fill the amount paid by the user
	if (amount && create) {
		$('#f_amount').value = g.formatMoney(amount);
	}

	if (elm.dataset.project) {
		$('#f_id_project').value = elm.dataset.project;
	}
	
	// Toogle the accounting block
	$('#f_create_payment_1').disabled = !accountable;
	$('#f_create_payment_1').checked = accountable;
	g.toggle('.accounting dl', accountable);
	$('#no_fee_available_message').style.display = accountable ? 'none' : 'block';
}

function initForm() {
	$('input[name=id_service]').forEach((e) => {
		e.onchange = () => { selectService(e); };
	});

	$('input[name=id_fee]').forEach((e) => {
		e.onchange = () => { selectFee(e, true); };
	});
	$('input[class=unavailable_to_accounting]').forEach((e) => {
		e.onchange = () => { selectFee(e, false); };
	});

	selected = document.querySelector('input[name="id_service"]:checked') || document.querySelector('input[name="id_service"]');
	selected.checked = true;

	let date_input = $('#f_date');
	create = date_input.form.dataset.create == 'true';







|



|




















<
<
<
<
<
<








|
<
<
<







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55






56
57
58
59
60
61
62
63
64



65
66
67
68
69
70
71
		fee = first;
	}
	else if (!first) {
		document.querySelector('input[name=id_fee]:checked').checked = false;
	}

	if (fee) {
		selectFee(fee);
	}
}

function selectFee(elm) {
	var amount = parseInt(elm.getAttribute('data-user-amount'), 10);

	// Toggle accounting part of the form
	var accounting = elm.getAttribute('data-account') ? true : false;
	g.toggle('.accounting', accounting);

	if (accounting && create) {
		$('#f_create_payment_1').checked = true;
		let btn = $('#f_account_selector_container').querySelector('button');
		btn.value = btn.value.replace(/&year=\d+/, '') + '&year=' + elm.getAttribute('data-year');
	}

	// Fill the amount paid by the user
	if (amount && create) {
		$('#f_amount').value = g.formatMoney(amount);
	}

	if (elm.dataset.project) {
		$('#f_id_project').value = elm.dataset.project;
	}






}

function initForm() {
	$('input[name=id_service]').forEach((e) => {
		e.onchange = () => { selectService(e); };
	});

	$('input[name=id_fee]').forEach((e) => {
		e.onchange = () => { selectFee(e); };



	});

	selected = document.querySelector('input[name="id_service"]:checked') || document.querySelector('input[name="id_service"]');
	selected.checked = true;

	let date_input = $('#f_date');
	create = date_input.form.dataset.create == 'true';