Completed
Push — master ( 0f61b0...2200da )
by Giancarlos
04:26
created

See::setCachePath()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
cc 1
eloc 2
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\SoapClient;
21
use Greenter\Ws\Services\SummarySender;
22
use Greenter\XMLSecLibs\Sunat\SunatXmlSecAdapter;
23
24
/**
25
 * Sistema de Emision del Contribuyente.
26
 *
27
 * Class See
28
 * @package Greenter
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 SunatXmlSecAdapter
54
     */
55
    private $signer;
56
57
    /**
58
     * Twig Render Options
59
     *
60
     * @var array
61
     */
62
    private $options = [];
63
64
    /**
65
     * See constructor.
66
     */
67 30
    public function __construct()
68
    {
69 30
        $this->factory = new FeFactory();
70 30
        $this->wsClient = new SoapClient();
71 30
        $this->signer = new SunatXmlSecAdapter();
72 30
        $this->builders = [
73 30
            Model\Sale\Invoice::class => Xml\Builder\InvoiceBuilder::class,
74 30
            Model\Sale\Note::class => Xml\Builder\NoteBuilder::class,
75 30
            Model\Summary\Summary::class => Xml\Builder\SummaryBuilder::class,
76 30
            Model\Summary\SummaryV2::class => Xml\Builder\SummaryV2Builder::class,
77 30
            Model\Voided\Voided::class => Xml\Builder\VoidedBuilder::class,
78 30
            Model\Despatch\Despatch::class => Xml\Builder\DespatchBuilder::class,
79 30
            Model\Retention\Retention::class => Xml\Builder\RetentionBuilder::class,
80 30
            Model\Perception\Perception::class => Xml\Builder\PerceptionBuilder::class,
81 30
            Model\Voided\Reversion::class => Xml\Builder\VoidedBuilder::class,
82
        ];
83 30
        $this->summarys = [Summary::class, SummaryV2::class, Voided::class, Reversion::class];
84 30
        $this->factory->setSigner($this->signer);
85 30
    }
86
87
    /**
88
     * @param string $directory
89
     */
90 18
    public function setCachePath($directory)
91
    {
92 18
        $this->options['cache'] = $directory;
93 18
    }
94
95
    /**
96
     * @param string $certificate
97
     */
98 30
    public function setCertificate($certificate)
99
    {
100 30
        $this->signer->setCertificate($certificate);
101 30
    }
102
103
    /**
104
     * @param string $user
105
     * @param string $password
106
     */
107 30
    public function setCredentials($user, $password)
108
    {
109 30
        $this->wsClient->setCredentials($user, $password);
110 30
    }
111
112
    /**
113
     * @param string $service
114
     */
115 30
    public function setService($service)
116
    {
117 30
        $this->wsClient->setService($service);
118 30
    }
119
120
    /**
121
     * Get signed xml from document.
122
     *
123
     * @param DocumentInterface $document
124
     * @return string
125
     */
126 10
    public function getXmlSigned(DocumentInterface $document)
127
    {
128 10
        $classDoc = get_class($document);
129
130 10
        return $this->factory
131 10
            ->setBuilder($this->getBuilder($classDoc))
132 10
            ->getXmmlSigned($document);
133
    }
134
135
136
    /**
137
     * Envia documento.
138
     *
139
     * @param DocumentInterface $document
140
     * @return Model\Response\BaseResult
141
     */
142 20
    public function send(DocumentInterface $document)
143
    {
144 20
        $classDoc = get_class($document);
145 20
        $this->factory
146 20
            ->setBuilder($this->getBuilder($classDoc))
147 20
            ->setSender($this->getSender($classDoc));
148
149 20
        return $this->factory->send($document);
150
    }
151
152
    /**
153
     * @return FeFactory
154
     */
155 6
    public function getFactory()
156
    {
157 6
        return $this->factory;
158
    }
159
160
    /**
161
     * @param string $class
162
     * @return BuilderInterface
163
     */
164 30
    private function getBuilder($class)
165
    {
166 30
        $builder = $this->builders[$class];
167
168 30
        return new $builder($this->options);
169
    }
170
171
    /**
172
     * @param string $class
173
     * @return SenderInterface
174
     */
175 20
    private function getSender($class)
176
    {
177 20
        $sender = in_array($class, $this->summarys) ? new SummarySender(): new BillSender();
178 20
        $sender->setClient($this->wsClient);
179
180 20
        return $sender;
181
    }
182
}