<?php
namespace App\Service;
use App\Entity\Slave\Client;
use App\Entity\Slave\ClientPhone;
use App\Entity\Slave\Termid;
use App\Entity\Slave\Ticket;
use App\Entity\Slave\Warehouse;
use App\Entity\Slave\TicketLog;
use App\Service\UtilitiesService;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\HttpFoundation\Response;
class TicketService
{
// IMPORT DA EMAIL
// Chiamata da ScriptController
static public function importTickets($em, $emMaster, $user, $inbox, $email, $header, $supplierTicketEmails)
{
if(property_exists($header, "subject"))
$subject = $header->subject; // Prendo l'oggetto
else
$subject = "";
if($subject != "")
$subject = imap_mime_header_decode($subject)[0]->text;
$isHtml = false;
$dt = explode(', ', $header->date); // Prendo la data di creazione
$dts = explode(' (', $dt[sizeof($dt) - 1]); // Pulisco mettendo il formato per il create_date_from_format
$datetimeStart = date_create_from_format('j M Y H:i:s O', $dts[0]); //4 Jul 2023 16:00:11 +0200"
$supplier = null;
foreach($supplierTicketEmails as $ste){
if($supplier == null){
foreach($ste->getSupplier()->getOperations() as $op){
if($supplier == null){
foreach($op->getSubjectMappings() as $subj){
if(strpos($subject, $subj->getValue()) !== false){
$supplier = $ste->getSupplier();
$isHtml = $ste->isHtml();
break;
}
}
}
}
}
}
$tickets = array();
$arrayNumberTermids = array();
if($supplier != null){
switch($supplier->getSlug()){
case 'nexi-book-monetica':
case 'nexi-book-meps':
$json = TicketService::createJsonFromEmail($inbox, $email, false, false, false);
$supplierMonetica = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'nexi-book-monetica'));
$supplierMeps = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'nexi-book-meps'));
$supplier = TicketService::nexiSupplierSearch($supplierMonetica, $json);
if($supplier == null) $supplier = TicketService::nexiSupplierSearch($supplierMeps, $json);
switch($supplier){
case 'Monetica':
$supplier = $supplierMonetica;
break;
case 'Meps':
$supplier = $supplierMeps;
break;
default: break;
}
$subjectMapping = null;
if($supplier != null){
foreach($supplier->getOperations() as $op){
if($subjectMapping == null){
foreach($op->getSubjectMappings() as $sm){
if(strpos($subject, $sm->getValue()) !== false){
$subjectMapping = $sm;
break;
}
}
}
else
break;
}
}
if($subjectMapping != null){
$operation = $subjectMapping->getOperation();
[$ticket, $arrayNumberTermids] = TicketService::createTicket($em, $user, $supplier, $operation, $datetimeStart, $json, $arrayNumberTermids);
if($supplier == null){
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug('supplier');
$ticket->setSystemErrorDetails("Non è stato possibile comprendere qual'è il fornitore NEXI (Meps o Monetica)");
$em->flush();
}
if($ticket != null)
array_push($tickets, $ticket);
}
break;
case 'csc---nexi-book-monetica':
case 'csc---nexi-book-meps':
if($isHtml)
$json = TicketService::createJsonFromEmail($inbox, $email, true, false, false);
else
$json = TicketService::createJsonFromEmail($inbox, $email, false, false, false);
$supplierMonetica = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---nexi-book-monetica'));
$supplierMeps = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---nexi-book-meps'));
$supplier = TicketService::nexiSupplierSearch($supplierMonetica, $json);
if($supplier == null) $supplier = TicketService::nexiSupplierSearch($supplierMeps, $json);
switch($supplier){
case 'Monetica':
$supplier = $supplierMonetica;
break;
case 'Meps':
$supplier = $supplierMeps;
break;
default: break;
}
$subjectMapping = null;
if($supplier != null){
foreach($supplier->getOperations() as $op){
if($subjectMapping == null){
foreach($op->getSubjectMappings() as $sm){
if(strpos($subject, $sm->getValue()) !== false){
$subjectMapping = $sm;
break;
}
}
}
else
break;
}
}
if($subjectMapping != null){
$operation = $subjectMapping->getOperation();
[$ticket, $arrayNumberTermids] = TicketService::createTicket($em, $user, $supplier, $operation, $datetimeStart, $json, $arrayNumberTermids);
if($supplier == null){
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug('supplier');
$ticket->setSystemErrorDetails("Non è stato possibile comprendere qual'è il fornitore CSC NEXI (Meps o Monetica)");
$em->flush();
}
if($ticket != null)
array_push($tickets, $ticket);
}
break;
case 'bcc-pos':
$found = false;
foreach($supplier->getOperations() as $op){
$subjectMapping = $em->getRepository('App\Entity\Slave\OperationSubjectMapping')->findOneByOperationLikeSubject($op->getId(), $subject);
if($subjectMapping){
$found = true;
break;
}
}
if($found){
// Assegno operazione guardando la chiave tipo intervento e confrontandola con la regex
$attachmentsCheck = TicketService::getAttachmentsFromEmail($inbox, $email); // Prendo allegati email -> struttura array(["is_attachment"] => true/false, ["attachment"] => file)
$attachments = array();
foreach($attachmentsCheck as $att){
if($att['is_attachment'] == 1){
array_push($attachments, $att);
}
}
foreach($attachments as $attachment){
$jsons = array();
$index = null;
$rows = explode("\r\n", $attachment['attachment']);
$keys = explode(';', $rows[0]);
for($i = 0; $i < sizeof($keys); $i++){
if(rtrim(ltrim($keys[$i], '"'), '"') == $supplier->getOperationMapping()){
$index = $i;
break;
}
}
$operation = null;
for($i = 1; $i < sizeof($rows); $i++){
if($rows[$i] != ''){
$columns = explode(';', preg_replace('/\"/', '', $rows[$i]));
// Cerco l'operazione che corrisponde al regex
if($index != null){
foreach($supplier->getOperations() as $op){
if(!$op->isUav()){
if(preg_match('/'.$op->getIdentifierRegex().'/', $columns[$index])){
$operation = $op;
break;
}
}
}
}
// In ogni caso creo il json del ticket
$first = true;
$json = '[';
$rowValues = explode(';', $rows[$i]);
for($k = 0; $k < sizeof($rowValues); $k++)
[$json, $first] = TicketService::addToJson($json, $first, json_decode($keys[$k]), json_decode($rowValues[$k]));
$json.= ']';
if(sizeof($rowValues) > 1){
[$ticket, $arrayNumberTermids] = TicketService::createTicket($em, $user, $supplier, $operation, $datetimeStart, $json, $arrayNumberTermids);
if($operation == null){
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug('key_mapping');
$ticket->setSystemErrorDetails("Non esiste la chiave \"".$supplier->getOperationMapping()."\" nei dettagli del ticket");
$em->flush();
}
if($ticket != null)
array_push($tickets, $ticket);
}
}
}
}
}
break;
case 'fabrick':
case 'fabrick---flex':
$datetimeStart = date_modify($datetimeStart, "+2 hours");
$operation = null;
$json = TicketService::createJsonFromEmail($inbox, $email, false, false, true);
$subjectMappings = $em->getRepository('App\Entity\Slave\OperationSubjectMapping')->findAllLikeSubject($supplier->getId(), $subject);
foreach($subjectMappings as $sm){
if($operation != null)
break;
$opField = $supplier->getOperationMapping();
$op = $sm->getOperation();
$jsonControl = json_decode($json, true);
for($i=0; $i<sizeof($jsonControl); $i++){
if(array_key_exists($opField, $jsonControl[$i]) && preg_match('/'.$op->getIdentifierRegex().'/', $jsonControl[$i][$opField])){
$operation = $op;
break;
}
}
}
[$ticket, $arrayNumberTermids] = TicketService::createTicket($em, $user, $supplier, $operation, $datetimeStart, $json, $arrayNumberTermids);
if($operation == null){
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug('operation');
$ticket->setSystemErrorDetails("Non è stato possibile comprendere qual'è l'operazione dal soggetto \"".$subject."\" dell'email");
$em->flush();
}
if($ticket != null)
array_push($tickets, $ticket);
break;
case 'demis-adp':
$supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'adp'));
break;
case 'worldline-italia':
case 'worldline-ccb':
$json = TicketService::createJsonFromEmail($inbox, $email, false, true, false);
$identifier = TicketService::worldlineSupplierSearch('email', $json);
$supplierNormal = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'worldline-italia'));
$supplierCCB = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'worldline-ccb'));
switch($identifier){
case 'Normal': $supplier = $supplierNormal; break;
case 'CCB': $supplier = $supplierCCB; break;
default: break;
}
$subjectMapping = null;
if($supplier != null){
foreach($supplier->getOperations() as $op){
if($subjectMapping == null){
foreach($op->getSubjectMappings() as $sm){
if(strpos($subject, $sm->getValue()) !== false){
$subjectMapping = $sm;
break;
}
}
}
else
break;
}
}
if($subjectMapping != null){
$operation = $subjectMapping->getOperation();
[$ticket, $arrayNumberTermids] = TicketService::createTicket($em, $user, $supplier, $operation, $datetimeStart, $json, $arrayNumberTermids);
if($supplier == null){
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug('supplier');
$ticket->setSystemErrorDetails("Non è stato possibile comprendere qual'è il fornitore WORLDLINE (Normale o CCB)");
$em->flush();
}
if($ticket != null)
array_push($tickets, $ticket);
}
break;
case 'csc---axerve':
case 'csc---cglobal':
case 'csc---cronos':
case 'csc---cse':
case 'csc---decathlon':
case 'csc---euronet':
case 'csc---lis-pay':
case 'csc---mooney':
case 'csc---nexi-book-sia':
case 'csc---numera':
case 'csc---p4cards':
case 'csc---q8':
case 'csc---repas':
case 'csc---stripe':
case 'csc---worldline-italia':
case 'csc---yamamay':
case 'lis-holding':
// Assegno operazione guardando l'oggetto delle email
$operation = null;
if($supplier->getSlug() == 'lis-holding')
$json = TicketService::createJsonFromEmail($inbox, $email, false, false, false);
else
$json = TicketService::createJsonFromEmail($inbox, $email, true, false, false);
$subjectMapping = $em->getRepository('App\Entity\Slave\OperationSubjectMapping')->findOneLikeSubject($supplier->getId(), $subject);
if($subjectMapping != null){
$operation = $subjectMapping->getOperation();
[$ticket, $arrayNumberTermids] = TicketService::createTicket($em, $user, $supplier, $operation, $datetimeStart, $json, $arrayNumberTermids);
if($operation == null){
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug('operation');
$ticket->setSystemErrorDetails("Non è stato possibile comprendere qual'è l'operazione dal soggetto \"".$subject."\" dell'email");
$em->flush();
}
if($ticket != null)
array_push($tickets, $ticket);
}
break;
default: break;
}
}
return [$supplier, $tickets];
}
// Case BCC-POS
static public function getAttachmentsFromEmail($inbox, $email)
{
$structure = imap_fetchstructure($inbox, $email);
$attachments = array();
if(isset($structure->parts) && count($structure->parts) && $structure->ifid != "1"){
for($i = 0; $i < count($structure->parts); $i++) {
$attachments[$i] = array('is_attachment' => false, 'attachment' => '');
if($structure->parts[$i]->ifdparameters)
foreach($structure->parts[$i]->dparameters as $object)
if(strtolower($object->attribute) == 'filename')
$attachments[$i]['is_attachment'] = true;
if($structure->parts[$i]->ifparameters)
foreach($structure->parts[$i]->parameters as $object)
if(strtolower($object->attribute) == 'name')
$attachments[$i]['is_attachment'] = true;
if($attachments[$i]['is_attachment']){
$attachments[$i]['attachment'] = imap_fetchbody($inbox, $email, $i+1);
/* 3 = BASE64 encoding */
if($structure->parts[$i]->encoding == 3) $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
/* 4 = QUOTED-PRINTABLE encoding */
elseif($structure->parts[$i]->encoding == 4) $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
}
}
}
return $attachments;
}
// Case NEXI MONETICA o NEXI MEPS
static public function nexiSupplierSearch($sup, $json)
{
$supplier = null;
foreach($sup->getOperations() as $operation){
if(!$operation->isUav()){
$supplier = TicketService::nexiSupplierSearchMepsOrMonetica($json, $operation->getKeyTicketNumber());
if($supplier != null) break;
}
}
return $supplier;
}
static public function nexiMaintenanceSupplierSearch($sup, $json)
{
return TicketService::nexiSupplierSearchMepsOrMonetica($json, $sup->getOperationMaintenance()->getKeyTicketNumber());
}
static public function nexiSupplierSearchMepsOrMonetica($json, $key)
{
$array = json_decode($json, true);
foreach($array as $val){
$extraArray = json_decode($key->getMappingExtra(), true);
if(array_key_exists($key->getMappingValue(), $val)){
if(substr($val[$key->getMappingValue()], 0, 1) == 'K' || substr($val[$key->getMappingValue()], 0, 1) == 'S')
return 'Meps';
else
return 'Monetica';
}
else{
$altKey = $key->displayMappingExtraValue("alt_key");
if($altKey !== false){
if(array_key_exists($altKey, $val)){
if(substr($val[$altKey], 0, 1) == 'K' || substr($val[$altKey], 0, 1) == 'S')
return 'Meps';
else
return 'Monetica';
}
}
}
}
return null;
}
// Case WORLDLINE CCB o Normale
static public function worldlineSupplierSearch($from, $json)
{
$identifier = null;
$json = json_decode($json, true);
$value = "";
$key = "";
switch($from){
case 'import': $key = "Canale brand"; break;
case 'email': $key = "Canale Brand"; break;
default: break;
}
for($i=0; $i < sizeof($json); $i++){
if(array_key_exists($key, $json[$i])){
$value = $json[$i][$key];
break;
}
}
switch($value){
case 'WL-BNL':
case 'WL-Desio':
case 'WL-Fucino':
case 'Worldline': $identifier = 'Normal'; break;
case 'WL-CCB': $identifier = 'CCB'; break;
default: $identifier = 'Normal'; break;
}
return $identifier;
}
// Case SATE
static public function sateSupplierSearch($from, $json)
{
$identifier = null;
$json = json_decode($json, true);
switch($from){
case 'import': $key = "Cliente"; break;
case 'email': $key = ""; break;
default: break;
}
for($i=0; $i < sizeof($json); $i++){
if(array_key_exists($key, $json[$i])){
$value = $json[$i][$key];
break;
}
}
switch($value){
case 'Argentea': $identifier = 'Sate-Argentea'; break;
case 'FlagPay': $identifier = 'Sate-Flagpay'; break;
case 'Mooney': $identifier = 'Sate-Mooney'; break;
case 'Numera': $identifier = 'Sate-Numera'; break;
case 'Pluxee': $identifier = 'Sate-Pluxee'; break;
case 'Worldline': $identifier = 'Sate-Worldline'; break;
default: break;
}
return $identifier;
}
// Altri case tranne BCC-POS
static public function createJsonFromEmail($inbox, $email, $isCsc, $isWorldline, $isFabrick)
{
$body = imap_fetchbody($inbox, $email, 1, FT_PEEK);
$body = UtilitiesService::convertAsciiToHtml($body, $isFabrick);
$body = preg_replace("<<br>>", "", $body);
if($isCsc){
$body = strip_tags($body);
$startIndex = strpos($body, "Cliente");
if ($startIndex !== false) {
$body = substr($body, $startIndex);
$endIndex = strpos($body, "QUESTA MAIL");
if ($endIndex !== false) {
$body = substr($body, 0, $endIndex);
}
}
$bodyArray = preg_split("/(#+)/", $body, -1, PREG_SPLIT_DELIM_CAPTURE);
}
elseif($isFabrick){
$body = strip_tags($body);
$startIndex = strpos($body, "Stato");
if ($startIndex !== false) {
$body = substr($body, $startIndex);
}
$body = preg_replace("/\\r\\n/", "-#-", $body);
$bodyArray = preg_split("/(-#-)+/", $body, -1, PREG_SPLIT_DELIM_CAPTURE);
}
else{
$body = preg_replace("/\\r\\n/", "-#-", $body);
$bodyArray = preg_split("/(-#-)+/", $body, -1, PREG_SPLIT_DELIM_CAPTURE);
}
$fields = array();
foreach($bodyArray as $string){
$string = preg_replace('/\r\n/', '', $string);
$string = preg_replace('/\n/', '', $string);
$string = preg_replace('/Questa e-mailC3=A8 stata generata automaticamente\. Si prega di non rispondere a questo messaggio\./i', '', $string);
if($isCsc)
$string = preg_replace('/#/', '', $string);
if(str_contains($string, ':'))
array_push($fields, $string);
// Serve per concatenare le note o i campi che vanno a capo a caso, se non ci sono i : nella stringa, aggiungo il valore al campo precedente, ignorando dove c'è solo a capo, senza altri valori
elseif(sizeof($fields) > 1 && $string != "-#-")
$fields[sizeof($fields) - 1].= $string;
}
$json = TicketService::createJsonData($fields);
return $json;
}
static public function checkTicketExistanceCsv($em, $json, $number, $termid, $arrayNumberTermids){
$array = json_decode($json, true);
$ticketAlreadyExist = false;
// Cerco il ticket-termid nel database
$tickets = $em->getRepository('App\Entity\Slave\Ticket')->findAllByNumber($number);
foreach($tickets as $t){
if($t != null && $t->getTermid()->getCode() == $termid){
$ticketAlreadyExist = true;
break;
}
}
// Cerco il ticket-termid nell'array numero-termid del CSV che sto importando -> serve a evitare che non sia ancora nel database perchè non è ancora stato pushato ma è era già presente nel file
if(!$ticketAlreadyExist){
foreach($arrayNumberTermids as $nt){
if($nt[0] == $number && $nt[1] == $termid){
$ticketAlreadyExist = true;
$ticket = $t;
break;
}
}
}
if(!$ticketAlreadyExist){
$tmp = [];
array_push($tmp, $number, $termid);
array_push($arrayNumberTermids, $tmp);
}
return [$ticketAlreadyExist, $arrayNumberTermids];
}
static public function checkTicketExistanceDownload($em, $supplier, $operation, $json, $arrayNumberTermids){
$ticketAlreadyExist = null;
$ticket = null;
$keyNumber = $operation->getKeyTicketNumber();
$altKeyNumber = $operation->getKeyTicketNumber()->displayMappingExtraValue("alt_key");
$keyTermid = $operation->getKeyTermid();
$altKeyTermid = $operation->getKeyTermid()->displayMappingExtraValue("alt_key");
$array = json_decode($json, true);
$number = null;
$termid = null;
foreach($array as $val){
if($number == null && array_key_exists($keyNumber->getMappingValue(), $val))
$number = preg_replace('/<br>/', '', $val[$keyNumber->getMappingValue()]);
else{
if($number == null && $altKeyNumber !== false && array_key_exists($altKeyNumber, $val))
$number = preg_replace('/<br>/', '', $val[$altKeyNumber]);
}
if($termid == null && array_key_exists($keyTermid->getMappingValue(), $val))
$termid = preg_replace('/<br>/', '', $val[$keyTermid->getMappingValue()]);
else{
if($termid == null && $altKeyTermid !== false && array_key_exists($altKeyTermid, $val))
$termid = preg_replace('/<br>/', '', $val[$altKeyTermid]);
}
}
if($number != null && $termid != null){
$ticketAlreadyExist = false;
// Cerco il ticket-termid nel database
$tickets = $em->getRepository('App\Entity\Slave\Ticket')->findAllByNumber($number);
foreach($tickets as $t){
if($t != null && $t->getTermid()->getCode() == $termid){
$ticketAlreadyExist = true;
$ticket = $t;
break;
}
}
// Cerco il ticket-termid nell'array numero-termid del CSV che sto importando -> serve a evitare che non sia ancora nel database perchè non è ancora stato pushato ma è era già presente nel file
if(!$ticketAlreadyExist){
foreach($arrayNumberTermids as $nt){
if($nt[0] == $number && $nt[1] == $termid){
$ticketAlreadyExist = true;
break;
}
}
}
if(!$ticketAlreadyExist){
$tmp = [];
array_push($tmp, $number, $termid);
array_push($arrayNumberTermids, $tmp);
}
}
return [$ticketAlreadyExist, $ticket, $arrayNumberTermids];
}
// Funzioni importTickets
static public function createTicket($em, $user, $supplier, $operation, $datetimeStart, $json, $arrayNumberTermids){
// Controllo se esiste già un ticket con lo stesso numero e termid
[$ticketAlreadyExist, $returnTicket, $arrayNumberTermids] = TicketService::checkTicketExistanceDownload($em, $supplier, $operation, $json, $arrayNumberTermids);
if(!$ticketAlreadyExist){
$statusToAssign = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'to_assign'));
$today = new \Datetime();
$ticket = new Ticket();
$ticket->setSupplier($supplier);
$ticket->setOperation($operation);
$ticket->setDatetimeStart($datetimeStart);
$ticket->setStatus($statusToAssign);
$ticket->setDirectoryPath($today->format("Y").'/'.$today->format("m").'/'.md5(uniqid()));
$ticket->setJson($json);
$ticket->setJsonReport('[]');
$ticket->setDatetimeImport(new \DateTime());
$array = json_decode($json, true);
for($i=0; $i<sizeof($array); $i++){
if($supplier->getOperationNotBillableCodes() != null && $supplier->getOperationNotBillableCodes() != '' && array_key_exists($supplier->getOperationMapping(), $array[$i]) && preg_match('/'.$supplier->getOperationNotBillableCodes().'/', $array[$i][$supplier->getOperationMapping()]))
$ticket->setBillable(false);
}
try {
$em->persist($ticket);
$em->flush();
} catch (UniqueConstraintViolationException $exception) {
return null;
} catch (\Throwable $exception) {
// TO DO
switch($exception->getCode()){
case 1062:
case 1557:
case 1569:
case 1586: return null; break;
}
}
return [$ticket, $arrayNumberTermids];
}
else{
if($supplier->getSlug() == 'worldline-ccb' || $supplier->getSlug() == 'worldline-italia'){
if($returnTicket != null){
$actualJson = $returnTicket->getJson();
$dateExpirationKeyMapping = $em->getRepository('App\Entity\Slave\OperationKeyMapping')->findOneBy(["operation" => $returnTicket->getOperation()->getId(), "ticketColumn"=>"Data scadenza"]);
$actualK = $dateExpirationKeyMapping->getMappingValue();
$newK = $dateExpirationKeyMapping->displayMappingExtraValue("alt_key");
$newFormat = $dateExpirationKeyMapping->displayMappingExtraValue("alt_date_format");
$newV = "";
$newArray = json_decode($json, true);
foreach ($newArray as $newItem) {
if(array_key_exists($newK, $newItem)){
$newV = $newItem[$newK];
break;
}
}
if($newV != ""){
// CERCO SE ESISTE GIA' LA CHIAVE NEL JSON
$actualArray = json_decode($actualJson, true);
if($actualArray != null){
for($i = 0; $i< sizeof($actualArray); $i++){
if (array_key_exists($actualK, $actualArray[$i])) {
$actualArray[$i] = [$newK => $newV];
$datetimeExpiration = date_create_from_format($newFormat, $newV);
$returnTicket->setDatetimeExpiration($datetimeExpiration);
break;
}
}
$json = json_encode($actualArray, JSON_PRETTY_PRINT);
$returnTicket->setJson($json);
$em->flush();
}
}
}
return [$returnTicket, $arrayNumberTermids];
}
}
return [null, $arrayNumberTermids];
}
static public function createJsonData($array)
{
$first = true;
$json = '[';
foreach($array as $string){
$parts = explode(':', $string, 2);
[$json, $first] = TicketService::addToJson($json, $first, $parts[0], $parts[1]);
}
$json.= ']';
return $json;
}
static public function addToJson($json, $first, $key, $value)
{
if($first) $first = false; else $json.= ',';
$k = preg_replace('/<br>/', '', ltrim(rtrim($key, " "), " "));
$k = preg_replace("/\s\/\s/", "/", $k);
$v = preg_replace('/<br>/', '', ltrim(rtrim($value, " "), " "));
$json.= '{'.json_encode($k).':'.json_encode($v).'}';
return [$json, $first];
}
static public function ticketMapClient($em, $ticket)
{
$found = false;
$error = false;
$code = '';
$json = json_decode($ticket->getJson(), true);
$keys = preg_split('/\|/', $ticket->getOperation()->getCodeClient());
foreach($keys as $key){
if(!$found){
$parts = explode('+', $key);
for($i = 0; $i < sizeof($json); $i++){
foreach($parts as $p){
if(array_key_exists(preg_replace("/\s\/\s/", "/", $p), $json[$i])){
$code .= $json[$i][preg_replace("/\s\/\s/", "/", $p)];
$found = true;
break;
}
}
}
}
}
if(!$found){
$error = true;
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug('client');
$ticket->setSystemErrorDetails("Non è configurata la chiave per identificare il cliente nell'operazione");
}
else{
$found = false;
$termid = null;
$keysRequired = $em->getRepository('App\Entity\Slave\OperationKeyMapping')->findByOperationAndRequired($ticket->getOperation()->getId(), true);
foreach($keysRequired as $k){
if(!$found){
$altKey = $k->displayMappingExtraValue("alt_key");
for($i = 0; $i < sizeof($json); $i++){
if(array_key_exists($k->getMappingValue(), $json[$i]) || ($altKey !== false && array_key_exists($altKey, $json[$i]))){
if(array_key_exists($k->getMappingValue(), $json[$i]))
$value = $json[$i][$k->getMappingValue()];
else
$value = $json[$i][$altKey];
//if($code == '' && $k->getTicketColumn() == 'Term ID'){
if($k->getTicketColumn() == 'Term ID'){
$code = UtilitiesService::updateTermidCodeToEightChars($value);
$termid = $em->getRepository('App\Entity\Slave\Termid')->findOneBy(array('code' => $code));
$found = true;
break;
}
}
}
}
}
$client = null;
if($termid != null && $termid->getClient() != null)
$client = $termid->getClient();
if($client == null)
$client = $em->getRepository('App\Entity\Slave\Client')->findOneBy(array('code' => $code));
if($client == null){
$client = new Client();
$client->setCode($code);
$client->setDirectoryPath(md5(uniqid()));
$em->persist($client);
$warehouse = new Warehouse();
$warehouse->setClient($client);
$warehouse->setMovable(false);
$client->setWarehouse($warehouse);
$em->persist($warehouse);
$em->flush();
}
$ticket->setClient($client);
}
$em->flush();
return $error;
}
static public function isInCoverCompany($company, $regionId)
{
foreach($company->getRegions() as $region){
if($regionId == $region->getId()){
return true;
break;
}
}
return false;
}
static public function ticketMapColumns($em, $emMaster, $company, $ticket)
{
$array = json_decode($ticket->getJson(), true);
$client = $ticket->getClient();
$first = true;
$json = '[';
$keysOptional = $em->getRepository('App\Entity\Slave\OperationKeyMapping')->findByOperationAndRequired($ticket->getOperation()->getId(), false);
foreach($keysOptional as $k){
$altKey = $k->displayMappingExtraValue("alt_key");
foreach($array as $val){
$isAlt = false;
if(array_key_exists($k->getMappingValue(), $val) || ($altKey !== false && array_key_exists($altKey, $val))){
if(array_key_exists($k->getMappingValue(), $val))
$value = $val[$k->getMappingValue()];
else{
$value = $val[$altKey];
$isAlt = true;
}
switch($k->getTicketColumn()){
case 'Telefono 1': TicketService::managePhone($em, $client, $value, "Telefono 1"); break;
case 'Telefono 2': TicketService::managePhone($em, $client, $value, "Telefono 2"); break;
case 'Telefono 3': TicketService::managePhone($em, $client, $value, "Telefono cellulare"); break;
case 'Referente': $client->setReferent($value); break;
case 'Orari apertura': $client->setOpenings($value); break;
case 'Giorno chiusura': $client->setClosures($value); break;
case 'Data scadenza':
if(!$isAlt){
if($k->displayMappingExtraValue('date_format') != null && $k->displayMappingExtraValue('date_format') != ''){
$datetime = date_create_from_format($k->displayMappingExtraValue('date_format'), $value);
if($datetime != "")
$ticket->setDatetimeExpiration($datetime);
}
}
else{
if($k->displayMappingExtraValue('alt_date_format') != null && $k->displayMappingExtraValue('alt_date_format') != ''){
$datetime = date_create_from_format($k->displayMappingExtraValue('alt_date_format'), $value);
if($datetime != "")
$ticket->setDatetimeExpiration($datetime);
}
}
$found = true;
break;
case 'Cassa':
case 'ABI':
case 'Risorsa':
case 'Risorsa upgrade':
case 'Accessori':
case 'Matricole':
case 'Anomalia':
case 'Connessioni':
case 'Dettagli operazione':
case 'Dettagli intervento':
case 'Note':
[$json, $first] = TicketService::addToJson($json, $first, $k->getTicketColumn(), $value);
break;
case 'Data richiesta':
if($k->displayMappingExtraValue('date_format') != null && $k->displayMappingExtraValue('date_format') != ''){
$datetime = date_create_from_format($k->displayMappingExtraValue('date_format'), $value);
if($datetime != "")
$ticket->setDatetimeStart($datetime);
}
case 'Ora richiesta':
if($k->displayMappingExtraValue('time_format') != null && $k->displayMappingExtraValue('time_format') != ''){
$datetime = date_create_from_format('Ymd'.$k->displayMappingExtraValue('time_format'), $ticket->getDatetimeStart()->format('Ymd').$value);
if($datetime != "")
$ticket->setDatetimeStart($datetime);
}
break;
default: break;
}
}
}
}
$json .= ']';
$ticket->setJsonReport($json);
$keysRequired = $em->getRepository('App\Entity\Slave\OperationKeyMapping')->findByOperationAndRequired($ticket->getOperation()->getId(), true);
foreach($keysRequired as $k){
$errorSlug = 'key_mapping';
$errorMsg = "Non esiste la chiave \"".$k->getMappingValue()."\" per la colonna \"".$k->getTicketColumn()."\" nel dettaglio del ticket";
$found = false;
$zip = null;
$altKey = $k->displayMappingExtraValue("alt_key");
foreach($array as $val){
$isAlt = false;
if(array_key_exists($k->getMappingValue(), $val) || ($altKey !== false && array_key_exists($altKey, $val))){
if(array_key_exists($k->getMappingValue(), $val))
$value = $val[$k->getMappingValue()];
else{
$value = $val[$altKey];
$isAlt = true;
}
switch($k->getTicketColumn()){
case 'Numero intervento':
$ticket->setNumber($value);
$found = true;
break;
case 'Term ID':
$code = UtilitiesService::updateTermidCodeToEightChars($value);
$termid = $em->getRepository('App\Entity\Slave\Termid')->findOneBy(array('code' => $code));
if($termid == null){
$termid = new Termid();
$termid->setClient($client);
$termid->setCode($value);
$em->persist($termid);
}
$found = true;
$ticket->setTermid($termid);
if(sizeof($termid->getProducts()) > 0){
foreach($termid->getProducts() as $prod)
$prod->getActualWarehouse($client->getWarehouse());
}
break;
case 'Insegna':
$client->setNickname($value);
if($client->getWarehouse()->getNickname() == null)
$client->getWarehouse()->setNickname('Cliente - '.$value);
$found = true;
break;
case 'CAP':
if($ticket->getZip() == null)
$ticket->setZip($value);
if($client->getZip() == null)
$client->setZip($value);
$found = true;
$zip = $emMaster->getRepository('App\Entity\Master\Zip')->findOneByCode($value);
if($zip != null){
$ticket->setIdProvince($zip->getCities()[0]->getProvince()->getId());
$client->setIdProvince($zip->getCities()[0]->getProvince()->getId());
}
break;
case 'Provincia':
$province = $emMaster->getRepository('App\Entity\Master\Province')->findOneBySignOrName($value);
if($province == null){
if($zip != null)
$province = $zip->getCity()->getProvince();
}
if($province != null){
$ticket->setIdProvince($province->getId());
$client->setIdProvince($province->getId());
if(TicketService::isInCoverCompany($company, $province->getRegion()->getId()))
$found = true;
else{
$errorSlug = 'city';
$errorMsg = "L'indirizzo del ticket non è in copertura all'azienda; assegna manualmente l'indirizzo!";
}
}
else{
$errorSlug = 'province_alias';
$errorMsg = 'Il server non ha trovato la provincia; seleziona la provincia corrispondente a: "'.$value.'"';
}
break;
case 'Città':
$city = $emMaster->getRepository('App\Entity\Master\City')->findByNameOrAliasAndProvince($value, $ticket->getIdProvince());
if($city != null){
$ticket->setIdCity($city->getId());
$client->setIdCity($city->getId());
$ticket->setIdProvince($city->getProvince()->getId());
$client->setIdProvince($city->getProvince()->getId());
if($zip == null && sizeof($city->getZips()) == 1){
$client->setZip($city->getZips()[0]->getCode());
$ticket->setZip($city->getZips()[0]->getCode());
}
if(TicketService::isInCoverCompany($company, $city->getProvince()->getRegion()->getId())){
$found = true;
}
else{
$errorSlug = 'city';
$errorMsg = "L'indirizzo del ticket non è in copertura all'azienda; assegna manualmente l'indirizzo!";
}
}
else{
$province = $emMaster->getRepository('App\Entity\Master\Province')->findOneById($ticket->getIdProvince());
$errorSlug = 'city_alias';
$errorMsg = 'Il server non ha trovato la città; verifica se devi inserire un alias per: "'.$value.'"';
}
break;
case 'Indirizzo':
$client->setAddress($value);
$ticket->setAddress($value);
$found = true;
break;
default: break;
}
}
}
if(!$found){
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug($errorSlug);
$ticket->setSystemErrorDetails($errorMsg);
$em->flush();
return true;
}
}
if($client->getZip() == null && $client->getIdCity() != null){
$city = $emMaster->getRepository('App\Entity\Master\City')->findOneById($client->getIdCity());
if(sizeof($city->getZips()) == 1)
$zip = $city->getZips()[0]->getCode();
else{
$zip = $city->getZips()[0]->getCode();
/* TODO
$address = $client->getAddress().' '.$city->getName().' '.$city->getProvince()->getSign();
$zip = UtilitiesService::calculateZipFromAddress($address);
*/
}
$client->setZip($zip);
$ticket->setZip($zip);
}
$em->flush();
return false;
}
static public function ticketMapOptionalColumns($em, $ticket)
{
$array = json_decode($ticket->getJson(), true);
$client = $ticket->getClient();
$first = true;
$json = '[';
$keysOptional = $em->getRepository('App\Entity\Slave\OperationKeyMapping')->findByOperationAndRequired($ticket->getOperation()->getId(), false);
foreach($keysOptional as $k){
$altKey = $k->displayMappingExtraValue("alt_key");
foreach($array as $val){
$isAlt = false;
if(array_key_exists($k->getMappingValue(), $val) || ($altKey !== false && array_key_exists($altKey, $val))){
if(array_key_exists($k->getMappingValue(), $val))
$value = $val[$k->getMappingValue()];
else{
$value = $val[$altKey];
$isAlt = true;
}
switch($k->getTicketColumn()){
case 'Telefono 1': TicketService::managePhone($em, $client, $value, "Telefono 1"); break;
case 'Telefono 2': TicketService::managePhone($em, $client, $value, "Telefono 2"); break;
case 'Telefono 3': TicketService::managePhone($em, $client, $value, "Telefono cellulare"); break;
case 'Referente': $client->setReferent($value); break;
case 'Orari apertura': $client->setOpenings($value); break;
case 'Giorno chiusura': $client->setClosures($value); break;
case 'Data scadenza':
if(!$isAlt){
if($k->displayMappingExtraValue('date_format') != null && $k->displayMappingExtraValue('date_format') != ''){
$datetime = date_create_from_format($k->displayMappingExtraValue('date_format'), $value);
if($datetime != "")
$ticket->setDatetimeExpiration($datetime);
}
}
else{
if($k->displayMappingExtraValue('alt_date_format') != null && $k->displayMappingExtraValue('alt_date_format') != ''){
$datetime = date_create_from_format($k->displayMappingExtraValue('alt_date_format'), $value);
if($datetime != "")
$ticket->setDatetimeExpiration($datetime);
}
}
$found = true;
break;
case 'Cassa':
case 'ABI':
case 'Risorsa':
case 'Risorsa upgrade':
case 'Accessori':
case 'Matricole':
case 'Anomalia':
case 'Connessioni':
case 'Dettagli operazione':
case 'Dettagli intervento':
case 'Note':
[$json, $first] = TicketService::addToJson($json, $first, $k->getTicketColumn(), $value);
break;
case 'Data richiesta':
if($k->displayMappingExtraValue('date_format') != null && $k->displayMappingExtraValue('date_format') != ''){
$datetime = date_create_from_format($k->displayMappingExtraValue('date_format'), $value);
if($datetime != "")
$ticket->setDatetimeStart($datetime);
}
case 'Ora richiesta':
if($k->displayMappingExtraValue('time_format') != null && $k->displayMappingExtraValue('time_format') != ''){
$datetime = date_create_from_format('Ymd'.$k->displayMappingExtraValue('time_format'), $ticket->getDatetimeStart()->format('Ymd').$value);
if($datetime != "")
$ticket->setDatetimeStart($datetime);
}
break;
default: break;
}
}
}
}
$json .= ']';
$ticket->setJsonReport($json);
$em->flush();
}
static public function managePhone($em, $client, $number, $name)
{
$found = false;
if($number != ""){
foreach($client->getPhones() as $phone){
if($phone->getNumber() == $number){
$found = true;
break;
}
}
if(!$found){
$clientPhone = new ClientPhone();
$clientPhone->setClient($client);
$clientPhone->setNumber($number);
$clientPhone->setName($name);
$em->persist($clientPhone);
$client->addPhone($clientPhone);
}
}
}
static public function ticketAssignOperationTariffAmount($em, $emMaster, $ticket)
{
$tariff = null;
$uavTariff = null;
$city = $emMaster->getRepository('App\Entity\Master\City')->findOneById($ticket->getIdCity());
// CERCO LA TARIFFA OPERAZIONE
if($city != null){
foreach($ticket->getOperation()->getTariffs() as $tar){
$zips = array();
foreach($tar->getZips() as $arrayZip)
array_push($zips, $arrayZip[1]);
if($tar->getIdProvince() == $city->getProvince()->getId() && ($tar->isAllZip() || in_array($ticket->getZip(), $zips))){
$tariff = $tar;
break;
}
}
}
// SE LA TARIFFA ESISTE, CONTROLLO GLI ALGORITMI DEI SUOI AMOUNT
if($tariff != null){
$found = false;
foreach($tariff->getAmounts() as $ota){
if($ota->getAlgorithm() != null && !$found){
switch($ota->getAlgorithm()->getSlug()){
case "monetica-massive-dll":
$matrix = json_decode($ticket->getJsonReport(), true);
foreach($matrix as $array){
if(array_key_exists('Anomalia', $array) && str_contains(strtolower($array["Anomalia"]), strtolower("Aggiornamento mandate")) && str_contains(strtolower($array["Anomalia"]), strtolower("effettuare DLL"))){
$operationTariffAmount = $ota;
$found = true;
break;
}
}
break;
default: break;
}
}
}
if(!$found)
$operationTariffAmount = $tariff->getStandardAmount();
$ticket->setOperationTariffAmount($operationTariffAmount);
$ticket->setSystemError(false);
}
else{
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug('tariff');
$ticket->setSystemErrorDetails("Tariffa operazione corrispondente a questa provincia/città/CAP da assegnare al ticket non trovata!");
$em->flush();
return true;
}
// CERCO L'OPERAZIONE UAV DEL FORNITORE
$uavOt = null;
foreach($ticket->getSupplier()->getOperations() as $op){
if($op->isUav()){
$uavOt = $op;
break;
}
}
// CERCO LE TARIFFE DELL'UAV
foreach($uavOt->getTariffs() as $uavTar){
$zips = array();
foreach($uavTar->getZips() as $arrayZip)
array_push($zips, $arrayZip[1]);
if($uavTar->getIdProvince() == $city->getProvince()->getId() && ($uavTar->isAllZip() || in_array($ticket->getZip(), $zips))){
$uavTariff = $uavTar;
break;
}
}
if($uavTariff != null){
$ticket->setUavOperationTariffAmount($uavTariff->getStandardAmount());
}
else{
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug('tariff-uav');
$ticket->setSystemErrorDetails("Tariffa UAV per il fornitore non trovata!");
$em->flush();
return true;
}
$em->flush();
}
static public function ticketAutoAssign($em, $emMaster, $user, $ticket, $mailer)
{
$autoAssign = $em->getRepository('App\Entity\Slave\Setting')->findOneBySlug('ticket_auto_assign');
if($autoAssign->getValue() && $ticket->getTechnician() == null){
$technicians = array();
$statusAssigned = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned'));
$city = $emMaster->getRepository('App\Entity\Master\City')->findOneById($ticket->getIdCity());
$techincianAreas = $em->getRepository('App\Entity\Slave\TechnicianArea')->findByIdProvinceAndUserAutoAssignIncluded($city->getProvince()->getId());
// Creo un array con i tecnici assegnabili
foreach($techincianAreas as $ta){
$zips = array();
foreach($ta->getZips() as $arrayZip)
array_push($zips, $arrayZip[1]);
$autoAssignSuppliersIds = array();
foreach($ta->getUser()->getAutoAssignSuppliers() as $supplier)
array_push($autoAssignSuppliersIds, $supplier->getId());
// SE tecnico gestisce quei fornitori E copre tutta l'area O il CAP del cliente ---> pusho nell'array
if(in_array($ticket->getOperation()->getSupplier()->getId(), $autoAssignSuppliersIds) && ($ta->isAllZip() || in_array($ticket->getZip(), $zips)))
array_push($technicians, $ta->getUser());
}
if(sizeof($technicians) > 0){
TicketService::createTicketLog($em, $user, $ticket, "cs", $ticket->getStatus(), $statusAssigned->getValue());
$ticket->setStatus($statusAssigned);
if(sizeof($technicians) == 1){
// Se c'è solo un tecnico --- Se non è in ferie lo assegno altrimenti assegno il sostituto
if($technicians[0]->getActualHoliday() == false){
$ticket->setTechnician($technicians[0]);
TicketService::createTicketLog($em, $user, $ticket, "ct", $ticket->getTechnician(), $technicians[0]);
}
else{
TicketService::createTicketLog($em, $user, $ticket, "ct", $ticket->getTechnician(), $technicians[0]->getActualHoliday()->getSubstitute());
$ticket->setTechnician($technicians[0]->getActualHoliday()->getSubstitute());
}
}
else{
// Scremo i tecnici che sono in ferie
$techs = array();
foreach($technicians as $technician){
if($technician->getActualHoliday() == false)
array_push($techs, $technician);
}
if(sizeof($techs) > 0){
if(sizeof($techs) == 1){
$technician = $techs[0];
}
else{
$first = true;
foreach($techs as $t){
if($first){
$first = false;
$technician = $t;
}
if($technician->countTicketsUnderManagement('actual') > $t->countTicketsUnderManagement('actual'))
$technician = $t;
}
}
TicketService::createTicketLog($em, $user, $ticket, "ct", $ticket->getTechnician(), $technician);
$ticket->setTechnician($technician);
}
}
}
$em->flush();
// Invio messaggio di notifica al tecnico
$settingTechnicianSendAssignEmail = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_send_assign_email'));
if($settingTechnicianSendAssignEmail->getValue() == 1 && $ticket->getTechnician()->isAssignEmailActive()){
$tickets = [];
array_push($tickets, $ticket);
$message = (new TemplatedEmail())
->subject($this->params->get('subject_ticket_take_charge'))
->from($this->params->get('email_noreply'))
->to($ticket->getTechnician()->getEmail())
->htmlTemplate('email/technician_tickets.html.twig')
->context(['user' => $ticket->getTechnician(), 'tickets' => $tickets]);
$mailer->send($message);
}
}
return true;
}
// SCARICA DA EMAIL
static public function downloadTicket($em, $emMaster, $user, $inbox, $email, $mailer, $testing, $company, $countTicket, $countTicketError)
{
$header = imap_headerinfo($inbox, $email); // Gestisco l'header
$sender = null;
// Serve per skippare le email che non hanno mittente o di spam
if(property_exists($header, 'from') && property_exists($header->from[0], 'host'))
$sender = $header->from[0]->mailbox."@".$header->from[0]->host;
$supplierTicketEmails = $em->getRepository('App\Entity\Slave\SupplierTicketEmail')->findBySenderAndMailer($sender, $mailer);
[$supplier, $tickets] = TicketService::importTickets($em, $emMaster, $user, $inbox, $email, $header, $supplierTicketEmails);
$now = new \DateTime();
if(!$testing){
if($tickets != null){
// Se ha creato ticket -> Segno email vista e sposto nella cartella fornitore
imap_setflag_full($inbox, $email, "\\SEEN");
if($supplier != null)
imap_mail_move($inbox, $email, 'INBOX.'.$supplier->getSlug());
else
imap_mail_move($inbox, $email, 'INBOX.nexi');
$countTicket++;
}
else{
$dt = explode(', ', $header->date); // Prendo la data di creazione
$dts = explode(' (', $dt[sizeof($dt) - 1]); // Pulisco mettendo il formato per il create_date_from_format
$dtsTrim = rtrim(ltrim($dts[0]));
$datetimeStart = date_create_from_format('j M Y H:i:s O', $dtsTrim); //4 Jul 2023 16:00:11 +0200"
$threeHours = date_modify(clone($datetimeStart), "+3 hours");
// Se non ha creato ticket -> Controllo se è lì da più di 3 ore la sposto in "other"
if($threeHours->format("YmdHis") < $now->format("YmdHis"))
imap_mail_move($inbox, $email, 'INBOX.other');
}
}
else{
if($tickets != null)
$countTicket++;
}
foreach($tickets as $ticket){
if($ticket->getOperation() != null){
$error = TicketService::ticketMapClient($em, $ticket);
if(!$error) $error = TicketService::ticketMapColumns($em, $emMaster, $company, $ticket);
if(!$error) $error = TicketService::ticketAssignOperationTariffAmount($em, $emMaster, $ticket);
if(!$error) TicketService::ticketAutoAssign($em, $emMaster, $user, $ticket, $mailer);
}
else{
$error = true;
if($supplier != null){
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug('operation');
$ticket->setSystemErrorDetails("Impossibile determinare l'<b>operazione</b> del ticket");
$em->flush();
}
}
if($error)
$countTicketError++;
}
return [$countTicket, $countTicketError];
}
// IMPORT CSV
// Chiamata da UserTicketController
static public function importFile($em, $emMaster, $user, $form, $company, $operationId, $row, $mailer)
{
$supplierSlug = $form->get('supplier')->getData();
$file = $form->get('file')->getData();
$separator = $form->get('separator')->getData();
$tickets = array();
$arrayNumberTermids = array();
$countInserted = 0;
$content = file_get_contents($file);
$content = preg_replace('/\\\\/', '/', $content);
switch($supplierSlug){
case 'demis-adp':
case 'bcc-pos':
case 'lis-holding':
case 'nexi':
case 'nexi-book-sia':
case 'worldline-italia':
case 'worldline-ccb':
$content = preg_replace('/,,/', ',"",', $content);
$content = preg_replace('/\",\"/', '";"', $content);
$separator = ";";
break;
case 'fabrick':
case 'sate':
break;
default: break;
}
file_put_contents($file, $content);
if(($handle = fopen($file, "r")) !== FALSE) {
while(($data = fgetcsv($handle, 5000, $separator)) !== FALSE) {
// Data
switch($supplierSlug){
case 'bcc-pos':
case 'fabrick':
case 'lis-holding':
case 'nexi':
case 'sate':
case 'worldline-italia':
case 'worldline-ccb':
$dataEncoded = array_map("utf8_encode", $data);
break;
case 'demis-adp':
case 'nexi-book-sia':
$dataEncoded = $data;
break;
default: break;
}
if($row == 0){
$keys = TicketService::importFileGetKeys($dataEncoded);
}
else{
switch($supplierSlug){
case 'fabrick': $json = TicketService::importFileCreateJson($dataEncoded, $keys, true); break;
default: $json = TicketService::importFileCreateJson($dataEncoded, $keys, false); break;
}
// Supplier
switch($supplierSlug){
case 'demis-adp':
case 'bcc-pos':
case 'fabrick':
case 'lis-holding':
case 'nexi-book-sia':
$supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => $supplierSlug));
break;
case 'nexi':
case 'sate':
case 'worldline':
case 'worldline-italia':
case 'worldline-ccb':
$supplierIdentifier = TicketService::importFileFindSupplier($em, $supplierSlug, $json);
switch($supplierIdentifier){
case "Meps": $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'nexi-book-meps')); break;
case "Monetica": $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'nexi-book-monetica')); break;
case "CCB": $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'worldline-ccb')); break;
case "Normal": $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'worldline-italia')); break;
case "Sate-Argentea": $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'sate---argentea')); break;
case "Sate-Flagpay": $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'sate---flagpay')); break;
case "Sate-Mooney": $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'sate---mooney')); break;
case "Sate-Numera": $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'sate---numera')); break;
case "Sate-Pluxee": $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'sate---pluxee')); break;
case "Sate-Worldline": $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'sate---worldline')); break;
default: break;
}
break;
default: break;
}
// Operation
$operation = null;
switch($supplierSlug){
case 'demis-adp':
case 'bcc-pos':
case 'fabrick':
case 'lis-holding':
case 'nexi':
case 'sate':
case 'worldline-italia':
case 'worldline-ccb':
$operation = TicketService::importFileDefineOperation($supplier, $keys, $data);
break;
case 'nexi-book-sia':
$operation = $em->getRepository('App\Entity\Slave\Operation')->findOneById($operationId);
break;
default: break;
}
// Datetime start
$array = json_decode($json, true);
$datetime = null;
$datetimeField = null;
$datetimeFormat = null;
switch($supplierSlug){
case 'bcc-pos':
foreach($array as $val){
if(array_key_exists('DataScheda', $val)) $date = $val['DataScheda'];
if(array_key_exists('Dataordine', $val)) $date = $val['Dataordine'];
if(array_key_exists('Ora Ordine', $val)) $time = $val['Ora Ordine'];
}
$datetime = $date." ".$time;
$datetimeFormat = 'dmY Hi';
break;
case 'fabrick':
$datetimeField = 'Data creazione';
$datetimeFormat = 'd-m-Y H:i:s';
break;
case 'lis-holding':
// MANCA DATA DI RICEZIONE
break;
case 'nexi':
$datetimeField = 'Data ora assegnazione';
$datetimeFormat = 'd/m/Y H.i';
break;
case 'demis-adp':
case 'worldline-italia':
case 'worldline-ccb':
$datetimeField = 'Data apertura';
$datetimeFormat = 'd/m/Y H:i';
break;
case 'nexi-book-sia':
$datetimeField = 'sys_created_on';
$datetimeFormat = 'd-m-Y H:i:s';
break;
case 'sate':
$datetimeField = 'Data apertura';
$datetimeFormat = 'd/m/Y H:i:s';
break;
default: break;
}
if($datetime == null){
foreach($array as $val){
if(array_key_exists($datetimeField, $val))
$datetime = $val[$datetimeField];
}
}
$datetimeStart = date_create_from_format($datetimeFormat, $datetime);
[$tickets, $arrayNumberTermids] = TicketService::importFileCreateTicket($em, $user, $tickets, $supplier, $operation, $datetimeStart, $json, $arrayNumberTermids);
}
$row++;
}
fclose($handle);
}
$error = false;
foreach($tickets as $ticket){
//QUESTO IF SERVE PERCHE' IL CONTROLLO DEI DOPPIONI SE ESISTE RITORNA COMUNQUE UN TICKET NULL
if($ticket != null){
if($ticket->getOperation() != null){
$error = TicketService::ticketMapClient($em, $ticket);
if(!$error) $error = TicketService::ticketMapColumns($em, $emMaster, $company, $ticket);
if(!$error) TicketService::ticketAssignOperationTariffAmount($em, $emMaster, $ticket);
if(!$error) TicketService::ticketAutoAssign($em, $emMaster, $user, $ticket, $mailer);
}
else{
$error = true;
if($supplier != null){
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug('operation');
$ticket->setSystemErrorDetails("Impossibile determinare l'<b>operazione</b> del ticket");
$em->flush();
}
}
$countInserted++;
}
}
return [$error, $row, $countInserted];
}
static public function importFileCSC($em, $emMaster, $user, $form, $error, $row, $countInserted, $mailer)
{
$arrayNumberTermids = [];
if(($handle = fopen($form->get('file')->getData(), "r")) !== FALSE) {
while(($data = fgetcsv($handle, 2000, $form->get('separator')->getData())) !== FALSE) {
if($row == 0){
$data = preg_replace("/à/", "a", $data);
$keys = TicketService::importFileGetKeys(array_map("utf8_encode", $data));
}
else{
$json = TicketService::importFileCreateJson(array_map("utf8_encode", $data), $keys, false);
$array = json_decode($json, true);
$supplier = null;
$supOpPrefix = null;
switch(strtolower($array[10]['Cliente'])){
case 'c global': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cglobal')); $supOpPrefix = 'csc_cglobal'; break;
case 'c-global spa': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cglobal')); $supOpPrefix = 'csc_cglobal'; break;
case 'stripe': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---stripe')); $supOpPrefix = 'csc_stripe'; break;
case 'cronos': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cronos')); $supOpPrefix = 'csc_cronos'; break;
case 'cronos s.r.l.': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cronos')); $supOpPrefix = 'csc_cronos'; break;
case 'c.s.e. centro servizi elettronici': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cse')); $supOpPrefix = 'csc_cse'; break;
case 'decathlon italia s.r.l': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---decathlon')); $supOpPrefix = 'csc_decathlon'; break;
case 'euronet': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---euronet')); $supOpPrefix = 'csc_euronet'; break;
case 'get your bill': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---get-your-bill')); $supOpPrefix = 'csc_euronet'; break;
case 'lis pay': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---lis-pay')); $supOpPrefix = 'csc_lis_pay'; break;
case 'lis poste pay': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---lispostepay')); $supOpPrefix = 'csc_lis_poste_pay'; break;
case 'numera sist. e inform. spa': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---numera')); $supOpPrefix = 'csc_numera'; break;
case 'q8': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---q8')); $supOpPrefix = 'csc_q8'; break;
case 'pay distribution-yamamay': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---yamamay')); $supOpPrefix = 'csc_yamamay'; break;
case 'nexi payments s.p.a.': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---nexi-book-monetica')); $supOpPrefix = 'csc_nexi_book_monetica'; break;
case 'p4cards': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---p4cards')); $supOpPrefix = 'csc_p4cards'; break;
case 'repas': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---repas')); $supOpPrefix = 'csc_repas'; break;
default: break;
}
$operation = null;
switch(strtolower($array[24]['Tipo int.'])){
case 'assistenza':
case 'intervento tecnico':
case 'intervento tecnico premium':
case 'intervento tecnico - upgrade pos':
case 'ritorno x intervento errato':
$operation = $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_maintenance'));
break;
case 'migrazione':
case 'sostituzione massiva':
$operation = $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_massive'));
break;
case 'disinstallazione':
$operation = $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_uninstallation'));
break;
case 'installazione pos':
case 'installazione ordinaria':
case 'Installazione pos Urgente':
$operation = $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_installation'));
break;
case 'sostituzione':
case 'sostituzione terminale':
case 'reinst/riconfig terminale':
case 'sost pos (no rientro pos old)':
$operation = $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_replacement'));
break;
default: break;
}
$technician = null;
switch(strtolower($array[18]['Tecnico Assegnatario'])){
case 'biondist': $technician = $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'stefanobiondi71@gmail.com')); break;
case 'butialb': $technician = $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'alberto.buti@stsolution.biz')); break;
case 'centroufficioelba': $technician = $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'cuelba@elba2000.it')); break;
case 'chellis': $technician = $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'chelli.simone@gmail.com')); break;
case 'delbiancogiulio': $technician = $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'giulio.delbianco@stsolution.biz')); break;
case 'gemolimirko': $technician = $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'mirko.gemoli@stsolution.biz')); break;
case 'iavernarogianluca': $technician = $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'gianluca.iavernaro@stsolution.biz')); break;
case 'lippiluca': $technician = $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'luca.lippi@stsolution.biz')); break;
case 'loriniandrea': $technician = $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'andrea.lorini@stsolution.biz')); break;
case 'marinof': $technician = $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'francesco.marino@stsolution.biz')); break;
case 'speedyline': $technician = $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'speedylineservice@gmail.com')); break;
case 'toscana01':
case 'zelonimanuel':
$technician = $em->getRepository('App\Entity\Slave\User')->findOneBy(array('email' => 'diessesrl@eposmanager.software'));
break;
default: break;
}
[$ticketAlreadyExist, $arrayNumberTermids] = TicketService::checkTicketExistanceCsv($em, $json, $array[1]['ID intervento cliente'], $array[8]['Termid'], $arrayNumberTermids);
if(!$ticketAlreadyExist){
$countInserted++;
$today = new \Datetime();
$datetimeStart = date_create_from_format('d/m/Y H:i', $array[2]['D/O Ricezione']);
$datetimeExpiration = date_create_from_format('d/m/Y H:i', $array[4]['D/O Scadenza']);
$datetimeEnd = date_create_from_format('d/m/Y H:i', $array[6]['Data/ora chiusura']);
$province = $emMaster->getRepository('App\Entity\Master\Province')->findOneBy(array('sign' => $array[17]['Prov']));
$city = $emMaster->getRepository('App\Entity\Master\City')->findByNameOrAliasAndProvince($array[16]['Localita'], $province->getId());
$jsonReport = '[{"ABI":'.json_encode($array[11]['ABI Rif.']).'}, {"Matricole":'.json_encode($array[22]['Matricola']).'}, {"Anomalia":'.json_encode($array[26]['Anomalia']).'}]';
$termid = $em->getRepository('App\Entity\Slave\Termid')->findOneByCode($array[8]['Termid']);
if($termid == null){
$termid = new Termid();
$termid->setCode($array[8]['Termid']);
$em->persist($termid);
}
$client = $termid->getClient();
if($client == null){
$client = $em->getRepository('App\Entity\Slave\Termid')->findOneByCode($array[9]['SIA']);
if($client == null){
$client = new Client();
$client->setCode($array[9]['SIA']);
$client->setName($array[12]['Rag.Soc.']);
$client->setNickname($array[13]['Insegna']);
$client->setAddress($array[14]['Indirizzo']);
$client->setZip($array[15]['CAP']);
if($city != null) $client->setIdCity($city->getId());
$client->setIdProvince($province->getId());
$em->persist($client);
$clientPhone = new ClientPhone();
$clientPhone->setClient($client);
$clientPhone->setName('Telefono 1');
$clientPhone->setNumber($array[19]['Tel.']);
$em->persist($clientPhone);
$warehouse = new Warehouse();
$warehouse->setClient($client);
$warehouse->setNickname('Magazzino cliente - '.$client->getNickname());
$warehouse->setMovable(false);
$client->setWarehouse($warehouse);
$em->persist($warehouse);
}
$termid->setClient($client);
}
$ticket = new Ticket();
$ticket->setNumber($array[0]['id scheda']);
$ticket->setSupplier($supplier);
$ticket->setClient($client);
$ticket->setOperation($operation);
$ticket->setTermid($termid);
$ticket->setDatetimeStart($datetimeStart);
$ticket->setDatetimeExpiration($datetimeExpiration);
$ticket->setDatetimeEnd($datetimeEnd);
$ticket->setJson($json);
$ticket->setDirectoryPath($today->format("Y").'/'.$today->format("m").'/'.md5(uniqid()));
$ticket->setJsonReport($jsonReport);
$ticket->setAddress($array[14]['Indirizzo']);
$ticket->setZip($array[15]['CAP']);
if($city != null)
$ticket->setIdCity($city->getId());
else
$ticket->setOtherCity($array[16]['Localita']);
$ticket->setIdProvince($province->getId());
$ticket->setClosedOnPortal(false);
$ticket->setDatetimeImport(new \DateTime());
$array = json_decode($json, true);
for($i=0; $i<sizeof($array); $i++){
if($supplier->getOperationNotBillableCodes() != null && $supplier->getOperationNotBillableCodes() != '' && array_key_exists($supplier->getOperationMapping(), $array[$i]) && preg_match('/'.$supplier->getOperationNotBillableCodes().'/', $array[$i][$supplier->getOperationMapping()]))
$ticket->setBillable(false);
}
$em->persist($ticket);
TicketService::createTicketLog($em, $user, $ticket, "ct", $ticket->getTechnician(), $technician);
$ticket->setTechnician($technician);
if($technician == null){
$statusToAssign = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'to_assign'));
TicketService::createTicketLog($em, $user, $ticket, "cs", null, $statusToAssign->getValue());
$ticket->setStatus($statusToAssign);
}
else{
$statusAssigned = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned'));
TicketService::createTicketLog($em, $user, $ticket, "cs", null, $statusAssigned->getValue());
$ticket->setStatus($statusAssigned);
}
$em->flush();
TicketService::ticketAssignOperationTariffAmount($em, $emMaster, $ticket);
// Invio messaggio di notifica al tecnico
$settingTechnicianSendAssignEmail = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_send_assign_email'));
if($settingTechnicianSendAssignEmail->getValue() == 1 && $ticket->getTechnician()->isAssignEmailActive()){
$tickets = [];
array_push($tickets, $ticket);
$message = (new TemplatedEmail())
->subject($this->params->get('subject_ticket_take_charge'))
->from($this->params->get('email_noreply'))
->to($ticket->getTechnician()->getEmail())
->htmlTemplate('email/technician_tickets.html.twig')
->context(['user' => $ticket->getTechnician(), 'tickets' => $tickets]);
$mailer->send($message);
}
}
}
$row++;
}
}
return [$error, $row, $countInserted];
}
static public function importFileCSCNew($em, $emMaster, $user, $form, $error, $row, $countInserted, $mailer)
{
$arrayNumberTermids = [];
if(($handle = fopen($form->get('file')->getData(), "r")) !== FALSE) {
while(($data = fgetcsv($handle, 2000, $form->get('separator')->getData())) !== FALSE) {
if($row == 0){
$data = preg_replace("/à/", "a", $data);
$keys = TicketService::importFileGetKeys(array_map("utf8_encode", $data));
}
else{
$json = TicketService::importFileCreateJson(array_map("utf8_encode", $data), $keys, false);
$array = json_decode($json, true);
$supplier = null;
$supOpPrefix = null;
switch(strtolower($array[0]['Cliente'])){
case 'c global': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cglobal')); $supOpPrefix = 'csc_cglobal'; break;
case 'c-global spa': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cglobal')); $supOpPrefix = 'csc_cglobal'; break;
case 'stripe': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---stripe')); $supOpPrefix = 'csc_stripe'; break;
case 'cronos': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cronos')); $supOpPrefix = 'csc_cronos'; break;
case 'cronos s.r.l.': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cronos')); $supOpPrefix = 'csc_cronos'; break;
case 'c.s.e. centro servizi elettronici': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---cse')); $supOpPrefix = 'csc_cse'; break;
case 'decathlon italia s.r.l': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---decathlon')); $supOpPrefix = 'csc_decathlon'; break;
case 'euronet': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---euronet')); $supOpPrefix = 'csc_euronet'; break;
case 'get your bill': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---get-your-bill')); $supOpPrefix = 'csc_euronet'; break;
case 'lis pay': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---lis-pay')); $supOpPrefix = 'csc_lis_pay'; break;
case 'lis poste pay': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---lispostepay')); $supOpPrefix = 'csc_lis_poste_pay'; break;
case 'numera sist. e inform. spa': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---numera')); $supOpPrefix = 'csc_numera'; break;
case 'q8': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---q8')); $supOpPrefix = 'csc_q8'; break;
case 'pay distribution-yamamay': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---yamamay')); $supOpPrefix = 'csc_yamamay'; break;
case 'nexi payments s.p.a.': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---nexi-book-monetica')); $supOpPrefix = 'csc_nexi_book_monetica'; break;
case 'p4cards': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---p4cards')); $supOpPrefix = 'csc_p4cards'; break;
case 'repas': $supplier = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'csc---repas')); $supOpPrefix = 'csc_repas'; break;
default: break;
}
$operation = null;
switch(strtolower($array[1]['Tipo'])){
case 'assistenza':
case 'intervento tecnico':
case 'intervento tecnico premium':
case 'intervento tecnico - upgrade pos':
case 'ritorno x intervento errato':
$operation = $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_maintenance'));
break;
case 'migrazione':
case 'sostituzione massiva':
$operation = $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_massive'));
break;
case 'disinstallazione':
$operation = $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_uninstallation'));
break;
case 'installazione pos':
case 'installazione ordinaria':
case 'Installazione pos Urgente':
$operation = $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_installation'));
break;
case 'sostituzione':
case 'sostituzione terminale':
case 'reinst/riconfig terminale':
case 'sost pos (no rientro pos old)':
$operation = $em->getRepository('App\Entity\Slave\Operation')->findOneBy(array('slugMaster' => $supOpPrefix.'_replacement'));
break;
default: break;
}
$technician = null;
[$ticketAlreadyExist, $arrayNumberTermids] = TicketService::checkTicketExistanceCsv($em, $json, $array[2]['Intervento cliente'], $array[3]['TID'], $arrayNumberTermids);
if(!$ticketAlreadyExist){
$countInserted++;
$today = new \Datetime();
$datetimeStart = date_create_from_format('d/m/Y H:i:s', $array[8]['Data apertura']);
$datetimeExpiration = date_create_from_format('d/m/Y H:i:s', $array[11]['Data scadenza']);
$province = $emMaster->getRepository('App\Entity\Master\Province')->findOneBy(array('name' => $array[29]['Provincia']));
$city = $emMaster->getRepository('App\Entity\Master\City')->findByNameOrAliasAndProvince($array[31]['Citta'], $province->getId());
$termid = $em->getRepository('App\Entity\Slave\Termid')->findOneByCode($array[3]['TID']);
if($termid == null){
$termid = new Termid();
$termid->setCode($array[3]['TID']);
$em->persist($termid);
}
$client = $termid->getClient();
if($client == null){
$client = new Client();
$client->setCode($array[3]['TID']);
$client->setName($array[5]['Insegna']);
$client->setNickname($array[5]['Insegna']);
$client->setAddress($array[32]['Indirizzo']);
$client->setZip($array[30]['Cap']);
if($city != null) $client->setIdCity($city->getId());
$client->setIdProvince($province->getId());
$em->persist($client);
$clientPhone = new ClientPhone();
$clientPhone->setClient($client);
$clientPhone->setName('Telefono 1');
$clientPhone->setNumber($array[34]['Telefono 1']);
$em->persist($clientPhone);
if($array[35]['Telefono 2'] != "" && $array[35]['Telefono 2'] != '-'){
$clientPhone = new ClientPhone();
$clientPhone->setClient($client);
$clientPhone->setName('Telefono 2');
$clientPhone->setNumber($array[35]['Telefono 2']);
$em->persist($clientPhone);
}
$warehouse = new Warehouse();
$warehouse->setClient($client);
$warehouse->setNickname('Magazzino cliente - '.$client->getNickname());
$warehouse->setMovable(false);
$client->setWarehouse($warehouse);
$em->persist($warehouse);
$termid->setClient($client);
}
$ticket = new Ticket();
$ticket->setNumber($array[2]['Intervento cliente']);
$ticket->setSupplier($supplier);
$ticket->setClient($client);
$ticket->setOperation($operation);
$ticket->setTermid($termid);
$ticket->setDatetimeStart($datetimeStart);
$ticket->setDatetimeExpiration($datetimeExpiration);
$ticket->setJson($json);
$ticket->setDirectoryPath($today->format("Y").'/'.$today->format("m").'/'.md5(uniqid()));
$ticket->setAddress($array[32]['Indirizzo']);
$ticket->setZip($array[30]['Cap']);
if($city != null)
$ticket->setIdCity($city->getId());
else
$ticket->setOtherCity($array[31]['Citta']);
$ticket->setIdProvince($province->getId());
$ticket->setClosedOnPortal(false);
$ticket->setDatetimeImport(new \DateTime());
$array = json_decode($json, true);
for($i=0; $i<sizeof($array); $i++){
if($supplier->getOperationNotBillableCodes() != null && $supplier->getOperationNotBillableCodes() != '' && array_key_exists($supplier->getOperationMapping(), $array[$i]) && preg_match('/'.$supplier->getOperationNotBillableCodes().'/', $array[$i][$supplier->getOperationMapping()]))
$ticket->setBillable(false);
}
$em->persist($ticket);
TicketService::createTicketLog($em, $user, $ticket, "ct", $ticket->getTechnician(), $technician);
$ticket->setTechnician($technician);
if($technician == null){
$statusToAssign = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'to_assign'));
TicketService::createTicketLog($em, $user, $ticket, "cs", null, $statusToAssign->getValue());
$ticket->setStatus($statusToAssign);
}
else{
$statusAssigned = $em->getRepository('App\Entity\Slave\TicketStatus')->findOneBy(array('slug' => 'assigned'));
TicketService::createTicketLog($em, $user, $ticket, "cs", null, $statusAssigned->getValue());
$ticket->setStatus($statusAssigned);
}
$em->flush();
TicketService::ticketAssignOperationTariffAmount($em, $emMaster, $ticket);
// Invio messaggio di notifica al tecnico
$settingTechnicianSendAssignEmail = $em->getRepository('App\Entity\Slave\Setting')->findOneBy(array('slug' => 'ticket_technician_send_assign_email'));
if($settingTechnicianSendAssignEmail->getValue() == 1 && $ticket->getTechnician()->isAssignEmailActive()){
$tickets = [];
array_push($tickets, $ticket);
$message = (new TemplatedEmail())
->subject($this->params->get('subject_ticket_take_charge'))
->from($this->params->get('email_noreply'))
->to($ticket->getTechnician()->getEmail())
->htmlTemplate('email/technician_tickets.html.twig')
->context(['user' => $ticket->getTechnician(), 'tickets' => $tickets]);
$mailer->send($message);
}
}
}
$row++;
}
}
return [$error, $row, $countInserted];
}
// Funzioni di gestione
static public function importFileGetKeys($data)
{
$keys = array();
foreach($data as $d)
array_push($keys, $d);
return $keys;
}
static public function importFileCreateJson($data, $keys, $utf8Decode)
{
$first = true;
$json = '[';
for($i = 0; $i < sizeof($data); $i++){
if($utf8Decode)
$keys[$i] = utf8_decode($keys[$i]);
[$json, $first] = TicketService::addToJson($json, $first, $keys[$i], $data[$i]);
}
$json.= ']';
return $json;
}
static public function importFileFindSupplier($em, $supplierType, $json)
{
$identifier = null;
switch($supplierType){
case 'nexi':
$supplierMonetica = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'nexi-book-monetica'));
$supplierMeps = $em->getRepository('App\Entity\Slave\Supplier')->findOneBy(array('slug' => 'nexi-book-meps'));
$identifier = TicketService::nexiSupplierSearch($supplierMonetica, $json);
if($identifier == null)
$identifier = TicketService::nexiSupplierSearch($supplierMeps, $json);
break;
case 'demis-adp':
case 'worldline':
case 'worldline-italia':
case 'worldline-ccb':
$identifier = TicketService::worldlineSupplierSearch('import', $json);
break;
case 'sate':
$identifier = TicketService::sateSupplierSearch('import', $json);
break;
default: break;
}
return $identifier;
}
static public function importFileDefineOperation($supplier, $keys, $data)
{
$index = null;
$operation = null;
for($k = 0; $k < sizeof($keys); $k++){
$keys[$k] = preg_replace("/\"/","", $keys[$k]);
$keys[$k] = preg_replace("//","", $keys[$k]);
if(rtrim(ltrim(strtolower($keys[$k]), '"'), '"') == strtolower($supplier->getOperationMapping())){
$index = $k;
break;
}
}
if($index !== null){
foreach($supplier->getOperations() as $op){
if(!$op->isUav() && $op->getIdentifierRegex() != null){
if(preg_match('/'.$op->getIdentifierRegex().'/', $data[$index])){
$operation = $op;
break;
}
}
}
}
return $operation;
}
static public function importFileCreateTicket($em, $user, $tickets, $supplier, $operation, $datetimeStart, $json, $arrayNumberTermids)
{
[$ticket, $arrayNumberTermids] = TicketService::createTicket($em, $user, $supplier, $operation, $datetimeStart, $json, $arrayNumberTermids);
if($ticket != null && $operation == null){
$ticket->setSystemError(true);
$ticket->setSystemErrorSlug('key_mapping');
$ticket->setSystemErrorDetails("Non esiste la chiave \"".$supplier->getOperationMapping()."\" nei dettagli del ticket");
$em->flush();
}
if($ticket != null)
array_push($tickets, $ticket);
return [$tickets, $arrayNumberTermids];
}
static public function createTicketLog($em, $user, $ticket, $action, $oldValue, $newValue)
{
$persist = false;
switch($action){
case 'cs':
if(($oldValue != null && $oldValue->getValue() != $newValue) || ($oldValue == null && $newValue != null))
$persist = true;
break;
case 'ct':
if(($oldValue != null && $newValue != null && $oldValue->__toString() != $newValue->__toString()) || ($oldValue == null && $newValue != null) || ($oldValue != null && $newValue == null))
$persist = true;
break;
default: break;
}
if($persist){
$ticketLog = new TicketLog();
$ticketLog->setTicket($ticket);
$ticketLog->setDatetime(new \Datetime());
$ticketLog->setAction($action);
if($user != null)
$ticketLog->setOperator($user->__toString());
else
$ticketLog->setOperator('Script');
switch($action){
case 'cs':
if($oldValue == null) $oldValue = "Nessuno"; else $oldValue = $oldValue->getValue();
if($newValue == null) $newValue = "Nessuno";
$ticketLog->setOldValue($oldValue);
$ticketLog->setNewValue($newValue);
break;
case 'ct':
if($oldValue == null) $oldValue = "Nessuno"; else $oldValue = $oldValue->__toString();
if($newValue == null) $newValue = "Nessuno"; else $newValue = $newValue->__toString();
$ticketLog->setOldValue($oldValue);
$ticketLog->setNewValue($newValue);
break;
default: break;
}
$em->persist($ticketLog);
$em->flush($ticketLog);
}
}
}