SlideShare uma empresa Scribd logo
1 de 51
Leveraging Geographic
  Data in SugarCRM
About the Speaker
                        Asa
                        Kusuma
• Intern at Milsoft Utility Solutions
• Sophomore at Abilene Christian University
• Twitter: asakusuma
• www.asakusuma.com
Geographic Data:
What’s the Big Deal?
photo by gerlos




Know Your Customers
Reaching the End Goal

New     New CRM           Create
Data    Capabilities      Visuals



Old      Filter         Insight into
Data     Data          Customer Base
The End Goal Expanded
                            photo by eBeam



•   Target customers

•   Streamline analysis

•   Get the “Big Picture”

•   Look good in meetings

•   Capitalize on data
photo by eBeam




Concept is simple
photo by Dizzy Girl




Implementation is Messy
The Case Study
About Milsoft
•   We make software for
    utility companies

•   Headquarters in
    Abilene, TX

•   Over 1,000 customers,
    US + International


                            photo by philipbouchard
Our needs at Milsoft
• Send geographic-sensitive data to customers
 • Marketing
 • Workshops
• Inform decision makers
• Streamline meetings
• Do it all in SugarCRM
Bad
Good
The Old Way
1. Export SugarCRM data
2. Cleanup data
3. Import data into 3rd party software
4. Filter data or generate visual
5. Cross fingers
6. Import data back into SugarCRM
The New Way

1. Filter data or create visual in SugarCRM
2. Laugh at people doing it the old way
Steps to Success
1. Extend your data
  • Add coordinates to Accounts
2. Create data filtering capabilities
  • Add geographic filters for Reports
3. Create visuals
  • Link your Accounts with Google Maps
  • Link your Reports with Google Maps
Solutions vs. Hacks
SIMPLICITY
Blend In
Guidelines

• Permanent, scalable solutions, not hacks
• If it’s not simple, it won’t be used
• Insert new features into existing workflow
• Complement and extend existing features
Checkout the Code
asakusuma.com/sugarcon
Step 1:
Add Geographic Data
• Get a Google Maps API Key
• Create custom fields
• Create script
 • Connect to database
 • Add coordinates to each account
• Run script (takes a long time)
Create Custom Fields
Admin > Studio > Accounts > Fields > Add Field

 • Add fields to store latitude & longitude
 • Datatype: Decimal
 • Uncheck “Required Field”
 • Check “Reportable”
 • Populate fields using address + Google Maps
Create Script
• Connect to SugarCRM database
 • Invoke config.php (don’t hardcode)
• Retrieve and loop through Accounts
 • Send address to Google Maps
 • Receive Latitude and Longitude
 • Record coordinates
Get coordinates


Save coordinates
Now What?

• Accounts with an address have coordinates
• Do stuff with the coordinates
 • Filter Accounts with Reports
 • Put your Accounts on a map
 • Put your filtered Accounts on a map
Filtering in Reports
• Select Accounts within a certain distance of
  a postal code
• Add functionality to Reports
Code the Filter

1. Create the label string
2. Associate the label string with a function
3. Create the function
4. Add the extra text inputs
5. Force a JOIN with accounts_cstm
Create the String Label




modules/Reports/language/en_us.lang.php
Associate Label with Function




      modules/Reports/templates/
    templates_modules_defs_js.php
Create the Function



                           Get postal code coordinates
                                          Filter query


include/generic/SugarWidgets/SugarWidgetReportField.php
               (queryFilterWithin_Radius())
Add Extra Text Inputs




                                  Add inputs




  include/javascript/reports.js
Add Extra Text Inputs (cont.)
                                  2 new arguments

                             Set default input size

                                Add label




include/javascript/reports.js (addFilterInputText())
Force the JOIN
                          Link to accounts_cstm




• Custom fields are stored in accounts_cstm
• JOIN combines accounts and accounts_cstm
modules/Reports/Reports.php (create_from())
Radius
     Distance   Radius Center
                (Postal Code)



The Result
Make a Simple Map
Code the Map

1. Connect to the database
2. Pull Account coordinates
3. Pass data from PHP to JavaScript
4. Plot points on the Google Map
Setup the Map



                   Connect to database




      Import jQuery and Google Map stuff

map.php (in the root directory)
Display the Map


                     Echo out data as
                     a JavaScript array


                   Plot points on the map



map.php (in the root directory)
The Result
nifty link




Put it all together
Data Path
          Report ID
Report                           Map


                      Report            Data
                        ID             Points
         Query

                               Database
Create Query Retrieval Function
                                 Check for
                            Lat & Long columns


                          Add Lat & Long columns




                        Build Query

                   Return Query
modules/Reports/Reports.php (execute_query())
Link From Report to Map




                    Create link

modules/Reports/Reports.php (execute_query())
Prepare the Data for the Map




                              Receive Report ID

Create a Report
                    Produce MySQL query

              modules/Reports/map.php
Display the Map

                 Package account
                    as a point



                 Initialize Map

                  Plot data
                   on Map

modules/Reports/map.php
click here...




Put it all together
The Final Result
Try This At Home
• Protect your data
• Work out the kinks
 • Issues with editing Reports
 • Issues with multi-module Reports
• Code Snippets at:
  http://www.asakusuma.com/sugarcon
• Be the envy of your next meeting
photo by gerlos




Know Your Customers

Mais conteúdo relacionado

Mais procurados

Transforming AutoCAD Data to Smallworld with FME
Transforming AutoCAD Data to Smallworld with FMETransforming AutoCAD Data to Smallworld with FME
Transforming AutoCAD Data to Smallworld with FME
Safe Software
 
SAP BO ONLINE TRAINING
SAP BO ONLINE TRAININGSAP BO ONLINE TRAINING
SAP BO ONLINE TRAINING
Anusha GOT
 
Dsm Presentation
Dsm PresentationDsm Presentation
Dsm Presentation
richoe
 

Mais procurados (20)

Producing Standardized Data Using a Master FME Workspace
Producing Standardized Data Using a Master FME WorkspaceProducing Standardized Data Using a Master FME Workspace
Producing Standardized Data Using a Master FME Workspace
 
Visualizing Data in a Web Browser with Cesium ion & FME
Visualizing Data in a Web Browser with Cesium ion & FMEVisualizing Data in a Web Browser with Cesium ion & FME
Visualizing Data in a Web Browser with Cesium ion & FME
 
Karnataka Geospatial Experience FME World Tour 2017 India
Karnataka Geospatial Experience FME World Tour 2017 IndiaKarnataka Geospatial Experience FME World Tour 2017 India
Karnataka Geospatial Experience FME World Tour 2017 India
 
Tools for Visualizing Geospatial Data in a Web Browser
Tools for Visualizing Geospatial Data in a Web BrowserTools for Visualizing Geospatial Data in a Web Browser
Tools for Visualizing Geospatial Data in a Web Browser
 
Eugene Wabomnor Bi Portfolio
Eugene Wabomnor Bi PortfolioEugene Wabomnor Bi Portfolio
Eugene Wabomnor Bi Portfolio
 
5 Tips for Integrating CAD Data with Esri ArcGIS
5 Tips for Integrating CAD Data with Esri ArcGIS5 Tips for Integrating CAD Data with Esri ArcGIS
5 Tips for Integrating CAD Data with Esri ArcGIS
 
Weather data meets ibm cloud. part 3 transformation and aggregation of weat...
Weather data meets ibm cloud. part 3   transformation and aggregation of weat...Weather data meets ibm cloud. part 3   transformation and aggregation of weat...
Weather data meets ibm cloud. part 3 transformation and aggregation of weat...
 
From Excel hero to Power BI champion
From Excel hero to Power BI championFrom Excel hero to Power BI champion
From Excel hero to Power BI champion
 
Your Data and FME
Your Data and FMEYour Data and FME
Your Data and FME
 
Transforming AutoCAD Data to Smallworld with FME
Transforming AutoCAD Data to Smallworld with FMETransforming AutoCAD Data to Smallworld with FME
Transforming AutoCAD Data to Smallworld with FME
 
SAP BO ONLINE TRAINING
SAP BO ONLINE TRAININGSAP BO ONLINE TRAINING
SAP BO ONLINE TRAINING
 
MicroStation DGN: How to Integrate CAD and GIS
MicroStation DGN: How to Integrate CAD and GISMicroStation DGN: How to Integrate CAD and GIS
MicroStation DGN: How to Integrate CAD and GIS
 
Power View and the Cube
Power View and the CubePower View and the Cube
Power View and the Cube
 
How to Create a ArcGIS Story Map Final Presentation
How to Create a ArcGIS Story Map Final Presentation How to Create a ArcGIS Story Map Final Presentation
How to Create a ArcGIS Story Map Final Presentation
 
Dsm Presentation
Dsm PresentationDsm Presentation
Dsm Presentation
 
Processing Building Plans Faster and More Thoroughly using FME Server
Processing Building Plans Faster and More Thoroughly using FME ServerProcessing Building Plans Faster and More Thoroughly using FME Server
Processing Building Plans Faster and More Thoroughly using FME Server
 
Integrating Web and Business Data
Integrating Web and Business DataIntegrating Web and Business Data
Integrating Web and Business Data
 
Deep Dive into FME Desktop 2018
Deep Dive into FME Desktop 2018Deep Dive into FME Desktop 2018
Deep Dive into FME Desktop 2018
 
Automating and Scheduling Data Usage and Reporting
Automating and Scheduling Data Usage and Reporting Automating and Scheduling Data Usage and Reporting
Automating and Scheduling Data Usage and Reporting
 
How to create an InfoCube
How to create an InfoCubeHow to create an InfoCube
How to create an InfoCube
 

Semelhante a Leveraging Geographic Data in SugarCRM

Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...
Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...
Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...
nimak
 
SAP BO ONLINE TRAINING
SAP BO ONLINE TRAININGSAP BO ONLINE TRAINING
SAP BO ONLINE TRAINING
Madhukar Reddy
 
SPSRED - BCS, REST ans Subscriptions
SPSRED - BCS, REST ans SubscriptionsSPSRED - BCS, REST ans Subscriptions
SPSRED - BCS, REST ans Subscriptions
Chris Givens
 

Semelhante a Leveraging Geographic Data in SugarCRM (20)

PowerApps community call-March 2019
PowerApps community call-March 2019PowerApps community call-March 2019
PowerApps community call-March 2019
 
Serverless ML Workshop with Hopsworks at PyData Seattle
Serverless ML Workshop with Hopsworks at PyData SeattleServerless ML Workshop with Hopsworks at PyData Seattle
Serverless ML Workshop with Hopsworks at PyData Seattle
 
Ibm cognos-build-data-marts-reports-and-dashboards
Ibm cognos-build-data-marts-reports-and-dashboardsIbm cognos-build-data-marts-reports-and-dashboards
Ibm cognos-build-data-marts-reports-and-dashboards
 
PBS&J Program Control Services
PBS&J Program Control ServicesPBS&J Program Control Services
PBS&J Program Control Services
 
From Data to Maps to Docs: Turn Days into Minutes with Automated Integration
From Data to Maps to Docs: Turn Days into Minutes with Automated IntegrationFrom Data to Maps to Docs: Turn Days into Minutes with Automated Integration
From Data to Maps to Docs: Turn Days into Minutes with Automated Integration
 
Applying linear regression and predictive analytics
Applying linear regression and predictive analyticsApplying linear regression and predictive analytics
Applying linear regression and predictive analytics
 
Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...
Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...
Cross-Tier Application and Data Partitioning of Web Applications for Hybrid C...
 
SAP BO ONLINE TRAINING
SAP BO ONLINE TRAININGSAP BO ONLINE TRAINING
SAP BO ONLINE TRAINING
 
MSBI Online Training in Hyderabad
MSBI Online Training in HyderabadMSBI Online Training in Hyderabad
MSBI Online Training in Hyderabad
 
MSBI Online Training in India
MSBI Online Training in IndiaMSBI Online Training in India
MSBI Online Training in India
 
MSBI Online Training
MSBI Online Training MSBI Online Training
MSBI Online Training
 
Xamarin microsoft graph
Xamarin microsoft graphXamarin microsoft graph
Xamarin microsoft graph
 
Why and How SmartNews uses SaaS?
Why and How SmartNews uses SaaS?Why and How SmartNews uses SaaS?
Why and How SmartNews uses SaaS?
 
rough-work.pptx
rough-work.pptxrough-work.pptx
rough-work.pptx
 
Cherokee nation 2 day AIAD & DIAD - App in a day and Dashboard in day
Cherokee nation 2 day AIAD & DIAD - App in a day and Dashboard in dayCherokee nation 2 day AIAD & DIAD - App in a day and Dashboard in day
Cherokee nation 2 day AIAD & DIAD - App in a day and Dashboard in day
 
Big Data Day LA 2015 - Scalable and High-Performance Analytics with Distribut...
Big Data Day LA 2015 - Scalable and High-Performance Analytics with Distribut...Big Data Day LA 2015 - Scalable and High-Performance Analytics with Distribut...
Big Data Day LA 2015 - Scalable and High-Performance Analytics with Distribut...
 
SPSRED - BCS, REST ans Subscriptions
SPSRED - BCS, REST ans SubscriptionsSPSRED - BCS, REST ans Subscriptions
SPSRED - BCS, REST ans Subscriptions
 
Harnessing Configuration for Web GIS Application Development
Harnessing Configuration for Web GIS Application DevelopmentHarnessing Configuration for Web GIS Application Development
Harnessing Configuration for Web GIS Application Development
 
2009 GAAC Summit Kristoffer Ewald
2009 GAAC Summit Kristoffer Ewald2009 GAAC Summit Kristoffer Ewald
2009 GAAC Summit Kristoffer Ewald
 
I Love APIs Europe 2015: Developer Sessions
I Love APIs Europe 2015: Developer SessionsI Love APIs Europe 2015: Developer Sessions
I Love APIs Europe 2015: Developer Sessions
 

Último

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 

Leveraging Geographic Data in SugarCRM

  • 1. Leveraging Geographic Data in SugarCRM
  • 2. About the Speaker Asa Kusuma • Intern at Milsoft Utility Solutions • Sophomore at Abilene Christian University • Twitter: asakusuma • www.asakusuma.com
  • 4. photo by gerlos Know Your Customers
  • 5. Reaching the End Goal New New CRM Create Data Capabilities Visuals Old Filter Insight into Data Data Customer Base
  • 6. The End Goal Expanded photo by eBeam • Target customers • Streamline analysis • Get the “Big Picture” • Look good in meetings • Capitalize on data
  • 8. photo by Dizzy Girl Implementation is Messy
  • 10. About Milsoft • We make software for utility companies • Headquarters in Abilene, TX • Over 1,000 customers, US + International photo by philipbouchard
  • 11. Our needs at Milsoft • Send geographic-sensitive data to customers • Marketing • Workshops • Inform decision makers • Streamline meetings • Do it all in SugarCRM
  • 12. Bad
  • 13. Good
  • 14. The Old Way 1. Export SugarCRM data 2. Cleanup data 3. Import data into 3rd party software 4. Filter data or generate visual 5. Cross fingers 6. Import data back into SugarCRM
  • 15. The New Way 1. Filter data or create visual in SugarCRM 2. Laugh at people doing it the old way
  • 16. Steps to Success 1. Extend your data • Add coordinates to Accounts 2. Create data filtering capabilities • Add geographic filters for Reports 3. Create visuals • Link your Accounts with Google Maps • Link your Reports with Google Maps
  • 20. Guidelines • Permanent, scalable solutions, not hacks • If it’s not simple, it won’t be used • Insert new features into existing workflow • Complement and extend existing features
  • 22. Step 1: Add Geographic Data • Get a Google Maps API Key • Create custom fields • Create script • Connect to database • Add coordinates to each account • Run script (takes a long time)
  • 23. Create Custom Fields Admin > Studio > Accounts > Fields > Add Field • Add fields to store latitude & longitude • Datatype: Decimal • Uncheck “Required Field” • Check “Reportable” • Populate fields using address + Google Maps
  • 24.
  • 25. Create Script • Connect to SugarCRM database • Invoke config.php (don’t hardcode) • Retrieve and loop through Accounts • Send address to Google Maps • Receive Latitude and Longitude • Record coordinates
  • 27. Now What? • Accounts with an address have coordinates • Do stuff with the coordinates • Filter Accounts with Reports • Put your Accounts on a map • Put your filtered Accounts on a map
  • 28. Filtering in Reports • Select Accounts within a certain distance of a postal code • Add functionality to Reports
  • 29. Code the Filter 1. Create the label string 2. Associate the label string with a function 3. Create the function 4. Add the extra text inputs 5. Force a JOIN with accounts_cstm
  • 30. Create the String Label modules/Reports/language/en_us.lang.php
  • 31. Associate Label with Function modules/Reports/templates/ templates_modules_defs_js.php
  • 32. Create the Function Get postal code coordinates Filter query include/generic/SugarWidgets/SugarWidgetReportField.php (queryFilterWithin_Radius())
  • 33. Add Extra Text Inputs Add inputs include/javascript/reports.js
  • 34. Add Extra Text Inputs (cont.) 2 new arguments Set default input size Add label include/javascript/reports.js (addFilterInputText())
  • 35. Force the JOIN Link to accounts_cstm • Custom fields are stored in accounts_cstm • JOIN combines accounts and accounts_cstm modules/Reports/Reports.php (create_from())
  • 36. Radius Distance Radius Center (Postal Code) The Result
  • 38. Code the Map 1. Connect to the database 2. Pull Account coordinates 3. Pass data from PHP to JavaScript 4. Plot points on the Google Map
  • 39. Setup the Map Connect to database Import jQuery and Google Map stuff map.php (in the root directory)
  • 40. Display the Map Echo out data as a JavaScript array Plot points on the map map.php (in the root directory)
  • 42. nifty link Put it all together
  • 43. Data Path Report ID Report Map Report Data ID Points Query Database
  • 44. Create Query Retrieval Function Check for Lat & Long columns Add Lat & Long columns Build Query Return Query modules/Reports/Reports.php (execute_query())
  • 45. Link From Report to Map Create link modules/Reports/Reports.php (execute_query())
  • 46. Prepare the Data for the Map Receive Report ID Create a Report Produce MySQL query modules/Reports/map.php
  • 47. Display the Map Package account as a point Initialize Map Plot data on Map modules/Reports/map.php
  • 48. click here... Put it all together
  • 50. Try This At Home • Protect your data • Work out the kinks • Issues with editing Reports • Issues with multi-module Reports • Code Snippets at: http://www.asakusuma.com/sugarcon • Be the envy of your next meeting
  • 51. photo by gerlos Know Your Customers

Notas do Editor

  1. milsoft computer science major open source web development and clean web design
  2. If it’s not simple, users won’t use