App-Office-Contacts

 view release on metacpan or  search on metacpan

lib/App/Office/Contacts/Controller/Exporter/Occupation.pm  view on Meta::CPAN

package App::Office::Contacts::Controller::Exporter::Occupation;

use strict;
use utf8;
use warnings;
use warnings  qw(FATAL utf8); # Fatalize encoding glitches.

use App::Office::Contacts::Util::Validator;

use Encode; # For encode().

use Sub::Exporter -setup =>
{
	exports =>
	[qw/
		add_occupation
		add_staff
		build_ok_xml
		cgiapp_init
		delete_occupation
		delete_staff
	/],
};

use Text::Xslate 'mark_raw';

use Try::Tiny;

our $VERSION = '2.04';

# -----------------------------------------------

sub add_occupation
{
	my($self)      = @_;
	my($person_id) = $self -> query -> param('person_id');

	$self -> param('db') -> simple -> begin_work;
	$self -> add_header('-Status' => 200, '-Content-Type' => 'text/xml; charset=utf-8');

	my($response, $result);

	try
	{
		$self -> log(debug => "Controller::Occupation.add_occupation($person_id)");

		$result = App::Office::Contacts::Util::Validator -> new
		(
			app    => $self,
			config => $self -> param('config'),
			db     => $self -> param('db'),
			query  => $self -> query,
		) -> add_occupation;

		if ($result -> success)
		{
			$self -> param('view') -> occupation -> add($self -> param('user_id'), $result);

			my($occupations) = $self -> param('db') -> person -> get_persons_occupations($person_id);
			$response        = $self -> param('view') -> occupation -> format_occupations($person_id, $occupations);
			$response        = $self -> build_ok_xml(mark_raw($response) );
		}
		else
		{
			$response = $self -> param('db') -> library -> build_error_xml
			(
				'Cannot add occupation',
				$result,
			);
		}

		$self -> param('db') -> simple -> commit;
	}
	catch
	{
		my($error) = $_;

		$self -> param('db') -> simple -> rollback;

		# Try to log the error despite the error.

		$self -> log(error => "System error: $error");

		$response = $self -> param('system_error');
	};

	return encode('utf-8', $response);

} # End of add_occupation.

# -----------------------------------------------

sub add_staff
{
	my($self)            = @_;
	my($organization_id) = $self -> query -> param('organization_id');

	$self -> param('db') -> simple -> begin_work;
	$self -> add_header('-Status' => 200, '-Content-Type' => 'text/xml; charset=utf-8');

	my($response, $result);

	try
	{
		$self -> log(debug => "Controller::Occupation.add_staff($organization_id)");

		$result = App::Office::Contacts::Util::Validator -> new
		(
			app    => $self,
			config => $self -> param('config'),
			db     => $self -> param('db'),
			query  => $self -> query,
		) -> add_staff;

		if ($result -> success)
		{
			$self -> param('view') -> occupation -> add($self -> param('user_id'), $result);

			my($staff) = $self -> param('db') -> organization -> get_organizations_staff($organization_id);
			$response  = $self -> param('view') -> occupation -> format_staff($organization_id, $staff);
			$response  = $self -> build_ok_xml(mark_raw($response) );
		}
		else
		{
			$response = $self -> param('db') -> library -> build_error_xml
			(
				'Cannot add staff',
				$result,
			);
		}

		$self -> param('db') -> simple -> commit;
	}
	catch
	{
		my($error) = $_;

		$self -> param('db') -> simple -> rollback;

		# Try to log the error despite the error.

		$self -> log(error => "System error: $error");

		$response = $self -> param('system_error');
	};

	return encode('utf-8', $response);

} # End of add_staff.

# -----------------------------------------------

sub build_ok_xml
{
	my($self, $html) = @_;

	$self -> log(debug => 'Controller::Occupation.build_ok_xml(...)');

	# Recover the organization id and person id from the session.
	# See delete_occupation()
	# and App::Office::Contacts::View::Occupation.add()

	my($organization_id) = $self -> param('db') -> session -> param('staff_organization_id');
	my($person_id)       = $self -> param('db') -> session -> param('occupation_person_id');

	return
qq|<response>
	<error></error>
	<org_id>$organization_id</org_id>
	<person_id>$person_id</person_id>
	<html><![CDATA[$html]]></html>
</response>
|;

} # End of build_ok_xml.

# -----------------------------------------------

sub cgiapp_init
{
	my($self) = @_;

	$self -> run_modes([qw/add_occupation add_staff delete_occupation delete_staff/]);

} # End of cgiapp_init.

# -----------------------------------------------

sub delete_occupation
{
	my($self)            = @_;
	my($occupation_id)   = $self -> query -> param('occupation_id');
	my($organization_id) = $self -> query -> param('organization_id');
	my($person_id)       = $self -> query -> param('person_id');

	$self -> param('db') -> simple -> begin_work;
	$self -> add_header('-Status' => 200, '-Content-Type' => 'text/xml; charset=utf-8');

	my($response, $result);

	try
	{
		$self -> log(debug => "Controller::Occupation.delete_occupation($occupation_id, $organization_id, $person_id)");

		$result = App::Office::Contacts::Util::Validator -> new
		(
			app    => $self,
			config => $self -> param('config'),
			db     => $self -> param('db'),
			query  => $self -> query,
		) -> delete_occupation;

		if ($result -> success)
		{
			$self -> param('db') -> occupation -> delete($occupation_id);

			# The next 2 are required for build_xml().

			$self -> param('db') -> session -> param(staff_organization_id => $organization_id);
			$self -> param('db') -> session -> param(occupation_person_id  => $person_id);

			my($occupations) = $self -> param('db') -> person -> get_persons_occupations($person_id);
			$response        = $self -> param('view') -> occupation -> format_occupations($person_id, $occupations);
			$response        = $self -> build_ok_xml(mark_raw($response) );
		}
		else
		{
			$response = $self -> param('db') -> library -> build_error_xml
			(
				'Cannot delete occupation',
				$result,
			);
		}

		$self -> param('db') -> simple -> commit;
	}
	catch
	{
		my($error) = $_;

		$self -> param('db') -> simple -> rollback;

		# Try to log the error despite the error.

		$self -> log(error => "System error: $error");

		$response = $self -> param('system_error');
	};

	return encode('utf-8', $response);

} # End of delete_occupation.

# -----------------------------------------------

sub delete_staff
{
	my($self)            = @_;
	my($occupation_id)   = $self -> query -> param('occupation_id');
	my($organization_id) = $self -> query -> param('organization_id');
	my($person_id)       = $self -> query -> param('person_id');

	$self -> param('db') -> simple -> begin_work;
	$self -> add_header('-Status' => 200, '-Content-Type' => 'text/xml; charset=utf-8');

	my($response, $result);

	try
	{
		$self -> log(debug => "Controller::Occupation.delete_staff($occupation_id, $organization_id, $person_id)");

		$result = App::Office::Contacts::Util::Validator -> new
		(
			app    => $self,
			config => $self -> param('config'),
			db     => $self -> param('db'),
			query  => $self -> query,
		) -> delete_staff;

		if ($result -> success)
		{
			$self -> param('db') -> occupation -> delete($occupation_id);

			# The next 2 are required for build_xml().

			$self -> param('db') -> session -> param(staff_organization_id => $organization_id);
			$self -> param('db') -> session -> param(occupation_person_id  => $person_id);

			my($staff) = $self -> param('db') -> organization -> get_organizations_staff($organization_id);
			$response  = $self -> param('view') -> occupation -> format_staff($organization_id, $staff);
			$response  = $self -> build_ok_xml(mark_raw($response) );
		}
		else
		{
			$response = $self -> param('db') -> library -> build_error_xml
			(
				'Cannot delete staff',
				$result,
			);
		}

		$self -> param('db') -> simple -> commit;
	}
	catch
	{
		my($error) = $_;

		$self -> param('db') -> simple -> rollback;

		# Try to log the error despite the error.

		$self -> log(error => "System error: $error");

		$response = $self -> param('system_error');
	};

	return encode('utf-8', $response);

} # End of delete_staff.

# -----------------------------------------------

1;



( run in 2.251 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )