You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
7.5 KiB
PHP

<?php
/*
* Copyright 2019 Netsyms Technologies.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
use InvoiceNinja\Config as NinjaConfig;
use InvoiceNinja\Models\Client as NinjaClient;
class Client implements JsonSerializable {
private $local = true;
private $exists = false;
private $full = true;
private $id = "";
private $name = "";
private $phone = "";
private $email = "";
private $billingaddress = "";
private $mailingaddress = "";
private $publicnotes = "";
private $privatenotes = "";
/**
*
* @param type $id
* @param type $local
* @param type $full
* @param type $name
*/
public function __construct($id = "", $local = true, $name = "") {
global $database;
if (!empty($id)) {
$this->id = $id;
$this->local = $local;
$this->exists = true;
if ($local) {
$this->full = true;
$data = $database->get("clients", ['name', 'phone', 'email', 'billingaddress', 'mailingaddress', 'publicnotes', 'privatenotes'], ["clientid" => $id]);
$this->setName($data['name'] . "");
$this->setPhone($data['phone'] . "");
$this->setEmail($data['email'] . "");
$this->setBillingAddress($data['billingaddress'] . "");
$this->setMailingAddress($data['mailingaddress'] . "");
$this->setPublicNotes($data['publicnotes'] . "");
$this->setPrivateNotes($data['privatenotes'] . "");
} else {
$this->full = false;
$this->name = $name;
}
}
}
public function jsonSerialize() {
return [
"id" => $this->id,
"name" => $this->name
];
}
/**
* Fill in all the client data from the InvoiceNinja API.
*/
private function fullerize() {
global $SETTINGS;
if (!$this->local && !$this->full && $this->exists) {
try {
$client = NinjaClient::find($this->id);
$this->full = true;
// Name
$this->setName($client->display_name);
// Phone
if (!empty($client->work_phone)) {
$this->setPhone($client->work_phone);
} else if (!empty($client->contacts[0]->phone)) {
$this->setPhone($client->contacts[0]->phone);
}
if (!empty($client->contacts[0]->email)) {
$this->setEmail($client->contacts[0]->email);
}
$billingaddress = [
$client->address1,
$client->address2,
implode(" ", array_filter([$client->city, $client->state, $client->postal_code]))
];
$this->setBillingAddress(implode("\n", array_filter($billingaddress)));
$mailingaddress = [
$client->shipping_address1,
$client->shipping_address2,
implode(" ", array_filter([$client->shipping_city, $client->shipping_state, $client->shipping_postal_code]))
];
$this->setMailingAddress(implode("\n", array_filter($mailingaddress)));
$this->setPublicNotes($client->public_notes);
$this->setPrivateNotes($client->private_notes);
} catch (Exception $ex) {
if ($SETTINGS['debug']) {
echo $ex->getTraceAsString();
}
sendError("Unable to query client from InvoiceNinja server:\n" . $ex->getMessage());
}
}
}
public static function exists($id, $local = true): bool {
global $database, $SETTINGS;
if ($local) {
return $database->has('clients', ['clientid' => $id]);
}
try {
$client = NinjaClient::find($id);
return true;
} catch (Exception $ex) {
if ($ex->getMessage() == "{\n \"message\": \"record does not exist\"\n}") {
return false;
}
if ($SETTINGS['debug']) {
echo $ex->getTraceAsString();
}
sendError("Unable to query client ID from InvoiceNinja server:\n" . $ex->getMessage());
}
}
/**
* Save the client.
*/
public function save() {
global $database;
if ($this->isLocal()) {
$data = [
"name" => $this->getName(),
"phone" => $this->getPhone(),
"email" => $this->getEmail(),
"billingaddress" => $this->getBillingAddress(),
"mailingaddress" => $this->getMailingAddress(),
"publicnotes" => $this->getPublicNotes(),
"privatenotes" => $this->getPrivateNotes()
];
if (!empty($this->id) && $database->has("clients", ["clientid" => $this->id])) {
$database->update("clients", $data, ["clientid" => $this->id]);
} else {
$database->insert("clients", $data);
$this->id = $database->id();
}
return;
}
if ($this->exists) {
$client = NinjaClient::find($id);
$client->name = $this->getName();
} else {
$client = new NinjaClient($this->getEmail(), '', '', $this->getName());
}
$client->work_phone = $this->getPhone();
$client->public_notes = $this->getPublicNotes();
$client->private_notes = $this->getPrivateNotes();
$client->save();
}
public function isLocal(): bool {
return $this->local;
}
public function getID() {
return $this->id;
}
public function getName(): string {
if (empty($this->name)) {
$this->fullerize();
}
return $this->name;
}
public function getPhone(): string {
$this->fullerize();
return $this->phone;
}
public function getEmail(): string {
$this->fullerize();
return $this->email;
}
public function getBillingAddress(): string {
$this->fullerize();
return $this->billingaddress;
}
public function getMailingAddress(): string {
$this->fullerize();
return $this->mailingaddress;
}
public function getPublicNotes(): string {
$this->fullerize();
return $this->publicnotes;
}
public function getPrivateNotes(): string {
$this->fullerize();
return $this->privatenotes;
}
public function setName(string $name) {
$this->fullerize();
$this->name = $name;
}
public function setPhone(string $phone) {
$this->fullerize();
$this->phone = $phone;
}
public function setEmail(string $email) {
$this->fullerize();
$this->email = $email;
}
public function setBillingAddress(string $address) {
$this->fullerize();
$this->billingaddress = $address;
}
public function setMailingAddress(string $address) {
$this->fullerize();
$this->mailingaddress = $address;
}
public function setPublicNotes(string $notes) {
$this->fullerize();
$this->publicnotes = $notes;
}
public function setPrivateNotes(string $notes) {
$this->fullerize();
$this->privatenotes = $notes;
}
}