Files
pedidor/inc/pedidor.php
2015-12-25 20:30:06 +01:00

328 lines
10 KiB
PHP
Executable File
Raw Permalink Blame History

<?php
/**
* Main Class
* @author franzz
* @version 0.1
*/
class Pedidor extends Main
{
//SQL tables
const USER_TABLE = 'users';
const MATL_TABLE = 'materials';
const MA_TY_TABLE = 'mat_types';
const ORDER_TABLE = 'orders';
//SQL commands
const INSERT = 'insert';
const UPDATE = 'update';
const DELETE = 'delete';
private $oAuth;
public function __construct($oClassManagement, $sProcessPage)
{
//Load classes
$oClassManagement->incClass('auth', true);
parent::__construct($oClassManagement, $sProcessPage);
//Init objects
$this->oAuth = new Auth($this->oMySql, Settings::API_KEY);
}
protected function install()
{
$this->oAuth = new Auth($this->oMySql, Settings::API_KEY, false);
//Install DB
$this->oMySql->install();
//Add user
$this->addUser('clara');
$this->addUser('franzz');
$this->addUser('micro');
//Add products
$this->uploadProducts();
}
/* Authorizations handling */
public function isLoggedIn()
{
return $this->oAuth->isLoggedIn();
}
public function logMeIn($sToken)
{
return $this->oAuth->logMeIn($sToken);
}
public function checkApiKey($sApiKey)
{
return $this->oAuth->checkApiKey($sApiKey);
}
/* Building main pages */
public function getPage($bLoggedIn)
{
//Constants
$asPages = array_values($this->asMasks);
unset($asPages['index']);
foreach($asPages as $sPage) $asGlobalVars['consts']['pages'][$sPage] = $this->getPageContent($sPage);
$asGlobalVars['consts']['page_to_hash'] = array('logon'=>'connectarse', 'add_order'=>'crear_pedido', 'orders'=>'pedidos', 'products'=>'productos');
$asGlobalVars['consts']['hash_to_page'] = array_flip($asGlobalVars['consts']['page_to_hash']);
$asGlobalVars['consts']['token_sep'] = Auth::TOKEN_SEP;
$asGlobalVars['consts']['error'] = self::ERROR;
$asGlobalVars['consts']['success'] = self::SUCCESS;
$asGlobalVars['consts']['context'] = $this->asContext;
$asGlobalVars['consts']['process_page'] = $this->asContext['process_page'];
$asGlobalVars['consts']['rest'] = array('insert'=>self::INSERT, 'update'=>self::UPDATE, 'remove'=>self::DELETE);
$asGlobalVars['vars']['id'] = $this->oAuth->getUserId();
$asGlobalVars['vars']['log_in'] = $bLoggedIn;
//Main Page
$sPage = $this->getPageContent('index');
$sPage = str_replace('asGlobalVars', json_encode($asGlobalVars), $sPage);
return $sPage;
}
/* DB structure. See MySqlManager::__construct */
protected function getSqlOptions()
{
return array
(
'tables' => array
(
self::USER_TABLE => array(MySqlManager::getText(self::USER_TABLE), 'first_name', 'last_name', 'email', 'pass', 'cookie', 'active', 'clearance'),
self::MATL_TABLE => array('z_code', MySqlManager::getText(self::MATL_TABLE), MySqlManager::getId(self::MA_TY_TABLE), 'price', 'format', 'active'),
self::MA_TY_TABLE => array(MySqlManager::getText(self::MA_TY_TABLE), 'active')
),
'types' => array
(
MySqlManager::getText(self::USER_TABLE) => "varchar(30) NOT NULL",
'first_name' => "varchar(20) NOT NULL",
'last_name' => "varchar(20) NOT NULL",
'email' => "varchar(100) NOT NULL",
'pass' => "varchar(255) NOT NULL",
'cookie' => "varchar(255) NOT NULL",
'active' => "tinyint(1) DEFAULT ".Auth::MEMBER_ACTIVE,
'clearance' => "int(1) DEFAULT ".Auth::CLEARANCE_MEMBER,
'z_code' => "varchar(20)",
MySqlManager::getText(self::MATL_TABLE) => "varchar(200) NOT NULL",
MySqlManager::getText(self::MA_TY_TABLE) => "varchar(200) NOT NULL",
'price' => "DECIMAL(10, 2)",
'active' => "BOOLEAN",
'format' => "tinyint(10)"
),
'constraints' => array
(
self::USER_TABLE => "UNIQUE KEY `user_user` (`".MySqlManager::getText(self::USER_TABLE)."`, `last_name`)"
//self::MATL_TABLE => "UNIQUE KEY `uni_zeta` (`z_code`)",
)/*,
'cascading_delete' => array
(
self::USER_TABLE=>array(self::SETTINGS_TABLE)
)*/
);
}
/* Pedidor public functions */
public function getProducts($iMatId=0, $bInternal=false, $bActiveFilter=true)
{
$sMatIdCol = MySqlManager::getId(self::MATL_TABLE);
$sMatTypeIdCol = MySqlManager::getId(self::MA_TY_TABLE);
$sMatTypeTextCol = MySqlManager::getText(self::MA_TY_TABLE);
$asContraints = array();
if($bActiveFilter) $asContraints['active'] = self::ACTIVE;
$bValidMat = ($iMatId > 0);
if($bValidMat) $asContraints[$sMatIdCol] = $iMatId;
$asInfo = array('from' => self::MATL_TABLE,
'constraint'=> $asContraints);
$asProducts = $this->oMySql->selectRows($asInfo);
$asMatTypes = $this->oMySql->selectRows(array('select'=>array($sMatTypeIdCol.' AS id', $sMatTypeTextCol.' AS text'), 'from'=>self::MA_TY_TABLE, 'constraint'=> array('active'=>self::ACTIVE)));
foreach($asMatTypes as $asMatType) $asDirectMatTypes[$asMatType['id']] = $asMatType['text'];
$asResult = array();
foreach($asProducts as $asProduct)
{
$asResult[] = array('id' => $asProduct[$sMatIdCol],
'Categoria' => $asProduct[$sMatTypeIdCol],
'Codigo Zeta' => $asProduct['z_code'],
$sMatTypeTextCol=> $asDirectMatTypes[$asProduct[$sMatTypeIdCol]],
'Producto' => self::getTitle($asProduct[MySqlManager::getText(self::MATL_TABLE)]),
//'safe' => self::getSafe($asProduct[MySqlManager::getText(self::MATL_TABLE)]),
'Precio' => $asProduct['price']
);
}
return $bInternal?($bValidMat?$asResult[0]:$asResult):self::getJsonResult(true, 'products', array('products'=>$asResult, 'mat_types'=>$asMatTypes));
}
public function modifyProduct($sActionType, $asProduct)
{
$iMatId = $asProduct['id'];
$iMatTypeId = $asProduct['Categoria'];
$sZeta = $asProduct['Codigo Zeta'];
$sMatDesc = $asProduct['Producto'];
$dPrice = $asProduct['Precio'];
$asResult = array();
switch($sActionType)
{
case self::INSERT:
$iMatId = $this->insertProduct($sZeta, $sMatDesc, $iMatTypeId, $dPrice);
break;
case self::UPDATE:
$iMatId = $this->oMySql->updateRow(self::MATL_TABLE, $iMatId, array('z_code'=>$sZeta,
MySqlManager::getText(self::MATL_TABLE)=>$sMatDesc,
MySqlManager::getId(self::MA_TY_TABLE)=>$iMatTypeId,
'price'=>$dPrice));
break;
case self::DELETE:
$iMatId = $this->oMySql->updateRow(self::MATL_TABLE, $iMatId, array('active'=>self::INACTIVE));
break;
}
$asResult = $this->getProducts($iMatId, true, false);
return self::getJsonResult(true, $sActionType.' product', $asResult);
}
public function downloadProducts()
{
$this->oClassManagement->incClass('phpexcel', true);
$asProducts = $this->getProducts(0, true);
//Filter columns
foreach($asProducts as $iRow=>$asProduct)
{
foreach($asProduct as $sFieldName=>$sFieldValue)
{
$sFirstChar = mb_substr($sFieldName, 0, 1);
if(mb_strtoupper($sFirstChar) == $sFirstChar) //Capital Letter = Interface column
{
if($iRow == 0) $asTitles[] = $sFieldName;
if($sFieldName == 'Categoria') $sFieldValue = $asProduct['mat_type']; //replacing MD
if($sFieldName == 'Precio') $sFieldValue = str_replace('.', ',', $sFieldValue);
$asFilteredProducts[$iRow][] = $sFieldValue;
}
}
}
//Add titles
array_unshift($asFilteredProducts, $asTitles);
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// Set document properties
$objPHPExcel->getProperties()->setCreator("Pedidor")
->setLastModifiedBy("Pedidor")
->setTitle("Productos")
->setSubject("Productos")
->setDescription("Lista de productos (micro)")
->setKeywords("micro lista productos")
->setCategory("productos");
$objPHPExcel->setActiveSheetIndex(0);
foreach($asFilteredProducts as $iRow=>$asProduct)
{
foreach($asProduct as $iCol=>$sValue)
{
$objPHPExcel->getActiveSheet()->setCellValueExplicitByColumnAndRow($iCol, $iRow+1, $sValue);
$objPHPExcel->getActiveSheet()->getColumnDimensionByColumn($iCol)->setAutoSize(true);
}
}
// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Productos');
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
// Redirect output to a client<6E>s web browser (Excel2007)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="productos.xlsx"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
exit;
}
/* Pedidor private functions */
private function addUser($sNickName, $bLogMeIn=false)
{
return $this->oAuth->addUser($sNickName, $sNickName);
}
private function uploadProducts()
{
$sZetasFileName = 'files/zetas.csv';
$asZetas = explode("\n", Toolbox::fixEOL(file_get_contents($sZetasFileName)));
foreach($asZetas as $sLine)
{
$asZeta = explode(';', $sLine);
$sZeta = $asZeta[0];
$sTypeDesc = $asZeta[1];
$sDesc = $asZeta[2];
$asMatType = array( MySqlManager::getText(self::MA_TY_TABLE)=>$sTypeDesc,
'active'=>self::ACTIVE);
$iMatTypeId = $this->oMySql->insertUpdateRow(self::MA_TY_TABLE, $asMatType, array(MySqlManager::getText(self::MA_TY_TABLE)), false);
$this->insertProduct($sZeta, $sDesc, $iMatTypeId);
}
}
private function insertProduct($sZeta, $sMatDesc, $iMatTypeId, $dPrice=0.01)
{
$asMaterial = array('z_code'=>$sZeta,
MySqlManager::getText(self::MATL_TABLE)=>$sMatDesc,
MySqlManager::getId(self::MA_TY_TABLE)=>$iMatTypeId,
'price'=>$dPrice,
'active'=>self::ACTIVE);
return $this->oMySql->insertRow(Pedidor::MATL_TABLE, $asMaterial);
}
/* Static toolbox functions */
public static function getSafe($sText)
{
return mb_strtolower(Toolbox::remove_accents($sText));
}
public Static function getTitle($sTitle)
{
return Toolbox::mb_ucfirst($sTitle);
}
}
?>