Jump to content

Recommended Posts

Posted
On 6/11/2020 at 7:36 PM, Jono said:

try ServiceChanges::getItems().  I know it's deprecated but I believe it will get the results you want in a way that can be sent to node.

I see why ServiceChanges::getItems() endpoint was deprecated... it sucks. I can't really use it at all to calculate the prorated charges for a service change and create an invoice unless I write a bunch of regex to match descriptions for each possible configurable option. I'm not sure why this endpoint doesn't return actual line items with corresponding config options, must have been in use to have service changes in a pretty format for Blesta invoices huh?

Posted

The other option here is to make a custom edit to your Blesta installation.  Something like ServiceChanges::getLineItems() that makes the line items, similar to the controller method AdminClients::makeLineItems()?

This seems to be a total pain so I'm thinking about how we can make this work better for API user in the future.

Posted

I don't see a custom edit to the Blesta installation happening. Too much of a headache... especially when we upgrade in the future.

18 hours ago, Jono said:

This seems to be a total pain so I'm thinking about how we can make this work better for API user in the future.

You're totally right. The easiest way on dev side would be to fix the encoding on ServiceChanges::getPresenter(), since that should return everything needed so that I can manually create an invoice for a service upgrade/downgrade.
The easiest thing for the customer (me) would be for Services::edit() to automatically create a prorated invoice for the change. However, you said previously that is a purposeful design consideration. Possibly for admin functions? I'm not sure.
If that's the case, then having an endpoint we can hit that returns the prorated differences according to line item  (in JSON encoding) would be the most helpful. In that case, I could easily create a manual invoice from that using the Invoices::add() endpoint.

However, (as I haven't gotten this far in testing yet) I'm not sure if the subsequent recurring invoice (1 month after the edit) would include the service update (assuming the Services::edit() function is used to change the service). Again, that would all require testing and I'm not quite as experienced with this system as you.

  • 1 month later...
Posted
On 6/15/2020 at 10:26 AM, Jono said:

The other option here is to make a custom edit to your Blesta installation.  Something like ServiceChanges::getLineItems() that makes the line items, similar to the controller method AdminClients::makeLineItems()?

This seems to be a total pain so I'm thinking about how we can make this work better for API user in the future.

Have there been any changes to this in the latest version of Blesta?

Posted

Unfortunately not.  Our current priority is on the affiliate system (released in 4.11) and the domain manager (TBD) so some of the dev stuff is taking a bit of a back seat for now though I'd like to make a lot of dev improvements soon.  

 

  • 4 years later...
Posted

The getPresenter method in the service_changes module always returns an empty JSON. This is because the object “Blesta\Core\Pricing\Presenter\Type\ServiceChangePresenter” is returned and this object cannot be JSON serialized

image.png.a89c248c9f9491d03883e623ce66c444.png

But if I use the php extension instead, I can get a result

image.thumb.png.4505ebf178d2ae51104b355fe6fbc05d.png


Since I was trying to get data from a laravel application, I parsed it with the code below as a temporary and quick solution.

As I said before, if anyone has a better solution or refactor the code below better and share it, I would appreciate it. Maybe I can do a module and api. But for the moment I needed a quick solution. Maybe someone who made and used it might want to share it.

class UnserializeHandler
{
    public static function unserializeData($serializedData)
    {
        $pattern = '/O:\d+:"[^"]+"/';
        // Tüm sınıf referanslarını stdClass'a çevir
        $convertedData = preg_replace($pattern, 'O:8:"stdClass"', $serializedData);
        
        return unserialize($convertedData);
    }
}


 

private function getPresenterLocal(){

        $result = [];
        
        $result['kdvOran'] = 0;
        $result['kdvDescription'] = '';
        $result['price'] = 0;
        $result['qty'] = 0;
        $result['description'] = '';
        $result['total'] = 0;
        $result['totalWithTax'] = 0;
        $result['error'] = '';
        $result['sonuc'] = true;


        
        try {
            $response = Http::withBasicAuth('username', 'password')
            ->withoutVerifying()  // SSL sertifika doğrulamasını devre dışı bırakır
            ->get('https://blesta.test/api/service_changes/getpresenter.php', [
                'service_id' => 51,
                'vars' => [
                    'pricing_id' => 16,
                    'qty' => 1
                ]
            ]);

            // Serialize edilmiş veriyi al
            $serializedData = $response->body();

            // Özel handler ile unserialize yap
            $data = UnserializeHandler::unserializeData(serializedData: $serializedData);

            $collectionArray = (array)$data['response'];

            if(array_key_exists('0',$collectionArray) && $collectionArray[0] == false){
                $result['sonuc'] = false;
                dd($result);
                //return $result;
            }

            $reflection = new \ReflectionObject($data['response']);
            $key = $reflection->getProperties()[0];

            $responseData = $collectionArray[$key->name];
            
            $reflection = new \ReflectionObject($responseData);
            $key = $reflection->getProperties()[0];
            
            $metaItem = ((array)$responseData)[$key->name];

            $priceItem = $metaItem[0];

            foreach((array)$priceItem as $key => $value){
    
                if(is_array($value) && str_contains($key, 'taxes')){
                    
                    foreach($value as $k => $v){
                        if(is_array($v)){
                            $taxArray = (array)$v[0];
                            foreach($taxArray as $kk => $vv){
                                if(str_contains($kk, 'amount')){
                                    $result['kdvOran'] = $vv;
                                }
                                if(str_contains($kk, 'description')){
                                    $result['kdvDescription'] = $vv;
                                }
                            }
                        }
                    }
    
                }
                else{
                    if(gettype($key) == 'string' && str_contains($key, 'price')){
                        $result['price'] = $value;
                    }
                    if(gettype($key) == 'string' && str_contains($key, 'qty')){
                        $result['qty'] = $value;
                    }
                    if(gettype($key) == 'string' && str_contains($key, 'description')){
                        $result['description'] = $value;
                    }
                }
    
            }

            if($result['price'] > 0 && $result['qty'] > 0){
                $result['total'] = $result['price'] * $result['qty'];
                $result['totalWithTax'] = $result['total'] + ($result['total'] * $result['kdvOran'] / 100);
            }

        } catch (\Throwable $th) {
            //throw $th;
            $result['error'] = $th->getMessage();
        }



        dd($result);

    }

 

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...