{"id":35782,"date":"2021-08-06T15:15:04","date_gmt":"2021-08-06T12:15:04","guid":{"rendered":"https:\/\/orbitsoft.com\/blog\/?p=35782"},"modified":"2023-07-03T12:31:05","modified_gmt":"2023-07-03T09:31:05","slug":"symfony-why-we-chose-this-framework-for-the-posiflora-accounting-system","status":"publish","type":"post","link":"https:\/\/orbitsoft.com\/blog\/symfony-why-we-chose-this-framework-for-the-posiflora-accounting-system\/","title":{"rendered":"Symfony"},"content":{"rendered":"<div class=\"wp-block-lazyblock-case lazyblock-case-Z18VBYR\"><div class=\"styled-block\">\n  <div class=\"styled-block__main\">\n          <h3 class=\"styled-block__title\">\n        In brief      <\/h3>\n        <ul class=\"case__list\">\n            \n                    <li class=\"case__item\">\n              \n          <span class=\"case__order\">01<\/span>\n          <div class=\"case__body\">\n            <div class=\"case__title\">\n              <span>Kind of tool<\/span>\n            <\/div>\n            <p>Symfony &#8211; PHP framework<\/p>          <\/div>\n        <\/li>\n            \n                    <li class=\"case__item\">\n              \n          <span class=\"case__order\">02<\/span>\n          <div class=\"case__body\">\n            <div class=\"case__title\">\n              <span>Where we\u00a0use it<\/span>\n            <\/div>\n            <p>On the server side of the accounting system for floristry business PosiFlora<\/p>          <\/div>\n        <\/li>\n            \n                    <li class=\"case__item\">\n              \n          <span class=\"case__order\">03<\/span>\n          <div class=\"case__body\">\n            <div class=\"case__title\">\n              <span>Reason to use Symfony<\/span>\n            <\/div>\n            <p>Symfony creates new components quickly, and doesn\u2019t burden the system<\/p>\n<p>Symfony helps programmers re-use code and make fewer errors<\/p>\n<p>Symfony organizes the environment around an easy-to-use code base<\/p>          <\/div>\n        <\/li>\n            \n                    <li class=\"case__item case__item_marked\">\n              \n          <span class=\"case__order\">04<\/span>\n          <div class=\"case__body\">\n            <div class=\"case__title\">\n              <span>Results<\/span>\n            <\/div>\n            <p>We launched the app in 9 months<\/p>\n<p>8,500 users by June 2021<\/p>\n<p>Supports nearly every type of device<\/p>\n<p>The application is compatible with all popular online cash registers: Evotor, ATOL, and Shtrih-M<\/p>\n<p>Only 2 developers are needed for development and support<\/p>          <\/div>\n        <\/li>\n          <\/ul>\n  <\/div>\n  <\/div><\/div>\n\n<div class=\"wp-block-lazyblock-heading lazyblock-heading-Z2qBNY8\"><h2 class=\"article__h\">The PosiFlora app places orders, processes payments, and stores customer data <\/h2><\/div>\n\n\n<p>PosiFlora is a stock control and sales development system for florists. It\u2019s used by online delivery shops, supermarkets, and small retail shops. As of June 2021, PosiFlora is used by 8,500 customers. OrbitSoft developed this total solution from scratch.<\/p>\n\n\n\n<p>With the app, floral managers can:<\/p>\n\n\n\n<ul>\n<li>Enter a customer&#8217;s phone number, name and address, and place orders<\/li>\n\n\n\n<li>Accept cash and non-cash payments<\/li>\n\n\n\n<li>Print out receipts<\/li>\n\n\n\n<li>Store order information in a database<\/li>\n\n\n\n<li>Keep track of stock levels<\/li>\n\n\n\n<li>Write off flowers if they are spoiled or wilted<\/li>\n\n\n\n<li>Assign shifts to employees<\/li>\n\n\n\n<li>Analyze customer activity<\/li>\n\n\n\n<li>Plan ongoing and future development for the business<\/li>\n<\/ul>\n\n\n\n<p>To make it easy for businesses to work with PosiFlora, the system works on any device: executives use computers, managers use tablets, and phones are used by florists to place orders and by couriers for deliveries.<\/p>\n\n\n<div class=\"wp-block-lazyblock-heading lazyblock-heading-Zh2tSk\"><h2 class=\"article__h\">What Symfony offers you <\/h2><\/div>\n\n\n<p>In the course of development we decided to use the popular Symfony framework. Following are the advantages it brings to the service\u2026<\/p>\n\n\n\n<p><strong>Creates new components quickly and doesn&#8217;t bog down the system. <\/strong>Developers don\u2019t need to write a lot of code to connect new features to the system. The Symfony framework evolution is perfomed by centralized components creation and new versions, and not by forking.<\/p>\n\n\n\n<p>Example of installing and configuring an optional component for an application:<\/p>\n\n\n<div class=\"wp-block-lazyblock-figure lazyblock-figure-1OQ2gk\"><figure class=\"article__figure \">\n        <div class=\"article__figure-img\" >\n        <img decoding=\"async\" src=\"https:\/\/orbitsoft.com\/blog\/wp-content\/uploads\/symf1.png\" alt=\"\">\n    <\/div>\n        <\/figure><\/div>\n\n\n<p>Once the dependencies are set, the commands in the next section of the composer.json file will be automatically executed. For example cache:clear performs file cache cleanup for the application:<\/p>\n\n\n<div class=\"wp-block-lazyblock-figure lazyblock-figure-1dvBRA\"><figure class=\"article__figure \">\n        <div class=\"article__figure-img\" >\n        <img decoding=\"async\" src=\"https:\/\/orbitsoft.com\/blog\/wp-content\/uploads\/symf2.png\" alt=\"\">\n    <\/div>\n        <\/figure><\/div>\n\n\n<p><strong>Symfony helps by re-utilizing commonly used code, resulting in fewer mistakes.<\/strong> Many projects need to use a given solution over and over again between different components, for example: for storing data for different platforms.<\/p>\n\n\n\n<p>Symfony has an original system of multiple code use called The Bundle System. This is an out-of-the-box library with a recipe for integrating Dependency Injection into the application container and describing the necessary configuration options. We often use these bundles in our work.<\/p>\n\n\n\n<p>For example, a bundle from which different backend applications communicate with each other and also between client applications in the JSON format with predefined entity schemas.<\/p>\n\n\n\n<p>An example of the bundle:<\/p>\n\n\n<div class=\"wp-block-lazyblock-figure lazyblock-figure-gxgpN\"><figure class=\"article__figure \">\n        <div class=\"article__figure-img\" >\n        <img decoding=\"async\" src=\"https:\/\/orbitsoft.com\/blog\/wp-content\/uploads\/symf3.png\" alt=\"\">\n    <\/div>\n        <\/figure><\/div>\n\n\n<p>Symfony organizes the environment around the code base, which is very easy to work with. To make it convenient for the programmer, the framework creates a special environment where it stores files with passwords and addresses in different file formats.<\/p>\n\n\n\n<p>Symfony supports all file formats: native PHP files as well as XML, INI, and YAML. For PosiFlora, we use the YAML format. It&#8217;s easy to read and organically describes the necessary parameter structures. The framework by default caches the results of parsing the YAML configuration file. Thanks to this, the performance of the framework isn\u2019t affected.<\/p>\n\n\n\n<p>Example of a configuration file in YAML format:<\/p>\n\n\n<div class=\"wp-block-lazyblock-figure lazyblock-figure-8UPlD\"><figure class=\"article__figure \">\n        <div class=\"article__figure-img\" >\n        <img decoding=\"async\" src=\"https:\/\/orbitsoft.com\/blog\/wp-content\/uploads\/symf4.png\" alt=\"\">\n    <\/div>\n        <\/figure><\/div>\n\n<div class=\"wp-block-lazyblock-heading lazyblock-heading-Z1dipln\"><h2 class=\"article__h\">Symfony results: we launched the application in just 9 months <\/h2><\/div>\n\n\n<p>PosiFlora supports all iPad versions, iPhone versions from 6 up, and over 10,000 Android devices.  A single tablet is enough for a retail outlet. Most customers use iPads.<\/p>\n\n\n\n<p><strong>The app adapts according to a client\u2019s needs.<\/strong> If a client has a new task for the system, we try to solve it. For example, we implemented a ranking of supplies according to European markings, added barcode support, and the ability to connect information from different advertising offices. In just two years, we solved more than 2 thousand.<\/p>\n\n\n\n<p>We released 87 new versions of the app in two years. It was automatically updated on all devices at once, without any additional developer involvement.<\/p>\n\n\n\n<p><strong>The app works quickly.<\/strong> When any button is clicked, only part of the page is updated, rather than reloading the whole page as on normal websites. This is possible because the client-server paradigm allows the server-side and the interface-side to be separated.<\/p>\n\n\n\n<p><strong>All order data is stored, even if florists\/clients have entered it offline. <\/strong>Interaction with the back-end takes place over the network using the JSON API protocol. On the server-side, the Symfony app accepts and serves requests from clients, communicating with each other via the JSON API, or asynchronously via RabbitMQ message queues.<\/p>\n\n\n\n<p><strong>The application won&#8217;t crash, even on holidays when requests increase.<\/strong> Each module is packaged in a container on the server and can be horizontally scaled depending on the load.<\/p>\n\n\n\n<p><strong>Saves money on maintenance.<\/strong> The framework helps save on a company\u2019s development expenditures: only two programmers are needed to write updates and maintain the application. There is no need to pay for the use of the framework and technical support.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>8,500 <\/strong><\/td><td><strong>1600<\/strong><\/td><td><strong>175,000<\/strong><\/td><\/tr><tr><td>retail shops<\/td><td>Every second, the system processes requests<\/td><td>sales per day<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<div class=\"wp-block-lazyblock-important-block lazyblock-important-block-1bNpgW\"><div class=\"important-box\">\n  <div class=\"important-box__main\">\n          <p class=\"important-box__h\">Technical block<\/p>\n      \t<p>Frameworks:<\/p>\n<ul>\n<li>Backend: Symfony<\/li>\n<li>Web Front End: Angular<\/li>\n<li>Mobile\/Desktop App: Qt<\/li>\n<\/ul>\n<p>Programming languages:<\/p>\n<ul>\n<li>Backend: PHP 7.3\u20147.4<\/li>\n<li>Web Front End: TypeScript<\/li>\n<li>Mobile\/Desktop App: C++<\/li>\n<\/ul>\n<p>Libraries:<\/p>\n<ul>\n<li>neomer\/json-api<\/li>\n<li>Doctrine ORM<\/li>\n<li>Enqueue<\/li>\n<li>League\/Flysystem<\/li>\n<li>Monolog<\/li>\n<li>Swift Maile<\/li>\n<li>Twig<\/li>\n<\/ul>\n<p>Database:<\/p>\n<ul>\n<li>MySQL<\/li>\n<li>Redis<\/li>\n<li>Apache Kafka<\/li>\n<li>RabbitMQ<\/li>\n<li>Couchbase<\/li>\n<li>SQLite<\/li>\n<li>ElasticSearch<\/li>\n<\/ul>\n<p>Platforms and third-party software:<\/p>\n<ul>\n<li>Docker, Docker Compose, Docker Swarm<\/li>\n<li>HashiCorp Consul<\/li>\n<li>HashiCorp Vault<\/li>\n<li>Kafka Connect<\/li>\n<li>Graylog<\/li>\n<li>Grafana, Graphite, StatsD<\/li>\n<\/ul>  <\/div>\n  <\/div><\/div>\n\n<div class=\"wp-block-lazyblock-banner lazyblock-banner-1znKoF\"><div \n  class=\"banner\n   \n  \" \n  >\n    <div class=\"banner__body\">\n        <h2 class=\"banner__h\"> We release projects for online and offline business<\/h2>\n        <div class=\"banner__content\">\n            <p><strong>We work with businesses of any scale.<\/strong> Our clients include international companies, large and medium-sized businesses, and startups.<\/p>\n<p><strong>Telecom<\/strong>: cellular operators, Internet service providers.<\/p>\n<p><strong>Finance<\/strong>: electronic payment systems, insurance companies and brokers.<\/p>\n<p><strong>Retail<\/strong>: stores, trade networks.<\/p>\n<p><strong>Internet advertising<\/strong>: advertising agencies, advertising networks.<\/p>\n<p><strong>Medicine<\/strong>: clinics, medical services.<\/p>        <\/div>\n                            <div \n              class=\"banner__button button js-form-modal\n               button_style_light-on-promo2\">\n              Discuss or order development                          <\/div>\n            <\/div>\n    <div class=\"banner__photo\">\n        <img decoding=\"async\" src=\"https:\/\/orbitsoft.com\/blog\/wp-content\/uploads\/friendship.png\" alt=\"\" class=\"banner__img\">\n    <\/div>\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>PosiFlora is a stock control and sales development system for florists. It\u2019s used by online delivery shops, supermarkets, and small retail shops. As of June 2021, PosiFlora is used by 8,500 customers. OrbitSoft developed this total solution from scratch. With the app, floral managers can: To make it easy for businesses to work with PosiFlora, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":35792,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[196],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Symfony - OrbitSoft Blog<\/title>\n<meta name=\"description\" content=\"Why did we use PHP framework Symfony on the server side of POSiFLORA, the business automation system with 8,500 users for June 2021\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/orbitsoft.com\/blog\/symfony-why-we-chose-this-framework-for-the-posiflora-accounting-system\/\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Symfony - OrbitSoft Blog\" \/>\n<meta name=\"twitter:description\" content=\"Why did we use PHP framework Symfony on the server side of POSiFLORA, the business automation system with 8,500 users for June 2021\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/orbitsoft.com\/blog\/wp-content\/uploads\/1029x1002.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@orbitsoft\" \/>\n<meta name=\"twitter:site\" content=\"@orbitsoft\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Symfony - OrbitSoft Blog","description":"Why did we use PHP framework Symfony on the server side of POSiFLORA, the business automation system with 8,500 users for June 2021","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/orbitsoft.com\/blog\/symfony-why-we-chose-this-framework-for-the-posiflora-accounting-system\/","twitter_card":"summary_large_image","twitter_title":"Symfony - OrbitSoft Blog","twitter_description":"Why did we use PHP framework Symfony on the server side of POSiFLORA, the business automation system with 8,500 users for June 2021","twitter_image":"https:\/\/orbitsoft.com\/blog\/wp-content\/uploads\/1029x1002.jpg","twitter_creator":"@orbitsoft","twitter_site":"@orbitsoft","twitter_misc":{"Written by":"admin","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/orbitsoft.com\/blog\/symfony-why-we-chose-this-framework-for-the-posiflora-accounting-system\/","url":"https:\/\/orbitsoft.com\/blog\/symfony-why-we-chose-this-framework-for-the-posiflora-accounting-system\/","name":"Symfony - OrbitSoft Blog","isPartOf":{"@id":"https:\/\/orbitsoft.com\/blog\/#website"},"datePublished":"2021-08-06T12:15:04+00:00","dateModified":"2023-07-03T09:31:05+00:00","author":{"@id":"https:\/\/orbitsoft.com\/blog\/#\/schema\/person\/e515b3fa91e283750477594c4f028b7b"},"description":"Why did we use PHP framework Symfony on the server side of POSiFLORA, the business automation system with 8,500 users for June 2021","breadcrumb":{"@id":"https:\/\/orbitsoft.com\/blog\/symfony-why-we-chose-this-framework-for-the-posiflora-accounting-system\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/orbitsoft.com\/blog\/symfony-why-we-chose-this-framework-for-the-posiflora-accounting-system\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/orbitsoft.com\/blog\/symfony-why-we-chose-this-framework-for-the-posiflora-accounting-system\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/orbitsoft.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Symfony"}]},{"@type":"WebSite","@id":"https:\/\/orbitsoft.com\/blog\/#website","url":"https:\/\/orbitsoft.com\/blog\/","name":"OrbitSoft Blog","description":"Discover the latest in news and resources for OrbitSoft","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/orbitsoft.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/orbitsoft.com\/blog\/#\/schema\/person\/e515b3fa91e283750477594c4f028b7b","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/orbitsoft.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/b1b269c579caf059f82b6d114c63fc49?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b1b269c579caf059f82b6d114c63fc49?s=96&d=mm&r=g","caption":"admin"},"url":"https:\/\/orbitsoft.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/orbitsoft.com\/blog\/wp-json\/wp\/v2\/posts\/35782"}],"collection":[{"href":"https:\/\/orbitsoft.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/orbitsoft.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/orbitsoft.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/orbitsoft.com\/blog\/wp-json\/wp\/v2\/comments?post=35782"}],"version-history":[{"count":12,"href":"https:\/\/orbitsoft.com\/blog\/wp-json\/wp\/v2\/posts\/35782\/revisions"}],"predecessor-version":[{"id":36596,"href":"https:\/\/orbitsoft.com\/blog\/wp-json\/wp\/v2\/posts\/35782\/revisions\/36596"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/orbitsoft.com\/blog\/wp-json\/wp\/v2\/media\/35792"}],"wp:attachment":[{"href":"https:\/\/orbitsoft.com\/blog\/wp-json\/wp\/v2\/media?parent=35782"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/orbitsoft.com\/blog\/wp-json\/wp\/v2\/categories?post=35782"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/orbitsoft.com\/blog\/wp-json\/wp\/v2\/tags?post=35782"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}