add homeless to person addresses

This commit is contained in:
Julien Fastré 2020-05-01 15:51:30 +02:00
parent de560b4d3b
commit 320598e905
10 changed files with 197 additions and 8 deletions

View File

@ -237,7 +237,8 @@ class PersonAddressController extends Controller
'action' => $this->generateUrl('chill_person_address_update', array(
'person_id' => $person->getId(),
'address_id' => $address->getId()
))
)),
'has_no_address' => true
));
$form->add('submit', SubmitType::class, array(
@ -259,7 +260,8 @@ class PersonAddressController extends Controller
'method' => 'POST',
'action' => $this->generateUrl('chill_person_address_create', array(
'person_id' => $person->getId()
))
)),
'has_no_address' => true
));
$form->add('submit', SubmitType::class, array(

View File

@ -235,8 +235,11 @@ class ChillPersonExtension extends Extension implements PrependExtensionInterfac
'GET_PERSON_ADDRESS_POSTCODE_ID' => AddressPart\AddressPartPostCodeId::class,
'GET_PERSON_ADDRESS_COUNTRY_NAME' => AddressPart\AddressPartCountryName::class,
'GET_PERSON_ADDRESS_COUNTRY_CODE' => AddressPart\AddressPartCountryCode::class,
'GET_PERSON_ADDRESS_COUNTRY_ID' => AddressPart\AddressPartCountryId::class
)
'GET_PERSON_ADDRESS_COUNTRY_ID' => AddressPart\AddressPartCountryId::class,
),
'numeric_functions' => [
'GET_PERSON_ADDRESS_ISNOADDRESS' => AddressPart\AddressPartIsNoAddress::class,
]
)
)
));

View File

@ -73,7 +73,7 @@ abstract class AddressPart extends FunctionNode
* Should be one value of the "public" amongst
* 'address_id', 'streetaddress1',
* 'streetaddress2', 'validfrom', 'postcode_label', 'postcode_code',
* 'postcode_id', 'country_name', 'country_code', 'country_id'
* 'postcode_id', 'country_name', 'country_code', 'country_id', 'isnoaddress'
*
* @return string
*/

View File

@ -0,0 +1,33 @@
<?php
/*
* Copyright (C) 2017 Champs Libres Cooperative <info@champs-libres.coop>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Chill\PersonBundle\Doctrine\DQL\AddressPart;
use Chill\PersonBundle\Doctrine\DQL\AddressPart;
/**
*
*
* @author Julien Fastré <julien.fastre@champs-libres.coop>
*/
class AddressPartIsNoAddress extends AddressPart
{
public function getPart()
{
return 'isnoaddress';
}
}

View File

@ -60,7 +60,7 @@ class ListPerson implements ListInterface, ExportElementValidatedInterface
'mobilenumber', 'contactInfo', 'countryOfBirth', 'nationality',
'address_street_address_1', 'address_street_address_2',
'address_valid_from', 'address_postcode_label', 'address_postcode_code',
'address_country_name', 'address_country_code'
'address_country_name', 'address_country_code', 'address_isnoaddress'
);
private $slugs = [];
@ -257,6 +257,16 @@ class ListPerson implements ListInterface, ExportElementValidatedInterface
return $this->translatableStringHelper->localize(json_decode($value, true));
};
case 'address_isnoaddress':
return function($value) use ($key) {
if ($value === '_header') { return 'address.address_homeless'; }
if ($value) {
return 'X';
} else {
return '';
}
};
default:
// for fields which are associated with person
if (in_array($key, $this->fields)) {
@ -429,6 +439,7 @@ class ListPerson implements ListInterface, ExportElementValidatedInterface
case 'address_postcode_code':
case 'address_country_name':
case 'address_country_code':
case 'address_isnoaddress':
$qb->addSelect(sprintf(
'GET_PERSON_ADDRESS_%s(person.id, :address_date) AS %s',

View File

@ -0,0 +1,138 @@
<?php declare(strict_types=1);
namespace Application\Migrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20200422125935 extends AbstractMigration
{
public function up(Schema $schema) : void
{
$this->addSql('DROP FUNCTION get_last_address(integer, date)');
$this->addSql(<<<'SQL'
CREATE OR REPLACE FUNCTION public.get_last_address (
pid integer,
before_date date)
RETURNS TABLE(
person_id integer,
address_id integer,
streetaddress1 varchar(255),
streetaddress2 varchar(255),
validfrom date,
postcode_label varchar(255),
postcode_code varchar(100),
postcode_id integer,
isnoaddress boolean,
country_name json,
country_code varchar(3),
country_id integer)
AS
$BODY$
SELECT
pid AS person_id,
chill_main_address.id AS address_id,
chill_main_address.streetaddress1,
chill_main_address.streetaddress2,
chill_main_address.validfrom,
chill_main_postal_code.label,
chill_main_postal_code.code,
chill_main_postal_code.id AS postal_code_id,
chill_main_address.isnoaddress AS isnoaddress,
country.name,
country.countrycode,
country.id AS country_id
FROM chill_main_address
JOIN (
SELECT
chill_main_address.id AS address_id,
validfrom,
rank() OVER (PARTITION BY person_id ORDER BY validfrom DESC) as pos
FROM chill_person_persons_to_addresses
JOIN chill_main_address ON chill_person_persons_to_addresses.address_id = chill_main_address.id
WHERE person_id = pid
AND chill_main_address.validfrom <= before_date
) AS ranking ON ranking.address_id = chill_main_address.id
JOIN chill_main_postal_code ON chill_main_address.postcode_id = chill_main_postal_code.id
JOIN country ON chill_main_postal_code.country_id = country.id
WHERE ranking.pos = 1
$BODY$
LANGUAGE sql VOLATILE
COST 100;
SQL
);
$this->addSql(<<<'SQL'
CREATE OR REPLACE FUNCTION get_last_address_isnoaddress (
pid integer,
before_date date)
RETURNS BOOL AS
$BODY$
SELECT isnoaddress FROM get_last_address(pid, before_date)
$BODY$
LANGUAGE sql volatile
COST 100;
SQL
);
}
public function down(Schema $schema) : void
{
$this->addSql('DROP FUNCTION public.get_last_address_isnoaddress(integer, date);');
$this->addSql('DROP FUNCTION get_last_address(integer, date)');
$this->addSql(<<<'SQL'
CREATE OR REPLACE FUNCTION public.get_last_address (
pid integer,
before_date date)
RETURNS TABLE(
person_id integer,
address_id integer,
streetaddress1 varchar(255),
streetaddress2 varchar(255),
validfrom date,
postcode_label varchar(255),
postcode_code varchar(100),
postcode_id integer,
country_name json,
country_code varchar(3),
country_id integer)
AS
$BODY$
SELECT
pid AS person_id,
chill_main_address.id AS address_id,
chill_main_address.streetaddress1,
chill_main_address.streetaddress2,
chill_main_address.validfrom,
chill_main_postal_code.label,
chill_main_postal_code.code,
chill_main_postal_code.id AS postal_code_id,
country.name,
country.countrycode,
country.id AS country_id
FROM chill_main_address
JOIN (
SELECT
chill_main_address.id AS address_id,
validfrom,
rank() OVER (PARTITION BY person_id ORDER BY validfrom DESC) as pos
FROM chill_person_persons_to_addresses
JOIN chill_main_address ON chill_person_persons_to_addresses.address_id = chill_main_address.id
WHERE person_id = pid
AND chill_main_address.validfrom <= before_date
) AS ranking ON ranking.address_id = chill_main_address.id
JOIN chill_main_postal_code ON chill_main_address.postcode_id = chill_main_postal_code.id
JOIN country ON chill_main_postal_code.country_id = country.id
WHERE ranking.pos = 1
$BODY$
LANGUAGE sql VOLATILE
COST 100;
SQL
);
}
}

View File

@ -26,6 +26,7 @@
{{ form_start(form) }}
{{ form_row(form.isNoAddress) }}
{{ form_row(form.streetAddress1) }}
{{ form_row(form.streetAddress2) }}
{{ form_row(form.postCode) }}

View File

@ -50,7 +50,7 @@
<td><strong>{{ 'Since %date%'|trans( { '%date%' : address.validFrom|localizeddate('long', 'none') } ) }}</strong></td>
<td>
{{ address_macros._render(address, { 'with_valid_from' : false } ) }}
{{ address_macros._render(address, { 'with_valid_from' : false, 'has_no_address': true } ) }}
</td>
<td>

View File

@ -26,6 +26,7 @@
{{ form_start(form) }}
{{ form_row(form.isNoAddress) }}
{{ form_row(form.streetAddress1) }}
{{ form_errors(form.streetAddress1) }}
{{ form_row(form.streetAddress2) }}

View File

@ -178,7 +178,7 @@ This view should receive those arguments:
<dt>{{ 'Address'|trans }}</dt>
<dd>
{%- if person.lastAddress is not empty -%}
{{ address._render(person.lastAddress) }}
{{ address._render(person.lastAddress, {'has_no_address': true}) }}
<ul class="record_actions record_actions_small">
<li>