Files
ExpenseCount/app/Model/Expense.php
2026-06-25 13:03:45 +06:00

675 lines
16 KiB
PHP

<?php
class Expense extends AppModel
{
var $name = 'Expense';
public $hasOne = 'GroupSettings';
function setGroupExpenseValidation()
{
$this->validate = array(
'title' => array(
'notBlank' => array(
'rule' => 'notBlank',
'message' => __('TITLE_NOT_EMPTY_MAX_CHAR')
),
'between' => array(
'rule' => array('maxLength', '50'),
'message' => __('TITLE_NOT_EMPTY_MAX_CHAR')
)
),
'YourName' => array(
'notBlank' => array(
'rule' => 'notBlank',
'message' => __('YOUR_NAME_NOT_EMPTY_MAX_CHAR')
),
'between' => array(
'rule' => array('maxLength', PARTICIPENT_NAME_LENGTH),
'message' => __('YOUR_NAME_NOT_EMPTY_MAX_CHAR')
),
'noForbiddenChars' => array(
'rule' => ['custom', '/^[^,|]*$/'],
'message' => __('LBL_PARTICIPENT_NAME_ERROR')
)
),
'participants' => array(
'notBlank' => array(
'rule' => array('participantLengthCheck', PARTICIPENT_NAME_LENGTH),
'message' => __('PARTICIPANT_NOT_EMPTY_MAX_CHAR')
),
'duplicacy' => array(
'rule' => array('participantDuplicacyCheck', 'YourName'),
'message' => __('PARTICIPANT_DUPCICATE')
)
),
'emails' => array(
'notBlank' => array(
'rule' => array('validEmailCheck'),
'message' => __('EMAIL_IS_NOT_VALIE')
)
),
'currency' => array(
'notBlank' => array(
'rule' => 'notBlank',
'message' => __('CURRENCY_NOT_EMPTY_MAX_CHAR')
),
'between' => array(
'rule' => array('maxLength', '3'),
'message' => __('CURRENCY_NOT_EMPTY_MAX_CHAR')
)
),
'captcha' => array(
'notBlank' => array(
'rule' => 'notBlank',
'message' => __('CAPTCHA_NOT_EMPTY_MAX_CHAR')
),
'between' => array(
'rule' => array('maxLength', '5'),
'message' => __('CAPTCHA_NOT_EMPTY_MAX_CHAR')
)
)
);
}
function setFamilyExpenseValidation()
{
$this->validate = array(
'title' => array(
'notBlank' => array(
'rule' => 'notBlank',
'message' => __('TITLE_NOT_EMPTY_MAX_CHAR')
),
'between' => array(
'rule' => array('maxLength', '50'),
'message' => __('TITLE_NOT_EMPTY_MAX_CHAR')
)
),
'currency' => array(
'notBlank' => array(
'rule' => 'notBlank',
'message' => __('CURRENCY_NOT_EMPTY_MAX_CHAR')
),
'between' => array(
'rule' => array('maxLength', '3'),
'message' => __('CURRENCY_NOT_EMPTY_MAX_CHAR')
)
),
'emails' => array(
'notBlank' => array(
'rule' => array('validEmailCheck'),
'message' => __('EMAIL_IS_NOT_VALIE')
)
),
'captcha' => array(
'notBlank' => array(
'rule' => 'notBlank',
'message' => __('CAPTCHA_NOT_EMPTY_MAX_CHAR')
),
'between' => array(
'rule' => array('maxLength', '5'),
'message' => __('CAPTCHA_NOT_EMPTY_MAX_CHAR')
)
)
);
}
function setGroupExpenseModifyValidation()
{
$this->validate = array(
'title' => array(
'notBlank' => array(
'rule' => 'notBlank',
'message' => __('TITLE_NOT_EMPTY_MAX_CHAR')
),
'between' => array(
'rule' => array('maxLength', '50'),
'message' => __('TITLE_NOT_EMPTY_MAX_CHAR')
),
'noForbiddenChars' => array(
'rule' => ['custom', '/^[^,|]*$/'],
'message' => __('LBL_PARTICIPENT_NAME_ERROR')
)
),
'currency' => array(
'notBlank' => array(
'rule' => 'notBlank',
'message' => __('CURRENCY_NOT_EMPTY_MAX_CHAR')
),
'between' => array(
'rule' => array('maxLength', '3'),
'message' => __('CURRENCY_NOT_EMPTY_MAX_CHAR')
)
)
);
}
/*public $hasMany = array(
'Participant' => array(
'className' => 'Participant',
'conditions' => array('Participant.expense_id' => 'Expense.id'),
'order' => 'Participant.create_date ASC'
),
'GroupExpense' => array(
'className' =>'GroupExpense',
'conditions' => array('GroupExpense.expense_id' => 'Expense.id'),
'order' => 'GroupExpense.create_date ASC') ,
'Meal' => array(
'className' =>'Meal',
'conditions' => array('Meal.expense_id' => 'Expense.id'),
'order' => 'Meal.date ASC')
);*/
public function setORMForGroupExpense()
{
$this->bindModel(array('hasMany' => array(
'Participant' => array(
'className' => 'Participant',
'conditions' => array('Participant.expense_id' => 'Expense.id'),
'order' => 'Participant.create_date ASC'
),
'GroupExpense' => array(
'className' => 'GroupExpense',
'conditions' => array('GroupExpense.expense_id' => 'Expense.id'),
'order' => 'GroupExpense.create_date ASC'
)
)));
}
public function setORMForFamilyExpense()
{
$this->bindModel(array('hasMany' => array(
'FamilyExpense' => array(
'className' => 'FamilyExpense',
'conditions' => array('FamilyExpense.expense_id' => 'Expense.id'),
'order' => 'FamilyExpense.create_date ASC'
)
)));
}
public function setORMForMess()
{
$this->bindModel(array('hasMany' => array(
'Participant' => array(
'className' => 'Participant',
'conditions' => array('Participant.expense_id' => 'Expense.id'),
'order' => 'Participant.create_date ASC'
),
'GroupExpense' => array(
'className' => 'GroupExpense',
'conditions' => array('GroupExpense.expense_id' => 'Expense.id'),
'order' => 'GroupExpense.create_date ASC'
),
'Meal' => array(
'className' => 'Meal',
'conditions' => array('Meal.expense_id' => 'Expense.id'),
'order' => 'Meal.date ASC'
)
)));
}
public function getGroupExpenseInfoByURL($unique_url)
{
$expenseType = substr($unique_url, 0, 1);
if ($expenseType == "2" || $expenseType == "7") {
$this->setORMForMess();
} else {
$this->setORMForGroupExpense();
}
$this->unbindModel(
array(
'hasOne' => array('GroupSettings')
)
);
return $this->find('first', array('conditions' => array('BINARY(Expense.unique_url)' => $unique_url)));
}
public function getFamilyExpenseInfoByURL($unique_url)
{
$this->setORMForFamilyExpense();
$this->unbindModel(
array(
'hasOne' => array('GroupSettings')
)
);
return $this->find('first', array('conditions' => array('BINARY(Expense.unique_url)' => $unique_url)));
}
public function participantLengthCheck($check, $limit)
{
$result = true;
$value = trim($check["participants"]);
if ($value != "") {
$valueArray = explode(",", $value);
foreach ($valueArray as $key => $value) {
if (mb_strlen($value, 'UTF-8') > $limit) {
$result = false;
break;
}
}
}
return $result;
}
public function validEmailCheck($check)
{
$result = true;
$value = trim($check["emails"]);
if ($value != "") {
if (filter_var($value, FILTER_VALIDATE_EMAIL) === false) {
$result = false;
}
}
return $result;
}
public function participantDuplicacyCheck($check, $yourName)
{
$result = true;
$value = trim($check["participants"]);
if ($value != "") {
$valueArray = explode(",", $value);
foreach ($valueArray as $key => $value) {
$valueArray[$key] = trim(strtolower($value));
}
$length = count($valueArray);
$unique_array = array_unique($valueArray);
if (count($unique_array) != $length) {
$result = false;
} else {
foreach ($valueArray as $key => $value) {
if (trim(strtolower($value)) == trim(strtolower($this->data["Expense"][$yourName]))) {
$result = false;
break;
}
}
}
}
return $result;
}
function modifyExpense($expenseFormArray)
{
$result = null;
$form["id"] = trim($expenseFormArray["id"]);
$form["title"] = trim($expenseFormArray["title"]);
$form["currency"] = trim($expenseFormArray["currency"]);
$form["description"] = trim($expenseFormArray["description"]);
$form["version"] = trim($expenseFormArray["version"]);
if (isset($expenseFormArray["default_meal"])) {
$form["default_meal"] = trim($expenseFormArray["default_meal"]);
$fileds = array('id', 'title', 'currency', 'description', 'update_date', 'update_user', 'default_meal', 'version');
} else {
$fileds = array('id', 'title', 'currency', 'description', 'update_date', 'update_user', 'version');
}
$form["update_date"] = time();
$form["update_user"] = "system";
$data["Expense"] = $form;
if (!$this->save($data, false, $fileds)) {
$result["22"] = "expense not has been saved successfully";
}
return $result;
}
function createExpense($expenseFormArray, $isRemote, $archieved = false)
{
$result = "";
$form["unique_url"] = "NEW";
$form["title"] = trim($expenseFormArray["title"]);
$form["currency"] = trim($expenseFormArray["currency"]);
$form["description"] = trim($expenseFormArray["description"]);
$form["language"] = $expenseFormArray["language"];
$form["expense_type"] = $expenseFormArray["expense_type"]; // 1 = Group expense
$form["source"] = $expenseFormArray["source"]; //1=web,2=mobile,3=facebook
$form["create_date"] = $expenseFormArray["create_date"]; //
if (!empty($expenseFormArray["create_user"])) {
$form["create_user"] = $expenseFormArray["create_user"];
} else {
$form["create_user"] = "system";
}
$form["update_date"] = time();
$form["update_user"] = "system";
$form["ip"] = $expenseFormArray["ip"];;
$form["user_agent"] = $expenseFormArray["user_agent"];;
//$form["email"] = trim($expenseFormArray["email"]);
$form["version"] = "0";
$form["status"] = "1";
if ($form["expense_type"] == "2") {
$form["default_meal"] = "0.5|1.0|1.0";
} else {
$form["default_meal"] = "";
}
if (!empty($expenseFormArray["user_id"])) {
$form["user_id"] = $expenseFormArray["user_id"];
}
//insert into the table group_expenses
if ($form["expense_type"] == "1" || $form["expense_type"] == "2") {
$fileds = array(
'unique_url',
'title',
'currency',
'description',
'language',
'expense_type',
'source',
'create_user',
'create_date',
'update_date',
'update_user',
'status',
'default_meal',
'ip',
'user_agent',
'version',
'user_id'
);
if ($archieved) {
$fileds[] = 'id';
$form['unique_url'] = $expenseFormArray["unique_url"];
$form['id'] = $expenseFormArray["id"];
}
$data["Expense"] = $form;
if ($this->save($data, false, $fileds)) {
$id = $this->id;
if ($id != "") {
$this->id = $id;
if ($archieved) {
$this->insertParticipantsByRemote($id, $expenseFormArray["participants"]);
$result = $id . "," . $expenseFormArray["unique_url"];
} else {
$unique_url_id = $expenseFormArray["expense_type"] . $this->getUniqueURLById(time()) . $this->getUniqueURLById($id) . trim($expenseFormArray["secret_key"]);
//update group_expenses
if ($this->saveField("unique_url", $unique_url_id)) {
//insert into participant table
if ($isRemote == false) {
$this->insertParticipants($id, $expenseFormArray["your_name"], $expenseFormArray["participants"]);
} else {
$this->insertParticipantsByRemote($id, $expenseFormArray["participants"]);
}
$result = $id . "," . $unique_url_id;
}
}
}
}
}
else if ($form["expense_type"] == "3") {
$fileds = array(
'unique_url',
'title',
'currency',
'description',
'language',
'expense_type',
'source',
'create_user',
'create_date',
'update_date',
'update_user',
'status',
'default_meal',
'ip',
'user_agent',
'version',
'user_id'
);
if ($archieved) {
$fileds[] = 'id';
$form['unique_url'] = $expenseFormArray["unique_url"];
$form['id'] = $expenseFormArray["id"];
}
$data["Expense"] = $form;
if ($this->save($data, false, $fileds)) {
$id = $this->id;
if ($id != "") {
$this->id = $id;
if ($archieved) {
$result = $id . "," . $expenseFormArray["unique_url"];
} else {
$unique_url_id = $expenseFormArray["expense_type"] . $this->getUniqueURLById(time()) . $this->getUniqueURLById($id) . trim($expenseFormArray["secret_key"]);
//update group_expenses
if ($this->saveField("unique_url", $unique_url_id)) {
//insert into participant table
//if($isRemote == false){
//$this->insertParticipants($id, $expenseFormArray["your_name"],$expenseFormArray["participants"]);
$result = $id . "," . $unique_url_id;
//} else {
//$this->insertParticipantsByRemote($id,$expenseFormArray["participants"]);
//$result = $id.",".$unique_url_id;
//}
}
}
}
}
}
return $result;
}
/* function updateExpense($expenseFormArray){
$result = "";
$form["id"] =$expenseFormArray["id"];
$form["title"] = $expenseFormArray["title"];
$form["currency"] = $expenseFormArray["currency"];
$form["description"] = $expenseFormArray["description"];
$form["language"] = $expenseFormArray["language"];
$form["is_secret"] = $expenseFormArray["is_secret"];
$form["secret_key"] = $expenseFormArray["secret_key"];
$form["update_date"] = time();
$form["update_user"] = "system";
$form["version"] = $expenseFormArray["version"];
$fileds = array('title','currency','description',
'language','is_secret','secret_key','update_date','update_user');
$data["Expense"] = $form;
//update few fields of group_expenses table
if($this->save($data,false,$fileds)){
$result = 1;
}
return $result;
} */
function insertParticipants($id, $creator_name, $participants)
{
$data = array();
$form["Participant"][0]["participant_id"] = "1" . "_" . "0";
$form["Participant"][0]["expense_id"] = $id;
$form["Participant"][0]["name"] = $creator_name;
$form["Participant"][0]["is_creator"] = 1;
$i = 1;
if ($participants != "") {
$participant_array = explode(",", $participants);
foreach ($participant_array as $single_participant) {
if ($single_participant != "") {
$form["Participant"][$i]["participant_id"] = "1" . "_" . $i;
$form["Participant"][$i]["expense_id"] = $id;
$form["Participant"][$i]["name"] = $single_participant;
$form["Participant"][$i]["is_creator"] = 0;
$i = $i + 1;
}
}
}
App::import('model', 'Participant');
$participant = new Participant();
$participant->saveMany($form["Participant"]);
}
function insertParticipantsByRemote($id, $participantList)
{
$i = 0;
foreach ($participantList as $key => $value) {
$form["Participant"][$i]["participant_id"] = $value["participant_id"];
$form["Participant"][$i]["expense_id"] = $id;
$form["Participant"][$i]["name"] = $value["name"];
$form["Participant"][$i]["is_creator"] = $value["is_creator"];
$i = $i + 1;
}
App::import('model', 'Participant');
$participant = new Participant();
$participant->saveMany($form["Participant"]);
}
function findExpenseInfoByIds($expenseIdList)
{
$data = NULL;
if (!empty($expenseIdList) && count($expenseIdList) > 0) {
$str = implode(",", $expenseIdList);
$this->hasMany = array();
$result = $this->find('all', array(
'conditions' => array(
'Expense.id in (' . $str . ')'
),
'order' => 'Expense.create_date DESC'
));
if (!empty($result)) {
$data["expenseList"] = $result;
App::import('model', 'Participant');
$participant = new Participant();
$participantInfo = $participant->find('all', array('conditions' => array(
'Participant.expense_id in (' . $str . ') ',
'is_creator' => '1'
)));
$data["participantList"] = $participantInfo;
}
}
// $log = $this->getDataSource()->getLog(false, false);
// debug($log);
return $data;
}
function getUniqueURLById($in, $to_num = false, $pad_up = false)
{
$index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$base = strlen($index);
if ($to_num) {
// Digital number <<-- alphabet letter code
$in = strrev($in);
$out = 0;
$len = strlen($in) - 1;
for ($t = 0; $t <= $len; $t++) {
$bcpow = bcpow($base, $len - $t);
$out = $out + strpos($index, substr($in, $t, 1)) * $bcpow;
}
if (is_numeric($pad_up)) {
$pad_up--;
if ($pad_up > 0) {
$out -= pow($base, $pad_up);
}
}
} else {
// Digital number -->> alphabet letter code
if (is_numeric($pad_up)) {
$pad_up--;
if ($pad_up > 0) {
$in += pow($base, $pad_up);
}
}
$out = "";
for ($t = floor(log10($in) / log10($base)); $t >= 0; $t--) {
$a = floor($in / bcpow($base, $t));
$out = $out . substr($index, $a, 1);
$in = $in - ($a * bcpow($base, $t));
}
$out = strrev($out); // reverse
}
return $out;
}
}