|
|
|
@@ -4,6 +4,8 @@ namespace Biukop; |
|
|
|
use \XeroPHP\Application\PrivateApplication; |
|
|
|
class Xero { |
|
|
|
private $xero; |
|
|
|
private $clientgroup="48646f3d-cf5e-4fea-8c8b-5812bd540e1b"; |
|
|
|
private $minimum_sync_interval_in_seconds = 600; |
|
|
|
|
|
|
|
private function default_config(){ |
|
|
|
$config = array( |
|
|
|
@@ -61,4 +63,131 @@ class Xero { |
|
|
|
$employee = $this->xero->loadByGUID("PayrollAU\\Employee",$id); |
|
|
|
return $employee; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// |
|
|
|
//sync users to wordpress system |
|
|
|
//does not work for too many users or employees |
|
|
|
public function sync_users(){ |
|
|
|
$this->sync_clients(); |
|
|
|
//$this->sync_employees(); |
|
|
|
} |
|
|
|
private function sync_clients(){ |
|
|
|
$contacts = $this->getClients($this->clientgroup); |
|
|
|
foreach ($contacts as $c){ |
|
|
|
$msg = sprintf("SYNC Client name=[%s] {%s} \n", $c->getName(), $c->getContactID()); |
|
|
|
$this->logConsole($msg); |
|
|
|
$this->ensure_contact_exists($c); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private function sync_employees(){ |
|
|
|
$employees = $this->getEmployees(); |
|
|
|
foreach ( $employees as $e){ |
|
|
|
$msg = sprintf("SYNC employee name=[%s %s] {%s} \n", $e->getFirstName(), $e->getLastName(), $e->getEmployeeID()); |
|
|
|
$this->logConsole($msg); |
|
|
|
$this->ensure_staff_exists($e); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private function ensure_contact_exists($contact){ |
|
|
|
$login = $contact->getContactID(); |
|
|
|
$user = get_user_by('login', $login); |
|
|
|
if ($user === false){ |
|
|
|
$xero_contact = $this->getContact($login); |
|
|
|
$args = $this->xero_contact_profile($xero_contact); |
|
|
|
$id = wp_insert_user($args); |
|
|
|
$user = get_user_by('ID', $id); |
|
|
|
}else{//update user |
|
|
|
if ($this->is_too_close_to_sync($user)){ |
|
|
|
return; |
|
|
|
} |
|
|
|
$xero_contact = $this->getContact($login); |
|
|
|
$args = $this->xero_contact_profile($xero_contact); |
|
|
|
$args['ID'] = $user->ID; |
|
|
|
unset($args['user_pass']); //we don't change password |
|
|
|
wp_update_user($args); |
|
|
|
} |
|
|
|
$this->mark_updated($user->ID); |
|
|
|
} |
|
|
|
|
|
|
|
private function xero_contact_profile($c){ |
|
|
|
$args = [ |
|
|
|
'user_login' => $username = $c->getContactID(), |
|
|
|
'user_pass' => md5(uniqid(rand() + time(), true)), |
|
|
|
'display_name' =>$c->getName(), |
|
|
|
'user_email' => $c->getEmailAddress(), |
|
|
|
'first_name' => $c->getFirstName(), |
|
|
|
'last_name' => $c->getLastName(), |
|
|
|
'nickname' => $c->getName(), |
|
|
|
'role' => 'client', |
|
|
|
]; |
|
|
|
return $args; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private function ensure_staff_exists($employee) |
|
|
|
{ |
|
|
|
$login = $employee->getEmployeeID(); |
|
|
|
$xero_employee = $this->getEmployee($login); |
|
|
|
$args = $this->xero_employee_profile($xero_employee); |
|
|
|
$user = get_user_by('login', $login); |
|
|
|
if ($user === false){ |
|
|
|
$id = wp_insert_user($args); |
|
|
|
$user = get_user_by('ID', $id); |
|
|
|
}else{ |
|
|
|
if ($this->is_too_close_to_sync($user)){ |
|
|
|
return; |
|
|
|
} |
|
|
|
$args['ID'] = $user->ID; |
|
|
|
unset($args['user_pass']); |
|
|
|
wp_update_user($args); |
|
|
|
} |
|
|
|
$this->mark_updated($user->ID); |
|
|
|
} |
|
|
|
|
|
|
|
private function xero_employee_profile($e){ |
|
|
|
$args = [ |
|
|
|
'user_login' => $username = $e->getEmployeeID(), |
|
|
|
'user_pass' => md5(uniqid(rand() + time(), true)), |
|
|
|
'display_name' =>$e->getFirstName() . " " . $e->getLastName(), |
|
|
|
'user_email' => $e->getEmail(), |
|
|
|
'first_name' => $e->getFirstName(), |
|
|
|
'last_name' => $e->getLastName(), |
|
|
|
'nickname' => $e->getFirstName(), |
|
|
|
'role' => 'staff', |
|
|
|
]; |
|
|
|
return $args; |
|
|
|
} |
|
|
|
|
|
|
|
private function mark_updated($userid){ |
|
|
|
update_user_meta($userid, 'lastsync', time()); |
|
|
|
} |
|
|
|
|
|
|
|
private function get_last_sync($userid){ |
|
|
|
$lastsync = get_user_meta($userid, 'lastsync'); |
|
|
|
return (int)($lastsync[0]); |
|
|
|
} |
|
|
|
|
|
|
|
private function is_too_close_to_sync($user){ |
|
|
|
$userid = $user->ID; |
|
|
|
$lastsync = $this->get_last_sync($user->ID); |
|
|
|
$now = time(); |
|
|
|
$diff = $now - (int) $lastsync; |
|
|
|
echo "lastsync = $lastsync, now = $now , diff = $diff; \n" ; |
|
|
|
if ($diff < $this->minimum_sync_interval_in_seconds){ |
|
|
|
$msg = sprintf("SKIP sync user %d, login=%s, display_name=%s\n", $user->ID, $user->user_login, $user->display_name); |
|
|
|
$this->logConsole($msg); |
|
|
|
return true; |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
private function logConsole($str){ |
|
|
|
//if is commandline |
|
|
|
if ( defined( 'WP_CLI' ) && WP_CLI ) { |
|
|
|
echo $str; |
|
|
|
} |
|
|
|
} |
|
|
|
} |