<?php
namespace App\Service;
use App\Entity\Slave\Product;
use App\Entity\Slave\ProductLog;
use App\Entity\Slave\ProductRegenerated;
use App\Entity\Slave\ProductTransferLog;
use App\Entity\Slave\JoinTableProductProductTransfer;
class ProductService
{
// MAGAZZINI - PRODOTTI/MATRICOLE
static public function getStatusByCondition($em, $condition){
$status = null;
switch($condition->getSlug()){
case 'new':
case 'refurbished':
case 'repaired':
case 'free':
case 'regenerated':
$status = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'available'));
break;
case 'retired':
case 'doa':
case 'lost':
case 'broken':
case 'old':
$status = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'not_available'));
break;
default: break;
}
return $status;
}
// MAGAZZINI - PRODOTTI/MATRICOLE
static public function checkProducts($file, $separator){
$row = 0;
$result = array();
if(($handle = fopen($file, "r")) !== FALSE) {
while(($data = fgetcsv($handle, 1000, $separator)) !== FALSE) {
$data = array_map("utf8_encode", $data);
if(sizeof($data) < 2){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore durante l'importazione del file; verificare di aver inserito il separatore corretto!";
break;
}
else{
if($row > 0){
$result = ProductService::checkData($data[0], "textNull", $row, "Matricola produttore"); if($result['error']) break;
$result = ProductService::checkData($data[1], "textNull", $row, "Matricola fornitore"); if($result['error']) break;
}
$row++;
}
}
fclose($handle);
}
return $result;
}
// CHECK DATA
static public function checkData($data, $type, $row, $columnName){
$result = array();
switch($type){
case 'text':
if($data == "" || $data == null || strlen($data) > 255){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
else
$result['error'] = false;
break;
case 'textNull':
if(strlen($data) > 255){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
else
$result['error'] = false;
break;
case 'zip':
if($data == "" || $data == null || strlen($data) != 5){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
else
$result['error'] = false;
break;
case 'zipNull':
if($data != "" && $data != null && strlen($data) != 5){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
else
$result['error'] = false;
break;
case 'value':
if($data == "" || $data == null || floatval(preg_replace('/,/', '.', $data)) == 0){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
else
$result['error'] = false;
break;
case 'date':
$date = date_create_from_format("d/m/Y", $data);
if($date !== false){
$result['error'] = false;
$result['date'] = $date;
}
else{
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
break;
case 'dateNull':
if($data != "" || $data != null){
$date = date_create_from_format("d/m/Y", $data);
if($date !== false){
$result['error'] = false;
$result['date'] = $date;
}
else{
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
}
else{
$result['error'] = false;
$result['date'] = '';
}
break;
case 'sex':
if($data != 'M' && $data != 'F'){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
else
$result['error'] = false;
break;
case 'fiscalcode':
if(strlen($data) != 11 && strlen($data) != 16){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
else
$result['error'] = false;
break;
case 'bool':
if($data != 0 && $data != 1){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
else
$result['error'] = false;
break;
case 'vat':
if(strlen($data) != 11){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
else
$result['error'] = false;
break;
case 'num8':
if($data != 1 && $data != 2 && $data != 3 && $data != 4 && $data != 5 && $data != 6 && $data != 7 && $data != 8){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
else
$result['error'] = false;
break;
case 'num10':
if($data != 1 && $data != 2 && $data != 3 && $data != 4 && $data != 5 && $data != 6 && $data != 7 && $data != 8 && $data != 9 && $data != 10){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
else
$result['error'] = false;
break;
case 'num33':
if($data != 1 && $data != 2 && $data != 3 && $data != 4 && $data != 5 && $data != 6 && $data != 7 && $data != 8 && $data != 9 && $data != 10 && $data != 11 && $data != 12 && $data != 13 && $data != 14 && $data != 15 && $data != 16 && $data != 17 && $data != 18 && $data != 19 && $data != 20 && $data != 21 && $data != 22 && $data != 23 && $data != 24 && $data != 25 && $data != 26 && $data != 27 && $data != 28 && $data != 29 && $data != 30 && $data != 31 && $data != 32 && $data != 33){
$result['error'] = true;
$result['msg'] = "Si è verificato un errore alla riga ".($row + 1)." nella colonna '".$columnName."'.";
}
else
$result['error'] = false;
break;
break;
}
return $result;
}
// CREO PRODOTTO
static public function createProduct($em, $model, $codeProducer, $codeSupplier, $suppliers, $status, $condition)
{
$product = new Product();
$product->setDateCreation(new \Datetime());
$product->setDateLastTransfer(new \Datetime());
$em->persist($product);
$em->flush();
$p = ProductService::updateProduct($em, $product, $model, $codeProducer, $codeSupplier, $suppliers, $status, $condition);
return $p;
}
// AGGIORNO PRODOTTO
static public function updateProduct($em, $product, $model, $codeProducer, $codeSupplier, $suppliers, $status, $condition)
{
$product->setModel($model);
if($codeProducer != '') $product->setCodeProducer($codeProducer);
if($codeSupplier != '') $product->setCodeSupplier($codeSupplier);
foreach($product->getSuppliers() as $sup) $product->removeSupplier($sup);
foreach($suppliers as $sup) $product->addSupplier($sup);
$product->setStatus($status);
$product->setActive(true);
$product->setCondition($condition);
$em->flush();
return $product;
}
// CREO JT PRODUCT TRANSFER
static public function createJtProductTransfer($em, $product, $transfer, $datetime)
{
$jtppt = new JoinTableProductProductTransfer();
$jtppt->setProduct($product);
$jtppt->setTransfer($transfer);
$jtppt->setTransferOk(false);
$em->persist($jtppt);
$em->flush();
}
// CREO TRANSFER LOG
static public function createProductTransferLog($em, $product, $transfer, $user, $warehouse, $datetime, $downloadType)
{
$ptLog = new ProductTransferLog();
$ptLog->setProduct($product);
$ptLog->setTransfer($transfer);
$ptLog->setUser($user);
$ptLog->setProductName($product->getModel()->getName().' ('.$product->getModel()->getSku().')');
$ptLog->setCodeSupplier($product->getCodeSupplier());
$ptLog->setCodeProducer($product->getCodeProducer());
if($transfer != null){
$ptLog->setWarehouseFrom($transfer->getWarehouseFrom()->getNickname());
$ptLog->setWarehouseTo($transfer->getWarehouseTo()->getNickname());
$ptLog->setDdt($transfer->getDdt());
$ptLog->setDdtPath($transfer->getDdtPath());
}
else{
$ptLog->setWarehouseFrom($product->getActualWarehouse()->getNickname());
$ptLog->setWarehouseTo($warehouse->getNickname());
}
$ptLog->setUserName($user->getProfile()->getName().' '.$user->getProfile()->getSurname());
$ptLog->setDownloadType($downloadType);
$ptLog->setDatetime($datetime);
$em->persist($ptLog);
$em->flush();
}
static public function createProductTransferBackLog($em, $product, $transfer, $user, $warehouse, $datetime, $downloadType)
{
$ptLog = new ProductTransferLog();
$ptLog->setProduct($product);
$ptLog->setTransfer($transfer);
$ptLog->setUser($user);
$ptLog->setProductName($product->getModel()->getName().' ('.$product->getModel()->getSku().')');
$ptLog->setCodeSupplier($product->getCodeSupplier());
$ptLog->setCodeProducer($product->getCodeProducer());
$ptLog->setWarehouseFrom($transfer->getWarehouseTo()->getNickname());
$ptLog->setWarehouseTo($transfer->getWarehouseFrom()->getNickname());
$ptLog->setDdt($transfer->getDdt());
$ptLog->setDdtPath($transfer->getDdtPath());
$ptLog->setUserName($user->getProfile()->getName().' '.$user->getProfile()->getSurname());
$ptLog->setDownloadType($downloadType);
$ptLog->setDatetime($datetime);
$em->persist($ptLog);
$em->flush();
}
static public function createProductTransferLogClient($em, $product, $user, $warehouseFrom, $warehouseTo, $datetime, $downloadType)
{
$ptLog = new ProductTransferLog();
$ptLog->setProduct($product);
$ptLog->setTransfer(null);
$ptLog->setUser($user);
$ptLog->setProductName($product->getModel()->getName().' ('.$product->getModel()->getSku().')');
$ptLog->setCodeSupplier($product->getCodeSupplier());
$ptLog->setCodeProducer($product->getCodeProducer());
$ptLog->setWarehouseFrom($warehouseFrom->__toString());
$ptLog->setWarehouseTo($warehouseTo->__toString());
$ptLog->setUserName($user->getProfile()->getName().' '.$user->getProfile()->getSurname());
$ptLog->setDownloadType($downloadType);
$ptLog->setDatetime($datetime);
$ptLog->setDdt(null);
$ptLog->setDdtPath(null);
$em->persist($ptLog);
$em->flush();
}
// SPOSTA PRODOTTO
static public function moveProductTransfer($em, $jtppt, $user, $status)
{
$product = $jtppt->getProduct();
ProductService::createProductLog($em, $product, $user, 'status', $status->getValue(), null, $product->getStatus()->getId());
$product->setStatus($status);
$product->setActualWarehouse($jtppt->getTransfer()->getWarehouseTo());
$product->setDateLastTransfer(new \Datetime());
$jtppt->setTransferOk(true);
$em->flush();
}
static public function moveProductClient($em, $product, $warehouse)
{
$product->setActualWarehouse($warehouse);
$product->setDateLastTransfer(new \Datetime());
$em->flush();
}
// CREO LOG
static public function createProductLog($em, $product, $user, $type, $newValue, $intervention, $oldDataId)
{
$text = '<table class="table table_no_padding b_none m_b_none"><tr><th class="td_w_70p">Utente</th><td>'.$user.'</td></tr><tr><th>Prodotto</th><td>'.$product.'</td></tr>';
switch($type){
case 'status':
$oldStatus = $em->getRepository("App\Entity\Slave\ProductStatus")->findOneById($oldDataId);
$text.= '<tr><th>Modifica a</th><td>Stato</td><tr><th>Da</th><td>'.$oldStatus->getValue().'</td></tr><tr><th>A</th><td>'.$newValue.'</td></th></tr>'; break;
case 'condition':
$oldCondition = $em->getRepository("App\Entity\Slave\ProductCondition")->findOneById($oldDataId);
$text.= '<tr><th>Modifica a</th><td>Condizione</td><tr><th>Da</th><td>'.$oldCondition->getValue().'</td></tr><tr><th>A</th><td>'.$newValue.'</td></th></tr>'; break;
case 'code-producer':
$oldCode = $product->getCodeProducer();
$text.= '<tr><th>Modifica a</th><td>Codice produttore</td><tr><th>Da</th><td>'.$oldCode.'</td></tr><tr><th>A</th><td>'.$newValue.'</td></th></tr>'; break;
case 'code-supplier':
$oldCode = $product->getCodeSupplier();
$text.= '<tr><th>Modifica a</th><td>Codice fornitore</td><tr><th>Da</th><td>'.$oldCode.'</td></tr><tr><th>A</th><td>'.$newValue.'</td></th></tr>'; break;
default: break;
}
$text.='</table>';
$productLog = new ProductLog();
$productLog->setProduct($product);
$productLog->setDatetime(new \Datetime());
$productLog->setType($type);
$productLog->setText($text);
$productLog->setIntervention($intervention);
$productLog->setOldDataId($oldDataId);
$em->persist($productLog);
$em->flush();
}
// CAMBIA CONDIZIONE E STATO DI CONSEGUENZA
static public function productChangeCondition($em, $user, $product, $newCondition)
{
$statusAvailable = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'available'));
$statusNotAvailable = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBy(array('slug' => 'not_available'));
ProductService::createProductLog($em, $product, $user, 'condition', $newCondition->getValue(), null, $product->getCondition()->getId());
$product->setCondition($newCondition);
// Se STATO non "In trasferimento" e non "In uso"
if($product->getStatus()->getSlug() != 'transfer' && $product->getStatus()->getSlug() != 'in_use'){
// Se CONDIZIONE NUOVA "Disponibile" (Nuovo / Ricondizionato / Riparato / Svincolato / Rigenerato) e STATO "Non disponibile"
if($newCondition->isStatusAvailable() && $product->getStatus()->getSlug() == "not_available"){
ProductService::createProductLog($em, $product, $user, 'status', $statusAvailable->getValue(), null, $product->getStatus()->getId());
$product->setStatus($statusAvailable);
if($newCondition->getSlug() == 'regenerated')
ProductService::createProductRegenerated($em, $user, $product);
}
// Se CONDIZIONE "Non disponibile" (Guasto / Ritirato / DOA / Smarrito / Storico) e STATO "Disponibile"
elseif(!$newCondition->isStatusAvailable() && $product->getStatus()->getSlug() == "available"){
ProductService::createProductLog($em, $product, $user, 'status', $statusNotAvailable->getValue(), null, $product->getStatus()->getId());
$product->setStatus($statusNotAvailable);
}
}
$em->flush();
}
// CREO PRODOTTO DA RIGENERARE
static public function createProductRegenerated($em, $user, $product)
{
$productRegenerated = new ProductRegenerated();
$productRegenerated->setProduct($product);
$productRegenerated->setDatetime(new \Datetime());
$em->persist($productRegenerated);
if(sizeof($product->getSuppliers()) == 1){
$productRegenerated->setSupplier($product->getSuppliers()[0]);
}
$em->flush();
}
}