<?php
/**
* Created by PhpStorm.
*/
namespace App\Services;
use App\Entity\Avoir;
use App\Entity\AvoirMontantTva;
use App\Entity\DocUpload;
use App\Entity\EfacAuth;
use App\Entity\EfacData;
use App\Entity\Entreprise;
use App\Entity\FactureFinance;
use App\Entity\FactureFinanceMontantTva;
use App\Entity\Fournisseur;
use App\Entity\Project;
use App\Entity\ProjectAvoir;
use App\Entity\ProjectFactureFinance;
use App\Entity\Spv;
use App\Form\CentraleType;
use App\Form\EntrepriseType;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Twig\Environment;
use App\Entity\Centrale;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Validator\Validation;
use Symfony\Component\HttpClient\HttpClient;
class EfacApiService
{
private $em;
private $params;
public function __construct(
ParameterBagInterface $params,
EntityManagerInterface $em,
Notifications $notifications
) {
$this->em = $em;
$this->params = $params;
$this->notification = $notifications;
}
public function authApiEfac($publicKey,$secretKey){
if (!$publicKey || !$secretKey) {
return ['error' => 'Clés manquantes' , 'status'=> Response::HTTP_UNAUTHORIZED];
}
$client = $this->em->getRepository(EfacAuth::class)->findOneBy(['publicKey' => $publicKey]);
if (!$client) {
return ['error' => 'Clé publique invalide' , 'status'=> Response::HTTP_FORBIDDEN];
}
if ($client && $client->getSecretKey() !== $secretKey ) {
return ['error' => 'Clé secrète invalide' , 'status'=> Response::HTTP_FORBIDDEN];
}
if ($client && !$client->getIsEnabled() ) {
return ['error' => 'Accès non activés' , 'status'=> Response::HTTP_FORBIDDEN];
}
return ['message' => 'Accès autorisé' , 'status'=> Response::HTTP_OK];
}
public function getTypeDocument($type){
if(in_array($type,[EfacData::document_facture_affacturee,
EfacData::document_facture_auto_facturee,
EfacData::document_facture_auto_facturee_affacturee,
EfacData::document_facture_commercial,
EfacData::document_facture_rectificative,
EfacData::document_facture_rectificative_affacturee,
EfacData::document_facture_rectificative_auto_facturee_affacturee,
EfacData::document_facture_rectificative_auto_facturee
])){
return EfacData::type_facture;
}
elseif (in_array($type,[EfacData::document_acompte_facture,EfacData::document_acompte_auto_facture])){
return EfacData::type_acompte;
}elseif (in_array($type,[EfacData::document_avoir,
EfacData::document_avoir_affacturee,
EfacData::document_avoir_auto_facture,
EfacData::document_avoir_auto_facture_affacturee,
EfacData::document_avoir_facture_acompte,
EfacData::document_avoir_remise_globale
])){
return EfacData::type_avoir;
}else{
return null;
}
}
public function addFactureOrAvoir($request){
$data = json_decode($request->getContent(), true);
if (!$data) {
$this->addEfacDataLog('',$request->getContent(),'JSON invalide');
return ['error' => 'JSON invalide' , 'status'=> Response::HTTP_BAD_REQUEST];
}
//check field blanc date number choice
$validator = Validation::createValidator();
$constraint = new Assert\Collection([
'documentList' => [
new Assert\NotBlank(),
new Assert\Type('array'),
new Assert\Count(['min' => 1]),
new Assert\All([
new Assert\Collection([
'invoice_document_type' => [new Assert\NotBlank()],
'invoice_international' => [new Assert\NotBlank(), new Assert\Choice(['0', '1'])],
'invoice_status' => [new Assert\NotBlank(), new Assert\Choice(['Accepté', 'Rejeté'])],
'invoice_number_efac' => [new Assert\NotBlank()],
'invoice_number_fournisseur' => [new Assert\NotBlank()],
'invoice_issue_date' => [new Assert\NotBlank(), new Assert\Date()],
'invoice_due_date' => [new Assert\NotBlank(), new Assert\Date()],
'invoice_supplier' => [new Assert\NotBlank()],
'invoice_spv' => [new Assert\NotBlank()],
'invoice_validation_history' => [new Assert\NotBlank()],
'invoice_link' => [new Assert\NotBlank(), new Assert\Url()],
'invoice_pa_id' => [new Assert\NotBlank()],
'currency' => [new Assert\NotBlank()],
// Lignes
'line' => [
new Assert\NotBlank(),
new Assert\Type('array'),
new Assert\Count(['min' => 1]),
new Assert\All([
new Assert\Collection([
'unitPrice' => [new Assert\NotBlank(), new Assert\Type('numeric')],
'number' => [new Assert\NotBlank(), new Assert\Type('integer')],
'note' => [new Assert\NotBlank()],
'unit' => [new Assert\NotBlank()],
'amount' => [new Assert\NotBlank(), new Assert\Type('numeric')],
'quantity' => [new Assert\NotBlank(), new Assert\Type('numeric')],
'vatType' => [new Assert\NotBlank()],
'vatRate' => [new Assert\NotBlank(), new Assert\Type('numeric')]
])
])
],
// Total
'total' => [
new Assert\NotBlank(),
new Assert\Collection([
'accountingCurrency' => [new Assert\NotBlank()],
'amount' => [new Assert\NotBlank(), new Assert\Type('numeric')],
'netPayable' => [new Assert\NotBlank(), new Assert\Type('numeric')],
'netAmount' => [new Assert\NotBlank(), new Assert\Type('numeric')],
'reductionAmount' => [new Assert\NotBlank(), new Assert\Type('numeric')],
'costAmount' => [new Assert\NotBlank(), new Assert\Type('numeric')],
'amountIncludingTax' => [new Assert\NotBlank(), new Assert\Type('numeric')],
'vatAmount' => [new Assert\NotBlank(), new Assert\Type('numeric')],
])
],
])
])
],
'count' => [new Assert\NotBlank(), new Assert\Type('integer')],
'transactionId' => [new Assert\NotBlank()]
]);
$violations = $validator->validate($data, $constraint);
if (count($violations) > 0) {
$errors = [];
foreach ($violations as $violation) {
$errors[] = [
'field' => $violation->getPropertyPath(),
'message' => $violation->getMessage()
];
}
$this->addEfacDataLog($data['transactionId'],$request->getContent(),json_encode($errors));
return ['errors' => $errors , 'status'=> Response::HTTP_BAD_REQUEST];
}else{
$errors = [];
//check field data base de donnée
foreach ($data['documentList'] as $key=>&$datum){
$typeDoc = $this->getTypeDocument($datum['invoice_document_type']);
$numero = $datum['invoice_pa_id'];
$codeFournisseur = $datum['invoice_supplier'];
$codeSpv = $datum['invoice_spv'];
if($typeDoc == EfacData::type_facture || $typeDoc == EfacData::type_acompte){
$facture = $this->em->getRepository(FactureFinance::class)->findOneBy(['invoicePaId'=>$numero]);
if($facture){
$errors[] = [
'field' => "[documentList][$key][invoice_pa_id]",
'message' => "Ce numéro de facture existe déjà."
];
}
}elseif($typeDoc == EfacData::type_avoir){
$avoir = $this->em->getRepository(Avoir::class)->findOneBy(['invoicePaId'=>$numero]);
if($avoir){
$errors[] = [
'field' => "[documentList][$key][invoice_pa_id]",
'message' => "Ce numéro d’avoir existe déjà."
];
}
}
$spv = $this->em->getRepository(Spv::class)->findOneBy(['codeSage'=>$codeSpv]);
$fournisseur = $this->em->getRepository(Fournisseur::class)->findNotArchiveByCodeSingle($codeFournisseur);
if(!$spv){
$errors[] = [
'field' => "[documentList][$key][invoice_spv]",
'message' => "Le code ne correspond à aucune SPV."
];
}
if(!$fournisseur){
$errors[] = [
'field' => "[documentList][$key][invoice_supplier]",
'message' => "Le code ne correspond à aucun fournisseur."
];
}
$datum['spv'] = $spv;
$datum['fournisseur'] = $fournisseur;
// $client = HttpClient::create();
// $response = $client->request('GET', $datum['invoice_link']);
// if ($response->getStatusCode() !== 200) {
// $errors[] = [
// 'field' => "[documentList][$key][invoice_link]",
// 'message' => "URL de fichier erronée"
// ];
// }
}
if (count($errors) > 0) {
$this->addEfacDataLog($data['transactionId'],$request->getContent(),json_encode($errors));
return ['errors' => $errors , 'status'=> Response::HTTP_CONFLICT];
}else{
foreach ($data['documentList'] as $key=>$datum){
$typeDoc = $this->getTypeDocument($datum['invoice_document_type']);
if($typeDoc == EfacData::type_facture || $typeDoc == EfacData::type_acompte){
$this->addFacture($datum);
}elseif($typeDoc == EfacData::type_avoir){
$this->addAvoir($datum);
}
}
$this->addEfacDataLog($data['transactionId'],$request->getContent(),Response::HTTP_OK);
return ['message' => 'Facture reçue et enregistrée' , 'status'=> Response::HTTP_OK];
}
}
return ['errors' => 'Requête invalide' , 'status'=> Response::HTTP_BAD_REQUEST];
}
public function addEfacDataLog($transactionId="",$data,$msg){
$dataLog = new EfacData();
$dataLog->setDataEfac($data);
$dataLog->setMsg($msg);
$dataLog->setTransactionId($transactionId);
$this->em->persist($dataLog);
$this->em->flush();
}
public function addFacture($data){
$typeDoc = $this->getTypeDocument($data['invoice_document_type']);
if($typeDoc == EfacData::type_acompte){
$type = 'Acompte';
}else{
$type = 'Facture';
}
$facture = new FactureFinance();
$facture->setIsRfe(true);
$facture->setNumeroFacture($data['invoice_number_fournisseur']);
$facture->setCategory($type);
$facture->setFournisseur($data['fournisseur']);
$facture->setSpv($data['spv']);
$facture->setDateFacture(new \DateTime($data['invoice_issue_date']));
$facture->setDelaiPaiementDate(new \DateTime($data['invoice_due_date']));
$facture->setDelaiPaiement((new \DateTime($data['invoice_due_date']))->diff(new \DateTime($data['invoice_issue_date']))->days);
// $doc = $this->importPdf($data['invoice_link']);
// if($doc){
// $facture->setFileFacture($doc);
// }
$facture->setUrlFacture($data['invoice_link']);
$facture->setStatus(FactureFinance::STATUS_A_COMPLETER);
$facture->setInvoiceDocumentType($data['invoice_document_type']);
$facture->setInvoiceCurrency($data['currency']);
$facture->setInvoiceInternational($data['invoice_international']);
$facture->setInvoiceStatus($data['invoice_status']);
$facture->setInvoiceNumberEfac($data['invoice_number_efac']);
$facture->setInvoicePaId($data['invoice_pa_id']);
$this->em->persist($facture);
$this->em->flush();
$facture->setTauxTva(0);
foreach ($data['line'] as $line){
$nbrDivision = 100;
$factureFinanceMantant = new FactureFinanceMontantTva();
$factureFinanceMantant->setFactureFinance($facture);
$factureFinanceMantant->setUnitPrice($line['unitPrice']/$nbrDivision);
$factureFinanceMantant->setNumber($line['number']);
$factureFinanceMantant->setNote($line['note']);
$factureFinanceMantant->setUnit($line['unit']);
$factureFinanceMantant->setMontantHt($line['amount']/$nbrDivision);
$factureFinanceMantant->setQuantity($line['quantity']);
$factureFinanceMantant->setVatType($line['vatType']);
$factureFinanceMantant->setTauxTva($line['vatRate']);
$montantTva = (($line['amount']/$nbrDivision) * $line['vatRate']) / 100 ;
if(in_array($line['vatType'],["E","AE","K","G","O","Z"])){
$factureFinanceMantant->setMontantTtc($line['amount']/$nbrDivision);
}else{
$montantTtc = $montantTva + ($line['amount']/$nbrDivision);
$factureFinanceMantant->setMontantTtc($montantTtc);
}
$factureFinanceMantant->setTva($montantTva);
$this->em->persist($factureFinanceMantant);
$this->em->flush();
}
$nbrDivision = 100;
$facture->setInvoiceAccountingCurrency($data['total']['accountingCurrency']);
$facture->setMonatantHt($data['total']['amount']/$nbrDivision);
$facture->setInvoiceTtcNetPayable($data['total']['netPayable']/$nbrDivision);
$facture->setMonatantHtNetAmount($data['total']['netAmount']/$nbrDivision);
$facture->setInvoiceReductionAmount($data['total']['reductionAmount']/$nbrDivision);
$facture->setInvoiceCostAmount($data['total']['costAmount']/$nbrDivision);
$facture->setInvoiceTtcAmountIncludingTax($data['total']['amountIncludingTax']/$nbrDivision);
$facture->setTva($data['total']['vatAmount']/$nbrDivision);
$facture->setMonatantTtc(($data['total']['amount']/$nbrDivision) + ($data['total']['vatAmount']/$nbrDivision));
$this->em->persist($facture);
$this->em->flush();
}
public function addAvoir($data){
$avoir = new Avoir();
$avoir->setIsRfe(true);
$avoir->setNumeroAvoir($data['invoice_number_fournisseur']);
$avoir->setFournisseur($data['fournisseur']);
$avoir->setSpv($data['spv']);
$avoir->setDateAvoir(new \DateTime($data['invoice_issue_date']));
// $doc = $this->importPdf($data['invoice_link']);
// if($doc){
// $avoir->setFileAvoir($doc);
// }
$avoir->setUrlFacture($data['invoice_link']);
$avoir->setStatus(Avoir::STATUS_A_COMPLETER);
$avoir->setInvoiceDocumentType($data['invoice_document_type']);
$avoir->setTauxTva(0);
$avoir->setInvoiceCurrency($data['currency']);
$avoir->setInvoiceInternational($data['invoice_international']);
$avoir->setInvoiceStatus($data['invoice_status']);
$avoir->setInvoiceNumberEfac($data['invoice_number_efac']);
$avoir->setInvoicePaId($data['invoice_pa_id']);
$this->em->persist($avoir);
$this->em->flush();
foreach ($data['line'] as $line){
$nbrDivision = 100;
$avoirMantant = new AvoirMontantTva();
$avoirMantant->setAvoir($avoir);
$avoirMantant->setUnitPrice($line['unitPrice']/$nbrDivision);
$avoirMantant->setNumber($line['number']);
$avoirMantant->setNote($line['note']);
$avoirMantant->setUnit($line['unit']);
$avoirMantant->setMontantHt($line['amount']/$nbrDivision);
$avoirMantant->setQuantity($line['quantity']);
$avoirMantant->setVatType($line['vatType']);
$avoirMantant->setTauxTva($line['vatRate']);
$montantTva = (($line['amount']/$nbrDivision) * $line['vatRate']) / 100 ;
$montantTtc = $montantTva + ($line['amount']/$nbrDivision);
if(in_array($line['vatType'],["E","AE","K","G","O","Z"])){
$avoirMantant->setMontantTtc($line['amount']/$nbrDivision);
}else{
$montantTtc = $montantTva + ($line['amount']/$nbrDivision);
$avoirMantant->setMontantTtc($montantTtc);
}
$avoirMantant->setTva($montantTva);
$this->em->persist($avoirMantant);
$this->em->flush();
}
$nbrDivision = 100;
$avoir->setInvoiceAccountingCurrency($data['total']['accountingCurrency']);
$avoir->setMonatantHt($data['total']['amount']/$nbrDivision);
$avoir->setInvoiceTtcNetPayable($data['total']['netPayable']/$nbrDivision);
$avoir->setMonatantHtNetAmount($data['total']['netAmount']/$nbrDivision);
$avoir->setInvoiceReductionAmount($data['total']['reductionAmount']/$nbrDivision);
$avoir->setInvoiceCostAmount($data['total']['costAmount']/$nbrDivision);
$avoir->setInvoiceTtcAmountIncludingTax($data['total']['amountIncludingTax']/$nbrDivision);
$avoir->setTva($data['total']['vatAmount']/$nbrDivision);
$avoir->setMonatantTtc(($data['total']['amount']/$nbrDivision) + ($data['total']['vatAmount']/$nbrDivision));
$this->em->persist($avoir);
$this->em->flush();
}
public function addFactureV2($data){
$typeDoc = $this->getTypeDocument($data['invoice_document_type']);
if($typeDoc == EfacData::type_acompte){
$type = 'Acompte';
}else{
$type = 'Facture';
}
$facture = new FactureFinance();
$facture->setIsRfe(false);
$facture->setIsRfe2(true);
$facture->setNumeroFacture($data['invoice_number_fournisseur']);
$facture->setCategory($type);
$facture->setFournisseur($data['fournisseur']);
$facture->setSpv($data['spv']);
$facture->setDateFacture(new \DateTime($data['invoice_issue_date']));
$facture->setDelaiPaiementDate(new \DateTime($data['invoice_due_date']));
$facture->setDelaiPaiement((new \DateTime($data['invoice_due_date']))->diff(new \DateTime($data['invoice_issue_date']))->days);
$facture->setUrlFacture($data['invoice_link']);
if( $data['invoice_status'] == 'Rejeté'){
$facture->setStatus(FactureFinance::STATUS_REFUS);
}else{
$facture->setStatus(FactureFinance::STATUS_A_COMPLETER);
}
$facture->setInvoiceDocumentType($data['invoice_document_type']);
$facture->setInvoiceInternational($data['invoice_international']);
$facture->setInvoiceStatus($data['invoice_status']);
$facture->setInvoiceNumberEfac($data['invoice_number_efac']);
$facture->setInvoicePaId($data['invoice_pa_id']);
// Montants bruts (pas de division par 100 en V2)
$facture->setMonatantHt($data['invoice_amount_ht']);
$facture->setTauxTva($data['invoice_vat_rate']);
$facture->setTva($data['invoice_amount_vat']);
$facture->setMonatantTtc($data['invoice_amount_ttc']);
// Nouveaux attributs V2
$facture->setInvoiceCodeRef1($data['invoice_codeREF1']);
$facture->setInvoiceRefProjet($data['invoice_ref_projet']);
$facture->setInvoiceValideurN1($data['invoice_valideur_N1']);
$facture->setInvoiceValideurN2($data['invoice_valideur_N2']);
$facture->setInvoiceValideurN3($data['invoice_valideur_N3']);
$facture->setInvoiceDateValidationN1($this->parseDate($data['invoice_date_validation_N1']));
$facture->setInvoiceDateValidationN2($this->parseDate($data['invoice_date_validation_N2']));
$facture->setInvoiceDateValidationN3($this->parseDate($data['invoice_date_validation_N3']));
// Lien vers le projet (invoice_ref_projet = codeProject)
if(!empty($data['project'])){
$projectFactureFinance = new ProjectFactureFinance();
$projectFactureFinance->setProject($data['project']);
$projectFactureFinance->setFactureFinance($facture);
$facture->addProjectFactureFinance($projectFactureFinance);
$this->em->persist($projectFactureFinance);
}
$this->em->persist($facture);
$this->em->flush();
$this->notification->setCompteurErpiPiece($facture);
$this->notification->setCompteurErpiEcriture($facture);
}
public function addAvoirV2($data){
$avoir = new Avoir();
$avoir->setIsRfe(false);
$avoir->setIsRfe2(true);
$avoir->setNumeroAvoir($data['invoice_number_fournisseur']);
$avoir->setFournisseur($data['fournisseur']);
$avoir->setSpv($data['spv']);
$avoir->setDateAvoir(new \DateTime($data['invoice_issue_date']));
$avoir->setUrlFacture($data['invoice_link']);
if( $data['invoice_status'] == 'Rejeté'){
$avoir->setStatus(Avoir::STATUS_REFUS);
}else{
$avoir->setStatus(Avoir::STATUS_A_COMPLETER);
}
$avoir->setInvoiceDocumentType($data['invoice_document_type']);
$avoir->setInvoiceInternational($data['invoice_international']);
$avoir->setInvoiceStatus($data['invoice_status']);
$avoir->setInvoiceNumberEfac($data['invoice_number_efac']);
$avoir->setInvoicePaId($data['invoice_pa_id']);
// Montants bruts (pas de division par 100 en V2)
$avoir->setMonatantHt($data['invoice_amount_ht']);
$avoir->setTauxTva($data['invoice_vat_rate']);
$avoir->setTva($data['invoice_amount_vat']);
$avoir->setMonatantTtc($data['invoice_amount_ttc']);
// Nouveaux attributs V2
$avoir->setInvoiceCodeRef1($data['invoice_codeREF1']);
$avoir->setInvoiceRefProjet($data['invoice_ref_projet']);
$avoir->setInvoiceValideurN1($data['invoice_valideur_N1']);
$avoir->setInvoiceValideurN2($data['invoice_valideur_N2']);
$avoir->setInvoiceValideurN3($data['invoice_valideur_N3']);
$avoir->setInvoiceDateValidationN1($this->parseDate($data['invoice_date_validation_N1']));
$avoir->setInvoiceDateValidationN2($this->parseDate($data['invoice_date_validation_N2']));
$avoir->setInvoiceDateValidationN3($this->parseDate($data['invoice_date_validation_N3']));
// Lien vers le projet (invoice_ref_projet = codeProject)
if(!empty($data['project'])){
$projectAvoir = new ProjectAvoir();
$projectAvoir->setProject($data['project']);
$projectAvoir->setAvoir($avoir);
$avoir->addProjectAvoir($projectAvoir);
$this->em->persist($projectAvoir);
}
$this->em->persist($avoir);
$this->em->flush();
$this->notification->setCompteurErpiPiece(null,$avoir);
$this->notification->setCompteurErpiEcriture(null,$avoir);
}
private function parseDate($value)
{
if (empty($value)) {
return null;
}
return new \DateTime($value);
}
public function importPdf($url)
{
$client = HttpClient::create();
$response = $client->request('GET', $url);
if ($response->getStatusCode() !== 200) {
return null;
}
$content = $response->getContent();
$name = md5(uniqid());
$contentType = $response->getHeaders()['content-type'][0];
$extension = explode('/', $contentType)[1];
file_put_contents(
$this->params->get('kernel.project_dir') . '/public/uploads/'.$name.'.'.$extension,
$content
);
$doc = new DocUpload();
$doc->setName('document');
$doc->setPath($name.'.'.$extension);
$this->em->persist($doc);
$this->em->flush();
return $doc;
}
public function addFactureOrAvoirV2($request){
$data = json_decode($request->getContent(), true);
if (!$data) {
$this->addEfacDataLog('',$request->getContent(),'JSON invalide');
return ['error' => 'JSON invalide' , 'status'=> Response::HTTP_BAD_REQUEST];
}
//check field blanc date number choice
$validator = Validation::createValidator();
$constraint = new Assert\Collection([
'documentList' => [
new Assert\NotBlank(),
new Assert\Type('array'),
new Assert\Count(['min' => 1]),
new Assert\All([
new Assert\Collection([
'invoice_document_type' => [new Assert\NotBlank()],
'invoice_international' => [new Assert\NotBlank(), new Assert\Choice(['0', '1'])],
'invoice_status' => [new Assert\NotBlank(), new Assert\Choice(['Accepté', 'Rejeté'])],
'invoice_number_efac' => [new Assert\NotBlank()],
'invoice_number_fournisseur' => [new Assert\NotBlank()],
'invoice_issue_date' => [new Assert\Date()],
'invoice_due_date' => [new Assert\NotBlank(), new Assert\Date()],
'invoice_supplier' => [new Assert\NotBlank()],
'invoice_codeREF1' => [new Assert\NotBlank()],
'invoice_spv' => [new Assert\NotBlank()],
'invoice_amount_ht' => [new Assert\NotBlank(), new Assert\Type('numeric')],
'invoice_vat_rate' => [new Assert\Optional([new Assert\Type('numeric')])],
'invoice_amount_vat' => [new Assert\Optional([new Assert\Type('numeric')])],
'invoice_amount_ttc' => [new Assert\NotBlank(), new Assert\Type('numeric')],
'invoice_valideur_N1' => [],
'invoice_valideur_N2' => [],
'invoice_valideur_N3' => [],
'invoice_date_validation_N1' => [ new Assert\Date()],
'invoice_date_validation_N2' => [ new Assert\Date()],
'invoice_date_validation_N3' => [ new Assert\Date()],
'invoice_link' => [new Assert\NotBlank()],
'invoice_pa_id' => [],
'invoice_ref_projet' => [],
])
])
],
'count' => [new Assert\NotBlank(), new Assert\Type('integer')],
'transactionId' => [new Assert\NotBlank()]
]);
$violations = $validator->validate($data, $constraint);
if (count($violations) > 0) {
$errors = [];
foreach ($violations as $violation) {
$errors[] = [
'field' => $violation->getPropertyPath(),
'message' => $violation->getMessage()
];
}
$this->addEfacDataLog($data['transactionId'],$request->getContent(),json_encode($errors));
return ['errors' => $errors , 'status'=> Response::HTTP_BAD_REQUEST];
}else{
$errors = [];
//check field data base de donnée
foreach ($data['documentList'] as $key=>&$datum){
$typeDoc = $this->getTypeDocument($datum['invoice_document_type']);
$numero = $datum['invoice_number_efac'];
$codeFournisseur = $datum['invoice_supplier'];
$codeSpv = $datum['invoice_spv'];
if($typeDoc == EfacData::type_facture || $typeDoc == EfacData::type_acompte){
$facture = $this->em->getRepository(FactureFinance::class)->findOneBy(['invoiceNumberEfac'=>$numero]);
if($facture){
$errors[] = [
'field' => "[documentList][$key][invoice_number_efac]",
'message' => "Ce numéro de facture existe déjà."
];
}
}elseif($typeDoc == EfacData::type_avoir){
$avoir = $this->em->getRepository(Avoir::class)->findOneBy(['invoiceNumberEfac'=>$numero]);
if($avoir){
$errors[] = [
'field' => "[documentList][$key][invoice_number_efac]",
'message' => "Ce numéro d’avoir existe déjà."
];
}
}
$spv = $this->em->getRepository(Spv::class)->findOneBy(['raisonSociale'=>$codeSpv]);
$fournisseur = $this->em->getRepository(Fournisseur::class)->findNotArchiveByCodeSingle($codeFournisseur);
$project = $this->em->getRepository(Project::class)->findOneBy(['codeProject'=>$datum['invoice_ref_projet']]);
if(!$spv){
$errors[] = [
'field' => "[documentList][$key][invoice_spv]",
'message' => "Le siren ne correspond à aucune SPV."
];
}
if(!$fournisseur){
$errors[] = [
'field' => "[documentList][$key][invoice_supplier]",
'message' => "Le code ne correspond à aucun fournisseur."
];
}
// Projet introuvable = non bloquant : la facture/avoir est créée sans lien projet.
$datum['spv'] = $spv;
$datum['fournisseur'] = $fournisseur;
$datum['project'] = $project;
// $client = HttpClient::create();
// $response = $client->request('GET', $datum['invoice_link']);
// if ($response->getStatusCode() !== 200) {
// $errors[] = [
// 'field' => "[documentList][$key][invoice_link]",
// 'message' => "URL de fichier erronée"
// ];
// }
}
if (count($errors) > 0) {
$this->addEfacDataLog($data['transactionId'],$request->getContent(),json_encode($errors));
return ['errors' => $errors , 'status'=> Response::HTTP_CONFLICT];
}else{
foreach ($data['documentList'] as $key=>$datum){
$typeDoc = $this->getTypeDocument($datum['invoice_document_type']);
if($typeDoc == EfacData::type_facture || $typeDoc == EfacData::type_acompte){
$this->addFactureV2($datum);
}elseif($typeDoc == EfacData::type_avoir){
$this->addAvoirV2($datum);
}else{
$errors[] = [
'field' => "[documentList][$key][invoice_document_type]",
'message' => "Le type de document ne correspond ni à une facture ni à un avoir."
];
$this->addEfacDataLog($data['transactionId'],$request->getContent(),json_encode($errors));
return ['errors' => $errors , 'status'=> Response::HTTP_CONFLICT];
}
}
$this->addEfacDataLog($data['transactionId'],$request->getContent(),Response::HTTP_OK);
return ['message' => 'Facture reçue et enregistrée' , 'status'=> Response::HTTP_OK];
}
}
return ['errors' => 'Requête invalide' , 'status'=> Response::HTTP_BAD_REQUEST];
}
}