See::setCredentials()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
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 DOMDocument;
12
use Exception;
13
use Greenter\Builder\BuilderInterface;
14
use Greenter\Factory\FeFactory;
15
use Greenter\Model\DocumentInterface;
16
use Greenter\Model\Summary\Summary;
17
use Greenter\Model\Voided\Reversion;
18
use Greenter\Model\Voided\Voided;
19
use Greenter\Services\SenderInterface;
20
use Greenter\Validator\ErrorCodeProviderInterface;
21
use Greenter\Ws\Reader\XmlFilenameExtractor;
22
use Greenter\Ws\Reader\XmlReader;
23
use Greenter\Ws\Resolver\XmlTypeResolver;
24
use Greenter\Ws\Services\BillSender;
25
use Greenter\Ws\Services\ExtService;
26
use Greenter\Ws\Services\SoapClient;
27
use Greenter\Ws\Services\SummarySender;
28
use Greenter\XMLSecLibs\Sunat\SignedXml;
29
30
/**
31
 * Sistema de Emision del Contribuyente.
32
 *
33
 * Class See
34
 */
35
class See
36
{
37
    /**
38
     * @var FeFactory
39
     */
40
    private $factory;
41
42
    /**
43
     * @var SoapClient
44
     */
45
    private $wsClient;
46
47
    /**
48
     * @var array
49
     */
50
    private $builders;
51
52
    /**
53
     * @var array
54
     */
55
    private $summarys;
56
57
    /**
58
     * @var SignedXml
59
     */
60
    private $signer;
61
62
    /**
63
     * @var ErrorCodeProviderInterface
64
     */
65
    private $codeProvider;
66
67
    /**
68
     * Twig Render Options.
69
     *
70
     * @var array
71
     */
72
    private $options = ['autoescape' => false];
73
74
    /**
75
     * See constructor.
76
     */
77 20
    public function __construct()
78
    {
79 20
        $this->factory = new FeFactory();
80 20
        $this->wsClient = new SoapClient();
81 20
        $this->signer = new SignedXml();
82 20
        $this->builders = [
83
            Model\Sale\Invoice::class => Xml\Builder\InvoiceBuilder::class,
84
            Model\Sale\Note::class => Xml\Builder\NoteBuilder::class,
85
            Model\Summary\Summary::class => Xml\Builder\SummaryBuilder::class,
86
            Model\Voided\Voided::class => Xml\Builder\VoidedBuilder::class,
87
            Model\Despatch\Despatch::class => Xml\Builder\DespatchBuilder::class,
88
            Model\Retention\Retention::class => Xml\Builder\RetentionBuilder::class,
89
            Model\Perception\Perception::class => Xml\Builder\PerceptionBuilder::class,
90
            Model\Voided\Reversion::class => Xml\Builder\VoidedBuilder::class,
91
        ];
92 20
        $this->summarys = [Summary::class, Summary::class, Voided::class, Reversion::class];
93 20
        $this->factory->setSigner($this->signer);
94 20
    }
95
96
    /**
97
     * Set Xml Builder Options.
98
     *
99
     * @param array $options
100
     */
101 20
    public function setBuilderOptions(array $options)
102
    {
103 20
        $this->options = array_merge($this->options, $options);
104 20
    }
105
106
    /**
107
     * @param string $directory
108
     */
109 14
    public function setCachePath($directory)
110
    {
111 14
        $this->options['cache'] = $directory;
112 14
    }
113
114
    /**
115
     * @param string $certificate
116
     */
117 20
    public function setCertificate($certificate)
118
    {
119 20
        $this->signer->setCertificate($certificate);
120 20
    }
121
122
    /**
123
     * @param string $user
124
     * @param string $password
125
     */
126 20
    public function setCredentials($user, $password)
127
    {
128 20
        $this->wsClient->setCredentials($user, $password);
129 20
    }
130
131
    /**
132
     * @param string $service
133
     */
134 20
    public function setService($service)
135
    {
136 20
        $this->wsClient->setService($service);
137 20
    }
138
139
    /**
140
     * Set error code provider.
141
     *
142
     * @param ErrorCodeProviderInterface $codeProvider
143
     */
144 14
    public function setCodeProvider($codeProvider)
145
    {
146 14
        $this->codeProvider = $codeProvider;
147 14
    }
148
149
    /**
150
     * Get signed xml from document.
151
     *
152
     * @param DocumentInterface $document
153
     *
154
     * @return string
155
     */
156 7
    public function getXmlSigned(DocumentInterface $document)
157
    {
158 7
        $classDoc = get_class($document);
159
160 7
        return $this->factory
161 7
            ->setBuilder($this->getBuilder($classDoc))
162 7
            ->getXmlSigned($document);
163
    }
164
165
    /**
166
     * Envia documento.
167
     *
168
     * @param DocumentInterface $document
169
     *
170
     * @return Model\Response\BaseResult
171
     */
172 12
    public function send(DocumentInterface $document)
173
    {
174 12
        $classDoc = get_class($document);
175 12
        $this->factory
176 12
            ->setBuilder($this->getBuilder($classDoc))
177 12
            ->setSender($this->getSender($classDoc));
178
179 12
        return $this->factory->send($document);
180
    }
181
182
    /**
183
     * Envia xml generado.
184
     *
185
     * @param string $type Document Type
186
     * @param string $name Xml Name
187
     * @param string $xml  Xml Content
188
     *
189
     * @return Model\Response\BaseResult
190
     */
191 2
    public function sendXml($type, $name, $xml)
192
    {
193 2
        $this->factory
194 2
            ->setBuilder($this->getBuilder($type))
195 2
            ->setSender($this->getSender($type));
196
197 2
        return $this->factory->sendXml($name, $xml);
198
    }
199
200
    /**
201
     * Envia XML generado previamente.
202
     *
203
     * @param string $xmlContent
204
     *
205
     * @return Model\Response\BaseResult
206
     *
207
     * @throws Exception
208
     */
209 1
    public function sendXmlFile($xmlContent)
210
    {
211 1
        $doc = new DOMDocument();
212 1
        $doc->loadXML($xmlContent);
213
214 1
        $reader = new XmlReader();
215 1
        $resolver = new XmlTypeResolver($reader);
216 1
        $type = $resolver->getType($doc);
217
218 1
        $extractor = new XmlFilenameExtractor($reader);
219 1
        $name = $extractor->getFilename($doc);
220
221 1
        return $this->sendXml($type, $name, $xmlContent);
222
    }
223
224
    /**
225
     * @param $ticket
226
     *
227
     * @return Model\Response\StatusResult
228
     */
229 1
    public function getStatus($ticket)
230
    {
231 1
        $sender = new ExtService();
232 1
        $sender->setClient($this->wsClient);
233
234 1
        return $sender->getStatus($ticket);
235
    }
236
237
    /**
238
     * @return FeFactory
239
     */
240 6
    public function getFactory()
241
    {
242 6
        return $this->factory;
243
    }
244
245
    /**
246
     * @param string $class
247
     *
248
     * @return BuilderInterface
249
     */
250 19
    private function getBuilder($class)
251
    {
252 19
        $builder = $this->builders[$class];
253
254 19
        return new $builder($this->options);
255
    }
256
257
    /**
258
     * @param string $class
259
     *
260
     * @return SenderInterface
261
     */
262 14
    private function getSender($class)
263
    {
264 14
        $sender = in_array($class, $this->summarys) ? new SummarySender() : new BillSender();
265 14
        $sender->setClient($this->wsClient);
266 14
        if ($this->codeProvider) {
267 10
            $sender->setCodeProvider($this->codeProvider);
268
        }
269
270 14
        return $sender;
271
    }
272
}
273