Preview:
public with sharing class facturaSAPToHUB {
    public String OppId {get; set;}
    private Opportunity OppObject=null;
	private Account AccObject=null;
	private Contact ContactObject=null;
	private User UserObject=null;
    private String IVAP0 ='IVAP0';
	private String IVAP16 = 'IVAP16';

    public facturaSAPToHUB(String Id) {
        this.OppId=Id;
		FillOpportunity();
    }

    private void FillOpportunity(){
		Opportunity opp;
		List<Opportunity> opportunityList = [Select Id,AccountId ,OwnerId, Name,E_mail_para_env_o_de_Factura_Elect_nica__c,FormaDePago_o__c,CurrencyIsoCode,
											 		 FechaFactura_o__c, Comentarios__c,MembresaPagadaCon_o__c, Referencia_Numerica_del__c,InicioVigencia_o__c,
											 		FinVigencia_o__c, Tipo_de_Facturacion__c,EstatusFactura__c,CreatedDate,TipoCambio_o__c, Importe_Descuento__c,
													NumFact__c, Referencia_Bancaria__c,Orden_de_Compra__c,N_mero_de_Proveedor__c, Observaciones_SAP__c, 
													Clasificaci_n_de_Factura__c,Banco__c, Importe__c, Referencia_Banc__c,NunOfertafisica_o__c,Estatus_de_pago__c,
													Fecha_de_Pago_Bancario__c,Concepto_de_Cobro__c,FechaPago__c, Cambio_Datos_de_Facturaci_n__c, Clave_metodo_pago__c, 
													N_mero_de_Cuenta_Pago__c, Folio_Oportunidad_sustituida__c, N_Contable_en_SAP_Sustituida__c, Sustituir_Datos__c, EjecutivoAsig_o__c,
													Id_pedido__c, IdPago__c, codigo_error_SAP__c, Mensaje_error_de_SAP__c, Factura_Aprobada__c, Fecha_de_Pedido__c, 
													Mensaje_de_error_pedido__c, Error_al_crear_pedido__c, IdBillingOcc__c, IsBillingOccText__c, ClienteSAP_venta_anterior__c, Hub_Sale__c, Navision_Draft_ID__c
											 	From Opportunity  where  Id =:this.OppId  LIMIT 1];
		if (opportunityList !=null ){
			this.OppObject = opportunityList[0];
			// system.debug('this.IdPedido');
			// system.debug(this.IdPedido);
		}
	}
    private Integer getAliasVentas(String id){
		List<User> ejecutivoList = [Select Alias from User where Id in (Select EjecutivoAsig_o__c From Opportunity  where  Id =: id)];
		Integer ejecutivoName=-1;
		try{
			if(ejecutivoList.size()!=0){
				User ejecutivo = ejecutivoList[0];
				ejecutivoName =Integer.valueOf(ejecutivo.Alias); 
			}	
		}catch(System.TypeException e){
			return -1;
		}
		return ejecutivoName;
	}

    private void FillAccount(){
		Account acc=null;
		// List<Account> accountList;
		String AccountId;

		system.debug('Facturo a una cuenta facturadora ' + this.OppObject.isBillingOccText__c);
		system.debug('Facturo a la cuenta de la venta ' + this.OppObject.AccountId);
		//validatation for crossaccount to invoice correct account
		if (this.OppObject.IsBillingOccText__c != null && this.OppObject.IsBillingOccText__c != '') {
			AccountId = this.OppObject.IsBillingOccText__c;
		} else  {
			AccountId = this.OppObject.AccountId;
		}

		List<Account> accountList = [Select Clave_SAP__c,RazonSoc_o__c,Id, Personamf__c,Name, Phone,Telefono2_o__c,Fax,
											RFC_o__c,Website,Cliente_SAE__c,PaisFact_o__c, No_de_interior__c, No_de_Exterior__c, EstadoFact_o__c,
											 DelegMunicFact_o__c, Colonia_de_Facturaci_n__c, CodigoPostalFact_o__c, CiudadFact_opcional_o__c,
											 CalleFact_o__c, Cuenta_Virtual_Banamex__c, Correo_para_envio_factura__c, Regimen_Fiscal__c, Tipo_de_uso_de_CFDI__c
										 From Account  where  Id =: AccountId LIMIT 1];


		if (accountList !=null )
			 this.AccObject = accountList[0];
	}

    	
	private void FillContact(){
		List<Contact> contactList = [Select Title, Phone, OtherPhone ,MobilePhone, FirstName, LastName,
												Fax, Email,Id From Contact c where Id in(Select ContactId 
											From OpportunityContactRole o where  OpportunityId =:This.OppObject.Id and IsPrimary=true )];
		Contact contacto = null;
		if(contactList.size()!=0){
			this.ContactObject = contactList[0];
		}else{
			this.ContactObject = new Contact();
			this.ContactObject.FirstName='Nombre';
			this.ContactObject.LastName='Apellido';
			this.ContactObject.Phone='1234567890';
			this.ContactObject.Title= 'Puesto';
			this.ContactObject.Phone='1234567890';
			this.ContactObject.MobilePhone='9012345678';
			this.ContactObject.Email='correo@correo.com';
			//Validar si son requerido y que se ha estado enviando
		}
	}
	private void FillUser(){
		List<User> usersList = [SELECT Id, Name from User where  Id =: This.OppObject.OwnerId LIMIT 1];  
		this.UserObject  = usersList[0];
	}

    public  InvoiceSapClases.InvoiceSapDocument FillInvoiceSAPDocument (){
        InvoiceSapClases.InvoiceSapDocument sapContract;
        boolean IsSustitution=false;

		String comentarioVigencia = 'Vigencia del ' + Utils.formatDate(this.OppObject.InicioVigencia_o__c) + ' al '+ Utils.formatDate(this.OppObject.FinVigencia_o__c);
		
		// String actualizaContacto='';
		// //system.debug('account.Cambio_Datos_de_Facturaci_on__c: ' + this.OppObject.Cambio_Datos_de_Facturaci_n__c);
		// if (this.OppObject.Cambio_Datos_de_Facturaci_n__c==false){actualizaContacto='False';}else{actualizaContacto='True';}
			
		List<OpportunityLineItem> oppLines = [SELECT UnitPrice, TotalPrice, Quantity, PricebookEntryId, Discount from OpportunityLineItem where  OpportunityId =: this.OppObject.Id];
		List<InvoiceSapClases.InvoiceSapDocumentLine> documentLines= new List<InvoiceSapClases.InvoiceSapDocumentLine>();
		InvoiceSapClases.InvoiceSapDocumentLine documentLine;
		double discount=0.0;
		if(oppLines.size() > 0){
			for(OpportunityLineItem oppTemp : oppLines)
			{
				if (oppTemp.Discount==null){
					discount=0.0;
				}
				else {
					discount=oppTemp.Discount;
				}
				PricebookEntry priceBook = [SELECT ProductCode 
													FROM PricebookEntry 
													WHERE  Id =: oppTemp.PricebookEntryId
													LIMIT 1];
					documentLine= new InvoiceSapClases.InvoiceSapDocumentLine(priceBook.ProductCode,oppTemp.Quantity*1.0,oppTemp.UnitPrice,discount);
					documentLines.add(documentLine);
				}
			}
        string TipoRelacion='';
        string UUIDRelacion = '';
           
        if (this.OppObject.Sustituir_Datos__c == true){
            TipoRelacion='04';
          	UUIDRelacion = this.OppObject.N_Contable_en_SAP_Sustituida__c;
        }
		String importeFactura='';
		String fechaPagoBanco='';
		if (this.OppObject.Importe__c!=null)
		{
			importeFactura=this.OppObject.Importe__c.toPlainString();
		}
		if (this.OppObject.Fecha_de_Pago_Bancario__c!=null)
		{
			fechaPagoBanco=Utils.formatDate(this.OppObject.Fecha_de_Pago_Bancario__c);
		}
		InvoiceSapClases.InvoiceSapBusinessPertner bp= GetInvoiceSapBusinessPartner();
		InvoiceSapClases.InvoiceSapDocument dc=
			new InvoiceSapClases.InvoiceSapDocument(this.AccObject.Clave_SAP__c, this.OppObject.FechaFactura_o__c, this.OppObject.FechaPago__c, this.OppObject.InicioVigencia_o__c,
					this.OppObject.FinVigencia_o__c,comentarioVigencia,UtilsV2.obtainFacturaType(this.OppObject.Tipo_de_Facturacion__c), UtilsV2.obtainFacturaStatus(this.OppObject.EstatusFactura__c),
					this.OppObject.E_mail_para_env_o_de_Factura_Elect_nica__c,this.OppObject.CreatedDate,this.UserObject.Name,'',0,Utils.getCurrency(this.OppObject.CurrencyIsoCode),this.OppObject.NumFact__c, 
					this.OppObject.Referencia_Bancaria__c,Utils.getInvoiceType(this.OppObject.Tipo_de_Facturacion__c),this.OppObject.Orden_de_Compra__c,this.OppObject.N_mero_de_Proveedor__c,
					TipoRelacion,UUIDRelacion,Utils.getMetodoPagoSAT(this.OppObject.Clave_metodo_pago__c),this.AccObject.Cuenta_Virtual_Banamex__c,this.OppObject.N_mero_de_Cuenta_Pago__c, 
					Utils.getInvoiceClassification(this.OppObject.Clasificaci_n_de_Factura__c), Utils.getInvoiceStatus(this.OppObject.EstatusFactura__c), this.OppObject.Observaciones_SAP__c,
					0, this.OppObject.ClienteSAP_venta_anterior__c, bp, documentLines);
                    sapContract = dc;
		return sapContract; 
	}
    private InvoiceSapClases.InvoiceSapBusinessPertner GetInvoiceSapBusinessPartner (){
		
		Integer ejecutivoName=getAliasVentas(This.OppObject.EjecutivoAsig_o__c);
		String actualizaContacto='';
		if (This.OppObject.Cambio_Datos_de_Facturaci_n__c==false){actualizaContacto='False';}else{actualizaContacto='True';}
		InvoiceSapClases.InvoiceSapAddress ad= 
			new InvoiceSapClases.InvoiceSapAddress( this.AccObject.CalleFact_o__c,this.AccObject.Colonia_de_Facturaci_n__c,this.AccObject.CodigoPostalFact_o__c, '', 
													this.AccObject.DelegMunicFact_o__c,this.AccObject.No_de_Exterior__c, this.AccObject.No_de_interior__c,
													UtilsV2.getCatalogKey('Estados',this.AccObject.EstadoFact_o__c), UtilsV2.getCatalogKey('Paises',this.AccObject.PaisFact_o__c));
		system.debug('ad');
		system.debug(ad);
		InvoiceSapClases.InvoiceSapContact sc= 
			new InvoiceSapClases.InvoiceSapContact(This.ContactObject.FirstName + ' ' + This.ContactObject.LastName, This.ContactObject.Title, This.ContactObject.Phone, This.ContactObject.MobilePhone, This.ContactObject.Email);
		system.debug('sc');
		system.debug(sc);
		InvoiceSapClases.InvoiceSapBusinessPertner bp= 
		     new InvoiceSapClases.InvoiceSapBusinessPertner(this.AccObject.Clave_SAP__c,this.AccObject.RazonSoc_o__c,this.AccObject.Name,this.AccObject.Phone,this.AccObject.RFC_o__c, ejecutivoName,
			 												this.AccObject.Id,This.ContactObject.Id,Utils.TERRITORIOS.get(this.AccObject.EstadoFact_o__c),
			 												calculateDefinicionImpuesto(), utils.getTaxRegime(this.AccObject.Regimen_Fiscal__c), ad, sc);
		system.debug('bp');
		system.debug(bp);
		return bp; 
	}
    private String calculateDefinicionImpuesto(){
		if (OppObject.Tipo_de_Facturacion__c =='Credito - TheNetwork'){
			return IVAP0;
		}
		else {
			return IVAP16;
		}
	}

    // @future(callout=true)
    public static void sendInvoiceToHUB(string oppId){
        facturaSAPToHUB instance = new facturaSAPToHUB(oppId);
        
        InvoiceSapClases.ResponseInvoiceDocument response;
        InvoiceSapClases.InvoiceSapDocument sapContract= instance.FillInvoiceSAPDocument();
        String accessToken = SalesToHub.getAccessToken();
        String bodyRequest = JSON.serialize(sapContract);

        system.debug('Petición SAP'+bodyRequest);


        HttpResponse resp = getBodyRequest(accessToken, bodyRequest);
        response = (InvoiceSapClases.ResponseInvoiceDocument)JSON.deserialize(resp.getBody(), InvoiceSapClases.ResponseInvoiceDocument.class);

        if (resp.getStatusCode() == 200) {
            instance.OppObject.Id_pedido__c = String.valueOf(response.Data.DocNum);
            instance.OppObject.NunOfertafisica_o__c = String.valueOf(response.Data.DocumentoRelacionado.DocNum);
            instance.OppObject.Factura_Aprobada__c = true;
            if(response.Data.DocumentoRelacionado.DocNum == null){
                instance.OppObject.Mensaje_SAP__c = 'Factura en proceso';
            }else{
                instance.OppObject.Mensaje_SAP__c = response.Data.DocumentoRelacionado.Mensaje;
            }
        }
        if(resp.getStatusCode() == 409){
            if(String.valueOf(response.Data.DocNum) == instance.OppObject.Id_pedido__c){
                instance.OppObject.Mensaje_SAP__c = response.Data.Mensaje;
                instance.OppObject.NunOfertafisica_o__c = String.valueOf(response.Data.DocumentoRelacionado.DocNum);
            }
        }
        else{
            instance.OppObject.Mensaje_SAP__c = 'Error de prueba '+resp.getStatusCode();
        }
        instance.OppObject.Fecha_de_Pedido__c = Datetime.now();
        instance.OppObject.Fecha_de_solicitud_factura__c = Datetime.now();

        update instance.OppObject;
    }

    private static HttpResponse getBodyRequest(String accessToken, String bodyRequest){
        OCCMClasesV2.ServiceConnRequest conn = new OCCMClasesV2.ServiceConnRequest();
            conn.UserName = IntegrationServices__c.getValues('InvoiceToHub').UserName__c;
            //    conn.Password = IntegrationServices__c.getValues('CTSalesHub').Password__c;
            conn.UrlService = IntegrationServices__c.getValues('InvoiceToHub').URLService__c;
            conn.UrlMethod = IntegrationServices__c.getValues('InvoiceToHub').URLMethod__c;
            conn.Accept = IntegrationServices__c.getValues('InvoiceToHub').Accept__c;
            conn.ContentType = IntegrationServices__c.getValues('InvoiceToHub').Content_Type__c;
            conn.IsActive = IntegrationServices__c.getValues('InvoiceToHub').IsActive__c;
            conn.NumAttempts = Integer.valueOf(IntegrationServices__c.getValues('InvoiceToHub').NumAttempts__c);
            conn.DelayMillis = Integer.valueOf(IntegrationServices__c.getValues('InvoiceToHub').DelayMillis__c);
            conn.GeneratedToken ='Bearer '+ accessToken;

            httputils http = new httputils(conn);
            HttpResponse res = http.MakeAuthorizedCallOut(bodyRequest, 200);

            return res;
    }
}
downloadDownload PNG downloadDownload JPEG downloadDownload SVG

Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!

Click to optimize width for Twitter