Rupert  Beatty

Rupert Beatty

1660138740

Monica: Personal Relationship Manager

Personal Relationship Manager   

Monica is a great open source personal relationship management system.

Introduction

Monica is an open-source web application to organize and record your interactions with your loved ones. We call it a PRM, or Personal Relationship Management. Think of it as a CRM (a popular tool used by sales teams in the corporate world) for your friends or family. This is what it currently looks like:

Screenshot of the application

Purpose

Monica allows people to keep track of everything that’s important about their friends and family. Like the activities with them. When you last called someone and what you talked about. It will help you remember the name and the age of their kids. It can also remind you to call someone you haven’t talked to in a while.

Features

  • Add and manage contacts
  • Define relationships between contacts
  • Reminders
  • Automatic reminders for birthdays
  • Stay in touch with a contact by sending reminders at a given interval
  • Management of debts
  • Ability to add notes to a contact
  • Ability to record how you met someone
  • Management of activities with a contact
  • Management of tasks
  • Management of gifts given and received and ideas for gifts
  • Management of addresses and all the different ways to contact someone
  • Management of contact field types
  • Management of a contact’s pets
  • Basic journal
  • Ability to record how your day went
  • Upload documents and photos
  • Export and import of data
  • Export contacts as vCards
  • Ability to define custom genders
  • Ability to define custom activity types
  • Ability to favorite contacts
  • Track conversations on social media or SMS
  • Multiple users
  • Tags to organize contacts
  • Ability to define what section should appear on the contact sheet
  • Multiple currencies
  • Multiple languages
  • An API that covers most of the data

Who is it for?

This project is for people who have difficulty remembering details about other people’s lives – especially those they care about. Yes, you can still use Facebook to achieve this, but you will only be able to see what people do and post, and not add your own notes about them.

We’ve also received lots of positive feedback from users who suffer from Asperger syndrome, Alzheimer’s disease, or simply introverts who use this application on a daily basis.

What Monica isn’t

  • Monica is not a social network and it never will be. It’s not meant to be social. It’s designed to be the opposite: it’s for your eyes only.
  • Monica is not a smart assistant. It won’t guess what you want to do. It’s actually pretty dumb: it will only send you emails for the things you asked to be reminded of.
  • Monica is not a tool that will scan your data and do nasty things with it. It’s your data, your server, do whatever you want with it. You’re in control of your data.

Where does this tool come from?

I originally built this tool to help me in my private life: I’ve been living outside my own country for a long time now. I want to keep notes and remember the life of my friends in my home country and be able to ask the relevant questions when I email them or talk to them over the phone.

Moreover, as a foreigner in my new country, I met a lot of other foreigners – and most go back to their countries. I still want to remember the names or ages of their kids. You may call it cheating but considering my poor memory, I call it caring.

After a few months, I decided to open source Monica so it could help other people as well.

Get started

There are multiple ways of getting started with Monica:

You can use our Hosted version. This is the simplest way to use Monica.

You can install it on your own server by following the installation instructions here. There are no limitations on Monica if you install it on your own server.

  • The downloadable version will always be the most complete version – the same as offered on the paid plan on the Hosted version.
  • Self-hosted will always be completely free with no strings attached and you will be in complete control.

You can deploy straight on a PaaS platform like:

Platform.sh Deploy on Platform.sh

Heroku Deploy to Heroku

Requirements

If you want to host Monica yourself, you will need a server with:

  • PHP 8.1 or newer
  • HTTP server with PHP support (eg: Apache, Nginx, Caddy)
  • Composer
  • MySQL

To successfully build and host Monica, we recommend a system with at least 1.5 GB for RAM. Monica can run on systems with significantly less memory, but due to the high memory requirements of the build process during updates, you may encounter issues and failed builds.

Update your instance

Once the software is installed, you’ll need to update it from time to time to have access to the latest features. Read this document to learn how to do it.

Contribute

Do you want to help? That’s awesome. We welcome contributions of all kinds from everyone.

Here are some of the things you can do to help.

Contribute as a community

Unlike Fight Club, the best way to help is to actually talk about Monica as much as you can in blog posts and articles, or on Twitter and Facebook.

You can answer questions in the issue tracker to help other community members.

You can financially support Monica’s development on Patreon or by subscribing to a paid account.

Contribute as a developer

Read our Contribution Guide.

Install the developer version locally so you can start contributing.

Look for issues labelled ‘Bugs’ if you are looking to have an immediate impact on Monica.

Look for issues labelled ‘Help Wanted’. These are issues that you can solve relatively easily.

Look for issues labelled ’Good First Issue’. These issues are for people who want to contribute, but try to work on a small feature first.

If you are an advanced developer, you can try to tackle issues labelled ‘Feature Requests’. These are harder to do and will require a lot of back-and-forth with the repository administrator to make sure we are going to the right direction with the product.

Principles, vision, goals and strategy

We want to use technology in a way that does not harm human relationships, like big social networks can do.

Principles

Monica has a few principles.

It should help have better relationships.

It should be simple to use, simple to contribute to, simple to understand, extremely simple to maintain.

It is not a social network and never will be.

It is not and never will be ad-supported.

Users are not and never will be tracked.

It should be transparent.

It should be open-source.

It should do one thing (documenting social interactions) extremely well, and nothing more.

It should be well documented.

Vision

Monica’s vision is to help people have more meaningful relationships.

Goals

We want to provide a platform that is:

really easy to use: we value simplicity over anything else.

open-source: we believe everyone should be able to contribute to this tool, and see for themselves that nothing nasty is done behind the scenes that would go against the best interests of the users. We also want to leverage the community to build attractive features and do things that would not be possible otherwise.

easy to contribute to: we want to keep the codebase as simple as possible. This has two big advantages: anyone can contribute, and it’s easily maintainable on the long run.

available everywhere: Monica should be able to run on any desktop OS or mobile phone easily. This will be made possible by making sure the tool is easily installable by anyone who wants to either contribute or host the platform themselves.

Strategy

We think Monica has to become a platform more than an application, so people can build on it.

Here what we should do in order to realize our vision:

(done) Build an API in order to create an ecosystem. The ecosystem is what will make Monica a successful platform.

(done) Build importers and exporters of data. We don’t want to have any vendor lock-ins. Data is the property of the users and they should be able to do whatever they want with it.

(done) Be the central point of contact management, by supporting CardDav protocol.

(done) Be the central point of calendar events, by supporting CalDav protocol.

(partially done) Build great reports so people can have interesting insights on how they interact with their loved ones.

Create a smart recommendation system for gifts. For instance, if my nephew is soon 6 years old in a month, I will be able to receive an email with a list of 5 potential gifts I can offer to a 6 year old boy.

Add more ways of being reminded: Telegram, SMS,...

Create Chrome extensions to load Monica’s data in a sidebar when viewing a contact on Facebook, letting us take additional notes as we see them on Facebook.

Add modules that can be activated on demand. One would be for instance, for the people who wants to use Monica for dating purposes (yes, we’ve received this kind of feedback already).

Monetization

While it’s not the driving force behind Monica, it would be great if the tool could generate money so we could work full time on it and sustain it on the long run. We are big fans of Sentry, Wordpress and GitLab and we believe this kind of business model is an inspiring one where everyone wins.

If you want to support the development of Monica, consider taking a paid account, or support us on Patreon.

The Hosted version of Monica is offered in two versions:

a free plan which includes:

  • 10 contacts
  • data exporters

a paid plan which includes:

  • unlimited contacts
  • email reminders
  • data importers
  • advanced features

We’re still working on the features included in the paid plan, and these may be subject to change while we work out our business model to make Monica’s development sustainable.

People who substantially contribute to the GitHub repository (with a pull request that adds value, that gets merged – not a typo fix, for instance) will also have access to the paid version for free.

There is a Patreon account for those who want to financially support Monica’s development in another way. The best way to support Monica it is to actually talk about it and help grow its userbase.

There are no ads on the platform and there never will be. We will never resell your data on the Hosted version and we have no access to it if you self-host.

We are like you, and this is why we are on GitHub: we hate big corporations that do not have at heart the best interests of their users, even if they say otherwise. We believe that the only way to sustain the development of Monica is to actually make money in a good old-fashioned way.

Why Open Source?

Why is Monica open source? Is it risky? Will someone steal my code and do a for-profit business that will kill my own business? Why reveal my strategy to the world? These are the kind of questions we’ve received by email already.

The answer to these questions is simple: yes, you can fork Monica and make a competing project, make money out of it (even if the license is not super friendly towards that) and I’ll never know. But it’s okay, I don’t mind.

I wanted to open source Monica for several reasons:

I believe that this tool can really change people’s lives.
While I aim to make money out of it, I also want everyone to benefit from it. Open sourcing a project like this will help Monica become much bigger than what I imagine myself. While I strongly believe that this software has to follow the vision I have for it, I need to be humble enough to know that ideas come from everywhere, and people have much better ideas than what I can have.

You can’t make something great alone.
While Monica could become a company and hire a bunch of super smart people to work on it, you can’t beat the manpower of an entire community. Open sourcing the product means bugs will be fixed faster, features will be developed faster, and more importantly, developers will be able to contribute to a tool that positively changes their own lives and the lives of other people.

Doing things in a transparent way leads to formidable things.
People respect the project more when they can see how it’s being worked on. You can’t hide nasty things in the code. You can’t do things behind the backs of your users. Doing everything in the open is a major driving force that motivates you to keep doing what’s right.

Once you’ve created a community of passionate developers around your project, you’ve won.
Because developers are very powerful influencers. Developers will create apps around your product, talk about it on forums, and share the project with their friends, families, and colleagues. Cherish the developers – users will follow.

Patreon

You can support the development of Monica on Patreon. Thanks for your help.

Contact

Team

Our team is made of two core members:

Maazarin (djaiss)

Alexis Saettler (asbiin)

We are also fortunate to have an amazing community of developers who help us greatly.

Thank you, open source

Monica uses a lot of open source projects and we thank them with all our hearts. We hope that providing Monica as an free, open source project will help other people the same way those softwares have helped us.

Download Details:

Author: Monicahq
Source Code: https://github.com/monicahq/monica 
License: AGPL-3.0 license

#laravel #php #crm #hacktoberfest 

Monica: Personal Relationship Manager

Top 5 Reasons to Implement Social-CRM Integration

Tech explosion has evolved the customer at a significant pace. The modern customer is now proactive and smart. And they expect the same kind of approach from the brands. They want user-friendly, efficient, and steadfast crm integrate that are easily accessible.

Brands need to remain highly communicative and create a strong social media presence. Hence, your CRM strategy must include social media as this enables you to track, benchmark, and continue to engage with your customers via their preferred communication channels.

https://brainstreamtechnolabs.com/top-5-reasons-to-implement-social-crm-integration/

#crmintegration #web-development #crm  #web-service #socialcrmintegrationservices #businesses #webdesign #newblog #new #newarticle

Top 5 Reasons to Implement Social-CRM Integration

IT Consulting Company

Salesforce CRM focuses on helping businesses with customer retention and customer satisfaction. It acts as a one-stop solution for enterprises to maintain & expand their customer ground & revenue streams.

As an authorized Salesforce partner, our certified experts help you maximize Salesforce's ROI!

Reach us: IT Consulting Company 

#salesforcepartner #crm #software #it #innovation #technology #businessgrowth #techsolutions #yozytech

IT Consulting Company

Conexión entre PHP y MS CRM

Esta vez aprenderemos cómo conectar Microsoft Dynamics CRM usando código PHP. El servicio SOAP de Microsoft Dynamics CRM puede ser una forma de realizar llamadas desde el código fuente de PHP. Se requiere un encabezado de jabón válido para ejecutar la solicitud de jabón. Veamos cómo crear un encabezado válido usando código PHP:

Para obtener una solicitud de SOAP válida, primero debe crear token1, token2 y keyIdentifer, que se pueden crear con el nombre de usuario y la contraseña en línea.

Sobre de jabón para obtener token1, token2, ekyidentifer:

$xml = "<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:a=\"http://www.w3.org/2005/08/addressing\" xmlns:u=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">";
$xml .= "<s:Header>";
$xml .= "<a:Action s:mustUnderstand=\"1\">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action>";
$xml .= "<a:MessageID>urn:uuid:" . $this->newGUID () . "</a:MessageID>";
$xml .= "<a:ReplyTo>";
$xml .= "<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>";
$xml .= "</a:ReplyTo>";
$xml .= "<a:To s:mustUnderstand=\"1\">https://login.microsoftonline.com/RST2.srf</a:To>";
$xml .= "<o:Security s:mustUnderstand=\"1\" xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">";
$xml .= "<u:Timestamp u:Id=\"_0\">";
$xml .= "<u:Created>" . gmdate ( 'Y-m-d\TH:i:s.u\Z', $now ) . "</u:Created>";
$xml .= "<u:Expires>" . gmdate ( 'Y-m-d\TH:i:s.u\Z', strtotime ( '+60 minute', $now ) ) . "</u:Expires>";
$xml .= "</u:Timestamp>";
$xml .= "<o:UsernameToken u:Id=\"uuid-" . $this->newGUID () . "-1\">";
$xml .= "<o:Username>" . $username . "</o:Username>";
$xml .= "<o:Password>" . $password . "</o:Password>";
$xml .= "</o:UsernameToken>";
$xml .= "</o:Security>";
$xml .= "</s:Header>";
$xml .= "<s:Body>";
$xml .= "<trust:RequestSecurityToken xmlns:trust=\"http://schemas.xmlsoap.org/ws/2005/02/trust\">";
$xml .= "<wsp:AppliesTo xmlns:wsp=\"http://schemas.xmlsoap.org/ws/2004/09/policy\">";
$xml .= "<a:EndpointReference>";
$xml .= "<a:Address>urn:" . $urnAddress . "</a:Address>";
$xml .= "</a:EndpointReference>";
$xml .= "</wsp:AppliesTo>";
$xml .= "<trust:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</trust:RequestType>";
$xml .= "</trust:RequestSecurityToken>";
$xml .= "</s:Body>";
$xml .= "</s:Envelope>";

JavaScript

En respuesta, obtendrá el elemento "CipherValue" que tiene ambos tokens que puede obtener de la respuesta. Ver código de muestra:

$response = curl_exec($ch);
curl_close($ch);
$responsedom = new DomDocument();
$responsedom - > loadXML($response);
$cipherValues = $responsedom - > getElementsbyTagName("CipherValue");
$token1 = $cipherValues - > item(0) - > textContent;
$token2 = $cipherValues - > item(1) - > textContent;

JavaScript

Lo siguiente es obtener el valor KeyIdentifier que puede obtener usando el nombre del elemento "KeyIdentifier" de la respuesta.

$keyIdentiferValues = $responsedom->getElementsbyTagName ( "KeyIdentifier" );

JavaScript

Ahora necesita obtener el encabezado en línea usando token1, token2 y KeyIdentifier. A continuación puede ver un ejemplo de encabezado XML para la solicitud de Soap:

$xml = "<s:Header>";
$xml .= "<a:Action s:mustUnderstand=\"1\">http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute</a:Action>";
$xml .= "<Security xmlns=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">";
$xml .= "<EncryptedData Id=\"Assertion0\" Type=\"http://www.w3.org/2001/04/xmlenc#Element\" xmlns=\"http://www.w3.org/2001/04/xmlenc#\">";
$xml .= "<EncryptionMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#tripledes-cbc\"/>";
$xml .= "<ds:KeyInfo xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\">";
$xml .= "<EncryptedKey>";
$xml .= "<EncryptionMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p\"/>";
$xml .= "<ds:KeyInfo Id=\"keyinfo\">";
$xml .= "<wsse:SecurityTokenReference xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">";
$xml .= "<wsse:KeyIdentifier EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\" ValueType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier\">" . $keyIdentifer . "</wsse:KeyIdentifier>";
$xml .= "</wsse:SecurityTokenReference>";
$xml .= "</ds:KeyInfo>";
$xml .= "<CipherData>";
$xml .= "<CipherValue>" . $token1 . "</CipherValue>";
$xml .= "</CipherData>";
$xml .= "</EncryptedKey>";
$xml .= "</ds:KeyInfo>";
$xml .= "<CipherData>";
$xml .= "<CipherValue>" . $token2 . "</CipherValue>";
$xml .= "</CipherData>";
$xml .= "</EncryptedData>";
$xml .= "</Security>";
$xml .= "<a:MessageID>urn:uuid:" . $this->newGUID () . "</a:MessageID>";
$xml .= "<a:ReplyTo>";
$xml .= "<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>";
$xml .= "</a:ReplyTo>";
$xml .= "<a:To s:mustUnderstand=\"1\">" . $url . "XRMServices/2011/Organization.svc</a:To>";
$xml .= "</s:Header>";

JavaScript

CRM URN Dirección basada en la región en línea del cliente. Puede usar esta función para obtener la URN correcta:

function GetUrnOnline($url) {
    if (strpos(strtoupper($url), "CRM2.DYNAMICS.COM")) {
        return "crmsam:dynamics.com";
    }
    if (strpos(strtoupper($url), "CRM4.DYNAMICS.COM")) {
        return "crmemea:dynamics.com";
    }
    if (strpos(strtoupper($url), "CRM5.DYNAMICS.COM")) {
        return "crmapac:dynamics.com";
    }
    if (strpos(strtoupper($url), "CRM6.DYNAMICS.COM")) {
        return "crmoce:dynamics.com";
    }
    if (strpos(strtoupper($url), "CRM7.DYNAMICS.COM")) {
        return "crmjpn:dynamics.com";
    }
    if (strpos(strtoupper($url), "CRM9.DYNAMICS.COM")) {
        return "crmgcc:dynamics.com";
    }
    return "crmna:dynamics.com";
}

JavaScript

Usando el encabezado, puede conectar Dynamics CRM desde el código PHP. Vea las líneas de código de ejemplo para obtener datos de la lista del código PHP:

// Get Dynamics CRM Online Header
$url = "https://org.crm.dynamics.com/";
$username = "user@dynamics.net";
$password = "password";

$dynamicsCrmHeader = new DynamicsCrmHeader ();
$authHeader = $dynamicsCrmHeader->GetHeaderOnline ( $username, $password, $url );
// Get Dynamics CRM Online Header

JavaScript

Solicitud de jabón para obtener la lista:

$xml .= "<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:a=\"http://www.w3.org/2005/08/addressing\">";
			$xml .= $authHeader->Header;
			$xml ="<s:Body>";
			$xml .="<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
			$xml .="<request i:type=\"a:RetrieveMultipleRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
			$xml .="<a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
			$xml .="<a:KeyValuePairOfstringanyType>";
            $xml .="<b:key>Query</b:key>";
            $xml .="<b:value i:type=\"a:QueryExpression\">";
            $xml .="<a:ColumnSet>";
            $xml .="<a:AllColumns>true</a:AllColumns>";
            $xml .="<a:Columns xmlns:c=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">";
            $xml .="</a:Columns>";
            $xml .="</a:ColumnSet>";
			$xml .= "<a:Criteria>";
            $xml .= "<a:Conditions />";
            $xml .= "<a:FilterOperator>And</a:FilterOperator>";
            $xml .= "<a:Filters />";
            $xml .= "</a:Criteria>";
            $xml .="<a:Distinct>false</a:Distinct>";
            $xml .="<a:EntityName>list</a:EntityName>";
            $xml .="<a:LinkEntities />";
            $xml .="<a:Orders />";
            $xml .="<a:PageInfo>";
            $xml .="<a:Count>0</a:Count>";
            $xml .="<a:PageNumber>0</a:PageNumber>";
            $xml .="<a:PagingCookie i:nil=\"true\" />";
            $xml .="<a:ReturnTotalRecordCount>false</a:ReturnTotalRecordCount>";
            $xml .="</a:PageInfo>";
            $xml .="<a:NoLock>false</a:NoLock>";
            $xml .="</b:value>";
			$xml .="</a:KeyValuePairOfstringanyType>";
			$xml .="</a:Parameters>";
			$xml .="<a:RequestId i:nil=\"true\" />";
			$xml .="<a:RequestName>RetrieveMultiple</a:RequestName>";
			$xml .="</request>";
			$xml .="</Execute>";
			$xml .="</s:Body>";
			$xml .= "</s:Envelope>";

JavaScript

Debe hacer una llamada de jabón y convertir la respuesta como DomDocument.

$client = new DynamicsCrmSoapClient();
$response = $client - > ExecuteSOAPRequest($xml, $url);
//echo $response;
$responsedom = new DomDocument();
$responsedom - > loadXML($response);

JavaScript

Encuentre un ejemplo de código aquí:  https://github.com/stw-services/Dynamics-CRM/tree/master/PHP-MSCRM

Gracias por leer :) 

Fuente: https://www.c-sharpcorner.com/article/connection- between -php-and-ms-crm/

#php  #crm 

Conexión entre PHP y MS CRM

PHPとMSCRM間の接続

今回は、PHPコードを使用してMicrosoftDynamicsCRMを接続する方法を学習します。Microsoft Dynamics CRMのSOAPサービスは、PHPソースコードから呼び出しを行う方法です。soapリクエストを実行するには、有効なsoapヘッダーが必要です。PHPコードを使用して有効なヘッダーを作成する方法を見てみましょう。

有効なsoapリクエストを取得するには、最初に、オンラインユーザー名とパスワードを使用して作成できるtoken1、token2、およびkeyIdentiferを作成する必要があります。

token1、token2、ekyidentiferを取得するための石鹸エンベロープ:

$xml = "<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:a=\"http://www.w3.org/2005/08/addressing\" xmlns:u=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">";
$xml .= "<s:Header>";
$xml .= "<a:Action s:mustUnderstand=\"1\">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action>";
$xml .= "<a:MessageID>urn:uuid:" . $this->newGUID () . "</a:MessageID>";
$xml .= "<a:ReplyTo>";
$xml .= "<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>";
$xml .= "</a:ReplyTo>";
$xml .= "<a:To s:mustUnderstand=\"1\">https://login.microsoftonline.com/RST2.srf</a:To>";
$xml .= "<o:Security s:mustUnderstand=\"1\" xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">";
$xml .= "<u:Timestamp u:Id=\"_0\">";
$xml .= "<u:Created>" . gmdate ( 'Y-m-d\TH:i:s.u\Z', $now ) . "</u:Created>";
$xml .= "<u:Expires>" . gmdate ( 'Y-m-d\TH:i:s.u\Z', strtotime ( '+60 minute', $now ) ) . "</u:Expires>";
$xml .= "</u:Timestamp>";
$xml .= "<o:UsernameToken u:Id=\"uuid-" . $this->newGUID () . "-1\">";
$xml .= "<o:Username>" . $username . "</o:Username>";
$xml .= "<o:Password>" . $password . "</o:Password>";
$xml .= "</o:UsernameToken>";
$xml .= "</o:Security>";
$xml .= "</s:Header>";
$xml .= "<s:Body>";
$xml .= "<trust:RequestSecurityToken xmlns:trust=\"http://schemas.xmlsoap.org/ws/2005/02/trust\">";
$xml .= "<wsp:AppliesTo xmlns:wsp=\"http://schemas.xmlsoap.org/ws/2004/09/policy\">";
$xml .= "<a:EndpointReference>";
$xml .= "<a:Address>urn:" . $urnAddress . "</a:Address>";
$xml .= "</a:EndpointReference>";
$xml .= "</wsp:AppliesTo>";
$xml .= "<trust:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</trust:RequestType>";
$xml .= "</trust:RequestSecurityToken>";
$xml .= "</s:Body>";
$xml .= "</s:Envelope>";

JavaScript

応答として、応答からフェッチできる両方のトークンを持つ要素「CipherValue」を取得します。サンプルコードを参照してください。

$response = curl_exec($ch);
curl_close($ch);
$responsedom = new DomDocument();
$responsedom - > loadXML($response);
$cipherValues = $responsedom - > getElementsbyTagName("CipherValue");
$token1 = $cipherValues - > item(0) - > textContent;
$token2 = $cipherValues - > item(1) - > textContent;

JavaScript

次に、応答から「KeyIdentifier」要素名を使用して取得できるKeyIdentifier値を取得します。

$keyIdentiferValues = $responsedom->getElementsbyTagName ( "KeyIdentifier" );

JavaScript

次に、token1、token2、およびKeyIdentifierを使用してオンラインヘッダーを取得する必要があります。以下に、SOAPリクエストのヘッダーXMLの例を示します。

$xml = "<s:Header>";
$xml .= "<a:Action s:mustUnderstand=\"1\">http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute</a:Action>";
$xml .= "<Security xmlns=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">";
$xml .= "<EncryptedData Id=\"Assertion0\" Type=\"http://www.w3.org/2001/04/xmlenc#Element\" xmlns=\"http://www.w3.org/2001/04/xmlenc#\">";
$xml .= "<EncryptionMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#tripledes-cbc\"/>";
$xml .= "<ds:KeyInfo xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\">";
$xml .= "<EncryptedKey>";
$xml .= "<EncryptionMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p\"/>";
$xml .= "<ds:KeyInfo Id=\"keyinfo\">";
$xml .= "<wsse:SecurityTokenReference xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">";
$xml .= "<wsse:KeyIdentifier EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\" ValueType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier\">" . $keyIdentifer . "</wsse:KeyIdentifier>";
$xml .= "</wsse:SecurityTokenReference>";
$xml .= "</ds:KeyInfo>";
$xml .= "<CipherData>";
$xml .= "<CipherValue>" . $token1 . "</CipherValue>";
$xml .= "</CipherData>";
$xml .= "</EncryptedKey>";
$xml .= "</ds:KeyInfo>";
$xml .= "<CipherData>";
$xml .= "<CipherValue>" . $token2 . "</CipherValue>";
$xml .= "</CipherData>";
$xml .= "</EncryptedData>";
$xml .= "</Security>";
$xml .= "<a:MessageID>urn:uuid:" . $this->newGUID () . "</a:MessageID>";
$xml .= "<a:ReplyTo>";
$xml .= "<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>";
$xml .= "</a:ReplyTo>";
$xml .= "<a:To s:mustUnderstand=\"1\">" . $url . "XRMServices/2011/Organization.svc</a:To>";
$xml .= "</s:Header>";

JavaScript

顧客のオンライン地域に基づくCRMURNアドレス。この関数を使用して、正しいURNを取得できます。

function GetUrnOnline($url) {
    if (strpos(strtoupper($url), "CRM2.DYNAMICS.COM")) {
        return "crmsam:dynamics.com";
    }
    if (strpos(strtoupper($url), "CRM4.DYNAMICS.COM")) {
        return "crmemea:dynamics.com";
    }
    if (strpos(strtoupper($url), "CRM5.DYNAMICS.COM")) {
        return "crmapac:dynamics.com";
    }
    if (strpos(strtoupper($url), "CRM6.DYNAMICS.COM")) {
        return "crmoce:dynamics.com";
    }
    if (strpos(strtoupper($url), "CRM7.DYNAMICS.COM")) {
        return "crmjpn:dynamics.com";
    }
    if (strpos(strtoupper($url), "CRM9.DYNAMICS.COM")) {
        return "crmgcc:dynamics.com";
    }
    return "crmna:dynamics.com";
}

JavaScript

ヘッダーを使用すると、PHPコードからDynamicsCRMに接続できます。PHPコードからリストデータを取得するには、サンプルコード行を参照してください。

// Get Dynamics CRM Online Header
$url = "https://org.crm.dynamics.com/";
$username = "user@dynamics.net";
$password = "password";

$dynamicsCrmHeader = new DynamicsCrmHeader ();
$authHeader = $dynamicsCrmHeader->GetHeaderOnline ( $username, $password, $url );
// Get Dynamics CRM Online Header

JavaScript

リストを取得するための石鹸の要求:

$xml .= "<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:a=\"http://www.w3.org/2005/08/addressing\">";
			$xml .= $authHeader->Header;
			$xml ="<s:Body>";
			$xml .="<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
			$xml .="<request i:type=\"a:RetrieveMultipleRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
			$xml .="<a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
			$xml .="<a:KeyValuePairOfstringanyType>";
            $xml .="<b:key>Query</b:key>";
            $xml .="<b:value i:type=\"a:QueryExpression\">";
            $xml .="<a:ColumnSet>";
            $xml .="<a:AllColumns>true</a:AllColumns>";
            $xml .="<a:Columns xmlns:c=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">";
            $xml .="</a:Columns>";
            $xml .="</a:ColumnSet>";
			$xml .= "<a:Criteria>";
            $xml .= "<a:Conditions />";
            $xml .= "<a:FilterOperator>And</a:FilterOperator>";
            $xml .= "<a:Filters />";
            $xml .= "</a:Criteria>";
            $xml .="<a:Distinct>false</a:Distinct>";
            $xml .="<a:EntityName>list</a:EntityName>";
            $xml .="<a:LinkEntities />";
            $xml .="<a:Orders />";
            $xml .="<a:PageInfo>";
            $xml .="<a:Count>0</a:Count>";
            $xml .="<a:PageNumber>0</a:PageNumber>";
            $xml .="<a:PagingCookie i:nil=\"true\" />";
            $xml .="<a:ReturnTotalRecordCount>false</a:ReturnTotalRecordCount>";
            $xml .="</a:PageInfo>";
            $xml .="<a:NoLock>false</a:NoLock>";
            $xml .="</b:value>";
			$xml .="</a:KeyValuePairOfstringanyType>";
			$xml .="</a:Parameters>";
			$xml .="<a:RequestId i:nil=\"true\" />";
			$xml .="<a:RequestName>RetrieveMultiple</a:RequestName>";
			$xml .="</request>";
			$xml .="</Execute>";
			$xml .="</s:Body>";
			$xml .= "</s:Envelope>";

JavaScript

せっけん呼び出しを行い、応答をDomDocumentとして変換する必要があります。

$client = new DynamicsCrmSoapClient();
$response = $client - > ExecuteSOAPRequest($xml, $url);
//echo $response;
$responsedom = new DomDocument();
$responsedom - > loadXML($response);

JavaScript

ここでコードサンプルを見つけてください:  https ://github.com/stw-services/Dynamics-CRM/tree/master/PHP-MSCRM

読んでくれてありがとう :) 

ソース:https ://www.c-sharpcorner.com/article/connection-between-php-and-ms-crm/

#php  #crm 

PHPとMSCRM間の接続

What are the benefits of using HubSpot CMS and CRM for inbound marketi

You need everything in today's competitive world: CRM, CMS, email marketing, and, perhaps most significantly, a smooth experience for IT personnel.

You'll discover all you need to know about the advantages of utilising HubSpot CMS and CRM for inbound marketing in this post.

https://multiqos.com/benefits-of-choosing-hubspot-cms-and-crm-for-website/

#hubspot #marketing #cms #crm 

What are the benefits of using HubSpot CMS and CRM for inbound marketi

Movimiento De Escenario Automático Usando El Complemento CRM En BPF

En algunos escenarios, debe mover la etapa BPF automáticamente según el código del lado del servidor. Esto se puede lograr con un complemento CRM. Por ejemplo, si actualiza el campo de título del registro de contacto seleccionado, BPF pasará automáticamente a la siguiente etapa.

paso 1

Inicie sesión en el entorno requerido, vaya a Flujo, seleccione Flujo de proceso empresarial - Vacunación y verifique si BPF está activo. Si no está activo, hágalo activo como se muestra en la siguiente figura.

Movimiento automático del escenario utilizando el complemento CRM de BPF

Paso 2

Después del paso 1, abra el flujo del proceso empresarial, abra el BPF seleccionado anteriormente para utilizarlo en el siguiente paso, como se muestra en la siguiente figura, y anote el nombre lógico del flujo del proceso empresarial.

Movimiento automático del escenario utilizando el complemento CRM de BPF

Paso 3

Después del paso 2, debe ir al código del complemento [Biblioteca de clases C #] en el método para ejecutar el mensaje de actualización para el contacto de cambio de título del trabajo y escribir la lógica en el bloque de código de la siguiente manera:

public void Execute(IServiceProvider serviceProvider) {
    IPluginExecutionContext context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext));
    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory) serviceProvider.GetService(typeof(IOrganizationServiceFactory));
    IOrganizationService crmService = serviceFactory.CreateOrganizationService(null);
    try {
        string logicalNameOfBPF = "cr5bc_vaccination";
        if (context.MessageName.ToLower().Equals("update") && context.PrimaryEntityName.ToLower().Equals("contact")) {
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) {
                Entity entity = (Entity) context.InputParameters["Target"];
                if (entity.Contains("jobtitle") && entity["jobtitle"] != null) {
                    // logic here
                }
            }
        }
    } catch (InvalidPluginExecutionException ex) {
        throw ex;
    }
}

Esto se muestra en la siguiente figura.

Movimiento automático del escenario utilizando el complemento CRM de BPF

Etapa 4

Después del paso 3 , necesitamos obtener los detalles del BPF activo presente en el registro de contacto seleccionado que estaba abierto, escribimos de otra manera, obtuvimos esto y obtuvimos los contactos en Para pasar una entidad y obtener más información, haga una solicitud RetrieveProcessInstancesRequest que está presente en el mensaje del SDK de CRM que usó en el paso 2 para llamar a este método y pasarlo a RetrieveProcessInstancesResponse para obtener una lista de instancias de proceso BPF. Luego, puede usar el siguiente código para seleccionar la primera instancia.

public Entity GetActiveBPFDetails(Entity entity, IOrganizationService crmService) {
    Entity activeProcessInstance = null;
    RetrieveProcessInstancesRequest entityBPFsRequest = new RetrieveProcessInstancesRequest {
        EntityId = entity.Id,
            EntityLogicalName = entity.LogicalName
    };
    RetrieveProcessInstancesResponse entityBPFsResponse = (RetrieveProcessInstancesResponse) crmService.Execute(entityBPFsRequest);
    if (entityBPFsResponse.Processes != null && entityBPFsResponse.Processes.Entities != null) {
        activeProcessInstance = entityBPFsResponse.Processes.Entities[0];
    }
    return activeProcessInstance;
}

Como se muestra en la figura siguiente

Paso 5

Después del paso 4, debe escribir otro método y llamarlo dentro del método de ejecución para obtener los detalles de todas las etapas del BPF seleccionado en el registro de contacto. Esto le permite extraer los detalles del ID de la siguiente etapa utilizando RetrieveActivePathResponse en el mensaje del SDK de CRM . Obtenga la solicitud de ruta activa utilizando el ID del período activo, el ID de BPF activo, el servicio IOrganization para extraer el tipo int y el objeto como parámetros de entrada y salida con la posición de la etapa actual debajo del código, pasando parámetros como :

public RetrieveActivePathResponse GetAllStagesOfSelectedBPF(Guid activeBPFId, Guid activeStageId, ref int currentStagePosition, IOrganizationService crmService) {
    // Retrieve the process stages in the active path of the current process instance
    RetrieveActivePathRequest pathReq = new RetrieveActivePathRequest {
        ProcessInstanceId = activeBPFId
    };
    RetrieveActivePathResponse pathResp = (RetrieveActivePathResponse) crmService.Execute(pathReq);
    for (int i = 0; i < pathResp.ProcessStages.Entities.Count; i++) {
        // Retrieve the active stage name and active stage position based on the activeStageId for the process instance
        if (pathResp.ProcessStages.Entities[i].Attributes["processstageid"].ToString() == activeStageId.ToString()) {
            currentStagePosition = i;
        }
    }
    return pathResp;
}

Como se muestra en la figura siguiente

Movimiento automático del escenario utilizando el complemento CRM de BPF

Paso 6

Después del paso 5, llame a los métodos obtenidos en los pasos 4 y 5 desde el método principal , recorra las etapas según la respuesta de la ruta activa y la posición de la etapa actual, obtenga el ID de la siguiente etapa y active la siguiente etapa. Debe establecerse como . Al pasar la siguiente ID de etapa como formando el objeto del BPF actual que tiene selectividad BPF ID de instancia Activestageid el BPF utilizando el siguiente método de actualización de código, la etapa activa de BPF del servicio de IOrganization cambiará a la siguiente etapa

Entity activeProcessInstance = GetActiveBPFDetails(entity, crmService);
if (activeProcessInstance != null) {
    Guid activeBPFId = activeProcessInstance.Id; // Id of the active process instance, which will be used
    // Retrieve the active stage ID of in the active process instance
    Guid activeStageId = new Guid(activeProcessInstance.Attributes["processstageid"].ToString());
    int currentStagePosition = -1;
    RetrieveActivePathResponse pathResp = GetAllStagesOfSelectedBPF(activeBPFId, activeStageId, ref currentStagePosition, crmService);
    if (currentStagePosition > -1 && pathResp.ProcessStages != null && pathResp.ProcessStages.Entities != null && currentStagePosition + 1 < pathResp.ProcessStages.Entities.Count) {
        // Retrieve the stage ID of the next stage that you want to set as active
        Guid nextStageId = (Guid) pathResp.ProcessStages.Entities[currentStagePosition + 1].Attributes["processstageid"];
        // Set the next stage as the active stage
        Entity entBPF = new Entity(logicalNameOfBPF) {
            Id = activeBPFId
        };
        entBPF["activestageid"] = new EntityReference("processstage", nextStageId);
        crmService.Update(entBPF);
    }
}

Como se muestra en la figura siguiente.

Movimiento automático del escenario utilizando el complemento CRM de BPF

Paso 7

Después del paso 6 , el código final se ve así:

public void Execute(IServiceProvider serviceProvider) {
    IPluginExecutionContext context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext));
    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory) serviceProvider.GetService(typeof(IOrganizationServiceFactory));
    IOrganizationService crmService = serviceFactory.CreateOrganizationService(null);
    try {
        string logicalNameOfBPF = "cr5bc_vaccination";
        if (context.MessageName.ToLower().Equals("update") && context.PrimaryEntityName.ToLower().Equals("contact")) {
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) {
                Entity entity = (Entity) context.InputParameters["Target"];
                if (entity.Contains("jobtitle") && entity["jobtitle"] != null) {
                    Entity activeProcessInstance = GetActiveBPFDetails(entity, crmService);
                    if (activeProcessInstance != null) {
                        Guid activeBPFId = activeProcessInstance.Id; // Id of the active process instance, which will be used
                        // Retrieve the active stage ID of in the active process instance
                        Guid activeStageId = new Guid(activeProcessInstance.Attributes["processstageid"].ToString());
                        int currentStagePosition = -1;
                        RetrieveActivePathResponse pathResp = GetAllStagesOfSelectedBPF(activeBPFId, activeStageId, ref currentStagePosition, crmService);
                        if (currentStagePosition > -1 && pathResp.ProcessStages != null && pathResp.ProcessStages.Entities != null && currentStagePosition + 1 < pathResp.ProcessStages.Entities.Count) {
                            // Retrieve the stage ID of the next stage that you want to set as active
                            Guid nextStageId = (Guid) pathResp.ProcessStages.Entities[currentStagePosition + 1].Attributes["processstageid"];
                            // Set the next stage as the active stage
                            Entity entBPF = new Entity(logicalNameOfBPF) {
                                Id = activeBPFId
                            };
                            entBPF["activestageid"] = new EntityReference("processstage", nextStageId);
                            crmService.Update(entBPF);
                        }
                    }
                }
            }
        }
    } catch (InvalidPluginExecutionException ex) {
        throw ex;
    }
}
public Entity GetActiveBPFDetails(Entity entity, IOrganizationService crmService) {
    Entity activeProcessInstance = null;
    RetrieveProcessInstancesRequest entityBPFsRequest = new RetrieveProcessInstancesRequest {
        EntityId = entity.Id,
            EntityLogicalName = entity.LogicalName
    };
    RetrieveProcessInstancesResponse entityBPFsResponse = (RetrieveProcessInstancesResponse) crmService.Execute(entityBPFsRequest);
    if (entityBPFsResponse.Processes != null && entityBPFsResponse.Processes.Entities != null) {
        activeProcessInstance = entityBPFsResponse.Processes.Entities[0];
    }
    return activeProcessInstance;
}
public RetrieveActivePathResponse GetAllStagesOfSelectedBPF(Guid activeBPFId, Guid activeStageId, ref int currentStagePosition, IOrganizationService crmService) {
    // Retrieve the process stages in the active path of the current process instance
    RetrieveActivePathRequest pathReq = new RetrieveActivePathRequest {
        ProcessInstanceId = activeBPFId
    };
    RetrieveActivePathResponse pathResp = (RetrieveActivePathResponse) crmService.Execute(pathReq);
    for (int i = 0; i < pathResp.ProcessStages.Entities.Count; i++) {
        // Retrieve the active stage name and active stage position based on the activeStageId for the process instance
        if (pathResp.ProcessStages.Entities[i].Attributes["processstageid"].ToString() == activeStageId.ToString()) {
            currentStagePosition = i;
        }
    }
    return pathResp;
}

Como se muestra en la figura siguiente.

Movimiento automático del escenario utilizando el complemento CRM de BPF

Paso 8

Después del paso 7, después de firmar la construcción y el ensamblaje, después de registrar el ensamblaje usando una herramienta de registro de complemento para crear un paso de actualización para contactar a una entidad con el mensaje de actualización, filtrado de atributos en el título del trabajo en la cirugía Haga clic en el proceso de creación / actualización como se muestra como Mode y Sync como antes En la figura siguiente

Movimiento automático del escenario utilizando el complemento CRM de BPF

Paso 9

Después del paso 8, vaya al registro de contacto y vea la etapa actual como detalles de contacto antes de cambiar el título, como se muestra en la siguiente figura.

Movimiento automático del escenario utilizando el complemento CRM de BPF

Paso 10

Después del paso 9, si actualiza su puesto de trabajo a Sri y guarda el registro, verá que la etapa pasa automáticamente al estado de vacunación, como se muestra en la siguiente figura .

Movimiento automático del escenario utilizando el complemento CRM de BPF

Nota

  1. Me concentré más en la parte lógica. Por lo tanto, solo se muestran la ejecución y otros métodos relacionados.
  2. Las restricciones basadas en roles y otra lógica personalizada para realizar otras operaciones y transacciones también se pueden escribir dentro del método de ejecución.
  3. Los bloques de excepción le permiten escribir excepciones generales y específicas, como excepciones no válidas.
  4. Debido a la restricción de tomar una captura de pantalla que contenga el código total en una sola imagen, hemos incluido una descripción general de la captura de pantalla del método en el paso 7 .

en conclusión

De esta manera, puede escribir un código de complemento de CRM que mueva automáticamente la etapa de BPF en función de sus requisitos comerciales específicos.

Enlace: https://www.c-sharpcorner.com/article/automatic-stage-movement-using-crm-plugin-in-bpf/

#crm #bpf

Movimiento De Escenario Automático Usando El Complemento CRM En BPF

BPFでCRMプラグインを使用した自動ステージ移動

一部のシナリオでは、サーバー側のコードに基づいてBPFステージを自動的に移動する必要があります。これは、CRMプラグインによって実現できます。例として、選択した連絡先レコードのタイトルフィールドを更新すると、BPFは自動的に次のステージに移動します。

ステップ1

必要な環境にログインし、フローに移動して、ビジネスプロセスフロー-ワクチン接種を選択し、BPFがアクティブかどうかを確認します。アクティブでない場合は、次の図に示すようにアクティブにします。

BPFのCRMプラグインを使用した自動ステージ移動

ステップ2

ステップ1の後、ビジネスプロセスフローを開き、次の図に示すように次のステップで使用する上記で選択したBPFを開いて、ビジネスプロセスフローの論理名を書き留めます。

BPFのCRMプラグインを使用した自動ステージ移動

ステップ3

ステップ2の後、役職フィールド変更の連絡先の更新メッセージの実行メソッドの下にあるプラグインコード[C#クラスライブラリ]に移動し、コードブロック内にロジックを次のように記述する必要があります。

public void Execute(IServiceProvider serviceProvider) {
    IPluginExecutionContext context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext));
    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory) serviceProvider.GetService(typeof(IOrganizationServiceFactory));
    IOrganizationService crmService = serviceFactory.CreateOrganizationService(null);
    try {
        string logicalNameOfBPF = "cr5bc_vaccination";
        if (context.MessageName.ToLower().Equals("update") && context.PrimaryEntityName.ToLower().Equals("contact")) {
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) {
                Entity entity = (Entity) context.InputParameters["Target"];
                if (entity.Contains("jobtitle") && entity["jobtitle"] != null) {
                    // logic here
                }
            }
        }
    } catch (InvalidPluginExecutionException ex) {
        throw ex;
    }
}

これを下の図に示します。

BPFのCRMプラグインを使用した自動ステージ移動

ステップ4

ステップ3の後、我々は開いていた選択された連絡先レコードに存在するアクティブBPFの詳細情報を取得する必要があり、我々は別の方法を記述し、これを取得し、で得た連絡先エンティティ渡して詳細情報を取得するには、このメソッドを呼び出すためにステップ2と使用してのCRM SDKメッセージに存在するRetrieveProcessInstancesRequestリクエストを作成し、これをRetrieveProcessInstancesResponseに渡して、BPFプロセスインスタンスのリストを取得し、以下のコードを使用して最初のインスタンスを選択できます。

public Entity GetActiveBPFDetails(Entity entity, IOrganizationService crmService) {
    Entity activeProcessInstance = null;
    RetrieveProcessInstancesRequest entityBPFsRequest = new RetrieveProcessInstancesRequest {
        EntityId = entity.Id,
            EntityLogicalName = entity.LogicalName
    };
    RetrieveProcessInstancesResponse entityBPFsResponse = (RetrieveProcessInstancesResponse) crmService.Execute(entityBPFsRequest);
    if (entityBPFsResponse.Processes != null && entityBPFsResponse.Processes.Entities != null) {
        activeProcessInstance = entityBPFsResponse.Processes.Entities[0];
    }
    return activeProcessInstance;
}

下図のように

ステップ5

ステップ4の後、別のメソッドを記述し、executeメソッド内で呼び出して、連絡先レコードで選択したBPFのすべてのステージの詳細を取得する必要があります。これにより、CRM SDKメッセージにあるRetrieveActivePathResponseを使用して、次のステージIDの詳細を抽出できます。以下のようなパラメータを渡す活動期ID、アクティブBPF ID、IOrganizationサービス抽出するint型と入力および出力パラメータとしてオブジェクトを現在のステージ位置を、コードの下に使用して、アクティブパス要求を取得します

public RetrieveActivePathResponse GetAllStagesOfSelectedBPF(Guid activeBPFId, Guid activeStageId, ref int currentStagePosition, IOrganizationService crmService) {
    // Retrieve the process stages in the active path of the current process instance
    RetrieveActivePathRequest pathReq = new RetrieveActivePathRequest {
        ProcessInstanceId = activeBPFId
    };
    RetrieveActivePathResponse pathResp = (RetrieveActivePathResponse) crmService.Execute(pathReq);
    for (int i = 0; i < pathResp.ProcessStages.Entities.Count; i++) {
        // Retrieve the active stage name and active stage position based on the activeStageId for the process instance
        if (pathResp.ProcessStages.Entities[i].Attributes["processstageid"].ToString() == activeStageId.ToString()) {
            currentStagePosition = i;
        }
    }
    return pathResp;
}

下図のように

BPFのCRMプラグインを使用した自動ステージ移動

ステップ6

ステップ5の後、メインメソッドからステップ4とステップ5で取得したメソッドを呼び出し、アクティブパス応答と現在のステージ位置に基づいてステージをループし、次のステージIDを取得して、次のステージをアクティブとして設定する必要があります。選択BPFインスタンスIDを持つ現在のBPFの物体を形成するとして次段のIDを渡すことによってactivestageidBPF IOrganizationサービスの更新方法BPFアクティブ段階で以下のコードを用いて次のステージに変更されますます

Entity activeProcessInstance = GetActiveBPFDetails(entity, crmService);
if (activeProcessInstance != null) {
    Guid activeBPFId = activeProcessInstance.Id; // Id of the active process instance, which will be used
    // Retrieve the active stage ID of in the active process instance
    Guid activeStageId = new Guid(activeProcessInstance.Attributes["processstageid"].ToString());
    int currentStagePosition = -1;
    RetrieveActivePathResponse pathResp = GetAllStagesOfSelectedBPF(activeBPFId, activeStageId, ref currentStagePosition, crmService);
    if (currentStagePosition > -1 && pathResp.ProcessStages != null && pathResp.ProcessStages.Entities != null && currentStagePosition + 1 < pathResp.ProcessStages.Entities.Count) {
        // Retrieve the stage ID of the next stage that you want to set as active
        Guid nextStageId = (Guid) pathResp.ProcessStages.Entities[currentStagePosition + 1].Attributes["processstageid"];
        // Set the next stage as the active stage
        Entity entBPF = new Entity(logicalNameOfBPF) {
            Id = activeBPFId
        };
        entBPF["activestageid"] = new EntityReference("processstage", nextStageId);
        crmService.Update(entBPF);
    }
}

下図のように。

BPFのCRMプラグインを使用した自動ステージ移動

ステップ7

ステップ6の後、最終的なコードは次のようになります

public void Execute(IServiceProvider serviceProvider) {
    IPluginExecutionContext context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext));
    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory) serviceProvider.GetService(typeof(IOrganizationServiceFactory));
    IOrganizationService crmService = serviceFactory.CreateOrganizationService(null);
    try {
        string logicalNameOfBPF = "cr5bc_vaccination";
        if (context.MessageName.ToLower().Equals("update") && context.PrimaryEntityName.ToLower().Equals("contact")) {
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) {
                Entity entity = (Entity) context.InputParameters["Target"];
                if (entity.Contains("jobtitle") && entity["jobtitle"] != null) {
                    Entity activeProcessInstance = GetActiveBPFDetails(entity, crmService);
                    if (activeProcessInstance != null) {
                        Guid activeBPFId = activeProcessInstance.Id; // Id of the active process instance, which will be used
                        // Retrieve the active stage ID of in the active process instance
                        Guid activeStageId = new Guid(activeProcessInstance.Attributes["processstageid"].ToString());
                        int currentStagePosition = -1;
                        RetrieveActivePathResponse pathResp = GetAllStagesOfSelectedBPF(activeBPFId, activeStageId, ref currentStagePosition, crmService);
                        if (currentStagePosition > -1 && pathResp.ProcessStages != null && pathResp.ProcessStages.Entities != null && currentStagePosition + 1 < pathResp.ProcessStages.Entities.Count) {
                            // Retrieve the stage ID of the next stage that you want to set as active
                            Guid nextStageId = (Guid) pathResp.ProcessStages.Entities[currentStagePosition + 1].Attributes["processstageid"];
                            // Set the next stage as the active stage
                            Entity entBPF = new Entity(logicalNameOfBPF) {
                                Id = activeBPFId
                            };
                            entBPF["activestageid"] = new EntityReference("processstage", nextStageId);
                            crmService.Update(entBPF);
                        }
                    }
                }
            }
        }
    } catch (InvalidPluginExecutionException ex) {
        throw ex;
    }
}
public Entity GetActiveBPFDetails(Entity entity, IOrganizationService crmService) {
    Entity activeProcessInstance = null;
    RetrieveProcessInstancesRequest entityBPFsRequest = new RetrieveProcessInstancesRequest {
        EntityId = entity.Id,
            EntityLogicalName = entity.LogicalName
    };
    RetrieveProcessInstancesResponse entityBPFsResponse = (RetrieveProcessInstancesResponse) crmService.Execute(entityBPFsRequest);
    if (entityBPFsResponse.Processes != null && entityBPFsResponse.Processes.Entities != null) {
        activeProcessInstance = entityBPFsResponse.Processes.Entities[0];
    }
    return activeProcessInstance;
}
public RetrieveActivePathResponse GetAllStagesOfSelectedBPF(Guid activeBPFId, Guid activeStageId, ref int currentStagePosition, IOrganizationService crmService) {
    // Retrieve the process stages in the active path of the current process instance
    RetrieveActivePathRequest pathReq = new RetrieveActivePathRequest {
        ProcessInstanceId = activeBPFId
    };
    RetrieveActivePathResponse pathResp = (RetrieveActivePathResponse) crmService.Execute(pathReq);
    for (int i = 0; i < pathResp.ProcessStages.Entities.Count; i++) {
        // Retrieve the active stage name and active stage position based on the activeStageId for the process instance
        if (pathResp.ProcessStages.Entities[i].Attributes["processstageid"].ToString() == activeStageId.ToString()) {
            currentStagePosition = i;
        }
    }
    return pathResp;
}

下図のように。

BPFのCRMプラグインを使用した自動ステージ移動

ステップ8

ステップ7の後、ビルド及びアセンブリに署名した後、プラグイン登録ツールを使用してこのアセンブリを登録した後、更新メッセージとの接触エンティティの更新ステップを作成し、上の属性フィルタリングjobtitleの上に手術前のようにモードと同期と示されているように作成/更新工程をクリック下の図では

BPFのCRMプラグインを使用した自動ステージ移動

ステップ9

ステップ8の後、次の図に示すように、タイトルを変更する前に、連絡先レコードに移動し、連絡先の詳細として現在のステージを確認します。

BPFのCRMプラグインを使用した自動ステージ移動

ステップ10

ステップ9の後、役職をSriに更新し、レコードを保存すると、次の図に示すように、自動的にステージがワクチン接種ステータスに移行するのがわかります。

BPFのCRMプラグインを使用した自動ステージ移動

ノート

  1. 私はロジックの部分にもっと集中しました。そのため、実行と他の関連するメソッドのみが示されました。
  2. ロールに基づく制限や、他の操作やトランザクションを実行するためのその他のカスタムロジックも、executeメソッド内に記述できます。
  3. 例外ブロックでは、無効な例外などの一般的な例外と特定の例外を記述できます。
  4. 単一の画像に合計コードを含むスクリーンショットを撮るという制約があるため、ステップ7のメソッドのスクリーンショットの概要を含めました。

結論

このようにして、特定のビジネス要件に基づいてBPFステージを自動的に移動するCRMプラグインコードを記述できます。

リンク: https://www.c-sharpcorner.com/article/automatic-stage-movement-using-crm-plugin-in-bpf/

#crm 

BPFでCRMプラグインを使用した自動ステージ移動

Microsoft Dynamics 365: Talk of the town in the Retail Business

#crm #Microsoft #webdev 

If you are the rising retailer ready to crush the world in the next few years Microsoft Dynamics 365 is that dynamic which you can not miss in the path.

In this blog, we are going to check out the story of a brand that has gained immense success where Microsoft Dynamics 365 have played a significant role. 

Let's go through why Microsoft 365 is vital for your retail business

  1. Enhancing day to day operations 
  2. Rendering Business Growth by delegating employees
  3. Providing amazing shopping experience
  4. Integrated call center capacity

In order to provide such benefits, the M365 has to overcome multiple challenges, for instance

  • Complicated Inventory Management
  • Omnichannel customized user experience
  • Meeting customer expectations
  • Keeping a competitive edge
  • Effective merchandising

To know more about how Dynamics 365 can help your business, check out our in-depth blog on Microsoft Dynamics 365 for Retail


 

A Business owners Guide on Microsoft Dynamics 365 for CEO

Are planning to build high-tech top-notch applications providing next-gen applications Microsoft Dynamics 365 could be the right solution that you are looking for!

Customer satisfaction and better profits are the primary objectives of any business owner regardless of the niche. Microsoft Dynamics 365 is the one-stop solution when it comes to building strong relationships with your clientele and making precise business decisions forecasting future trends.

In this blog, we will get an overview of how Microsoft Dynamics can benefit your business through various aspects,

  • Microsoft Dynamics 365 Sales
  • Dynamic Marketing
  • Extensive Operations
  • Objective oriented to Business central activities

Apart from these Microsoft Dynamics 365 is specially designed for breaking the conventional financial management patterns and introducing brand new ways to reach out to your potential customer base. To know more about the benefits of Microsoft Dynamics 365 checkout the original in-depth blog curated by our experts!

Microsoft Dynamics 365 for CEO
#Microsoft #crm #tech 
 

Service CRM

1636711108

CRM Application and Software Development Company

What is CRM Application

CRM stands for Customer Relationship Management and is a business process that focuses on customer interactions, starting from marketing and sales and ending with service and support. When we talk about CRM Applications we will usually refer to Sales Force Automation or simply Sales Automation. It is basically a set of applications that deliver outstanding customer service by automating and simplifying every step related to their sales process.

CRM Software Market Overview

This report studies the global CRM software market, analyzes and researches the CRM software development status and forecast in United States, EU, Japan, China, India and Southeast Asia.

Benefits of CRM Software

Clients using online CRM software can streamline and have better control over the customer experience by checking the current state of any given issue and enabling customer-centric team members to respond quickly and address the issue at hand. Employees can reach out to a customer in a customized manner using web chat, mobile app, email, social media platforms, or any other channel the customer prefers. Employees can also view a customer's history in real-time, and they can further improve their responsiveness by choosing the most appropriate action in a timely manner.

Call for more information-+91-9105730500

Visit: https://servicecrm.co.in/

 #crm  #customapp  #software  #mobileapp 


 

CRM Application and Software Development Company

DynamicsCRMをPostmanツール環境に接続する

特定のシナリオでは、Dynamics CRM WebAPI要求をすばやくテストする必要があります。PostmanToolを活用してこれを実現できます。例として、ここではPostmanツールを使用して環境を作成する方法を探ります。

ステップ1

次の図に示すように、Postman Toolを開き、[環境 ]をクリックしてから、[+]ボタンクリックし、DynamicsCRMという名前を付けます

DynamicsCRMをPostmanツール環境に接続する

ステップ2

手順1の Dynamics CRM Web API URLが必要になるため、既存のCRM環境を開き、[設定]-> [カスタマイズ]-> [開発者リソース]に移動し、DynamicsCRM環境のUri部分をサービスルートURLからコピーして削除する必要があります。次の図に示すように、/ APIから取得します。

DynamicsCRMをPostmanツール環境に接続する

ステップ3

手順2の後、Postmanツール環境に移動し、以下のような変数を追加します。

変数

url

初期値には、ステップ2で抽出したAPI値を入力します

初期値

https://orgfea8bbba.api.crm.dynamics.com

下の図に示すように。

DynamicsCRMをPostmanツール環境に接続する

ステップ4

後はステップ3、我々は、Dynamics CRMの環境とオープンAzureのActive Directoryの[アプリケーションを使用してportal.azure.comを通じてAzureのポータルに移動作成したアプリケーションを選択して、我々が以前に登録されたアプリのためのアプリケーション/クライアントIDをコピーする必要がありますポスト示すように、下の図で。

DynamicsCRMをPostmanツール環境に接続する

ステップ5

手順4の後、Postmanツール環境に移動し、以下のような変数を追加します。

変数

clientid

初期値には、ステップ4で抽出したAPI値を入力します

初期値

01ae7ef3-1658-4daa-80a2-f13dc1234567

下の図に示すように。

DynamicsCRMをPostmanツール環境に接続する

ステップ6

手順5の Dynamics CRM Web API URLが必要になるため、既存のCRM環境を開き、[設定]-> [カスタマイズ]-> [開発者リソース]に移動し、DynamicsCRM環境のバージョン番号をサービスルートURLからコピーする必要があり ます。下の図に示されています。

DynamicsCRMをPostmanツール環境に接続する

ステップ7

手順6の後、Postmanツール環境に移動し、以下のような変数を追加します。

変数

version

初期値には、手順5で抽出したAPI値を入力します

初期値

9.2

下の図に示すように。

DynamicsCRMをPostmanツール環境に接続する

ステップ8

手順7の後、Postmanツール環境に移動し、以下のような変数を追加します。

変数

webapiurl

初期値

{{url}}/api/data/v{{version}}/

下の図に示すように。

DynamicsCRMをPostmanツール環境に接続する

ステップ9

手順8の後、Postmanツール環境に移動し、以下のような変数を追加します。

変数

callback

ベーシック

コピー

初期値

https://callbackurl

ベーシック

コピー

下の図に示すように。

DynamicsCRMをPostmanツール環境に接続する

ステップ10

手順9の後、Postmanツール環境に移動し、以下のような変数を追加します。

変数

authurl

ベーシック

コピー

初期値

https://login.microsoftonline.com/common/oauth2/authorize?resource={{url}}

ベーシック

コピー

次に、下の図に示すように、[保存]ボタンをクリックします 。

DynamicsCRMをPostmanツール環境に接続する

ステップ11

手順10の後、Get Requestを考慮して作成された環境をテストし、Dynamics CRM として[Environment]を選択し、次のようにURIを指定する必要があります。

{{webapiurl}}WhoAmI

ベーシック

コピー

 下の図に示すように。

DynamicsCRMをPostmanツール環境に接続する

ステップ12

手順11の [承認]タブを選択し、[タイプ]を[ OAuth2.0]として選択し、承認データを[リクエストヘッダーに追加]をクリックし て、次の図に示すように[新しいアクセストークンの取得]をクリックします。

DynamicsCRMをPostmanツール環境に接続する

ステップ13

ステップ12の後、新しいウィンドウがポップアップします。次の図に示すように、環境を介して接続するときに、初めてCRMユーザー名とパスワードを入力します。

DynamicsCRMをPostmanツール環境に接続する

ステップ14

手順13のすべてが構成どおりに正常に機能する場合 は、次の図に示すように、[トークンの管理]ウィンドウで[トークンの使用]をクリックする必要があります。

DynamicsCRMをPostmanツール環境に接続する

ステップ15

手順14の [リクエストの送信]をクリック し、下の図に示すように、ログインしたCRMユーザーのユーザーIDの詳細とステータスが200の[本文]セクションを確認します

DynamicsCRMをPostmanツール環境に接続する

  1. ここからPostmanツールをダウンロードします[この例では、DesktopPostmanツールを使用しました]
  2. Dynamics365オンライントライアルインスタンスはこちら
  3. Azure ActiveDirectory管理センターは こちら
  4. 401の不正エラーが発生した場合は、Azureポータルでアプリを開き、マニフェストに移動して、次の図に示すようにoauth2AllowImplicitFlowをtrueとして指定します

    DynamicsCRMをPostmanツール環境に接続する
     
  5. 手順13で指定されているように、ログイン中に無効なトークンエラーが発生した場合は、Post Man Tool Environmentに移動し、コールバックURL値https:// callbackurlをコピーして、 Azure Active Directoryを開き、作成されたアプリを選択し、[アプリ]で[認証]に移動します。次の図に示すように、[リダイレクトURI]の下に、値https:// callbackurlの新しいエントリを追加し、保存します。

    DynamicsCRMをPostmanツール環境に接続する

結論

このようにして、Postmanツール環境を使用してDynamics CRM WebAPIリクエストを簡単にテストできます。

リンク: https://www.c-sharpcorner.com/

#crm #webapi #dynamic 

DynamicsCRMをPostmanツール環境に接続する
Chloe  Butler

Chloe Butler

1630926000

Project Management CRM For Small Businesses and Freelancers

CRM project management with basic features like invoicing, customer management, quote preparation, project management, payment gateway integration. This will make it easier for small businesses and freelancers to manage.

#crm 

Project Management CRM For Small Businesses and Freelancers
Julie Murray

Julie Murray

1629096067

Hire Best CRM Specialist |Top CRM Consulting Services Companies 2022

"Confused about what CRM is, and where to hire a CRM Specialist? We'll help clear that up for you.

Companies with customer engagement goals need CRM professionals to feed data into the system to improve continually continuously. The more information captured about client behaviours, the better the company is to target sales campaigns and product promotions. 

CRM is the most sophisticated marketing technology available today. It can be used for just about any B2B business, from customer service and sales to marketing automation. It's also a big part of cloud computing. CRM systems are web-based, which means they can be accessed by just about anyone with an internet connection. This makes it a very flexible tool since you can use it anywhere and don't have to pay for software or servers to install on-site anymore. It's not enough for sales staff to rely on gut feelings when trying to figure out what its customers want or need—today's competitive world requires empirical analysis. 

This list is continuously updated. Please comment below if you know any other companies:

Let's take a Look here are the Top 10 CRM Consulting Services Companies:

  1. Auxano Global Services
  2. IBIS Systems
  3. 42mate
  4. MSys Technologies
  5. Habanero
  6. Red Rock Tech
  7. Sphinx Solutions
  8. Muli Mobile
  9. YND
  10. Truespire

1.Auxano Global Services

Auxano Global Services works with both B2B and B2C companies for over 8 years. Our sales intelligence pros help improve conversion and retention rate, which leads to substantial revenue increase. Our CRM consulting services will help you improve lead conversions, unify customer data, and boost sales rates. We help businesses select and implement a CRM (customer relationship management) solution for their particular industry. A properly set up CRM helps transform the way their business works and how they interact with clients.

2.IBIS Systems

Ibis OU offer outsourcing services for Telecommunications, Security and Software Development projects of any scale. Our team of skilled, certified and experienced professionals maintain “can do” approach to the tasks of any level of complexity. We do not believe in bureaucratic approach and try to keep all things as simple as possible for the comfort of our customers, with short response times and efficient solutions. However, we do keep all paperwork in order.

3. 42Mate

We are an Argentinian company specialized in building and providing modern Web Solutions. We have a strong expertice and knowledge in CMS, Portals, Social Networking, Ecommerce, Data Integration and Web Infrastructure. With an operational base located in Argentina we are providing web sites to USA and Argentina. Our experience and passion for the internet is what makes our products so good and clients so happy. Look around and do not hesitate to contact us if you think that we should work together.

More Results….

#crm  #crmexperts  #crmspecialists  #web #web-development #webdev #webdevelopers #topcrmspecialists  #hirecrmspecialists  #crmspecialistsforhire 

Hire Best CRM Specialist |Top CRM Consulting Services Companies 2022
Ananya Gupta

Ananya Gupta

1627027337

How To Boost Your Business With Salesforce?

Small to medium organizations can advantage substantially from being prepared and integrating their personnel during a decent, close style, ensuring most are informed and on an equivalent page, not best just a day, but up to the minute.

Communication within the enterprise additionally to conveyances with existing and skills clients is paramount, and having a clean and attainable manner to preserve the music of all and alternate or edit on the go may be a need lately. A successful enterprise is often ready to manipulate all communications, and therefore the usage of Salesforce to assist decide your needs will position your enterprise beforehand of the half learn more through salesforce course.

Customer relationship management (CRM) may be a got to for groups; that’s a longtime fact. You need to be ready to hear your full force on creativity and sales and depart the mundane components of electronic message control, database creation, and updating, and fundamental software program control to gradual you down. Alternatively, having all this integrated right into a software base inclusive of, Salesforce can streamline your agency’s communications within the office, additionally to your connections with clients and clients. the entire communications package could also be simply sorted by using the digital Salesforce representative, saving you an excellent deal of money, as you would possibly not make the high-priced errors.

The advantages inherent mild as you see your commercial enterprise start to talk extra effectively, beneath one software package. The consultant can help to choose which package deal is ok for your business, and the way you would like to affect communications. Perhaps the simplest circumstance for your commercial enterprise is to require it to the cloud, and with the CRM programs available.

You’ll be capable of making the foremost of getting your email and files available to sales personnel and clients anywhere they’ll be, goodbye as they need getting an internet plug-in. files are immediately available and you’re capable of seeing and make modifications which could be then disseminated for the duration of the cloud, proper to your business associates, directly. No greater worrying that somebody might be overlooked because something was given misplaced within the mail.

The communications software best designed for you’ll be an undertaking to get the primary time. Wasted time in strolling about trying to realize this will cause misplaced cash. With a Salesforce consultant at your disposal, you’re ready to get advice on the packages that are an excellent ideal to your commercial enterprise version.

Your income representatives and managers are going to be fully included in your communications and consumer relations instantly, ready to deal with any request generated by using the purchaser and immediately documenting the communique for motion or garage. Without clients, there is no commercial enterprise, so it’s vital as how to speak with them each speedy and properly and to possess anybody who wishes to get on the board inside the communicable distance, even surely.

The quality practices come from having the proper information, and getting a Salesforce service to installation the standard patron members of the family management software program integration in your commercial enterprise will confirm you get the boost you would like to return out on top.

#salesforce online training #salesforce online course #salesforce training in noida #salesforce training in delhi #salesforce training #crm

How To Boost Your Business With Salesforce?