Files
2026-04-15 15:24:53 +07:00

645 lines
18 KiB
PHP

<?php
require FCPATH . "vendor/ripcord/ripcord.php";
require FCPATH . "vendor/ripcord/ripcord_client.php";
class Odoo extends MY_Controller
{
var $db_odoo, $url, $username, $uid, $model, $password, $common;
function __construct()
{
parent::__construct();
$this->url = "https://odoo.sismedika.online";
$this->db_odoo = "odoo16_sismedika";
$this->username = "admin@sismedika.com";
$this->password = "duD#Z36qH5ctmRRD";
$this->common = ripcord::client("{$this->url}/xmlrpc/2/common");
$this->uid = $this->common->authenticate($this->db_odoo, $this->username, $this->password, array());
$this->model = ripcord::client("{$this->url}/xmlrpc/2/object");
$this->db->query("use one_support");
}
function update_task($client_id = 2)
{
//last 60 days
$sql = "select TicketingID,TicketingDescription,TicketingCreated,TicketingNumber
from one_support.ticketing
where TicketingClientID = ?
and TicketingCreated + interval 7 day > now()
and (
TicketingOdooTaskID = 0
or
TicketingDoneDate is null
)
";
$qry = $this->db->query($sql, [$client_id]);
if (!$qry) {
print_r($this->db->error());
}
$rows = $qry->result_array();
foreach ($rows as $r) {
$no = $r["TicketingNumber"];
$id = $r["TicketingID"];
$desc = $r["TicketingDescription"];
$taskDate = $r["TicketingCreated"];
$taskID = $this->task_by_tag($no);
echo "Get Odoo TaskID $taskDate : $no => $taskID\n";
// echo "\t$desc\n";
if ($taskID > 0) {
$sql = "update one_support.ticketing
set TicketingOdooTaskID = ?
where TicketingID = ?";
}
list($date, $staff) = $this->get_done($taskID);
echo "\tDone by $staff at $date\n";
if ($date != "") {
$sql = "update one_support.ticketing
set TicketingOdooTaskID = ?
, TicketingDoneDate = ?,
TicketingDoneStaff=?
where TicketingID = ?";
$qry = $this->db->query($sql, [
$taskID,
$date, $staff, $id
]);
} else {
$qry = $this->db->query($sql, [
$taskID,
$id
]);
}
if (!$qry) {
echo "\tERR : " . print_r($this->db->error()) . "\n";
}
sleep(1);
$date = "";
$staff = "";
}
}
function task_by_tag($tag, $project_id = 123)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, "http://odoo.sismedika.online/web/dataset/call_kw/project.task/web_search_read");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"Cookie: frontend_lang=en_us; td_id=669b47846b8437b163a9c8d43a16c42cae2bc609; session_id=e1c224f95431fc75271cf484260586408c0757d4; cids=1; tz=asia/jakarta",
"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
]);
$param = [
"jsonrpc" => "2.0",
"method" => "call",
"params" => [
"model" => "project.task",
"method" => "web_search_read",
"args" => [],
"kwargs" => [
"limit" => 80,
"offset" => 0,
"order" => "",
"context" => [
"lang" => "en_US",
"tz" => "Asia/Jakarta",
"uid" => 39,
// "allowed_company_ids" => [
// 1
// ],
"bin_size" => true,
"active_model" => "project.project",
"active_id" => $project_id,
"active_ids" => [
$project_id
],
"default_project_id" => $project_id,
"show_project_update" => true,
"create" => true,
"active_test" => true
],
"count_limit" => 81,
"domain" => [
"&",
[
"display_project_id",
"=",
$project_id
],
"|",
[
"name",
"ilike",
"$tag"
],
[
"id",
"ilike",
"$tag"
]
],
"fields" => [
"name",
"project_id",
"tag_ids"
]
]
]
];
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($param));
$response = curl_exec($ch);
$taskID = 0;
if (curl_errno($ch)) {
echo json_encode(["status" => "ERR", "message" => curl_error($ch)]);
} else {
$resp = json_decode($response, true);
if ($resp["result"]["length"] > 0) {
$taskID = $resp["result"]["records"][0]["id"];
}
}
curl_close($ch);
return $taskID;
}
function get_done($task_id)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, "http://odoo.sismedika.online/mail/thread/messages");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"Cookie: frontend_lang=en_us; td_id=669b47846b8437b163a9c8d43a16c42cae2bc609; session_id=e1c224f95431fc75271cf484260586408c0757d4; cids=1; tz=asia/jakarta",
"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
]);
$data = [
"jsonrpc" => "2.0",
"method" => "call",
"params" => [
"thread_id" => $task_id,
"thread_model" => "project.task",
"limit" => 30
]
];
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) {
return ["", ""];
echo json_encode(["status" => "ERR", "message" => curl_error($ch)]);
} else {
$resp = json_decode($response, true);
$date = "";
$staff = "";
foreach ($resp["result"] as $r) {
foreach ($r["trackingValues"] as $t) {
if ($t["changedField"] == "Stage") {
if ($t["newValue"]["value"] == "IMPLEMENTATION") {
$date = $r["date"];
$staff = $r["email_from"];
break;
}
}
if ($date != "") break;
}
}
if ($date != "") {
// echo json_encode(["status" => "OK", "date" => $date, "by" => $staff]);
return [$date, $staff];
exit;
}
return ["", ""];
echo $response;
}
curl_close($ch);
}
function test_implementation($project_id = 70)
{
$sdate = "2024-07-03 00:00:00";
$edate = "2024-07-03 23:59:59";
$arg = array();
$kwarg = array(
"limit" => 10,
"offset" => 0,
"order" => "",
"count_limit" => 11,
"fields" => [
"id",
"name",
"description",
],
//"domain"=>[["stage_id","ilike","implementation"]]
// "domain"
);
$resp = $this->model->execute_kw(
$this->db_odoo,
$this->uid,
$this->password,
"project.task",
"web_search_read",
array(array(
"&",
["display_project_id", "=", $project_id],
"&",
["date_last_stage_update", ">=", $sdate],
"&",
["date_last_stage_update", "<=", $edate],
["stage_id", "ilike", "implementation"]
)),
$kwarg
);
echo "$sdate : $edate\n";
print_r($resp);
}
function get_implementation_v2($project_id = 70, $stage = "", $date = "")
{
if ($date == "") $date = date("Y-m-d");
$sdate = $date . " 00:00:00";
$edate = $date . " 23:59:59";
if ($stage == "") $date = "x";
if ($date == "x") {
$sdate = "2024-01-01 00:00:00";
$edate = "2024-08-07 23:59:59";
}
$arg = array();
$kwarg = array(
"limit" => 10,
"offset" => 0,
"order" => "",
"count_limit" => 11,
"fields" => [
"id",
"name",
"description",
],
//"domain"=>[["stage_id","ilike","implementation"]]
// "domain"
);
if ($stage == "") {
echo "$sdate | $edate | $project_id\n";
$resp = $this->model->execute_kw(
$this->db_odoo,
$this->uid,
$this->password,
"project.task",
"web_search_read",
array(array(
"&",
["display_project_id", "=", intval($project_id)],
"&",
["date_last_stage_update", ">=", $sdate],
["date_last_stage_update", "<=", $edate]
)),
$kwarg
);
} else {
$resp = $this->model->execute_kw(
$this->db_odoo,
$this->uid,
$this->password,
"project.task",
"web_search_read",
array(array(
"&",
["display_project_id", "=", intval($project_id)],
"&",
["date_last_stage_update", ">=", $sdate],
"&",
["date_last_stage_update", "<=", $edate],
["stage_id", "ilike", $stage]
)),
$kwarg
);
}
print_r($resp);
exit;
$arr_ticket = [];
if (isset($resp["records"])) {
foreach ($resp["records"] as $r) {
$desc = $r["description"];
$name = $r["name"];
$id = $r["id"];
$tiket = "";
if (preg_match("/ No. Tiket : <b>(.+)<\/b><br> Cabang/", $desc, $match)) {
$tiket = $match[1];
if (in_array($tiket, $arr_ticket)) {
echo date("Y-m-d H:i:s") . " Ticket # $tiket duplicate \n";
continue;
}
$arr_ticket[] = $tiket;
}
if ($tiket != "") {
$rec = $this->get_ticketing($tiket);
if ($rec["TicketingStatus"] != "IMPLEMENTATION") {
$ticketID = $rec["TicketingID"];
$sender = $rec["TicketingSender"];
$cabang = $rec["M_BranchName"];
$hasil = "";
if (preg_match("/(Hasil.*:.+)/", $desc, $match)) {
$hasil = strip_tags($match[1]);
$hasil = str_replace("&nbsp;", "", $hasil);
}
$impl_msg = "
Pengirim : $sender
No. Tiket : $tiket
Issue : $name
Cabang : $cabang
Status : Selesai
$hasil
Silahkan di cek kembali
Terima Kasih\n";
echo date("Y-m-d H:i:s") . " Done Ticket # $tiket from $sender \n";
$this->wa_to_sasone_done($impl_msg, $project_id);
$this->update_ticketing($ticketID, "IMPLEMENTATION", $ticketID);
sleep(2);
}
}
}
}
}
function get_implementation($project_id = 70, $date = "")
{
if ($date == "" || $date = "-") $date = date("Y-m-d");
$sdate = $date . " 00:00:00";
$edate = $date . " 23:59:59";
$arg = array();
$project_id = intval($project_id);
$kwarg = array(
"limit" => 10,
"offset" => 0,
"order" => "",
"count_limit" => 11,
"fields" => [
"id",
"name",
"description",
],
//"domain"=>[["stage_id","ilike","implementation"]]
// "domain"
);
$resp = $this->model->execute_kw(
$this->db_odoo,
$this->uid,
$this->password,
"project.task",
"web_search_read",
array(array(
"&",
["display_project_id", "=", $project_id],
"&",
["date_last_stage_update", ">=", $sdate],
"&",
["date_last_stage_update", "<=", $edate],
["stage_id", "ilike", "implementation"]
)),
$kwarg
);
$arr_ticket = [];
if (isset($resp["records"])) {
foreach ($resp["records"] as $r) {
$desc = $r["description"];
$name = $r["name"];
$id = $r["id"];
$tiket = "";
if (preg_match("/ No. Tiket : <b>(.+)<\/b><br> Cabang/", $desc, $match)) {
$tiket = $match[1];
if (in_array($tiket, $arr_ticket)) {
echo date("Y-m-d H:i:s") . " Ticket # $tiket duplicate \n";
continue;
}
$arr_ticket[] = $tiket;
}
if ($tiket != "") {
$rec = $this->get_ticketing($tiket);
if ($rec["TicketingStatus"] != "IMPLEMENTATION") {
$ticketID = $rec["TicketingID"];
$sender = $rec["TicketingSender"];
$cabang = $rec["M_BranchName"];
$hasil = "";
if (preg_match("/(Hasil.*:.+)/", $desc, $match)) {
$hasil = strip_tags($match[1]);
$hasil = str_replace("&nbsp;", "", $hasil);
}
$impl_msg = "
Pengirim : $sender
No. Tiket : $tiket
Issue : $name
Cabang : $cabang
Status : Selesai
$hasil
Silahkan di cek kembali
Terima Kasih\n";
echo date("Y-m-d H:i:s") . " Done Ticket # $tiket from $sender \n";
$this->wa_to_sasone_done($impl_msg, $project_id);
$this->update_ticketing($ticketID, "IMPLEMENTATION", $ticketID);
sleep(2);
}
}
}
}
}
function get_message($taskID)
{
$arg = [
"thread_id" => $taskID,
"thread_model" => "project_task",
"limit" => 30
];
$resp = $this->model->execute_kw(
$this->db_odoo,
$this->uid,
$this->password,
"mail.thread",
"read",
array($arg)
);
print_r($resp);
}
function wa_to_sasone_done(
$msg,
$project_id = 70
) {
$this->load->library("Wa_sas");
//$hp = "6287823783747";
//$hp="6282113702602-1584412485@g.us";
//bisone supporter
$hp = "6281328282909-1583223560@g.us";
if ($project_id != 70) {
//sasone
//6282113702602-1584412485
$hp = "6282113702602-1584412485@g.us";
if ($project_id == 123) {
//hore
$hp = "120363280846797029@g.us";
}
}
$resp = $this->wa_sas->send_message($hp, $msg, true);
// print_r($resp);
}
function update_ticketing($ticketID, $status, $taskID)
{
$sql = "update ticketing set TicketingStatus = ?,
TicketingOdooTaskID=?
where ticketingID = ?";
$qry = $this->db->query($sql, [$status, $taskID, $taskID]);
if (!$qry) {
echo "Error update ticketing $ticketID\n";
exit;
}
echo $this->db->last_query() . "\n";
}
function get_ticketing($tiket)
{
$sql = "select TicketingID,TicketingStatus ,
M_BranchName, TicketingSender
from
ticketing
join m_branch on TicketingM_BranchCode = M_BranchCode
and TicketingNumber = ?
";
$qry = $this->db->query($sql, [$tiket]);
if (!$qry) {
echo "Error get ticketing $tiket\n";
exit;
}
$rows = $qry->result_array();
if (count($rows) == 0) {
echo "Error get ticketing $tiket\n";
exit;
}
return $rows[0];
}
function create_ts()
{
$prm = $this->sys_input;
$date = $prm["date"];
$time = $prm["time"];
$employee_id = $prm["employee_id"];
$task_id = $prm["task_id"];
$project_id = $prm["project_id"];
$description = $prm["description"];
$arg = array(
"name" => $description,
"date" => $date,
"unit_amount" => $time,
"user_id" => $this->uid,
"task_id" => $task_id,
"project_id" => $project_id,
"employee_id" => $employee_id
);
$resp = $this->model->execute_kw(
$this->db_odoo,
$this->uid,
$this->password,
"account.analytic.line",
"create",
array($arg)
);
print_r($resp);
if (!is_numeric($resp)) {
echo json_encode(["status" => "ERR", "message" => json_encode($resp)]);
} else {
echo json_encode(
[
"status" => "OK",
"ts_id" => $resp
]
);
}
}
function create_task()
{
$prm = $this->sys_input;
$title = $prm["title"];
$description = $prm["description"];
$project_id = $prm["project_id"];
if ($project_id == "") $project_id = 70;
$images = $prm["images"];
if (is_array($images)) {
foreach ($images as $img) {
$description .= "<br/>" .
"<img class=\"img-fluid\" src=\"$img\">";
}
}
$users = $prm["users"];
if ($users == "") {
$users = [
44,
41,
42
];
}
$arg = array(
"sun" => $this->bool_day("sun"),
"mon" => $this->bool_day("mon"),
"tue" => $this->bool_day("tue"),
"wed" => $this->bool_day("wed"),
"thu" => $this->bool_day("thu"),
"fri" => $this->bool_day("fri"),
"sat" => $this->bool_day("sat"),
"recurrence_id" => false,
"parent_id" => false,
"company_id" => 1,
"stage_id" => 443,
"personal_stage_type_id" => false,
"recurrence_update" => "this",
"priority" => "0",
"name" => "$title",
"kanban_state" => "normal",
"project_id" => $project_id,
"display_project_id" => false,
"milestone_id" => false,
"user_ids" => [
[
6,
false,
$users
]
],
"active" => true,
"partner_id" => false,
"partner_phone" => false,
"date_deadline" => false,
"tag_ids" => [
[
6,
false,
[]
]
],
"task_properties" => [],
"description" => $description,
"planned_hours" => 0,
"timesheet_ids" => [],
"child_ids" => [],
);
$resp = $this->model->execute_kw(
$this->db_odoo,
$this->uid,
$this->password,
"project.task",
"create",
array($arg)
);
if (!is_numeric($resp)) {
echo json_encode(["status" => "ERR", "message" => json_encode($resp)]);
} else {
echo json_encode(
[
"status" => "OK",
"task_id" => $resp
]
);
}
}
function bool_day($inp_dow)
{
$dow = strtolower(date("D", strtotime("now")));
if ($inp_dow == $dow) return true;
return false;
}
}