SeoSamba POS plugin


Plugin configuration:

Stripepay "buttonPaymentSuccessCallback" webhook
Use this webhook if stripepayOAuth == 0. Stripe credentials will be taken from the stripepay plugin.
   Webhook Secret Key:
      You should register a webhook named "you-site-url/plugin/stripepay/run/buttonPaymentSuccessCallback"
      with event type "charge.succeeded" in the account room and get the "Signing secret" for it (whsec_.....)
      Put this "Signing secret" to "Endpoint Secret Key" input.

---------------------------------------------Mojo connection and Sales person creation-------------------------------------
1. WEBSITE ID CARD->Website Id Card->Seosamba Connect
   Connect you website on Mojo.

2. OTHER->Manage users
   Add a new user with the role "sales person" or you can use already created users with the same role in your APP.

3. CRM->Mobile App Config
   Select your sales person from the list and click on "Grant access". Then opposite added user please enable "POS App access" to use the POS APP.

----------------------------------------------------General config----------------------------------------------------
1. SEOSAMBA POS->POS config->General
   In this config you can provide "default customer" copy cron script url and select "Receipt template"

   1. Cron script:
      a. URL - you-site-url/plugins/seosambapos/system/cronscript/clearReservedCartsContent.php
        This script clears all cards that were used by sales person and not purchased (with the status "new" and with default customer from POS config).
        Your server administrator must schedule the associated cron script to process reserved carts.
        Optimal schedule time to run script - once a day at midnight.
      b. URL - you-site-url/plugins/seosambapos/system/cronscript/unsetActiveSessionAllSales.php
        This script logs out all active users (sales persons).
        Recommended schedule period for run script - once a day at midnight.

   2. Default customer:
      Use default customer when you create your purchase if real customer did not provided.

   3. Default salesperson:
      If no salesperson is assigned, the app will use this default salesperson

   4. Receipt template:
      Template creation: LAYOUT->Add template->POS
      Use this template to generate your successful purchase receipt.

----------------------------------------------------Default product----------------------------------------------------
1. SEOSAMBA POS->POS config->Default product
   Use these default attributes when you create a product in mobile APP.

   1. Default brand,Default tax,Default product page template:
      Required fields for new product creation.

   2. Get Quick Sales Product Configuration:
      Default product should be disabled and have infinity QTY and have "Additional price field" option.

   3. Global default location:
      Used for purchases via website. Used when reducing the product inventory in the stock if the product doesn't have a default location selected (read "Product locations inventory" readme).

----------------------------------------------------Stripe----------------------------------------------------
1. STRIPE PAY->Stripe config
   This params you can find on your personal account room ( https://dashboard.stripe.com/account/apikeys )
   1. Test Secret Key: sk_test_.... used for tests
   2. Test Publishable Key: pk_test_.... used for tests

   3. Live Secret Key: sk_live_.... used for live access
   4. Live Publishable Key: pk_live_.... used for live access

 ----------------------------------------------------POS terminals config-----------------------------------------------
 1. SEOSAMBA POS->POS terminals config
    Cash register devices which will be used by mobile application.
    Sales person should select a cash register when connected to the APP and after selecting their store location.

 ----------------------------------------------------Manage locations-----------------------------------------------
 1. STORE->Manage locations
    In this config, you can create your store locations with addresses and bind terminals ([ Cash register ids ]).
    "Cash register ids" (read "POS terminals config" readme).
    Location address will used for calculating shipping service in the APP.

----------------------------------------------------Product locations inventory-----------------------------------------
 1. STORE->Add/edit product->POS location inventory
    1. Location:
       This is a place where your product is located (read "Manage locations" readme).

    2. Product inventory:
       This is available quantity in this location.
       Attention, inventory can't be more than the product has general "QTY" in tab "Main->QTY".

    3. Default location:
       This checkbox is used for purchases via the website.
       It means when the customer buys this product via the website and if this checkbox is enabled, product inventory should be reduced in this location.

----------------------------------------------------Action e-mails & SMS-----------------------------------------
1. OTHER->Action e-mails & SMS->Seosambapos
   Widgets:
   {$seosambapos:seosambaposreport:mailreport} - Generates order summary for current cartId (can be used in action email "Email Receipt")

   Lexems:
   {seosambapos:reviewlink} - send selected social review links (can be used in action emails: "Email Receipt", "Review Link")

   1. Email Receipt:
      Use this action email when you want to send an email receipt to a customer. Not work for default customer.

   2. Review Link:
      Send review link via SMS or via email.

Cron scripts:
plugins/seosambapos/system/cronscript/clearReservedCartsContent.php - Clears reserved carts content with the status "new" and with default customer from POS config. Recommended schedule period for run once a day at midnight.
plugins/seosambapos/system/cronscript/unsetActiveSessionAllSales.php - Logs out all active users (sales persons). Recommended schedule period for run once a day at midnight.

Widgets:
{$seosambapos:seosambaposreport:mailreport} - Generates order summary for current cartId (can be used in action email "Email Receipt")

Lexems:
{seosambapos:reviewlink} - send selected social review links (can be used in action emails: "Email Receipt", "Review Link")

Actions list:
 Session:
   setSession - required "cashRegisterId,locationId".
   unsetSession
   sessionStatus - Return user,location,cashRegister info.

 Cart:
   getCart - Create cart with status "new" with default customer or return existed cart.
   addProductToCart - Add product to cart. required "cartId,productId"
   deleteProductsFromCart - Delete products from cart. required "cartId,productId"
   changeCartCustomerId - Change customer ID for cart with status "new" and with default customer. required "cartId,customerId"
   changeProductQtyInCart - Change product quantity in cart. required "cartId,productId,productQty"
   addShippingAddressToCart - Add shipping address to cart. required "cartId,shippingAddressId"
   resetShipping - Reset shipping address. required "cartId"
   addShippingPriceToCart - Add shipping price to cart. required "cartId,serviceName,priceToCart,typeToCart"
   addCouponToCart - Add coupon to cart. required "cartId,code"
   resetCart - Reset cart content (with cart status "new" and with default user). required "cartId"
   createQuickSale - create quick product and add this product to cart. "name,price" params are required. Params "brand,template,tax" are requerd (These params are obtained from the default product config).
   deleteQuickSale - Delete product and remove this product from cart. required "cartId"
   generateReceipt - create PDF receipt link for purchase "cartId" param is required.
   emailReceipt - send email receipt after successful purchase by order ID. required "cartId,email"
   completePurchaseByCash - Complete purchase by cash. required "cartId,total"
   validateCart - Check if product location inventories are sold. required "cartId"
   getOrderInfo - Get purchase info. required "cartId"

 Terminal:
   getStripeTerminalToken - return Stripe terminal token.

 Shipping:
   addShippingAddress - Add shipping address. required "customerId,address"
   getShippingCustomerAddresses - return list of customer addresses. "customerId" param is required.
   getShippingPriceValues - get shipping price values. required "cartId,serviceName" (flatrateship,flatrateshipping,usps,ups,customshipping)

 Customer:
   addCustomer - return created customer or return existed customer by email. Required params: email,firstName,lastName.
   getDefaultCustomer - return default customer which was saved in seosambapos general config.
   searchCustomer - return found customer. Search customer by "email,name,phone"

 Product:
   addProduct - create product "sku,name,shortDescription,price" params is required. Params "brand,template" is requerd if these params did not saved in default product config.
   getDefaultProduct - return default product which was saved in seosambapos default product config.
   getProductList - return list of products, "limit,locationId" params are required. Allowed search product by product name and sku. Use "searchParam". Allowed filter by "includeOutOfStock,productTags"
   updateProduct - update product. Param "id" is required.
   //addProductAdditionalPictures - Add additional pictures for product. Param "productId,images" are required.(deprecated)
   //getProductAdditionalPictures - Get a list of product additional pictures. Param "productId" is required.(deprecated)
   //deleteProductAdditionalPictures - Delete product additional pictures. Param "id" is required.(deprecated)
   deleteProduct - delete product "produuctId" param is required.
        a. If the product has one current location and doesn't have successful purchases -> delete product
        b. If the product has one current location and doesn't have successful purchases -> set his location inventory to 0
        forceDelete (param) -> removes product or sets the location inventory to 0. Based on the rules above.

 Location:
   getLocations - return locations full list.
   getStoreInfo - return store info (currency,weight unit,length unit,country,shippingServices,defaultTaxList,mobile cuntry codes).//defaultTaxList deprecated
   getProductTagsByLocation - Get product tags list by location ID. required "locationId"

 Stripe:
   getStripeIntent - return Stripe intent for cart "cartId" params is required.

 Review:
   getReviewLinks - return list of review request social network links.
   sendReviewLink - send review social network link to customer. required "cartId,type"

 Toaster config actions:
   General config:
     getDefaultCustomerConfig - Get customer list and default saved customer from config if exists
     setDefaultCustomerConfig - Save default customer to toaster config. Required "defaultCustomerId"
     getDefaultSalespersonConfig - Get salespersons list and default saved salesperson from config if exists.
     setDefaultSalespersonConfig - Save default salesperson to toaster config. Required "defaultSalespersonId"
     getReceiptTemplateConfig - Get receipt templates list and saved receipt template from config if exists.
     setReceiptTemplateConfig - Save receipt template to toaster config. Required "receiptTemplate"

   Default product config:
     getDefaultProductBrandConfig - Get product brands list and saved default product brand from config if exists.
     setDefaultProductBrandConfig - Save default product brand to toaster config. Required "brandId"
     getDefaultProductTaxConfig - Get product tax list and saved default product tax from config if exists.
     setDefaultProductTaxConfig - Save default product tax to toaster config. Required "taxId"
     getDefaultProductTemplateConfig - Get product templates list and saved default product template from config if exists.
     setDefaultProductTemplateConfig - Save default product template to toaster config. Required "productTemplate"

 Check if plugin seosambapos exist:
     isPosPluginExist - Check if plugin seosambapos exist.


--13. getDefaultTaxList - return shopping taxes list.
--14. getLibraryOptionsList - return shopping library options list.
--15. getLibraryOptionById - return shopping library option by ID. "libraryOptionId" param is required.
--16. getOptionDropdownRadioNewSelection - return new Dropdown or Radio default option selection.
--17. getCashRegisterList - return Cash register list.
--19. subscribeCustomer - subscribe customer (not default customer). required "customerId".
--20. isStoreOpen - check if store open.
--21. isProductAvailable - Check if product be able to add to checkout.
--22. getProductBrandsList - return product brands list.

Actions:

setSession - required "posUserId,cashRegisterId,locationId"
   Params in request:
      array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cashRegisterId' => '3',//required
        'locationId' => '16'//required
      );

   Response success:
   {
     "message": "The session registered successfully."
   }

   Response fail:
   empty posUserId or cashRegisterId or locationId:
   {
     "error": "1",
     "message": "Missing posUserId or cashRegisterId or locationId"
   }

   posUserId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested user is not found!"
   }

   cashRegisterId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested cash register ID is not found!"
   }

  locationId not found in system:
  {
    "error": "1",
    "message": "You can not continue working with API. The requested cash location ID is not found!"
  }

   if session with posUserId is already active:
   {
     "error": "1",
     "message": "This session with posUserId-1 is already active."
   }

   if session with locationId and cashRegisterId is already active for other user:
   {
     "error": "1",
     "message": "Session with posUserId-1 is already connected with status-active to the same location and terminal."
   }

unsetSession - required "posUserId"
   Params in request:
     array(
       'posUserId' => '1',
       'posUserEmail' => 'salesperson@mail.com',
     );

   Response success:
   {
     "message": "The session deleted successfully."
   }

   Response fail:
   empty posUserId:
   {
     "error": "1",
     "message": "Missing posUserId"
   }

   posUserId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested user is not found!"
   }

   if session with posUserId is inactive:
   {
     "error": "1",
     "message": "This session with posUserId-1 is inactive."
   }

sessionStatus - required "posUserId". Return user,location,cashRegister info.
   Params in request:
   array(
     'posUserId' => '1',
     'posUserEmail' => 'salesperson@mail.com',
   );

   Response success:
   {
     "isActive": true,
     "location": {
        "price": "10.00",
        "id": "16",
        "name": "First store",
        "address1": "1234 Main Street",
        "address2": "",
        "zip": "941112",
        "country": "United States",
        "state": "OH",
        "city": "San Francisco",
        "working_hours": "a:7:{s:6:\"sunday\";s:0:\"\";s:6:\"monday\";s:0:\"\";s:7:\"tuesday\";s:0:\"\";s:9:\"wednesday\";s:0:\"\";s:8:\"thursday\";s:0:\"\";s:6:\"friday\";s:0:\"\";s:8:\"saturday\";s:0:\"\";}",
        "phone": "0964101035",
        "location_category_id": "1",
        "lat": "37.7901597",
        "lng": "-122.392833",
        "weight": "",
        "external_id": "",
        "allowed_to_delete": "0",
        "cash_register_id": "1,2,3",
        "terminalLocationId": "tml_FgtUAg04fNkIqv",
        "cashRegisters": {
          "0": {
            "id": "1",
            "label": "cash register 1",
            "status": false
          },
          "1": {
            "id": "2",
            "label": "cash register 2",
            "status": false
          },
          "2": {
            "id": "3",
            "label": "cash register 3",
            "status": true
          }
        }
     },
     "cashRegisterId": "3"
   }

   Response fail:
   If posUserId not provided:
   {
     "error": "1",
     "message": "User not found."
   }

   If session not found:
   {
     "isActive": false,
     "location": null,
     "cashRegisterId": null,
   }

getCart - Create cart with status "new" with default customer or return existed cart with default customer.
    Params in request:
       array(
           'posUserId' => '1',
           'posUserEmail' => 'salesperson@mail.com',
       );

    Response success:
    New cart:
    {
      "cartId": "1975",
      "products": [],
      "subTotal": 0.00,
      "discount": 0.00,
      "discountTax": 0.00,
      "shippingPrice": 0.00,
      "shippingType": "",
      "shippingService": "",
      "shippingAddress": null,
      "totalTax": 0.00,
      "total": 0.00,
      "shippingTax": 0.00,
      "subTotalTax": 0.00,
      "couponCodes": ""
    }

    Restored Cart:
    {
      "cartId": "2012",
      "products": {
        "0": {
          "productId": "2",
          "productSku": "baby-bodysuit-anchor-monaco-blue",
          "productName": "Baby Bodysuit Anchor Monaco Blue",
          "productQty": 1,
          "productPrice": 17.07,
          "imageUrl": "http://monaco-addict.loc/media/products/small/baby-bodysuit-anchor-monaco-blue-front.jpg"
        }
      },
      "subTotal": 14.225,
      "discount": 0.00,
      "discountTax": 0.00,
      "shippingPrice": 0.00,
      "shippingType": "",
      "shippingService": "pickup",
      "shippingAddress": {
        "id": "2974666fcf873c985780cfa5b01f0485",
        "isDefaultCustomerAddress": false,
        "streetAddress": "37 RUE DE RIVOLI ",
        "locality": "PARIS, 98000, FR",
        "postalCode": "98000",
        "country": "FR",
        "email": "admin@monaco-addict.com",
        "company": "",
        "phone": "+93415899345",
        "mobile": ""
      },
      "totalTax": 2.845,
      "total": 17.07,
      "shippingTax": 0.00,
      "subTotalTax": 2.845,
      "couponCodes": ""
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    posUserId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested user is not found!"
    }

    cashRegisterId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash register ID is not found!"
    }

    locationId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash location ID is not found!"
    }

    if session with posUserId is inactive:
    {
      "error": "1",
      "message": "This session with posUserId-1 is inactive."
    }

    if default customer not assigned in config:
    {
      "error": "1",
      "message": "Default customer not assigned in the config"
    }

    If customer not found in system by customerId:
    {
      "error": "1",
      "message": "Existed customer not found in system."
    }

    If can not create new cart:
    {
      "error": "1",
      "message": "Can not save new cart."
    }

    If can not save cart:
    {
      "error": "1",
      "message": "Can not save cart."
    }

addProductToCart - Add product to cart. required "cartId,productId"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cartId' => '1975',//required
        'productId' => '1',//required
        'productQty' => '1',
    );

    Response success:
    {
      "cartId": "1975",
      "products": [
        "0": {
          "productId": "1",
          "productSku": "baby-bodysuit-bottle-rattle-pacifier-monaco-pink",
          "productName": "Baby Bodysuit Bottle Rattle Pacifier Monaco Pink",
          "productQty": 2,
          "productPrice": 33.60,
          "imageUrl": "http://monaco-addict.loc/media/products/small/baby-bodysuit-bottle-rattle-pacifier-monaco-pink.jpg"
        },
        "1": {
          "productId": "310",
          "productSku": "someproduct-name",
          "productName": "someProduct-name",
          "productQty": 2,
          "productPrice": 2.40,
          "imageUrl": "http://monaco-addict.loc/media/products/small/someproduct-name.jpg",
        }
      ],
      "subTotal": 30,
      "discount": 0.00,
      "discountTax": 0.00,
      "shippingPrice": 0.00,
      "shippingType": "Delivery by Post (with tracking)",
      "shippingService": "flatrateship",
      "shippingAddress": {
        "id" : "f4f5964c5ad0fcfc74990186032e0115",
        "isDefaultCustomerAddress" : false,
        "streetAddress": "444 9th St ",
        "locality": "Brooklyn, NY, 11215, US",
        "region": "NY",
        "postalCode": "11215",
        "country": "US",
        "email": "johncrimminsumd@gmail.com",
        "company": "",
        "phone": "",
        "mobile": "+19567649353"
      },
      "totalTax": 6.0,
      "total": 36.0,
      "shippingTax": 0.00,
      "subTotalTax": 6.0,
      "couponCodes": ""
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    posUserId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested user is not found!"
    }

    cashRegisterId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash register ID is not found!"
    }

    locationId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash location ID is not found!"
    }

    if session with posUserId is inactive:
    {
      "error": "1",
      "message": "This session with posUserId-1 is inactive."
    }

    if cartId is empty:
    {
      "error": "1",
      "message": "cartId is empty."
    }

    if cartId is already paid (statuses: completed,shipped,delivered,partial):
    {
      "error": "1",
      "message": "This cart is already paid."
    }

    if products[productId] is empty:
    {
      "error": "1",
      "message": "Can\'t add to cart: product not defined"
    }

    if product disabled:
    {
      "error": "1",
      "message": "This product is disabled"
    }

    if product minimumOrder enabled:
    {
      "error": "1",
      "message": "You can add minimum 2 products"
    }

    {
      "error": "1",
      "message": "You can\'t buy this product. Products left less than minimum quantity."
    }

    if product not found in system:
    {
      "error": "1",
      "message": "Can\'t add to cart: product not found"
    }

    if cart data is empty:
    {
      "error": "1",
      "message": "Can\'t return cart data!"
    }

    if user not logged into system:
    {
      "error": "1",
      "message": "Can not get locationId for logged user."
    }

    if trying add more than all locations inventories have:
    {
      "error": "1",
      "message": "You can not add more items to your cart than are available in all locations warehouses."
    }

    if product is not found in this location:
    {
      "error": "1",
      "message": "Product not found with this location."
    }

deleteProductsFromCart - Delete products from cart. required "cartId,productId"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cartId' => '1975',//required
        'productId' => '1'//required
        ),
    )

    Response success:
    {
      "cartId": "1975",
      "products": [
        "0": {
          "productId": "1",
          "productSku": "baby-bodysuit-bottle-rattle-pacifier-monaco-pink",
          "productName": "Baby Bodysuit Bottle Rattle Pacifier Monaco Pink",
          "productQty": 2,
          "productPrice": 33.60,
          "imageUrl": "http://monaco-addict.loc/media/products/small/baby-bodysuit-bottle-rattle-pacifier-monaco-pink.jpg",
        }
      ],
      "subTotal": 28.0,
      "discount": 0.00,
      "discountTax": 0.00,
      "shippingPrice": 0.00,
      "shippingType": "Delivery by Post (with tracking)",
      "shippingService": "flatrateship",
      "shippingAddress": {
        "id" : "f4f5964c5ad0fcfc74990186032e0115",
        "isDefaultCustomerAddress" : false,
        "streetAddress": "444 9th St ",
        "locality": "Brooklyn, NY, 11215, US",
        "region": "NY",
        "postalCode": "11215",
        "country": "US",
        "email": "johncrimminsumd@gmail.com",
        "company": "",
        "phone": "",
        "mobile": "+19567649353"
      },
      "totalTax": 5.60,
      "total": 33.60,
      "shippingTax": 0.00,
      "subTotalTax": 5.60,
      "couponCodes": ""
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    posUserId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested user is not found!"
    }

    cashRegisterId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash register ID is not found!"
    }

    locationId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash location ID is not found!"
    }

    if session with posUserId is inactive:
    {
      "error": "1",
      "message": "This session with posUserId-1 is inactive."
    }

    if cartId is empty:
    {
      "error": "1",
      "message": "cartId is empty."
    }

    if cartId is already paid (statuses: completed,shipped,delivered,partial):
    {
      "error": "1",
      "message": "This cart is already paid."
    }

    if products[productId] is empty:
    {
      "error": "1",
      "message": "Can\'t remove from cart: product not defined"
    }

    if products is empty:
    {
      "error": "1",
      "message": "The requested products are empty."
    }

    if product not found:
    {
      "error": "1",
      "message": "Product not found in system"
    }

changeCartCustomerId - Change customer ID for cart with status "new" and with default customer. required "cartId,customerId"
   Params in request:
   array(
       'posUserId' => '1',
       'posUserEmail' => 'salesperson@mail.com',
       'cartId' => '1959',//required
       'customerId' => '594',//required
   );

   Response success:
   {
     "cartId": "2027",
     "products": {
       "0": {
         "productId": "1",
         "productSku": "baby-bodysuit-bottle-rattle-pacifier-monaco-pink",
         "productName": "Baby Bodysuit Bottle Rattle Pacifier Monaco Pink",
         "productQty": 1,
         "productPrice": 16.0,
         "imageUrl": "http://monaco-addict.loc/media/products/small/baby-bodysuit-bottle-rattle-pacifier-monaco-pink-front.jpg"
       }
     },
     "subTotal": 14.0,
     "discount": 0.00,
     "discountTax": 0.00,
     "shippingPrice": 0.00,
     "shippingType": "",
     "shippingService": "",
     "shippingAddress": {
       "id": "97c12e6fc3c7883f6c4dda859796b33d",
       "isDefaultCustomerAddress": false,
       "streetAddress": "444 9th St ",
       "locality": "Brooklyn, FL, 75004, US",
       "region": "FL",
       "postalCode": "75004",
       "country": "US",
       "email": "admin@monaco-addict.com",
       "company": "",
       "phone": "",
       "mobile": "+33964101035"
     },
     "totalTax": 2.0,
     "total": 16.0,
     "shippingTax": 0.00,
     "subTotalTax": 2.0,
     "couponCodes": ""
   }

   Response fail:
   empty posUserId:
  {
    "error": "1",
    "message": "Missing posUserId"
  }

  posUserId not found in system:
  {
    "error": "1",
    "message": "You can not continue working with API. The requested user is not found!"
  }

  cashRegisterId not found in system:
  {
    "error": "1",
    "message": "You can not continue working with API. The requested cash register ID is not found!"
  }

  locationId not found in system:
  {
    "error": "1",
    "message": "You can not continue working with API. The requested cash location ID is not found!"
  }

  if session with posUserId is inactive:
  {
    "error": "1",
    "message": "This session with posUserId-1 is inactive."
  }

  if cart not found
  {
   "error": "1",
   "message": "Can not change customer for this card"
  }

  if empty customerId:
  {
   "error": "1",
   "message": "customerId not provided"
  }

  if empty cartId:
  {
   "error": "1",
   "message": "cartId not provided"
  }

  if cartId is already paid (statuses: completed,shipped,delivered,partial):
  {
    "error": "1",
    "message": "This cart is already paid."
  }

  if you try to set default customer:
  {
   "error": "1",
   "message": "You can not set default customer"
  }

  if customer does not have "customer role":
  {
   "error": "1",
   "message": "customerId does not belong to the customer role"
  }

  if cart does not have status "new" and default customer:
  {
   "error": "1",
   "message": "Only for cart with the status "new" and with default customer, you can change customerId"
  }

changeProductQtyInCart - Change product quantity in cart. required "cartId,productId,productQty"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cartId' => '1975',//required
        'productId' => '310',//required
        'productQty' => '3',//required
    )

    Response success:
    {
      "cartId": "1975",
      "products": [
        "0": {
          "productId": "310",
          "productSku": "someproduct-name",
          "productName": "someProduct-name",
          "productQty": 3,
          "productPrice": 3.60,
          "imageUrl": "http://monaco-addict.loc/media/products/small/someproduct-name.jpg"
        }
      ],
      "subTotal": 31.0,
      "discount": 0.00,
      "discountTax": 0.00,
      "shippingPrice": 0.00,
      "shippingType": "Delivery by Post (with tracking)",
      "shippingService": "flatrateship",
      "shippingAddress": {
        "id" : "f4f5964c5ad0fcfc74990186032e0115",
        "isDefaultCustomerAddress" : false,
        "streetAddress": "444 9th St ",
        "locality": "Brooklyn, NY, 11215, US",
        "region": "NY",
        "postalCode": "11215",
        "country": "US",
        "email": "johncrimminsumd@gmail.com",
        "company": "",
        "phone": "",
        "mobile": "+19567649353"
      },
      "totalTax": 6.0,
      "total": 37.0,
      "shippingTax": 0.00,
      "subTotalTax": 6.0,
      "couponCodes": ""
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    posUserId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested user is not found!"
    }

    cashRegisterId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash register ID is not found!"
    }

    locationId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash location ID is not found!"
    }

    if session with posUserId is inactive:
    {
      "error": "1",
      "message": "This session with posUserId-1 is inactive."
    }

    if cartId is empty:
    {
      "error": "1",
      "message": "cartId is empty."
    }

    if cartId is already paid (statuses: completed,shipped,delivered,partial):
    {
      "error": "1",
      "message": "This cart is already paid."
    }

    if productId is empty:
    {
      "error": "1",
      "message": "Can\'t change product qty in cart: productId not defined"
    }

    if product disabled:
    {
      "error": "1",
      "message": "This product is disabled"
    }

    if product minimumOrder enabled:
    {
      "error": "1",
      "message": "You can add minimum 2 products"
    }

    {
      "error": "1",
      "message": "You can\'t buy this product. Products left less than minimum quantity."
    }

    if product not found:
    {
      "error": "1",
      "message": "Can\'t add to cart: product not found"
    }

    if user not logged into system:
    {
      "error": "1",
      "message": "Can not get locationId for logged user."
    }

    if trying add more than all locations inventories have:
    {
      "error": "1",
      "message": "You can not add more items to your cart than are available in all locations warehouses."
    }

    if product is not found in this location:
    {
      "error": "1",
      "message": "Product not found with this location."
    }

addShippingAddressToCart - Add shipping address to cart. required "cartId,shippingAddressId"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cartId' => '1975',//required
        'shippingAddressId' => 'ab6ae98b03447b9375c3b6082ef6b03a'//required
    );

    Response success:
    {
      "cartId": "1975",
      "products": [
        "0": {
          "productId": "1",
          "productSku": "baby-bodysuit-bottle-rattle-pacifier-monaco-pink",
          "productName": "Baby Bodysuit Bottle Rattle Pacifier Monaco Pink",
          "productQty": 1,
          "productPrice": 16.0,
          "imageUrl": "http://monaco-addict.loc/media/products/small/baby-bodysuit-bottle-rattle-pacifier-monaco-pink.jpg"
        },
        "1": {
          "productId": "310",
          "productSku": "someproduct-name",
          "productName": "someProduct-name",
          "productQty": 4,
          "productPrice": 2.0,
          "imageUrl": "http://monaco-addict.loc/media/products/small/someproduct-name.jpg"
        }
      ],
      "subTotal": 18.0,
      "discount": 0.00,
      "discountTax": 0.00,
      "shippingPrice": 0.00,
      "shippingType": "",
      "shippingService": "",
      "shippingAddress": {
        "id": "5ba28fd1d71ab0abef4f7f7e938cf9b1",
        "isDefaultCustomerAddress": true,
        "streetAddress": "444 9th St ",
        "locality": "Brooklyn, NY, 11215, US",
        "region": "NY",
        "postalCode": "11215",
        "country": "US",
        "email": "johncrimminsumd@gmail.com",
        "company": "",
        "phone": "",
        "mobile": "+380964101035"
      },
      "totalTax": 3.6,
      "total": 21.6,
      "shippingTax": 0.00,
      "couponCodes": ""
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    posUserId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested user is not found!"
    }

    cashRegisterId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash register ID is not found!"
    }

    locationId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash location ID is not found!"
    }

    if session with posUserId is inactive:
    {
      "error": "1",
      "message": "This session with posUserId-1 is inactive."
    }

    if cartId is empty:
    {
      "error": "1",
      "message": "cartId is empty."
    }

    if cartId is already paid (statuses: completed,shipped,delivered,partial):
    {
      "error": "1",
      "message": "This cart is already paid."
    }

    if empty shippingAddressId and newShippingAddress and cart have default customer ID:
    {
      "error": "1",
      "message": "You can not set shipping address to default customer"
    }

    if not empty shippingAddressId and shippingAddressId not found in system:
    {
      "error": "1",
      "message": "You can not set this shipping address. Address not found"
    }

    if cart not found in system:
    {
      "error": "1",
      "message": "Cart not found!"
    }

resetShipping - Reset shipping address. required "cartId"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cartId' => '1975',//required
    );

    Response success:
    {
      "cartId": "1975",
      "products": [
        "0": {
          "productId": "1",
          "productSku": "baby-bodysuit-bottle-rattle-pacifier-monaco-pink",
          "productName": "Baby Bodysuit Bottle Rattle Pacifier Monaco Pink",
          "productQty": 1,
          "productPrice": 16.0,
          "imageUrl": "http://monaco-addict.loc/media/products/small/baby-bodysuit-bottle-rattle-pacifier-monaco-pink.jpg"
        },
        "1": {
          "productId": "310",
          "productSku": "someproduct-name",
          "productName": "someProduct-name",
          "productQty": 4,
          "productPrice": 2.0,
          "imageUrl": "http://monaco-addict.loc/media/products/small/someproduct-name.jpg"
        }
      ],
      "subTotal": 18.0,
      "discount": 0.00,
      "discountTax": 0.00,
      "shippingPrice": 0.00,
      "shippingType": "",
      "shippingService": "",
      "shippingAddress": null,
      "totalTax": 3.6,
      "total": 21.6,
      "shippingTax": 0.00,
      "couponCodes": ""
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    posUserId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested user is not found!"
    }

    cashRegisterId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash register ID is not found!"
    }

    locationId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash location ID is not found!"
    }

    if session with posUserId is inactive:
    {
      "error": "1",
      "message": "This session with posUserId-1 is inactive."
    }

    if cartId is empty:
    {
      "error": "1",
      "message": "cartId is empty."
    }

    if cartId is already paid (statuses: completed,shipped,delivered,partial):
    {
      "error": "1",
      "message": "This cart is already paid."
    }

    if cart not found in system:
    {
      "error": "1",
      "message": "Cart not found!"
    }

addShippingPriceToCart - Add shipping price to cart. required "cartId,serviceName,priceToCart,typeToCart"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cartId' => '1986',//required
        'serviceName' => 'ups',//required
        'priceToCart' => '137.73',//required
        'typeToCart' => 'Next Day Air',//required
    );

    Response success:
    {
      "cartId": "1975",
      "products": [
        "0": {
          "productId": "310",
          "productSku": "someproduct-name",
          "productName": "someProduct-name",
          "productQty": 3,
          "productPrice": 3.60,
          "imageUrl": "http://monaco-addict.loc/media/products/small/someproduct-name.jpg"
        }
      ],
      "subTotal": 14.0,
      "discount": 0.00,
      "discountTax": 0.00,
      "shippingPrice": 137.73,
      "shippingType": "Delivery by Post (with tracking)",
      "shippingService": "flatrateship",
      "shippingAddress": {
        "id" : "f4f5964c5ad0fcfc74990186032e0115",
        "isDefaultCustomerAddress" : false,
        "streetAddress": "444 9th St ",
        "locality": "Brooklyn, NY, 11215, US",
        "region": "NY",
        "postalCode": "11215",
        "country": "US",
        "email": "johncrimminsumd@gmail.com",
        "company": "",
        "phone": "",
        "mobile": "+19567649353"
      },
      "totalTax": 2.8,
      "total": 154.53,
      "shippingTax": 0.00,
      "subTotalTax": 2.8,
      "couponCodes": "",
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    if cartId is empty:
    {
      "error": "1",
      "message": "cartId is empty."
    }

    if cartId is already paid (statuses: completed,shipped,delivered,partial):
    {
      "error": "1",
      "message": "This cart is already paid."
    }

    if cart not found in system:
    {
      "error": "1",
      "message": "Cart not found!"
    }

addCouponToCart - Add coupon to cart. required "cartId,code"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cartId' => '1989',//required
        'code' => 'ZBRL0JFQO7',//required
    );

    Response success:
    {
      "cartId": "1975",
      "products": [
        "0": {
          "productId": "310",
          "productSku": "someproduct-name",
          "productName": "someProduct-name",
          "productQty": 3,
          "productPrice": 3.60,
          "imageUrl": "http://monaco-addict.loc/media/products/small/someproduct-name.jpg"
        }
      ],
      "subTotal": 14.0,
      "discount": 10.0,
      "discountTax": 2.0,
      "shippingPrice": 3.00,
      "shippingType": "Delivery by Post (with tracking)",
      "shippingService": "flatrateship",
      "shippingAddress": {
        "id" : "f4f5964c5ad0fcfc74990186032e0115",
        "isDefaultCustomerAddress" : false,
        "streetAddress": "444 9th St ",
        "locality": "Brooklyn, NY, 11215, US",
        "region": "NY",
        "postalCode": "11215",
        "country": "US",
        "email": "johncrimminsumd@gmail.com",
        "company": "",
        "phone": "",
        "mobile": "+19567649353"
      },
      "totalTax": 0.8,
      "total": 4.8,
      "shippingTax": 0.00,
      "subTotalTax": 2.8,
      "message": "Congratulations, you save $12.00 on this order",
      "couponCodes": "ZBRL0JFQO7"//3BOP25O8ZA,BJ6CBCGOK3 - if more than one coupon applied
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    posUserId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested user is not found!"
    }

    cashRegisterId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash register ID is not found!"
    }

    locationId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash location ID is not found!"
    }

    if session with posUserId is inactive:
    {
      "error": "1",
      "message": "This session with posUserId-1 is inactive."
    }

    if cartId is empty:
    {
      "error": "1",
      "message": "cartId is empty."
    }

    if cartId is already paid (statuses: completed,shipped,delivered,partial):
    {
      "error": "1",
      "message": "This cart is already paid."
    }

    if coupon is invalid:
    {
      "error": "1",
      "message": "Sorry, some coupon codes you provided are invalid or cannot be combined with the ones you've already captured in."
    }

    if coupon already used:
    {
      "error": "1",
      "message": "Sorry, some coupon codes you provided had already been used."
    }

    if coupon already used:
    {
      "error": "1",
      "message": "Sorry, some coupon codes you provided had already been used."
    }

resetCart - Reset cart content (with cart status "new" and with default user). required "cartId"
    Required params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cartId' => '2012'//required
    );

    Response success:
    {
      "cartId": "2012",
      "products": [],
      "subTotal": 0.00,
      "discount": "0.00,
      "discountTax": 0.00,
      "shippingPrice": 0.00,
      "shippingType": "",
      "shippingService": "",
      "shippingAddress": null,
      "totalTax": 0.00,
      "total": 0.00,
      "shippingTax": 0.00,
      "subTotalTax": 0.00,
      "couponCodes": ""
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    posUserId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested user is not found!"
    }

    cashRegisterId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash register ID is not found!"
    }

    locationId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash location ID is not found!"
    }

    if session with posUserId is inactive:
    {
      "error": "1",
      "message": "This session with posUserId-1 is inactive."
    }

    if cartId is empty:
    {
      "error": "1",
      "message": "cartId is empty."
    }

    if cartId is already paid (statuses: completed,shipped,delivered,partial):
    {
      "error": "1",
      "message": "This cart is already paid."
    }

    if default customer not found in system:
    {
      "error": "1",
      "message": "Default customer not exists"
    }

    if cart not found in system:
    {
      "error": "1",
      "message": "Cart not found!"
    }

createQuickSale - create quick product and add this product to cart. "name,price" params are required. Params "brand,template,tax" are requerd (These params are obtained from the default product config).
    Request params:
    array (
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'product' => array(
            'name' => 'someProduct-quick',//required
            'image' => array(
                'data' => "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",
                'name' => "someproduct-sku.jpeg"
            ),
            'price' => '1.50',//required
        )
    )

   Response success:
   {
     "cartId": "2028",
     "products": {
       "0": {
         "productId": "322",
         "productSku": "1717662379",
         "productName": "someProduct-quick",
         "productQty": 1,
         "productPrice": 1.50,
         "imageUrl": "http://monaco-addict.loc/media/products/small/1717662379.jpeg"
       }
     },
     "subTotal": 1.50,
     "discount": 0.00,
     "discountTax": 0.00,
     "shippingPrice": 0.00,
     "shippingType": "",
     "shippingService": "",
     "totalTax": 0.00,
     "total": 1.50,
     "shippingTax": 0.00,
     "subTotalTax": 0.00,
     "couponCodes": ""
   }

   Response fail:
   if default product not assigned in config:
   {
     "error": "1",
     "message": "Default product not assigned in the config"
   }

   if product not found:
   {
     "error": "1",
     "message": "Default product was deleted, please reassign the product in config."
   }

   if prooduct exists:
   {
     "error": "1",
     "message": "You already have a product with this SKU"
   }

   if empty brand or not assigned in config:
   {
     "error": "1",
     "message": "Default brand not assigned in the config"
   }

   if empty price:
   {
     "error": "1",
     "message": "Product price is empty"
   }

   if empty product template or not assigned in config:
   {
     "error": "1",
     "message": "Default template not assigned in the config or not set in request or not found in system"
   }

   empty posUserId:
   {
     "error": "1",
     "message": "Missing posUserId"
   }

   posUserId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested user is not found!"
   }

   cashRegisterId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested cash register ID is not found!"
   }

   locationId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested cash location ID is not found!"
   }

   if session with posUserId is inactive:
   {
     "error": "1",
     "message": "This session with posUserId-1 is inactive."
   }

   if the new product has no option "additionalpricefield":
   {
     "error": "1",
     "message": "Not found option with type \"additionalpricefield\""
   }

deleteQuickSale - Delete product and remove this product from cart. required "cartId"
     Params in request:
     array(
         'posUserId' => '1',
         'posUserEmail' => 'salesperson@mail.com',
         'cartId' => '2024'//required
     );

     Response success:
     {
       "cartId": "2028",
       "products": [],
       "subTotal": 0.00,
       "discount": 0.00,
       "discountTax": 0.00,
       "shippingPrice": 0.00,
       "shippingType": "",
       "shippingService": "",
       "shippingAddress": null,
       "totalTax": 0.00,
       "total": 0.00,
       "shippingTax": 0.00,
       "subTotalTax": 0.00,
       "couponCodes": ""
     }

     Response fail:
     empty posUserId:
     {
       "error": "1",
       "message": "Missing posUserId"
     }

     if cartId is empty:
     {
       "error": "1",
       "message": "cartId is empty."
     }

     if cartId is already paid (statuses: completed,shipped,delivered,partial):
     {
       "error": "1",
       "message": "This cart is already paid."
     }

     if cart content is empty:
     {
       "error": "1",
       "message": "Nothing to delete. Cart is empty."
     }

     if cartId not found:
     {
       "error": "1",
       "message": "Cart not found."
     }

generateReceipt - create PDF receipt link for purchase "cartId" param is required.
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cartId' => '2025'//required
    );

    Response success:
    {
      "error": "0",
      "receipt": "http://monaco-addict.loc/plugins/seosambapos/receipts/Receipt_dd265a96a1efab53aac5dbaebb9b0623.pdf",
      "fileName": "Receipt_dd265a96a1efab53aac5dbaebb9b0623.pdf",
      "folder": "/home/developer/www/monaco-addict.loc/plugins/seosambapos/receipts/"
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    if receipt template is not selected in config:
    {
      "error": "1",
      "message": "receiptTemplate is not provided in config."
    }

    if receipt template not found in system:
    {
      "error": "1",
      "message": "Template: receipt is not found in system. Please create template."
    }

    if cart not found in system:
    {
      "error": "1",
      "message": "cartId not found in store."
    }

emailReceipt - send email receipt after successful purchase by order ID. required "cartId,email"
    Params in request:
    array(
       'posUserId' => '1',
       'posUserEmail' => 'salesperson@mail.com',
       'cartId' => '1922'//required
       'email' => 'user@mail.com'//required
       'links' => ['https://mos.best/w3q5f', 'https://mos.best/9v1x6']
    );

    Response success:
    {
      "message": "An email has been sent"
    }

    Response fail:
    if cartId not found
    {
      "error": "1",
      "message": "cartId not found in store."
    }

   empty posUserId or cashRegisterId or locationId:
   {
     "error": "1",
     "message": "Missing posUserId or cashRegisterId or locationId"
   }

   posUserId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested user is not found!"
   }

   cashRegisterId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested cash register ID is not found!"
   }

  locationId not found in system:
  {
    "error": "1",
    "message": "You can not continue working with API. The requested cash location ID is not found!"
  }

   if session with posUserId is already active:
   {
     "error": "1",
     "message": "This session with posUserId-1 is already active."
   }

completePurchaseByCash - Complete purchase by cash. required "cartId"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cartId' => '1991'//required
    );

    Response success:
    {
      "error": "0",
      "cartId": "1991",
      "total": 890.00,
      "message": "completed"
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    posUserId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested user is not found!"
    }

    cashRegisterId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash register ID is not found!"
    }

    locationId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash location ID is not found!"
    }

    if session with posUserId is inactive:
    {
      "error": "1",
      "message": "This session with posUserId-1 is inactive."
    }

    if cartId is empty:
    {
      "error": "1",
      "message": "cartId is empty."
    }

    if cartId is already paid (statuses: completed,shipped,delivered,partial):
    {
      "error": "1",
      "message": "This cart is already paid."
    }

    if empty product(s) in cart:
    {
      "error": "1",
      "message": "Empty product(s) in cart. Can not complete purchase."
    }

    if cart not found in system:
    {
      "error": "1",
      "message": "Cart not found!"
    }

validateCart - Check if product location inventories are sold. required "cartId"
     Params in request:
        array(
            'posUserId' => '4',
            'posUserEmail' => 'salesperson@mail.com',
            'cartId' => '3',//required
        );

     Response success:
     {
       "error": "0",
       "message": "Checking successful."
     }

     Response fail:
     If product location inventory less than you add
     {
       "error": "1",
       "message": "The Fisher/Shafer NONMEM Workshop location inventory for Product someProduct-nameA is 4. Please reduce the quantity by 2"
     }

     If cart not found
     {
       "error": "1",
       "message": "Cart not found! Please relogin and add this product(s) again."
     }

getStripeTerminalToken - return Stripe terminal token
   Response success:
   {
     "secret":"pst_test_...........",
     "stripe_account_id":"acct_***",// return "" if empty
   }

   Response fail:
   {
     "error": "1",
     "message": "Stripe not configured."
   }

addShippingAddress - Add shipping address. required "customerId,address"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'customerId' => '234',//required
        'address' => array(//required
            'isDefaultCustomerAddress' => true,//false
            'address1' => '444 9th St',
            'address2' => '',
            'city' => 'Brooklyn',
            'zip' => '11215',
            'country' => 'US',
            'state' => 'New York',
        ),
    );

    Response success:
    {
      "id": "9b36c64bf927f04346d73a2ea9ebe1cb",
      "billingAddressId": "ffe6782367c652026e0e99c0198cdf9c",
      "isDefaultCustomerAddress": true,
      "streetAddress": "444 9th St ",
      "locality": "Brooklyn, NY, 22222, US",
      "region": "NY",
      "postalCode": "22222",
      "country": "US",
      "email": "m.a.evelyneproulx@gmail.com",
      "company": "",
      "phone": "",
      "mobile": "+15196703345"
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    empty customerId:
    {
      "error": "1",
      "message": "customerId is empty."
    }

    if user role is not customer:
    {
      "error": "1",
      "message": "User is not customer or member."
    }

    if user not found in system:
    {
      "error": "1",
      "message": "You can not set this shipping address. User not found"
    }

getShippingCustomerAddresses - return list of customer addresses. "customerId" param is required.
    Required params in request:
      array(
        'customerId' => '586'
      );

    Response success:
    {
        "addresses": [
            {
                "id": "8dc98d8bd85b03bd28787edcc46a4516",
                "isDefaultCustomerAddress": false,
                "streetAddress": "7004 W Archer Ave Unit B ",
                "locality": "Chicago, NY, 60638, US",
                "region": "NY",
                "postalCode": "60638",
                "country": "US",
                "email": "valentin@seosamba.com",
                "company": "",
                "phone": "12345678912",
                "mobile": "+3800964101035"
            },
            {
                "id": "b3da0c157e2590c8d04836fdbdebcd48",
                "isDefaultCustomerAddress": true,
                "streetAddress": "444 9th St ",
                "locality": "Brooklyn, NY, 11215, US",
                "region": "NY",
                "postalCode": "11215",
                "country": "US",
                "email": "valentin@seosamba.com",
                "company": "",
                "phone": "+380964101035",
                "mobile": "+380964101035"
            }
        ]
    }

    Response fail:
    if customer does not exist:
    {
      "error": "1",
      "message": "Can not found a customer"
    }

    Customer not found:
    {
      "error": "1",
      "message": "Customer not found"
    }

    Nothing to found:
    {
      "error": "1",
      "message": "Customer has no addresses"
    }

getShippingPriceValues. required "cartId,serviceName" (flatrateship,flatrateshipping,usps,ups,customshipping)
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cartId' => '1986',//required
        'serviceName' => 'flatrateship',//required
    );

    Response success:
    {
      "0": {
        "type": "UPS - Next Day Air Early AM",
        "price": "$172.98",
        "serviceName": "ups",
        "priceToCart": "172.98",
        "typeToCart": "Next Day Air Early AM"
      },
      "1": {
        "type": "UPS - Next Day Air",
        "price": "$137.73",
        "serviceName": "ups",
        "priceToCart": "137.73",
        "typeToCart": "Next Day Air"
      },
      "2": {
        "type": "UPS - 2nd Day Air",
        "price": "$63.31",
        "serviceName": "ups",
        "priceToCart": "63.31",
        "typeToCart": "2nd Day Air"
      },
      "3": {
        "type": "UPS - 3 Day Select",
        "price": "$51.63",
        "serviceName": "ups",
        "priceToCart": "51.63",
        "typeToCart": "3 Day Select"
      },
      "4": {
        "type": "UPS - Ground",
        "price": "$22.08",
        "serviceName": "ups",
        "priceToCart": "22.08",
        "typeToCart": "Ground"
      }
    }

    Response error:
    {
      "0": {
        "error": "Nothing was found, check the package weight or dimensions"
      }
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    if cartId is empty:
    {
      "error": "1",
      "message": "cartId is empty."
    }

    if service is empty:
    {
      "error": "1",
      "message": "service is empty."
    }

    if shipping plugin not found:
    {
      "error": "1",
      "message": "Plugin does not configured."
    }

    if cartId is already paid (statuses: completed,shipped,delivered,partial):
    {
      "error": "1",
      "message": "This cart is already paid."
    }

    if shipping plugin disabled in shipping config:
    {
      "error": "1",
      "message": "Plugin disabled in shipping config."
    }

    if shipping plugin does not exist or disabled in system:
    {
      "error": "1",
      "message": "Plugin does not exist or disabled."
    }

addCustomer - return created customer or return existed customer by email. Required params: email,firstName,lastName
   Available params in request:
     array(
         'posUserId' => '1',
         'posUserEmail' => 'salesperson@mail.com',
         'prefix' => 'Mr',
         'firstName' => 'John',//required
         'lastName' => 'Doe',//required
         'email' => 'johndoe@mail.com',//required
         'password' => '',//not required
         'timezone' => 'Europe/Kyiv',
         'phone' => '964444444',
         'mobileCountryCode' => 'UA',
         'desktopPhone' => '965555555',
         'desktopCountryCode' => 'UA',
         'isSubscribe' => true,//false
     );

   Response success:
   {
     "id": "592",
     "fullName": "John Doe",
     "email": "johndoe@mail.com",
     "phone": "+380964444444",
     "mobileCountryCode": "UA",
     "isSubscribe": true
   }

   Response fail:
   {
    "error": "1",
    "message": "Can not create a customer"
   }

   if empty email,firstName,lastName:
   {
     "error": "1",
     "message": "Missing customer params. Required: email/firstName/lastName"
   }

   empty posUserId:
   {
     "error": "1",
     "message": "Missing posUserId"
   }

   posUserId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested user is not found!"
   }

  cashRegisterId not found in system:
  {
    "error": "1",
    "message": "You can not continue working with API. The requested cash register ID is not found!"
  }

  locationId not found in system:
  {
    "error": "1",
    "message": "You can not continue working with API. The requested cash location ID is not found!"
  }

  if session with posUserId is inactive:
  {
    "error": "1",
    "message": "This session with posUserId-1 is inactive."
  }

getDefaultCustomer - return default customer which was saved in seosambapos general config
   Response success:
   {
    "id": "586",
    "fullName": "Valentin Vorobyov",
    "email": "vorobyovvalentin@gmail.com",
    "phone": "+380964101035",
    "mobileCountryCode": "UA",
    "isSubscribe": true
  }

   Response fail:
   if customer not found:
   {
     "error": "1",
     "message": "Default customer was deleted, please reassign the customer in config."
   }

   if default customer not assigned in config:
   {
     "error": "1",
     "message": "Default customer not assigned in the config"
   }

searchCustomer - return found customer. Search customer by "email,name,phone"
   Available params in request:
         array(
           'query' => 'valentin@seosamba.com',//vorobyov//+380964101036
         );

   Response success:
   {
     "0": {
       "id": "586",
       "fullName": "Valentin Vorobyov",
       "email": "valentin@seosamba.com",
       "phone": "+380964101036",
       "mobileCountryCode": "UA",
       "isSubscribe": true
     },
     "1": {
       "id": "594",
       "fullName": "Valentin1 Vorobyov1",
       "email": "vorobyovvalentin1@gmail.com",
       "phone": "",
       "mobileCountryCode": "US",
       "isSubscribe": false
     },
     "2": {
       "id": "595",
       "fullName": "Valentin111 Vorobyov111",
       "email": "vorobyovvalentin111@gmail.com",
       "phone": "+38096410104",
       "mobileCountryCode": "UA",
       "isSubscribe": false
     }
   }

   Response fail:
   empty email or name or phone:
   {
     "error": "1",
     "message": "Missing customer email or name or phone"
   }

   if customer not found:
   {
     "error": "1",
     "message": "Customer not found",
   }

addProduct - create product "sku,name,shortDescription,price" params is required. Params "brand,template" is requerd if these params did not saved in default product config.
    Request params:
    array (
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'product' => array(
            'name' => 'someProduct-name',
            'sku' => 'someproduct-name',//if empty, generate automatically
            'shortDescription' => 'shortDescription-product',
            'mpn' => 'someProduct-mpn',
            'gtin' => '',
            'imageUrl' => '',
            'condition' => 'new',
            'image' => array(
                'data' => "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",
                'name' => "someproduct-sku.jpeg"
            ),
            'weight' => '1.400',
            'taxClass' => '1',
            'tags' => array(
                'tag1-product',
                'tag2-product',
                'Gift'
            ),
            'inventory' => '1',
            'dimensions' => array(
               'width' => '5',
               'length' => '6',
               'depth' => '7',
            ),
            'brand' => 'Amstar',
            'nonTaxablePrice' => '2',
            'additionalImages' => array(
                array(
                    'data' => "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",
                    'name' => "additional-image1.jpeg"
                ),
                array(
                    'data' => "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",
                    'name' => "additional-image2.jpeg"
                ),
            ),
        )
    )

   Response success:
   {
     "id": "319",
     "name": "someProduct-nameA",
     "sku": "someproduct-nameA",
     "shortDescription": "shortDescription-productA",
     "mpn": "someProduct-mpn1",
     "gtin": "",
     "condition": "new",
     "imageUrl": "http://monaco-addict.loc/media/products/small/someproduct-namea.jpeg",
     "weight": 1.400,
     "taxClass": "1",
     "tax": {
       "id": "1",
       "label": "Default",
       "tax_value": 20.00
     },
     "inventory": 1,
     "locationId": "16",
     "locationInventories": {
       "0": {
         "locationId": "16",
         "locationName": "First store",
         "locationAddress": "1696 19th Ave",
         "inventory": 1
       }
     },
     "dimensions": {
       "width": 5.00,
       "length": 6.00,
       "depth": 7.00
     },
     "brand": "Amstar",
     "tags": {
       "0": "tag1-product",
       "1": "tag2-product",
       "2": "Gift"
     },
     "price": 10,
     "nonTaxablePrice": 12,
     "additionalImages": [
       "0": {
         "id": "6",
         "imageUrl": "http://monaco-addict.loc/plugins/productimages/web/images/product-images/11/thumbnails/someproductimage.jpeg"
       },
       "1": {
          "id": "7",
          "imageUrl": "http://monaco-addict.loc/plugins/productimages/web/images/product-images/11/thumbnails/otherproductimage.jpeg"
       }
    ]
   }

   Response fail:
   if prooduct exists:
   {
     "error": "1",
     "message": "You already have a product with this SKU"
   }

   if empty brand or not assigned in config:
   {
     "error": "1",
     "message": "Default brand not assigned in the config or not set in request"
   }

   if empty productName (name):
   {
     "error": "1",
     "message": "Product name is empty"
   }

   if empty price:
   {
     "error": "1",
     "message": "Product price is empty"
   }

   if empty product template or not assigned in config:
   {
     "error": "1",
     "message": "Default template not assigned in the config or not set in request or not found in system"
   }

   empty posUserId:
   {
     "error": "1",
     "message": "Missing posUserId"
   }

   posUserId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested user is not found!"
   }

   cashRegisterId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested cash register ID is not found!"
   }

   locationId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested cash location ID is not found!"
   }

   if session with posUserId is inactive:
   {
     "error": "1",
     "message": "This session with posUserId-1 is inactive."
   }

getDefaultProduct - return default product which was saved in seosambapos default product config
   Response success:
   {
     "id": "310",
     "name": "someProduct-name",
     "sku": "someproduct-name",
     "shortDescription": "shortDescription-product",
     "mpn": "someProduct-mpn",
     "gtin": "",
     "condition": "new",
     "imageUrl": "http://monaco-addict.loc/media/products/small/someproduct-sku.jpeg",
     "weight": 1.400,
     "taxClass": "1",
     "tax": {
       "id": "1",
       "label": "Default",
       "tax_value": 20.00
     },
     "inventory": 50,
     "dimensions": {
       "width": 5.00,
       "length": 6.00,
       "depth": 7.00
     },
     "brand": "Amstar",
     "price": 1.20,
     "nonTaxablePrice": 1,
     "additionalImages": [],
   }

   Response fail:
   if default product not assigned in config:
   {
     "error": "1",
     "message": "Default product not assigned in the config"
   }

   if product not found:
   {
     "error": "1",
     "message": "Default product was deleted, please reassign the product in config."
   }

getProductList - return list of products, "limit,locationId" params are required. Allowed search product by product name and sku. Use "searchParam". Allowed filter by "includeOutOfStock,productTags"
   OptionParams:
   includeOutOfStock - if provided, show products with 0 location inventory.
   productTags - array product tags ID's

   Available request params:
   array(
       'posUserId' => '1',
       'posUserEmail' => 'salesperson@mail.com',
       'limit' => 5,
       'offset' => 0,
       'searchParam' => '',//name or sku
       'locationId' => '17',
       'includeOutOfStock' => true,//false
       'productTags' => '1,2',
       'order' => 'name',//price
       'orderType' => 'ASC',//DESC
   )

   Response success:
   {
     "totalRecords": 2,
     "products": [
       "0": {
         "id": "1",
         "name": "Baby Bodysuit Bottle Rattle Pacifier Monaco Pink",
         "sku": "baby-bodysuit-bottle-rattle-pacifier-monaco-pink",
         "shortDescription": "Pink Monaco Bodysuit with small baby embroideries on the front (bottle, rattle & pacifier) with Monaco Monte-Carlo velvet style print.\nDetails: 190g lap shoulders baby suit - 1x1 rib - 100% combed cotton.\nPlease note that the 3 small embroideries can change according to availability.",
         "mpn": "baby-bodysuit-bottle-rattle-pacifier-monaco-pink",
         "gtin": "",
         "condition": "new",
         "imageUrl": "http://monaco-addict.loc/media/products/small/baby-bodysuit-bottle-rattle-pacifier-monaco-pink-front.jpg",
         "weight": 1.000,
         "taxClass": "1",
         "tax": {
           "id": "1",
           "label": "Default",
           "tax_value": 20.00
         },
         "inventory": 49,
         "locationId": "17",
         "locationInventories": {
           "0": {
             "locationId": "16",
             "locationName": "First store",
             "locationAddress": "1696 19th Ave",
             "inventory": 8
           },
           "1": {
             "locationId": "17",
             "locationName": "Second Store",
             "locationAddress": "218 Castenada Ave",
             "inventory": 5
           },
           "2": {
             "locationId": "18",
             "locationName": "Third store",
             "locationAddress": "500 Masonic Ave	",
             "inventory": 2
           }
         },
         "dimensions": {
             "width": 5.00,
             "length": 6.00,
             "depth": 7.00
         },
         "brand": "6eme sens",
         "tags": {
           "0": "tag",
           "1": "tag2"
         },
         "price": 16.80,
         "nonTaxablePrice": 16,
         "additionalImages": [
             "0": {
               "id": "6",
               "imageUrl": "http://monaco-addict.loc/plugins/productimages/web/images/product-images/11/thumbnails/someproductimage.jpeg"
             },
             "1": {
                "id": "7",
                "imageUrl": "http://monaco-addict.loc/plugins/productimages/web/images/product-images/11/thumbnails/otherproductimage.jpeg"
             }
         ],
       },
       "1": {
         "id": "316",
         "name": "someProduct-name22",
         "sku": "someProduct-sku22",
         "shortDescription": "shortDescription-product",
         "mpn": "someProduct-mpn22",
         "gtin": "",
         "condition": "new",
         "imageUrl": "http://monaco-addict.loc/media/products/small/someproduct-sku22.jpeg",
         "weight": "1.200",
         "taxClass": "1",
         "tax": {
           "id": "1",
           "label": "Default",
           "tax_value": 20.00
         },
         "inventory": 6,
         "locationId": "17",
         "locationInventories": {
           "0": {
             "locationId": "17",
             "locationName": "Second Store",
             "locationAddress": "218 Castenada Ave",
             "inventory": 0
           }
         },
         "dimensions": {
           "width": 5.00,
           "length": 6.00,
           "depth": 7.00
         },
         "brand": "Amstar",
         "tags": {
           "0": "tag"
         },
         "price": 1.20,
         "nonTaxablePrice": 1,
         "additionalImages": [],
       }
     ],
     "offset" => 0,
     "limit": 5
   }

   Response fail:
   {
     "error": "1",
     "message": "Missing query limit"
   }

   If locationId is empty:
   {
     "error": "1",
     "message": "Missing locationId"
   }

updateProduct - update product. Param "id" is required.
    OptionParams:
    photoFolder - if not provided the product image folder be "products".
    inventory - this is location inventory

    Request params:
    array (
        'posUserId' => '4',
        'posUserEmail' => 'salesperson@mail.com',
        'product' => array(
            'id' => '5',
            'name' => 'someProduct-nameA',
            'sku' => 'someproduct-nameA',
            'shortDescription' => 'shortDescription-productA',
            'mpn' => 'someProduct-mpnA',
            'gtin' => '',
            'condition' => 'new',
            'image' => array(
                'data' => "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCABQAFADASIAAhEBAxEB/8QAHAAAAgMBAQEBAAAAAAAAAAAAAAgBBwkGAgQD/8QANxAAAQMDAgQDBQYGAwAAAAAAAQIDBAAFEQYHCBIhMRNBURQyQmGBCSJxgpGhFTNykrTDVHSi/8QAGgEAAgMBAQAAAAAAAAAAAAAABAUDBgcACP/EADQRAAAEAwUECAYDAAAAAAAAAAABAgQDERIFBhMxkSFhcfAUFRZRobHB0QcXMkFCUiIzgf/aAAwDAQACEQMRAD8AqKiiivRA8xAqPy1NFcOBUetMJw2cKEze62ydWX6+u2ewMPmM0WGgt+U4ACvk5uiUjIGSDk5GOhq4r39nLp1xgnTm5dzjvcvQTYTb6T/YW8Ugc3ms5pGOBEXtLPYZy0Fha3VtN5AJxBh/xPLaRT1MI1RVx7qcKO7u1jL1yl2pq92hrKlTrWS6GkerjZAWj5nBA9apsHIzTVq9bvkYkBRKLcFDxi5Yrw3CDSe8Hn9KPSpoooCgooq5+ErayPunu/Bj3OOHbRY0G6T0qGUuchAbbPqFLKcjzSlVCvXSGLdUdeSSmCmLRb9yhvDzUchdfDdwU2C96Zj613jhS31XJCXYVnS84wGmT1DjxQQvnV3CQRgd8k4TwPFlw66Q2tYY1Zt/7RHty5IiS4DzxeDRWCUuNqXleOmCCT3GK0Fvl0btNuU/nB5elZ1cWe9CNZXpzb+zKC4lslh2fIB6OSEAgND5Jycn16eXXN7FtS07TtQlko6fuX4kXDkxqVuWPZVkWOaFIKrIj/I1cfMspBruB4Y4drH/ANud/kuVd0u6RYawhxxKSTjqapLgfyeHaxAf8ud/kuVyPG7OksbV3TwJDjS25cNaFoWQpJElvBBHY0ket+l2uuBOVSzLUxYbPc9CsSG4lOmGRy4EGcW2zcGSRg5pLOK/hZhhiZuLt1bURpjAMi5W1hOG5CO6nWkjs4O5SPe79/fjhF4r7vJvcLa7c65LlicsMWm6vry6HT7rDx+Lm7IUfvZwDnIIcy/wUTIS1Y6gVIfTbrvSL7+Ci50EKVML3MDOXuk+dRjKFJUMpqatHiT27Z253TnRbfHDVsu6P4jEQkYS3zkhxsfgsHA8gU1V1a+ycoewEx0ZKKYxN8zWwcrbxM0nIFPP9nLZWWtO6y1DypLsmbGh83mEttqXj9Xf2pGKef7OW9MO6d1lp4FIejTY0zl8ylxtSc/q1+9I73VdUxJbvMg/uVR1xDq7lS0MXbxBalf0zom93qP79utsiS2D5rQ2SB+oFZUpW66VPPLLjjhKnFqOSonqSa1f340o9q3RF8scYDxbjbZEVsnyWtshJ/UisoS26ypTL7S23WyW3EKGCkjoQR60luJh0Rf2mWnMxYPiJiYkH9ZHrsn6DSvgcmxHOHq1NokIUqJNmtPAH+WvxlKwfopJ+tcNxuXSI9tjcmQ4Ap2XEbbB+M+MlWB9Ek/SlI2w3t3D2idlDR11bRFnEKkQZLfix3VAYCuXIIVjplJB9c18e427Gtt1JjMnVtwaUzHJWzEjN+Ew2s91YyST8yTUh3Xcdb9MqKiqrfnOUhEV7mxWL0Gk8SmndlKc+HiOTYeejOtyYzq2nmlhxtaDhSVg5BB9c1sBtrqRzWu2um9UyQPGu9oizHsDAC1tJUofqTWP7DD0l5uNGZU686sNtoQMlSycAAeua1/23045onbPTulpPL41otEaI8QehcQ0Eq/9A1HfzDogy+qZ6bJ+gk+HeJixpfTItZnL1CbcedqZDOnLwEAOMTJEXPqHGwr/AFfvSj02XHbemXUaes4WC47NflY+TbYT/tpTac3Rq6rRPvPzMIr609brp7inoQj81XPwlbqR9rN34Mi6Sg1aL4g2ucpRwlvxCC24fQJWE5PklSqpmoIzT161hvm6m68lFIV1i7WwcocQ80nMbR3CG3PjFtQByOlIzxR8J9/N5mbi7b2tc1MtReudrYRl3xPN5lPx57lI656jOTjpuE7i3gy7dC2w3QuaY82MlMe1XWQvCJKB0Sy6o9nB0AWeihgH7/vOCHockdVJrIUqe3Ye5bfBRc6DbTJhe5gW33SfP+GMXXWnWHlsSG1tOtkocbWOVSSO4IPY1LDL0l5uNGacdddWEtttgqUonsAB3Na/ak2u211g57TqnQ9huz+MB6ZAadcA/rUM/vU6b20210U57TpfRFgtD2MeLEgtNOY/qSM/vVo7dw8P+k6uOzy9BUfl3FxJYxU8Nuk/UKhwk8JV6g3mFulujbFw/Ylh+02mQjDvi/C+8n4OXulJ65wTjHVudY3tq125aAsc6x2zX6XnVcC2MKCHQpePWkf4neJpFwEvQ+iLiH5TuWZ89lWUx0di22R3cPYke7+ParGb2874jMtvgkudRb0pYXSYGU/dR86CluIPX7e4W5k2ZDkeLbrWPYIqwejnISXHB+KycHzAFVx+aoSkISEpGAK9VrzFollATARkkpDEn7xb9ytxEzUcwUUUUWBB5IyPvVb+2nFNu1tnHatca7IvVpaAS3CuYLvhI9G3AQtA9BkgelVFRQrpm3epojpJRbwUzfOWK8Rus0nuDlWv7QOAtgfxvQVxju46+yTW3kk/nCcV8l84+IjrKk2TQ9xecI6e1S22QP7AqlAopJ2RsuqdB6n7ixdtLXppxC4yL2FmbicRe524yHYUy5otVtd6LiW/LfiD0ccJKz8xkA+lVilKUjlCcD5V6op20ZQGSKICSSW4V54/cvl4jhZqPeCiiiigIP/Z",
                'name' => "someproduct-sku.jpeg"
            ),
            'weight' => '1.400',
            'taxClass' => '1',
            'tags' => array(
                'tag1-product',
                'tag2-product',
                'Gift'
            ),
            'inventory' => '4',
            'dimensions' => array(
                'width' => '5',
                'length' => '6',
                'depth' => '7',
            ),
            'brand' => 'pos',
            'nonTaxablePrice' => '2',
            'photoFolder' => '',
            'deletedImagesIds' => array('16','17'),
            'additionalImages' => array(
                array(
                    'data' => "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",
                    'name' => "additional-image1.jpeg"
                ),
                array(
                    'data' => "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",
                    'name' => "additional-image2.jpeg"
                ),
            ),
        )
    );

   Response success:
   {
     "id": "5",
     "name": "someProduct-nameA",
     "sku": "someproduct-nameTAG",
     "shortDescription": "shortDescription-productA",
     "mpn": "someProduct-mpnA",
     "gtin": "",
     "condition": "new",
     "imageUrl": "http://monaco-addict.loc/media/products/small/someproduct-nametag.jpeg",
     "weight": 1,
     "taxClass": "1",
     "tax": {
       "id": "1",
       "label": "Default",
       "tax_value": 5
     },
     "inventory": 4,
     "locationId": "1",
     "locationInventories": {
       "0": {
         "locationId": "1",
         "locationName": "Boyd J Ball (test)",
         "locationAddress": "1696 19th Ave",
         "inventory": 1
       },
       "1": {
         "locationId": "2",
         "locationName": "Fisher/Shafer NONMEM Workshop (test)",
         "locationAddress": "218 Castenada Ave",
         "inventory": 3
       }
     },
     "dimensions": {
       "width": 5,
       "length": 6,
       "depth": 7
     },
     "brand": "pos",
     "tags": {
       "0": "tag1-product",
       "1": "tag2-product",
       "2": "Gift"
     },
     "price": 1,
     "nonTaxablePrice": 1.05,
     "additionalImages": [
        "0": {
          "id": "6",
          "imageUrl": "http://monaco-addict.loc/plugins/productimages/web/images/product-images/11/thumbnails/someproductimage.jpeg"
        },
        "1": {
           "id": "7",
           "imageUrl": "http://monaco-addict.loc/plugins/productimages/web/images/product-images/11/thumbnails/otherproductimage.jpeg"
        }
     ]
   }

   Response fail:
   empty posUserId:
   {
     "error": "1",
     "message": "Missing posUserId"
   }

   posUserId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested user is not found!"
   }

   cashRegisterId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested cash register ID is not found!"
   }

   locationId not found in system:
   {
     "error": "1",
     "message": "You can not continue working with API. The requested cash location ID is not found!"
   }

   if session with posUserId and cashRegisterId is inactive:
   {
     "error": "1",
     "message": "This session with posUserId-1 and cashRegisterId-3 is inactive."
   }

   if empty productId:
   {
     "error": "1",
     "message": "Product is not exist. Missing query mandatory productId"
   }

   if product SKU exists for other product:
   {
     "error": "1",
     "message": "SKU already exists for other product"
   }

   if product name is empty:
   {
     "error": "1",
     "message": "SKU already exists for other product"
   }

getLocations - return locations full list.
   Response success:
   {
     "0": {
       "price": "10.00",
       "id": "16",
       "name": "First store",
       "address1": "1234 Main Street",
       "address2": "",
       "zip": "94111",
       "country": "United States",
       "state": "OH",
       "city": "San Francisco",
       "working_hours": "a:7:{s:6:\"sunday\";s:0:\"\";s:6:\"monday\";s:0:\"\";s:7:\"tuesday\";s:0:\"\";s:9:\"wednesday\";s:0:\"\";s:8:\"thursday\";s:0:\"\";s:6:\"friday\";s:0:\"\";s:8:\"saturday\";s:0:\"\";}",
       "phone": "0964101025",
       "location_category_id": "1",
       "lat": "37.7898074",
       "lng": "-122.3923945",
       "weight": "",
       "external_id": "",
       "allowed_to_delete": "0",
       "cash_register_id": "1,2,3",
       "defaultTaxList": {
           "0": {
             "id": "0",
             "label": "Non taxable",
             "tax_value": 0.00
           },
           "1": {
             "id": "1",
             "label": "Default",
             "tax_value": 20.00
           },
           "2": {
             "id": "2",
             "label": "Alternative",
             "tax_value": 0.00
           },
           "3": {
             "id": "3",
             "label": "Alternative 2",
             "tax_value": 5.00
           }
       },
       "terminalLocationId": "tml_FW1......",
       "cashRegisters": {
         "0": {
           "id": "1",
           "label": "one Lane",
           "status": false
         },
         "1": {
           "id": "2",
           "label": "two Lane",
           "status": false
         },
         "2": {
           "id": "3",
           "label": "three lane",
           "status": true
         }
       },
       "lastConnected": "03/07/2024"
     },
     "1": {
       "price": "10.00",
       "id": "17",
       "name": "Second Store",
       "address1": "Проспект Гагарина 50",
       "address2": "50",
       "zip": "61001",
       "country": "Ukraine",
       "city": "Харьков",
       "working_hours": "a:7:{s:6:\"sunday\";s:0:\"\";s:6:\"monday\";s:0:\"\";s:7:\"tuesday\";s:0:\"\";s:9:\"wednesday\";s:0:\"\";s:8:\"thursday\";s:0:\"\";s:6:\"friday\";s:0:\"\";s:8:\"saturday\";s:0:\"\";}",
       "phone": "0964101025",
       "location_category_id": "1",
       "lat": "49.9757495",
       "lng": "36.2528916",
       "weight": "",
       "allowed_to_delete": "0",
       "cash_register_id": "2",
       "defaultTaxList": {
          "0": {
            "id": "0",
            "label": "Non taxable",
            "tax_value": 0.00
          },
          "1": {
            "id": "1",
            "label": "Default",
            "tax_value": 20.00
          },
          "2": {
            "id": "2",
            "label": "Alternative",
            "tax_value": 0.00
          },
          "3": {
            "id": "3",
            "label": "Alternative 2",
            "tax_value": 5.00
          }
       },
       "terminalLocationId": "tml_AS1......",
       "cashRegisters": {
         "0": {
           "id": "2",
           "label": "two lane",
           "status": false
         }
       }
     },
     "2": {
       "price": "10.00",
       "id": "18",
       "name": "Third store",
       "address1": "Проспект Гагарина 20",
       "address2": "20",
       "zip": "61001",
       "country": "Ukraine",
       "city": "Харьков",
       "working_hours": "a:7:{s:6:\"sunday\";s:0:\"\";s:6:\"monday\";s:0:\"\";s:7:\"tuesday\";s:0:\"\";s:9:\"wednesday\";s:0:\"\";s:8:\"thursday\";s:0:\"\";s:6:\"friday\";s:0:\"\";s:8:\"saturday\";s:0:\"\";}",
       "phone": "0964101025",
       "location_category_id": "1",
       "lat": "49.9801917",
       "lng": "36.2465256",
       "weight": "",
       "allowed_to_delete": "0",
       "cash_register_id": "3",
       "defaultTaxList": {
          "0": {
            "id": "0",
            "label": "Non taxable",
            "tax_value": 0.00
          },
          "1": {
            "id": "1",
            "label": "Default",
            "tax_value": 10.00
          },
          "2": {
            "id": "2",
            "label": "Alternative",
            "tax_value": 15.00
          },
          "3": {
            "id": "3",
            "label": "Alternative 2",
            "tax_value": 20.00
          }
       },
       "terminalLocationId": "",
       "cashRegisters": {
         "0": {
           "id": "3",
           "label": "three lane",
           "status": false
         }
       },
       "lastConnected": ""
     }
   }

  Response fail:
  {
    "error": "1",
    "message": "Nothing to found"
  }

getStoreInfo - return store info (currency,weight unit,length unit,country,shippingServices,defaultTaxList,mobile cuntry codes).
    Response success:
    {
      "pk": "pk_...",// return "not configured" if empty
      "stripe_account_id": "acct_***",// return "" if empty
      "shippingServices": {
        "0": {
          "name": "customshipping",
          "title": "",
          "restrictedType": "",
          "restrictZones": ""
        },
        "1": {
          "name": "flatrateship",
          "title": "Delivery by Post (with tracking)",
          "restrictedType": "",
          "restrictZones": ""
        },
        "2": {
          "name": "flatrateshipping",
          "title": "Delivery by Post (without tracking)",
          "restrictedType": "",
          "restrictZones": ""
        },
        "3": {
          "name": "ups",
          "title": "",
          "restrictedType": "0",
          "restrictZones": ""
        }
      },
      "currency": "USD",
      "currencySign": "$",
      "weightUnit": "kg",
      "lengthUnit": "cm",
      "defaultTaxList": {//will be removed on next release
        "0": {
          "id": "0",
          "label": "Non taxable",
          "tax_value": 0.00
        },
        "1": {
          "id": "1",
          "label": "Default",
          "tax_value": 20.00
        },
        "2": {
          "id": "2",
          "label": "Alternative",
          "tax_value": 0.00
        },
        "3": {
          "id": "3",
          "label": "Alternative 2",
          "tax_value": 5.00
        }
      },
      "country": "US",
      "wordCountAiShortDescription": "150",
      "wordCountAiFullDescription": "500",
      "mobileCountryCodes": {
          "AC": "+247",
          "AD": "+376",
          "AE": "+971",
          "AF": "+93",
          "AG": "+1",
          "AI": "+1",
          "AL": "+355",
          "AM": "+374",
          "AN": "+599",
          "AO": "+244",
          "AQ": "+672",
          "AR": "+54",
          "AS": "+1",
          "AT": "+43",
          "AU": "+61",
          "AW": "+297",
          "AX": "+358",
          "AZ": "+994",
          "BA": "+387",
          "BB": "+1",
          "BD": "+880",
          "BE": "+32",
          "BF": "+226",
          "BG": "+359",
          "BH": "+973",
          "BI": "+257",
          "BJ": "+229",
          "BL": "+590",
          "BM": "+1",
          "BN": "+673",
          "BO": "+591",
          "BR": "+55",
          "BS": "+1",
          "BT": "+975",
          "BW": "+267",
          "BY": "+375",
          "BZ": "+501",
          "CA": "+1",
          "CC": "+61",
          "CD": "+243",
          "CF": "+236",
          "CG": "+242",
          "CH": "+41",
          "CI": "+225",
          "CK": "+682",
          "CL": "+56",
          "CM": "+237",
          "CN": "+86",
          "CO": "+57",
          "CR": "+506",
          "CU": "+53",
          "CV": "+238",
          "CX": "+61",
          "CY": "+357",
          "CZ": "+420",
          "DE": "+49",
          "DJ": "+253",
          "DK": "+45",
          "DM": "+1",
          "DO": "+1",
          "DZ": "+213",
          "EC": "+593",
          "EE": "+372",
          "EG": "+20",
          "ER": "+291",
          "ES": "+34",
          "ET": "+251",
          "FI": "+358",
          "FJ": "+679",
          "FK": "+500",
          "FM": "+691",
          "FO": "+298",
          "FR": "+33",
          "GA": "+241",
          "GB": "+44",
          "GD": "+1",
          "GE": "+995",
          "GF": "+594",
          "GG": "+44",
          "GH": "+233",
          "GI": "+350",
          "GL": "+299",
          "GM": "+220",
          "GN": "+224",
          "GP": "+590",
          "GQ": "+240",
          "GR": "+30",
          "GT": "+502",
          "GU": "+1",
          "GW": "+245",
          "GY": "+592",
          "HK": "+852",
          "HN": "+504",
          "HR": "+385",
          "HT": "+509",
          "HU": "+36",
          "ID": "+62",
          "IE": "+353",
          "IL": "+972",
          "IM": "+44",
          "IN": "+91",
          "IO": "+246",
          "IQ": "+964",
          "IR": "+98",
          "IS": "+354",
          "IT": "+39",
          "JE": "+44",
          "JM": "+1",
          "JO": "+962",
          "JP": "+81",
          "KE": "+254",
          "KG": "+996",
          "KH": "+855",
          "KI": "+686",
          "KM": "+269",
          "KN": "+1",
          "KP": "+850",
          "KR": "+82",
          "KW": "+965",
          "KY": "+1",
          "KZ": "+7",
          "LA": "+856",
          "LB": "+961",
          "LC": "+1",
          "LI": "+423",
          "LK": "+94",
          "LR": "+231",
          "LS": "+266",
          "LT": "+370",
          "LU": "+352",
          "LV": "+371",
          "LY": "+218",
          "MA": "+212",
          "MC": "+377",
          "MD": "+373",
          "ME": "+382",
          "MG": "+261",
          "MH": "+692",
          "MK": "+389",
          "ML": "+223",
          "MM": "+95",
          "MN": "+976",
          "MO": "+853",
          "MP": "+1",
          "MQ": "+596",
          "MR": "+222",
          "MS": "+1",
          "MT": "+356",
          "MU": "+230",
          "MV": "+960",
          "MW": "+265",
          "MX": "+52",
          "MY": "+60",
          "MZ": "+258",
          "NA": "+264",
          "NC": "+687",
          "NE": "+227",
          "NF": "+672",
          "NG": "+234",
          "NI": "+505",
          "NL": "+31",
          "NO": "+47",
          "NP": "+977",
          "NR": "+674",
          "NU": "+683",
          "NZ": "+64",
          "OM": "+968",
          "PA": "+507",
          "PE": "+51",
          "PF": "+689",
          "PG": "+675",
          "PH": "+63",
          "PK": "+92",
          "PL": "+48",
          "PM": "+508",
          "PR": "+1",
          "PS": "+972",
          "PT": "+351",
          "PW": "+680",
          "PY": "+595",
          "QA": "+974",
          "RE": "+262",
          "RO": "+40",
          "RS": "+381",
          "RU": "+7",
          "RW": "+250",
          "SA": "+966",
          "SB": "+677",
          "SC": "+248",
          "SD": "+249",
          "SE": "+46",
          "SG": "+65",
          "SH": "+290",
          "SI": "+386",
          "SJ": "+47",
          "SK": "+421",
          "SL": "+232",
          "SM": "+378",
          "SN": "+221",
          "SO": "+252",
          "SR": "+597",
          "SS": "+211",
          "ST": "+239",
          "SV": "+503",
          "SY": "+963",
          "SZ": "+268",
          "TC": "+1",
          "TD": "+235",
          "TF": "+262",
          "TG": "+228",
          "TH": "+66",
          "TJ": "+992",
          "TK": "+690",
          "TL": "+670",
          "TM": "+993",
          "TN": "+216",
          "TO": "+676",
          "TR": "+90",
          "TT": "+1",
          "TV": "+688",
          "TW": "+886",
          "TZ": "+255",
          "UA": "+380",
          "UG": "+256",
          "US": "+1",
          "UY": "+598",
          "UZ": "+998",
          "VA": "+39",
          "VC": "+1",
          "VE": "+58",
          "VG": "+1",
          "VI": "+1",
          "VN": "+84",
          "VU": "+678",
          "WF": "+681",
          "WS": "+685",
          "YE": "+967",
          "YT": "+262",
          "ZA": "+27",
          "ZM": "+260",
          "ZW": "+263"
      },
      "brands": {
         "0": "pos",
         "1": "pos2",
      },
      "tags": {
         "0": "tag",
         "1": "tag2",
         "2": "tag3",
      },
      "conditions": {
        "0": "New",
        "1": "Refurbished",
        "2": "Used"
      },
      "successfulPurchaseExists": true,//false
    }

    Response fail:
    {}

getProductTagsByLocation - Get product tags list by location ID. required "locationId"
    Required params in request:
        array(
            'locationId' => '17',
        );

    Response success:
    {
      "0": {
        "id": "1",
        "name": "baby"
      },
      "1": {
        "id": "2",
        "name": "bodysuit"
      },
      "2": {
        "id": "3",
        "name": "bottle"
      },
      "3": {
        "id": "4",
        "name": "rattle"
      },
      "4": {
        "id": "5",
        "name": "pacifier"
      },
      "5": {
        "id": "6",
        "name": "monaco"
      },
      "6": {
        "id": "7",
        "name": "pink"
      },
      "7": {
        "id": "8",
        "name": "present"
      },
      "8": {
        "id": "9",
        "name": "newborn"
      },
      "9": {
        "id": "10",
        "name": "customisable"
      },
      "10": {
        "id": "47",
        "name": "Patch"
      },
      "11": {
        "id": "131",
        "name": "embroidery"
      },
      "12": {
        "id": "170",
        "name": " monte-carlo"
      },
      "13": {
        "id": "172",
        "name": " cute"
      },
      "14": {
        "id": "173",
        "name": " girly"
      },
      "15": {
        "id": "220",
        "name": "Gift"
      },
      "16": {
        "id": "231",
        "name": "Toddler"
      },
      "17": {
        "id": "232",
        "name": "Babygirl"
      },
      "18": {
        "id": "259",
        "name": "tag1-product"
      },
      "19": {
        "id": "260",
        "name": "tag2-product"
      }
    }

    Response fail:
    {
      "0": {
        "id": "",
        "name": ""
      }
    }

    empty locationId:
    {
      "error": "1",
      "message": "locationId not provided"
    }

getStripeIntent - return Stripe intent for cart "cartId" param is required.
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'cartId' => '2024'//required
    );

    Response success:
    {
      "intent": "pi_...",
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    if cartId is already paid (statuses: completed,shipped,delivered,partial):
    {
      "error": "1",
      "message": "This cart is already paid."
    }

    if cartId is empty:
    {
      "error": "1",
      "message": "cartId is empty."
    }

    if cart not found in system:
    {
      "error": "1",
      "message": "cartId not found in store."
    }

    if store currency is empty:
    {
      "error": "1",
      "message": "Store currency is empty"
    }

    if cart amount is empty:
    {
      "error": "1",
      "message": "Cart amount is empty"
    }

    if can not get stripe intent.
    {
      "error": "1",
      "message": "Can not get stripe intent."
    }

getReviewLinks - return list of review request social network links.
   //Retured data from mojo

   Response success:
   [
       {
           "link": "https://mos.best/zz47b",
           "title": "Appleapps",
           "iconLink": ""
       },
       {
           "link": "https://mos.best/5i2w2",
           "title": "Facebook",
           "iconLink": "https://www.google.com/s2/favicons?sz=128&domain_url=facebook.com"
       },
       {
           "link": "https://mos.best/mn18b",
           "title": "Google My Business",
           "iconLink": "https://www.google.com/s2/favicons?sz=128&domain_url=google.com/business"
       }
   ]

sendReviewLink - send review social network link to customer. required "cartId,links,recipient". Does not work for default customer.
     Params in request:
     array(
         'posUserId' => '1',
         'posUserEmail' => 'salesperson@mail.com',
         'cartId' => '2024',//required
         'isEmail' => 'true',
         'recipient' => 'vorobyovvalentin@gmail.com',//+380964101035    //required
         'links' => ['https://mos.best/w3q5f', 'https://mos.best/9v1x6']//required
     );

     Response success:
     {
       "error": "0",
       "message": "The review link(s) has been sent"
     }

     Response fail:
     empty posUserId:
     {
       "error": "1",
       "message": "Missing posUserId"
     }

     if cartId is empty:
     {
       "error": "1",
       "message": "cartId is empty."
     }

     if cartId is already paid (statuses: completed,shipped,delivered,partial):
     {
       "error": "1",
       "message": "This cart is already paid."
     }

     if links are empty:
     {
       "error": "1",
       "message": "Nothing to send."
     }

     if recipient are empty:
     {
       "error": "1",
       "message": "Recipient is empty."
     }

     if phone number not valid
     {
       "error": "1",
       "message": "Not valid phone number"
     }

     if email not valid
     {
       "error": "1",
       "message": "Not valid email"
     }

     if review Link email trigger not found
     {
       "error": "1",
       "message": "Review Link email trigger not found in system"
     }

     if review Link sms trigger not found
     {
       "error": "1",
       "message": "Review Link sms trigger not found in system"
     }

getDefaultTaxList - return shopping taxes list
  Response success:
  {
    "0": {
      "id": "0",
      "label": "Non taxable",
      "tax_value": 0.00
    },
    "1": {
      "id": "1",
      "label": "Default",
      "tax_value": 20.00
    },
    "2": {
      "id": "2",
      "label": "Alternative",
      "tax_value": 0.00
    },
    "3": {
      "id": "3",
      "label": "Alternative 2",
      "tax_value": 5.00
    }
  }

  Response fail:
  {
    "error": "1",
    "message": "No taxes found in the system"
  }

getLibraryOptionsList - return shopping library options list
    Optional params in request:
      array(
        'withoutSelections' => '1'
      );

    Response success:
    with withoutSelections param = 1
    {
      "0": {
        "id": "971",
        "title": "Product Size",
        "type": "dropdown"
      },
      "1": {
        "id": "973",
        "title": "Product Field",
        "type": "text"
      }
    }

    with withoutSelections param = 0
    {
      "0": {
        "id": "971",
        "parentId": "0",
        "title": "Product Size",
        "type": "dropdown",
        "selection": {
          "0": {
            "id": "2642",
            "option_id": "971",
            "title": "select",
            "priceSign": "+",
            "priceValue": "0.0000",
            "priceType": "unit",
            "weightSign": "+",
            "weightValue": "0.000",
            "isDefault": "1"
          },
          "1": {
            "id": "2643",
            "option_id": "971",
            "title": "small",
            "priceSign": "+",
            "priceValue": "1.0000",
            "priceType": "unit",
            "weightSign": "+",
            "weightValue": "0.000",
            "isDefault": "0"
          },
          "2": {
            "id": "2644",
            "option_id": "971",
            "title": "medium",
            "priceSign": "+",
            "priceValue": "2.0000",
            "priceType": "unit",
            "weightSign": "+",
            "weightValue": "0.000",
            "isDefault": "0"
          },
          "3": {
            "id": "2645",
            "option_id": "971",
            "title": "large",
            "priceSign": "+",
            "priceValue": "3.0000",
            "priceType": "unit",
            "weightSign": "+",
            "weightValue": "0.000",
            "isDefault": "0"
          }
        }
      },
      "1": {
        "id": "973",
        "parentId": "0",
        "title": "Product Field",
        "type": "text"
      }
    }

    Response fail:
     {}

getLibraryOptionById - return shopping library option by ID. "libraryOptionId" param is required.
    Required params in request:
      array(
        'libraryOptionId' => '971'
      );

    Response success:
    {
      "0": {
        "id": "971",
        "parentId": "0",
        "title": "Product Size",
        "type": "dropdown",
        "selection": {
          "0": {
            "id": "2642",
            "option_id": "971",
            "title": "select",
            "priceSign": "+",
            "priceValue": "0.0000",
            "priceType": "unit",
            "weightSign": "+",
            "weightValue": "0.000",
            "isDefault": "1"
          },
          "1": {
            "id": "2643",
            "option_id": "971",
            "title": "small",
            "priceSign": "+",
            "priceValue": "1.0000",
            "priceType": "unit",
            "weightSign": "+",
            "weightValue": "0.000",
            "isDefault": "0"
          },
          "2": {
            "id": "2644",
            "option_id": "971",
            "title": "medium",
            "priceSign": "+",
            "priceValue": "2.0000",
            "priceType": "unit",
            "weightSign": "+",
            "weightValue": "0.000",
            "isDefault": "0"
          },
          "3": {
            "id": "2645",
            "option_id": "971",
            "title": "large",
            "priceSign": "+",
            "priceValue": "3.0000",
            "priceType": "unit",
            "weightSign": "+",
            "weightValue": "0.000",
            "isDefault": "0"
          }
        }
      }
    }

getOptionDropdownRadioNewSelection - return new Dropdown or Radio default option selection
    Response success:
    {
      "title": "",
      "priceSign": "+",
      "priceType": "percent",
      "priceValue": "0.0000",
      "weightSign": "+",
      "weightValue": "0.0000",
      "isDefault": "0"
    }

getCashRegisterList - return Cash register list
    Response success:
    {
      "1": "one Label",
      "2": "two Label",
      "3": "three Label"
    }

subscribeCustomer - subscribe customer (not default customer). required "customerId".
    Params in request:
    array(
       'posUserId' => '1',
       'posUserEmail' => 'salesperson@mail.com',
       'customerId' => '586'//required
    );

    Response success:
    {
      "message": "Subscribed"
    }

    Response fail:
    empty posUserId:
    {
      "error": "1",
      "message": "Missing posUserId"
    }

    empty customerId:
    {
      "error": "1",
      "message": "Missing customerId"
    }

    posUserId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested user is not found!"
    }

    cashRegisterId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash register ID is not found!"
    }

    locationId not found in system:
    {
      "error": "1",
      "message": "You can not continue working with API. The requested cash location ID is not found!"
    }

    if session with posUserId is already active:
    {
      "error": "1",
      "message": "This session with posUserId-1 is already active."
    }

    if customer is default customer in config:
    {
      "error": "1",
      "message": "You can not subscribe default customer"
    }

    if customer has admin or superadmin role:
    {
      "error": "1",
      "message": "Can not subscribe customer who has admin or superadmin role."
    }

    if customer not found in system:
    {
      "error": "1",
      "message": "Can not subscribe customer. The customer is not found in the system"
    }

isStoreOpen - check if store open.
    Response success:
    {}

    Response fail:
    is store closed:
    {
      "error": "1",
      "message": "Online ordering unavailable"
    }

    is store disabled:
    {
      "error": "1",
      "message": "Online ordering unavailable"
    }

isProductAvailable - Check if product be able to add to checkout. required "produuctId".
    Required params in request:
    array(
        array(
            'produuctId' => '1',
            'qty' => '3',
        ),
        array(
            'produuctId' => '2',
            'qty' => '1',
        ),
    );

    Response success:
    {}

    Response fail:
    is store closed:
    {
      "error": "1",
      "message": "Online ordering unavailable"
    }

    is store disabled:
    {
      "error": "1",
      "message": "Online ordering unavailable"
    }

    if empty produuctId param:
    {
      "error": "1",
      "message": "Missing produuctId param"
    }

    if product not found by produuctId param:
    {
      "error": "1",
      "productId": "2",
      "message": "Product not found"
    }

    if product disabled:
    {
      "error": "1",
      "productId": "1",
      "productSku": "baby-bodysuit-bottle-rattle-pacifier-monaco-pink",
      "message": "This product is not available. Product disabled."
    }

    if the product qty less than the minimum order qty limit:
    {
      "error": "1",
      "productId": "1",
      "productSku": "baby-bodysuit-bottle-rattle-pacifier-monaco-pink",
      "message": "You can add minimum $minimumOrder products"
    }

    if the product qty less than what you are trying to add to the checkout (if minimum order param is set):
    {
      "error": "1",
      "productId": "1",
      "productSku": "baby-bodysuit-bottle-rattle-pacifier-monaco-pink",
      "message": "You can\'t buy this product. Products left less than minimum quantity."
    }

    if the product qty less than 0 and negative stock is disabled:
    {
      "error": "1",
      "productId": "1",
      "productSku": "baby-bodysuit-bottle-rattle-pacifier-monaco-pink",
      "stock": "0",
      "message": "The requested product is out of stock"
    }

    if the product qty less than what you are trying to add to the checkout:
    {
      "error": "1",
      "productId": "1",
      "productSku": "baby-bodysuit-bottle-rattle-pacifier-monaco-pink",
      "stock": "2",
      "message": "The requested quantity is not available"
    }

getProductBrandsList - return product brands list.
    Response success:
    {
      "2": "L6",
      "3": "Prestifrance",
      "4": "Amstar",
      "5": "Latitude 6",
      "6": "Molipor",
      "7": "Makers",
      "8": "Payper",
      "9": "Spot",
      "10": "Gazzoil",
      "11": "La Verdiane",
      "12": "Nemery",
      "13": "As de Cœur",
      "14": "Riviera Diffusion",
      "15": "6eme sens"
    }

    Response fail:
    {
      "error": "1",
      "message": "Product brands not found in store."
    }

getDefaultCustomerConfig - Get customer list and default saved customer from config if exists
    Response success:
    {
      "defaultCustomerId": "5",
      "customersList": {
        "0": {
          "id": "5",
          "fullName": "POS default customer",
          "email": "posdefaultcustomer@seosamba.com"
        },
        "1": {
          "id": "9",
          "fullName": "John Doe",
          "email": "johndoe@mail.com"
        },
        "2": {
          "id": "10",
          "fullName": "James Walsh",
          "email": "jwalsh@mail.com"
        }
      }
    }

    Response fail:
    {
      "error": "1",
      "message": "No clients were found in the system"
    }

setDefaultCustomerConfig - Save default customer to toaster config. Required "defaultCustomerId"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'defaultCustomerId' => '9'//required
    );

    Response success:
    {
      "defaultCustomerId": "9",
      "customersList": {
        "0": {
          "id": "5",
          "fullName": "POS default customer",
          "email": "posdefaultcustomer@seosamba.com"
        },
        "1": {
          "id": "9",
          "fullName": "John Doe",
          "email": "johndoe@mail.com"
        },
        "2": {
          "id": "10",
          "fullName": "James Walsh",
          "email": "jwalsh@mail.com"
        }
      }
    }

    Response fail:
    if empty defaultCustomerId
    {
      "error": "1",
      "message": "Missing defaultCustomerId"
    }

    if customer not found
    {
      "error": "1",
      "message": "Customer with this ID not found in the system"
    }

    {
      "error": "1",
      "message": "No clients were found in the system"
    }

getDefaultSalespersonConfig - Get salespersons list and default saved salesperson from config if exists.
    Response success:
    {
      "defaultSalespersonId": "4",
      "salespersonsList": {
        "0": {
          "id": "2",
          "fullName": "Kim Le",
          "email": "kimlee@mail.com"
        },
        "1": {
          "id": "3",
          "fullName": "Justin Ford",
          "email": "jford@mail.com"
        },
        "2": {
          "id": "4",
          "fullName": "Default PosSales",
          "email": "defsales@mail.com"
        }
      }
    }

    Response fail:
    {
      "error": "1",
      "message": "No salespersons were found in the system"
    }

setDefaultSalespersonConfig - Save default salesperson to toaster config. Required "defaultSalespersonId"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'defaultSalespersonId' => '4'//required
    );

    Response success:
    {
      "defaultSalespersonId": "4",
      "salespersonsList": {
        "0": {
          "id": "2",
          "fullName": "Kim Le",
          "email": "kimlee@mail.com"
        },
        "1": {
          "id": "3",
          "fullName": "Justin Ford",
          "email": "jford@mail.com"
        },
        "2": {
          "id": "4",
          "fullName": "Default PosSales",
          "email": "defsales@mail.com"
        }
      }
    }

    Response fail:
    if empty defaultSalespersonId
    {
      "error": "1",
      "message": "Missing defaultSalespersonId"
    }

    if customer not found
    {
      "error": "1",
      "message": "Salesperson with this ID not found in the system"
    }

    {
      "error": "1",
      "message": "No clients were found in the system"
    }

getReceiptTemplateConfig - Get receipt templates list and saved receipt template from config if exists.
    Response success:
    {
      "receiptTemplate": "receipt",
      "receiptTemplateList": {
        "0": "receipt",
        "1": "receipt2"
      }
    }

    Response fail:
    {
      "error": "1",
      "message": "No receipt templates were found in the system"
    }

setReceiptTemplateConfig - Save receipt template to toaster config. Required "receiptTemplate"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'receiptTemplate' => 'receipt'//required
    );

    Response success:
    {
      "receiptTemplate": "receipt",
      "receiptTemplateList": {
        "0": "receipt",
        "1": "receipt2"
      }
    }

    Response fail:
    if empty receiptTemplate
    {
      "error": "1",
      "message": "Missing receiptTemplate"
    }

    if receipt template not found
    {
      "error": "1",
      "message": "Requested receipt template not found in the system"
    }

    {
      "error": "1",
      "message": "No receipt templates were found in the system"
    }

getDefaultProductBrandConfig - Get product brands list and saved default product brand from config if exists.
    Response success:
    {
      "brandId": 9,
      "brandsList": {
        "0": {
          "id": 9,
          "name": "Amstar"
        },
        "1": {
          "id": 12,
          "name": "Apple"
        },
        "2": {
          "id": 18,
          "name": "Bigfun"
        }
      }
    }

    Response fail:
    {
      "error": "1",
      "message": "No brands were found in the system"
    }

setDefaultProductBrandConfig - Save default product brand to toaster config. Required "brandId"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'brandId' => '12'//required
    );

    Response success:
    {
      "brandId": 12,
      "brandsList": {
        "0": {
          "id": 9,
          "name": "Amstar"
        },
        "1": {
          "id": 12,
          "name": "Apple"
        },
        "2": {
          "id": 18,
          "name": "Bigfun"
        }
      }
    }

    Response fail:
    if empty brandId
    {
      "error": "1",
      "message": "Missing brandId"
    }

    if brand not found
    {
      "error": "1",
      "message": "Requested brand not found in the system"
    }

getDefaultProductTaxConfig - Get product tax list and saved default product tax from config if exists.
    Response success:
    {
      "taxId": "0",
      "taxList": {
        "0": {
          "id": 0,
          "name": "Non taxable"
        },
        "1": {
          "id": 1,
          "name": "Default 5.00 %"
        },
        "2": {
          "id": 2,
          "name": "Alternative 10.00 %"
        },
        "3": {
          "id": 3,
          "name": "Alternative 2 15.00 %"
        }
      }
    }

    Response fail:
    {
      "error": "1",
      "message": "No taxes were found in the system"
    }

setDefaultProductTaxConfig - Save default product tax to toaster config. Required "taxId"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'taxId' => '1'//required
    );

    Response success:
    {
      "taxId": "1",
      "taxList": {
        "0": {
          "id": 0,
          "name": "Non taxable"
        },
        "1": {
          "id": 1,
          "name": "Default 5.00 %"
        },
        "2": {
          "id": 2,
          "name": "Alternative 10.00 %"
        },
        "3": {
          "id": 3,
          "name": "Alternative 2 15.00 %"
        }
      }
    }

getDefaultProductTemplateConfig - Get product templates list and saved default product template from config if exists.
    Response success:
    {
      "defaultProductTemplate": "product",
      "defaultProductTemplateList": {
        "0": "product",
        "1": "product - quote"
      }
    }

    Response fail:
    {
      "error": "1",
      "message": "No product templates were found in the system"
    }

setDefaultProductTemplateConfig - Save default product template to toaster config. Required "productTemplate"
    Params in request:
    array(
        'posUserId' => '1',
        'posUserEmail' => 'salesperson@mail.com',
        'productTemplate' => 'product'//required
    );

    Response success:
    {
      "defaultProductTemplate": "product",
      "defaultProductTemplateList": {
        "0": "product",
        "1": "product - quote"
      }
    }

    Response fail:
    if empty productTemplate
    {
      "error": "1",
      "message": "Missing productTemplate"
    }

    if template not found
    {
      "error": "1",
      "message": "Requested template not found in the system"
    }

isPosPluginExist - Check if plugin seosambapos exist.
    Response success:
    {
      "error": "0",
      "done": true,
      "message": "The plugin exists in the system"
    }

getOrderInfo - Get purchase info. required "cartId"
    Params in request:
       array(
           'cartId' => '123',
       );

    Response success:
    {
      "cartId": "443",
      "cartStatus": "completed",
      "purchasedOn": "12 Nov, 2025",
      "additionalInfo": "Paid by cash",
      "salesInfo": {
        "salesName": "valentin vorobyov",
        "salesLocation": "Fisher/Shafer NONMEM Workshop",
        "salesCashier": "terminal -3"
      },
      "products": {
        "0": {
          "productId": "7",
          "productSku": "Brass Blade",
          "productName": "Antique GE Brass Blade 3-Speed Fan AUU 272223 Vintage 4-Blade in Working Cond.",
          "productQty": 1,
          "productPrice": 12,
          "imageUrl": "http://monaco-addict.loc/media/products/small/blade.webp"
        }
      },
      "subTotal": 10,
      "discount": 0,
      "discountTax": 0,
      "shippingPrice": 2,
      "shippingType": "Type -1",
      "shippingService": "Custom Shipping",
      "shippingAddress": {
        "id": "927835bae1b913295d7ccf5033ef74e8",
        "isDefaultCustomerAddress": false,
        "streetAddress": "2300 Woodcrest Pl addresss 2",
        "locality": "Birmingham, AL, 35209, US",
        "region": "AL",
        "postalCode": "35209",
        "country": "US",
        "email": "posdefaultcustomer@seosamba.com",
        "company": "",
        "phone": "+11234567",
        "mobile": "+12345678"
      },
      "totalTax": 2,
      "total": 14,
      "shippingTax": 0,
      "subTotalTax": 2
    }

//deprecated will remove on next relese
addProductAdditionalPictures - Add additional pictures for product. Param "productId,images" are required.
       Params in request:
       array(
           'productId' => '4',
           'images' => array(
               0 => array(
                   'data' => "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",
                   'name' => "someproductimage.jpeg"
               ),
               1 => array(
                   'data' => "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",
                   'name' => "other-product-image.jpeg"
               ),
           ),
       );

       Response success:
       {
        "errorMsg": "",
        "images": [
           "0": {
             "id": "6",
             "productId": "11",
             "imageUrl": "http://monaco-addict.loc/plugins/productimages/web/images/product-images/11/thumbnails/someproductimage.jpeg",
             "fileName": "someproductimage.jpeg",
             "orderNumber": "0"
           }
        ]
      }

      Response fail:
      if empty productId
      {
        "error": "1",
        "message": "Product is not exist. Missing query mandatory productId"
      }

      if empty requested images
      {
        "error": "1",
        "message": "Product images are empty."
      }

//deprecated will remove on next relese
getProductAdditionalPictures - Get a list of product additional pictures. Param "productId" is required.
       Params in request:
       array(
           'productId' => '123',
       );

       Response success:
       {
         "errorMsg": "",
         "images": [
            "0": {
              "id": "6",
              "productId": "11",
              "imageUrl": "http://monaco-addict.loc/plugins/productimages/web/images/product-images/11/thumbnails/someproductimage.jpeg",
              "fileName": "someproductimage.jpeg",
              "orderNumber": "0"
            }
         ]
       }

       Response fail:
       if empty productId
       {
         "error": "1",
         "message": "Product is not exist. Missing query mandatory productId"
       }

//deprecated will remove on next relese
deleteProductAdditionalPictures - Delete product additional pictures. Param "id" is required.
       Params in request:
       array(
           'id' => '1',
       );

       Response success:
       {
         "errorMsg": "",
         "images": [
            "0": {
              "id": "6",
              "productId": "11",
              "imageUrl": "http://monaco-addict.loc/plugins/productimages/web/images/product-images/11/thumbnails/someproductimage.jpeg",
              "fileName": "someproductimage.jpeg",
              "orderNumber": "0"
            }
         ]
       }

       Response fail:
       if empty id
       {
         "error": "1",
         "message": "Missing query mandatory ID"
       }

       Response fail:
       if empty productId
       {
         "error": "1",
         "message": "Product is not exist. Missing query mandatory productId"
       }

deleteProduct - delete product "produuctId" param is required.
       a. If the product has one current location and doesn't have successful purchases -> delete product
       b. If the product has many locations and doesn't have successful purchases -> set his location inventory to 0
       forceDelete = removes product or sets the location inventory to 0.

       Params in request:
       array(
           'productId' => '11',
           'forceDelete' => '0',//1
           'posUserId' => '4',
       );

       Response success:
       (delete product)
       if product have only current location and has not completed sales
       {
         "productStatus": "deleted",
         "needConfirm": false,
         "confirmMessage": ""
       }

       (set product location inventory to 0)
       if product belongs to current location and has not completed sales
       {
         "productStatus": "active",
         "needConfirm": false,
         "confirmMessage": ""
       }

       (show a confirmation message to force delete)
       if product belongs to current location and has completed sales
       {
         "productStatus": "active",
         "needConfirm": true,
         "confirmMessage": "You are attempting to delete this product. This action is performed at your own risk and may result in the loss of important historical data, including past purchases and reporting records. Proceed only if you fully understand the consequences."
       }

       Response fail:
       if empty productId
       {
         "error": "1",
         "message": "Product is not exist. Missing query mandatory productId"
       }

       if the product does not belong to the logged location
       {
         "error": "1",
         "message": "You can not delete this product, the product does not belong to this location."
       }

       if product not found
       {
         "error": "1",
         "message": "Product is not exist."
       }