File: /var/www/html/inventory.breadsecret.com/class/Controller/supplier.php
<?php
namespace Controller;
use Responses\Message, Responses\Action, Responses\Data;
use Database\Sql, Database\Listable;
use Pages\Page, Pages\ListPage, Pages\FormPage;
use Routing\Route;
use Utility\WebSystem, Utility\Excel, Utility\Email;
use Controller\documentHelper, Controller\formLayout;
class supplier implements Listable {
private $stmStatus = null;
private $stmSupplierCategory = null;
public static function find($id, $fetchMode=\PDO::FETCH_OBJ) {
$sql = Sql::select("supplier")->where(['id', '=', $id]);
$stm = $sql->prepare();
$stm->execute();
$obj = $stm->fetch($fetchMode);
if ($obj === false) return null;
return $obj;
}
public static function findAll($fetchMode=\PDO::FETCH_OBJ) {
$sql = Sql::select("supplier")->where(['status', '=', "1"]);
$stm = $sql->prepare();
$stm->execute();
return $stm;
}
public static function getStockDetail($request, $fetchMode=\PDO::FETCH_OBJ) {
if (!user::checklogin()) return new Data(['success'=>false, 'message'=>L('login.signInMessage'), 'note'=>'signIn']);
if (!isset($request->get->id) || empty($request->get->id))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyID')]);
$supplierObj = self::find($request->get->id);
if(is_null($supplierObj)) return new Data(['success'=>false, 'message'=>L('error.supplierNotFound')]);
$content = "<div class='row'>";
//$content .= formLayout::rowDisplayLineNew(L('supplier.name'),$supplierObj->name);
//$content .= formLayout::rowDisplayLineNew(L('supplierCategory.name'),supplierCategory::find($supplierObj->supplierCategoryID)->name);
$content .= formLayout::rowInputNew(L('supplier.name'),'', '', 'text', 4, [], ['disabled'], $supplierObj->name);
$content .= formLayout::rowInputNew(L('supplierCategory.name'),'', '', 'text', 4, [], ['disabled'], supplierCategory::find($supplierObj->supplierCategoryID)->name);
$sql = Sql::select(['item', 'item'])
->leftJoin(['item_type', 'itemType'], "item.itemTypeID = itemType.id")
->leftJoin(['unit', 'unit'], "item.unitID = unit.id")
->leftJoin(['item_stock', 'stock'], "stock.itemID = item.id")
->leftJoin(['storage_location_area', 'area'], "stock.storageLocationAreaID = area.id")
->leftJoin(['storage_location', 'location'], "area.storageLocationID = location.id")
->leftJoin(['item_stock_detail', 'stockDetail'], "stockDetail.itemStockID = stock.id")
->where(['item.qty', '>', 0])->where(['stock.qty', '>', 0])->where(['stockDetail.qty', '>', 0])->where(['item.supplierID', '=', $request->get->id]);
$sql->setFieldValue('
stockDetail.id id,
item.name itemName,
itemType.name itemTypeName,
area.name areaName,
location.name locationName,
stockDetail.batchNo batchNo,
stockDetail.qty qty,
unit.name unitName,
stockDetail.purchaseUnitCost purchaseUnitCost
');
$stm = $sql->prepare();
$stm->execute();
$obj = $stm->fetchAll($fetchMode);
if ($obj === false) return new Data(['success'=>false, 'message'=>L('error.supplierNotFound')]);
$data = [];
$totalValue = 0;
foreach($obj as $stockDetail){
$totalValue += $stockDetail->qty*$stockDetail->purchaseUnitCost;
$data[] = [
"item"=>$stockDetail->itemName,
"itemType"=>$stockDetail->itemTypeName,
"location"=>$stockDetail->locationName." - ".$stockDetail->areaName,
"batch"=>$stockDetail->batchNo,
"qty"=>$stockDetail->qty,
"unit"=>$stockDetail->unitName,
"cost"=>$stockDetail->purchaseUnitCost,
"value"=>$stockDetail->qty*$stockDetail->purchaseUnitCost
];
}
//$content .= formLayout::rowDisplayLineNew(L('stock.value'),$totalValue);
$content .= formLayout::rowInputNew(L('stock.value'),'', '', 'text', 4, [], ['disabled'], $totalValue);
$content .= "</div>";
$content .= formLayout::rowSeparatorLineNew(12);
$content .= "<div class='table-responsive'><table class='table table-bordered mt-3'>";
$content .= "<thead class='thead-dark'>";
$content .= "<tr>";
$content .= "<th>".L('item.name')."</th>";
$content .= "<th>".L('itemType.name')."</th>";
$content .= "<th>".L('stock.storageLocation')."</th>";
$content .= "<th>".L('stock.batchNo')."</th>";
$content .= "<th>".L('stock.qty')."</th>";
$content .= "<th>".L('item.unit')."</th>";
$content .= "<th>".L('stock.purchaseUnitCost')."</th>";
$content .= "<th>".L('stock.value')."</th>";
$content .= "</tr>";
$content .= "</thead>";
foreach($data as $displayData) {
$content .= "<tr>";
$content .= "<td>".$displayData['item']."</td>";
$content .= "<td>".$displayData['itemType']."</td>";
$content .= "<td>".$displayData['location']."</td>";
$content .= "<td>".$displayData['batch']."</td>";
$content .= "<td>".$displayData['qty']."</td>";
$content .= "<td>".$displayData['unit']."</td>";
$content .= "<td>".$displayData['cost']."</td>";
$content .= "<td>".$displayData['value']."</td>";
$content .= "</tr>";
}
$content .= "</table></div>";
return new Data(['success'=>true, 'message'=>$content]);
}
public function extraProcess($listObj) {
if (is_null($this->stmSupplierCategory))
$this->stmSupplierCategory = Sql::select('supplier_category')->where(['id', '=', "?"])->prepare();
$this->stmSupplierCategory->execute([$listObj->supplierCategoryID]);
$objSupplierCategory = $this->stmSupplierCategory->fetch();
$listObj->supplierCategory = $objSupplierCategory['name'];
if (is_null($this->stmStatus))
$this->stmStatus = Sql::select('status')->where(['id', '=', "?"])->prepare();
$this->stmStatus->execute([$listObj->status]);
$objStatus = $this->stmStatus->fetch();
$listObj->statusName = $objStatus['name'];
return $listObj;
}
public function list($request) {
if (!user::checklogin()) return new Action('redirect', WebSystem::path(Route::getRouteByName('page.login')->path(), false, false));
$obj = null;
return new FormPage('supplier/list', $obj);
}
public function delete($request) {
if (!user::checklogin()) return new Data(['success'=>false, 'message'=>L('login.signInMessage'), 'note'=>'signIn']);
if (!isset($request->get->id) || empty($request->get->id))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyID')]);
$sql = Sql::delete('supplier')->where(['id', '=', $request->get->id]);
if ($sql->prepare()->execute()) {
return new Data(['success'=>true, 'message'=>L('info.supplierDeleted')]);
} else {
return new Data(['success'=>false, 'message'=>L('error.supplierDeleteFailed')]);
}
}
public function supplierForm($request) {
if (!user::checklogin()) return new Data(['success'=>false, 'message'=>L('login.signInMessage'), 'note'=>'signIn']);
$currentUserObj = unserialize($_SESSION['user']);
$obj = null;
if (isset($request->get->id))
$obj = self::find($request->get->id, \PDO::FETCH_NAMED);
$formName = "form-addSupplier";
$viewMode = isset($request->get->view);
if(!is_null($obj)) {
if(isset($request->get->view)){
$formName = "form-viewSupplier";
}
else{
$formName = "form-editSupplier";
}
}
$content = "<form id='".$formName."' class='' autocomplete='off'>";
$content .= "<div class='row'><p class='col-md-12 col-lg-12 text-primary' id='notice'>".L('info.supplierAddHelperMessage')."</p></div>";
$content .= "<div class='row'>";
$option = [""=>"", "Add"=>"[".L("Add")."]"];
$stm = Sql::select('supplier_category')->where(['status', '=', 1])->prepare();
$stm->execute();
foreach ($stm as $opt) {
$option[$opt['id']] = $opt['name'];
}
$content .= formLayout::rowSelectNew(L('supplier.category'), 'supplierCategoryID', 'supplierCategoryID', $option, 6, [], [$viewMode ? 'disabled' : 'required'], is_null($obj)?'':$obj['supplierCategoryID']);
//$content .= formLayout::rowRadioNew(L('supplier.category'), 'supplierCategoryID', 'supplierCategoryID', $option, 12, [], ['required'], is_null($obj)?'1':$obj['supplierCategoryID']);
//$content .= formLayout::rowSeparatorLineNew(12);
$content .= formLayout::rowInputNew(L('supplier.name'),'name', 'name', 'text', 6, [], [$viewMode ? 'disabled' : 'required'], is_null($obj)?'':$obj['name']);
$content .= formLayout::rowInputNew(L('supplier.contactPerson'),'contactPerson', 'contactPerson', 'text', 6, [], [$viewMode ? 'disabled' : ''], is_null($obj)?'':$obj['contactPerson']);
$content .= formLayout::rowInputNew(L('supplier.contactPhone'),'contactPhone', 'contactPhone', 'tel', 6, [], [$viewMode ? 'disabled' : ''], is_null($obj)?'':$obj['contactPhone']);
$content .= formLayout::rowInputNew(L('supplier.contactEmail'),'contactEmail', 'contactEmail', 'email', 6, [], [$viewMode ? 'disabled' : ''], is_null($obj)?'':$obj['contactEmail']);
$content .= formLayout::rowTextAreaNew(L('supplier.address'), 'address', 'address', 12, [], [$viewMode ? 'disabled' : ''], is_null($obj)?'':$obj['address']);
$content .= formLayout::rowInputNew(L('supplier.website'),'website', 'website', 'text', 12, [], [$viewMode ? 'disabled' : ''], is_null($obj)?'':$obj['website']);
if(!is_null($obj)) {
$option = [];
$stm = Sql::select('status')->prepare();
$stm->execute();
foreach ($stm as $opt) {
$option[$opt['id']] = L($opt['name']);
}
$content .= formLayout::rowSelectNew(L('Status'), 'status', 'status', $option, 6, [], [$viewMode ? 'disabled' : 'required'], is_null($obj)?'':$obj['status']);
}
$content .= "</div></form>";
return new Data(['success'=>true, 'message'=>$content, 'clientTypeID'=>is_null($obj)?'1':$obj['clientTypeID']]);
}
public function add($request) {
if (!user::checklogin()) return new Data(['success'=>false, 'message'=>L('login.signInMessage'), 'note'=>'signIn']);
$currentUserObj = unserialize($_SESSION['user']);
// form check
if (!isset($request->post->supplierCategoryID) || empty($request->post->supplierCategoryID))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyCategory'), 'field'=>'supplierCategoryID']);
if (!isset($request->post->name) || empty($request->post->name))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyName'), 'field'=>'name']);
/*
if (!isset($request->post->contactPerson) || empty($request->post->contactPerson))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyContactPerson'), 'field'=>'contactPerson']);
if (!isset($request->post->contactPhone) || empty($request->post->contactPhone))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyContactPhone'), 'field'=>'contactPhone']);
if (!isset($request->post->contactEmail) || empty($request->post->contactEmail))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyContactEmail'), 'field'=>'contactEmail']);
if (filter_var($request->post->contactEmail, FILTER_VALIDATE_EMAIL) === FALSE)
return new Data(['success'=>false, 'message'=>L('error.userEmailInvalid'), 'field'=>'contactEmail']);
if (!isset($request->post->address) || empty($request->post->address))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyAddress'), 'field'=>'address']);
if (!isset($request->post->website) || empty($request->post->website))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyWebsite'), 'field'=>'website']);
*/
// insert database
$sql = Sql::insert('supplier')->setFieldValue([
'supplierCategoryID' => "?",
'name' => "?",
'contactPerson' => "?",
'contactPhone'=>"?",
'contactEmail'=>"?",
'address'=>"?",
'website'=>"?"
]);
if ($sql->prepare()->execute([
strip_tags($request->post->supplierCategoryID),
strip_tags($request->post->name),
strip_tags($request->post->contactPerson),
strip_tags($request->post->contactPhone),
strip_tags($request->post->contactEmail),
strip_tags($request->post->address),
strip_tags($request->post->website)
])) {
$id = db()->lastInsertId();
return new Data(['success'=>true, 'message'=>L('info.saved')]);
} else {
return new Data(['success'=>false, 'message'=>L('error.unableInsert'), 'field'=>'notice']);
}
}
public function edit($request) {
if (!user::checklogin()) return new Data(['success'=>false, 'message'=>L('login.signInMessage'), 'note'=>'signIn']);
$currentUserObj = unserialize($_SESSION['user']);
if (!isset($request->get->id) || empty($request->get->id))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyID'), 'field'=>'notice']);
$supplierObj = self::find($request->get->id);
if(is_null($supplierObj))
return new Data(['success'=>false, 'message'=>L('error.supplierNotFound'), 'field'=>'notice']);
// form check
if (!isset($request->post->supplierCategoryID) || empty($request->post->supplierCategoryID))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyCategory'), 'field'=>'supplierCategoryID']);
if (!isset($request->post->name) || empty($request->post->name))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyName'), 'field'=>'name']);
/*
if (!isset($request->post->contactPerson) || empty($request->post->contactPerson))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyContactPerson'), 'field'=>'contactPerson']);
if (!isset($request->post->contactPhone) || empty($request->post->contactPhone))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyContactPhone'), 'field'=>'contactPhone']);
if (!isset($request->post->contactEmail) || empty($request->post->contactEmail))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyContactEmail'), 'field'=>'contactEmail']);
if (filter_var($request->post->contactEmail, FILTER_VALIDATE_EMAIL) === FALSE)
return new Data(['success'=>false, 'message'=>L('error.userEmailInvalid'), 'field'=>'contactEmail']);
if (!isset($request->post->address) || empty($request->post->address))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyAddress'), 'field'=>'address']);
if (!isset($request->post->website) || empty($request->post->website))
return new Data(['success'=>false, 'message'=>L('error.supplierEmptyWebsite'), 'field'=>'website']);
*/
$editFields = [];
$editValues = [];
if (isset($request->post->supplierCategoryID) && !empty($request->post->supplierCategoryID)) {
$editFields['supplierCategoryID'] = "?";
$editValues[] = $request->post->supplierCategoryID;
}
if (isset($request->post->name) && !empty($request->post->name)) {
$editFields['name'] = "?";
$editValues[] = $request->post->name;
}
if (isset($request->post->contactPerson) && !empty($request->post->contactPerson)) {
$editFields['contactPerson'] = "?";
$editValues[] = $request->post->contactPerson;
}
if (isset($request->post->contactPhone) && !empty($request->post->contactPhone)) {
$editFields['contactPhone'] = "?";
$editValues[] = $request->post->contactPhone;
}
if (isset($request->post->contactEmail) && !empty($request->post->contactEmail)) {
$editFields['contactEmail'] = "?";
$editValues[] = $request->post->contactEmail;
}
if (isset($request->post->address) && !empty($request->post->address)) {
$editFields['address'] = "?";
$editValues[] = $request->post->address;
}
if (isset($request->post->website) && !empty($request->post->website)) {
$editFields['website'] = "?";
$editValues[] = $request->post->website;
}
if (isset($request->post->status) && !empty($request->post->status)) {
$editFields['status'] = "?";
$editValues[] = $request->post->status;
}
/*
if (count($editFields)) {
$editFields['modifyDate'] = "NOW()";
$editFields['modifyBy'] = $currentUserObj->id;
}
*/
if (count($editFields) == 0) return new Data(['success'=>false, 'message'=>L('error.nothingEdit'), 'field'=>'notice']);
$sql = Sql::update('supplier')->setFieldValue($editFields)->where(['id', '=', $request->get->id]);
if ($sql->prepare()->execute($editValues)) {
return new Data(['success'=>true, 'message'=>L('info.updated')]);
} else {
return new Data(['success'=>false, 'message'=>L('error.unableUpdate'), 'field'=>'notice']);
}
}
public static function genTableHeader() {
$htmlContent = "";
$htmlContent .= "<thead class='thead-dark'>";
$htmlContent .= "<tr>";
$htmlContent .= "<th>".L('ID')."</th>";
$htmlContent .= "<th>".L('supplier.category')."</th>";
$htmlContent .= "<th>".L('supplier.name')."</th>";
$htmlContent .= "<th>".L('supplier.contactPerson')."</th>";
$htmlContent .= "<th>".L('supplier.contactPhone')."</th>";
$htmlContent .= "<th>".L('supplier.contactEmail')."</th>";
$htmlContent .= "<th>".L('Status')."</th>";
$htmlContent .= "<th>".L('Actions')."</th>";
$htmlContent .= "</tr>";
$htmlContent .= "</thead>";
return $htmlContent;
}
public static function genTableFooter() {
$htmlContent = "";
$htmlContent .= "<tfoot>";
$htmlContent .= "<tr>";
$htmlContent .= "<th>".L('ID')."</th>";
$htmlContent .= "<th>".L('supplier.category')."</th>";
$htmlContent .= "<th>".L('supplier.name')."</th>";
$htmlContent .= "<th>".L('supplier.contactPerson')."</th>";
$htmlContent .= "<th>".L('supplier.contactPhone')."</th>";
$htmlContent .= "<th>".L('supplier.contactEmail')."</th>";
$htmlContent .= "<th>".L('Status')."</th>";
$htmlContent .= "<th></th>";
$htmlContent .= "</tr>";
$htmlContent .= "</tfoot>";
return $htmlContent;
}
public static function genTableContentData() {
$sql = Sql::select(['supplier', 'supplier'])->leftJoin(['supplier_category', 'supplierCategory'], "supplier.supplierCategoryID = supplierCategory.id")->leftJoin(['status', 'status'], "supplier.status = status.id");
$sql->setFieldValue('
supplier.id id,
supplier.supplierCategoryID supplierCategoryID,
supplier.name name,
supplier.contactPerson contactPerson,
supplier.contactPhone contactPhone,
supplier.contactEmail contactEmail,
status.name statusName
');
$stm = $sql->prepare();
$stm->execute();
return $stm;
}
public static function genTableBodyRow($listObj) {
$htmlContent = "";
$htmlContent .= "<tr>";
$htmlContent .= "<td>".$listObj['id']."</td>";
$htmlContent .= "<td>".supplierCategory::find($listObj['supplierCategoryID'])->name."</td>";
$htmlContent .= "<td>".$listObj['name']."</td>";
$htmlContent .= "<td>".$listObj['contactPerson']."</td>";
$htmlContent .= "<td>".$listObj['contactPhone']."</td>";
$htmlContent .= "<td>".$listObj['contactEmail']."</td>";
$htmlContent .= "<td>".L($listObj['statusName'])."</td>";
$htmlContent .= "<td>";
$htmlContent .= "<div class='btn-group' role='group' aria-label=''>";
$htmlContent .= "<button class='btn btn-sm btn-dark btnView' type='button' data-bs-toggle='tooltip' data-bs-placement='top' title='".L('menu.inventoryMain')."' data-id='".$listObj['id']."'><i class='fas fa-sm fa-th'></i></button>";
$htmlContent .= "<button class='btn btn-sm btn-success btnEdit' type='button' data-bs-toggle='tooltip' data-bs-placement='top' title='".L('Edit')."' data-id='".$listObj['id']."'><i class='fas fa-sm fa-edit'></i></button>";
$htmlContent .= "<button class='btn btn-sm btn-danger btnDel' type='button' data-bs-toggle='tooltip' data-bs-placement='top' title='".L('Delete')."' data-id='".$listObj['id']."'><i class='fas fa-sm fa-trash-alt'></i></button>";
$htmlContent .= "</div>";
$htmlContent .= "</td>";
$htmlContent .= "</tr>";
return $htmlContent;
}
}