Completed
Push — master ( 2200da...b2b4c2 )
by Giancarlos
04:55
created

See::getStatus()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 7
ccs 4
cts 4
cp 1
rs 9.4285
cc 1
eloc 4
nc 1
nop 1
crap 1
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: Administrador
5
 * Date: 16/10/2017
6
 * Time: 04:23 PM
7
 */
8
9
namespace Greenter;
10
11
use Greenter\Builder\BuilderInterface;
12
use Greenter\Factory\FeFactory;
13
use Greenter\Model\DocumentInterface;
14
use Greenter\Model\Summary\Summary;
15
use Greenter\Model\Summary\SummaryV2;
16
use Greenter\Model\Voided\Reversion;
17
use Greenter\Model\Voided\Voided;
18
use Greenter\Services\SenderInterface;
19
use Greenter\Ws\Services\BillSender;
20
use Greenter\Ws\Services\ExtService;
21
use Greenter\Ws\Services\SoapClient;
22
use Greenter\Ws\Services\SummarySender;
23
use Greenter\XMLSecLibs\Sunat\SunatXmlSecAdapter;
24
25
/**
26
 * Sistema de Emision del Contribuyente.
27
 *
28
 * Class See
29
 * @package Greenter
30
 */
31
class See
32
{
33
    /**
34
     * @var FeFactory
35
     */
36
    private $factory;
37
38
    /**
39
     * @var SoapClient
40
     */
41
    private $wsClient;
42
43
    /**
44
     * @var array
45
     */
46
    private $builders;
47
48
    /**
49
     * @var array
50
     */
51
    private $summarys;
52
53
    /**
54
     * @var SunatXmlSecAdapter
55
     */
56
    private $signer;
57
58
    /**
59
     * Twig Render Options
60
     *
61
     * @var array
62
     */
63
    private $options = [];
64
65
    /**
66
     * See constructor.
67
     */
68 30
    public function __construct()
69
    {
70 30
        $this->factory = new FeFactory();
71 30
        $this->wsClient = new SoapClient();
72 30
        $this->signer = new SunatXmlSecAdapter();
73 30
        $this->builders = [
74 30
            Model\Sale\Invoice::class => Xml\Builder\InvoiceBuilder::class,
75 30
            Model\Sale\Note::class => Xml\Builder\NoteBuilder::class,
76 30
            Model\Summary\Summary::class => Xml\Builder\SummaryBuilder::class,
77 30
            Model\Summary\SummaryV2::class => Xml\Builder\SummaryV2Builder::class,
78 30
            Model\Voided\Voided::class => Xml\Builder\VoidedBuilder::class,
79 30
            Model\Despatch\Despatch::class => Xml\Builder\DespatchBuilder::class,
80 30
            Model\Retention\Retention::class => Xml\Builder\RetentionBuilder::class,
81 30
            Model\Perception\Perception::class => Xml\Builder\PerceptionBuilder::class,
82 30
            Model\Voided\Reversion::class => Xml\Builder\VoidedBuilder::class,
83
        ];
84 30
        $this->summarys = [Summary::class, SummaryV2::class, Voided::class, Reversion::class];
85 30
        $this->factory->setSigner($this->signer);
86 30
    }
87
88
    /**
89
     * @param string $directory
90
     */
91 18
    public function setCachePath($directory)
92
    {
93 18
        $this->options['cache'] = $directory;
94 18
    }
95
96
    /**
97
     * @param string $certificate
98
     */
99 30
    public function setCertificate($certificate)
100
    {
101 30
        $this->signer->setCertificate($certificate);
102 30
    }
103
104
    /**
105
     * @param string $user
106
     * @param string $password
107
     */
108 30
    public function setCredentials($user, $password)
109
    {
110 30
        $this->wsClient->setCredentials($user, $password);
111 30
    }
112
113
    /**
114
     * @param string $service
115
     */
116 30
    public function setService($service)
117
    {
118 30
        $this->wsClient->setService($service);
119 30
    }
120
121
    /**
122
     * Get signed xml from document.
123
     *
124
     * @param DocumentInterface $document
125
     * @return string
126
     */
127 10
    public function getXmlSigned(DocumentInterface $document)
128
    {
129 10
        $classDoc = get_class($document);
130
131 10
        return $this->factory
132 10
            ->setBuilder($this->getBuilder($classDoc))
133 10
            ->getXmmlSigned($document);
134
    }
135
136
137
    /**
138
     * Envia documento.
139
     *
140
     * @param DocumentInterface $document
141
     * @return Model\Response\BaseResult
142
     */
143 18
    public function send(DocumentInterface $document)
144
    {
145 18
        $classDoc = get_class($document);
146 18
        $this->factory
147 18
            ->setBuilder($this->getBuilder($classDoc))
148 18
            ->setSender($this->getSender($classDoc));
149
150 18
        return $this->factory->send($document);
151
    }
152
153
    /**
154
     * @param $ticket
155
     * @return Model\Response\StatusResult
156
     */
157 2
    public function getStatus($ticket)
158
    {
159 2
        $sender = new ExtService();
160 2
        $sender->setClient($this->wsClient);
161
162 2
        return $sender->getStatus($ticket);
163
    }
164
165
    /**
166
     * @return FeFactory
167
     */
168 6
    public function getFactory()
169
    {
170 6
        return $this->factory;
171
    }
172
173
    /**
174
     * @param string $class
175
     * @return BuilderInterface
176
     */
177 28
    private function getBuilder($class)
178
    {
179 28
        $builder = $this->builders[$class];
180
181 28
        return new $builder($this->options);
182
    }
183
184
    /**
185
     * @param string $class
186
     * @return SenderInterface
187
     */
188 18
    private function getSender($class)
189
    {
190 18
        $sender = in_array($class, $this->summarys) ? new SummarySender(): new BillSender();
191 18
        $sender->setClient($this->wsClient);
192
193 18
        return $sender;
194
    }
195
}