Passed
Push — master ( c9ce7c...b65f66 )
by Giancarlos
02:59
created

See::sendXml()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

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