Commit 9785f0e1 authored by Sarun Mungthanya's avatar Sarun Mungthanya
Browse files

Merge remote-tracking branch 'origin/manual-response' into sprint1

parents 6ba75bf3 6f9687de
<?php
namespace App\Http\Controllers\ManualResponse;
use App\Http\Controllers\Controller;
use App\Models\ManualResponse\MasterResponseTemplates;
use App\Models\ManualResponse\DeclarationRunning;
use Illuminate\Support\Facades\DB;
use SimpleXMLElement;
use DOMDocument;
use Carbon\Carbon;
class GenXmlController extends Controller
{
public function generateXML($templateId, $documentType, $lockData)
{
$template = MasterResponseTemplates::join('mr_master_messages as mm', 'mr_master_response_templates.mid', '=', 'mm.id')
->select('mm.name as messageName', 'mr_master_response_templates.id as templateId', 'mr_master_response_templates.template')
->where('mr_master_response_templates.id', $templateId)
->first();
if (empty($template)) {
return null;
}
$json = json_decode($template['template'], true);
if($json != null){
return $this->genXmlFromTemplate($json, $documentType, $lockData);
}
}
private function genXmlFromTemplate($json, $documentType = '0', $lockData = true, $xml = null, &$xmlData = [])
{
if ($xml === null) {
$rootElement = $json['root'];
$namespace = $json['namespace'];
unset($json['root'], $json['namespace']);
if($namespace !== ''){
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"UTF-8\"?><$rootElement xmlns=\"$namespace\"></$rootElement>");
}else{
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"UTF-8\"?><$rootElement></$rootElement>");
}
}
foreach ($json as $key => $value) {
if (is_array($value)) {
if (is_numeric($key)) {
$key = 'item' . $key; // dealing with <0/>..<n/> issues
}
$new_object = $xml->addChild($key);
$this->genXmlFromTemplate($value, $documentType, $lockData, $new_object, $xmlData); // Pass by reference
} else {
if (is_numeric($key)) {
$key = 'item' . $key; // dealing with <0/>..<n/> issues
}
if (empty($value)) {
if(!$lockData && in_array($key, ['DeclarationNumber', 'DocumentNumber']) && $documentType !== null){
$value = $this->generateDeclarationNo($documentType);
}else if(!$lockData && $key == 'GoodsTransitionNumber'){
$value = $this->generateGCLNo();
}
if(in_array($key, ['AuditDateTime'])){
$value = Carbon::now()->setTimezone('GMT+7')->format('Y-m-d\TH:i:s');
}
$child = $xml->addChild($key);
$child[0] = ''; // Ensure closed tag for empty value
} else {
$xml->addChild($key, htmlspecialchars($value));
}
$xmlData[$key] = $value; // Collect all tags as editable
}
}
$xmlNoData = [];
foreach($xmlData as $key => $val){
$xmlNoData[$key] = '';
}
//$this->updateXmlValues($this->formatXml($xml->asXML()), $xmlNoData)
return ['xmlContent' => $this->formatXml($xml->asXML()),
'xmlWithData' => $xmlData,
'xmlNoData' => $xmlNoData
];
}
//Convert short tag in case of value is empty to closed tag
private function formatXml($xmlString)
{
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xmlString);
// Ensure empty tags are closed
$xpath = new \DOMXPath($dom);
foreach ($xpath->query('//*[not(*) and not(text())]') as $node) {
$node->nodeValue = ''; // Set node value to empty string to ensure closed tag
}
return $dom->saveXML();
}
public function updateXmlValues($xmlString, $tagsToUpdate)
{
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadXML($xmlString);
foreach ($tagsToUpdate as $tag => $value) {
$nodes = $dom->getElementsByTagName($tag);
foreach ($nodes as $node) {
$node->nodeValue = htmlspecialchars($value);
}
}
return $dom->saveXML();
}
private function generateDeclarationNo($documentType)
{
$currentDate = Carbon::now()->toDateString();
$maxRunningNumber = 999999;
$running = DB::transaction(function () use ($currentDate, $maxRunningNumber, $documentType) {
$runningNumberRecord = DeclarationRunning::lockForUpdate()->where('document_type', $documentType)->first();
if ($runningNumberRecord) {
if ($runningNumberRecord->last_updated_date !== $currentDate) {
// Reset the running number if the date has changed
$runningNumberRecord->running_number = 1;
$runningNumberRecord->last_updated_date = $currentDate;
} elseif ($runningNumberRecord->running_number >= $maxRunningNumber) {
// Reset the running number if it reaches the max value
$runningNumberRecord->running_number = 1;
} else {
// Increment the running number
$runningNumberRecord->running_number += 1;
}
$runningNumberRecord->save();
} else {
// Create a new record if none exists
$runningNumberRecord = DeclarationRunning::create([
'running_number' => 1,
'last_updated_date' => $currentDate,
'document_type' => $documentType,
]);
}
return str_pad($runningNumberRecord->running_number, 6, '0', STR_PAD_LEFT);
});
$tmp_declarationNo = [
"A",
substr($running, 0, 1),
Carbon::now()->format('d'),
$documentType,
substr(Carbon::now()->year + 543, -2),
Carbon::now()->format('m'),
substr($running, -5)
];
return implode('', $tmp_declarationNo);
}
function generateGCLNo(){
$currentDate = Carbon::now()->toDateString();
$maxRunningNumber = 9999999;
$running = DB::transaction(function () use ($currentDate, $maxRunningNumber) {
$runningNumberRecord = DeclarationRunning::lockForUpdate()->where('document_type', "GCL")->first();
if ($runningNumberRecord) {
if ($runningNumberRecord->last_updated_date !== $currentDate) {
// Reset the running number if the date has changed
$runningNumberRecord->running_number = 1;
$runningNumberRecord->last_updated_date = $currentDate;
} elseif ($runningNumberRecord->running_number >= $maxRunningNumber) {
// Reset the running number if it reaches the max value
$runningNumberRecord->running_number = 1;
} else {
// Increment the running number
$runningNumberRecord->running_number += 1;
}
$runningNumberRecord->save();
} else {
// Create a new record if none exists
$runningNumberRecord = DeclarationRunning::create([
'running_number' => 1,
'last_updated_date' => $currentDate,
'document_type' => "GCL",
]);
}
return str_pad($runningNumberRecord->running_number, 7, '0', STR_PAD_LEFT);
});
$tmp_GCLNo = [
substr(Carbon::now()->year + 543, -2),
Carbon::now()->format('m'),
"A",
$running
];
return implode('', $tmp_GCLNo);
}
}
<?php
namespace App\Http\Controllers\ManualResponse;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ManualResponseController extends Controller
{
public function index()
{
//return view('manual-response/index');
$currentContent = 'ManualResponse';
return view('.home', compact('currentContent'));
}
}
<?php
namespace App\Http\Controllers\ManualResponse;
use App\Models\ManualResponse\UsersConnectSpn;
use App\Http\Controllers\Controller;
class SpnConfigController extends Controller
{
public function init_connection(UsersConnectSpn $user)
{
$username = $user->username;
$password = $user->password;
$link = $user->link;
// Initialize cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$link/spn/login_api.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Set the Authorization header for Basic Auth
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Basic ' . base64_encode("$username:$password"),
]);
// Execute cURL request
$response = curl_exec($ch);
$error = curl_error($ch); // Check for errors
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//dd($response, $error, $httpCode); //Debug response of cURL
curl_close($ch); // Close the cURL handle
if($httpCode == '404'){
return [
'success' => 'false',
'message' => 'This endpoint does not support this feature. Please contact support for upgrade options.'
];
}
if ($error) {
return [
'success' => 'false',
'message' => 'cURL Error: ' . $error
];
}
// Process the response
$decodedResponse = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
session()->flash('error', 'Invalid JSON response');
return null; // Handle invalid JSON appropriately
}
return $decodedResponse; // Return the decoded response
}
}
<?php
namespace App\Http\Livewire\Pages\ManualResponse;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
use App\Http\Controllers\ManualResponse\GenXmlController;
use App\Http\Controllers\ManualResponse\SpnConfigController;
use App\Models\ConfListProfile;
use App\Models\ManualResponse\MasterMessages;
use App\Models\ManualResponse\MasterResponseTemplates;
use App\Models\ManualResponse\MasterDocTypes;
use App\Models\ManualResponse\TabManualResponseLog;
use App\Models\ManualResponse\UsersConnectSpn;
use Carbon\Carbon;
use CURLFile;
class ManualResponse extends Component
{
public $displayCustomizeDiv = false;
public $messageTypes = [];
public $messageId;
public $responseTemplates = [];
public $templateId;
public $templateList;
public $docTypes = [];
public $docType;
public $xmlContent;
public $xmlData = [];
public $xmlWithData = [];
public $activeLoader = false;
public $changeBtnColor;
public $lockData;
public $disableLockData = true;
public $structureXML;
protected $rules = [
'messageId' => 'required|string',
'templateId' => 'required|string'
];
protected $messages = [
'messageId.required' => '*Message cannot be empty.',
'templateId.required' => '*Template cannot be empty.'
];
public function mount()
{
$this->messageTypes = MasterMessages::pluck('value', 'id')->toArray();
$this->docTypes = MasterDocTypes::pluck('name', 'code')->toArray();
$this->changeBtnColor = "bg-[#A020F0] hover:bg-[#B34FEF] text-white font-bold";
$this->lockData = false;
$this->disableLockData = true;
}
public function render()
{
if ($this->messageId != '') {
$this->responseTemplates = MasterResponseTemplates::where('mid', $this->messageId)->get()->mapWithKeys(function ($record) {
$description = $record->description != '' ? ' ' . ' (' . $record->description . ')' : '';
return [$record->id => $record->code . ': ' . $record->name . $description];
})->toArray();
$this->docTypes = MasterDocTypes::where('mid', $this->messageId)->pluck('name', 'code')->toArray();
}
return view('livewire.pages.manual-response.manual-response-index');
}
public function updatedMessageId()
{
$this->templateId = '';
$this->responseTemplates = [];
$this->docTypes = [];
$this->xmlData = [];
$this->xmlContent = '';
$this->displayCustomizeDiv = false;
}
public function updatedXmlTagInputList()
{
if ($this->xmlData === null) {
$this->xmlContent = '';
}
}
public function gotoCustomize()
{
$this->disableLockData = false;
$tmp_xmlData = $this->xmlData;
$this->xmlData = [];
$this->xmlContent = '';
$this->validate();
//Default documentType in case messsage is export/import
if(empty($this->docType)){
if($this->messageId == 1){
$this->docType = 1;
}else if($this->messageId == 2){
$this->docType = 0;
}
}
$xmlGenerator = new GenXmlController();
$xml = $xmlGenerator->generateXML($this->templateId, $this->docType, $this->lockData);
if ($xml == null) {
session()->flash('templateNotFound', 'Template is not found!');
} else {
$this->displayCustomizeDiv = true;
$this->xmlContent = $xml['xmlContent'];
$this->xmlData = $xml['xmlWithData'];
if($this->lockData){
foreach($this->xmlData as $key => $val){
if(isset($tmp_xmlData[$key]) && $key != 'Message'){
$this->xmlData[$key] = $tmp_xmlData[$key];
}
}
}
$this->reGenerateXML();
}
$this->changeBtnColor = "bg-slate-150 font-medium text-slate-800 hover:bg-slate-200 focus:bg-slate-200 active:bg-slate-200/80 rounded-md border border-[#e5e7eb] ";
}
public function reGenerateXML()
{
$xmlGenerator = new GenXmlController();
$xml = $xmlGenerator->updateXmlValues($this->xmlContent, $this->xmlData);
$this->xmlContent = $xml;
}
public function mockUpXML()
{
$this->xmlData = $this->xmlWithData;
}
public function generateAndUploadXml()
{
$this->reGenerateXML();
if(!$this->validateBeforeSend($this->xmlContent)){
$this->dispatchBrowserEvent('open-modal', [
'name' => 'alert-modal',
'message' => 'Profile production is not allowed.',
'status' => 'failed'
]);
return;
}
// Generate XML file from string
$now = Carbon::now();
$filename = 'manual_response_' . $now->format('Ymd_His') . ".xml";
Storage::disk('local')->put($filename, $this->xmlContent);
$filePath = storage_path('app/' . $filename);
$currentUser = Auth::user();
$userConnect = UsersConnectSpn::where('uid', $currentUser->id)->first();
if(!isset($userConnect)){
$this->dispatchBrowserEvent('open-modal', [
'name' => 'alert-modal',
'message' => 'SPN config is not found!',
'status' => 'failed'
]);
return;
}
$spnConfigController = new SpnConfigController();
$spnConfig = $spnConfigController->init_connection($userConnect);
if($spnConfig != null && $spnConfig['success'] == 'true'){
$uid = $spnConfig['uid'];
$ucode = $spnConfig['ucode'];
$ch = curl_init();
$cfile = new CURLFile($filePath, 'application/xml', $filename);
$postData = [
'UID' => $uid,
'UCODE' => $ucode,
'SERVICENAME' => 'imcoreservice',
'ACTION' => 'get_response_customs',
'profilecode' => '',
'API_PLACE_FILE' => 'Y',
'file' => $cfile
];
curl_setopt($ch, CURLOPT_URL, $userConnect->link . "/IE5DEV.shippingnet/data_defaulttemplate.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
TabManualResponseLog::create([
'uid' => $currentUser->id,
'title' => 'Send Manual Response',
'detail' => "Username: " . $userConnect->username . "\nLink: " . $userConnect->link,
'xml_content' => base64_encode($this->xmlContent),
'reference_number' => $this->xmlData['ReferenceNumber'],
'declaration_number' => $this->xmlData['DeclarationNumber'],
'link' => $userConnect->link
]);
if ($error) {
//Cannot send response to SPN
$this->dispatchBrowserEvent('open-modal', [
'name' => 'alert-modal',
'message' => 'Cannot send response to SPN',
'status' => 'failed'
]);
} else {
$this->dispatchBrowserEvent('open-modal', [
'name' => 'alert-modal',
'message' => 'Send response successfully',
'status' => 'success'
]);
Storage::disk('local')->delete($filename);
}
}else if($spnConfig != null && $spnConfig['success'] == 'false'){
$this->dispatchBrowserEvent('open-modal', [
'name' => 'alert-modal',
'message' => $spnConfig['message'],
'status' => 'failed'
]);
}else{
//Cannot get UID/UCODE from SPN
$this->dispatchBrowserEvent('open-modal', [
'name' => 'alert-modal',
'message' => 'Cannot connect to SPN',
'status' => 'failed'
]);
}
}
private function validateBeforeSend(){
$referenceNo = $this->xmlData['ReferenceNumber'];
$profileProds = ConfListProfile::where('type', 'PROD')->pluck('name')->toArray();
if(isset($referenceNo) && in_array(substr($referenceNo, 0, 1), $profileProds)){
return false;
}
return true;
}
}
<?php
namespace App\Http\Livewire\Pages\User;
use App\Models\User;
use App\Models\ManualResponse\UsersConnectSpn;
use App\Http\Controllers\ManualResponse\SpnConfigController;
use Livewire\Component;
class ConfigManualResponse extends Component
{
public $editUserId;
public $editUsername;
public $usernameSPN;
public $passwordSPN;
public $linkSPN;
public $action;
public function mount($editUserId)
{
$this->editUserId = $editUserId;
$currentUser = User::find($editUserId);
$this->editUsername = $currentUser->first_name;
$userConnectSpn = UsersConnectSpn::where('uid', $editUserId)->first();
if($userConnectSpn){
$this->usernameSPN = $userConnectSpn->username;
$this->passwordSPN = "";
$this->linkSPN = $userConnectSpn->link;
}
}
public function updateConfig()
{
if(empty($this->usernameSPN)){
$this->dispatchBrowserEvent('open-modal', [
'name' => 'alert-modal',
'message' => 'Username must not be empty!',
'status' => 'warning'
]);
return;
}
$userConnectSpn = UsersConnectSpn::where('uid', $this->editUserId)->first();
if($userConnectSpn){
if(!empty($this->passwordSPN)){
$userConnectSpn->password = password_hash($this->passwordSPN, PASSWORD_BCRYPT);
}
$userConnectSpn->username = $this->usernameSPN;
$userConnectSpn->link = $this->linkSPN;
$userConnectSpn->save();
}else{
UsersConnectSpn::create([
'uid' => $this->editUserId,
'username' => $this->usernameSPN,
'password' => '',
"link" => $this->linkSPN
]);
}
$this->dispatchBrowserEvent('open-modal', [
'name' => 'alert-modal',
'message' => 'Update config successfully',
'status' => 'success'
]);
}
public function render()
{
return view('livewire.pages.user.config-manual-response');
}
public function backToMainList()
{
//Use emitTo() to call function on specific component, (emit() will call function on every loaded compoment)
$this->emitTo('pages.user.user-index', 'showUserList', '');
}
public function testConnection()
{
//Use emitTo() to call function on specific component, (emit() will call function on every loaded compoment)
$userConnect = UsersConnectSpn::where('uid', $this->editUserId)->first();
if(!isset($userConnect)){
$this->dispatchBrowserEvent('open-modal', [
'name' => 'alert-modal',
'message' => 'SPN config is not found!',
'status' => 'failed'
]);
return;
}
$spnConfigController = new SpnConfigController();
$spnConfig = $spnConfigController->init_connection($userConnect);
if($spnConfig != null && $spnConfig['success'] == 'true'){
$this->dispatchBrowserEvent('open-modal', [
'name' => 'alert-modal',
'message' => 'Connect to SPN successfully',
'status' => 'success'
]);
}else if($spnConfig != null && $spnConfig['success'] == 'false'){
$this->dispatchBrowserEvent('open-modal', [
'name' => 'alert-modal',
'message' => $spnConfig['message'],
'status' => 'failed'
]);
}else{
//Cannot get UID/UCODE from SPN
$this->dispatchBrowserEvent('open-modal', [
'name' => 'alert-modal',
'message' => 'Cannot connect to SPN',
'status' => 'failed'
]);
}
}
}
......@@ -82,6 +82,17 @@ class UserIndex extends Component
$this->editUserId = $UserId;
}
public function showConfigManualResponseForm($UserId)
{
if (!Auth::user()->hasPermissions(['edit-user'])) {
$this->showNoPermissionModal = TRUE;
return;
}
$this->action = 'configManualResponse';
$this->editUserId = $UserId;
}
public function hideMessage()
{
$this->showMessage = false;
......
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class ConfListProfile extends Model
{
use HasFactory;
protected $table = 'conf_list_profiles';
protected $fillable = [
'id',
'name',
'type',
'desc',
];
}
<?php
namespace App\Models\ManualResponse;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class DeclarationRunning extends Model
{
use HasFactory;
protected $table = 'mr_declaration_running';
protected $fillable = ['document_type', 'running_number', 'last_updated_date'];
}
<?php
namespace App\Models\ManualResponse;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class MasterDocTypes extends Model
{
use HasFactory;
protected $table = 'mr_master_doc_types';
}
<?php
namespace App\Models\ManualResponse;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class MasterMessages extends Model
{
use HasFactory;
protected $table = 'mr_master_messages';
}
<?php
namespace App\Models\ManualResponse;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class MasterResponseTemplates extends Model
{
use HasFactory;
protected $table = 'mr_master_response_templates';
}
<?php
namespace App\Models\ManualResponse;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class TabManualResponseLog extends Model
{
use HasFactory;
protected $table = 'mr_tab_manual_response_log';
protected $fillable = [
'uid',
'title',
'detail',
'xml_content',
'reference_number',
'declaration_number',
'link',
];
}
<?php
namespace App\Models\ManualResponse;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class UsersConnectSpn extends Model
{
use HasFactory;
protected $table = 'mr_users_connect_spn';
protected $fillable = [
'uid',
'username',
'password',
'link',
];
protected $hidden = [
'password'
];
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('mr_master_messages', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('value');
$table->timestamps();
});
DB::table('mr_master_messages')->insert([
[
'name' => 'export',
'value' => 'EXPORT',
],
[
'name' => 'import',
'value' => 'IMPORT',
],
[
'name' => 'gcl',
'value' => 'GCL',
],
[
'name' => 'short',
'value' => 'SHORT',
]
]);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('mr_master_messages');
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::dropIfExists('mr_master_response_templates');
Schema::create('mr_master_response_templates', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('mid');
$table->string('code');
$table->string('type');
$table->string('name');
$table->string('description');
$table->text('template');
$table->timestamps();
// Foreign key constraint
// onDelete('cascade'); means when delete data from main table, sub table will be deleted too.
$table->foreign('mid')->references('id')->on('master_messages')->onDelete('cascade');
});
DB::table('mr_master_response_templates')->insert([
//Export
[
'mid' => 1,
'code' => '0209',
'type' => 'XDCA',
'name' => 'DECLARATION ACCEPTED',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"XDCA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"DeclarationAccept":{"Status":"00","DeclarationNumber":"","TotalTax":"1000","TotalDeposit":"0","ReleasePort":"1193","Message":"DECLARATION ACCEPTED"}}}}'
],
[
'mid' => 1,
'code' => '0300',
'type' => 'GCLD',
'name' => 'พบหน่วยงานผู้ออกใบอนุญาตหรือใบรับรองอิเล็กทรอนิกส์เพื่อตรวจสอบของ',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"GCLD","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"GoodsAudit":{"DeclarationNumber":"","ContainerNumber":"CONT-SIT-01","LoadPort":"0010","Message":"พบหน่วยงานผู้ออกใบอนุญาตหรือใบรับรองอิเล็กทรอนิกส์เพื่อตรวจสอบของ","AuditDateTime":""}}}}'
],
[
'mid' => 1,
'code' => '0301',
'type' => 'GCLD',
'name' => 'Goods Transition Control Already Checked ให้มาตรวจของที่ท่าที่ส่งออก',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"GCLD","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"GoodsAudit":{"DeclarationNumber":"","ContainerNumber":"CONT-SIT-01","LoadPort":"0010","Message":"Goods Transition Control Already Checked ให้มาตรวจของที่ท่าที่ส่งออก","AuditDateTime":""}}}}'
],
[
'mid' => 1,
'code' => '0309',
'type' => 'GCLD',
'name' => 'Goods Transition Control Already Checked',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"GCLD","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"GoodsAudit":{"DeclarationNumber":"","ContainerNumber":"CONT-SIT-01","LoadPort":"0010","Message":"Goods Transition Control Already Checked","AuditDateTime":""}}}}'
],
[
'mid' => 1,
'code' => '0409',
'type' => 'GCLD',
'name' => 'GOODS LOADED',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"GCLD","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"GoodsAudit":{"DeclarationNumber":"","ContainerNumber":"CONT-SIT-01","LoadPort":"0010","Message":"GOODS LOADED","AuditDateTime":""}}}}'
],
[
'mid' => 1,
'code' => 'REJECT',
'type' => 'XDCR',
'name' => 'REJECT',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"XDCR","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"DeclarationReject":{"ItemNumber":"0","ErrorCode":"GDEX-00044","Message":"INVALID DEPARTURE DATE"}}}}'
],
[
'mid' => 1,
'code' => 'CANCEL ACCEPTED',
'type' => 'XCDA',
'name' => 'DECLARATION CANCELED',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"XCDA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"CancelDocumentAccept":{"DocumentNumber":"","Message":"DECLARATION CANCELED"}}}}'
],
[
'mid' => 1,
'code' => 'CANCEL REJECT',
'type' => 'XCDR',
'name' => 'INVALID DECLARATION NUMBER',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"XCDR","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"CancelDocumentReject":{"DocumentNumber":"","ErrorCode":"CLGD-00016","Message":"DECLARATION STATUS CAN NOT CANCEL"}}}}'
],
[
'mid' => 1,
'code' => '9904',
'type' => 'GCLD',
'name' => 'Goods Transition Control Already Cancel Matching',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"GCLD","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"GoodsAudit":{"DeclarationNumber":"","ContainerNumber":"CONT-SIT-01","LoadPort":"0010","Message":"Goods Transition Control Already Cancel Matching","AuditDateTime":""}}}}'
],
//Import
[
'mid' => 2,
'code' => '0109',
'type' => 'IDCA',
'name' => 'พร้อมที่จะชำระเงินค่าภาษีอากรที่หน่วยงานของกรมศุลกากร',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"IDCA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"DeclarationAccept":{"Status":"00","DeclarationNumber":"","TotalTax":"1000","TotalDeposit":"0","ReleasePort":"1193","Message":"พร้อมที่จะชำระเงินค่าภาษีอากรที่หน่วยงานของกรมศุลกากร"}}}}'
],
[
'mid' => 2,
'code' => '0209',
'type' => 'IDCA',
'name' => 'DECLARATION ACCEPTED',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"IDCA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"DeclarationAccept":{"Status":"00","DeclarationNumber":"","TotalTax":"1000","TotalDeposit":"0","ReleasePort":"1193","Message":"DECLARATION ACCEPTED"}}}}'
],
[
'mid' => 2,
'code' => '0209',
'type' => 'IDCA',
'name' => 'รอการตัดบัญชีธนาคาร',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"IDCA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"DeclarationAccept":{"Status":"00","DeclarationNumber":"","TotalTax":"1000","TotalDeposit":"0","ReleasePort":"1193","Message":"รอการตัดบัญชีธนาคาร"}}}}'
],
[
'mid' => 2,
'code' => '0209',
'type' => 'PMTA',
'name' => 'ได้รับการชำระเงินเรียบร้อยแล้ว',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"PMTA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"DeclarationAccept":{"DeclarationNumber":"","Status":"A","PaymentType":"PMT","Message":"ได้รับการชำระเงินเรียบร้อยแล้ว","PaymentNumber":"123456","BankTransactionNumber":"FCN0000000001","TotalAmount":"1000"}}}}'
],
[
'mid' => 2,
'code' => '0301',
'type' => 'IDCA',
'name' => 'สินค้าต้องตรวจสอบ',
'description' => 'R',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"IDCA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"DeclarationAccept":{"Status":"00","DeclarationNumber":"","TotalTax":"1000","TotalDeposit":"0","ReleasePort":"1193","Message":"สินค้าต้องตรวจสอบ"}}}}'
],
[
'mid' => 2,
'code' => '0309',
'type' => 'IDCA',
'name' => 'ไม่ต้องตรวจสอบพิกัดศุลกากร ราคาและของ ไปรับของ ที่ท่าหรือที่นำเข้า',
'description' => 'G',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"IDCA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"DeclarationAccept":{"Status":"00","DeclarationNumber":"","TotalTax":"1000","TotalDeposit":"0","ReleasePort":"1193","Message":"ไม่ต้องตรวจสอบพิกัดศุลกากร ราคาและของ ไปรับของ ที่ท่าหรือที่นำเข้า"}}}}'
],
[
'mid' => 2,
'code' => '0409',
'type' => 'IDCA',
'name' => 'ส่งมอบสินค้า',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"IDCA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"DeclarationAccept":{"Status":"00","DeclarationNumber":"","TotalTax":"1000","TotalDeposit":"0","ReleasePort":"1193","Message":"ส่งมอบสินค้า"}}}}'
],
[
'mid' => 2,
'code' => 'REJECT',
'type' => 'IDCR',
'name' => 'REJECT',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"IDCR","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"DeclarationReject":{"ItemNumber":"0","ErrorCode":"ITEM-00058","Message":"INVALID DISCHARGE PORT"}}}}'
],
[
'mid' => 2,
'code' => 'ERR_TRANS',
'type' => 'ERR_TRANS',
'name' => 'Error Trans',
'description' => '',
'template' => '{"root":"ErrorMessage","namespace":null,"DocumentDetails":{"TransactionNo":"E06@240209210907_418","ReferenceNo":"","ErrorType":"ERR_TRANS","ErrorItems":"1","ErrorDate":"","ErrorDescription":"Value too short, length = 0. Facet minLength = 1. element=\'CustomsImportDeclaration[1]/SEQUENCE1[1]/DocumentControl[1]/SEQUENCE1[1]/BorderTransportMeans[1]/SEQUENCE1[1]/VesselName\'. At line = 1149 column = 1."}}'
],
[
'mid' => 2,
'code' => 'CANCEL ACCEPTED',
'type' => 'XCDA',
'name' => 'DECLARATION CANCELED',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"XCDA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"CancelDocumentAccept":{"DocumentNumber":"","Message":"DECLARATION CANCELED"}}}}'
],
[
'mid' => 2,
'code' => 'CANCEL REJECT',
'type' => 'XCDR',
'name' => 'INVALID DECLARATION NUMBER',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"XCDR","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"CancelDocumentReject":{"DocumentNumber":"","ErrorCode":"CLGD-00008","Message":"INVALID DECLARATION NUMBER"}}}}'
],
//GCL
[
'mid' => 3,
'code' => '0209',
'type' => 'GCLA',
'name' => 'GOODS CONTROL ACCEPT',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"GCLA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"GoodsTransitionAccept":{"GoodsTransitionNumber":"","ContainerNumber":"CONT-A0102723-1","LoadPort":"2801","Message":"GOODS CONTROL ACCEPT"}}}}'
],
[
'mid' => 3,
'code' => '0209',
'type' => 'GCLA_BKK',
'name' => 'GOODS CONTROL ACCEPT (Port)',
'description' => 'PORT',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"GCLA_BKK","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"GoodsTransitionAccept":{"GoodsTransitionNumber":"","ContainerNumber":"CONT-A0102723-1","LoadPort":"2801","Message":"GOODS CONTROL ACCEPT"}}}}'
],
[
'mid' => 3,
'code' => '0301',
'type' => 'GCLD',
'name' => 'Goods Transition Control Already Checked ให้มาตรวจของที่ท่าที่ส่งออก',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"GCLD","ReferenceNumber":"","RegistrationID":"TH0041010353980000000010001T5","DocumentDetail":{"GoodsAudit":{"DeclarationNumber":"","ContainerNumber":"CONT-SIT-02","LoadPort":"0010","Message":"Goods Transition Control Already Checked","AuditDateTime":""}}}}'
],
[
'mid' => 3,
'code' => '0309',
'type' => 'GCLD',
'name' => 'Goods Transition Control Already Checked',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"GCLD","ReferenceNumber":"","RegistrationID":"TH0041010353980000000010001T5","DocumentDetail":{"GoodsAudit":{"GoodsTransitionNumber":"","ContainerNumber":"CONT-SIT-02","LoadPort":"0010","Message":"Goods Transition Control Already Checked","AuditDateTime":""}}}}'
],
[
'mid' => 3,
'code' => 'REJECT',
'type' => 'GCLR',
'name' => 'REJECT',
'description' => 'INVALID CONTAINER SIZE AND TYPE CODE',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"GCLR","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"GoodsTransitionReject":{"DeclarationNumber":"","ContainerNumber":"CONT-A0102723-1","ErrorCode":"GCEX-00052 ","Message":"INVALID CONTAINER SIZE AND TYPE CODE"}}}}'
],
[
'mid' => 3,
'code' => 'CANCEL ACCEPT',
'type' => 'XCDA',
'name' => 'CANCEL',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"XCDA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"CancelDocumentAccept":{"DocumentNumber":"","Message":"CONT-A0102723-1"}}}}'
],
[
'mid' => 3,
'code' => 'CANCEL MATCHING',
'type' => 'GCLD',
'name' => 'CANCEL MATCHING',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"GCLD","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"GoodsAudit":{"DeclarationNumber":"","ContainerNumber":"CONT-A0102723-1","LoadPort":"2801","Message":"Goods Transition Control Already Cancel Matching","AuditDateTime":""}}}}'
],
//SHORT
[
'mid' => 4,
'code' => '9980',
'type' => 'SDCA',
'name' => 'SHORT DECLARATION ACCEPTED',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"IDCA","ReferenceNumber":"","RegistrationID":"TH0101075570001010000000001T0","DocumentDetail":{"ShortDeclarationAccept":{"DeclarationNumber":"","Message":"SHORT DECLARATION ACCEPTED"}}}}'
],
[
'mid' => 4,
'code' => '0000',
'type' => 'SDCR',
'name' => 'SHORT DECLARATION REJECT',
'description' => '',
'template' => '{"root":"CustomsResponse","namespace":"http://ebxml.customs.go.th/XMLSchema/CustomsResponse_8_00","DocumentControl":{"MessageType":"SDCR","ReferenceNumber":"","RegistrationID":"TH0041010353980000000010001T5","DocumentDetail":{"ShortDeclarationReject":{"DeclarationNumber":"","DeclarationLineNumber":"0","ErrorCode":"SHEX-00029","Message":"CAN NOT SHORT IF DECLARATION ITEM MORE THAN 1 ITEM AND SOME VALUE IN ITEM = 0"}}}}'
],
]);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('mr_master_response_templates');
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('mr_declaration_running', function (Blueprint $table) {
$table->id();
$table->string('document_type');
$table->integer('running_number')->default(0);
$table->date('last_updated_date');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('mr_declaration_runnings');
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('mr_master_doc_types', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('mid');
$table->string('code');
$table->string('name');
$table->string('mode');
$table->timestamps();
$table->foreign('mid')->references('id')->on('master_messages')->onDelete('cascade');
});
DB::table('mr_master_doc_types')->insert([
['mid' => '2', 'code' => '0', 'name' => '0-ใบขนสินค้าขาเข้า', 'mode' => 'IMDECL'],
['mid' => '2', 'code' => '2', 'name' => '2-ใบขนสินค้าผ่านแดน (Transit)', 'mode' => 'IMDECL'],
['mid' => '2', 'code' => '3', 'name' => '3-คำร้องขอรับของไปก่อน', 'mode' => 'IMDECL'],
['mid' => '2', 'code' => '5', 'name' => '5-ใบขนสินค้าขาเข้าปากระวาง', 'mode' => 'IMDECL'],
['mid' => '2', 'code' => '8', 'name' => '8-ใบขนสินค้าถ่ายลำ (Transhipment)', 'mode' => 'IMDECL'],
['mid' => '2', 'code' => 'A', 'name' => 'A-ใบขนสินค้าขาเข้าโอนย้ายในประเทศ', 'mode' => 'IMDECL'],
['mid' => '2', 'code' => 'C', 'name' => 'C-ใบขนสินค้าขาเข้าโอนย้ายจากเขตปลอดอากร', 'mode' => 'IMDECL'],
['mid' => '1', 'code' => '1', 'name' => '1-ใบขนสินค้าขาออก', 'mode' => 'EXDECL'],
['mid' => '1', 'code' => '4', 'name' => '4-คำร้องขอออกของไปก่อน', 'mode' => 'EXDECL'],
['mid' => '1', 'code' => 'B', 'name' => 'B-ใบขนสินค้าขาออกโอนย้ายภายในประเทศ', 'mode' => 'EXDECL'],
['mid' => '1', 'code' => 'D', 'name' => 'D-ใบขนสินค้าขาออกโอนย้ายเข้าเขตปลอดอากร', 'mode' => 'EXDECL'],
['mid' => '1', 'code' => '6', 'name' => '6-ใบขนสินค้าพิเศษผ่านแดนขาออก', 'mode' => 'EXDECL'],
['mid' => '1', 'code' => 'H', 'name' => 'H-คำร้องขอนำออกนอกเขตอารักขาศุลกากร', 'mode' => 'EXDECL'],
['mid' => '1', 'code' => 'Y', 'name' => 'Y-ใบขนสินค้าขาออกเร่งด่วน', 'mode' => 'EXDECL'],
['mid' => '2', 'code' => 'X', 'name' => 'X-ใบขนสินค้าขาเข้าเร่งด่วน', 'mode' => 'IMDECL'],
['mid' => '2', 'code' => 'P', 'name' => 'P-ใบขนสินค้าขาเข้าโอนย้ายชำระค่าภาษีอากร', 'mode' => 'IMDECL'],
]);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('mr_master_doc_types');
}
};
......@@ -14,7 +14,7 @@ return new class extends Migration
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->softDeletes();
$table->softDeletes();
});
}
......@@ -26,7 +26,7 @@ return new class extends Migration
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropSoftDeletes();
$table->dropSoftDeletes();
});
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('mr_users_connect_spn', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('uid');
$table->string('username');
$table->string('password');
$table->string('link');
$table->timestamps();
$table->foreign('uid')->references('id')->on('users')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('mr_users_connect_spn');
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('mr_tab_manual_response_log', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('uid');
$table->string('title');
$table->string('detail');
$table->text('xml_content');
$table->string('reference_number');
$table->string('declaration_number');
$table->string('link');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('mr_tab_manual_response_log');
}
};
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment