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;
}
}