--- /dev/null
+<?php
+
+class SugarAppliance {
+
+ /** @var SugarConnector */
+ private $sugarConnector;
+
+ public function __construct(SugarConnector $sugarConnector){
+ $this->sugarConnector = $sugarConnector;
+ }
+
+
+ public function createOpportunity($applianceReference, $versionId = null, $versionDeclaration = null) {
+ $applianceManager = new PdoApplianceManager();
+
+ $productManager = new PdoProductManager();
+ $contractManager = new PdoContractManager();
+ $versionManager = new PdoVersionManager();
+ $pdoApplianceVersion = new PdoApplianceVersionManager();
+
+
+
+ // GETTING REFERENCES AND OBJECTS :
+ // APPLIANCE
+ $appliance = $applianceManager -> getApplianceByReference($applianceReference);
+ $applianceReferenceArray = explode("/",$applianceReference);
+ // PRODUCT
+ $product = $productManager -> getProduct($appliance -> product);
+ $productAcronym = $applianceReferenceArray[0];
+ if(! isset($versionId)) {
+ $applianceVersion = $pdoApplianceVersion->getLast($appliance->id);
+ $versionId = $applianceVersion->version_id;
+ $versionDeclaration = $applianceVersion->creation_date;
+ }
+
+ $version = $versionManager -> getVersion($versionId);
+
+ $versionReference = $productAcronym.' '.$version -> value;
+ // CUSTOMER
+ $timestampSuffixCharNumber = 11;
+ $customerAPId = substr($applianceReferenceArray[1],0,-$timestampSuffixCharNumber);
+ // CONTRACT
+ $contractNumber = $productAcronym."/".$customerAPId;
+ $contract = $contractManager -> getValidContractByNumberAndVersionDate($contractNumber, $versionDeclaration);
+
+ if(!isset($contract)) {
+ throw new Exception("Contrat de maintenance inexistant ou invalide pour cette instance.");
+ }
+
+ // OPPORTUNITY
+ $customerAPIdArray = explode("_",$customerAPId);
+ $opportunityReference = $productAcronym."/".$customerAPIdArray[0];
+
+
+
+ // GETTING APPLIANCE IN SUGAR
+ $moduleName = 'allo_Instances';
+ $requestedInfos = array('name');
+ $sqlWhereClause = "allo_instances.name = '".$applianceReference."'";
+ $appliance_infos = json_decode($this->sugarConnector -> getInfosModule($moduleName, $requestedInfos, $sqlWhereClause));
+ if(isset($appliance_infos->entry_list[0])) {
+ $applianceSugarId = $appliance_infos->entry_list[0]->id;
+ }
+
+
+ // IF APPLIANCE DOES NOT EXIST, CREATING NEW ONE
+ if(!isset($applianceSugarId)) {
+ $moduleName = 'allo_Instances';
+ $parameters = array(
+ 'name' => $applianceReference
+ );
+ $appliance_infos = json_decode($this->sugarConnector -> updateOrCreateEntryModule($moduleName, $parameters));
+ $applianceSugarId = $appliance_infos->id;
+
+ // GETTING THE MAINTENANCE CONTRACT SUGAR ID
+ $contractNumber = $contract -> number;
+ $moduleName = 'maint_contrat_maintenance';
+ $requestedInfos = array('id');
+ $sqlWhereClause = "maint_contrat_maintenance.name = '".$contractNumber."'";
+ $contract_infos = json_decode($this->sugarConnector -> getInfosModule($moduleName, $requestedInfos, $sqlWhereClause));
+ if(isset($contract_infos->entry_list[0])) {
+ $contractSugarId = $contract_infos->entry_list[0]->id;
+ }
+
+ // LINKING IT TO MAINTENANCE CONTRACT IN SUGAR
+ if(isset($applianceSugarId) && isset($contractSugarId)) {
+ $moduleName = 'maint_contrat_maintenance';
+ $parameters = array(
+ 'link_name' => 'maint_contrat_maintenance_allo_instances_1',
+ 'primary_module_id' => $contractSugarId,
+ 'related_module_id' => $applianceSugarId
+ );
+ $this->sugarConnector -> createRelationship($moduleName, $parameters);
+ }
+
+ // LINKING IT TO MAINTENANCE CONTRACT IN DB
+ $appliance->contract_id = $contract->id;
+ $applianceManager->updateAppliance($appliance);
+ }
+
+ // GETTING OPPORTUNITIES OF APPLIANCE
+ $moduleName = 'allo_Instances';
+ $parameters = array(
+ "link_name" => "allo_instances_opportunities_1",
+ "primary_module_id" => $applianceSugarId,
+ );
+ $requestedInfos = array(
+ 'id',
+ 'name',
+ 'date_closed',
+ //'date_entered',
+ 'date_opened_c',
+ 'liste_hebergement_c',
+ 'type_exploitation_c'
+ );
+ $sqlWhereClause = "opportunities.name = '".$opportunityReference."'";
+ $opportunity_infos = json_decode($this->sugarConnector -> getRelationships($moduleName, $parameters, $requestedInfos, $sqlWhereClause));
+ $opportunitySugarId = $opportunity_infos->entry_list[0]->id;
+ if(isset($opportunitySugarId)) {
+
+ // CHECKING WHERE TO PUT NEW ENTRY
+ $addBetween = false;
+ $previousOpportunity = $opportunity_infos->entry_list[0];
+ $firstOpportunity = $opportunity_infos->entry_list[0];
+ $lastOpportunity = $opportunity_infos->entry_list[0];
+ foreach($opportunity_infos->entry_list as $opportunity_info) {
+ $opportunityCloseDate = $opportunity_info->name_value_list->date_closed->value;
+ $opportunityCreationDate = $opportunity_info->name_value_list->date_opened_c->value;
+
+ // GETTING FIRST CREATED OPPORTUNITY
+ if($opportunityCreationDate < $firstOpportunity->name_value_list->date_opened_c->value) {
+ $firstOpportunity = $opportunity_info;
+ }
+
+ // GETTING MOST RECENT OPPORTUNITY -> RESEARCH CRITERION : NO CLOSING DATE AND LAST ADDED
+ if($opportunityCloseDate == "" && $opportunityCreationDate >= $lastOpportunity->name_value_list->date_opened_c->value) {
+ $lastOpportunity = $opportunity_info;
+ }
+
+ // IF AN OPPORTUNITY HAS A CLOSING DATE THAT IS FURTHER THAN THE NEW ONE'S CREATION DATE
+ // AND ITS CREATION DATE IS SOONER THAN THAT
+ if(!$addBetween && $opportunityCloseDate > $versionDeclaration && $opportunityCreationDate < $versionDeclaration) {
+
+ // WE'LL ADD THE NEW BETWEEN TWO EXISTING OPPORTUNITIES
+ $addBetween = true;
+
+ // WE TAKE THE FIRST OPPORTUNITY THAT RESPECTS THESE CRITERIA
+ if($opportunityCreationDate < $previousOpportunity->name_value_list->date_opened_c->value) {
+ $previousOpportunity = $opportunity_info;
+ }
+ }
+ }
+
+ // IF NOT BETWEEN TWO EXISTING ONES
+ if(!$addBetween) {
+
+ // IF THE FIRST OPPORTUNITY HAS A CREATION DATE THAT IS FURTHER THAN THE NEW ONE'S CREATION DATE
+ $firstOpportunityCreationDate = $firstOpportunity->name_value_list->date_opened_c->value;
+ if($firstOpportunityCreationDate > $versionDeclaration) {
+
+ // CREATING THE NEW OPPORTUNITY
+ $moduleName = 'Opportunities';
+ $parameters = array(
+ 'name' => $firstOpportunity->name_value_list->name->value,
+ 'type_exploitation_c' => $firstOpportunity->name_value_list->type_exploitation_c->value,
+ 'date_opened_c' => $versionDeclaration,
+ 'date_closed' => $firstOpportunityCreationDate,
+ 'systeme_d_exploitation_c' => $appliance->os,
+ 'liste_hebergement_c' => $firstOpportunity->name_value_list->liste_hebergement_c->value,
+ 'description' => 'Création par ALLO'
+ );
+ $opportunity_infos = json_decode($this->sugarConnector -> updateOrCreateEntryModule($moduleName, $parameters));
+ $opportunitySugarId = $opportunity_infos->id;
+ } else {
+
+ // UPDATING LAST OPPORTUNITY IN SUGAR : SETTING CLOSING DATE
+ $lastOpportunitySugarId = $lastOpportunity->id;
+ if(isset($versionDeclaration)) {
+ $moduleName = 'Opportunities';
+ $parameters = array(
+ 'id' => $lastOpportunitySugarId,
+ 'date_closed' => $versionDeclaration
+ );
+ $this->sugarConnector -> updateOrCreateEntryModule($moduleName, $parameters);
+
+ // CREATING THE NEW OPPORTUNITY
+ $moduleName = 'Opportunities';
+ $parameters = array(
+ 'name' => $lastOpportunity->name_value_list->name->value,
+ 'type_exploitation_c' => $lastOpportunity->name_value_list->type_exploitation_c->value,
+ 'date_opened_c' => $versionDeclaration,
+ 'systeme_d_exploitation_c' => $appliance->os,
+ 'liste_hebergement_c' => $lastOpportunity->name_value_list->liste_hebergement_c->value,
+ 'description' => 'Création par ALLO'
+ );
+ $opportunity_infos = json_decode($this->sugarConnector -> updateOrCreateEntryModule($moduleName, $parameters));
+ $opportunitySugarId = $opportunity_infos->id;
+ }
+ }
+ } else {
+
+ // UPDATING PREVIOUS OPPORTUNITY IN SUGAR : SETTING CLOSING DATE
+ $previousOpportunitySugarId = $previousOpportunity->id;
+ if(isset($versionDeclaration)) {
+ $opportunityCloseDate = $previousOpportunity->name_value_list->date_closed->value;
+ $moduleName = 'Opportunities';
+ $parameters = array(
+ 'id' => $previousOpportunitySugarId,
+ 'date_closed' => $versionDeclaration
+ );
+ $this->sugarConnector->updateOrCreateEntryModule($moduleName, $parameters);
+
+ // CREATING THE NEW OPPORTUNITY
+ $moduleName = 'Opportunities';
+ $parameters = array(
+ 'name' => $previousOpportunity->name_value_list->name->value,
+ 'type_exploitation_c' => $previousOpportunity->name_value_list->type_exploitation_c->value,
+ 'date_opened_c' => $versionDeclaration,
+ 'systeme_d_exploitation_c' => $appliance->os,
+ 'liste_hebergement_c' => $previousOpportunity->name_value_list->liste_hebergement_c->value,
+ 'description' => 'Création par ALLO',
+ 'date_closed' => $opportunityCloseDate
+ );
+ $opportunity_infos = json_decode($this->sugarConnector->updateOrCreateEntryModule($moduleName, $parameters));
+ $opportunitySugarId = $opportunity_infos->id;
+ }
+ }
+
+ // IF NO OPPORTUNITY IS FOUND ON SUGAR FOR THIS APPLIANCE, CREATING NEW ONE
+ } else {
+
+ $applianceVersion = $pdoApplianceVersion->getLast($appliance->id);
+ $moduleName = 'Opportunities';
+ $parameters = array(
+ 'name' => $opportunityReference,
+ 'type_exploitation_c' => $appliance->channel_id,
+
+
+
+ 'date_opened_c' => $applianceVersion->creation_date,
+ 'systeme_d_exploitation_c' => $appliance->os,
+ // TO-DO : CHANGE THIS VALUE FOR EACH MANAGEMENT TYPE
+ 'liste_hebergement_c' => 'CLIENT',
+ 'description' => 'Création par ALLO'
+ );
+ $opportunity_infos = json_decode($this->sugarConnector -> updateOrCreateEntryModule($moduleName, $parameters));
+ $opportunitySugarId = $opportunity_infos->id;
+ }
+
+ // LINKING OPPORTUNITY TO APPLIANCE
+ if(isset($applianceSugarId) && isset($opportunitySugarId)) {
+ $moduleName = 'allo_Instances';
+ $parameters = array(
+ 'link_name' => 'allo_instances_opportunities_1',
+ 'primary_module_id' => $applianceSugarId,
+ 'related_module_id' => $opportunitySugarId
+ );
+ $this->sugarConnector -> createRelationship($moduleName, $parameters);
+ }
+
+ // GETTING VERSION ID IN SUGAR
+ $moduleName = 'adul__Produits';
+ $requestedInfos = array('name');
+ $sqlWhereClause = "adul__produits.name = '".$versionReference."'";
+ $version_infos = json_decode($this->sugarConnector -> getInfosModule($moduleName, $requestedInfos, $sqlWhereClause));
+ if(isset($version_infos->entry_list[0])) {
+ $versionSugarId = $version_infos->entry_list[0]->id;
+ }
+
+ // LINKING OPPORTUNITY TO VERSION
+ if(isset($versionSugarId) && isset($opportunitySugarId)) {
+ $moduleName = 'adul__Produits';
+ $parameters = array(
+ 'link_name' => 'adul__prits_opportunities',
+ 'primary_module_id' => $versionSugarId,
+ 'related_module_id' => $opportunitySugarId
+ );
+ $this->sugarConnector -> createRelationship($moduleName, $parameters);
+ }
+
+ // GETTING PRODUCT CATALOG ID IN SUGAR
+ $moduleName = 'maint_catalogue_produits';
+ $requestedInfos = array('name');
+ $sqlWhereClause = "maint_catalogue_produits.name = '".$product -> name."'";
+ $catalog_infos = json_decode($this->sugarConnector -> getInfosModule($moduleName, $requestedInfos, $sqlWhereClause));
+ if(isset($catalog_infos->entry_list[0])) {
+ $catalogSugarId = $catalog_infos->entry_list[0]->id;
+ }
+
+ // LINKING OPPORTUNITY TO PRODUCT CATALOG
+ if(isset($catalogSugarId) && isset($opportunitySugarId)) {
+ $moduleName = 'maint_catalogue_produits';
+ $parameters = array(
+ 'link_name' => 'maint_caits_opportunities',
+ 'primary_module_id' => $catalogSugarId,
+ 'related_module_id' => $opportunitySugarId
+ );
+ $this->sugarConnector -> createRelationship($moduleName, $parameters);
+ }
+
+ // GETTING CUSTOMER ID
+ $moduleName = 'Accounts';
+ $requestedInfos = array(
+ 'id',
+ 'officenumber_c'
+ );
+ $sqlWhereClause = "accounts_cstm.officenumber_c = '".$customerAPId."'";
+ $customer_infos = json_decode($this->sugarConnector -> getInfosModule($moduleName, $requestedInfos, $sqlWhereClause));
+ if(isset($customer_infos->entry_list[0])) {
+ $customerSugarId = $customer_infos->entry_list[0]->id;
+ }
+
+ // LINKING OPPORTUNITY TO CUSTOMER (FOR N-N RELATIONS, IT GOES BOTH WAYS)
+ if(isset($customerSugarId) && isset($opportunitySugarId)) {
+ $moduleName = 'Accounts';
+ $parameters = array(
+ 'link_name' => 'opportunities',
+ 'primary_module_id' => $customerSugarId,
+ 'related_module_id' => $opportunitySugarId
+ );
+ $this->sugarConnector -> createRelationship($moduleName, $parameters);
+ $moduleName = 'Opportunities';
+ $parameters = array(
+ 'link_name' => 'accounts',
+ 'primary_module_id' => $opportunitySugarId,
+ 'related_module_id' => $opportunitySugarId
+ );
+ $this->sugarConnector -> createRelationship($moduleName, $parameters);
+ }
+
+ // TO-DO : LINK OPPORTUNITY TO MAINTENANCE CONTRACT
+ }
+
+ public function checkAll() {
+ $applianceManager = new PdoApplianceManager();
+ $versionManager = new PdoVersionManager();
+
+ $sugarConnector = SugarConnector::getInstance();
+
+ // GETTING APPLIANCES
+ $moduleName = 'allo_Instances';
+ $requestedInfos = array(
+ 'id',
+ 'name'
+ );
+ $appliances_infos = json_decode($sugarConnector -> getInfosModule($moduleName, $requestedInfos));
+
+ foreach($appliances_infos->entry_list as $appliance_infos) {
+
+ // IF APPLIANCE EXISTS IN SUGAR
+ if(isset($appliance_infos)) {
+ $applianceReference = $appliance_infos->name_value_list->name->value;
+ $applianceReferenceArray = explode("/",$applianceReference);
+ $customerAPId = substr($applianceReferenceArray[1],0,-11);
+ $opportunityReference = $applianceReferenceArray[0]."/".substr($customerAPId,0,-6);
+
+ // GETTING APPLIANCE IN DB
+ $appliance = $applianceManager -> getApplianceByReference($applianceReference);
+
+ // IF APPLIANCE EXISTS ON BOTH SIDES, COMPARING INFORMATIONS
+ if(isset($appliance) && $appliance->id > 0) {
+
+ $pdoApplianceVersion = new PdoApplianceVersionManager();
+ $applianceVersion_list = $pdoApplianceVersion->getAll($appliance->id);
+
+ $isSynced = true;
+ /** @var ApplianceVersion $applianceVersion */
+ foreach($applianceVersion_list as $applianceVersion) {
+ if($applianceVersion->nature == ApplianceVersion::NATURE_SYNCHRO) {
+ $isSynced = false;
+ }
+ }
+
+ // CHECKING OPPORTUNITY EXISTENCE FOR EACH VERSION OF CHANGELOG
+ foreach($applianceVersion_list as $applianceVersion) {
+
+ // GETTING VALUE OF EACH VERSION OF CHANGELOG, AND ITS DECLARATION DATE
+ $versionId = $applianceVersion->version_id;
+ $versionDeclaration = $applianceVersion->creation_date;
+ $versionValue = $versionManager -> getVersion($versionId) -> value;
+ $versionReference = $applianceReferenceArray[0].' '.$versionValue;
+
+ // GETTING VERSION ID ON SUGAR
+ $moduleName = 'adul__Produits';
+ $requestedInfos = array(
+ 'id',
+ 'name'
+ );
+ $sqlWhereClause = "adul__produits.name = '".$versionReference."'";
+ $version_infos = json_decode($sugarConnector -> getInfosModule($moduleName, $requestedInfos, $sqlWhereClause));
+ if(isset($version_infos->entry_list[0])) {
+ $versionSugarId = $version_infos->entry_list[0]->id;
+ }
+
+ // GETTING OPPORTUNITIES LINKED TO THE VERSION IN SUGAR
+ if(isset($versionSugarId) && $version_infos->result_count > 0) {
+ $moduleName = 'adul__Produits';
+ $parameters = array(
+ "link_name" => "adul__prits_opportunities",
+ "primary_module_id" => $versionSugarId,
+ );
+ $requestedInfos = array(
+ 'id',
+ 'name',
+ 'date_opened_c'
+ );
+ $sqlWhereClause = "opportunities.name = '".$opportunityReference."'";
+ $result = json_decode($sugarConnector -> getRelationships($moduleName, $parameters, $requestedInfos, $sqlWhereClause));
+
+ // COMPARING INFORMATIONS IN ORDER TO FIND A CONCORDANCE : DATES, CHANNEL, et cetera
+ $opportunityFoundInSugar = false;
+ foreach($result->entry_list as $opportunity_info) {
+
+ // IF OPPORTUNITY EXISTS IN SUGAR
+ if(isset($opportunity_info->id)) {
+ if($opportunity_info->name_value_list->date_opened_c->value == $versionDeclaration) {
+ $opportunityFoundInSugar = true;
+ break;
+ }
+ }
+ }
+
+ // IF NO OPPORTUNITY IS FOUND FOR THE VERSION AND NO OTHER SYNCHRO ISSUE WAS DETECTED BEFORE
+ if(!$opportunityFoundInSugar && $isSynced) {
+
+ $applianceVersion->message = "Version déclarée ".$versionValue." n'a pas de fiche d'installation sur Sugar pour cette instance applicative.";
+ $pdoApplianceVersion->edit($applianceVersion);
+
+ }
+ } else {
+ error_log("Version ".$versionReference." non trouvée sur Sugar.");
+ }
+ }
+ } else {
+ error_log("Instance applicative existante sur Sugar introuvable sur ALLO Serveur.");
+ }
+ }
+ }
+ }
+}