This commit is contained in:
mikael-zakaria 2025-11-05 15:04:49 +07:00
commit c3189e45ff
11 changed files with 210 additions and 55 deletions

View File

@ -95,6 +95,18 @@ $routes->patch('/api/containerdef', 'Specimen\ContainerDef::update');
$routes->delete('/api/containerdef', 'Specimen\ContainerDef::delete');
//organization
// account
$routes->get('/api/organization/account/', 'Organization\Account::index');
$routes->get('/api/organization/account/(:num)', 'Organization\Account::show/$1');
$routes->post('/api/organization/account', 'Organization\Account::create');
$routes->patch('/api/organization/account', 'Organization\Account::update');
$routes->delete('/api/organization/account', 'Organization\Account::delete');
// site
$routes->get('/api/organization/site/', 'Organization\Site::index');
$routes->get('/api/organization/site/(:num)', 'Organization\Site::show/$1');
$routes->post('/api/organization/site', 'Organization\Site::create');
$routes->patch('/api/organization/site', 'Organization\Site::update');
$routes->delete('/api/organization/site', 'Organization\Site::delete');
// discipline
$routes->get('/api/organization/discipline/', 'Organization\Discipline::index');
$routes->get('/api/organization/discipline/(:num)', 'Organization\Discipline::show/$1');
@ -113,12 +125,6 @@ $routes->get('/api/organization/workstation/(:num)', 'Organization\Workstation::
$routes->post('/api/organization/workstation', 'Organization\Workstation::create');
$routes->patch('/api/organization/workstation', 'Organization\Workstation::update');
$routes->delete('/api/organization/workstation', 'Organization\Workstation::delete');
// workbench
$routes->get('/api/organization/workbench/', 'Organization\Workbench::index');
$routes->get('/api/organization/workbench/(:num)', 'Organization\Workbench::show/$1');
$routes->post('/api/organization/workbench', 'Organization\Workbench::create');
$routes->patch('/api/organization/workbench', 'Organization\Workbench::update');
$routes->delete('/api/organization/workbench', 'Organization\Workbench::delete');
// Khusus
$routes->get('/api/zones', 'Zones::index');

View File

@ -0,0 +1,75 @@
<?php
namespace App\Controllers\Organization;
use CodeIgniter\API\ResponseTrait;
use App\Controllers\BaseController;
use App\Models\Organization\AccountModel;
class Account extends BaseController {
use ResponseTrait;
protected $db;
protected $model;
public function __construct() {
$this->db = \Config\Database::connect();
$this->model = new AccountModel();
}
public function index() {
//$rows = $this->model->findAll();
$rows = $this->model->getAccounts();
if (empty($rows)) {
return $this->respond([ 'status' => 'success', 'message' => "no Data.", 'data' => [] ], 200);
}
return $this->respond([ 'status' => 'success', 'message'=> "fetch success", 'data' => $rows ], 200);
}
public function show($AccountID = null) {
//$rows = $this->model->where('AccountID', $AccountID)->findAll();
$rows = $this->model->getAccount($AccountID);
if (empty($rows)) {
return $this->respond([ 'status' => 'success', 'message' => "no Data.", 'data' => [] ], 200);
}
return $this->respond([ 'status' => 'success', 'message'=> "fetch success", 'data' => $rows ], 200);
}
public function delete() {
try {
$input = $this->request->getJSON(true);
$id = $input["AccountID"];
if (!$id) { return $this->failValidationErrors('ID is required.'); }
$this->model->delete($id);
return $this->respondDeleted([ 'status' => 'success', 'message' => "{$id} deleted successfully."]);
} catch (\Throwable $e) {
return $this->failServerError('Something went wrong: ' . $e->getMessage());
}
}
public function create() {
$input = $this->request->getJSON(true);
try {
$id = $this->model->insert($input,true);
return $this->respondCreated([ 'status' => 'success', 'message' => 'data created successfully', 'data' => $id ], 201);
} catch (\Throwable $e) {
return $this->failServerError('Something went wrong: ' . $e->getMessage());
}
}
public function update() {
$input = $this->request->getJSON(true);
try {
$id = $input['AccountID'];
if (!$id) { return $this->failValidationErrors('ID is required.'); }
$this->model->update($id, $input);
return $this->respondCreated([ 'status' => 'success', 'message' => 'data updated successfully', 'data' => $id ], 201);
} catch (\Throwable $e) {
return $this->failServerError('Something went wrong: ' . $e->getMessage());
}
}
}

View File

@ -4,9 +4,9 @@ namespace App\Controllers\Organization;
use CodeIgniter\API\ResponseTrait;
use App\Controllers\BaseController;
use App\Models\Organization\WorkbenchModel;
use App\Models\Organization\SiteModel;
class Workbench extends BaseController {
class Site extends BaseController {
use ResponseTrait;
protected $db;
@ -14,7 +14,7 @@ class Workbench extends BaseController {
public function __construct() {
$this->db = \Config\Database::connect();
$this->model = new WorkbenchModel();
$this->model = new SiteModel();
}
public function index() {
@ -27,8 +27,8 @@ class Workbench extends BaseController {
return $this->respond([ 'status' => 'success', 'message'=> "fetch success", 'data' => $rows ], 200);
}
public function show($WorkbenchID = null) {
$rows = $this->model->where('WorkbenchID', $WorkbenchID)->findAll();
public function show($SiteID = null) {
$rows = $this->model->where('SiteID', $SiteID)->findAll();
if (empty($rows)) {
return $this->respond([ 'status' => 'success', 'message' => "no Data.", 'data' => [] ], 200);
@ -40,7 +40,7 @@ class Workbench extends BaseController {
public function delete() {
try {
$input = $this->request->getJSON(true);
$id = $input["WorkbenchID"];
$id = $input["SiteID"];
if (!$id) { return $this->failValidationErrors('ID is required.'); }
$this->model->delete($id);
return $this->respondDeleted([ 'status' => 'success', 'message' => "{$id} deleted successfully."]);
@ -62,7 +62,8 @@ class Workbench extends BaseController {
public function update() {
$input = $this->request->getJSON(true);
try {
$id = $input['WorkbenchID'];
$id = $input['SiteID'];
if (!$id) { return $this->failValidationErrors('ID is required.'); }
$this->model->update($id, $input);
return $this->respondCreated([ 'status' => 'success', 'message' => 'data updated successfully', 'data' => $id ], 201);
} catch (\Throwable $e) {

View File

@ -50,12 +50,16 @@ class Zones extends BaseController {
}
public function synchronize() {
$client = \Config\Services::curlrequest();
$client = \Config\Services::curlrequest([
'headers' => [
'User-Agent' => 'Mozilla/5.0 (CI4 cURL Request)',
'Accept' => 'application/json',
],
]);
try {
// Ambil data dari API pusat (CRM)
$response = $client->get('http://services-summit.my.id/api/zones');
// $response = $client->get('http://crmcomposer.local/api/zones');
$response = $client->get('https://services-summit.my.id/api/zones');
$result = json_decode($response->getBody(), true);
if (!isset($result['data']) || !is_array($result['data'])) {

View File

@ -8,30 +8,46 @@ class CreateCRMOrgTable extends Migration {
public function up() {
$this->forge->addField([
'accountid' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true],
'parrentaccount' => ['type' => 'INT', 'null' => true],
'accountname' => ['type' => 'VARCHAR', 'constraint' => 10, 'null' => false],
'accountnpwp' => ['type' => 'VARCHAR', 'constraint' => 5, 'null' => false],
'inital' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => false],
'street_1' => ['type' => 'VARCHAR', 'constraint' => 150, 'null' => true],
'street_2' => ['type' => 'VARCHAR', 'constraint' => 150, 'null' => true],
'street_3' => ['type' => 'VARCHAR', 'constraint' => 150, 'null' => true],
'zoneid' => ['type' => 'int', 'null' => true],
'zip' => ['type' => 'VARCHAR', 'constraint' => 10, 'null' => true],
'country' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'email_1' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'email_2' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'phone' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'fax' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'createdate' => ['type' => 'datetime', 'null'=> true],
'enddate' => ['type' => 'datetime', 'null'=> true]
'AccountID' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true],
'Parent' => ['type' => 'INT', 'null' => true],
'AccountName' => ['type' => 'VARCHAR', 'constraint' => 10, 'null' => false],
'Initial' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => false],
'Street_1' => ['type' => 'VARCHAR', 'constraint' => 150, 'null' => true],
'Street_2' => ['type' => 'VARCHAR', 'constraint' => 150, 'null' => true],
'Street_3' => ['type' => 'VARCHAR', 'constraint' => 150, 'null' => true],
'City' => ['type' => 'varchar', 'constraint' => 150, 'null' => true],
'Province' => ['type' => 'varchar', 'constraint' => 150, 'null' => true],
'ZIP' => ['type' => 'VARCHAR', 'constraint' => 10, 'null' => true],
'Country' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'AreaCode' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'EmailAddress1' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'EmailAddress2' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'Phone' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'Fax' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'CreateDate' => ['type' => 'datetime', 'null'=> true],
'EndDate' => ['type' => 'datetime', 'null'=> true]
]);
$this->forge->addKey('AccountID', true);
$this->forge->createTable('account');
$this->forge->addKey('accountid', true);
$this->forge->createTable('accounts');
$this->forge->addField([
'SiteID' => ['type' => 'INT', 'unsigned' => true, 'auto_increment' => true],
'SiteCode' => ['type' => 'VARCHAR', 'constraint' => 10, 'null' => false],
'SiteName' => ['type' => 'VARCHAR', 'constraint' => 100, 'null' => false],
'AccountID' => ['type' => 'int', 'null' => true],
'SiteTypeID' => ['type' => 'int', 'null' => true],
'Parent' => ['type' => 'int', 'null' => true],
'SiteClassID' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'ME' => ['type' => 'VARCHAR', 'constraint' => 50, 'null' => true],
'CreateDate' => ['type' => 'datetime', 'null'=> true],
'EndDate' => ['type' => 'datetime', 'null'=> true]
]);
$this->forge->addKey('SiteID', true);
$this->forge->createTable('site');
}
public function down() {
$this->forge->dropTable('accounts');
$this->forge->dropTable('sites');
}
}

View File

@ -36,29 +36,17 @@ class Organization extends Migration {
'Type' => ['type' => 'tinyint', 'null'=> true],
'LinkTo' => ['type' => 'int', 'null'=> true],
'Enable' => ['type' => 'bit', 'null'=> true],
'EquipmentID' => ['type' => 'varchar', 'constraint'=>'10', 'null'=> true],
'CreateDate' => ['type'=>'DATETIME', 'null' => true],
'EndDate' => ['type'=>'DATETIME', 'null' => true]
]);
$this->forge->addKey('WorkstationID', true);
$this->forge->createTable('workstation');
$this->forge->addField([
'WorkbenchID' => ['type' => 'int', 'unsigned' => true, 'auto_increment'=> true],
'DepartmentID' => ['type' => 'int', 'null'=> false],
'WorkbenchCode' => ['type' => 'varchar', 'constraint'=>10, 'null'=> false],
'WorkbenchName' => ['type' => 'varchar', 'constraint'=> 150, 'null'=> true],
'CreateDate' => ['type'=>'DATETIME', 'null' => true],
'EndDate' => ['type'=>'DATETIME', 'null' => true]
]);
$this->forge->addKey('WorkbenchID', true);
$this->forge->createTable('workbench');
}
public function down() {
$this->forge->dropTable('discipline', true);
$this->forge->dropTable('department', true);
$this->forge->dropTable('workstation', true);
$this->forge->dropTable('workbench', true);
}
}

View File

@ -94,5 +94,32 @@ class DummySeeder extends Seeder {
['ConCode' => '900','ConName' => 'Packing Pengiriman', 'ConDesc' =>'Specimen Transport Packaging', 'Additive' => "71", 'ConClass' => '81', 'CreateDate'=> "$now"],
];
$this->db->table('containerdef')->insertBatch($data);
// Organization
$data = [
[ 'AccountID' => 1, 'Parent' => null, 'AccountName' => 'Dummy Account', 'Initial'=>'QAC', 'Street_1'=>'Dummy Address', 'City'=>'Siti', 'Province'=>'Prop',
'ZIP'=>'505', 'Country'=>'Arab', 'AreaCode'=>'', 'EmailAddress1'=>'dummy@summit.co.id', 'Phone'=>'092029', 'Fax'=>'092029', 'CreateDate' => "$now" ]
];
$this->db->table('account')->insertBatch($data);
$data = [
[ 'SiteID' => 1, 'SiteCode' => 'QSIT', 'SiteName' => 'Dummy Site', 'AccountID'=>1, 'SiteTypeID'=>null, 'Parent'=>null, 'SiteClassID'=>null, 'ME'=>null, 'CreateDate' => "$now" ]
];
$this->db->table('site')->insertBatch($data);
$data = [
[ 'DisciplineID' => 1, 'DisciplineCode' => 'QDIS', 'DisciplineName' => 'Dummy Discipline', 'CreateDate' => "$now" ],
];
$this->db->table('discipline')->insertBatch($data);
$data = [
[ 'DepartmentID' => 1, 'DisciplineID' => 1, 'SiteID' => 1, 'DepartmentCode'=> 'QDEP', 'DepartmentName'=>'Dummy Department', 'CreateDate' => "$now" ],
];
$this->db->table('department')->insertBatch($data);
$data = [
[ 'WorkstationID' => 1, 'DepartmentID' => 1, 'WorkstationCode' => 'QWST', 'WorkstationName'=>'Dummy Workstation', 'Type'=>null, 'LinkTo'=> null, 'Enable'=>1,'CreateDate' => "$now" ],
];
$this->db->table('workstation')->insertBatch($data);
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace App\Models\Organization;
use App\Models\BaseModel;
class AccountModel extends BaseModel {
protected $table = 'account';
protected $primaryKey = 'AccountID';
protected $allowedFields = ['Parent', 'AccountName', 'Initial', 'Street_1', 'Street_2', 'Street_3',
'City', 'Province', 'ZIP', 'Country', 'AreaCode', 'EmailAddress1', 'EmailAddress2',
'Phone', 'Fax', 'CreateDate', 'EndDate'];
protected $useTimestamps = true;
protected $createdField = 'CreateDate';
protected $updatedField = '';
protected $useSoftDeletes = true;
protected $deletedField = 'EndDate';
public function getAccounts() {
$rows = $this->select('account.*, pa.AccountName as ParentName, zones.ZoneName as AreaName')
->join('account pa', 'pa.AccountID=account.Parent', 'left')
->join('zones', 'zones.zonecode=account.AreaCode', 'left')
->findAll();
return $rows;
}
public function getAccount($AccountID) {
$rows = $this->select('account.*, pa.AccountName as ParentName, zones.ZoneName as AreaName, city.ZoneName as CityName, prov.ZoneName as ProvName, country.VValue as CountryName')
->join('account pa', 'pa.AccountID=account.Parent', 'left')
->join('zones', 'zones.zonecode=account.AreaCode', 'left')
->join('zones city', 'city.zoneid=account.City', 'left')
->join('zones prov', 'prov.zoneid=account.Province', 'left')
->join('valueset country', 'country.VID=account.Country', 'left')
->where('account.AccountID', $AccountID)
->findAll();
return $rows;
}
}

View File

@ -2,10 +2,11 @@
namespace App\Models\Organization;
use App\Models\BaseModel;
class WorkbenchModel extends BaseModel {
protected $table = 'workbench';
protected $primaryKey = 'WorkbenchID';
protected $allowedFields = ['DepartmentID', 'WorkbenchCode', 'WorkbenchName', 'EndDate'];
class SiteModel extends BaseModel {
protected $table = 'site';
protected $primaryKey = 'SiteID';
protected $allowedFields = ['SiteCode', 'SiteName', 'AccountID', 'SiteTypeID', 'Parent', 'SiteClassID', 'ME',
'CreateDate', 'EndDate'];
protected $useTimestamps = true;
protected $createdField = 'CreateDate';