<?php
namespace App\Controller\User;
use App\Entity\Slave\JoinTableProductModelSupplier;
use App\Entity\Slave\Product;
use App\Entity\Slave\ProductCategory;
use App\Entity\Slave\ProductComponent;
use App\Entity\Slave\ProductModel;
use App\Entity\Slave\ProductSubcategory;
use App\Form\Model\RegenerateSupplier;
use App\Form\Slave\JoinTableProductModelSupplierType;
use App\Form\Slave\ProductCodeType;
use App\Form\Slave\ProductDataType;
use App\Form\Slave\ProductCategoryType;
use App\Form\Slave\ProductComponentType;
use App\Form\Slave\ProductModelEditType;
use App\Form\Slave\ProductModelNewType;
use App\Form\Slave\ProductModelSuppliersEditType;
use App\Form\Slave\ProductSubcategoryType;
use App\Form\Slave\RegenerateSupplierType;
use App\Service\FilterService;
use App\Service\FormValidatorService;
use App\Service\MediaService;
use App\Service\ProductService;
use App\Service\UtilitiesService;
use App\Service\ValidationService;
use Doctrine\Persistence\ManagerRegistry;
use Knp\Component\Pager\PaginatorInterface;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
/**
* @Route("/scrivania/prodotti")
* @Security("is_granted('ROLE_USER') and is_granted('active', user) && is_granted('view', 'product')")
*/
class UserProductController extends AbstractController
{
private $mr;
private $params;
public function __construct(ManagerRegistry $mr, ParameterBagInterface $params)
{
$this->mr = $mr;
$this->params = $params;
}
public function exportProducts($products)
{
$response = new StreamedResponse();
$response->setCallback(function() use($products) {
$handle = fopen('php://output', 'w+');
fputcsv($handle, array('Pos', 'Modello', 'Fornitori', 'Matricola produttore', 'Matricola fornitore', 'Termid', 'Stato', 'Condizione', 'Magazzino attuale', 'DDT', 'Data importazione', 'Data ultimo trasferimento', 'EPOSM id'), ";", '"', "\\");
foreach($products as $p){
$pos = 'No';
$model = '---';
$suppliers = '---';
$codeProducer = '';
$codeSupplier = '';
$termid = '---';
$status = '---';
$condition = '---';
$warehouse = '---';
$ddts = '---';
$dateImport = '---';
$dateLastTransfer = '---';
if($p->getModel()->getSubcategory()->getCategory()->isPos()) $pos = 'Si';
$model = $p->getModel()->getName().' - '.$p->getModel()->getSubcategory()->getName().' - '.$p->getModel()->getSubcategory()->getCategory()->getName();
if(sizeof($p->getSuppliers()) > 0){
$suppliers = "";
$first = true;
foreach($p->getSuppliers() as $s){
if($first) $first = false; else $suppliers.= ', ';
$suppliers.= $s->getName();
}
}
if($p->getCodeProducer() != null) $codeProducer = $p->getCodeProducer();
if($p->getCodeSupplier() != null) $codeSupplier = $p->getCodeSupplier();
if($p->getTermid() != null) $termid = $p->getTermid()->getCode();
if($p->getStatus() != null) $status = $p->getStatus()->getValue();
if($p->getCondition() != null) $condition = $p->getCondition()->getValue();
if($p->getActualWarehouse() != null) $warehouse = $p->getActualWarehouse()->getNickname();
if($p->getDateCreation() != null) $dateImport = $p->getDateCreation()->format('d-m-Y');
if($p->getDateLastTransfer() != null) $dateLastTransfer = $p->getDateLastTransfer()->format('d-m-Y H:i');
$ddts = $p->displayTransfersDdts();
fputcsv($handle, array($pos, $model, $suppliers, $codeProducer, $codeSupplier, $termid, $status, $condition, $warehouse, $ddts, $dateImport, $dateLastTransfer, $p->getId()), ";", '"', "\\");
}
fclose($handle);
});
$response->setStatusCode(200);
$dispositionHeader = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'Elenco prodotti.csv');
$response->headers->set('Content-Type', 'text/csv; charset=ISO-8859-15');
$response->headers->set('Content-Disposition', $dispositionHeader);
return $response;
}
public function exportStationaryProducts($products)
{
$response = new StreamedResponse();
$response->setCallback(function() use($products) {
$handle = fopen('php://output', 'w+');
fputcsv($handle, array('Pos', 'Modello', 'Fornitori', 'Matricola produttore', 'Matricola fornitore', 'Stato', 'Condizione', 'Magazzino attuale', 'DDT', 'Data ultimo trasferimento', 'EPOSM id'), ";", '"', "\\");
foreach($products as $p){
$pos = 'No';
$model = '---';
$suppliers = '---';
$codeProducer = '';
$codeSupplier = '';
$status = '---';
$condition = '---';
$warehouse = '---';
$ddts = '---';
$dateLastTransfer = '---';
if($p->getModel()->getSubcategory()->getCategory()->isPos()) $pos = 'Si';
$model = $p->getModel()->getName().' - '.$p->getModel()->getSubcategory()->getName().' - '.$p->getModel()->getSubcategory()->getCategory()->getName();
if(sizeof($p->getSuppliers()) > 0){
$suppliers = "";
$first = true;
foreach($p->getSuppliers() as $s){
if($first) $first = false; else $suppliers.= ', ';
$suppliers.= $s->getName();
}
}
if($p->getCodeProducer() != null) $codeProducer = $p->getCodeProducer();
if($p->getCodeSupplier() != null) $codeSupplier = $p->getCodeSupplier();
if($p->getStatus() != null) $status = $p->getStatus()->getValue();
if($p->getCondition() != null) $condition = $p->getCondition()->getValue();
if($p->getActualWarehouse() != null) $warehouse = $p->getActualWarehouse()->getNickname();
if($p->getDateLastTransfer() != null) $dateLastTransfer = $p->getDateLastTransfer()->format('d-m-Y H:i');
$ddts = $p->displayTransfersDdts();
fputcsv($handle, array($pos, $model, $suppliers, $codeProducer, $codeSupplier, $status, $condition, $warehouse, $ddts, $dateLastTransfer, $p->getId()), ";", '"', "\\");
}
fclose($handle);
});
$response->setStatusCode(200);
$dispositionHeader = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'Elenco prodotti.csv');
$response->headers->set('Content-Type', 'text/csv; charset=ISO-8859-15');
$response->headers->set('Content-Disposition', $dispositionHeader);
return $response;
}
public function exportRegeneratedProducts($rps)
{
$response = new StreamedResponse();
$response->setCallback(function() use($rps) {
$handle = fopen('php://output', 'w+');
fputcsv($handle, array('Data rigenerazione', 'Modello', 'Matricola produttore', 'Matricola fornitore', 'Fornitore', 'Ammontare'), ";", '"', "\\");
foreach($rps as $rp){
$datetime = $rp->getDatetime()->format("d-m-Y H:i:s");
$model = '---';
$codeProducer = '';
$codeSupplier = '';
$supplier = '---';
$amount = '---';
if($rp->getProduct() != null) $model = $rp->getProduct()->getModel()->getName();
if($rp->getProduct()->getCodeProducer() != null) $codeProducer = $rp->getProduct()->getCodeProducer();
if($rp->getProduct()->getCodeSupplier() != null) $codeSupplier = $rp->getProduct()->getCodeSupplier();
if($rp->getSupplier() != null) $supplier = $rp->getSupplier()->getName();
if($rp->getSupplier() != null) $amount = $rp->getSupplier()->getAmountRegenerate();
fputcsv($handle, array($datetime, $model, $codeProducer, $codeSupplier, $supplier, $amount), ";", '"', "\\");
}
fclose($handle);
});
$response->setStatusCode(200);
$dispositionHeader = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'Elenco prodotti rigenerati.csv');
$response->headers->set('Content-Type', 'text/csv; charset=ISO-8859-15');
$response->headers->set('Content-Disposition', $dispositionHeader);
return $response;
}
/**
* @Route("/", name="user_products")
* @Security("is_granted('view', 'product')")
*/
public function userProducts(Request $request)
{
return $this->render('role/user/product/index.html.twig');
}
// PRODOTTI
/**
* @Route("/ricerca", name="user_product_search")
* @Security("is_granted('view', 'product')")
*/
public function userProductList(Request $request, ValidatorInterface $validator, PaginatorInterface $paginator, FormFactoryInterface $formFactory)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$suppliers = $em->getRepository("App\Entity\Slave\Supplier")->findAllActiveOrdered();
$filters = FilterService::productFilter($request);
if($session->get('codeProducer') != null){
$filters['codeProducer'] = $session->get('codeProducer');
$session->remove('codeProducer');
}
if($session->get('codeSupplier') != null){
$filters['codeSupplier'] = $session->get('codeSupplier');
$session->remove('codeSupplier');
}
$productsQuery = $em->getRepository("App\Entity\Slave\Product")->findFiltered(true, $filters);
$productsCountQuery = clone $productsQuery;
$products = $paginator->paginate($productsQuery, $request->getSession()->get($request->get("_route")."_page"), 50);
$productModels = $em->getRepository('App\Entity\Slave\ProductModel')->findAllOrdered();
return $this->render('role/user/product/search.html.twig', [
"filters" => $filters,
"products" => $products,
"suppliers" => $suppliers,
"productModels" => $productModels
]);
}
/**
* @Route("/ricerca/esporta-filtro-csv", name="user_product_search_filter_export")
* @Security("is_granted('view', 'product')")
*/
public function userProductSearchFilterExport(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$filters = $session->get('user_product_search_filters');
$products = $em->getRepository("App\Entity\Slave\Product")->findFiltered(false, $filters);
return $this->exportProducts($products);
}
/**
* @Route("/ricerca/esporta-per-invio", name="user_product_search_for_send_export")
* @Security("is_granted('view', 'product')")
*/
public function userProductSearchForSendExport(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$filters = $session->get('user_product_search_filters');
$products = $em->getRepository("App\Entity\Slave\Product")->findFiltered(false, $filters);
$response = new StreamedResponse();
$response->setCallback(function() use($products) {
$handle = fopen('php://output', 'w+');
fputcsv($handle, array('Matricola produttore', 'Matricola fornitore'), ";", '"', "\\");
foreach($products as $p){
$codeProducer = '';
$codeSupplier = '';
if($p->getCodeProducer() != null) $codeProducer = $p->getCodeProducer();
if($p->getCodeSupplier() != null) $codeSupplier = $p->getCodeSupplier();
fputcsv($handle, array($codeProducer, $codeSupplier), ";", '"', "\\");
}
fclose($handle);
});
$response->setStatusCode(200);
$dispositionHeader = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'Elenco prodotti per invio.csv');
$response->headers->set('Content-Type', 'text/csv; charset=ISO-8859-15');
$response->headers->set('Content-Disposition', $dispositionHeader);
return $response;
}
/**
* @Route("/ricerca/selezione-multipla-azione", name="user_product_multiple_select_action")
* @Security("is_granted('edit', 'product')")
*/
public function userProductMultipleSelectAction(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$productIds = explode(',', $request->request->get('ids'));
$action = $request->request->get('action');
switch($action){
case 'model':
$productModel = $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($request->request->get('productModelId'));
foreach($productIds as $id){
$product = $em->getRepository('App\Entity\Slave\Product')->findOneById($id);
$product->setModel($productModel);
}
$em->flush();
$this->addFlash('notice_success', 'Modello prodotti aggiornato!');
return $this->redirectToRoute('user_product_search');
break;
case 'delete':
$countDeleted = 0;
$countIgnored = 0;
foreach($productIds as $id){
$product = $em->getRepository('App\Entity\Slave\Product')->findOneById($id);
if($product->canDelete()){
foreach($product->getTransfers() as $jt) $em->remove($jt);
foreach($product->getTransferLogs() as $tLog) $em->remove($tLog);
foreach($product->getLogs() as $log) $em->remove($log);
$em->remove($product);
$countDeleted++;
}
else{
$countIgnored++;
}
}
$em->flush();
$this->addFlash('notice_success', 'Eliminati '.$countDeleted.' prodotti e ignorati '.$countIgnored.' prodotti non eliminabili!');
return $this->redirectToRoute('user_product_search');
break;
case 'export':
$products = array();
foreach($productIds as $id){
$p = $em->getRepository('App\Entity\Slave\Product')->findOneById($id);
array_push($products, $p);
}
return $this->exportProducts($products);
break;
default: break;
}
}
/**
* @Route("/{productId}/scheda", name="user_product_sheet")
* @Security("is_granted('view', 'product')")
*/
public function userProductSheet($productId, Request $request, ValidatorInterface $validator, FormFactoryInterface $formFactory, UserPasswordHasherInterface $passwordHasher)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$product = $em->getRepository("App\Entity\Slave\Product")->findOneById($productId);
$stCoLogs = array();
$codeLogs = array();
foreach($product->getLogs() as $log){
switch($log->getType()){
case 'status':
case 'condition':
array_push($stCoLogs, $log);
break;
case 'code-producer':
case 'code-supplier':
array_push($codeLogs, $log);
break;
default: break;
}
}
$oldConditionId = $product->getCondition()->getId();
$oldStatusId = $product->getStatus()->getId();
// Modifica dati
$formData = $formFactory->createNamed("form_product_data_edit", ProductDataType::class, $product);
$formData->handleRequest($request);
if($formData->isSubmitted()){
if($formData->isValid()){
if($formData->get('condition')->getData()->getId() != $oldConditionId){
ProductService::productChangeCondition($em, $this->getUser(), $product, $formData->get('condition')->getData());
}
$em->flush();
$this->addFlash('notice_success', "Dati prodotto aggiornati!");
return $this->redirectToRoute('user_product_sheet', array('productId' => $product->getId()));
}
else{
$session->set('openEditDataModal', true);
$session->set('openEditDataModalId', $request->request('productCodeEditId'));
}
}
// Modifica codici
$formCode = $formFactory->createNamed("form_product_code_edit", ProductCodeType::class, $product);
$formCode->handleRequest($request);
if($formCode->isSubmitted()){
$valid = ValidationService::validateNotBlank($validator, $formCode->get('password'));
if($valid && !($passwordHasher->isPasswordValid($this->getUser(), $formCode->get('password')->getData()))){
$valid = false;
$formCode->get('password')->addError(new FormError('Password errata!'));
}
if($valid && ($formCode->get('codeProducer')->getData() == null && $formCode->get('codeSupplier')->getData() == null)){
$valid = false;
$formCode->get('codeProducer')->addError(new FormError('Inserisci almeno un codice matricola!'));
$formCode->get('codeSupplier')->addError(new FormError('Inserisci almeno un codice matricola!'));
}
if($valid) $valid = ValidationService::validateNotBlankType3($validator, $formCode->get('warehouseId'), $formCode->get('warehouseSearchNickname'), $formCode->get('warehouseSearchTermid'));
if($valid && $formCode->get('codeProducer')->getData() != '') {
$prod = $em->getRepository('App\Entity\Slave\Product')->findOneBy(['codeProducer' => $formCode->get('codeProducer')->getData()]);
if($prod != null && $prod->getId() != $product->getId()){
$valid = false;
$formCode->get('codeProducer')->addError(new FormError('Esiste già un altro prodotto con la matricola '.$formCode->get('codeProducer')->getData().'!'));
}
}
if($valid && $formCode->get('codeSupplier')->getData() != '') {
$prod = $em->getRepository('App\Entity\Slave\Product')->findOneBy(['codeSupplier' => $formCode->get('codeSupplier')->getData()]);
if($prod != null && $prod->getId() != $product->getId()){
$valid = false;
$formCode->get('codeSupplier')->addError(new FormError('Esiste già un altro prodotto con la matricola '.$formCode->get('codeSupplier')->getData().'!'));
}
}
if($valid && $formCode->isValid()){
if($product->getCodeProducer() != $formCode->get('codeProducer')->getData()){
ProductService::createProductLog($em, $product, $this->getUser(), null, 'code-producer', $product->getCodeProducer(), $formCode->get('codeProducer')->getData());
$product->setCodeProducer($formCode->get('codeProducer')->getData());
}
if($product->getCodeSupplier() != $formCode->get('codeSupplier')->getData()){
ProductService::createProductLog($em, $product, $this->getUser(), null, 'code-supplier', $product->getCodeSupplier(), $formCode->get('codeSupplier')->getData());
$product->setCodeSupplier($formCode->get('codeSupplier')->getData());
}
if($product->getActualWarehouse()->getId() != $formCode->get('warehouseId')->getData()){
$fromClient = false;
$toClient = false;
if($product->getActualWarehouse()->getClient() != null)
$fromClient = true;
$newWarehouse = $em->getRepository('App\Entity\Slave\Warehouse')->findOneById($formCode->get('warehouseId')->getData());
if($newWarehouse->getClient() != null)
$toClient = true;
if($fromClient != $toClient){
$oldCondition = $product->getCondition();
$oldStatus = $product->getStatus();
$statusInUse = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBySlug("in_use");
$statusNotAvailable = $em->getRepository('App\Entity\Slave\ProductStatus')->findOneBySlug("not_available");
$conditionRetired = $em->getRepository('App\Entity\Slave\ProductCondition')->findOneBySlug("retired");
$conditionFree = $em->getRepository('App\Entity\Slave\ProductCondition')->findOneBySlug("free");
if($fromClient){
$product->setStatus($statusNotAvailable);
$product->setCondition($conditionRetired);
if($oldStatus->getId() != $statusNotAvailable->getId())
ProductService::createProductLog($em, $product, $this->getUser(), null, 'status', $oldStatus->getValue(), $statusNotAvailable->getValue());
if($oldCondition->getId() != $conditionRetired->getId())
ProductService::createProductLog($em, $product, $this->getUser(), null, 'condition', $oldCondition->getValue(), $conditionRetired->getValue());
}
else{
$product->setStatus($statusInUse);
$product->setCondition($conditionFree);
if($oldStatus->getId() != $statusInUse->getId())
ProductService::createProductLog($em, $product, $this->getUser(), null, 'status', $oldStatus->getValue(), $statusInUse->getValue());
if($oldCondition->getId() != $conditionFree->getId())
ProductService::createProductLog($em, $product, $this->getUser(), null, 'condition', $oldCondition->getValue(), $conditionFree->getValue());
}
}
ProductService::createProductTransferLog($em, $product, null, $this->getUser(), $newWarehouse, new \Datetime(), 'forced_password');
$product->setActualWarehouse($newWarehouse);
$product->setDateLastTransfer(new \Datetime());
$product->isToManage(false);
$product->setToManagePriority(0);
}
$em->flush();
$this->addFlash('notice_success', "Dati prodotto aggiornati!");
return $this->redirectToRoute('user_product_sheet', array('productId' => $product->getId()));
}
else{
$session->set('openEditCodeModal', true);
$session->set('openEditCodeModalId', $request->request->get('productDataEditId'));
}
}
return $this->render('role/user/product/sheet.html.twig', [
"company" => $company,
"product" => $product,
"stCoLogs" => $stCoLogs,
"codeLogs" => $codeLogs,
"formCode" => $formCode->createView(),
"formData" => $formData->createView()
]);
}
/**
* @Route("/aggiorna-stato", name="user_product_change_active")
* @Security("is_granted('edit', 'product')")
*/
public function userAnagraphicProductChangeActive(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$product = $em->getRepository("App\Entity\Slave\Product")->findOneById($request->request->get("productChangeId"));
$product->setActive(!$product->isActive());
$em->flush();
$this->addFlash('notice_success', "Stato aggiornato");
return $this->redirectToRoute('user_product_search');
}
/**
* @Route("/elimina", name="user_product_search_delete")
* @Security("is_granted('edit', 'product')")
*/
public function userProductListDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$product = $em->getRepository("App\Entity\Slave\Product")->findOneById($request->request->get("productDelId"));
$em->remove($product);
$em->flush();
$this->addFlash('notice_success', "Prodotto eliminato");
return $this->redirectToRoute('user_product_search');
}
/**
* @Route("/fermi", name="user_product_stationary")
* @Security("is_granted('edit', 'product')")
*/
public function userProductStationary(Request $request, PaginatorInterface $paginator, FormFactoryInterface $formFactory, ValidatorInterface $validator)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$settingDaysStationary = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'days_stationary'));
$suppliers = $em->getRepository("App\Entity\Slave\Supplier")->findAllActiveOrdered();
$filters = FilterService::productStationaryFilter($request);
$productsQuery = $em->getRepository("App\Entity\Slave\Product")->findStationaryFiltered(true, $filters, new \Datetime(), $settingDaysStationary->getValue());
$productsStationary = $paginator->paginate($productsQuery, $request->getSession()->get($request->get("_route")."_page"), 50);
return $this->render('role/user/product/stationary.html.twig', [
"filters" => $filters,
"suppliers" => $suppliers,
"productsStationary" => $productsStationary
]);
}
/**
* @Route("/fermi/esporta-filtro-csv", name="user_product_stationary_filter_export")
* @Security("is_granted('view', 'product')")
*/
public function userProductStationaryFilterExport(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$settingDaysStationary = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'days_stationary'));
$filters = $session->get('user_product_stationary_filters');
$products = $em->getRepository("App\Entity\Slave\Product")->findStationaryFiltered(false, $filters, new \Datetime(), $settingDaysStationary->getValue());
return $this->exportStationaryProducts($products);
}
/**
* @Route("/fermi/selezione-multipla-azione", name="user_product_stationary_multiple_select_action")
* @Security("is_granted('edit', 'product')")
*/
public function userProductStationaryMultipleSelectAction(Request $request)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$productIds = explode(',', $request->request->get('ids'));
$action = $request->request->get('action');
switch($action){
case 'export':
$products = array();
foreach($productIds as $id){
$p = $em->getRepository('App\Entity\Slave\Product')->findOneById($id);
array_push($products, $p);
}
return $this->exportStationaryProducts($products);
break;
default: break;
}
}
/**
* @Route("/rigenerati", name="user_product_regenerated")
* @Security("is_granted('view', 'product')")
*/
public function userProductRegenerated(Request $request, PaginatorInterface $paginator, FormFactoryInterface $formFactory, ValidatorInterface $validator)
{
$em = $this->mr->getManager('slave');
$openModal = false;
$openModalId = null;
$session = $request->getSession();
$filters = FilterService::productRegeneratedFilter($request);
$toRegenerateQuery = $em->getRepository("App\Entity\Slave\ProductRegenerated")->findFiltered(true, $filters, false);
$toRegenerateProducts = $paginator->paginate($toRegenerateQuery, $request->getSession()->get($request->get("_route")."_page"), 50);
$regenerateQuery = $em->getRepository('App\Entity\Slave\ProductRegenerated')->findFiltered(true, $filters, true);
$regeneratedProducts = $paginator->paginate($regenerateQuery, $request->getSession()->get($request->get("_route")."_page"), 50);
$regenerateSupplier = new RegenerateSupplier();
$form = $formFactory->createNamed("form_regenerate", RegenerateSupplierType::class, $regenerateSupplier);
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = ValidationService::ValidateNotBlank($validator, $form->get('supplier'));
if($form->isValid() && $valid){
$supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneById($form->get('supplier')->getData());
$productRegenerated = $em->getRepository('App\Entity\Slave\ProductRegenerated')->findOneById($request->request->get('productRegeneratedId'));
$productRegenerated->setSupplier($supplier);
$em->flush();
$this->addFlash('notice_success', "Fornitore aggiornato!");
return $this->redirectToRoute('user_product_regenerated');
}
else{
$openModal = true;
$openModalId = $request->request->get('productRegeneratedId');
}
}
return $this->render('role/user/product/regenerated.html.twig', [
"filters" => $filters,
"openModal" => $openModal,
"openModalId" => $openModalId,
"toRegenerateProducts" => $toRegenerateProducts,
"regeneratedProducts" => $regeneratedProducts,
'form' => $form->createView()
]);
}
/**
* @Route("/rigenerati/esporta-filtro-csv/{hasSupplier}", name="user_product_regenerated_filter_export")
* @Security("is_granted('view', 'product')")
*/
public function userProductRegeneratedFilterExport(Request $request, $hasSupplier)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$filters = $session->get('user_product_regenerated_filters');
$regeneratedProducts = $em->getRepository("App\Entity\Slave\ProductRegenerated")->findFiltered(false, $filters, $hasSupplier);
return $this->exportRegeneratedProducts($regeneratedProducts);
}
/**
* @Route("/rigenerati/stampa-etichette/{hasSupplier}", name="user_product_regenerated_print_labels")
* @Security("is_granted('view', 'product')")
*/
public function userProductRegeneratedPrintLabels(Request $request, $hasSupplier)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$filters = $session->get('user_product_regenerated_filters');
$regeneratedProducts = $em->getRepository("App\Entity\Slave\ProductRegenerated")->findFiltered(false, $filters, true);
return $this->render('role/user/print/regenerated_products_labels.html.twig', [
"regeneratedProducts" => $regeneratedProducts
]);
}
/**
* @Route("/rigenerati/elimina", name="user_product_regenerated_delete")
* @Security("is_granted('edit', 'product')")
*/
public function userProductRegeneratedDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$productRegenerated = $em->getRepository("App\Entity\Slave\ProductRegenerated")->findOneById($request->request->get("productRegeneratedDelId"));
$em->remove($productRegenerated);
$em->flush();
$this->addFlash('notice_success', "Rigenerazione prodotto eliminata");
return $this->redirectToRoute('user_product_regenerated');
}
//
// MODELLI
/**
* @Route("/modelli", name="user_product_models")
* @Security("is_granted('view', 'product_model')")
*/
public function userProductModels(Request $request, ValidatorInterface $validator, PaginatorInterface $paginator, FormFactoryInterface $formFactory, FileSystem $fs)
{
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$em = $this->mr->getManager('slave');
$suppliers = $em->getRepository("App\Entity\Slave\Supplier")->findAllActiveOrdered();
$components = $em->getRepository('App\Entity\Slave\ProductComponent')->findAll();
$filters = FilterService::productModelFilter($request);
$modelsQuery = $em->getRepository("App\Entity\Slave\ProductModel")->queryFiltered($filters);
$models = $paginator->paginate($modelsQuery, $request->getSession()->get($request->get("_route")."_page"), 15);
$uploadDir = $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/product_models/';
$model = new ProductModel();
$form = $formFactory->createNamed("form_model_new", ProductModelNewType::class, $model);
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = ValidationService::validateNotDuplicate($validator, $form->get("name"), $em, "App\Entity\Slave\ProductModel", ['id' => 0]);
if($valid) $valid = ValidationService::validateFile($validator, $form->get('imagePath'), false, $form->get('file')->getData(), '3', array('png', 'jpeg', 'jpg', 'webp'));
if($valid && $form->isValid()){
MediaService::uploadImage($fs, $form->get('file')->getData(), null, $uploadDir, $model, 'image', 100, 1000, 200, true);
$em->persist($model);
$em->flush();
$model->setInternalCode(UtilitiesService::generateModelInternalCode($model->getId()));
foreach($form->get('suppliers') as $formSupplier){
if($formSupplier->getData()){
$jt = new JoinTableProductModelSupplier();
$jt->setModel($model);
$jt->setSupplier($em->getRepository('App\Entity\Slave\Supplier')->findOneByid($formSupplier->getName()));
$jt->setAlarmStockActive($em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'product_model_default_stock_active'))->getValue());
$jt->setAlarmStockYellow($em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'product_model_default_stock_yellow'))->getValue());
$jt->setAlarmStockRed($em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'product_model_default_stock_red'))->getValue());
$em->persist($jt);
}
}
$em->flush();
$this->addFlash('notice_success', "Modello inserito");
return $this->redirectToRoute('user_product_model_sheet', array('modelId' => $model->getId()));
}
else
$session->set('openNewModal', true);
}
return $this->render('role/user/product/models.html.twig', [
"company" => $company,
"suppliers" => $suppliers,
"components" => $components,
"filters" => $filters,
"models" => $models,
"form" => $form->createView()
]);
}
/**
* @Route("/modelli/duplica", name="user_product_model_duplicate")
* @Security("is_granted('edit', 'product_model')")
*/
public function userProductModelDuplicate(Request $request, FileSystem $fs)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$modelDuplicate = $em->getRepository("App\Entity\Slave\ProductModel")->findOneById($request->request->get("modelId"));
$uploadDir = $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/product_models/';
if($modelDuplicate->getImagePath() != null){
$ext = explode('.', $modelDuplicate->getImagePath())[1];
$fileName = md5(uniqid()).'.'.$ext;
}
$model = new ProductModel();
$model->setSubcategory($modelDuplicate->getSubcategory());
$model->setProducer($modelDuplicate->getProducer());
$model->setName('000-'.$modelDuplicate->getName());
$model->setSku($modelDuplicate->getSku());
$model->setPartNumber($modelDuplicate->getPartNumber());
if($modelDuplicate->getImagePath() != null){
$model->setImagePath($fileName);
$fs->copy($uploadDir.$modelDuplicate->getImagePath(), $uploadDir.$fileName, true);
$fs->copy($uploadDir.'thumb_'.$modelDuplicate->getImagePath(), $uploadDir.'thumb_'.$fileName, true);
}
$em->persist($model);
foreach($modelDuplicate->getComponents() as $com){
$model->addComponent($com);
}
$model->setInternalCode(UtilitiesService::generateModelInternalCode($model->getId()));
$em->flush();
$this->addFlash('notice_success', "Modello duplicato");
return $this->redirectToRoute('user_product_models');
}
/**
* @Route("/modelli/elimina", name="user_product_model_delete")
* @Security("is_granted('edit', 'product_model')")
*/
public function userProductModelDelete(Request $request, FileSystem $fs)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$model = $em->getRepository("App\Entity\Slave\ProductModel")->findOneById($request->request->get("modelDelId"));
$uploadDir = $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/product_models/';
foreach($model->getSuppliers() as $jt)
$em->remove($jt);
MediaService::removeImage($fs, $model->getImagePath(), $uploadDir);
$em->remove($model);
$em->flush();
$this->addFlash('notice_success', "Modello eliminato");
return $this->redirectToRoute('user_product_models');
}
/**
* @Route("/modelli/{modelId}/scheda", name="user_product_model_sheet")
* @Security("is_granted('view', 'product_model')")
*/
public function userProductModelSheet($modelId, Request $request, ValidatorInterface $validator, FormFactoryInterface $formFactory, FileSystem $fs)
{
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository("App\Entity\Master\Company")->findOneById($session->get("companyId"));
$em = $this->mr->getManager('slave');
$model = $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($modelId);
$components = $em->getRepository('App\Entity\Slave\ProductComponent')->findAll();
$uploadDir = $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/product_models/';
$form = $formFactory->createNamed("form_model_edit", ProductModelEditType::class, $model);
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = ValidationService::validateNotDuplicate($validator, $form->get("name"), $em, "App\Entity\Slave\ProductModel", ['id' => $model->getId()]);
if($valid) $valid = ValidationService::validateFile($validator, $form->get('imagePath'), false, $form->get('file')->getData(), '3', array('png', 'jpeg', 'jpg', 'webp'));
if($valid && $form->isValid()){
MediaService::uploadImage($fs, $form->get('file')->getData(), null, $uploadDir, $model, 'image', 100, 1000, 200, true);
$oldSuppliersIds = array();
$newSuppliersIds = array();
foreach($model->getSuppliers() as $jt){
array_push($oldSuppliersIds, $jt->getSupplier()->getId());
}
foreach($form->get('suppliers') as $formSupplier){
if($formSupplier->getData()){
if(!in_array($formSupplier->getName(), $oldSuppliersIds)){
$jt = new JoinTableProductModelSupplier();
$jt->setModel($model);
$jt->setSupplier($em->getRepository('App\Entity\Slave\Supplier')->findOneByid($formSupplier->getName()));
$jt->setAlarmStockActive($em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'product_model_default_stock_active'))->getValue());
$jt->setAlarmStockYellow($em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'product_model_default_stock_yellow'))->getValue());
$jt->setAlarmStockRed($em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'product_model_default_stock_red'))->getValue());
$em->persist($jt);
}
array_push($newSuppliersIds, $formSupplier->getName());
}
}
foreach($oldSuppliersIds as $oldId){
if(!in_array($oldId, $newSuppliersIds)){
$oldJtpms = $em->getRepository('App\Entity\Slave\JoinTableProductModelSupplier')->findOneByModelAndSupplier($model->getId(), $oldId);
$em->remove($oldJtpms);
}
}
$em->flush();
$this->addFlash('notice_success', "Modifiche salvate");
return $this->redirectToRoute('user_product_model_sheet', array('modelId' => $model->getId()));
}
else{
$session->set('openEditModal', true);
}
}
$jtpms = new JoinTableProductModelSupplier();
$formJtpmsEdit = $formFactory->createNamed("form_jtpms_edit", JoinTableProductModelSupplierType::class, $jtpms);
$formJtpmsEdit->handleRequest($request);
if($formJtpmsEdit->isSubmitted()){
$valid = FormValidatorService::validateJtpms($formJtpmsEdit, true, null);
if($valid && $formJtpmsEdit->isValid()){
$jtpmsEdit = $em->getRepository('App\Entity\Slave\JoinTableProductModelSupplier')->findOneById($request->request->get('jtpmsEditId'));
$jtpmsEdit->setAlarmStockActive($formJtpmsEdit->get('alarmStockActive')->getData());
if($formJtpmsEdit->get('alarmStockActive')->getData()){
$jtpmsEdit->setAlarmStockYellow($formJtpmsEdit->get('alarmStockYellow')->getData());
$jtpmsEdit->setAlarmStockRed($formJtpmsEdit->get('alarmStockRed')->getData());
}
else{
$jtpmsEdit->setAlarmStockYellow(null);
$jtpmsEdit->setAlarmStockRed(null);
}
$em->flush();
$this->addFlash('notice_success', "Scorte aggiornate");
return $this->redirectToRoute('user_product_model_sheet', array('modelId' => $model->getId()));
}
else{
$session->set('openEditJtpmsModal', true);
$session->set('openEditJtpmsModalId', $request->request->get('jtpmsEditId'));
}
}
return $this->render('role/user/product/model_sheet.html.twig', [
"company" => $company,
"model" => $model,
"components" => $components,
"form" => $form->createView(),
"formJtpmsEdit" => $formJtpmsEdit->createView()
]);
}
/**
* @Route("/modelli/fornitori-elimina", name="user_product_model_jtpms_delete")
* @Security("is_granted('edit', 'product_model')")
*/
public function userProductModelJtpmsDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$jtpms = $em->getRepository("App\Entity\Slave\JoinTableProductModelSupplier")->findOneById($request->request->get("jtpmsDelId"));
$modelId = $jtpms->getModel()->getId();
$em->remove($jtpms);
$em->flush();
$this->addFlash('notice_success', "Fornitore eliminato");
return $this->redirectToRoute('user_product_model_sheet', array('modelId' => $modelId));
}
/**
* @Route("/modelli/immagine-elimina", name="user_product_model_image_delete")
* @Security("is_granted('edit', 'product_model')")
*/
public function userProductModelImageDelete(Request $request, FileSystem $fs)
{
$em = $this->mr->getManager('slave');
$emMaster = $this->mr->getManager('master');
$session = $request->getSession();
$company = $emMaster->getRepository('App\Entity\Master\Company')->findOneById($session->get('companyId'));
$model = $em->getRepository('App\Entity\Slave\ProductModel')->findOneById($request->request->get('modelId'));
$uploadDir = $this->params->get('kernel.project_dir').'/'.$this->params->get('web_path').'/companies/'.$company->getDirectoryPath().'/product_models/';
if($model->getImagePath() != null && $model->getImagePath() != ""){
MediaService::removeImage($fs, $model->getImagePath(), $uploadDir);
$model->setImagePath(null);
}
$em->flush();
$response = array("code" => 200, "success" => true);
return new Response(json_encode($response));
}
//
// SOTTOCATEGORIE
/**
* @Route("/sottocategorie", name="user_product_subcategories")
* @Security("is_granted('view', 'product_subcategory')")
*/
public function userProductSubcategories(Request $request, ValidatorInterface $validator, PaginatorInterface $paginator, FormFactoryInterface $formFactory)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$filters = FilterService::productSubcategoryFilter($request);
$subcategoriesQuery = $em->getRepository("App\Entity\Slave\ProductSubcategory")->queryFiltered($filters);
$subcategories = $paginator->paginate($subcategoriesQuery, $request->getSession()->get($request->get("_route")."_page"), 15);
$subcategory = new ProductSubcategory();
$form = $formFactory->createNamed("form_subcategory_new", ProductSubcategoryType::class, $subcategory);
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = ValidationService::validateNotDuplicate($validator, $form->get("name"), $em, "App\Entity\Slave\ProductSubcategory", ['categoryId' => $form->get('category')->getData()->getId()]);
if($form->isValid()){
$em->persist($subcategory);
$em->flush();
$this->addFlash('notice_success', "Sottocategoria inserita");
return $this->redirectToRoute('user_product_subcategories');
}
else
$session->set('openNewModal', true);
}
$subcategoryEdit = new ProductSubcategory();
$formEdit = $formFactory->createNamed("form_subcategory_edit", ProductSubcategoryType::class, $subcategoryEdit);
$formEdit->handleRequest($request);
if($formEdit->isSubmitted()){
$valid = ValidationService::validateNotDuplicate($validator, $formEdit->get("name"), $em, "App\Entity\Slave\ProductSubcategory", ['categoryId' => $subcategoryEdit->getCategory()->getId()]);
if($valid && $formEdit->isValid()){
$pt = $em->getRepository("App\Entity\Slave\ProductSubcategory")->findOneById($request->request->get("subcategoryEditId"));
$pt->setName($subcategoryEdit->getName());
$pt->setCategory($subcategoryEdit->getCategory());
$em->flush();
$this->addFlash('notice_success', "Sottocategoria modificata");
return $this->redirectToRoute('user_product_subcategories');
}
else{
$session->set('openEditModal', true);
$session->set('openEditModalId', $request->request->get("subcategoryEditId"));
}
}
return $this->render('role/user/product/subcategories.html.twig', [
"filters" => $filters,
"subcategories" => $subcategories,
"form" => $form->createView(),
"formEdit" => $formEdit->createView()
]);
}
/**
* @Route("/sottocategorie/elimina", name="user_product_subcategory_delete")
* @Security("is_granted('edit', 'product_subcategory')")
*/
public function userProductSubcategoryDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$subcategory = $em->getRepository("App\Entity\Slave\ProductSubcategory")->findOneById($request->request->get("subcategoryDelId"));
$em->remove($subcategory);
$em->flush();
$this->addFlash('notice_success', "Sottocategoria eliminata");
return $this->redirectToRoute('user_product_subcategories');
}
//
// CATEGORIE
/**
* @Route("/categorie", name="user_product_categories")
* @Security("is_granted('view', 'product_category')")
*/
public function userProductCategories(Request $request, ValidatorInterface $validator, PaginatorInterface $paginator, FormFactoryInterface $formFactory)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$filters = FilterService::productCategoryFilter($request);
$categoriesQuery = $em->getRepository("App\Entity\Slave\ProductCategory")->queryFiltered($filters);
$categories = $paginator->paginate($categoriesQuery, $request->getSession()->get($request->get("_route")."_page"), 15);
$category = new ProductCategory();
$form = $formFactory->createNamed("form_category_new", ProductCategoryType::class, $category);
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = ValidationService::validateNotDuplicate($validator, $form->get("name"), $em, "App\Entity\Slave\ProductCategory", ['id' => 0]);
if($form->isValid()){
$em->persist($category);
$em->flush();
$this->addFlash('notice_success', "Categoria inserita");
return $this->redirectToRoute('user_product_categories');
}
else
$session->set('openNewModal', true);
}
$categoryEdit = new ProductCategory();
$formEdit = $formFactory->createNamed("form_category_edit", ProductCategoryType::class, $categoryEdit);
$formEdit->handleRequest($request);
if($formEdit->isSubmitted()){
$valid = ValidationService::validateNotDuplicate($validator, $formEdit->get("name"), $em, "App\Entity\Slave\ProductCategory", ['id' => $request->request->get("categoryEditId")]);
if($valid && $formEdit->isValid()){
$pt = $em->getRepository("App\Entity\Slave\ProductCategory")->findOneById($request->request->get("categoryEditId"));
$pt->setName($categoryEdit->getName());
$pt->setPos($categoryEdit->isPos());
$em->flush();
$this->addFlash('notice_success', "Categoria modificata");
return $this->redirectToRoute('user_product_categories');
}
else{
$session->set('openEditModal', true);
$session->set('openEditModalId', $request->request->get("categoryEditId"));
}
}
return $this->render('role/user/product/categories.html.twig', [
"filters" => $filters,
"categories" => $categories,
"form" => $form->createView(),
"formEdit" => $formEdit->createView()
]);
}
/**
* @Route("/categorie/elimina", name="user_product_category_delete")
* @Security("is_granted('edit', 'product_category')")
*/
public function userProductCategoryDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$category = $em->getRepository("App\Entity\Slave\ProductCategory")->findOneById($request->request->get("categoryDelId"));
$em->remove($category);
$em->flush();
$this->addFlash('notice_success', "Categoria eliminata");
return $this->redirectToRoute('user_product_categories');
}
//
// COMPONENTI
/**
* @Route("/componenti", name="user_product_components")
* @Security("is_granted('view', 'product_component')")
*/
public function userProductComponents(Request $request, ValidatorInterface $validator, PaginatorInterface $paginator, FormFactoryInterface $formFactory)
{
$em = $this->mr->getManager('slave');
$session = $request->getSession();
$filters = FilterService::nameFilter($request);
$componentsQuery = $em->getRepository("App\Entity\Slave\ProductComponent")->queryFiltered($filters);
$components = $paginator->paginate($componentsQuery, $request->getSession()->get($request->get("_route")."_page"), 15);
$component = new ProductComponent();
$form = $formFactory->createNamed("form_component_new", ProductComponentType::class, $component);
$form->handleRequest($request);
if($form->isSubmitted()){
$valid = ValidationService::validateNotDuplicate($validator, $form->get("name"), $em, "App\Entity\Slave\ProductComponent", ['id' => 0]);
if($form->isValid()){
$em->persist($component);
$em->flush();
$this->addFlash('notice_success', "Componente inserito");
return $this->redirectToRoute('user_product_components');
}
else
$session->set('openNewModal', true);
}
$componentEdit = new ProductComponent();
$formEdit = $formFactory->createNamed("form_component_edit", ProductComponentType::class, $componentEdit);
$formEdit->handleRequest($request);
if($formEdit->isSubmitted()){
$valid = ValidationService::validateNotDuplicate($validator, $formEdit->get("name"), $em, "App\Entity\Slave\ProductComponent", ['id' => $request->request->get("componentEditId")]);
if($valid && $formEdit->isValid()){
$pt = $em->getRepository("App\Entity\Slave\ProductComponent")->findOneById($request->request->get("componentEditId"));
$pt->setName($componentEdit->getName());
$em->flush();
$this->addFlash('notice_success', "Componente modificato");
return $this->redirectToRoute('user_product_components');
}
else{
$session->set('openEditModal', true);
$session->set('openEditModalId', $request->request->get("componentEditId"));
}
}
return $this->render('role/user/product/components.html.twig', [
"filters" => $filters,
"components" => $components,
"form" => $form->createView(),
"formEdit" => $formEdit->createView()
]);
}
/**
* @Route("/componenti/elimina", name="user_product_component_delete")
* @Security("is_granted('edit', 'product_component')")
*/
public function userProductComponentDelete(Request $request)
{
$em = $this->mr->getManager('slave');
$component = $em->getRepository("App\Entity\Slave\ProductComponent")->findOneById($request->request->get("componentDelId"));
$em->remove($component);
$em->flush();
$this->addFlash('notice_success', "Componente eliminato");
return $this->redirectToRoute('user_product_components');
}
//
}